From 9737f74f8c6cbfcb7784ee4d655b0c5d343a2e7a Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Thu, 23 May 2019 16:40:53 -0500 Subject: [PATCH] Import Quail-Lib 1, from 0.4.1 release see: https://code.google.com/archive/p/quail-lib/ --- CHANGELOG.txt | 15 + LICENSE.txt | 219 + README.txt | 6 + examples/.svn/all-wcprops | 11 + examples/.svn/entries | 62 + examples/.svn/text-base/test_form.php.svn-base | 62 + examples/test_form.php | 62 + quail/._quail.php | Bin 0 -> 167 bytes quail/.svn/all-wcprops | 11 + quail/.svn/dir-prop-base | 6 + quail/.svn/entries | 71 + quail/.svn/text-base/quail.php.svn-base | 733 + quail/common/.svn/all-wcprops | 35 + quail/common/.svn/entries | 204 + .../prop-base/accessibility_tests.php.svn-base | 5 + .../text-base/accessibility_tests.php.svn-base | 6042 +++++ quail/common/.svn/text-base/css.php.svn-base | 599 + .../.svn/text-base/domExtensions.php.svn-base | 39 + quail/common/.svn/text-base/elements.php.svn-base | 79 + quail/common/.svn/text-base/test.php.svn-base | 990 + quail/common/accessibility_tests.php | 6042 +++++ quail/common/css.php | 599 + quail/common/domExtensions.php | 39 + quail/common/elements.php | 79 + quail/common/resources/.svn/all-wcprops | 23 + quail/common/resources/.svn/entries | 130 + .../.svn/text-base/emoticons.txt.svn-base | 152 + .../resources/.svn/text-base/iso639.txt.svn-base | 200 + .../.svn/text-base/placeholder.txt.svn-base | 9 + quail/common/resources/emoticons.txt | 152 + quail/common/resources/iso639.txt | 200 + quail/common/resources/placeholder.txt | 9 + quail/common/services/.svn/all-wcprops | 5 + quail/common/services/.svn/entries | 34 + quail/common/services/media/.svn/all-wcprops | 17 + quail/common/services/media/.svn/entries | 96 + .../media/.svn/text-base/mediaService.php.svn-base | 13 + .../media/.svn/text-base/youtube.php.svn-base | 59 + quail/common/services/media/mediaService.php | 13 + quail/common/services/media/youtube.php | 59 + quail/common/services/readability/.svn/all-wcprops | 11 + quail/common/services/readability/.svn/entries | 65 + .../.svn/text-base/readability.php.svn-base | 15 + .../php-text-statistics/.svn/all-wcprops | 23 + .../readability/php-text-statistics/.svn/entries | 136 + .../.svn/text-base/README.txt.svn-base | 3 + .../.svn/text-base/TextStatistics.php.svn-base | 413 + .../.svn/text-base/TextStatistics.php4.svn-base | 354 + .../readability/php-text-statistics/README.txt | 3 + .../php-text-statistics/TextStatistics.php | 413 + .../php-text-statistics/TextStatistics.php4 | 354 + .../php-text-statistics/resources/.svn/all-wcprops | 17 + .../php-text-statistics/resources/.svn/entries | 96 + .../.svn/text-base/DaleChallWordList.php.svn-base | 2954 +++ .../.svn/text-base/SpacheWordList.php.svn-base | 1070 + .../resources/DaleChallWordList.php | 2954 +++ .../resources/SpacheWordList.php | 1070 + .../php-text-statistics/tests/.svn/all-wcprops | 23 + .../php-text-statistics/tests/.svn/entries | 130 + .../text-base/TextStatisticsKiplingIf.php.svn-base | 459 + .../TextStatisticsMelvilleMobyDick.php.svn-base | 342 + .../.svn/text-base/TextStatisticsTest.php.svn-base | 279 + .../tests/TextStatisticsKiplingIf.php | 459 + .../tests/TextStatisticsMelvilleMobyDick.php | 342 + .../tests/TextStatisticsTest.php | 279 + quail/common/services/readability/readability.php | 15 + quail/common/test.php | 990 + quail/guidelines/.svn/all-wcprops | 53 + quail/guidelines/.svn/entries | 303 + quail/guidelines/.svn/text-base/all.php.svn-base | 51 + .../.svn/text-base/section508.php.svn-base | 86 + .../guidelines/.svn/text-base/wcag1a.php.svn-base | 84 + .../guidelines/.svn/text-base/wcag1aa.php.svn-base | 129 + .../.svn/text-base/wcag1aaa.php.svn-base | 154 + .../guidelines/.svn/text-base/wcag2a.php.svn-base | 146 + .../guidelines/.svn/text-base/wcag2aa.php.svn-base | 171 + .../.svn/text-base/wcag2aaa.php.svn-base | 175 + quail/guidelines/all.php | 51 + quail/guidelines/section508.php | 86 + quail/guidelines/translations/.svn/all-wcprops | 11 + quail/guidelines/translations/.svn/entries | 62 + .../translations/.svn/text-base/en.txt.svn-base | 239 + quail/guidelines/translations/en.txt | 239 + quail/guidelines/wcag1a.php | 84 + quail/guidelines/wcag1aa.php | 129 + quail/guidelines/wcag1aaa.php | 154 + quail/guidelines/wcag2a.php | 146 + quail/guidelines/wcag2aa.php | 171 + quail/guidelines/wcag2aaa.php | 175 + quail/quail.php | 733 + quail/reporters/.svn/all-wcprops | 35 + quail/reporters/.svn/entries | 198 + .../.svn/text-base/reporter.array.php.svn-base | 56 + .../text-base/reporter.codeHighlight.php.svn-base | 78 + .../.svn/text-base/reporter.demo.php.svn-base | 157 + .../.svn/text-base/reporter.static.php.svn-base | 65 + .../.svn/text-base/reporter.xml.php.svn-base | 64 + quail/reporters/reporter.array.php | 56 + quail/reporters/reporter.codeHighlight.php | 78 + quail/reporters/reporter.demo.php | 157 + quail/reporters/reporter.static.php | 65 + quail/reporters/reporter.xml.php | 64 + tests/.svn/all-wcprops | 29 + tests/.svn/dir-prop-base | 6 + tests/.svn/entries | 167 + tests/.svn/text-base/cssTestInterface.php.svn-base | 50 + tests/.svn/text-base/cssTests.php.svn-base | 178 + tests/.svn/text-base/index.php.svn-base | 2443 ++ tests/.svn/text-base/quailTests.php.svn-base | 134 + tests/cssTestInterface.php | 50 + tests/cssTests.php | 178 + tests/index.php | 2443 ++ tests/quailTests.php | 134 + tests/testfiles/.svn/all-wcprops | 5 + tests/testfiles/.svn/entries | 37 + tests/testfiles/css/.svn/all-wcprops | 71 + tests/testfiles/css/.svn/entries | 402 + .../.svn/text-base/cssComplexTest1.css.svn-base | 13 + .../.svn/text-base/cssComplexTest1.html.svn-base | 20 + .../css/.svn/text-base/cssContrast.css.svn-base | 7 + .../css/.svn/text-base/cssContrast.html.svn-base | 12 + .../css/.svn/text-base/cssContrast2.css.svn-base | 15 + .../css/.svn/text-base/cssContrast2.html.svn-base | 16 + .../css/.svn/text-base/cssContrast3.css.svn-base | 15 + .../css/.svn/text-base/cssContrast3.html.svn-base | 16 + .../css/.svn/text-base/cssContrast4.css.svn-base | 15 + .../css/.svn/text-base/cssContrast4.html.svn-base | 16 + .../css/.svn/text-base/cssContrast5.html.svn-base | 23 + tests/testfiles/css/cssComplexTest1.css | 13 + tests/testfiles/css/cssComplexTest1.html | 20 + tests/testfiles/css/cssContrast.css | 7 + tests/testfiles/css/cssContrast.html | 12 + tests/testfiles/css/cssContrast2.css | 15 + tests/testfiles/css/cssContrast2.html | 16 + tests/testfiles/css/cssContrast3.css | 15 + tests/testfiles/css/cssContrast3.html | 16 + tests/testfiles/css/cssContrast4.css | 15 + tests/testfiles/css/cssContrast4.html | 16 + tests/testfiles/css/cssContrast5.html | 23 + tests/testfiles/oac/.svn/all-wcprops | 4529 ++++ tests/testfiles/oac/.svn/entries | 25664 +++++++++++++++++++ .../oac/.svn/prop-base/avlab.mp3.svn-base | 5 + .../oac/.svn/prop-base/big-fail.png.svn-base | 5 + .../oac/.svn/prop-base/chart.gif.svn-base | 5 + .../oac/.svn/prop-base/contrast1.gif.svn-base | 5 + .../oac/.svn/prop-base/contrast2.gif.svn-base | 5 + .../oac/.svn/prop-base/eatatjoes.gif.svn-base | 5 + .../oac/.svn/prop-base/finddogs.gif.svn-base | 5 + .../testfiles/oac/.svn/prop-base/fish.gif.svn-base | 5 + .../oac/.svn/prop-base/fishswim.gif.svn-base | 5 + tests/testfiles/oac/.svn/prop-base/go.gif.svn-base | 5 + .../oac/.svn/prop-base/image.gif.svn-base | 5 + .../oac/.svn/prop-base/library.gif.svn-base | 5 + .../oac/.svn/prop-base/renew.gif.svn-base | 5 + .../testfiles/oac/.svn/prop-base/rex.gif.svn-base | 5 + .../testfiles/oac/.svn/prop-base/rex.jpg.svn-base | 5 + .../oac/.svn/prop-base/spacer.gif.svn-base | 5 + .../testfiles/oac/.svn/prop-base/star.gif.svn-base | 5 + .../oac/.svn/prop-base/submit.gif.svn-base | 5 + .../oac/.svn/prop-base/welcome.gif.svn-base | 5 + .../testfiles/oac/.svn/text-base/1-1.html.svn-base | 11 + .../testfiles/oac/.svn/text-base/1-2.html.svn-base | 1 + .../oac/.svn/text-base/10-1.html.svn-base | 1 + .../oac/.svn/text-base/10-2.html.svn-base | 1 + .../oac/.svn/text-base/100-1.html.svn-base | 1 + .../oac/.svn/text-base/100-2.html.svn-base | 1 + .../oac/.svn/text-base/102-1.html.svn-base | 1 + .../oac/.svn/text-base/102-2.html.svn-base | 1 + .../oac/.svn/text-base/103-1.html.svn-base | 1 + .../oac/.svn/text-base/103-2.html.svn-base | 1 + .../oac/.svn/text-base/104-1.html.svn-base | 1 + .../oac/.svn/text-base/104-2.html.svn-base | 1 + .../oac/.svn/text-base/105-1.html.svn-base | 1 + .../oac/.svn/text-base/105-2.html.svn-base | 1 + .../oac/.svn/text-base/106-1.html.svn-base | 1 + .../oac/.svn/text-base/106-2.html.svn-base | 1 + .../oac/.svn/text-base/107-1.html.svn-base | 1 + .../oac/.svn/text-base/107-2.html.svn-base | 1 + .../oac/.svn/text-base/108-1.html.svn-base | 1 + .../oac/.svn/text-base/108-2.html.svn-base | 1 + .../oac/.svn/text-base/109-1.html.svn-base | 1 + .../oac/.svn/text-base/109-2.html.svn-base | 1 + .../oac/.svn/text-base/11-1.html.svn-base | 1 + .../oac/.svn/text-base/11-2.html.svn-base | 1 + .../oac/.svn/text-base/110-1.html.svn-base | 1 + .../oac/.svn/text-base/110-2.html.svn-base | 1 + .../oac/.svn/text-base/111-1.html.svn-base | 1 + .../oac/.svn/text-base/111-2.html.svn-base | 1 + .../oac/.svn/text-base/111-3.html.svn-base | 1 + .../oac/.svn/text-base/112-1.html.svn-base | 1 + .../oac/.svn/text-base/112-2.html.svn-base | 1 + .../oac/.svn/text-base/113-1.html.svn-base | 1 + .../oac/.svn/text-base/113-2.html.svn-base | 1 + .../oac/.svn/text-base/114-1.html.svn-base | 1 + .../oac/.svn/text-base/114-2.html.svn-base | 1 + .../oac/.svn/text-base/114-3.html.svn-base | 1 + .../oac/.svn/text-base/115-1.html.svn-base | 1 + .../oac/.svn/text-base/115-2.html.svn-base | 1 + .../oac/.svn/text-base/116-1.html.svn-base | 1 + .../oac/.svn/text-base/116-2.html.svn-base | 1 + .../oac/.svn/text-base/117-1.html.svn-base | 1 + .../oac/.svn/text-base/117-2.html.svn-base | 1 + .../oac/.svn/text-base/118-1.html.svn-base | 1 + .../oac/.svn/text-base/118-2.html.svn-base | 1 + .../oac/.svn/text-base/118-3.html.svn-base | 1 + .../oac/.svn/text-base/118-4.html.svn-base | 1 + .../oac/.svn/text-base/119-1.html.svn-base | 1 + .../oac/.svn/text-base/119-2.html.svn-base | 1 + .../oac/.svn/text-base/119-3.html.svn-base | 1 + .../oac/.svn/text-base/119-4.html.svn-base | 1 + .../oac/.svn/text-base/12-1.html.svn-base | 1 + .../oac/.svn/text-base/12-2.html.svn-base | 1 + .../oac/.svn/text-base/120-1.html.svn-base | 1 + .../oac/.svn/text-base/120-2.html.svn-base | 1 + .../oac/.svn/text-base/120-3.html.svn-base | 1 + .../oac/.svn/text-base/120-4.html.svn-base | 1 + .../oac/.svn/text-base/121-1.html.svn-base | 1 + .../oac/.svn/text-base/121-2.html.svn-base | 1 + .../oac/.svn/text-base/121-3.html.svn-base | 1 + .../oac/.svn/text-base/121-4.html.svn-base | 1 + .../oac/.svn/text-base/122-1.html.svn-base | 18 + .../oac/.svn/text-base/122-2.html.svn-base | 18 + .../oac/.svn/text-base/123-1.html.svn-base | 20 + .../oac/.svn/text-base/123-2.html.svn-base | 20 + .../oac/.svn/text-base/124-1.html.svn-base | 18 + .../oac/.svn/text-base/124-2.html.svn-base | 18 + .../oac/.svn/text-base/125-1.html.svn-base | 20 + .../oac/.svn/text-base/125-2.html.svn-base | 20 + .../oac/.svn/text-base/126-1.html.svn-base | 1 + .../oac/.svn/text-base/126-2.html.svn-base | 1 + .../oac/.svn/text-base/127-1.html.svn-base | 1 + .../oac/.svn/text-base/127-2.html.svn-base | 1 + .../oac/.svn/text-base/128-1.html.svn-base | 1 + .../oac/.svn/text-base/128-2.html.svn-base | 1 + .../oac/.svn/text-base/129-1.html.svn-base | 1 + .../oac/.svn/text-base/129-2.html.svn-base | 1 + .../oac/.svn/text-base/13-1.html.svn-base | 1 + .../oac/.svn/text-base/13-2.html.svn-base | 1 + .../oac/.svn/text-base/13-3.html.svn-base | 1 + .../oac/.svn/text-base/131-1.html.svn-base | 1 + .../oac/.svn/text-base/131-2.html.svn-base | 1 + .../oac/.svn/text-base/132-1.html.svn-base | 1 + .../oac/.svn/text-base/132-2.html.svn-base | 1 + .../oac/.svn/text-base/133-1.html.svn-base | 1 + .../oac/.svn/text-base/133-2.html.svn-base | 1 + .../oac/.svn/text-base/134-1.html.svn-base | 1 + .../oac/.svn/text-base/134-2.html.svn-base | 1 + .../oac/.svn/text-base/135-1.html.svn-base | 11 + .../oac/.svn/text-base/135-2.html.svn-base | 1 + .../oac/.svn/text-base/135-2.xhtml.svn-base | 44 + .../oac/.svn/text-base/136-1.html.svn-base | 1 + .../oac/.svn/text-base/136-2.html.svn-base | 1 + .../oac/.svn/text-base/137-1.html.svn-base | 1 + .../oac/.svn/text-base/137-2.html.svn-base | 1 + .../oac/.svn/text-base/138-1.html.svn-base | 1 + .../oac/.svn/text-base/138-2.html.svn-base | 1 + .../oac/.svn/text-base/138-3.html.svn-base | 1 + .../oac/.svn/text-base/139-1.html.svn-base | 1 + .../oac/.svn/text-base/139-2.html.svn-base | 1 + .../oac/.svn/text-base/139-3.html.svn-base | 1 + .../oac/.svn/text-base/14-1.html.svn-base | 1 + .../oac/.svn/text-base/14-2.html.svn-base | 1 + .../oac/.svn/text-base/14-3.html.svn-base | 1 + .../oac/.svn/text-base/140-1.html.svn-base | 1 + .../oac/.svn/text-base/140-2.html.svn-base | 1 + .../oac/.svn/text-base/140-3.html.svn-base | 1 + .../oac/.svn/text-base/141-1.html.svn-base | 1 + .../oac/.svn/text-base/141-2.html.svn-base | 1 + .../oac/.svn/text-base/141-3.html.svn-base | 1 + .../oac/.svn/text-base/142-1.html.svn-base | 1 + .../oac/.svn/text-base/142-2.html.svn-base | 1 + .../oac/.svn/text-base/142-3.html.svn-base | 1 + .../oac/.svn/text-base/143-1.html.svn-base | 1 + .../oac/.svn/text-base/143-2.html.svn-base | 1 + .../oac/.svn/text-base/144-1.html.svn-base | 1 + .../oac/.svn/text-base/144-2.html.svn-base | 1 + .../oac/.svn/text-base/145-1.html.svn-base | 1 + .../oac/.svn/text-base/145-2.html.svn-base | 1 + .../oac/.svn/text-base/145-3.html.svn-base | 1 + .../oac/.svn/text-base/145-4.html.svn-base | 1 + .../oac/.svn/text-base/145-5.html.svn-base | 1 + .../oac/.svn/text-base/145-6.html.svn-base | 1 + .../oac/.svn/text-base/146-1.html.svn-base | 1 + .../oac/.svn/text-base/146-2.html.svn-base | 1 + .../oac/.svn/text-base/147-1.html.svn-base | 1 + .../oac/.svn/text-base/147-2.html.svn-base | 1 + .../oac/.svn/text-base/147-3.html.svn-base | 1 + .../oac/.svn/text-base/147-4.html.svn-base | 1 + .../oac/.svn/text-base/148-1.html.svn-base | 9 + .../oac/.svn/text-base/148-2.html.svn-base | 9 + .../oac/.svn/text-base/15-1.html.svn-base | 1 + .../oac/.svn/text-base/15-2.html.svn-base | 1 + .../oac/.svn/text-base/150-1.html.svn-base | 12 + .../oac/.svn/text-base/150-2.html.svn-base | 12 + .../oac/.svn/text-base/151-1.html.svn-base | 1 + .../oac/.svn/text-base/151-2.html.svn-base | 1 + .../oac/.svn/text-base/151-3.html.svn-base | 1 + .../oac/.svn/text-base/152-1.html.svn-base | 1 + .../oac/.svn/text-base/152-2.html.svn-base | 1 + .../oac/.svn/text-base/152-3.html.svn-base | 1 + .../oac/.svn/text-base/153-1.html.svn-base | 1 + .../oac/.svn/text-base/153-2.html.svn-base | 1 + .../oac/.svn/text-base/154-1.html.svn-base | 1 + .../oac/.svn/text-base/154-2.html.svn-base | 1 + .../oac/.svn/text-base/159-1.html.svn-base | 1 + .../oac/.svn/text-base/159-2.html.svn-base | 1 + .../oac/.svn/text-base/16-1.html.svn-base | 1 + .../oac/.svn/text-base/16-2.html.svn-base | 1 + .../oac/.svn/text-base/16-3.html.svn-base | 1 + .../oac/.svn/text-base/16-4.html.svn-base | 1 + .../oac/.svn/text-base/160-1.html.svn-base | 1 + .../oac/.svn/text-base/160-2.html.svn-base | 1 + .../oac/.svn/text-base/161-1.html.svn-base | 1 + .../oac/.svn/text-base/161-2.html.svn-base | 1 + .../oac/.svn/text-base/162-1.html.svn-base | 1 + .../oac/.svn/text-base/162-2.html.svn-base | 1 + .../oac/.svn/text-base/163-1.html.svn-base | 1 + .../oac/.svn/text-base/163-2.html.svn-base | 1 + .../oac/.svn/text-base/163-3.html.svn-base | 1 + .../oac/.svn/text-base/164-1.html.svn-base | 1 + .../oac/.svn/text-base/164-2.html.svn-base | 1 + .../oac/.svn/text-base/165-1.html.svn-base | 1 + .../oac/.svn/text-base/165-2.html.svn-base | 1 + .../oac/.svn/text-base/166-1.html.svn-base | 1 + .../oac/.svn/text-base/166-2.html.svn-base | 1 + .../oac/.svn/text-base/167-1.html.svn-base | 1 + .../oac/.svn/text-base/167-2.html.svn-base | 1 + .../oac/.svn/text-base/168-1.html.svn-base | 1 + .../oac/.svn/text-base/168-2.html.svn-base | 1 + .../oac/.svn/text-base/168-3.html.svn-base | 1 + .../oac/.svn/text-base/168-4.html.svn-base | 1 + .../oac/.svn/text-base/169-1.html.svn-base | 1 + .../oac/.svn/text-base/169-2.html.svn-base | 1 + .../oac/.svn/text-base/17-1.html.svn-base | 1 + .../oac/.svn/text-base/17-10.html.svn-base | 1 + .../oac/.svn/text-base/17-11.html.svn-base | 1 + .../oac/.svn/text-base/17-12.html.svn-base | 1 + .../oac/.svn/text-base/17-2.html.svn-base | 1 + .../oac/.svn/text-base/17-3.html.svn-base | 1 + .../oac/.svn/text-base/17-4.html.svn-base | 1 + .../oac/.svn/text-base/17-5.html.svn-base | 1 + .../oac/.svn/text-base/17-6.html.svn-base | 1 + .../oac/.svn/text-base/17-7.html.svn-base | 1 + .../oac/.svn/text-base/17-8.html.svn-base | 1 + .../oac/.svn/text-base/17-9.html.svn-base | 1 + .../oac/.svn/text-base/173-1.html.svn-base | 1 + .../oac/.svn/text-base/173-2.html.svn-base | 1 + .../oac/.svn/text-base/173-3.html.svn-base | 1 + .../oac/.svn/text-base/174-1.html.svn-base | 1 + .../oac/.svn/text-base/174-2.html.svn-base | 1 + .../oac/.svn/text-base/174-3.html.svn-base | 1 + .../oac/.svn/text-base/174-4.html.svn-base | 1 + .../oac/.svn/text-base/174-5.html.svn-base | 1 + .../oac/.svn/text-base/175-1.html.svn-base | 1 + .../oac/.svn/text-base/175-2.html.svn-base | 1 + .../oac/.svn/text-base/176-1.html.svn-base | 1 + .../oac/.svn/text-base/176-2.html.svn-base | 1 + .../oac/.svn/text-base/177-1.html.svn-base | 1 + .../oac/.svn/text-base/177-2.html.svn-base | 1 + .../oac/.svn/text-base/178-1.html.svn-base | 1 + .../oac/.svn/text-base/178-2.html.svn-base | 1 + .../oac/.svn/text-base/178-3.html.svn-base | 1 + .../oac/.svn/text-base/18-1.html.svn-base | 1 + .../oac/.svn/text-base/18-2.html.svn-base | 1 + .../oac/.svn/text-base/18-3.html.svn-base | 1 + .../oac/.svn/text-base/18-4.html.svn-base | 1 + .../oac/.svn/text-base/180-1.html.svn-base | 1 + .../oac/.svn/text-base/180-2.html.svn-base | 1 + .../oac/.svn/text-base/181-1.html.svn-base | 1 + .../oac/.svn/text-base/181-2.html.svn-base | 1 + .../oac/.svn/text-base/182-1.html.svn-base | 1 + .../oac/.svn/text-base/182-2.html.svn-base | 1 + .../oac/.svn/text-base/183-1.html.svn-base | 1 + .../oac/.svn/text-base/183-2.html.svn-base | 1 + .../oac/.svn/text-base/184-1.html.svn-base | 1 + .../oac/.svn/text-base/184-2.html.svn-base | 1 + .../oac/.svn/text-base/185-1.html.svn-base | 1 + .../oac/.svn/text-base/185-2.html.svn-base | 1 + .../oac/.svn/text-base/186-1.html.svn-base | 1 + .../oac/.svn/text-base/186-2.html.svn-base | 1 + .../oac/.svn/text-base/187-1.html.svn-base | 1 + .../oac/.svn/text-base/187-2.html.svn-base | 1 + .../oac/.svn/text-base/188-1.html.svn-base | 1 + .../oac/.svn/text-base/188-2.html.svn-base | 1 + .../oac/.svn/text-base/188-3.html.svn-base | 1 + .../oac/.svn/text-base/188-4.html.svn-base | 1 + .../oac/.svn/text-base/188-5.html.svn-base | 1 + .../oac/.svn/text-base/189-1.html.svn-base | 1 + .../oac/.svn/text-base/189-2.html.svn-base | 1 + .../oac/.svn/text-base/19-1.html.svn-base | 1 + .../oac/.svn/text-base/19-2.html.svn-base | 1 + .../oac/.svn/text-base/19-3.html.svn-base | 1 + .../oac/.svn/text-base/190-1.html.svn-base | 1 + .../oac/.svn/text-base/190-2.html.svn-base | 1 + .../oac/.svn/text-base/191-1.html.svn-base | 1 + .../oac/.svn/text-base/191-2.html.svn-base | 1 + .../oac/.svn/text-base/192-1.html.svn-base | 1 + .../oac/.svn/text-base/192-2.html.svn-base | 1 + .../oac/.svn/text-base/193-1.html.svn-base | 1 + .../oac/.svn/text-base/193-2.html.svn-base | 1 + .../oac/.svn/text-base/194-1.html.svn-base | 1 + .../oac/.svn/text-base/194-2.html.svn-base | 1 + .../oac/.svn/text-base/195-1.html.svn-base | 1 + .../oac/.svn/text-base/195-2.html.svn-base | 1 + .../oac/.svn/text-base/195-3.html.svn-base | 1 + .../oac/.svn/text-base/195-4.html.svn-base | 1 + .../oac/.svn/text-base/196-1.html.svn-base | 1 + .../oac/.svn/text-base/196-2.html.svn-base | 1 + .../oac/.svn/text-base/197-1.html.svn-base | 1 + .../oac/.svn/text-base/197-2.html.svn-base | 1 + .../oac/.svn/text-base/197-3.html.svn-base | 11 + .../oac/.svn/text-base/197-4.html.svn-base | 1 + .../oac/.svn/text-base/197-5.html.svn-base | 11 + .../oac/.svn/text-base/198-1.html.svn-base | 1 + .../oac/.svn/text-base/198-2.html.svn-base | 1 + .../oac/.svn/text-base/199-1.html.svn-base | 1 + .../oac/.svn/text-base/199-2.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/2-1.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/2-2.html.svn-base | 1 + .../oac/.svn/text-base/20-1.html.svn-base | 1 + .../oac/.svn/text-base/20-2.html.svn-base | 1 + .../oac/.svn/text-base/20-3.html.svn-base | 1 + .../oac/.svn/text-base/20-4.html.svn-base | 1 + .../oac/.svn/text-base/20-5.html.svn-base | 1 + .../oac/.svn/text-base/20-6.html.svn-base | 1 + .../oac/.svn/text-base/200-1.html.svn-base | 1 + .../oac/.svn/text-base/200-2.html.svn-base | 1 + .../oac/.svn/text-base/201-1.html.svn-base | 1 + .../oac/.svn/text-base/201-2.html.svn-base | 1 + .../oac/.svn/text-base/202-1.html.svn-base | 1 + .../oac/.svn/text-base/202-2.html.svn-base | 1 + .../oac/.svn/text-base/203-1.html.svn-base | 1 + .../oac/.svn/text-base/203-2.html.svn-base | 1 + .../oac/.svn/text-base/204-1.html.svn-base | 1 + .../oac/.svn/text-base/204-2.html.svn-base | 1 + .../oac/.svn/text-base/204-3.html.svn-base | 1 + .../oac/.svn/text-base/204-4.html.svn-base | 1 + .../oac/.svn/text-base/204-5.html.svn-base | 1 + .../oac/.svn/text-base/204-6.html.svn-base | 1 + .../oac/.svn/text-base/205-1.html.svn-base | 1 + .../oac/.svn/text-base/205-2.html.svn-base | 1 + .../oac/.svn/text-base/205-3.html.svn-base | 1 + .../oac/.svn/text-base/205-4.html.svn-base | 1 + .../oac/.svn/text-base/205-5.html.svn-base | 1 + .../oac/.svn/text-base/205-6.html.svn-base | 1 + .../oac/.svn/text-base/206-1.html.svn-base | 1 + .../oac/.svn/text-base/206-2.html.svn-base | 1 + .../oac/.svn/text-base/206-3.html.svn-base | 1 + .../oac/.svn/text-base/206-4.html.svn-base | 1 + .../oac/.svn/text-base/206-5.html.svn-base | 1 + .../oac/.svn/text-base/206-6.html.svn-base | 1 + .../oac/.svn/text-base/207-1.html.svn-base | 1 + .../oac/.svn/text-base/207-2.html.svn-base | 1 + .../oac/.svn/text-base/207-3.html.svn-base | 1 + .../oac/.svn/text-base/207-4.html.svn-base | 1 + .../oac/.svn/text-base/207-5.html.svn-base | 1 + .../oac/.svn/text-base/207-6.html.svn-base | 1 + .../oac/.svn/text-base/208-1.html.svn-base | 1 + .../oac/.svn/text-base/208-2.html.svn-base | 1 + .../oac/.svn/text-base/208-3.html.svn-base | 1 + .../oac/.svn/text-base/208-4.html.svn-base | 1 + .../oac/.svn/text-base/208-5.html.svn-base | 1 + .../oac/.svn/text-base/208-6.html.svn-base | 1 + .../oac/.svn/text-base/208-7.html.svn-base | 1 + .../oac/.svn/text-base/208-8.html.svn-base | 1 + .../oac/.svn/text-base/208-9.html.svn-base | 1 + .../oac/.svn/text-base/209-1.html.svn-base | 1 + .../oac/.svn/text-base/209-2.html.svn-base | 1 + .../oac/.svn/text-base/21-1.html.svn-base | 1 + .../oac/.svn/text-base/21-2.html.svn-base | 1 + .../oac/.svn/text-base/211-1.html.svn-base | 19 + .../oac/.svn/text-base/211-2.html.svn-base | 19 + .../oac/.svn/text-base/212-1.html.svn-base | 1 + .../oac/.svn/text-base/212-2.html.svn-base | 1 + .../oac/.svn/text-base/212-3.html.svn-base | 1 + .../oac/.svn/text-base/212-4.html.svn-base | 1 + .../oac/.svn/text-base/212-5.html.svn-base | 1 + .../oac/.svn/text-base/212-6.html.svn-base | 1 + .../oac/.svn/text-base/213-1.html.svn-base | 1 + .../oac/.svn/text-base/213-2.html.svn-base | 1 + .../oac/.svn/text-base/213-3.html.svn-base | 1 + .../oac/.svn/text-base/213-4.html.svn-base | 1 + .../oac/.svn/text-base/213-5.html.svn-base | 1 + .../oac/.svn/text-base/213-6.html.svn-base | 1 + .../oac/.svn/text-base/213-7.html.svn-base | 1 + .../oac/.svn/text-base/214-1.html.svn-base | 1 + .../oac/.svn/text-base/214-2.html.svn-base | 1 + .../oac/.svn/text-base/214-3.html.svn-base | 1 + .../oac/.svn/text-base/214-4.html.svn-base | 1 + .../oac/.svn/text-base/214-5.html.svn-base | 1 + .../oac/.svn/text-base/214-6.html.svn-base | 1 + .../oac/.svn/text-base/216-1.html.svn-base | 1 + .../oac/.svn/text-base/216-2.html.svn-base | 1 + .../oac/.svn/text-base/216-3.html.svn-base | 1 + .../oac/.svn/text-base/216-4.html.svn-base | 1 + .../oac/.svn/text-base/216-5.html.svn-base | 1 + .../oac/.svn/text-base/216-6.html.svn-base | 1 + .../oac/.svn/text-base/217-1.html.svn-base | 1 + .../oac/.svn/text-base/217-2.html.svn-base | 1 + .../oac/.svn/text-base/217-3.html.svn-base | 1 + .../oac/.svn/text-base/217-4.html.svn-base | 1 + .../oac/.svn/text-base/217-5.html.svn-base | 1 + .../oac/.svn/text-base/217-6.html.svn-base | 1 + .../oac/.svn/text-base/218-1.html.svn-base | 1 + .../oac/.svn/text-base/218-2.html.svn-base | 1 + .../oac/.svn/text-base/218-3.html.svn-base | 1 + .../oac/.svn/text-base/218-4.html.svn-base | 1 + .../oac/.svn/text-base/218-5.html.svn-base | 1 + .../oac/.svn/text-base/218-6.html.svn-base | 1 + .../oac/.svn/text-base/219-1.html.svn-base | 1 + .../oac/.svn/text-base/219-2.html.svn-base | 1 + .../oac/.svn/text-base/219-3.html.svn-base | 1 + .../oac/.svn/text-base/219-4.html.svn-base | 1 + .../oac/.svn/text-base/219-5.html.svn-base | 1 + .../oac/.svn/text-base/219-6.html.svn-base | 1 + .../oac/.svn/text-base/22-1.html.svn-base | 1 + .../oac/.svn/text-base/22-2.html.svn-base | 1 + .../oac/.svn/text-base/220-1.html.svn-base | 1 + .../oac/.svn/text-base/220-2.html.svn-base | 1 + .../oac/.svn/text-base/220-3.html.svn-base | 1 + .../oac/.svn/text-base/220-4.html.svn-base | 1 + .../oac/.svn/text-base/220-5.html.svn-base | 1 + .../oac/.svn/text-base/220-6.html.svn-base | 1 + .../oac/.svn/text-base/221-1.html.svn-base | 1 + .../oac/.svn/text-base/221-2.html.svn-base | 1 + .../oac/.svn/text-base/221-3.html.svn-base | 1 + .../oac/.svn/text-base/221-4.html.svn-base | 1 + .../oac/.svn/text-base/221-5.html.svn-base | 1 + .../oac/.svn/text-base/221-6.html.svn-base | 1 + .../oac/.svn/text-base/222-1.html.svn-base | 1 + .../oac/.svn/text-base/222-2.html.svn-base | 1 + .../oac/.svn/text-base/222-3.html.svn-base | 1 + .../oac/.svn/text-base/223-1.html.svn-base | 1 + .../oac/.svn/text-base/223-2.html.svn-base | 1 + .../oac/.svn/text-base/223-3.html.svn-base | 1 + .../oac/.svn/text-base/224-1.html.svn-base | 1 + .../oac/.svn/text-base/224-2.html.svn-base | 1 + .../oac/.svn/text-base/224-3.html.svn-base | 1 + .../oac/.svn/text-base/225-1.html.svn-base | 1 + .../oac/.svn/text-base/225-2.html.svn-base | 1 + .../oac/.svn/text-base/225-3.html.svn-base | 1 + .../oac/.svn/text-base/225-4.html.svn-base | 1 + .../oac/.svn/text-base/225-5.html.svn-base | 1 + .../oac/.svn/text-base/226-1.html.svn-base | 1 + .../oac/.svn/text-base/226-2.html.svn-base | 1 + .../oac/.svn/text-base/226-3.html.svn-base | 1 + .../oac/.svn/text-base/227-1.html.svn-base | 1 + .../oac/.svn/text-base/227-2.html.svn-base | 1 + .../oac/.svn/text-base/227-3.html.svn-base | 1 + .../oac/.svn/text-base/228-1.html.svn-base | 1 + .../oac/.svn/text-base/228-2.html.svn-base | 1 + .../oac/.svn/text-base/228-3.html.svn-base | 1 + .../oac/.svn/text-base/229-1.html.svn-base | 1 + .../oac/.svn/text-base/229-2.html.svn-base | 1 + .../oac/.svn/text-base/229-3.html.svn-base | 1 + .../oac/.svn/text-base/23-1.html.svn-base | 1 + .../oac/.svn/text-base/23-2.html.svn-base | 1 + .../oac/.svn/text-base/23-3.html.svn-base | 1 + .../oac/.svn/text-base/230-1.html.svn-base | 1 + .../oac/.svn/text-base/230-2.html.svn-base | 1 + .../oac/.svn/text-base/231-1.html.svn-base | 1 + .../oac/.svn/text-base/231-2.html.svn-base | 1 + .../oac/.svn/text-base/232-1.html.svn-base | 1 + .../oac/.svn/text-base/232-2.html.svn-base | 1 + .../oac/.svn/text-base/233-1.html.svn-base | 14 + .../oac/.svn/text-base/233-2.html.svn-base | 1 + .../oac/.svn/text-base/234-1.html.svn-base | 14 + .../oac/.svn/text-base/234-2.html.svn-base | 1 + .../oac/.svn/text-base/235-1.html.svn-base | 14 + .../oac/.svn/text-base/235-2.html.svn-base | 14 + .../oac/.svn/text-base/236-1.html.svn-base | 14 + .../oac/.svn/text-base/236-2.html.svn-base | 13 + .../oac/.svn/text-base/236-3.html.svn-base | 14 + .../oac/.svn/text-base/237-1.html.svn-base | 19 + .../oac/.svn/text-base/237-2.html.svn-base | 19 + .../oac/.svn/text-base/238-1.html.svn-base | 15 + .../oac/.svn/text-base/238-2.html.svn-base | 15 + .../oac/.svn/text-base/238-3.html.svn-base | 15 + .../oac/.svn/text-base/239-1.html.svn-base | 1 + .../oac/.svn/text-base/239-2.html.svn-base | 1 + .../oac/.svn/text-base/239-3.html.svn-base | 1 + .../oac/.svn/text-base/24-1.html.svn-base | 1 + .../oac/.svn/text-base/24-2.html.svn-base | 1 + .../oac/.svn/text-base/240-1.html.svn-base | 1 + .../oac/.svn/text-base/240-2.html.svn-base | 1 + .../oac/.svn/text-base/241-1.html.svn-base | 22 + .../oac/.svn/text-base/241-2.html.svn-base | 20 + .../oac/.svn/text-base/242-1.html.svn-base | 20 + .../oac/.svn/text-base/242-2.html.svn-base | 20 + .../oac/.svn/text-base/243-1.html.svn-base | 20 + .../oac/.svn/text-base/243-2.html.svn-base | 20 + .../oac/.svn/text-base/244-1.html.svn-base | 21 + .../oac/.svn/text-base/244-2.html.svn-base | 20 + .../oac/.svn/text-base/245-1.html.svn-base | 47 + .../oac/.svn/text-base/245-2.html.svn-base | 47 + .../oac/.svn/text-base/246-1.html.svn-base | 25 + .../oac/.svn/text-base/246-2.html.svn-base | 25 + .../oac/.svn/text-base/246-3.html.svn-base | 25 + .../oac/.svn/text-base/246-4.html.svn-base | 30 + .../oac/.svn/text-base/246-5.html.svn-base | 30 + .../oac/.svn/text-base/247-1.html.svn-base | 1 + .../oac/.svn/text-base/247-2.html.svn-base | 1 + .../oac/.svn/text-base/248-1.html.svn-base | 18 + .../oac/.svn/text-base/248-2.html.svn-base | 18 + .../oac/.svn/text-base/248-3.html.svn-base | 13 + .../oac/.svn/text-base/249-1.html.svn-base | 25 + .../oac/.svn/text-base/249-2.html.svn-base | 25 + .../oac/.svn/text-base/25-1.html.svn-base | 1 + .../oac/.svn/text-base/25-2.html.svn-base | 1 + .../oac/.svn/text-base/250-1.html.svn-base | 19 + .../oac/.svn/text-base/250-2.html.svn-base | 19 + .../oac/.svn/text-base/251-1.html.svn-base | 11 + .../oac/.svn/text-base/251-2.html.svn-base | 11 + .../oac/.svn/text-base/252-1.html.svn-base | 1 + .../oac/.svn/text-base/252-2.html.svn-base | 1 + .../oac/.svn/text-base/252-3.html.svn-base | 1 + .../oac/.svn/text-base/253-1.html.svn-base | 11 + .../oac/.svn/text-base/253-2.html.svn-base | 11 + .../oac/.svn/text-base/254-1.html.svn-base | 1 + .../oac/.svn/text-base/254-2.html.svn-base | 1 + .../oac/.svn/text-base/254-3.html.svn-base | 1 + .../oac/.svn/text-base/255-1.html.svn-base | 1 + .../oac/.svn/text-base/255-2.html.svn-base | 1 + .../oac/.svn/text-base/255-3.html.svn-base | 1 + .../oac/.svn/text-base/256-1.html.svn-base | 1 + .../oac/.svn/text-base/256-2.html.svn-base | 1 + .../oac/.svn/text-base/256-3.html.svn-base | 1 + .../oac/.svn/text-base/257-1.html.svn-base | 1 + .../oac/.svn/text-base/257-2.html.svn-base | 1 + .../oac/.svn/text-base/257-3.html.svn-base | 1 + .../oac/.svn/text-base/258-1.html.svn-base | 1 + .../oac/.svn/text-base/258-2.html.svn-base | 1 + .../oac/.svn/text-base/259-1.html.svn-base | 1 + .../oac/.svn/text-base/259-2.html.svn-base | 1 + .../oac/.svn/text-base/26-1.html.svn-base | 1 + .../oac/.svn/text-base/26-2.html.svn-base | 1 + .../oac/.svn/text-base/260-1.html.svn-base | 1 + .../oac/.svn/text-base/260-2.html.svn-base | 1 + .../oac/.svn/text-base/261-1.html.svn-base | 28 + .../oac/.svn/text-base/261-2.html.svn-base | 28 + .../oac/.svn/text-base/261-3.html.svn-base | 13 + .../oac/.svn/text-base/262-1.html.svn-base | 31 + .../oac/.svn/text-base/262-2.html.svn-base | 38 + .../oac/.svn/text-base/263-1.html.svn-base | 12 + .../oac/.svn/text-base/263-2.html.svn-base | 12 + .../oac/.svn/text-base/264-1.html.svn-base | 1 + .../oac/.svn/text-base/264-2.html.svn-base | 1 + .../oac/.svn/text-base/264-3.html.svn-base | 1 + .../oac/.svn/text-base/265-1.html.svn-base | 34 + .../oac/.svn/text-base/265-2.html.svn-base | 34 + .../oac/.svn/text-base/266-1.html.svn-base | 14 + .../oac/.svn/text-base/266-2.html.svn-base | 16 + .../oac/.svn/text-base/267-1.html.svn-base | 29 + .../oac/.svn/text-base/267-2.html.svn-base | 29 + .../oac/.svn/text-base/268-1.html.svn-base | 25 + .../oac/.svn/text-base/268-2.html.svn-base | 25 + .../oac/.svn/text-base/269-1.html.svn-base | 47 + .../oac/.svn/text-base/269-2.html.svn-base | 81 + .../oac/.svn/text-base/27-1.html.svn-base | 1 + .../oac/.svn/text-base/27-2.html.svn-base | 1 + .../oac/.svn/text-base/270-1.html.svn-base | 11 + .../oac/.svn/text-base/270-2.html.svn-base | 13 + .../oac/.svn/text-base/271-1.html.svn-base | 13 + .../oac/.svn/text-base/271-2.html.svn-base | 13 + .../oac/.svn/text-base/272-1.html.svn-base | 20 + .../oac/.svn/text-base/272-2.html.svn-base | 23 + .../oac/.svn/text-base/273-1.html.svn-base | 13 + .../oac/.svn/text-base/273-2.html.svn-base | 14 + .../oac/.svn/text-base/273-3.html.svn-base | 13 + .../oac/.svn/text-base/273-4.html.svn-base | 13 + .../oac/.svn/text-base/274-1.html.svn-base | 22 + .../oac/.svn/text-base/274-2.html.svn-base | 23 + .../oac/.svn/text-base/274-3.html.svn-base | 22 + .../oac/.svn/text-base/274-4.html.svn-base | 21 + .../oac/.svn/text-base/274-5.html.svn-base | 21 + .../oac/.svn/text-base/274-6.html.svn-base | 38 + .../oac/.svn/text-base/274-7.html.svn-base | 38 + .../oac/.svn/text-base/275-1.html.svn-base | 20 + .../oac/.svn/text-base/275-2.html.svn-base | 11 + .../oac/.svn/text-base/276-1.html.svn-base | 15 + .../oac/.svn/text-base/276-2.html.svn-base | 14 + .../oac/.svn/text-base/276-3.html.svn-base | 15 + .../oac/.svn/text-base/28-1.html.svn-base | 22 + .../oac/.svn/text-base/28-2.html.svn-base | 26 + .../oac/.svn/text-base/29-1.html.svn-base | 1 + .../oac/.svn/text-base/29-2.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/3-1.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/3-2.html.svn-base | 1 + .../oac/.svn/text-base/30-1.html.svn-base | 1 + .../oac/.svn/text-base/30-2.html.svn-base | 1 + .../oac/.svn/text-base/31-1.html.svn-base | 1 + .../oac/.svn/text-base/31-2.html.svn-base | 1 + .../oac/.svn/text-base/32-1.html.svn-base | 1 + .../oac/.svn/text-base/32-2.html.svn-base | 1 + .../oac/.svn/text-base/32-3.html.svn-base | 1 + .../oac/.svn/text-base/33-1.html.svn-base | 1 + .../oac/.svn/text-base/33-10.html.svn-base | 1 + .../oac/.svn/text-base/33-2.html.svn-base | 1 + .../oac/.svn/text-base/33-3.html.svn-base | 1 + .../oac/.svn/text-base/33-4.html.svn-base | 1 + .../oac/.svn/text-base/33-5.html.svn-base | 1 + .../oac/.svn/text-base/33-6.html.svn-base | 1 + .../oac/.svn/text-base/33-7.html.svn-base | 1 + .../oac/.svn/text-base/33-8.html.svn-base | 1 + .../oac/.svn/text-base/33-9.html.svn-base | 1 + .../oac/.svn/text-base/34-1.html.svn-base | 1 + .../oac/.svn/text-base/34-2.html.svn-base | 1 + .../oac/.svn/text-base/35-1.html.svn-base | 1 + .../oac/.svn/text-base/35-2.html.svn-base | 1 + .../oac/.svn/text-base/36-1.html.svn-base | 1 + .../oac/.svn/text-base/36-2.html.svn-base | 1 + .../oac/.svn/text-base/37-1.html.svn-base | 1 + .../oac/.svn/text-base/37-2.html.svn-base | 1 + .../oac/.svn/text-base/38-1.html.svn-base | 1 + .../oac/.svn/text-base/38-2.html.svn-base | 1 + .../oac/.svn/text-base/39-1.html.svn-base | 1 + .../oac/.svn/text-base/39-2.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/4-1.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/4-2.html.svn-base | 1 + .../oac/.svn/text-base/40-1.html.svn-base | 1 + .../oac/.svn/text-base/40-2.html.svn-base | 1 + .../oac/.svn/text-base/41-1.html.svn-base | 1 + .../oac/.svn/text-base/41-2.html.svn-base | 1 + .../oac/.svn/text-base/42-1.html.svn-base | 1 + .../oac/.svn/text-base/42-2.html.svn-base | 1 + .../oac/.svn/text-base/43-1.html.svn-base | 1 + .../oac/.svn/text-base/43-2.html.svn-base | 1 + .../oac/.svn/text-base/44-1.html.svn-base | 1 + .../oac/.svn/text-base/44-2.html.svn-base | 1 + .../oac/.svn/text-base/45-1.html.svn-base | 1 + .../oac/.svn/text-base/45-2.html.svn-base | 1 + .../oac/.svn/text-base/46-1.html.svn-base | 1 + .../oac/.svn/text-base/46-2.html.svn-base | 1 + .../oac/.svn/text-base/47-1.html.svn-base | 1 + .../oac/.svn/text-base/47-2.html.svn-base | 1 + .../oac/.svn/text-base/48-1.html.svn-base | 1 + .../oac/.svn/text-base/48-2.html.svn-base | 1 + .../oac/.svn/text-base/49-1.html.svn-base | 1 + .../oac/.svn/text-base/49-2.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/5-1.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/5-2.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/5-3.html.svn-base | 1 + .../oac/.svn/text-base/50-1.html.svn-base | 1 + .../oac/.svn/text-base/50-2.html.svn-base | 1 + .../oac/.svn/text-base/51-1.html.svn-base | 1 + .../oac/.svn/text-base/51-2.html.svn-base | 1 + .../oac/.svn/text-base/51-3.html.svn-base | 1 + .../oac/.svn/text-base/52-1.html.svn-base | 1 + .../oac/.svn/text-base/52-2.html.svn-base | 1 + .../oac/.svn/text-base/53-1.html.svn-base | 1 + .../oac/.svn/text-base/53-2.html.svn-base | 1 + .../oac/.svn/text-base/53-3.html.svn-base | 1 + .../oac/.svn/text-base/53-4.html.svn-base | 1 + .../oac/.svn/text-base/53-5.html.svn-base | 1 + .../oac/.svn/text-base/54-1.html.svn-base | 1 + .../oac/.svn/text-base/54-2.html.svn-base | 1 + .../oac/.svn/text-base/55-1.html.svn-base | 1 + .../oac/.svn/text-base/55-2.html.svn-base | 1 + .../oac/.svn/text-base/56-1.html.svn-base | 1 + .../oac/.svn/text-base/56-2.html.svn-base | 1 + .../oac/.svn/text-base/56-3.html.svn-base | 1 + .../oac/.svn/text-base/56-4.html.svn-base | 1 + .../oac/.svn/text-base/57-1.html.svn-base | 1 + .../oac/.svn/text-base/57-2.html.svn-base | 1 + .../oac/.svn/text-base/57-3.html.svn-base | 1 + .../oac/.svn/text-base/57-4.html.svn-base | 1 + .../oac/.svn/text-base/58-1.html.svn-base | 1 + .../oac/.svn/text-base/58-2.html.svn-base | 1 + .../oac/.svn/text-base/59-1.html.svn-base | 1 + .../oac/.svn/text-base/59-2.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/6-1.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/6-2.html.svn-base | 11 + .../testfiles/oac/.svn/text-base/6-3.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/6-4.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/6-5.html.svn-base | 11 + .../testfiles/oac/.svn/text-base/6-6.html.svn-base | 11 + .../testfiles/oac/.svn/text-base/6-7.html.svn-base | 11 + .../oac/.svn/text-base/60-1.html.svn-base | 1 + .../oac/.svn/text-base/60-2.html.svn-base | 1 + .../oac/.svn/text-base/61-1.html.svn-base | 1 + .../oac/.svn/text-base/61-2.html.svn-base | 1 + .../oac/.svn/text-base/62-1.html.svn-base | 1 + .../oac/.svn/text-base/62-2.html.svn-base | 1 + .../oac/.svn/text-base/62-3.html.svn-base | 1 + .../oac/.svn/text-base/62-4.html.svn-base | 1 + .../oac/.svn/text-base/63-1.html.svn-base | 1 + .../oac/.svn/text-base/63-2.html.svn-base | 1 + .../oac/.svn/text-base/64-1.html.svn-base | 1 + .../oac/.svn/text-base/64-2.html.svn-base | 1 + .../oac/.svn/text-base/65-1.html.svn-base | 1 + .../oac/.svn/text-base/65-2.html.svn-base | 1 + .../oac/.svn/text-base/65-3.html.svn-base | 1 + .../oac/.svn/text-base/66-1.html.svn-base | 1 + .../oac/.svn/text-base/66-10.html.svn-base | 1 + .../oac/.svn/text-base/66-11.html.svn-base | 1 + .../oac/.svn/text-base/66-12.html.svn-base | 1 + .../oac/.svn/text-base/66-2.html.svn-base | 1 + .../oac/.svn/text-base/66-3.html.svn-base | 1 + .../oac/.svn/text-base/66-4.html.svn-base | 1 + .../oac/.svn/text-base/66-5.html.svn-base | 1 + .../oac/.svn/text-base/66-6.html.svn-base | 1 + .../oac/.svn/text-base/66-7.html.svn-base | 1 + .../oac/.svn/text-base/66-8.html.svn-base | 1 + .../oac/.svn/text-base/66-9.html.svn-base | 1 + .../oac/.svn/text-base/68-1.html.svn-base | 1 + .../oac/.svn/text-base/68-2.html.svn-base | 1 + .../oac/.svn/text-base/68-3.html.svn-base | 1 + .../oac/.svn/text-base/68-4.html.svn-base | 1 + .../oac/.svn/text-base/69-1.html.svn-base | 1 + .../oac/.svn/text-base/69-2.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/7-1.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/7-2.html.svn-base | 1 + .../oac/.svn/text-base/70-1.html.svn-base | 1 + .../oac/.svn/text-base/70-2.html.svn-base | 1 + .../oac/.svn/text-base/71-1.html.svn-base | 1 + .../oac/.svn/text-base/71-2.html.svn-base | 1 + .../oac/.svn/text-base/72-1.html.svn-base | 1 + .../oac/.svn/text-base/72-2.html.svn-base | 1 + .../oac/.svn/text-base/72-3.html.svn-base | 1 + .../oac/.svn/text-base/73-1.html.svn-base | 1 + .../oac/.svn/text-base/73-2.html.svn-base | 1 + .../oac/.svn/text-base/74-1.html.svn-base | 1 + .../oac/.svn/text-base/74-2.html.svn-base | 1 + .../oac/.svn/text-base/75-1.html.svn-base | 1 + .../oac/.svn/text-base/75-2.html.svn-base | 1 + .../oac/.svn/text-base/76-1.html.svn-base | 1 + .../oac/.svn/text-base/76-2.html.svn-base | 1 + .../oac/.svn/text-base/77-1.html.svn-base | 1 + .../oac/.svn/text-base/77-2.html.svn-base | 1 + .../oac/.svn/text-base/78-1.html.svn-base | 1 + .../oac/.svn/text-base/78-2.html.svn-base | 1 + .../oac/.svn/text-base/79-1.html.svn-base | 1 + .../oac/.svn/text-base/79-2.html.svn-base | 1 + .../oac/.svn/text-base/79-3.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/8-1.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/8-2.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/8-3.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/8-4.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/8-5.html.svn-base | 1 + .../oac/.svn/text-base/80-1.html.svn-base | 1 + .../oac/.svn/text-base/80-2.html.svn-base | 1 + .../oac/.svn/text-base/80-3.html.svn-base | 1 + .../oac/.svn/text-base/80-4.html.svn-base | 1 + .../oac/.svn/text-base/81-1.html.svn-base | 1 + .../oac/.svn/text-base/81-2.html.svn-base | 1 + .../oac/.svn/text-base/82-1.html.svn-base | 1 + .../oac/.svn/text-base/82-2.html.svn-base | 1 + .../oac/.svn/text-base/82-3.html.svn-base | 1 + .../oac/.svn/text-base/82-4.html.svn-base | 1 + .../oac/.svn/text-base/82-5.html.svn-base | 1 + .../oac/.svn/text-base/82-6.html.svn-base | 1 + .../oac/.svn/text-base/82-7.html.svn-base | 1 + .../oac/.svn/text-base/82-8.html.svn-base | 1 + .../oac/.svn/text-base/82-9.html.svn-base | 1 + .../oac/.svn/text-base/86-1.html.svn-base | 1 + .../oac/.svn/text-base/86-2.html.svn-base | 1 + .../oac/.svn/text-base/87-1.html.svn-base | 1 + .../oac/.svn/text-base/87-2.html.svn-base | 1 + .../oac/.svn/text-base/88-1.html.svn-base | 1 + .../oac/.svn/text-base/88-2.html.svn-base | 1 + .../oac/.svn/text-base/89-1.html.svn-base | 1 + .../oac/.svn/text-base/89-2.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/9-1.html.svn-base | 11 + .../testfiles/oac/.svn/text-base/9-2.html.svn-base | 12 + .../oac/.svn/text-base/90-1.html.svn-base | 1 + .../oac/.svn/text-base/90-2.html.svn-base | 1 + .../oac/.svn/text-base/91-1.html.svn-base | 1 + .../oac/.svn/text-base/91-2.html.svn-base | 1 + .../oac/.svn/text-base/91-3.html.svn-base | 1 + .../oac/.svn/text-base/91-4.html.svn-base | 1 + .../oac/.svn/text-base/92-1.html.svn-base | 1 + .../oac/.svn/text-base/92-2.html.svn-base | 1 + .../oac/.svn/text-base/92-3.html.svn-base | 1 + .../oac/.svn/text-base/94-1.html.svn-base | 1 + .../oac/.svn/text-base/94-2.html.svn-base | 1 + .../oac/.svn/text-base/95-1.html.svn-base | 1 + .../oac/.svn/text-base/95-2.html.svn-base | 1 + .../oac/.svn/text-base/95-3.html.svn-base | 1 + .../oac/.svn/text-base/95-4.html.svn-base | 1 + .../oac/.svn/text-base/96-1.html.svn-base | 19 + .../oac/.svn/text-base/96-2.html.svn-base | 19 + .../oac/.svn/text-base/97-1.html.svn-base | 1 + .../oac/.svn/text-base/97-2.html.svn-base | 1 + .../oac/.svn/text-base/98-1.html.svn-base | 1 + .../oac/.svn/text-base/98-2.html.svn-base | 1 + .../oac/.svn/text-base/98-3.html.svn-base | 1 + .../oac/.svn/text-base/98-4.html.svn-base | 1 + .../oac/.svn/text-base/99-1.html.svn-base | 1 + .../oac/.svn/text-base/99-2.html.svn-base | 1 + .../oac/.svn/text-base/alternative1.html.svn-base | 11 + .../oac/.svn/text-base/alternative2.html.svn-base | 13 + .../oac/.svn/text-base/avlab.mp3.svn-base | Bin 0 -> 98454 bytes .../oac/.svn/text-base/avlab.txt.svn-base | 1 + .../oac/.svn/text-base/big-fail.png.svn-base | Bin 0 -> 58807 bytes .../oac/.svn/text-base/chart.gif.svn-base | Bin 0 -> 5680 bytes .../oac/.svn/text-base/contrast1.gif.svn-base | Bin 0 -> 381 bytes .../oac/.svn/text-base/contrast2.gif.svn-base | Bin 0 -> 304 bytes .../oac/.svn/text-base/eatatjoes.gif.svn-base | Bin 0 -> 4738 bytes .../oac/.svn/text-base/finddogs.gif.svn-base | Bin 0 -> 648 bytes .../testfiles/oac/.svn/text-base/fish.gif.svn-base | Bin 0 -> 1724 bytes .../oac/.svn/text-base/fish1.html.svn-base | 1 + .../oac/.svn/text-base/fish2.html.svn-base | 1 + .../oac/.svn/text-base/fishswim.gif.svn-base | Bin 0 -> 18161 bytes tests/testfiles/oac/.svn/text-base/go.gif.svn-base | Bin 0 -> 2194 bytes .../oac/.svn/text-base/image.gif.svn-base | Bin 0 -> 591 bytes .../oac/.svn/text-base/library.gif.svn-base | Bin 0 -> 2263 bytes .../oac/.svn/text-base/renew.gif.svn-base | Bin 0 -> 1458 bytes .../testfiles/oac/.svn/text-base/rex.gif.svn-base | Bin 0 -> 17464 bytes .../testfiles/oac/.svn/text-base/rex.html.svn-base | 1 + .../testfiles/oac/.svn/text-base/rex.jpg.svn-base | Bin 0 -> 5451 bytes .../oac/.svn/text-base/spacer.gif.svn-base | Bin 0 -> 40 bytes .../testfiles/oac/.svn/text-base/star.gif.svn-base | Bin 0 -> 910 bytes .../oac/.svn/text-base/submit.gif.svn-base | Bin 0 -> 1241 bytes .../oac/.svn/text-base/welcome.gif.svn-base | Bin 0 -> 987 bytes tests/testfiles/oac/1-1.html | 11 + tests/testfiles/oac/1-2.html | 1 + tests/testfiles/oac/10-1.html | 1 + tests/testfiles/oac/10-2.html | 1 + tests/testfiles/oac/100-1.html | 1 + tests/testfiles/oac/100-2.html | 1 + tests/testfiles/oac/102-1.html | 1 + tests/testfiles/oac/102-2.html | 1 + tests/testfiles/oac/103-1.html | 1 + tests/testfiles/oac/103-2.html | 1 + tests/testfiles/oac/104-1.html | 1 + tests/testfiles/oac/104-2.html | 1 + tests/testfiles/oac/105-1.html | 1 + tests/testfiles/oac/105-2.html | 1 + tests/testfiles/oac/106-1.html | 1 + tests/testfiles/oac/106-2.html | 1 + tests/testfiles/oac/107-1.html | 1 + tests/testfiles/oac/107-2.html | 1 + tests/testfiles/oac/108-1.html | 1 + tests/testfiles/oac/108-2.html | 1 + tests/testfiles/oac/109-1.html | 1 + tests/testfiles/oac/109-2.html | 1 + tests/testfiles/oac/11-1.html | 1 + tests/testfiles/oac/11-2.html | 1 + tests/testfiles/oac/110-1.html | 1 + tests/testfiles/oac/110-2.html | 1 + tests/testfiles/oac/111-1.html | 1 + tests/testfiles/oac/111-2.html | 1 + tests/testfiles/oac/111-3.html | 1 + tests/testfiles/oac/112-1.html | 1 + tests/testfiles/oac/112-2.html | 1 + tests/testfiles/oac/113-1.html | 1 + tests/testfiles/oac/113-2.html | 1 + tests/testfiles/oac/114-1.html | 1 + tests/testfiles/oac/114-2.html | 1 + tests/testfiles/oac/114-3.html | 1 + tests/testfiles/oac/115-1.html | 1 + tests/testfiles/oac/115-2.html | 1 + tests/testfiles/oac/116-1.html | 1 + tests/testfiles/oac/116-2.html | 1 + tests/testfiles/oac/117-1.html | 1 + tests/testfiles/oac/117-2.html | 1 + tests/testfiles/oac/118-1.html | 1 + tests/testfiles/oac/118-2.html | 1 + tests/testfiles/oac/118-3.html | 1 + tests/testfiles/oac/118-4.html | 1 + tests/testfiles/oac/119-1.html | 1 + tests/testfiles/oac/119-2.html | 1 + tests/testfiles/oac/119-3.html | 1 + tests/testfiles/oac/119-4.html | 1 + tests/testfiles/oac/12-1.html | 1 + tests/testfiles/oac/12-2.html | 1 + tests/testfiles/oac/120-1.html | 1 + tests/testfiles/oac/120-2.html | 1 + tests/testfiles/oac/120-3.html | 1 + tests/testfiles/oac/120-4.html | 1 + tests/testfiles/oac/121-1.html | 1 + tests/testfiles/oac/121-2.html | 1 + tests/testfiles/oac/121-3.html | 1 + tests/testfiles/oac/121-4.html | 1 + tests/testfiles/oac/122-1.html | 18 + tests/testfiles/oac/122-2.html | 18 + tests/testfiles/oac/123-1.html | 20 + tests/testfiles/oac/123-2.html | 20 + tests/testfiles/oac/124-1.html | 18 + tests/testfiles/oac/124-2.html | 18 + tests/testfiles/oac/125-1.html | 20 + tests/testfiles/oac/125-2.html | 20 + tests/testfiles/oac/126-1.html | 1 + tests/testfiles/oac/126-2.html | 1 + tests/testfiles/oac/127-1.html | 1 + tests/testfiles/oac/127-2.html | 1 + tests/testfiles/oac/128-1.html | 1 + tests/testfiles/oac/128-2.html | 1 + tests/testfiles/oac/129-1.html | 1 + tests/testfiles/oac/129-2.html | 1 + tests/testfiles/oac/13-1.html | 1 + tests/testfiles/oac/13-2.html | 1 + tests/testfiles/oac/13-3.html | 1 + tests/testfiles/oac/131-1.html | 1 + tests/testfiles/oac/131-2.html | 1 + tests/testfiles/oac/132-1.html | 1 + tests/testfiles/oac/132-2.html | 1 + tests/testfiles/oac/133-1.html | 1 + tests/testfiles/oac/133-2.html | 1 + tests/testfiles/oac/134-1.html | 1 + tests/testfiles/oac/134-2.html | 1 + tests/testfiles/oac/135-1.html | 11 + tests/testfiles/oac/135-2.html | 1 + tests/testfiles/oac/135-2.xhtml | 44 + tests/testfiles/oac/136-1.html | 1 + tests/testfiles/oac/136-2.html | 1 + tests/testfiles/oac/137-1.html | 1 + tests/testfiles/oac/137-2.html | 1 + tests/testfiles/oac/138-1.html | 1 + tests/testfiles/oac/138-2.html | 1 + tests/testfiles/oac/138-3.html | 1 + tests/testfiles/oac/139-1.html | 1 + tests/testfiles/oac/139-2.html | 1 + tests/testfiles/oac/139-3.html | 1 + tests/testfiles/oac/14-1.html | 1 + tests/testfiles/oac/14-2.html | 1 + tests/testfiles/oac/14-3.html | 1 + tests/testfiles/oac/140-1.html | 1 + tests/testfiles/oac/140-2.html | 1 + tests/testfiles/oac/140-3.html | 1 + tests/testfiles/oac/141-1.html | 1 + tests/testfiles/oac/141-2.html | 1 + tests/testfiles/oac/141-3.html | 1 + tests/testfiles/oac/142-1.html | 1 + tests/testfiles/oac/142-2.html | 1 + tests/testfiles/oac/142-3.html | 1 + tests/testfiles/oac/143-1.html | 1 + tests/testfiles/oac/143-2.html | 1 + tests/testfiles/oac/144-1.html | 1 + tests/testfiles/oac/144-2.html | 1 + tests/testfiles/oac/145-1.html | 1 + tests/testfiles/oac/145-2.html | 1 + tests/testfiles/oac/145-3.html | 1 + tests/testfiles/oac/145-4.html | 1 + tests/testfiles/oac/145-5.html | 1 + tests/testfiles/oac/145-6.html | 1 + tests/testfiles/oac/146-1.html | 1 + tests/testfiles/oac/146-2.html | 1 + tests/testfiles/oac/147-1.html | 1 + tests/testfiles/oac/147-2.html | 1 + tests/testfiles/oac/147-3.html | 1 + tests/testfiles/oac/147-4.html | 1 + tests/testfiles/oac/148-1.html | 9 + tests/testfiles/oac/148-2.html | 9 + tests/testfiles/oac/15-1.html | 1 + tests/testfiles/oac/15-2.html | 1 + tests/testfiles/oac/150-1.html | 12 + tests/testfiles/oac/150-2.html | 12 + tests/testfiles/oac/151-1.html | 1 + tests/testfiles/oac/151-2.html | 1 + tests/testfiles/oac/151-3.html | 1 + tests/testfiles/oac/152-1.html | 1 + tests/testfiles/oac/152-2.html | 1 + tests/testfiles/oac/152-3.html | 1 + tests/testfiles/oac/153-1.html | 1 + tests/testfiles/oac/153-2.html | 1 + tests/testfiles/oac/154-1.html | 1 + tests/testfiles/oac/154-2.html | 1 + tests/testfiles/oac/159-1.html | 1 + tests/testfiles/oac/159-2.html | 1 + tests/testfiles/oac/16-1.html | 1 + tests/testfiles/oac/16-2.html | 1 + tests/testfiles/oac/16-3.html | 1 + tests/testfiles/oac/16-4.html | 1 + tests/testfiles/oac/160-1.html | 1 + tests/testfiles/oac/160-2.html | 1 + tests/testfiles/oac/161-1.html | 1 + tests/testfiles/oac/161-2.html | 1 + tests/testfiles/oac/162-1.html | 1 + tests/testfiles/oac/162-2.html | 1 + tests/testfiles/oac/163-1.html | 1 + tests/testfiles/oac/163-2.html | 1 + tests/testfiles/oac/163-3.html | 1 + tests/testfiles/oac/164-1.html | 1 + tests/testfiles/oac/164-2.html | 1 + tests/testfiles/oac/165-1.html | 1 + tests/testfiles/oac/165-2.html | 1 + tests/testfiles/oac/166-1.html | 1 + tests/testfiles/oac/166-2.html | 1 + tests/testfiles/oac/167-1.html | 1 + tests/testfiles/oac/167-2.html | 1 + tests/testfiles/oac/168-1.html | 1 + tests/testfiles/oac/168-2.html | 1 + tests/testfiles/oac/168-3.html | 1 + tests/testfiles/oac/168-4.html | 1 + tests/testfiles/oac/169-1.html | 1 + tests/testfiles/oac/169-2.html | 1 + tests/testfiles/oac/17-1.html | 1 + tests/testfiles/oac/17-10.html | 1 + tests/testfiles/oac/17-11.html | 1 + tests/testfiles/oac/17-12.html | 1 + tests/testfiles/oac/17-2.html | 1 + tests/testfiles/oac/17-3.html | 1 + tests/testfiles/oac/17-4.html | 1 + tests/testfiles/oac/17-5.html | 1 + tests/testfiles/oac/17-6.html | 1 + tests/testfiles/oac/17-7.html | 1 + tests/testfiles/oac/17-8.html | 1 + tests/testfiles/oac/17-9.html | 1 + tests/testfiles/oac/173-1.html | 1 + tests/testfiles/oac/173-2.html | 1 + tests/testfiles/oac/173-3.html | 1 + tests/testfiles/oac/174-1.html | 1 + tests/testfiles/oac/174-2.html | 1 + tests/testfiles/oac/174-3.html | 1 + tests/testfiles/oac/174-4.html | 1 + tests/testfiles/oac/174-5.html | 1 + tests/testfiles/oac/175-1.html | 1 + tests/testfiles/oac/175-2.html | 1 + tests/testfiles/oac/176-1.html | 1 + tests/testfiles/oac/176-2.html | 1 + tests/testfiles/oac/177-1.html | 1 + tests/testfiles/oac/177-2.html | 1 + tests/testfiles/oac/178-1.html | 1 + tests/testfiles/oac/178-2.html | 1 + tests/testfiles/oac/178-3.html | 1 + tests/testfiles/oac/18-1.html | 1 + tests/testfiles/oac/18-2.html | 1 + tests/testfiles/oac/18-3.html | 1 + tests/testfiles/oac/18-4.html | 1 + tests/testfiles/oac/180-1.html | 1 + tests/testfiles/oac/180-2.html | 1 + tests/testfiles/oac/181-1.html | 1 + tests/testfiles/oac/181-2.html | 1 + tests/testfiles/oac/182-1.html | 1 + tests/testfiles/oac/182-2.html | 1 + tests/testfiles/oac/183-1.html | 1 + tests/testfiles/oac/183-2.html | 1 + tests/testfiles/oac/184-1.html | 1 + tests/testfiles/oac/184-2.html | 1 + tests/testfiles/oac/185-1.html | 1 + tests/testfiles/oac/185-2.html | 1 + tests/testfiles/oac/186-1.html | 1 + tests/testfiles/oac/186-2.html | 1 + tests/testfiles/oac/187-1.html | 1 + tests/testfiles/oac/187-2.html | 1 + tests/testfiles/oac/188-1.html | 1 + tests/testfiles/oac/188-2.html | 1 + tests/testfiles/oac/188-3.html | 1 + tests/testfiles/oac/188-4.html | 1 + tests/testfiles/oac/188-5.html | 1 + tests/testfiles/oac/189-1.html | 1 + tests/testfiles/oac/189-2.html | 1 + tests/testfiles/oac/19-1.html | 1 + tests/testfiles/oac/19-2.html | 1 + tests/testfiles/oac/19-3.html | 1 + tests/testfiles/oac/190-1.html | 1 + tests/testfiles/oac/190-2.html | 1 + tests/testfiles/oac/191-1.html | 1 + tests/testfiles/oac/191-2.html | 1 + tests/testfiles/oac/192-1.html | 1 + tests/testfiles/oac/192-2.html | 1 + tests/testfiles/oac/193-1.html | 1 + tests/testfiles/oac/193-2.html | 1 + tests/testfiles/oac/194-1.html | 1 + tests/testfiles/oac/194-2.html | 1 + tests/testfiles/oac/195-1.html | 1 + tests/testfiles/oac/195-2.html | 1 + tests/testfiles/oac/195-3.html | 1 + tests/testfiles/oac/195-4.html | 1 + tests/testfiles/oac/196-1.html | 1 + tests/testfiles/oac/196-2.html | 1 + tests/testfiles/oac/197-1.html | 1 + tests/testfiles/oac/197-2.html | 1 + tests/testfiles/oac/197-3.html | 11 + tests/testfiles/oac/197-4.html | 1 + tests/testfiles/oac/197-5.html | 11 + tests/testfiles/oac/198-1.html | 1 + tests/testfiles/oac/198-2.html | 1 + tests/testfiles/oac/199-1.html | 1 + tests/testfiles/oac/199-2.html | 1 + tests/testfiles/oac/2-1.html | 1 + tests/testfiles/oac/2-2.html | 1 + tests/testfiles/oac/20-1.html | 1 + tests/testfiles/oac/20-2.html | 1 + tests/testfiles/oac/20-3.html | 1 + tests/testfiles/oac/20-4.html | 1 + tests/testfiles/oac/20-5.html | 1 + tests/testfiles/oac/20-6.html | 1 + tests/testfiles/oac/200-1.html | 1 + tests/testfiles/oac/200-2.html | 1 + tests/testfiles/oac/201-1.html | 1 + tests/testfiles/oac/201-2.html | 1 + tests/testfiles/oac/202-1.html | 1 + tests/testfiles/oac/202-2.html | 1 + tests/testfiles/oac/203-1.html | 1 + tests/testfiles/oac/203-2.html | 1 + tests/testfiles/oac/204-1.html | 1 + tests/testfiles/oac/204-2.html | 1 + tests/testfiles/oac/204-3.html | 1 + tests/testfiles/oac/204-4.html | 1 + tests/testfiles/oac/204-5.html | 1 + tests/testfiles/oac/204-6.html | 1 + tests/testfiles/oac/205-1.html | 1 + tests/testfiles/oac/205-2.html | 1 + tests/testfiles/oac/205-3.html | 1 + tests/testfiles/oac/205-4.html | 1 + tests/testfiles/oac/205-5.html | 1 + tests/testfiles/oac/205-6.html | 1 + tests/testfiles/oac/206-1.html | 1 + tests/testfiles/oac/206-2.html | 1 + tests/testfiles/oac/206-3.html | 1 + tests/testfiles/oac/206-4.html | 1 + tests/testfiles/oac/206-5.html | 1 + tests/testfiles/oac/206-6.html | 1 + tests/testfiles/oac/207-1.html | 1 + tests/testfiles/oac/207-2.html | 1 + tests/testfiles/oac/207-3.html | 1 + tests/testfiles/oac/207-4.html | 1 + tests/testfiles/oac/207-5.html | 1 + tests/testfiles/oac/207-6.html | 1 + tests/testfiles/oac/208-1.html | 1 + tests/testfiles/oac/208-2.html | 1 + tests/testfiles/oac/208-3.html | 1 + tests/testfiles/oac/208-4.html | 1 + tests/testfiles/oac/208-5.html | 1 + tests/testfiles/oac/208-6.html | 1 + tests/testfiles/oac/208-7.html | 1 + tests/testfiles/oac/208-8.html | 1 + tests/testfiles/oac/208-9.html | 1 + tests/testfiles/oac/209-1.html | 1 + tests/testfiles/oac/209-2.html | 1 + tests/testfiles/oac/21-1.html | 1 + tests/testfiles/oac/21-2.html | 1 + tests/testfiles/oac/211-1.html | 19 + tests/testfiles/oac/211-2.html | 19 + tests/testfiles/oac/212-1.html | 1 + tests/testfiles/oac/212-2.html | 1 + tests/testfiles/oac/212-3.html | 1 + tests/testfiles/oac/212-4.html | 1 + tests/testfiles/oac/212-5.html | 1 + tests/testfiles/oac/212-6.html | 1 + tests/testfiles/oac/213-1.html | 1 + tests/testfiles/oac/213-2.html | 1 + tests/testfiles/oac/213-3.html | 1 + tests/testfiles/oac/213-4.html | 1 + tests/testfiles/oac/213-5.html | 1 + tests/testfiles/oac/213-6.html | 1 + tests/testfiles/oac/213-7.html | 1 + tests/testfiles/oac/214-1.html | 1 + tests/testfiles/oac/214-2.html | 1 + tests/testfiles/oac/214-3.html | 1 + tests/testfiles/oac/214-4.html | 1 + tests/testfiles/oac/214-5.html | 1 + tests/testfiles/oac/214-6.html | 1 + tests/testfiles/oac/216-1.html | 1 + tests/testfiles/oac/216-2.html | 1 + tests/testfiles/oac/216-3.html | 1 + tests/testfiles/oac/216-4.html | 1 + tests/testfiles/oac/216-5.html | 1 + tests/testfiles/oac/216-6.html | 1 + tests/testfiles/oac/217-1.html | 1 + tests/testfiles/oac/217-2.html | 1 + tests/testfiles/oac/217-3.html | 1 + tests/testfiles/oac/217-4.html | 1 + tests/testfiles/oac/217-5.html | 1 + tests/testfiles/oac/217-6.html | 1 + tests/testfiles/oac/218-1.html | 1 + tests/testfiles/oac/218-2.html | 1 + tests/testfiles/oac/218-3.html | 1 + tests/testfiles/oac/218-4.html | 1 + tests/testfiles/oac/218-5.html | 1 + tests/testfiles/oac/218-6.html | 1 + tests/testfiles/oac/219-1.html | 1 + tests/testfiles/oac/219-2.html | 1 + tests/testfiles/oac/219-3.html | 1 + tests/testfiles/oac/219-4.html | 1 + tests/testfiles/oac/219-5.html | 1 + tests/testfiles/oac/219-6.html | 1 + tests/testfiles/oac/22-1.html | 1 + tests/testfiles/oac/22-2.html | 1 + tests/testfiles/oac/220-1.html | 1 + tests/testfiles/oac/220-2.html | 1 + tests/testfiles/oac/220-3.html | 1 + tests/testfiles/oac/220-4.html | 1 + tests/testfiles/oac/220-5.html | 1 + tests/testfiles/oac/220-6.html | 1 + tests/testfiles/oac/221-1.html | 1 + tests/testfiles/oac/221-2.html | 1 + tests/testfiles/oac/221-3.html | 1 + tests/testfiles/oac/221-4.html | 1 + tests/testfiles/oac/221-5.html | 1 + tests/testfiles/oac/221-6.html | 1 + tests/testfiles/oac/222-1.html | 1 + tests/testfiles/oac/222-2.html | 1 + tests/testfiles/oac/222-3.html | 1 + tests/testfiles/oac/223-1.html | 1 + tests/testfiles/oac/223-2.html | 1 + tests/testfiles/oac/223-3.html | 1 + tests/testfiles/oac/224-1.html | 1 + tests/testfiles/oac/224-2.html | 1 + tests/testfiles/oac/224-3.html | 1 + tests/testfiles/oac/225-1.html | 1 + tests/testfiles/oac/225-2.html | 1 + tests/testfiles/oac/225-3.html | 1 + tests/testfiles/oac/225-4.html | 1 + tests/testfiles/oac/225-5.html | 1 + tests/testfiles/oac/226-1.html | 1 + tests/testfiles/oac/226-2.html | 1 + tests/testfiles/oac/226-3.html | 1 + tests/testfiles/oac/227-1.html | 1 + tests/testfiles/oac/227-2.html | 1 + tests/testfiles/oac/227-3.html | 1 + tests/testfiles/oac/228-1.html | 1 + tests/testfiles/oac/228-2.html | 1 + tests/testfiles/oac/228-3.html | 1 + tests/testfiles/oac/229-1.html | 1 + tests/testfiles/oac/229-2.html | 1 + tests/testfiles/oac/229-3.html | 1 + tests/testfiles/oac/23-1.html | 1 + tests/testfiles/oac/23-2.html | 1 + tests/testfiles/oac/23-3.html | 1 + tests/testfiles/oac/230-1.html | 1 + tests/testfiles/oac/230-2.html | 1 + tests/testfiles/oac/231-1.html | 1 + tests/testfiles/oac/231-2.html | 1 + tests/testfiles/oac/232-1.html | 1 + tests/testfiles/oac/232-2.html | 1 + tests/testfiles/oac/233-1.html | 14 + tests/testfiles/oac/233-2.html | 1 + tests/testfiles/oac/234-1.html | 14 + tests/testfiles/oac/234-2.html | 1 + tests/testfiles/oac/235-1.html | 14 + tests/testfiles/oac/235-2.html | 14 + tests/testfiles/oac/236-1.html | 14 + tests/testfiles/oac/236-2.html | 13 + tests/testfiles/oac/236-3.html | 14 + tests/testfiles/oac/237-1.html | 19 + tests/testfiles/oac/237-2.html | 19 + tests/testfiles/oac/238-1.html | 15 + tests/testfiles/oac/238-2.html | 15 + tests/testfiles/oac/238-3.html | 15 + tests/testfiles/oac/239-1.html | 1 + tests/testfiles/oac/239-2.html | 1 + tests/testfiles/oac/239-3.html | 1 + tests/testfiles/oac/24-1.html | 1 + tests/testfiles/oac/24-2.html | 1 + tests/testfiles/oac/240-1.html | 1 + tests/testfiles/oac/240-2.html | 1 + tests/testfiles/oac/241-1.html | 22 + tests/testfiles/oac/241-2.html | 20 + tests/testfiles/oac/242-1.html | 20 + tests/testfiles/oac/242-2.html | 20 + tests/testfiles/oac/243-1.html | 20 + tests/testfiles/oac/243-2.html | 20 + tests/testfiles/oac/244-1.html | 21 + tests/testfiles/oac/244-2.html | 20 + tests/testfiles/oac/245-1.html | 47 + tests/testfiles/oac/245-2.html | 47 + tests/testfiles/oac/246-1.html | 25 + tests/testfiles/oac/246-2.html | 25 + tests/testfiles/oac/246-3.html | 25 + tests/testfiles/oac/246-4.html | 30 + tests/testfiles/oac/246-5.html | 30 + tests/testfiles/oac/247-1.html | 1 + tests/testfiles/oac/247-2.html | 1 + tests/testfiles/oac/248-1.html | 18 + tests/testfiles/oac/248-2.html | 18 + tests/testfiles/oac/248-3.html | 13 + tests/testfiles/oac/249-1.html | 25 + tests/testfiles/oac/249-2.html | 25 + tests/testfiles/oac/25-1.html | 1 + tests/testfiles/oac/25-2.html | 1 + tests/testfiles/oac/250-1.html | 19 + tests/testfiles/oac/250-2.html | 19 + tests/testfiles/oac/251-1.html | 11 + tests/testfiles/oac/251-2.html | 11 + tests/testfiles/oac/252-1.html | 1 + tests/testfiles/oac/252-2.html | 1 + tests/testfiles/oac/252-3.html | 1 + tests/testfiles/oac/253-1.html | 11 + tests/testfiles/oac/253-2.html | 11 + tests/testfiles/oac/254-1.html | 1 + tests/testfiles/oac/254-2.html | 1 + tests/testfiles/oac/254-3.html | 1 + tests/testfiles/oac/255-1.html | 1 + tests/testfiles/oac/255-2.html | 1 + tests/testfiles/oac/255-3.html | 1 + tests/testfiles/oac/256-1.html | 1 + tests/testfiles/oac/256-2.html | 1 + tests/testfiles/oac/256-3.html | 1 + tests/testfiles/oac/257-1.html | 1 + tests/testfiles/oac/257-2.html | 1 + tests/testfiles/oac/257-3.html | 1 + tests/testfiles/oac/258-1.html | 1 + tests/testfiles/oac/258-2.html | 1 + tests/testfiles/oac/259-1.html | 1 + tests/testfiles/oac/259-2.html | 1 + tests/testfiles/oac/26-1.html | 1 + tests/testfiles/oac/26-2.html | 1 + tests/testfiles/oac/260-1.html | 1 + tests/testfiles/oac/260-2.html | 1 + tests/testfiles/oac/261-1.html | 28 + tests/testfiles/oac/261-2.html | 28 + tests/testfiles/oac/261-3.html | 13 + tests/testfiles/oac/262-1.html | 31 + tests/testfiles/oac/262-2.html | 38 + tests/testfiles/oac/263-1.html | 12 + tests/testfiles/oac/263-2.html | 12 + tests/testfiles/oac/264-1.html | 1 + tests/testfiles/oac/264-2.html | 1 + tests/testfiles/oac/264-3.html | 1 + tests/testfiles/oac/265-1.html | 34 + tests/testfiles/oac/265-2.html | 34 + tests/testfiles/oac/266-1.html | 14 + tests/testfiles/oac/266-2.html | 16 + tests/testfiles/oac/267-1.html | 29 + tests/testfiles/oac/267-2.html | 29 + tests/testfiles/oac/268-1.html | 25 + tests/testfiles/oac/268-2.html | 25 + tests/testfiles/oac/269-1.html | 47 + tests/testfiles/oac/269-2.html | 81 + tests/testfiles/oac/27-1.html | 1 + tests/testfiles/oac/27-2.html | 1 + tests/testfiles/oac/270-1.html | 11 + tests/testfiles/oac/270-2.html | 13 + tests/testfiles/oac/271-1.html | 13 + tests/testfiles/oac/271-2.html | 13 + tests/testfiles/oac/272-1.html | 20 + tests/testfiles/oac/272-2.html | 23 + tests/testfiles/oac/273-1.html | 13 + tests/testfiles/oac/273-2.html | 14 + tests/testfiles/oac/273-3.html | 13 + tests/testfiles/oac/273-4.html | 13 + tests/testfiles/oac/274-1.html | 22 + tests/testfiles/oac/274-2.html | 23 + tests/testfiles/oac/274-3.html | 22 + tests/testfiles/oac/274-4.html | 21 + tests/testfiles/oac/274-5.html | 21 + tests/testfiles/oac/274-6.html | 38 + tests/testfiles/oac/274-7.html | 38 + tests/testfiles/oac/275-1.html | 20 + tests/testfiles/oac/275-2.html | 11 + tests/testfiles/oac/276-1.html | 15 + tests/testfiles/oac/276-2.html | 14 + tests/testfiles/oac/276-3.html | 15 + tests/testfiles/oac/28-1.html | 22 + tests/testfiles/oac/28-2.html | 26 + tests/testfiles/oac/29-1.html | 1 + tests/testfiles/oac/29-2.html | 1 + tests/testfiles/oac/3-1.html | 1 + tests/testfiles/oac/3-2.html | 1 + tests/testfiles/oac/30-1.html | 1 + tests/testfiles/oac/30-2.html | 1 + tests/testfiles/oac/31-1.html | 1 + tests/testfiles/oac/31-2.html | 1 + tests/testfiles/oac/32-1.html | 1 + tests/testfiles/oac/32-2.html | 1 + tests/testfiles/oac/32-3.html | 1 + tests/testfiles/oac/33-1.html | 1 + tests/testfiles/oac/33-10.html | 1 + tests/testfiles/oac/33-2.html | 1 + tests/testfiles/oac/33-3.html | 1 + tests/testfiles/oac/33-4.html | 1 + tests/testfiles/oac/33-5.html | 1 + tests/testfiles/oac/33-6.html | 1 + tests/testfiles/oac/33-7.html | 1 + tests/testfiles/oac/33-8.html | 1 + tests/testfiles/oac/33-9.html | 1 + tests/testfiles/oac/34-1.html | 1 + tests/testfiles/oac/34-2.html | 1 + tests/testfiles/oac/35-1.html | 1 + tests/testfiles/oac/35-2.html | 1 + tests/testfiles/oac/36-1.html | 1 + tests/testfiles/oac/36-2.html | 1 + tests/testfiles/oac/37-1.html | 1 + tests/testfiles/oac/37-2.html | 1 + tests/testfiles/oac/38-1.html | 1 + tests/testfiles/oac/38-2.html | 1 + tests/testfiles/oac/39-1.html | 1 + tests/testfiles/oac/39-2.html | 1 + tests/testfiles/oac/4-1.html | 1 + tests/testfiles/oac/4-2.html | 1 + tests/testfiles/oac/40-1.html | 1 + tests/testfiles/oac/40-2.html | 1 + tests/testfiles/oac/41-1.html | 1 + tests/testfiles/oac/41-2.html | 1 + tests/testfiles/oac/42-1.html | 1 + tests/testfiles/oac/42-2.html | 1 + tests/testfiles/oac/43-1.html | 1 + tests/testfiles/oac/43-2.html | 1 + tests/testfiles/oac/44-1.html | 1 + tests/testfiles/oac/44-2.html | 1 + tests/testfiles/oac/45-1.html | 1 + tests/testfiles/oac/45-2.html | 1 + tests/testfiles/oac/46-1.html | 1 + tests/testfiles/oac/46-2.html | 1 + tests/testfiles/oac/47-1.html | 1 + tests/testfiles/oac/47-2.html | 1 + tests/testfiles/oac/48-1.html | 1 + tests/testfiles/oac/48-2.html | 1 + tests/testfiles/oac/49-1.html | 1 + tests/testfiles/oac/49-2.html | 1 + tests/testfiles/oac/5-1.html | 1 + tests/testfiles/oac/5-2.html | 1 + tests/testfiles/oac/5-3.html | 1 + tests/testfiles/oac/50-1.html | 1 + tests/testfiles/oac/50-2.html | 1 + tests/testfiles/oac/51-1.html | 1 + tests/testfiles/oac/51-2.html | 1 + tests/testfiles/oac/51-3.html | 1 + tests/testfiles/oac/52-1.html | 1 + tests/testfiles/oac/52-2.html | 1 + tests/testfiles/oac/53-1.html | 1 + tests/testfiles/oac/53-2.html | 1 + tests/testfiles/oac/53-3.html | 1 + tests/testfiles/oac/53-4.html | 1 + tests/testfiles/oac/53-5.html | 1 + tests/testfiles/oac/54-1.html | 1 + tests/testfiles/oac/54-2.html | 1 + tests/testfiles/oac/55-1.html | 1 + tests/testfiles/oac/55-2.html | 1 + tests/testfiles/oac/56-1.html | 1 + tests/testfiles/oac/56-2.html | 1 + tests/testfiles/oac/56-3.html | 1 + tests/testfiles/oac/56-4.html | 1 + tests/testfiles/oac/57-1.html | 1 + tests/testfiles/oac/57-2.html | 1 + tests/testfiles/oac/57-3.html | 1 + tests/testfiles/oac/57-4.html | 1 + tests/testfiles/oac/58-1.html | 1 + tests/testfiles/oac/58-2.html | 1 + tests/testfiles/oac/59-1.html | 1 + tests/testfiles/oac/59-2.html | 1 + tests/testfiles/oac/6-1.html | 1 + tests/testfiles/oac/6-2.html | 11 + tests/testfiles/oac/6-3.html | 1 + tests/testfiles/oac/6-4.html | 1 + tests/testfiles/oac/6-5.html | 11 + tests/testfiles/oac/6-6.html | 11 + tests/testfiles/oac/6-7.html | 11 + tests/testfiles/oac/60-1.html | 1 + tests/testfiles/oac/60-2.html | 1 + tests/testfiles/oac/61-1.html | 1 + tests/testfiles/oac/61-2.html | 1 + tests/testfiles/oac/62-1.html | 1 + tests/testfiles/oac/62-2.html | 1 + tests/testfiles/oac/62-3.html | 1 + tests/testfiles/oac/62-4.html | 1 + tests/testfiles/oac/63-1.html | 1 + tests/testfiles/oac/63-2.html | 1 + tests/testfiles/oac/64-1.html | 1 + tests/testfiles/oac/64-2.html | 1 + tests/testfiles/oac/65-1.html | 1 + tests/testfiles/oac/65-2.html | 1 + tests/testfiles/oac/65-3.html | 1 + tests/testfiles/oac/66-1.html | 1 + tests/testfiles/oac/66-10.html | 1 + tests/testfiles/oac/66-11.html | 1 + tests/testfiles/oac/66-12.html | 1 + tests/testfiles/oac/66-2.html | 1 + tests/testfiles/oac/66-3.html | 1 + tests/testfiles/oac/66-4.html | 1 + tests/testfiles/oac/66-5.html | 1 + tests/testfiles/oac/66-6.html | 1 + tests/testfiles/oac/66-7.html | 1 + tests/testfiles/oac/66-8.html | 1 + tests/testfiles/oac/66-9.html | 1 + tests/testfiles/oac/68-1.html | 1 + tests/testfiles/oac/68-2.html | 1 + tests/testfiles/oac/68-3.html | 1 + tests/testfiles/oac/68-4.html | 1 + tests/testfiles/oac/69-1.html | 1 + tests/testfiles/oac/69-2.html | 1 + tests/testfiles/oac/7-1.html | 1 + tests/testfiles/oac/7-2.html | 1 + tests/testfiles/oac/70-1.html | 1 + tests/testfiles/oac/70-2.html | 1 + tests/testfiles/oac/71-1.html | 1 + tests/testfiles/oac/71-2.html | 1 + tests/testfiles/oac/72-1.html | 1 + tests/testfiles/oac/72-2.html | 1 + tests/testfiles/oac/72-3.html | 1 + tests/testfiles/oac/73-1.html | 1 + tests/testfiles/oac/73-2.html | 1 + tests/testfiles/oac/74-1.html | 1 + tests/testfiles/oac/74-2.html | 1 + tests/testfiles/oac/75-1.html | 1 + tests/testfiles/oac/75-2.html | 1 + tests/testfiles/oac/76-1.html | 1 + tests/testfiles/oac/76-2.html | 1 + tests/testfiles/oac/77-1.html | 1 + tests/testfiles/oac/77-2.html | 1 + tests/testfiles/oac/78-1.html | 1 + tests/testfiles/oac/78-2.html | 1 + tests/testfiles/oac/79-1.html | 1 + tests/testfiles/oac/79-2.html | 1 + tests/testfiles/oac/79-3.html | 1 + tests/testfiles/oac/8-1.html | 1 + tests/testfiles/oac/8-2.html | 1 + tests/testfiles/oac/8-3.html | 1 + tests/testfiles/oac/8-4.html | 1 + tests/testfiles/oac/8-5.html | 1 + tests/testfiles/oac/80-1.html | 1 + tests/testfiles/oac/80-2.html | 1 + tests/testfiles/oac/80-3.html | 1 + tests/testfiles/oac/80-4.html | 1 + tests/testfiles/oac/81-1.html | 1 + tests/testfiles/oac/81-2.html | 1 + tests/testfiles/oac/82-1.html | 1 + tests/testfiles/oac/82-2.html | 1 + tests/testfiles/oac/82-3.html | 1 + tests/testfiles/oac/82-4.html | 1 + tests/testfiles/oac/82-5.html | 1 + tests/testfiles/oac/82-6.html | 1 + tests/testfiles/oac/82-7.html | 1 + tests/testfiles/oac/82-8.html | 1 + tests/testfiles/oac/82-9.html | 1 + tests/testfiles/oac/86-1.html | 1 + tests/testfiles/oac/86-2.html | 1 + tests/testfiles/oac/87-1.html | 1 + tests/testfiles/oac/87-2.html | 1 + tests/testfiles/oac/88-1.html | 1 + tests/testfiles/oac/88-2.html | 1 + tests/testfiles/oac/89-1.html | 1 + tests/testfiles/oac/89-2.html | 1 + tests/testfiles/oac/9-1.html | 11 + tests/testfiles/oac/9-2.html | 12 + tests/testfiles/oac/90-1.html | 1 + tests/testfiles/oac/90-2.html | 1 + tests/testfiles/oac/91-1.html | 1 + tests/testfiles/oac/91-2.html | 1 + tests/testfiles/oac/91-3.html | 1 + tests/testfiles/oac/91-4.html | 1 + tests/testfiles/oac/92-1.html | 1 + tests/testfiles/oac/92-2.html | 1 + tests/testfiles/oac/92-3.html | 1 + tests/testfiles/oac/94-1.html | 1 + tests/testfiles/oac/94-2.html | 1 + tests/testfiles/oac/95-1.html | 1 + tests/testfiles/oac/95-2.html | 1 + tests/testfiles/oac/95-3.html | 1 + tests/testfiles/oac/95-4.html | 1 + tests/testfiles/oac/96-1.html | 19 + tests/testfiles/oac/96-2.html | 19 + tests/testfiles/oac/97-1.html | 1 + tests/testfiles/oac/97-2.html | 1 + tests/testfiles/oac/98-1.html | 1 + tests/testfiles/oac/98-2.html | 1 + tests/testfiles/oac/98-3.html | 1 + tests/testfiles/oac/98-4.html | 1 + tests/testfiles/oac/99-1.html | 1 + tests/testfiles/oac/99-2.html | 1 + tests/testfiles/oac/alternative1.html | 11 + tests/testfiles/oac/alternative2.html | 13 + tests/testfiles/oac/avlab.mp3 | Bin 0 -> 98454 bytes tests/testfiles/oac/avlab.txt | 1 + tests/testfiles/oac/big-fail.png | Bin 0 -> 58807 bytes tests/testfiles/oac/chart.gif | Bin 0 -> 5680 bytes tests/testfiles/oac/contrast1.gif | Bin 0 -> 381 bytes tests/testfiles/oac/contrast2.gif | Bin 0 -> 304 bytes tests/testfiles/oac/eatatjoes.gif | Bin 0 -> 4738 bytes tests/testfiles/oac/finddogs.gif | Bin 0 -> 648 bytes tests/testfiles/oac/fish.gif | Bin 0 -> 1724 bytes tests/testfiles/oac/fish1.html | 1 + tests/testfiles/oac/fish2.html | 1 + tests/testfiles/oac/fishswim.gif | Bin 0 -> 18161 bytes tests/testfiles/oac/go.gif | Bin 0 -> 2194 bytes tests/testfiles/oac/image.gif | Bin 0 -> 591 bytes tests/testfiles/oac/library.gif | Bin 0 -> 2263 bytes tests/testfiles/oac/renew.gif | Bin 0 -> 1458 bytes tests/testfiles/oac/rex.gif | Bin 0 -> 17464 bytes tests/testfiles/oac/rex.html | 1 + tests/testfiles/oac/rex.jpg | Bin 0 -> 5451 bytes tests/testfiles/oac/spacer.gif | Bin 0 -> 40 bytes tests/testfiles/oac/star.gif | Bin 0 -> 910 bytes tests/testfiles/oac/submit.gif | Bin 0 -> 1241 bytes tests/testfiles/oac/welcome.gif | Bin 0 -> 987 bytes tests/testfiles/quail/.svn/all-wcprops | 209 + tests/testfiles/quail/.svn/entries | 1184 + .../.svn/text-base/cssComplexTest1.css.svn-base | 13 + .../.svn/text-base/cssComplexTest1.html.svn-base | 20 + .../quail/.svn/text-base/cssContrast.css.svn-base | 7 + .../quail/.svn/text-base/cssContrast.html.svn-base | 12 + .../quail/.svn/text-base/cssContrast2.css.svn-base | 15 + .../.svn/text-base/cssContrast2.html.svn-base | 16 + .../quail/.svn/text-base/cssContrast3.css.svn-base | 15 + .../.svn/text-base/cssContrast3.html.svn-base | 16 + .../quail/.svn/text-base/cssContrast4.css.svn-base | 15 + .../.svn/text-base/cssContrast4.html.svn-base | 16 + .../.svn/text-base/cssContrast5.html.svn-base | 23 + .../documentIsWrittenClearly-fail.html.svn-base | 9 + .../documentIsWrittenClearly-pass-2.html.svn-base | 9 + .../documentIsWrittenClearly-pass.html.svn-base | 9 + .../text-base/headersHaveText-fail.html.svn-base | 12 + .../text-base/headersHaveText-fail2.html.svn-base | 12 + .../text-base/headersHaveText-pass.html.svn-base | 12 + .../imgAltTextNotRedundant-fail.html.svn-base | 10 + .../imgAltTextNotRedundant-pass.html.svn-base | 10 + .../labelsAreAssignedToAnInput-fail.html.svn-base | 13 + .../labelsAreAssignedToAnInput-fail2.html.svn-base | 13 + .../labelsAreAssignedToAnInput-fail3.html.svn-base | 14 + .../labelsAreAssignedToAnInput-pass.html.svn-base | 12 + .../text-base/selectJumpMenus-fail.html.svn-base | 14 + .../text-base/selectJumpMenus-pass.html.svn-base | 15 + .../text-base/svgContainsTitle-fail.html.svn-base | 18 + .../text-base/svgContainsTitle-pass.html.svn-base | 19 + .../text-base/textIsNotSmall-fail.html.svn-base | 11 + .../text-base/textIsNotSmall-fail2.html.svn-base | 20 + .../text-base/textIsNotSmall-pass.html.svn-base | 11 + .../.svn/text-base/videoTestFail.html.svn-base | 12 + .../.svn/text-base/videoTestPass.html.svn-base | 12 + ...EmbeddedOrLinkedNeedCaptions-fail.html.svn-base | 9 + ...EmbeddedOrLinkedNeedCaptions-pass.html.svn-base | 10 + tests/testfiles/quail/cssComplexTest1.css | 13 + tests/testfiles/quail/cssComplexTest1.html | 20 + tests/testfiles/quail/cssContrast.css | 7 + tests/testfiles/quail/cssContrast.html | 12 + tests/testfiles/quail/cssContrast2.css | 15 + tests/testfiles/quail/cssContrast2.html | 16 + tests/testfiles/quail/cssContrast3.css | 15 + tests/testfiles/quail/cssContrast3.html | 16 + tests/testfiles/quail/cssContrast4.css | 15 + tests/testfiles/quail/cssContrast4.html | 16 + tests/testfiles/quail/cssContrast5.html | 23 + .../quail/documentIsWrittenClearly-fail.html | 9 + .../quail/documentIsWrittenClearly-pass-2.html | 9 + .../quail/documentIsWrittenClearly-pass.html | 9 + tests/testfiles/quail/headersHaveText-fail.html | 12 + tests/testfiles/quail/headersHaveText-fail2.html | 12 + tests/testfiles/quail/headersHaveText-pass.html | 12 + .../quail/imgAltTextNotRedundant-fail.html | 10 + .../quail/imgAltTextNotRedundant-pass.html | 10 + .../quail/labelsAreAssignedToAnInput-fail.html | 13 + .../quail/labelsAreAssignedToAnInput-fail2.html | 13 + .../quail/labelsAreAssignedToAnInput-fail3.html | 14 + .../quail/labelsAreAssignedToAnInput-pass.html | 12 + tests/testfiles/quail/selectJumpMenus-fail.html | 14 + tests/testfiles/quail/selectJumpMenus-pass.html | 15 + tests/testfiles/quail/svgContainsTitle-fail.html | 18 + tests/testfiles/quail/svgContainsTitle-pass.html | 19 + tests/testfiles/quail/textIsNotSmall-fail.html | 11 + tests/testfiles/quail/textIsNotSmall-fail2.html | 20 + tests/testfiles/quail/textIsNotSmall-pass.html | 11 + tests/testfiles/quail/videoTestFail.html | 12 + tests/testfiles/quail/videoTestPass.html | 12 + .../videosEmbeddedOrLinkedNeedCaptions-fail.html | 9 + .../videosEmbeddedOrLinkedNeedCaptions-pass.html | 10 + 1738 files changed, 79965 insertions(+) create mode 100644 CHANGELOG.txt create mode 100644 LICENSE.txt create mode 100644 README.txt create mode 100644 examples/.svn/all-wcprops create mode 100644 examples/.svn/entries create mode 100644 examples/.svn/text-base/test_form.php.svn-base create mode 100644 examples/test_form.php create mode 100644 quail/._quail.php create mode 100644 quail/.svn/all-wcprops create mode 100644 quail/.svn/dir-prop-base create mode 100644 quail/.svn/entries create mode 100644 quail/.svn/text-base/quail.php.svn-base create mode 100644 quail/common/.svn/all-wcprops create mode 100644 quail/common/.svn/entries create mode 100644 quail/common/.svn/prop-base/accessibility_tests.php.svn-base create mode 100644 quail/common/.svn/text-base/accessibility_tests.php.svn-base create mode 100644 quail/common/.svn/text-base/css.php.svn-base create mode 100644 quail/common/.svn/text-base/domExtensions.php.svn-base create mode 100644 quail/common/.svn/text-base/elements.php.svn-base create mode 100644 quail/common/.svn/text-base/test.php.svn-base create mode 100755 quail/common/accessibility_tests.php create mode 100644 quail/common/css.php create mode 100644 quail/common/domExtensions.php create mode 100644 quail/common/elements.php create mode 100644 quail/common/resources/.svn/all-wcprops create mode 100644 quail/common/resources/.svn/entries create mode 100644 quail/common/resources/.svn/text-base/emoticons.txt.svn-base create mode 100644 quail/common/resources/.svn/text-base/iso639.txt.svn-base create mode 100644 quail/common/resources/.svn/text-base/placeholder.txt.svn-base create mode 100644 quail/common/resources/emoticons.txt create mode 100644 quail/common/resources/iso639.txt create mode 100644 quail/common/resources/placeholder.txt create mode 100644 quail/common/services/.svn/all-wcprops create mode 100644 quail/common/services/.svn/entries create mode 100644 quail/common/services/media/.svn/all-wcprops create mode 100644 quail/common/services/media/.svn/entries create mode 100644 quail/common/services/media/.svn/text-base/mediaService.php.svn-base create mode 100644 quail/common/services/media/.svn/text-base/youtube.php.svn-base create mode 100644 quail/common/services/media/mediaService.php create mode 100644 quail/common/services/media/youtube.php create mode 100644 quail/common/services/readability/.svn/all-wcprops create mode 100644 quail/common/services/readability/.svn/entries create mode 100644 quail/common/services/readability/.svn/text-base/readability.php.svn-base create mode 100644 quail/common/services/readability/php-text-statistics/.svn/all-wcprops create mode 100644 quail/common/services/readability/php-text-statistics/.svn/entries create mode 100644 quail/common/services/readability/php-text-statistics/.svn/text-base/README.txt.svn-base create mode 100644 quail/common/services/readability/php-text-statistics/.svn/text-base/TextStatistics.php.svn-base create mode 100644 quail/common/services/readability/php-text-statistics/.svn/text-base/TextStatistics.php4.svn-base create mode 100644 quail/common/services/readability/php-text-statistics/README.txt create mode 100644 quail/common/services/readability/php-text-statistics/TextStatistics.php create mode 100644 quail/common/services/readability/php-text-statistics/TextStatistics.php4 create mode 100644 quail/common/services/readability/php-text-statistics/resources/.svn/all-wcprops create mode 100644 quail/common/services/readability/php-text-statistics/resources/.svn/entries create mode 100644 quail/common/services/readability/php-text-statistics/resources/.svn/text-base/DaleChallWordList.php.svn-base create mode 100644 quail/common/services/readability/php-text-statistics/resources/.svn/text-base/SpacheWordList.php.svn-base create mode 100644 quail/common/services/readability/php-text-statistics/resources/DaleChallWordList.php create mode 100644 quail/common/services/readability/php-text-statistics/resources/SpacheWordList.php create mode 100644 quail/common/services/readability/php-text-statistics/tests/.svn/all-wcprops create mode 100644 quail/common/services/readability/php-text-statistics/tests/.svn/entries create mode 100644 quail/common/services/readability/php-text-statistics/tests/.svn/text-base/TextStatisticsKiplingIf.php.svn-base create mode 100644 quail/common/services/readability/php-text-statistics/tests/.svn/text-base/TextStatisticsMelvilleMobyDick.php.svn-base create mode 100644 quail/common/services/readability/php-text-statistics/tests/.svn/text-base/TextStatisticsTest.php.svn-base create mode 100644 quail/common/services/readability/php-text-statistics/tests/TextStatisticsKiplingIf.php create mode 100644 quail/common/services/readability/php-text-statistics/tests/TextStatisticsMelvilleMobyDick.php create mode 100644 quail/common/services/readability/php-text-statistics/tests/TextStatisticsTest.php create mode 100644 quail/common/services/readability/readability.php create mode 100644 quail/common/test.php create mode 100644 quail/guidelines/.svn/all-wcprops create mode 100644 quail/guidelines/.svn/entries create mode 100644 quail/guidelines/.svn/text-base/all.php.svn-base create mode 100644 quail/guidelines/.svn/text-base/section508.php.svn-base create mode 100644 quail/guidelines/.svn/text-base/wcag1a.php.svn-base create mode 100644 quail/guidelines/.svn/text-base/wcag1aa.php.svn-base create mode 100644 quail/guidelines/.svn/text-base/wcag1aaa.php.svn-base create mode 100644 quail/guidelines/.svn/text-base/wcag2a.php.svn-base create mode 100644 quail/guidelines/.svn/text-base/wcag2aa.php.svn-base create mode 100644 quail/guidelines/.svn/text-base/wcag2aaa.php.svn-base create mode 100644 quail/guidelines/all.php create mode 100644 quail/guidelines/section508.php create mode 100644 quail/guidelines/translations/.svn/all-wcprops create mode 100644 quail/guidelines/translations/.svn/entries create mode 100644 quail/guidelines/translations/.svn/text-base/en.txt.svn-base create mode 100644 quail/guidelines/translations/en.txt create mode 100644 quail/guidelines/wcag1a.php create mode 100644 quail/guidelines/wcag1aa.php create mode 100644 quail/guidelines/wcag1aaa.php create mode 100644 quail/guidelines/wcag2a.php create mode 100644 quail/guidelines/wcag2aa.php create mode 100644 quail/guidelines/wcag2aaa.php create mode 100644 quail/quail.php create mode 100644 quail/reporters/.svn/all-wcprops create mode 100644 quail/reporters/.svn/entries create mode 100644 quail/reporters/.svn/text-base/reporter.array.php.svn-base create mode 100644 quail/reporters/.svn/text-base/reporter.codeHighlight.php.svn-base create mode 100644 quail/reporters/.svn/text-base/reporter.demo.php.svn-base create mode 100644 quail/reporters/.svn/text-base/reporter.static.php.svn-base create mode 100644 quail/reporters/.svn/text-base/reporter.xml.php.svn-base create mode 100644 quail/reporters/reporter.array.php create mode 100644 quail/reporters/reporter.codeHighlight.php create mode 100644 quail/reporters/reporter.demo.php create mode 100644 quail/reporters/reporter.static.php create mode 100644 quail/reporters/reporter.xml.php create mode 100644 tests/.svn/all-wcprops create mode 100644 tests/.svn/dir-prop-base create mode 100644 tests/.svn/entries create mode 100644 tests/.svn/text-base/cssTestInterface.php.svn-base create mode 100644 tests/.svn/text-base/cssTests.php.svn-base create mode 100644 tests/.svn/text-base/index.php.svn-base create mode 100644 tests/.svn/text-base/quailTests.php.svn-base create mode 100644 tests/cssTestInterface.php create mode 100644 tests/cssTests.php create mode 100644 tests/index.php create mode 100644 tests/quailTests.php create mode 100644 tests/testfiles/.svn/all-wcprops create mode 100644 tests/testfiles/.svn/entries create mode 100644 tests/testfiles/css/.svn/all-wcprops create mode 100644 tests/testfiles/css/.svn/entries create mode 100644 tests/testfiles/css/.svn/text-base/cssComplexTest1.css.svn-base create mode 100644 tests/testfiles/css/.svn/text-base/cssComplexTest1.html.svn-base create mode 100644 tests/testfiles/css/.svn/text-base/cssContrast.css.svn-base create mode 100644 tests/testfiles/css/.svn/text-base/cssContrast.html.svn-base create mode 100644 tests/testfiles/css/.svn/text-base/cssContrast2.css.svn-base create mode 100644 tests/testfiles/css/.svn/text-base/cssContrast2.html.svn-base create mode 100644 tests/testfiles/css/.svn/text-base/cssContrast3.css.svn-base create mode 100644 tests/testfiles/css/.svn/text-base/cssContrast3.html.svn-base create mode 100644 tests/testfiles/css/.svn/text-base/cssContrast4.css.svn-base create mode 100644 tests/testfiles/css/.svn/text-base/cssContrast4.html.svn-base create mode 100644 tests/testfiles/css/.svn/text-base/cssContrast5.html.svn-base create mode 100644 tests/testfiles/css/cssComplexTest1.css create mode 100644 tests/testfiles/css/cssComplexTest1.html create mode 100644 tests/testfiles/css/cssContrast.css create mode 100644 tests/testfiles/css/cssContrast.html create mode 100644 tests/testfiles/css/cssContrast2.css create mode 100644 tests/testfiles/css/cssContrast2.html create mode 100644 tests/testfiles/css/cssContrast3.css create mode 100644 tests/testfiles/css/cssContrast3.html create mode 100644 tests/testfiles/css/cssContrast4.css create mode 100644 tests/testfiles/css/cssContrast4.html create mode 100644 tests/testfiles/css/cssContrast5.html create mode 100644 tests/testfiles/oac/.svn/all-wcprops create mode 100644 tests/testfiles/oac/.svn/entries create mode 100644 tests/testfiles/oac/.svn/prop-base/avlab.mp3.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/big-fail.png.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/chart.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/contrast1.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/contrast2.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/eatatjoes.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/finddogs.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/fish.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/fishswim.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/go.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/image.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/library.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/renew.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/rex.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/rex.jpg.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/spacer.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/star.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/submit.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/prop-base/welcome.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/1-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/1-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/10-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/10-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/100-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/100-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/102-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/102-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/103-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/103-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/104-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/104-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/105-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/105-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/106-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/106-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/107-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/107-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/108-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/108-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/109-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/109-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/11-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/11-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/110-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/110-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/111-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/111-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/111-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/112-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/112-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/113-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/113-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/114-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/114-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/114-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/115-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/115-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/116-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/116-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/117-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/117-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/118-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/118-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/118-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/118-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/119-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/119-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/119-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/119-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/12-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/12-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/120-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/120-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/120-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/120-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/121-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/121-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/121-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/121-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/122-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/122-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/123-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/123-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/124-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/124-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/125-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/125-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/126-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/126-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/127-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/127-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/128-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/128-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/129-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/129-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/13-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/13-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/13-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/131-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/131-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/132-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/132-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/133-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/133-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/134-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/134-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/135-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/135-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/135-2.xhtml.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/136-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/136-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/137-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/137-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/138-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/138-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/138-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/139-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/139-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/139-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/14-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/14-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/14-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/140-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/140-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/140-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/141-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/141-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/141-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/142-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/142-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/142-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/143-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/143-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/144-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/144-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/145-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/145-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/145-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/145-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/145-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/145-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/146-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/146-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/147-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/147-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/147-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/147-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/148-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/148-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/15-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/15-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/150-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/150-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/151-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/151-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/151-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/152-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/152-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/152-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/153-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/153-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/154-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/154-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/159-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/159-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/16-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/16-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/16-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/16-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/160-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/160-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/161-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/161-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/162-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/162-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/163-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/163-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/163-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/164-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/164-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/165-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/165-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/166-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/166-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/167-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/167-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/168-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/168-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/168-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/168-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/169-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/169-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/17-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/17-10.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/17-11.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/17-12.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/17-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/17-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/17-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/17-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/17-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/17-7.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/17-8.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/17-9.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/173-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/173-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/173-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/174-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/174-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/174-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/174-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/174-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/175-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/175-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/176-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/176-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/177-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/177-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/178-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/178-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/178-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/18-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/18-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/18-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/18-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/180-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/180-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/181-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/181-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/182-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/182-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/183-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/183-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/184-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/184-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/185-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/185-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/186-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/186-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/187-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/187-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/188-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/188-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/188-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/188-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/188-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/189-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/189-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/19-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/19-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/19-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/190-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/190-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/191-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/191-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/192-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/192-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/193-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/193-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/194-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/194-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/195-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/195-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/195-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/195-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/196-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/196-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/197-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/197-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/197-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/197-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/197-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/198-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/198-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/199-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/199-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/2-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/2-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/20-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/20-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/20-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/20-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/20-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/20-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/200-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/200-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/201-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/201-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/202-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/202-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/203-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/203-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/204-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/204-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/204-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/204-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/204-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/204-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/205-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/205-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/205-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/205-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/205-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/205-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/206-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/206-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/206-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/206-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/206-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/206-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/207-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/207-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/207-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/207-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/207-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/207-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/208-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/208-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/208-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/208-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/208-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/208-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/208-7.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/208-8.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/208-9.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/209-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/209-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/21-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/21-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/211-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/211-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/212-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/212-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/212-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/212-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/212-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/212-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/213-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/213-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/213-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/213-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/213-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/213-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/213-7.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/214-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/214-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/214-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/214-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/214-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/214-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/216-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/216-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/216-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/216-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/216-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/216-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/217-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/217-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/217-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/217-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/217-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/217-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/218-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/218-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/218-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/218-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/218-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/218-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/219-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/219-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/219-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/219-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/219-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/219-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/22-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/22-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/220-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/220-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/220-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/220-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/220-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/220-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/221-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/221-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/221-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/221-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/221-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/221-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/222-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/222-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/222-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/223-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/223-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/223-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/224-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/224-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/224-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/225-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/225-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/225-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/225-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/225-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/226-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/226-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/226-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/227-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/227-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/227-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/228-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/228-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/228-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/229-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/229-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/229-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/23-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/23-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/23-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/230-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/230-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/231-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/231-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/232-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/232-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/233-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/233-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/234-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/234-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/235-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/235-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/236-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/236-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/236-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/237-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/237-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/238-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/238-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/238-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/239-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/239-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/239-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/24-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/24-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/240-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/240-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/241-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/241-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/242-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/242-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/243-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/243-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/244-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/244-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/245-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/245-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/246-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/246-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/246-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/246-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/246-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/247-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/247-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/248-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/248-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/248-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/249-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/249-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/25-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/25-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/250-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/250-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/251-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/251-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/252-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/252-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/252-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/253-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/253-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/254-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/254-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/254-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/255-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/255-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/255-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/256-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/256-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/256-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/257-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/257-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/257-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/258-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/258-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/259-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/259-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/26-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/26-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/260-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/260-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/261-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/261-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/261-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/262-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/262-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/263-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/263-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/264-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/264-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/264-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/265-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/265-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/266-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/266-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/267-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/267-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/268-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/268-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/269-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/269-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/27-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/27-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/270-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/270-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/271-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/271-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/272-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/272-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/273-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/273-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/273-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/273-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/274-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/274-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/274-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/274-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/274-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/274-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/274-7.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/275-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/275-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/276-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/276-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/276-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/28-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/28-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/29-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/29-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/3-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/3-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/30-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/30-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/31-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/31-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/32-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/32-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/32-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/33-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/33-10.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/33-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/33-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/33-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/33-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/33-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/33-7.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/33-8.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/33-9.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/34-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/34-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/35-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/35-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/36-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/36-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/37-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/37-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/38-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/38-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/39-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/39-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/4-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/4-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/40-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/40-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/41-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/41-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/42-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/42-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/43-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/43-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/44-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/44-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/45-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/45-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/46-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/46-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/47-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/47-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/48-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/48-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/49-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/49-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/5-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/5-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/5-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/50-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/50-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/51-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/51-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/51-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/52-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/52-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/53-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/53-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/53-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/53-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/53-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/54-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/54-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/55-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/55-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/56-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/56-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/56-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/56-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/57-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/57-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/57-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/57-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/58-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/58-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/59-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/59-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/6-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/6-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/6-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/6-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/6-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/6-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/6-7.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/60-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/60-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/61-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/61-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/62-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/62-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/62-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/62-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/63-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/63-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/64-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/64-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/65-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/65-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/65-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/66-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/66-10.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/66-11.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/66-12.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/66-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/66-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/66-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/66-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/66-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/66-7.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/66-8.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/66-9.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/68-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/68-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/68-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/68-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/69-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/69-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/7-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/7-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/70-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/70-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/71-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/71-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/72-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/72-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/72-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/73-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/73-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/74-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/74-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/75-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/75-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/76-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/76-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/77-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/77-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/78-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/78-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/79-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/79-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/79-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/8-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/8-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/8-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/8-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/8-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/80-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/80-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/80-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/80-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/81-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/81-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/82-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/82-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/82-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/82-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/82-5.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/82-6.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/82-7.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/82-8.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/82-9.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/86-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/86-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/87-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/87-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/88-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/88-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/89-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/89-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/9-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/9-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/90-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/90-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/91-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/91-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/91-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/91-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/92-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/92-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/92-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/94-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/94-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/95-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/95-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/95-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/95-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/96-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/96-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/97-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/97-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/98-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/98-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/98-3.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/98-4.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/99-1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/99-2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/alternative1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/alternative2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/avlab.mp3.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/avlab.txt.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/big-fail.png.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/chart.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/contrast1.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/contrast2.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/eatatjoes.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/finddogs.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/fish.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/fish1.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/fish2.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/fishswim.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/go.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/image.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/library.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/renew.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/rex.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/rex.html.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/rex.jpg.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/spacer.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/star.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/submit.gif.svn-base create mode 100644 tests/testfiles/oac/.svn/text-base/welcome.gif.svn-base create mode 100644 tests/testfiles/oac/1-1.html create mode 100644 tests/testfiles/oac/1-2.html create mode 100644 tests/testfiles/oac/10-1.html create mode 100644 tests/testfiles/oac/10-2.html create mode 100644 tests/testfiles/oac/100-1.html create mode 100644 tests/testfiles/oac/100-2.html create mode 100644 tests/testfiles/oac/102-1.html create mode 100644 tests/testfiles/oac/102-2.html create mode 100644 tests/testfiles/oac/103-1.html create mode 100644 tests/testfiles/oac/103-2.html create mode 100644 tests/testfiles/oac/104-1.html create mode 100644 tests/testfiles/oac/104-2.html create mode 100644 tests/testfiles/oac/105-1.html create mode 100644 tests/testfiles/oac/105-2.html create mode 100644 tests/testfiles/oac/106-1.html create mode 100644 tests/testfiles/oac/106-2.html create mode 100644 tests/testfiles/oac/107-1.html create mode 100644 tests/testfiles/oac/107-2.html create mode 100644 tests/testfiles/oac/108-1.html create mode 100644 tests/testfiles/oac/108-2.html create mode 100644 tests/testfiles/oac/109-1.html create mode 100644 tests/testfiles/oac/109-2.html create mode 100644 tests/testfiles/oac/11-1.html create mode 100644 tests/testfiles/oac/11-2.html create mode 100644 tests/testfiles/oac/110-1.html create mode 100644 tests/testfiles/oac/110-2.html create mode 100644 tests/testfiles/oac/111-1.html create mode 100644 tests/testfiles/oac/111-2.html create mode 100644 tests/testfiles/oac/111-3.html create mode 100644 tests/testfiles/oac/112-1.html create mode 100644 tests/testfiles/oac/112-2.html create mode 100644 tests/testfiles/oac/113-1.html create mode 100644 tests/testfiles/oac/113-2.html create mode 100644 tests/testfiles/oac/114-1.html create mode 100644 tests/testfiles/oac/114-2.html create mode 100644 tests/testfiles/oac/114-3.html create mode 100644 tests/testfiles/oac/115-1.html create mode 100644 tests/testfiles/oac/115-2.html create mode 100644 tests/testfiles/oac/116-1.html create mode 100644 tests/testfiles/oac/116-2.html create mode 100644 tests/testfiles/oac/117-1.html create mode 100644 tests/testfiles/oac/117-2.html create mode 100644 tests/testfiles/oac/118-1.html create mode 100644 tests/testfiles/oac/118-2.html create mode 100644 tests/testfiles/oac/118-3.html create mode 100644 tests/testfiles/oac/118-4.html create mode 100644 tests/testfiles/oac/119-1.html create mode 100644 tests/testfiles/oac/119-2.html create mode 100644 tests/testfiles/oac/119-3.html create mode 100644 tests/testfiles/oac/119-4.html create mode 100644 tests/testfiles/oac/12-1.html create mode 100644 tests/testfiles/oac/12-2.html create mode 100644 tests/testfiles/oac/120-1.html create mode 100644 tests/testfiles/oac/120-2.html create mode 100644 tests/testfiles/oac/120-3.html create mode 100644 tests/testfiles/oac/120-4.html create mode 100644 tests/testfiles/oac/121-1.html create mode 100644 tests/testfiles/oac/121-2.html create mode 100644 tests/testfiles/oac/121-3.html create mode 100644 tests/testfiles/oac/121-4.html create mode 100644 tests/testfiles/oac/122-1.html create mode 100644 tests/testfiles/oac/122-2.html create mode 100644 tests/testfiles/oac/123-1.html create mode 100644 tests/testfiles/oac/123-2.html create mode 100644 tests/testfiles/oac/124-1.html create mode 100644 tests/testfiles/oac/124-2.html create mode 100644 tests/testfiles/oac/125-1.html create mode 100644 tests/testfiles/oac/125-2.html create mode 100644 tests/testfiles/oac/126-1.html create mode 100644 tests/testfiles/oac/126-2.html create mode 100644 tests/testfiles/oac/127-1.html create mode 100644 tests/testfiles/oac/127-2.html create mode 100644 tests/testfiles/oac/128-1.html create mode 100644 tests/testfiles/oac/128-2.html create mode 100644 tests/testfiles/oac/129-1.html create mode 100644 tests/testfiles/oac/129-2.html create mode 100644 tests/testfiles/oac/13-1.html create mode 100644 tests/testfiles/oac/13-2.html create mode 100644 tests/testfiles/oac/13-3.html create mode 100644 tests/testfiles/oac/131-1.html create mode 100644 tests/testfiles/oac/131-2.html create mode 100644 tests/testfiles/oac/132-1.html create mode 100644 tests/testfiles/oac/132-2.html create mode 100644 tests/testfiles/oac/133-1.html create mode 100644 tests/testfiles/oac/133-2.html create mode 100644 tests/testfiles/oac/134-1.html create mode 100644 tests/testfiles/oac/134-2.html create mode 100644 tests/testfiles/oac/135-1.html create mode 100644 tests/testfiles/oac/135-2.html create mode 100644 tests/testfiles/oac/135-2.xhtml create mode 100644 tests/testfiles/oac/136-1.html create mode 100644 tests/testfiles/oac/136-2.html create mode 100644 tests/testfiles/oac/137-1.html create mode 100644 tests/testfiles/oac/137-2.html create mode 100644 tests/testfiles/oac/138-1.html create mode 100644 tests/testfiles/oac/138-2.html create mode 100644 tests/testfiles/oac/138-3.html create mode 100644 tests/testfiles/oac/139-1.html create mode 100644 tests/testfiles/oac/139-2.html create mode 100644 tests/testfiles/oac/139-3.html create mode 100644 tests/testfiles/oac/14-1.html create mode 100644 tests/testfiles/oac/14-2.html create mode 100644 tests/testfiles/oac/14-3.html create mode 100644 tests/testfiles/oac/140-1.html create mode 100644 tests/testfiles/oac/140-2.html create mode 100644 tests/testfiles/oac/140-3.html create mode 100644 tests/testfiles/oac/141-1.html create mode 100644 tests/testfiles/oac/141-2.html create mode 100644 tests/testfiles/oac/141-3.html create mode 100644 tests/testfiles/oac/142-1.html create mode 100644 tests/testfiles/oac/142-2.html create mode 100644 tests/testfiles/oac/142-3.html create mode 100644 tests/testfiles/oac/143-1.html create mode 100644 tests/testfiles/oac/143-2.html create mode 100644 tests/testfiles/oac/144-1.html create mode 100644 tests/testfiles/oac/144-2.html create mode 100644 tests/testfiles/oac/145-1.html create mode 100644 tests/testfiles/oac/145-2.html create mode 100644 tests/testfiles/oac/145-3.html create mode 100644 tests/testfiles/oac/145-4.html create mode 100644 tests/testfiles/oac/145-5.html create mode 100644 tests/testfiles/oac/145-6.html create mode 100644 tests/testfiles/oac/146-1.html create mode 100644 tests/testfiles/oac/146-2.html create mode 100644 tests/testfiles/oac/147-1.html create mode 100644 tests/testfiles/oac/147-2.html create mode 100644 tests/testfiles/oac/147-3.html create mode 100644 tests/testfiles/oac/147-4.html create mode 100644 tests/testfiles/oac/148-1.html create mode 100644 tests/testfiles/oac/148-2.html create mode 100644 tests/testfiles/oac/15-1.html create mode 100644 tests/testfiles/oac/15-2.html create mode 100644 tests/testfiles/oac/150-1.html create mode 100644 tests/testfiles/oac/150-2.html create mode 100644 tests/testfiles/oac/151-1.html create mode 100644 tests/testfiles/oac/151-2.html create mode 100644 tests/testfiles/oac/151-3.html create mode 100644 tests/testfiles/oac/152-1.html create mode 100644 tests/testfiles/oac/152-2.html create mode 100644 tests/testfiles/oac/152-3.html create mode 100644 tests/testfiles/oac/153-1.html create mode 100644 tests/testfiles/oac/153-2.html create mode 100644 tests/testfiles/oac/154-1.html create mode 100644 tests/testfiles/oac/154-2.html create mode 100644 tests/testfiles/oac/159-1.html create mode 100644 tests/testfiles/oac/159-2.html create mode 100644 tests/testfiles/oac/16-1.html create mode 100644 tests/testfiles/oac/16-2.html create mode 100644 tests/testfiles/oac/16-3.html create mode 100644 tests/testfiles/oac/16-4.html create mode 100644 tests/testfiles/oac/160-1.html create mode 100644 tests/testfiles/oac/160-2.html create mode 100644 tests/testfiles/oac/161-1.html create mode 100644 tests/testfiles/oac/161-2.html create mode 100644 tests/testfiles/oac/162-1.html create mode 100644 tests/testfiles/oac/162-2.html create mode 100644 tests/testfiles/oac/163-1.html create mode 100644 tests/testfiles/oac/163-2.html create mode 100644 tests/testfiles/oac/163-3.html create mode 100644 tests/testfiles/oac/164-1.html create mode 100644 tests/testfiles/oac/164-2.html create mode 100644 tests/testfiles/oac/165-1.html create mode 100644 tests/testfiles/oac/165-2.html create mode 100644 tests/testfiles/oac/166-1.html create mode 100644 tests/testfiles/oac/166-2.html create mode 100644 tests/testfiles/oac/167-1.html create mode 100644 tests/testfiles/oac/167-2.html create mode 100644 tests/testfiles/oac/168-1.html create mode 100644 tests/testfiles/oac/168-2.html create mode 100644 tests/testfiles/oac/168-3.html create mode 100644 tests/testfiles/oac/168-4.html create mode 100644 tests/testfiles/oac/169-1.html create mode 100644 tests/testfiles/oac/169-2.html create mode 100644 tests/testfiles/oac/17-1.html create mode 100644 tests/testfiles/oac/17-10.html create mode 100644 tests/testfiles/oac/17-11.html create mode 100644 tests/testfiles/oac/17-12.html create mode 100644 tests/testfiles/oac/17-2.html create mode 100644 tests/testfiles/oac/17-3.html create mode 100644 tests/testfiles/oac/17-4.html create mode 100644 tests/testfiles/oac/17-5.html create mode 100644 tests/testfiles/oac/17-6.html create mode 100644 tests/testfiles/oac/17-7.html create mode 100644 tests/testfiles/oac/17-8.html create mode 100644 tests/testfiles/oac/17-9.html create mode 100644 tests/testfiles/oac/173-1.html create mode 100644 tests/testfiles/oac/173-2.html create mode 100644 tests/testfiles/oac/173-3.html create mode 100644 tests/testfiles/oac/174-1.html create mode 100644 tests/testfiles/oac/174-2.html create mode 100644 tests/testfiles/oac/174-3.html create mode 100644 tests/testfiles/oac/174-4.html create mode 100644 tests/testfiles/oac/174-5.html create mode 100644 tests/testfiles/oac/175-1.html create mode 100644 tests/testfiles/oac/175-2.html create mode 100644 tests/testfiles/oac/176-1.html create mode 100644 tests/testfiles/oac/176-2.html create mode 100644 tests/testfiles/oac/177-1.html create mode 100644 tests/testfiles/oac/177-2.html create mode 100644 tests/testfiles/oac/178-1.html create mode 100644 tests/testfiles/oac/178-2.html create mode 100644 tests/testfiles/oac/178-3.html create mode 100644 tests/testfiles/oac/18-1.html create mode 100644 tests/testfiles/oac/18-2.html create mode 100644 tests/testfiles/oac/18-3.html create mode 100644 tests/testfiles/oac/18-4.html create mode 100644 tests/testfiles/oac/180-1.html create mode 100644 tests/testfiles/oac/180-2.html create mode 100644 tests/testfiles/oac/181-1.html create mode 100644 tests/testfiles/oac/181-2.html create mode 100644 tests/testfiles/oac/182-1.html create mode 100644 tests/testfiles/oac/182-2.html create mode 100644 tests/testfiles/oac/183-1.html create mode 100644 tests/testfiles/oac/183-2.html create mode 100644 tests/testfiles/oac/184-1.html create mode 100644 tests/testfiles/oac/184-2.html create mode 100644 tests/testfiles/oac/185-1.html create mode 100644 tests/testfiles/oac/185-2.html create mode 100644 tests/testfiles/oac/186-1.html create mode 100644 tests/testfiles/oac/186-2.html create mode 100644 tests/testfiles/oac/187-1.html create mode 100644 tests/testfiles/oac/187-2.html create mode 100644 tests/testfiles/oac/188-1.html create mode 100644 tests/testfiles/oac/188-2.html create mode 100644 tests/testfiles/oac/188-3.html create mode 100644 tests/testfiles/oac/188-4.html create mode 100644 tests/testfiles/oac/188-5.html create mode 100644 tests/testfiles/oac/189-1.html create mode 100644 tests/testfiles/oac/189-2.html create mode 100644 tests/testfiles/oac/19-1.html create mode 100644 tests/testfiles/oac/19-2.html create mode 100644 tests/testfiles/oac/19-3.html create mode 100644 tests/testfiles/oac/190-1.html create mode 100644 tests/testfiles/oac/190-2.html create mode 100644 tests/testfiles/oac/191-1.html create mode 100644 tests/testfiles/oac/191-2.html create mode 100644 tests/testfiles/oac/192-1.html create mode 100644 tests/testfiles/oac/192-2.html create mode 100644 tests/testfiles/oac/193-1.html create mode 100644 tests/testfiles/oac/193-2.html create mode 100644 tests/testfiles/oac/194-1.html create mode 100644 tests/testfiles/oac/194-2.html create mode 100644 tests/testfiles/oac/195-1.html create mode 100644 tests/testfiles/oac/195-2.html create mode 100644 tests/testfiles/oac/195-3.html create mode 100644 tests/testfiles/oac/195-4.html create mode 100644 tests/testfiles/oac/196-1.html create mode 100644 tests/testfiles/oac/196-2.html create mode 100644 tests/testfiles/oac/197-1.html create mode 100644 tests/testfiles/oac/197-2.html create mode 100644 tests/testfiles/oac/197-3.html create mode 100644 tests/testfiles/oac/197-4.html create mode 100644 tests/testfiles/oac/197-5.html create mode 100644 tests/testfiles/oac/198-1.html create mode 100644 tests/testfiles/oac/198-2.html create mode 100644 tests/testfiles/oac/199-1.html create mode 100644 tests/testfiles/oac/199-2.html create mode 100644 tests/testfiles/oac/2-1.html create mode 100644 tests/testfiles/oac/2-2.html create mode 100644 tests/testfiles/oac/20-1.html create mode 100644 tests/testfiles/oac/20-2.html create mode 100644 tests/testfiles/oac/20-3.html create mode 100644 tests/testfiles/oac/20-4.html create mode 100644 tests/testfiles/oac/20-5.html create mode 100644 tests/testfiles/oac/20-6.html create mode 100644 tests/testfiles/oac/200-1.html create mode 100644 tests/testfiles/oac/200-2.html create mode 100644 tests/testfiles/oac/201-1.html create mode 100644 tests/testfiles/oac/201-2.html create mode 100644 tests/testfiles/oac/202-1.html create mode 100644 tests/testfiles/oac/202-2.html create mode 100644 tests/testfiles/oac/203-1.html create mode 100644 tests/testfiles/oac/203-2.html create mode 100644 tests/testfiles/oac/204-1.html create mode 100644 tests/testfiles/oac/204-2.html create mode 100644 tests/testfiles/oac/204-3.html create mode 100644 tests/testfiles/oac/204-4.html create mode 100644 tests/testfiles/oac/204-5.html create mode 100644 tests/testfiles/oac/204-6.html create mode 100644 tests/testfiles/oac/205-1.html create mode 100644 tests/testfiles/oac/205-2.html create mode 100644 tests/testfiles/oac/205-3.html create mode 100644 tests/testfiles/oac/205-4.html create mode 100644 tests/testfiles/oac/205-5.html create mode 100644 tests/testfiles/oac/205-6.html create mode 100644 tests/testfiles/oac/206-1.html create mode 100644 tests/testfiles/oac/206-2.html create mode 100644 tests/testfiles/oac/206-3.html create mode 100644 tests/testfiles/oac/206-4.html create mode 100644 tests/testfiles/oac/206-5.html create mode 100644 tests/testfiles/oac/206-6.html create mode 100644 tests/testfiles/oac/207-1.html create mode 100644 tests/testfiles/oac/207-2.html create mode 100644 tests/testfiles/oac/207-3.html create mode 100644 tests/testfiles/oac/207-4.html create mode 100644 tests/testfiles/oac/207-5.html create mode 100644 tests/testfiles/oac/207-6.html create mode 100644 tests/testfiles/oac/208-1.html create mode 100644 tests/testfiles/oac/208-2.html create mode 100644 tests/testfiles/oac/208-3.html create mode 100644 tests/testfiles/oac/208-4.html create mode 100644 tests/testfiles/oac/208-5.html create mode 100644 tests/testfiles/oac/208-6.html create mode 100644 tests/testfiles/oac/208-7.html create mode 100644 tests/testfiles/oac/208-8.html create mode 100644 tests/testfiles/oac/208-9.html create mode 100644 tests/testfiles/oac/209-1.html create mode 100644 tests/testfiles/oac/209-2.html create mode 100644 tests/testfiles/oac/21-1.html create mode 100644 tests/testfiles/oac/21-2.html create mode 100644 tests/testfiles/oac/211-1.html create mode 100644 tests/testfiles/oac/211-2.html create mode 100644 tests/testfiles/oac/212-1.html create mode 100644 tests/testfiles/oac/212-2.html create mode 100644 tests/testfiles/oac/212-3.html create mode 100644 tests/testfiles/oac/212-4.html create mode 100644 tests/testfiles/oac/212-5.html create mode 100644 tests/testfiles/oac/212-6.html create mode 100644 tests/testfiles/oac/213-1.html create mode 100644 tests/testfiles/oac/213-2.html create mode 100644 tests/testfiles/oac/213-3.html create mode 100644 tests/testfiles/oac/213-4.html create mode 100644 tests/testfiles/oac/213-5.html create mode 100644 tests/testfiles/oac/213-6.html create mode 100644 tests/testfiles/oac/213-7.html create mode 100644 tests/testfiles/oac/214-1.html create mode 100644 tests/testfiles/oac/214-2.html create mode 100644 tests/testfiles/oac/214-3.html create mode 100644 tests/testfiles/oac/214-4.html create mode 100644 tests/testfiles/oac/214-5.html create mode 100644 tests/testfiles/oac/214-6.html create mode 100644 tests/testfiles/oac/216-1.html create mode 100644 tests/testfiles/oac/216-2.html create mode 100644 tests/testfiles/oac/216-3.html create mode 100644 tests/testfiles/oac/216-4.html create mode 100644 tests/testfiles/oac/216-5.html create mode 100644 tests/testfiles/oac/216-6.html create mode 100644 tests/testfiles/oac/217-1.html create mode 100644 tests/testfiles/oac/217-2.html create mode 100644 tests/testfiles/oac/217-3.html create mode 100644 tests/testfiles/oac/217-4.html create mode 100644 tests/testfiles/oac/217-5.html create mode 100644 tests/testfiles/oac/217-6.html create mode 100644 tests/testfiles/oac/218-1.html create mode 100644 tests/testfiles/oac/218-2.html create mode 100644 tests/testfiles/oac/218-3.html create mode 100644 tests/testfiles/oac/218-4.html create mode 100644 tests/testfiles/oac/218-5.html create mode 100644 tests/testfiles/oac/218-6.html create mode 100644 tests/testfiles/oac/219-1.html create mode 100644 tests/testfiles/oac/219-2.html create mode 100644 tests/testfiles/oac/219-3.html create mode 100644 tests/testfiles/oac/219-4.html create mode 100644 tests/testfiles/oac/219-5.html create mode 100644 tests/testfiles/oac/219-6.html create mode 100644 tests/testfiles/oac/22-1.html create mode 100644 tests/testfiles/oac/22-2.html create mode 100644 tests/testfiles/oac/220-1.html create mode 100644 tests/testfiles/oac/220-2.html create mode 100644 tests/testfiles/oac/220-3.html create mode 100644 tests/testfiles/oac/220-4.html create mode 100644 tests/testfiles/oac/220-5.html create mode 100644 tests/testfiles/oac/220-6.html create mode 100644 tests/testfiles/oac/221-1.html create mode 100644 tests/testfiles/oac/221-2.html create mode 100644 tests/testfiles/oac/221-3.html create mode 100644 tests/testfiles/oac/221-4.html create mode 100644 tests/testfiles/oac/221-5.html create mode 100644 tests/testfiles/oac/221-6.html create mode 100644 tests/testfiles/oac/222-1.html create mode 100644 tests/testfiles/oac/222-2.html create mode 100644 tests/testfiles/oac/222-3.html create mode 100644 tests/testfiles/oac/223-1.html create mode 100644 tests/testfiles/oac/223-2.html create mode 100644 tests/testfiles/oac/223-3.html create mode 100644 tests/testfiles/oac/224-1.html create mode 100644 tests/testfiles/oac/224-2.html create mode 100644 tests/testfiles/oac/224-3.html create mode 100644 tests/testfiles/oac/225-1.html create mode 100644 tests/testfiles/oac/225-2.html create mode 100644 tests/testfiles/oac/225-3.html create mode 100644 tests/testfiles/oac/225-4.html create mode 100644 tests/testfiles/oac/225-5.html create mode 100644 tests/testfiles/oac/226-1.html create mode 100644 tests/testfiles/oac/226-2.html create mode 100644 tests/testfiles/oac/226-3.html create mode 100644 tests/testfiles/oac/227-1.html create mode 100644 tests/testfiles/oac/227-2.html create mode 100644 tests/testfiles/oac/227-3.html create mode 100644 tests/testfiles/oac/228-1.html create mode 100644 tests/testfiles/oac/228-2.html create mode 100644 tests/testfiles/oac/228-3.html create mode 100644 tests/testfiles/oac/229-1.html create mode 100644 tests/testfiles/oac/229-2.html create mode 100644 tests/testfiles/oac/229-3.html create mode 100644 tests/testfiles/oac/23-1.html create mode 100644 tests/testfiles/oac/23-2.html create mode 100644 tests/testfiles/oac/23-3.html create mode 100644 tests/testfiles/oac/230-1.html create mode 100644 tests/testfiles/oac/230-2.html create mode 100644 tests/testfiles/oac/231-1.html create mode 100644 tests/testfiles/oac/231-2.html create mode 100644 tests/testfiles/oac/232-1.html create mode 100644 tests/testfiles/oac/232-2.html create mode 100644 tests/testfiles/oac/233-1.html create mode 100644 tests/testfiles/oac/233-2.html create mode 100644 tests/testfiles/oac/234-1.html create mode 100644 tests/testfiles/oac/234-2.html create mode 100644 tests/testfiles/oac/235-1.html create mode 100644 tests/testfiles/oac/235-2.html create mode 100644 tests/testfiles/oac/236-1.html create mode 100644 tests/testfiles/oac/236-2.html create mode 100644 tests/testfiles/oac/236-3.html create mode 100644 tests/testfiles/oac/237-1.html create mode 100644 tests/testfiles/oac/237-2.html create mode 100644 tests/testfiles/oac/238-1.html create mode 100644 tests/testfiles/oac/238-2.html create mode 100644 tests/testfiles/oac/238-3.html create mode 100644 tests/testfiles/oac/239-1.html create mode 100644 tests/testfiles/oac/239-2.html create mode 100644 tests/testfiles/oac/239-3.html create mode 100644 tests/testfiles/oac/24-1.html create mode 100644 tests/testfiles/oac/24-2.html create mode 100644 tests/testfiles/oac/240-1.html create mode 100644 tests/testfiles/oac/240-2.html create mode 100644 tests/testfiles/oac/241-1.html create mode 100644 tests/testfiles/oac/241-2.html create mode 100644 tests/testfiles/oac/242-1.html create mode 100644 tests/testfiles/oac/242-2.html create mode 100644 tests/testfiles/oac/243-1.html create mode 100644 tests/testfiles/oac/243-2.html create mode 100644 tests/testfiles/oac/244-1.html create mode 100644 tests/testfiles/oac/244-2.html create mode 100644 tests/testfiles/oac/245-1.html create mode 100644 tests/testfiles/oac/245-2.html create mode 100644 tests/testfiles/oac/246-1.html create mode 100644 tests/testfiles/oac/246-2.html create mode 100644 tests/testfiles/oac/246-3.html create mode 100644 tests/testfiles/oac/246-4.html create mode 100644 tests/testfiles/oac/246-5.html create mode 100644 tests/testfiles/oac/247-1.html create mode 100644 tests/testfiles/oac/247-2.html create mode 100644 tests/testfiles/oac/248-1.html create mode 100644 tests/testfiles/oac/248-2.html create mode 100644 tests/testfiles/oac/248-3.html create mode 100644 tests/testfiles/oac/249-1.html create mode 100644 tests/testfiles/oac/249-2.html create mode 100644 tests/testfiles/oac/25-1.html create mode 100644 tests/testfiles/oac/25-2.html create mode 100644 tests/testfiles/oac/250-1.html create mode 100644 tests/testfiles/oac/250-2.html create mode 100644 tests/testfiles/oac/251-1.html create mode 100644 tests/testfiles/oac/251-2.html create mode 100644 tests/testfiles/oac/252-1.html create mode 100644 tests/testfiles/oac/252-2.html create mode 100644 tests/testfiles/oac/252-3.html create mode 100644 tests/testfiles/oac/253-1.html create mode 100644 tests/testfiles/oac/253-2.html create mode 100644 tests/testfiles/oac/254-1.html create mode 100644 tests/testfiles/oac/254-2.html create mode 100644 tests/testfiles/oac/254-3.html create mode 100644 tests/testfiles/oac/255-1.html create mode 100644 tests/testfiles/oac/255-2.html create mode 100644 tests/testfiles/oac/255-3.html create mode 100644 tests/testfiles/oac/256-1.html create mode 100644 tests/testfiles/oac/256-2.html create mode 100644 tests/testfiles/oac/256-3.html create mode 100644 tests/testfiles/oac/257-1.html create mode 100644 tests/testfiles/oac/257-2.html create mode 100644 tests/testfiles/oac/257-3.html create mode 100644 tests/testfiles/oac/258-1.html create mode 100644 tests/testfiles/oac/258-2.html create mode 100644 tests/testfiles/oac/259-1.html create mode 100644 tests/testfiles/oac/259-2.html create mode 100644 tests/testfiles/oac/26-1.html create mode 100644 tests/testfiles/oac/26-2.html create mode 100644 tests/testfiles/oac/260-1.html create mode 100644 tests/testfiles/oac/260-2.html create mode 100644 tests/testfiles/oac/261-1.html create mode 100644 tests/testfiles/oac/261-2.html create mode 100644 tests/testfiles/oac/261-3.html create mode 100644 tests/testfiles/oac/262-1.html create mode 100644 tests/testfiles/oac/262-2.html create mode 100644 tests/testfiles/oac/263-1.html create mode 100644 tests/testfiles/oac/263-2.html create mode 100644 tests/testfiles/oac/264-1.html create mode 100644 tests/testfiles/oac/264-2.html create mode 100644 tests/testfiles/oac/264-3.html create mode 100644 tests/testfiles/oac/265-1.html create mode 100644 tests/testfiles/oac/265-2.html create mode 100644 tests/testfiles/oac/266-1.html create mode 100644 tests/testfiles/oac/266-2.html create mode 100644 tests/testfiles/oac/267-1.html create mode 100644 tests/testfiles/oac/267-2.html create mode 100644 tests/testfiles/oac/268-1.html create mode 100644 tests/testfiles/oac/268-2.html create mode 100644 tests/testfiles/oac/269-1.html create mode 100644 tests/testfiles/oac/269-2.html create mode 100644 tests/testfiles/oac/27-1.html create mode 100644 tests/testfiles/oac/27-2.html create mode 100644 tests/testfiles/oac/270-1.html create mode 100644 tests/testfiles/oac/270-2.html create mode 100644 tests/testfiles/oac/271-1.html create mode 100644 tests/testfiles/oac/271-2.html create mode 100644 tests/testfiles/oac/272-1.html create mode 100644 tests/testfiles/oac/272-2.html create mode 100644 tests/testfiles/oac/273-1.html create mode 100644 tests/testfiles/oac/273-2.html create mode 100644 tests/testfiles/oac/273-3.html create mode 100644 tests/testfiles/oac/273-4.html create mode 100644 tests/testfiles/oac/274-1.html create mode 100644 tests/testfiles/oac/274-2.html create mode 100644 tests/testfiles/oac/274-3.html create mode 100644 tests/testfiles/oac/274-4.html create mode 100644 tests/testfiles/oac/274-5.html create mode 100644 tests/testfiles/oac/274-6.html create mode 100644 tests/testfiles/oac/274-7.html create mode 100644 tests/testfiles/oac/275-1.html create mode 100644 tests/testfiles/oac/275-2.html create mode 100644 tests/testfiles/oac/276-1.html create mode 100644 tests/testfiles/oac/276-2.html create mode 100644 tests/testfiles/oac/276-3.html create mode 100644 tests/testfiles/oac/28-1.html create mode 100644 tests/testfiles/oac/28-2.html create mode 100644 tests/testfiles/oac/29-1.html create mode 100644 tests/testfiles/oac/29-2.html create mode 100644 tests/testfiles/oac/3-1.html create mode 100644 tests/testfiles/oac/3-2.html create mode 100644 tests/testfiles/oac/30-1.html create mode 100644 tests/testfiles/oac/30-2.html create mode 100644 tests/testfiles/oac/31-1.html create mode 100644 tests/testfiles/oac/31-2.html create mode 100644 tests/testfiles/oac/32-1.html create mode 100644 tests/testfiles/oac/32-2.html create mode 100644 tests/testfiles/oac/32-3.html create mode 100644 tests/testfiles/oac/33-1.html create mode 100644 tests/testfiles/oac/33-10.html create mode 100644 tests/testfiles/oac/33-2.html create mode 100644 tests/testfiles/oac/33-3.html create mode 100644 tests/testfiles/oac/33-4.html create mode 100644 tests/testfiles/oac/33-5.html create mode 100644 tests/testfiles/oac/33-6.html create mode 100644 tests/testfiles/oac/33-7.html create mode 100644 tests/testfiles/oac/33-8.html create mode 100644 tests/testfiles/oac/33-9.html create mode 100644 tests/testfiles/oac/34-1.html create mode 100644 tests/testfiles/oac/34-2.html create mode 100644 tests/testfiles/oac/35-1.html create mode 100644 tests/testfiles/oac/35-2.html create mode 100644 tests/testfiles/oac/36-1.html create mode 100644 tests/testfiles/oac/36-2.html create mode 100644 tests/testfiles/oac/37-1.html create mode 100644 tests/testfiles/oac/37-2.html create mode 100644 tests/testfiles/oac/38-1.html create mode 100644 tests/testfiles/oac/38-2.html create mode 100644 tests/testfiles/oac/39-1.html create mode 100644 tests/testfiles/oac/39-2.html create mode 100644 tests/testfiles/oac/4-1.html create mode 100644 tests/testfiles/oac/4-2.html create mode 100644 tests/testfiles/oac/40-1.html create mode 100644 tests/testfiles/oac/40-2.html create mode 100644 tests/testfiles/oac/41-1.html create mode 100644 tests/testfiles/oac/41-2.html create mode 100644 tests/testfiles/oac/42-1.html create mode 100644 tests/testfiles/oac/42-2.html create mode 100644 tests/testfiles/oac/43-1.html create mode 100644 tests/testfiles/oac/43-2.html create mode 100644 tests/testfiles/oac/44-1.html create mode 100644 tests/testfiles/oac/44-2.html create mode 100644 tests/testfiles/oac/45-1.html create mode 100644 tests/testfiles/oac/45-2.html create mode 100644 tests/testfiles/oac/46-1.html create mode 100644 tests/testfiles/oac/46-2.html create mode 100644 tests/testfiles/oac/47-1.html create mode 100644 tests/testfiles/oac/47-2.html create mode 100644 tests/testfiles/oac/48-1.html create mode 100644 tests/testfiles/oac/48-2.html create mode 100644 tests/testfiles/oac/49-1.html create mode 100644 tests/testfiles/oac/49-2.html create mode 100644 tests/testfiles/oac/5-1.html create mode 100644 tests/testfiles/oac/5-2.html create mode 100644 tests/testfiles/oac/5-3.html create mode 100644 tests/testfiles/oac/50-1.html create mode 100644 tests/testfiles/oac/50-2.html create mode 100644 tests/testfiles/oac/51-1.html create mode 100644 tests/testfiles/oac/51-2.html create mode 100644 tests/testfiles/oac/51-3.html create mode 100644 tests/testfiles/oac/52-1.html create mode 100644 tests/testfiles/oac/52-2.html create mode 100644 tests/testfiles/oac/53-1.html create mode 100644 tests/testfiles/oac/53-2.html create mode 100644 tests/testfiles/oac/53-3.html create mode 100644 tests/testfiles/oac/53-4.html create mode 100644 tests/testfiles/oac/53-5.html create mode 100644 tests/testfiles/oac/54-1.html create mode 100644 tests/testfiles/oac/54-2.html create mode 100644 tests/testfiles/oac/55-1.html create mode 100644 tests/testfiles/oac/55-2.html create mode 100644 tests/testfiles/oac/56-1.html create mode 100644 tests/testfiles/oac/56-2.html create mode 100644 tests/testfiles/oac/56-3.html create mode 100644 tests/testfiles/oac/56-4.html create mode 100644 tests/testfiles/oac/57-1.html create mode 100644 tests/testfiles/oac/57-2.html create mode 100644 tests/testfiles/oac/57-3.html create mode 100644 tests/testfiles/oac/57-4.html create mode 100644 tests/testfiles/oac/58-1.html create mode 100644 tests/testfiles/oac/58-2.html create mode 100644 tests/testfiles/oac/59-1.html create mode 100644 tests/testfiles/oac/59-2.html create mode 100644 tests/testfiles/oac/6-1.html create mode 100644 tests/testfiles/oac/6-2.html create mode 100644 tests/testfiles/oac/6-3.html create mode 100644 tests/testfiles/oac/6-4.html create mode 100644 tests/testfiles/oac/6-5.html create mode 100644 tests/testfiles/oac/6-6.html create mode 100644 tests/testfiles/oac/6-7.html create mode 100644 tests/testfiles/oac/60-1.html create mode 100644 tests/testfiles/oac/60-2.html create mode 100644 tests/testfiles/oac/61-1.html create mode 100644 tests/testfiles/oac/61-2.html create mode 100644 tests/testfiles/oac/62-1.html create mode 100644 tests/testfiles/oac/62-2.html create mode 100644 tests/testfiles/oac/62-3.html create mode 100644 tests/testfiles/oac/62-4.html create mode 100644 tests/testfiles/oac/63-1.html create mode 100644 tests/testfiles/oac/63-2.html create mode 100644 tests/testfiles/oac/64-1.html create mode 100644 tests/testfiles/oac/64-2.html create mode 100644 tests/testfiles/oac/65-1.html create mode 100644 tests/testfiles/oac/65-2.html create mode 100644 tests/testfiles/oac/65-3.html create mode 100644 tests/testfiles/oac/66-1.html create mode 100644 tests/testfiles/oac/66-10.html create mode 100644 tests/testfiles/oac/66-11.html create mode 100644 tests/testfiles/oac/66-12.html create mode 100644 tests/testfiles/oac/66-2.html create mode 100644 tests/testfiles/oac/66-3.html create mode 100644 tests/testfiles/oac/66-4.html create mode 100644 tests/testfiles/oac/66-5.html create mode 100644 tests/testfiles/oac/66-6.html create mode 100644 tests/testfiles/oac/66-7.html create mode 100644 tests/testfiles/oac/66-8.html create mode 100644 tests/testfiles/oac/66-9.html create mode 100644 tests/testfiles/oac/68-1.html create mode 100644 tests/testfiles/oac/68-2.html create mode 100644 tests/testfiles/oac/68-3.html create mode 100644 tests/testfiles/oac/68-4.html create mode 100644 tests/testfiles/oac/69-1.html create mode 100644 tests/testfiles/oac/69-2.html create mode 100644 tests/testfiles/oac/7-1.html create mode 100644 tests/testfiles/oac/7-2.html create mode 100644 tests/testfiles/oac/70-1.html create mode 100644 tests/testfiles/oac/70-2.html create mode 100644 tests/testfiles/oac/71-1.html create mode 100644 tests/testfiles/oac/71-2.html create mode 100644 tests/testfiles/oac/72-1.html create mode 100644 tests/testfiles/oac/72-2.html create mode 100644 tests/testfiles/oac/72-3.html create mode 100644 tests/testfiles/oac/73-1.html create mode 100644 tests/testfiles/oac/73-2.html create mode 100644 tests/testfiles/oac/74-1.html create mode 100644 tests/testfiles/oac/74-2.html create mode 100644 tests/testfiles/oac/75-1.html create mode 100644 tests/testfiles/oac/75-2.html create mode 100644 tests/testfiles/oac/76-1.html create mode 100644 tests/testfiles/oac/76-2.html create mode 100644 tests/testfiles/oac/77-1.html create mode 100644 tests/testfiles/oac/77-2.html create mode 100644 tests/testfiles/oac/78-1.html create mode 100644 tests/testfiles/oac/78-2.html create mode 100644 tests/testfiles/oac/79-1.html create mode 100644 tests/testfiles/oac/79-2.html create mode 100644 tests/testfiles/oac/79-3.html create mode 100644 tests/testfiles/oac/8-1.html create mode 100644 tests/testfiles/oac/8-2.html create mode 100644 tests/testfiles/oac/8-3.html create mode 100644 tests/testfiles/oac/8-4.html create mode 100644 tests/testfiles/oac/8-5.html create mode 100644 tests/testfiles/oac/80-1.html create mode 100644 tests/testfiles/oac/80-2.html create mode 100644 tests/testfiles/oac/80-3.html create mode 100644 tests/testfiles/oac/80-4.html create mode 100644 tests/testfiles/oac/81-1.html create mode 100644 tests/testfiles/oac/81-2.html create mode 100644 tests/testfiles/oac/82-1.html create mode 100644 tests/testfiles/oac/82-2.html create mode 100644 tests/testfiles/oac/82-3.html create mode 100644 tests/testfiles/oac/82-4.html create mode 100644 tests/testfiles/oac/82-5.html create mode 100644 tests/testfiles/oac/82-6.html create mode 100644 tests/testfiles/oac/82-7.html create mode 100644 tests/testfiles/oac/82-8.html create mode 100644 tests/testfiles/oac/82-9.html create mode 100644 tests/testfiles/oac/86-1.html create mode 100644 tests/testfiles/oac/86-2.html create mode 100644 tests/testfiles/oac/87-1.html create mode 100644 tests/testfiles/oac/87-2.html create mode 100644 tests/testfiles/oac/88-1.html create mode 100644 tests/testfiles/oac/88-2.html create mode 100644 tests/testfiles/oac/89-1.html create mode 100644 tests/testfiles/oac/89-2.html create mode 100644 tests/testfiles/oac/9-1.html create mode 100644 tests/testfiles/oac/9-2.html create mode 100644 tests/testfiles/oac/90-1.html create mode 100644 tests/testfiles/oac/90-2.html create mode 100644 tests/testfiles/oac/91-1.html create mode 100644 tests/testfiles/oac/91-2.html create mode 100644 tests/testfiles/oac/91-3.html create mode 100644 tests/testfiles/oac/91-4.html create mode 100644 tests/testfiles/oac/92-1.html create mode 100644 tests/testfiles/oac/92-2.html create mode 100644 tests/testfiles/oac/92-3.html create mode 100644 tests/testfiles/oac/94-1.html create mode 100644 tests/testfiles/oac/94-2.html create mode 100644 tests/testfiles/oac/95-1.html create mode 100644 tests/testfiles/oac/95-2.html create mode 100644 tests/testfiles/oac/95-3.html create mode 100644 tests/testfiles/oac/95-4.html create mode 100644 tests/testfiles/oac/96-1.html create mode 100644 tests/testfiles/oac/96-2.html create mode 100644 tests/testfiles/oac/97-1.html create mode 100644 tests/testfiles/oac/97-2.html create mode 100644 tests/testfiles/oac/98-1.html create mode 100644 tests/testfiles/oac/98-2.html create mode 100644 tests/testfiles/oac/98-3.html create mode 100644 tests/testfiles/oac/98-4.html create mode 100644 tests/testfiles/oac/99-1.html create mode 100644 tests/testfiles/oac/99-2.html create mode 100644 tests/testfiles/oac/alternative1.html create mode 100644 tests/testfiles/oac/alternative2.html create mode 100644 tests/testfiles/oac/avlab.mp3 create mode 100644 tests/testfiles/oac/avlab.txt create mode 100644 tests/testfiles/oac/big-fail.png create mode 100644 tests/testfiles/oac/chart.gif create mode 100644 tests/testfiles/oac/contrast1.gif create mode 100644 tests/testfiles/oac/contrast2.gif create mode 100644 tests/testfiles/oac/eatatjoes.gif create mode 100644 tests/testfiles/oac/finddogs.gif create mode 100644 tests/testfiles/oac/fish.gif create mode 100644 tests/testfiles/oac/fish1.html create mode 100644 tests/testfiles/oac/fish2.html create mode 100644 tests/testfiles/oac/fishswim.gif create mode 100644 tests/testfiles/oac/go.gif create mode 100644 tests/testfiles/oac/image.gif create mode 100644 tests/testfiles/oac/library.gif create mode 100644 tests/testfiles/oac/renew.gif create mode 100644 tests/testfiles/oac/rex.gif create mode 100644 tests/testfiles/oac/rex.html create mode 100644 tests/testfiles/oac/rex.jpg create mode 100644 tests/testfiles/oac/spacer.gif create mode 100644 tests/testfiles/oac/star.gif create mode 100644 tests/testfiles/oac/submit.gif create mode 100644 tests/testfiles/oac/welcome.gif create mode 100644 tests/testfiles/quail/.svn/all-wcprops create mode 100644 tests/testfiles/quail/.svn/entries create mode 100644 tests/testfiles/quail/.svn/text-base/cssComplexTest1.css.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/cssComplexTest1.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/cssContrast.css.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/cssContrast.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/cssContrast2.css.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/cssContrast2.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/cssContrast3.css.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/cssContrast3.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/cssContrast4.css.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/cssContrast4.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/cssContrast5.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/documentIsWrittenClearly-fail.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/documentIsWrittenClearly-pass-2.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/documentIsWrittenClearly-pass.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/headersHaveText-fail.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/headersHaveText-fail2.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/headersHaveText-pass.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/imgAltTextNotRedundant-fail.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/imgAltTextNotRedundant-pass.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/labelsAreAssignedToAnInput-fail.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/labelsAreAssignedToAnInput-fail2.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/labelsAreAssignedToAnInput-fail3.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/labelsAreAssignedToAnInput-pass.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/selectJumpMenus-fail.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/selectJumpMenus-pass.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/svgContainsTitle-fail.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/svgContainsTitle-pass.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/textIsNotSmall-fail.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/textIsNotSmall-fail2.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/textIsNotSmall-pass.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/videoTestFail.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/videoTestPass.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/videosEmbeddedOrLinkedNeedCaptions-fail.html.svn-base create mode 100644 tests/testfiles/quail/.svn/text-base/videosEmbeddedOrLinkedNeedCaptions-pass.html.svn-base create mode 100644 tests/testfiles/quail/cssComplexTest1.css create mode 100644 tests/testfiles/quail/cssComplexTest1.html create mode 100644 tests/testfiles/quail/cssContrast.css create mode 100644 tests/testfiles/quail/cssContrast.html create mode 100644 tests/testfiles/quail/cssContrast2.css create mode 100644 tests/testfiles/quail/cssContrast2.html create mode 100644 tests/testfiles/quail/cssContrast3.css create mode 100644 tests/testfiles/quail/cssContrast3.html create mode 100644 tests/testfiles/quail/cssContrast4.css create mode 100644 tests/testfiles/quail/cssContrast4.html create mode 100644 tests/testfiles/quail/cssContrast5.html create mode 100644 tests/testfiles/quail/documentIsWrittenClearly-fail.html create mode 100644 tests/testfiles/quail/documentIsWrittenClearly-pass-2.html create mode 100644 tests/testfiles/quail/documentIsWrittenClearly-pass.html create mode 100644 tests/testfiles/quail/headersHaveText-fail.html create mode 100644 tests/testfiles/quail/headersHaveText-fail2.html create mode 100644 tests/testfiles/quail/headersHaveText-pass.html create mode 100644 tests/testfiles/quail/imgAltTextNotRedundant-fail.html create mode 100644 tests/testfiles/quail/imgAltTextNotRedundant-pass.html create mode 100644 tests/testfiles/quail/labelsAreAssignedToAnInput-fail.html create mode 100644 tests/testfiles/quail/labelsAreAssignedToAnInput-fail2.html create mode 100644 tests/testfiles/quail/labelsAreAssignedToAnInput-fail3.html create mode 100644 tests/testfiles/quail/labelsAreAssignedToAnInput-pass.html create mode 100644 tests/testfiles/quail/selectJumpMenus-fail.html create mode 100644 tests/testfiles/quail/selectJumpMenus-pass.html create mode 100644 tests/testfiles/quail/svgContainsTitle-fail.html create mode 100644 tests/testfiles/quail/svgContainsTitle-pass.html create mode 100644 tests/testfiles/quail/textIsNotSmall-fail.html create mode 100644 tests/testfiles/quail/textIsNotSmall-fail2.html create mode 100644 tests/testfiles/quail/textIsNotSmall-pass.html create mode 100644 tests/testfiles/quail/videoTestFail.html create mode 100644 tests/testfiles/quail/videoTestPass.html create mode 100644 tests/testfiles/quail/videosEmbeddedOrLinkedNeedCaptions-fail.html create mode 100644 tests/testfiles/quail/videosEmbeddedOrLinkedNeedCaptions-pass.html diff --git a/CHANGELOG.txt b/CHANGELOG.txt new file mode 100644 index 0000000..7f7bad0 --- /dev/null +++ b/CHANGELOG.txt @@ -0,0 +1,15 @@ +Version 0.4 +--Fixed issue where imgAltNotPlaceholder was firing on empty alt text +--Fixed bug in aMustContainText which returned result on anchors that were not links +--Fixed bug where headersUseToMarkSection was firing on any paragraph which contained the target elements +--Added version number global +--Added additional comments for the tests and elements files +--Added method elementContainsReadableText to the quailTest class (a very useful method + which allows you to see if any element like a link or such contains any readable text) +--Changed the test to see if links contain readable text to use the above method +--Added new tests: headersHaveText, labelsAreAssignedToAninput, imgAltTextNotRedundant, and selectJumpMenus + +Version 0.3.8 +--Fixed bug in CSS module which would force iterating over the CSS array even if it was empty + +---Everything before this was from beyond the edge of time... check the SVN log! \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..29cdae6 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,219 @@ +PLEASE NOTE: + +There are included libraries in the directory quail/common/services which might have different (but compatible) licenses than the one covered in this file. Current licenses include: + *The current BSD: + *services/readability/php-text-statistics + *The MIT License: + *common/css.php The function parseSelector is from the PHPQuery project: + *http://code.google.com/p/phpquery + +GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright © 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +Preamble + +The GNU General Public License is a free, copyleft license for software and other kinds of works. + +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and modification follow. +TERMS AND CONDITIONS +0. Definitions. + +ÒThis LicenseÓ refers to version 3 of the GNU General Public License. + +ÒCopyrightÓ also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + +ÒThe ProgramÓ refers to any copyrightable work licensed under this License. Each licensee is addressed as ÒyouÓ. ÒLicenseesÓ and ÒrecipientsÓ may be individuals or organizations. + +To ÒmodifyÓ a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a Òmodified versionÓ of the earlier work or a work Òbased onÓ the earlier work. + +A Òcovered workÓ means either the unmodified Program or a work based on the Program. + +To ÒpropagateÓ a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + +To ÒconveyÓ a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays ÒAppropriate Legal NoticesÓ to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. +1. Source Code. + +The Òsource codeÓ for a work means the preferred form of the work for making modifications to it. ÒObject codeÓ means any non-source form of a work. + +A ÒStandard InterfaceÓ means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + +The ÒSystem LibrariesÓ of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A ÒMajor ComponentÓ, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + +The ÒCorresponding SourceÓ for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. +2. Basic Permissions. + +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. +3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + * a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + * b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to Òkeep intact all noticesÓ. + * c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + * d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an ÒaggregateÓ if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + * a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + * b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + * c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + * d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + * e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + +A ÒUser ProductÓ is either (1) a Òconsumer productÓ, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, Ònormally usedÓ refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + +ÒInstallation InformationÓ for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. +7. Additional Terms. + +ÒAdditional permissionsÓ are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + * a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + * b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + * c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + * d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + * e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + * f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered Òfurther restrictionsÓ within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. +8. Termination. + +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. + +An Òentity transactionÓ is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. +11. Patents. + +A ÒcontributorÓ is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's Òcontributor versionÓ. + +A contributor's Òessential patent claimsÓ are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, ÒcontrolÓ includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + +In the following three paragraphs, a Òpatent licenseÓ is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To ÒgrantÓ such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. ÒKnowingly relyingÓ means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + +A patent license is ÒdiscriminatoryÓ if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. +13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License Òor any later versionÓ applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ÒAS ISÓ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS FOR QUAIL LIBRARY + + +THE FOLLOWING LICENSE COVERS PORTIONS OF THE FILE LOCATED AT common/css.php, NAMELY THE FUNCTION parseSelector: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..8fe44cb --- /dev/null +++ b/README.txt @@ -0,0 +1,6 @@ +QUAIL (QUAIL Accessibility Information Library) is a PHP library for checking HTML for accessibility problems. You can read more about the project, the reasons why accessibility is important, and how to use the library at the website: + +http://quail-lib.org + +You can download this library, file issues, and feel awesome at the Google Code site: +http://code.google.com/p/quail-lib \ No newline at end of file diff --git a/examples/.svn/all-wcprops b/examples/.svn/all-wcprops new file mode 100644 index 0000000..ca22d6a --- /dev/null +++ b/examples/.svn/all-wcprops @@ -0,0 +1,11 @@ +K 25 +svn:wc:ra_dav:version-url +V 37 +/svn/!svn/ver/232/tags/0.4.1/examples +END +test_form.php +K 25 +svn:wc:ra_dav:version-url +V 51 +/svn/!svn/ver/232/tags/0.4.1/examples/test_form.php +END diff --git a/examples/.svn/entries b/examples/.svn/entries new file mode 100644 index 0000000..8b2d5d4 --- /dev/null +++ b/examples/.svn/entries @@ -0,0 +1,62 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/examples +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-06-25T22:23:29.080589Z +199 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +test_form.php +file + + + + +2010-12-08T21:44:08.000000Z +1922067bac46b66eb91e11d6bdaf16e5 +2010-06-25T22:23:29.080589Z +199 +keveemiller + + + + + + + + + + + + + + + + + + + + + +2082 + diff --git a/examples/.svn/text-base/test_form.php.svn-base b/examples/.svn/text-base/test_form.php.svn-base new file mode 100644 index 0000000..94d4a1b --- /dev/null +++ b/examples/.svn/text-base/test_form.php.svn-base @@ -0,0 +1,62 @@ + + + + Quail Doc + + +
+	
+
+
+

+

+

+ +

+

+ +

+

+
+
+ + +runCheck(); + if($_POST['reporter'] != 'array') + print $quail->getReport(array('display_level' => QUAIL_TEST_SEVERE)); + else + var_dump($quail->getReport(array('display_level' => QUAIL_TEST_SEVERE))); + } ?> diff --git a/examples/test_form.php b/examples/test_form.php new file mode 100644 index 0000000..94d4a1b --- /dev/null +++ b/examples/test_form.php @@ -0,0 +1,62 @@ + + + + Quail Doc + + +
+	
+
+
+

+

+

+ +

+

+ +

+

+
+
+ + +runCheck(); + if($_POST['reporter'] != 'array') + print $quail->getReport(array('display_level' => QUAIL_TEST_SEVERE)); + else + var_dump($quail->getReport(array('display_level' => QUAIL_TEST_SEVERE))); + } ?> diff --git a/quail/._quail.php b/quail/._quail.php new file mode 100644 index 0000000000000000000000000000000000000000..c8a5aa52f518b8b851c12a9cd511dcdd2dc57dd2 GIT binary patch literal 167 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aVZdk_{)Kq2;dkJ62x@lYy(g!NXHx? x<_2P9zzF0(#l@5JbM+Dn3UX5QLQ*SAT=SCiQ!?|?feL&bojv_R{DVEL4FD^K6~q7l literal 0 HcmV?d00001 diff --git a/quail/.svn/all-wcprops b/quail/.svn/all-wcprops new file mode 100644 index 0000000..8f5ea38 --- /dev/null +++ b/quail/.svn/all-wcprops @@ -0,0 +1,11 @@ +K 25 +svn:wc:ra_dav:version-url +V 34 +/svn/!svn/ver/232/tags/0.4.1/quail +END +quail.php +K 25 +svn:wc:ra_dav:version-url +V 44 +/svn/!svn/ver/232/tags/0.4.1/quail/quail.php +END diff --git a/quail/.svn/dir-prop-base b/quail/.svn/dir-prop-base new file mode 100644 index 0000000..8e54163 --- /dev/null +++ b/quail/.svn/dir-prop-base @@ -0,0 +1,6 @@ +K 10 +svn:ignore +V 4 +lib + +END diff --git a/quail/.svn/entries b/quail/.svn/entries new file mode 100644 index 0000000..000b70b --- /dev/null +++ b/quail/.svn/entries @@ -0,0 +1,71 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/quail +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-09-05T17:05:37.678400Z +231 +keveemiller +has-props + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +quail.php +file + + + + +2010-12-08T21:44:08.000000Z +b64bc4db9535a5d80f203d3b5da987a8 +2010-08-06T15:41:35.399024Z +219 +keveemiller + + + + + + + + + + + + + + + + + + + + + +18217 + +reporters +dir + +common +dir + +guidelines +dir + diff --git a/quail/.svn/text-base/quail.php.svn-base b/quail/.svn/text-base/quail.php.svn-base new file mode 100644 index 0000000..cc75cb7 --- /dev/null +++ b/quail/.svn/text-base/quail.php.svn-base @@ -0,0 +1,733 @@ +. +* @author Kevin Miller +*/ + +/** +* @var int A severe failure +*/ +define('QUAIL_TEST_SEVERE', 1); +define('QUAIL_TEST_MODERATE', 2); +define('QUAIL_TEST_SUGGESTION', 3); +define('QUAIL_LIB_VERSION', 038); + +/** +* +* +*/ +require_once('common/test.php'); +require_once('common/css.php'); +require_once('common/elements.php'); +require_once('common/domExtensions.php'); +require_once('common/accessibility_tests.php'); + +/** +* The main interface class for quail. +* +*/ +class quail { + /** + * @var object The central QUAIL DOMDocument object + */ + var $dom; + + /** + * @var string The type of request this is (either 'string', 'file', or 'uri' + */ + var $type; + + /** + * @var string The value of the request. Either HTML, a URI, or the path to a file + */ + var $value; + + /** + * @var string The base URI of the current request (used to rebuild page if necessary) + */ + var $uri; + + /** + * @var string The translation domain of the currnet library + */ + var $domain; + + /** + * @var string The name of the guideline + */ + var $guideline_name = 'wcag'; + + /** + * @var string The name of the reporter to use + */ + var $reporter_name = 'static'; + + /** + * @var object A QUAIL reporting object + */ + var $reporter; + + /** + * @var object The central guideline object + */ + var $guideline; + + /** + * @var string The base URL for any request of type URI + */ + var $base_url; + + /** + * @var array An array of the current file or URI path + */ + var $path = array(); + + /** + * @var array An array of additional CSS files to load (useful for CMS content) + */ + var $css_files; + + /** + * @var object The QuailCSS object + */ + var $css; + + /** + * @var array An array of additional options + */ + var $options = array( + 'cms_mode' => false, + 'start_element' => 0, + 'end_element' => 0, + 'cms_template' => array()); + + /** + * @var bool An indicator if the DOMDocument loaded. If not, this means that the + * HTML given to it was so munged it wouldn't even load. + */ + var $is_valid = true; + + /** + * The class constructor + * @param string $value Either the HTML string to check or the file/uri of the request + * @param string $guideline The name of the guideline + * @param string $type The type of the request (either file, uri, or string) + * @param string $reporter The name of the reporter to use + * @param string $domain The domain of the translation language to use + */ + function __construct($value, $guideline = 'wcag', $type = 'string', $reporter = 'static', $domain = 'en') { + $this->dom = new DOMDocument(); + $this->type = $type; + if($type == 'uri' || $type == 'file') { + $this->uri = $value; + } + $this->domain = $domain; + $this->guideline_name = $guideline; + $this->reporter_name = $reporter; + $this->value = $value; + + } + + /** + * Preapres the DOMDocument object for quail. It loads based on the file type + * declaration and first scrubs the value using prepareValue() + */ + function prepareDOM() { + $this->prepareValue(); + $this->is_valid = @$this->dom->loadHTML($this->value); + $this->prepareBaseUrl($this->value, $this->type); + } + + /** + * If the CMS mode options are set, then we remove some items fromt the + * HTML value before sending it back. + * + */ + function prepareValue() { + + //We ignore the 'string' type because it would mean the value already contains HTML + if($this->type == 'file' || $this->type == 'uri') { + $this->value = @file_get_contents($this->value); + } + } + + + /** + * Set global predefined options for QUAIL. First we check that the + * array key has been defined. + * @param mixed $variable Either an array of values, or a variable name of the option + * @param mixed $value If this is a single option, the value of the option + */ + function setOption($variable, $value = null) { + if(!is_array($variable)) { + $variable = array($variable => $value); + } + foreach($variable as $k => $value) { + if(isset($this->options[$k])) { + $this->options[$k] = $value; + } + } + } + + /** + * Returns an absolute path from a relative one + * @param string $absolute The absolute URL + * @param string $relative The relative path + * @return string A new path + */ + + function getAbsolutePath($absolute, $relative) { + if(substr($relative, 0, 2) == '//') { + if($this->uri) { + $current = parse_url($this->uri); + } + else { + $current = array('scheme' => 'http'); + } + return $current['scheme'] .':'. $relative; + } + $relative_url = parse_url($relative); + if (isset($relative_url['scheme'])) { + return $relative; + } + $absolute_url = parse_url($absolute); + if(isset($absolute_url['path'])) { + $path = dirname($absolute_url['path']); + } + if ($relative{0} == '/') { + $c_parts = array_filter(explode('/', $relative)); + } + else { + $a_parts = array_filter(explode('/', $path)); + $r_parts = array_filter(explode('/', $relative)); + $c_parts = array_merge($a_parts, $r_parts); + foreach ($c_parts as $i => $part) { + if ($part == '.') { + $c_parts[$i] = NULL; + } + if ($part == '..') { + $c_parts[$i - 1] = NULL; + $c_parts[$i] = NULL; + } + } + $c_parts = array_filter($c_parts); + } + $path = implode('/', $c_parts); + $url = ""; + if (isset($absolute_url['scheme'])) { + $url = $absolute_url['scheme'] .'://'; + } + if (isset($absolute_url['user'])) { + $url .= $absolute_url['user']; + if ($absolute_url['pass']) { + $url .= ':'. $absolute_url['user']; + } + $url .= '@'; + } + if (isset($absolute_url['host'])) { + $url .= $absolute_url['host']; + if(isset($absolute_url['port'])) { + $url .= ':'. $absolute_url['port']; + } + $url .= '/'; + } + $url .= $path; + return $url; + } + + /** + * Sets the URI if this is for a string or to change where + * QUAIL will look for resources like CSS files + * @param string $uri The URI to set + */ + function setUri($uri) { + if(parse_url($uri)) { + $this->uri = $uri; + } + } + + /** + * Formats the base URL for either a file or uri request. We are essentially + * formatting a base url for future reporters to use to find CSS files or + * for tests that use external resources (images, objects, etc) to run tests on them. + * @param string $value The path value + * @param string $type The type of request + */ + function prepareBaseUrl($value, $type) { + if($type == 'file') { + $path = explode('/', $this->uri); + array_pop($path); + $this->path = $path; + } + elseif($type == 'uri' || $this->uri) { + + $parts = explode('://', $this->uri); + $this->path[] = $parts[0] .':/'; + if(is_array($parts[1])) { + foreach(explode('/', $this->getBaseFromFile($parts[1])) as $part) { + $this->path[] = $part; + } + } + else { + $this->path[] = $parts[1] .'/'; + } + } + } + + /** + * Retrieves the absolute path to a file + * @param string $file The path to a file + * @return string The absolute path to a file + */ + function getBaseFromFile($file) { + $find = '/'; + $after_find = substr(strrchr($file, $find), 1); + $strlen_str = strlen($after_find); + $result = substr($file, 0, -$strlen_str); + return $result; + } + + + + /** + * Helper method to add an additional CSS file + * @param string $css The URI or file path to a CSS file + */ + function addCSS($css) { + if(is_array($css)) { + $this->css_files = $css; + } + else { + $this->css_files[] = $css; + } + } + + /** + * Retrives a single error from the current reporter + * @param string $error The error key + * @return object A QuailReportItem object + */ + function getError($error) { + return $this->reporter->getError($error); + } + + /** + * A local method to load the required file for a reporter and set it for the current QUAIL object + * @param array $options An array of options for the reporter + */ + function loadReporter($options = array()) { + $classname = 'report'.ucfirst($this->reporter_name); + if(!class_exists($classname)) { + require_once('reporters/reporter.'. $this->reporter_name .'.php'); + } + $this->reporter = new $classname($this->dom, $this->css, $this->guideline, $this->path); + if(count($options)) + $this->reporter->setOptions($options); + } + + + /** + * Checks that the DOM object is valid or not + * @return bool Whether the DOMDocument is valid + */ + function isValid() { + return $this->is_valid; + } + + + /** + * Starts running automated checks. Loads the CSS file parser + * and the guideline object. + */ + function runCheck($options = null) { + $this->prepareDOM(); + if(!$this->isValid()) + return false; + $this->getCSSObject(); + $classname = ucfirst(strtolower($this->guideline_name)).'Guideline'; + if(!class_exists($classname)) { + require_once('guidelines/'. $this->guideline_name .'.php'); + } + $this->guideline = new $classname($this->dom, $this->css, $this->path, $options, $this->domain, $this->options['cms_mode']); + } + + /** + * Loads the quailCSS object + */ + function getCSSObject() { + $this->css = new quailCSS($this->dom, $this->uri, $this->type, $this->path, false, $this->css_files); + } + + /** + * Returns a formatted report from the current reporter. + * @param array $options An array of all the options + * @return mixed See the documentation on your reporter's getReport method. + */ + function getReport($options = array()) { + if(!$this->reporter) + $this->loadReporter($options); + if($options) { + $this->reporter->setOptions($options); + } + return $this->reporter->getReport(); + } + + /** + * Runs one test on the current DOMDocument + * @pararm string $test The name of the test to run + * @reutrn object The QuailReportItem returned from the test + */ + function getTest($test) { + if(!class_exists($test)) { + return false; + } + $test_class = new $test($this->dom, $this->css, $this->path); + return $test_class->report; + } + + /** + * Retrieves the default severity of a test + * @pararm string $test The name of the test to run + * @reutrn object The severity level of the test + */ + function getTestSeverity($test) { + $test_class = new $test($this->dom, $this->css, $this->path); + return $test_class->getSeverity(); + } + + /** + * A general cleanup function which just does some memory + * cleanup by unsetting the particularly large local vars. + */ + function cleanup() { + unset($this->dom); + unset($this->css); + unset($this->guideline); + unset($this->reporter); + } +} + +/** +* The base classe for a reporter +*/ +class quailReporter { + + /** + * @var object The current document's DOMDocument + */ + var $dom; + + /** + * @var object The current quailCSS object + */ + var $css; + + /** + * @var array An array of test names and the translation for the problems with it + */ + var $translation; + + /** + * @var array A collection of quailReportItem objects + */ + var $report; + + /** + * @var array The path to the current document + */ + var $path; + + /** + * @var object Additional options for this reporter + */ + var $options; + + /** + * @var array An array of attributes to search for to turn into absolute paths rather than + * relative paths + */ + var $absolute_attributes = array('src', 'href'); + + /** + * The class constructor + * @param object $dom The current DOMDocument object + * @param object $css The current QuailCSS object + * @param object $guideline The current guideline object + * @param string $domain The current translation domain + * @param string $path The current path + */ + function __construct(&$dom, &$css, &$guideline, $path = '') { + $this->dom = &$dom; + $this->css = &$css; + $this->path = $path; + $this->options = new stdClass; + $this->guideline = &$guideline; + } + + + + /** + * Sets options for the reporter + * @param array $options an array of options + */ + function setOptions($options) { + foreach($options as $key => $value) { + $this->options->$key = $value; + } + } + + /** + * Sets the absolute path for an element + * @param object $element A DOMElement object to turn into an absolute path + */ + function setAbsolutePath(&$element) { + foreach($this->absolute_attributes as $attribute) { + if($element->hasAttribute($attribute)) + $attr = $attribute; + } + + if($attr) { + $item = $element->getAttribute($attr); + //We are ignoring items with absolute URLs + if(strpos($item, '://') === false) { + + $item = implode('/', $this->path) . ltrim($item, '/'); + $element->setAttribute($attr, $item); + + } + } + if($element->tagName == 'style') { + if(strpos($element->nodeValue, '@import') !== false) { + + + } + } + } + +} + +/** +* A report item. There is one per issue with the report +* +*/ +class quailReportItem { + + /** + * @var object The DOMElement that the report item refers to (if any) + */ + var $element; + + /** + * @var string The error message + */ + var $message; + + /** + * @var bool Whether the check needs to be manually verified + */ + var $manual; + + /** + * @var bool For document-level tests, this says whether the test passed or not + */ + var $pass; + + /** + * Returns the line number of the report item. Unfortunately we can't use getLineNo + * if we are before PHP 5.3, so if not we try to get the line number through a more + * circuitous way. + */ + function getLine() { + if(is_object($this->element) && method_exists($this->element, 'getLineNo')) { + return $this->element->getLineNo(); + } + return 0; + } + + /** + * Returns the current element in plain HTML form + * @param array $extra_attributes An array of extra attributes to add to the element + * @return string An HTML string version of the provided DOMElement object + */ + function getHTML($extra_attributes = array()) { + if(!$this->element) + return ''; + $result_dom = new DOMDocument(); + try { + + $result_element = $result_dom->createElement(utf8_encode($this->element->tagName)); + } + catch (Exception $e) { + return false; + } + foreach($this->element->attributes as $attribute) { + if($attribute->name != 'quail_style_index') { + $result_element->setAttribute($attribute->name, $attribute->value); + } + } + foreach($extra_attributes as $name => $value) { + $result_element->setAttribute($name, $value); + } + $result_element->nodeValue = htmlentities($this->element->nodeValue); + //We utf8 encode per http://us2.php.net/manual/en/domdocument.save.php#67952 + //$result_dom->appendChild(utf8_encode($result_element)); + @$result_dom->appendChild($result_element); + return @$result_dom->saveHTML(); + + } + +} + +/** +* The base class for a guideline +* +*/ +class quailGuideline { + + /** + * @var object The current document's DOMDocument + */ + var $dom; + + /** + * @var object The current quailCSS object + */ + var $css; + + /** + * @var array The path to the current document + */ + var $path; + + /** + * @var array An array of report objects + */ + var $report; + + /** + * @var array An array of translations for all this guideline's tests + */ + var $translations; + + /** + * @var bool Whether we are running in CMS mode + */ + var $cms_mode = false; + + /** + * @var array An array of all the severity levels for every test + */ + + var $severity = array(); + + /** + * The class constructor + * @param object $dom The current DOMDocument object + * @param object $css The current QuailCSS object + * @param string $path The current path + */ + + function __construct(&$dom, &$css, &$path, $arg = null, $domain = 'en', $cms_mode = false) { + $this->dom = &$dom; + $this->css = &$css; + $this->path = &$path; + $this->cms_mode = $cms_mode; + $this->loadTranslations($domain); + $this->run($arg, $domain); + } + + /** + * Returns an array of all the tests associated with the current guideline + * @return array + */ + function getTests() { + return $this->tests; + } + + /** + * Loads translations from a file. This can be overriden, just as long as the + * local variable 'translations' is an associative array with test function names + * as the key + */ + function loadTranslations($domain) { + $csv = fopen(dirname(__FILE__) .'/guidelines/translations/'. $domain .'.txt', 'r'); + if ($csv) { + while ($translation = fgetcsv($csv)) { + if(count($translation) == 4) { + $this->translations[$translation[0]] = array( + 'title' => $translation[1], + 'description' => $translation[2], + ); + } + } + } + } + /** + * Returns the translation for a test name. + * @param string $test The function name of the test + */ + function getTranslation($testname) { + $translation = (isset($this->translations[$testname])) + ? $this->translations[$testname] + : $testname; + return $translation; + } + /** + * Iterates through each test string, makes a new test object, and runs it against the current DOM + */ + function run($arg = null, $language = 'en') { + foreach($this->tests as $testname => $options) { + if(is_numeric($testname) && !is_array($options)) { + $testname = $options; + } + if(class_exists($testname) && $this->dom) { + $$testname = new $testname($this->dom, $this->css, $this->path, $language, $arg); + if(!$this->cms_mode || ($$testname->cms && $this->cms_mode)) { + $this->report[$testname] = $$testname->getReport(); + } + $this->severity[$testname] = $$testname->default_severity; + unset($$testname); + } + else { + $this->report[$testname] = false; + } + } + } + + /** + * Returns all the Report variable + * @reutrn mixed Look to your report to see what it returns + */ + function getReport(){ + return $this->report; + } + + /** + * Returns the severity level of a given test + * @param string $testname The name of the test + * @return int The severity level + */ + function getSeverity($testname) { + if(isset($this->tests[$testname]['severity'])) { + return $this->tests[$testname]['severity']; + } + if(isset($this->severity[$testname])) { + return $this->severity[$testname]; + } + return QUAIL_TEST_MODERATE; + } +} \ No newline at end of file diff --git a/quail/common/.svn/all-wcprops b/quail/common/.svn/all-wcprops new file mode 100644 index 0000000..79504ab --- /dev/null +++ b/quail/common/.svn/all-wcprops @@ -0,0 +1,35 @@ +K 25 +svn:wc:ra_dav:version-url +V 41 +/svn/!svn/ver/232/tags/0.4.1/quail/common +END +accessibility_tests.php +K 25 +svn:wc:ra_dav:version-url +V 65 +/svn/!svn/ver/232/tags/0.4.1/quail/common/accessibility_tests.php +END +elements.php +K 25 +svn:wc:ra_dav:version-url +V 54 +/svn/!svn/ver/232/tags/0.4.1/quail/common/elements.php +END +test.php +K 25 +svn:wc:ra_dav:version-url +V 50 +/svn/!svn/ver/232/tags/0.4.1/quail/common/test.php +END +domExtensions.php +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/quail/common/domExtensions.php +END +css.php +K 25 +svn:wc:ra_dav:version-url +V 49 +/svn/!svn/ver/232/tags/0.4.1/quail/common/css.php +END diff --git a/quail/common/.svn/entries b/quail/common/.svn/entries new file mode 100644 index 0000000..c3cb780 --- /dev/null +++ b/quail/common/.svn/entries @@ -0,0 +1,204 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/quail/common +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-08-21T07:01:43.361020Z +224 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +accessibility_tests.php +file + + + + +2010-12-08T21:44:08.000000Z +39ec36bb5c7a2f490831c3d0b594f5ec +2010-08-21T07:01:43.361020Z +224 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +169826 + +elements.php +file + + + + +2010-12-08T21:44:08.000000Z +e2c2cffd5b514cb35257f7870fc8c3d7 +2010-07-03T00:42:03.995242Z +201 +keveemiller + + + + + + + + + + + + + + + + + + + + + +3031 + +services +dir + +test.php +file + + + + +2010-12-08T21:44:08.000000Z +a0bad9e79e2cd1d9571c0ccc773b12af +2010-08-04T04:42:06.634103Z +216 +keveemiller + + + + + + + + + + + + + + + + + + + + + +29797 + +domExtensions.php +file + + + + +2010-12-08T21:44:08.000000Z +40c80e8feefb46ccb0288192b7f1579a +2010-07-03T00:42:03.995242Z +201 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1177 + +resources +dir + +css.php +file + + + + +2010-12-08T21:44:08.000000Z +7b3d8db2a90ded4dfd4c8026a0ea9a47 +2010-07-31T01:29:48.940351Z +209 +keveemiller + + + + + + + + + + + + + + + + + + + + + +16969 + diff --git a/quail/common/.svn/prop-base/accessibility_tests.php.svn-base b/quail/common/.svn/prop-base/accessibility_tests.php.svn-base new file mode 100644 index 0000000..869ac71 --- /dev/null +++ b/quail/common/.svn/prop-base/accessibility_tests.php.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/quail/common/.svn/text-base/accessibility_tests.php.svn-base b/quail/common/.svn/text-base/accessibility_tests.php.svn-base new file mode 100644 index 0000000..04b9b19 --- /dev/null +++ b/quail/common/.svn/text-base/accessibility_tests.php.svn-base @@ -0,0 +1,6042 @@ +. +* @author Kevin Miller +*/ + +/** +* \defgroup tests Accessibility Tests +*/ +/*@{*/ + + +/** +* Adjacent links with same resource must be combined. +* If 2 adjacent links have the same destination then this error will be generated. +*/ + + +/** +* There are no adjacent text and image links having the same destination. +* This objective of this technique is to avoid unnecessary duplication that occurs when adjacent text and iconic versions of a link are contained in a document. +* @link http://quail-lib.org/test-info/aAdjacentWithSameResourceShouldBeCombined +*/ +class aAdjacentWithSameResourceShouldBeCombined extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if($this->propertyIsEqual($a->nextSibling, 'wholeText', '', true)) + $next = $a->nextSibling->nextSibling; + else + $next = $a->nextSibling; + if($this->propertyIsEqual($next, 'tagName', 'a')) { + if($a->getAttribute('href') == $next->getAttribute('href')) + $this->addReport($a); + } + } + } +} + +/** +* Alt text for all img elements used as source anchors is different from the link text. +* If an image occurs within a link, the Alt text should be different from the link text. +* @link http://quail-lib.org/test-info/aImgAltNotRepetative +*/ +class aImgAltNotRepetative extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + foreach($a->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'img')) { + if(trim($a->nodeValue) == trim($child->getAttribute('alt'))) + $this->addReport($child); + } + } + } + } +} + +/** +* Link text does not begin with \"link to\"" or \""go to\"" (English)." +* Alt text for images used as links should not begin with \"link to\"" or \""go to\""." +* @link http://quail-lib.org/test-info/aLinkTextDoesNotBeginWithRedundantWord +*/ +class aLinkTextDoesNotBeginWithRedundantWord extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('link to', 'go to'), + 'es' => array('enlaces a', 'ir a') + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(!$a->nodeValue) { + if(property_exists($a, 'firstChild') && $this->propertyIsEqual($a->firstChild, 'tagName', 'img')) { + $text = $a->firstChild->getAttribute('alt'); + } + } + else + $text = $a->nodeValue; + foreach($this->translation() as $word) { + if(strpos(trim($text), $word) === 0) + $this->addReport($a); + } + } + } +} + +/** +* Include non-link, printable characters (surrounded by spaces) between adjacent links. +* Adjacent links must be separated by printable characters. [Editor's Note - Define adjacent link? Printable characters always?] +* @link http://quail-lib.org/test-info/aLinksAreSeperatedByPrintableCharacters +*/ +class aLinksAreSeperatedByPrintableCharacters extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(property_exists($a, 'nextSibling') + && is_object($a->nextSibling) + && property_exists($a->nextSibling, 'nextSibling') + && $this->propertyIsEqual($a->nextSibling->nextSibling, 'tagName', 'a') + && ($this->propertyIsEqual($a->nextSibling, 'wholeText', '', true) + || !property_exists($a->nextSibling, 'wholeText') + || $this->propertyIsEqual($a->nextSibling, 'nodeValue', '', true) + ) + ) { + $this->addReport($a); + } + } + } +} + +/** +* Anchor should not open new window without warning. +* a (anchor) element must not contain a target attribute unless the target attribute value is either _self, _top, or _parent. +* @link http://quail-lib.org/test-info/aLinksDontOpenNewWindow +*/ +class aLinksDontOpenNewWindow extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $allowed_targets A list of targest allowed that don't open a new window + */ + var $allowed_targets = array('_self', '_parent', '_top'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if($a->hasAttribute('target') + && !in_array($a->getAttribute('target'), $this->allowed_targets)) { + $this->addReport($a); + } + } + } + +} + +/** +* Link text is meaningful when read out of context. +* All a (anchor) elements that contains any text will generate this error. +* @link http://quail-lib.org/test-info/aLinksMakeSenseOutOfContext +*/ +class aLinksMakeSenseOutOfContext extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(strlen($a->nodeValue) > 1) + $this->addReport($a); + } + } + +} + +/** +* Links to multimedia require a text transcript. +* a (anchor) element must not contain an href attribute value that ends with (case insensitive): .wmv, .mpg, .mov, .ram, .aif. +* @link http://quail-lib.org/test-info/aLinksToMultiMediaRequireTranscript +*/ +class aLinksToMultiMediaRequireTranscript extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var array $extensions A list of extensions that are considered links to multimedi + */ + var $extensions = array('wmv', 'mpg', 'mov', 'ram', 'aif'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if($a->hasAttribute('href')) { + $filename = explode('.', $a->getAttribute('href')); + $extension = array_pop($filename); + if(in_array($extension, $this->extensions)) + $this->addReport($a); + } + } + } + +} + +/** +* Sound file must have a text transcript. +* a (anchor) element cannot contain an href attribute value that ends with any of the following (all case insensitive): .wav, .snd, .mp3, .iff, .svx, .sam, .smp, .vce, .vox, .pcm, .aif. +* @link http://quail-lib.org/test-info/aLinksToSoundFilesNeedTranscripts +*/ +class aLinksToSoundFilesNeedTranscripts extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var array $extensions A list of extensions that mean this file is a link to audio + */ + var $extensions = array('wav', 'snd', 'mp3', 'iff', 'svx', 'sam', 'smp', 'vce', 'vox', 'pcm', 'aif'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if($a->hasAttribute('href')) { + $filename = explode('.', $a->getAttribute('href')); + $extension = array_pop($filename); + if(in_array($extension, $this->extensions)) + $this->addReport($a); + } + } + } +} + +/** +* Links to multimedia content should also link to alternate content +* @link http://quail-lib.org/test-info/aMultimediaTextAlternative +*/ +class aMultimediaTextAlternative extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var array $extensions An array of extensionst that mean this is multimedia + */ + var $extensions = array('wmv', 'wav', 'mpg', 'mov', 'ram', 'aif'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if($a->hasAttribute('href')) { + $extension = substr($a->getAttribute('href'), + (strrpos($a->getAttribute('href'), '.') + 1), 4); + if(in_array($extension, $this->extensions)) + $this->addReport($a); + } + } + } +} + +/** +* Each source anchor contains text. +* a (anchor) element must contain text. The text may occur in the anchor text or in the title attribute of the anchor or in the Alt text of an image used within the anchor. +* @link http://quail-lib.org/test-info/aMustContainText +*/ +class aMustContainText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(!$this->elementContainsReadableText($a) && ($a->hasAttribute('href'))) { + $this->addReport($a); + } + } + } + + /** + * Returns if a link is not a candidate to be an anchor (which does + * not need text) + * @param object The element link in question + * @return bool Whether is is a link (TRUE) or an anchor (FALSE) + */ + function isNotAnchor($a) { + return (!($a->hasAttribute('name') && !$a->hasAttribute('href'))); + } +} + +/** +* Anchor element must have a title attribute. +* Each source a (anchor) element must have a title attribute. +* @link http://quail-lib.org/test-info/aMustHaveTitle +*/ +class aMustHaveTitle extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(!$a->hasAttribute('title')) + $this->addReport($a); + } + + } +} + +/** +* Anchor must not use Javascript URL protocol. +* Anchor elements must not have an href attribute value that starts with "javascript:". +* @link http://quail-lib.org/test-info/aMustNotHaveJavascriptHref +*/ +class aMustNotHaveJavascriptHref extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(substr(trim($a->getAttribute('href')), 0, 11) == 'javascript:') + $this->addReport($a); + } + } +} + +/** +* Suspicious link text. +* a (anchor) element cannot contain any of the following text (English): \"click here\"" +* @link http://quail-lib.org/test-info/aSuspiciousLinkText +*/ +class aSuspiciousLinkText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('click here', 'click', 'more', 'here'), + 'es' => array('clic aquí', 'clic', 'haga clic', 'más', 'aquí')); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(in_array(strtolower(trim($a->nodeValue)), $this->translation())) + $this->addReport($a); + } + + } +} + +/** +* The title attribute of all source a (anchor) elements describes the link destination. +* Each source a (anchor) element must have a title attribute that describes the link destination. +* @link http://quail-lib.org/test-info/aTitleDescribesDestination +*/ +class aTitleDescribesDestination extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if($a->hasAttribute('title')) + $this->addReport($a); + } + + } +} + +/** +* Content must have an address for author. +* address element must be present. +* @link http://quail-lib.org/test-info/addressForAuthor +*/ +class addressForAuthor extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('address') as $address) { + foreach($address->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'a')) + return true; + } + } + $this->addReport(null, null, false); + } + +} + +/** +* address of page author must be valid. +* This error will be generated for each address element. [Editor's Note: What is a valid address?] +* @link http://quail-lib.org/test-info/addressForAuthorMustBeValid +*/ +class addressForAuthorMustBeValid extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('address') as $address) { + if ($this->validateEmailAddress($address->nodeValue, array('check_domain' => $this->checkDomain))) + return true; + foreach($address->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'a') + && substr(strtolower($child->getAttribute('href')), 0, 7) == 'mailto:') { + if($this->validateEmailAddress(trim(str_replace('mailto:', '', $child->getAttribute('href'))), + array('check_domain' => $this->checkDomain))) + return true; + + } + } + } + $this->addReport(null, null, false); + } + + + function validateEmailAddress($email) { + // First, we check that there's one @ symbol, + // and that the lengths are right. + if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) { + // Email invalid because wrong number of characters + // in one section or wrong number of @ symbols. + return false; + } + // Split it into sections to make life easier + $email_array = explode("@", $email); + $local_array = explode(".", $email_array[0]); + for ($i = 0; $i < sizeof($local_array); $i++) { + if + (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", + $local_array[$i])) { + return false; + } + } + // Check if domain is IP. If not, + // it should be valid domain name + if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { + $domain_array = explode(".", $email_array[1]); + if (sizeof($domain_array) < 2) { + return false; // Not enough parts to domain + } + for ($i = 0; $i < sizeof($domain_array); $i++) { + if + (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", + $domain_array[$i])) { + return false; + } + } + } + return true; + } + +} + +/** +* applet contains a text equivalent in the body of the applet. +* This error is generated for all applet elements. +* @link http://quail-lib.org/test-info/appletContainsTextEquivalent +*/ +class appletContainsTextEquivalent extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('applet') as $applet) { + if(trim($applet->nodeValue) == '' || !$applet->nodeValue) + $this->addReport($applet); + + } + } + +} + +/** +* applet contains a text equivalent in the body of the applet. +* This error is generated for all applet elements. +* @link http://quail-lib.org/test-info/appletContainsTextEquivalentInAlt +*/ +class appletContainsTextEquivalentInAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('applet') as $applet) { + if(!$applet->hasAttribute('alt') || $applet->getAttribute('alt') == '') + $this->addReport($applet); + + } + } + +} + +/** +* applet provides a keyboard mechanism to return focus to the parent window. +* Ensure that keyboard users do not become trapped in a subset of the content that can only be exited using a mouse or pointing device. +* @link http://quail-lib.org/test-info/appletProvidesMechanismToReturnToParent +*/ +class appletProvidesMechanismToReturnToParent extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'applet'; +} + +/** +* applet text equivalnets are updated as well if the applet content is updated +* @link http://quail-lib.org/test-info/appletTextEquivalentsGetUpdated +*/ +class appletTextEquivalentsGetUpdated extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'applet'; + +} + +/** +* applet user interface must be accessible. +* This error is generated for all applet elements. +* @link http://quail-lib.org/test-info/appletUIMustBeAccessible +*/ +class appletUIMustBeAccessible extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'applet'; +} + +/** +* All applets do not flicker. +* This error is generated for all applet elements. +* @link http://quail-lib.org/test-info/appletsDoNotFlicker +*/ +class appletsDoNotFlicker extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'applet'; + +} + +/** +* applet should not use color alone. +* This error is generated for all applet elements. +* @link http://quail-lib.org/test-info/appletsDoneUseColorAlone +*/ +class appletsDoneUseColorAlone extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'applet'; +} + +/** +* Alt text for all area elements identifies the link destination. +* Alt text for area element must describe the link destination. +* @link http://quail-lib.org/test-info/areaAltIdentifiesDestination +*/ +class areaAltIdentifiesDestination extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'area'; + +} + +/** +* Alt text for all area elements contains all non decorative text in the image area. +* This error is generated for all area elements. +* @link http://quail-lib.org/test-info/areaAltRefersToText +*/ +class areaAltRefersToText extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'area'; +} + +/** +* area should not open new window without warning. +* area element, target attribute values must contain any one of (case insensitive) _self, _top, _parent. +* @link http://quail-lib.org/test-info/areaDontOpenNewWindow +*/ +class areaDontOpenNewWindow extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $allowed_targets A list of targets which are allowed + */ + var $allowed_targets = array('_self', '_parent', '_top'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('area') as $area) { + if($area->hasAttribute('target') + && !in_array($area->getAttribute('target'), $this->allowed_targets)) { + $this->addReport($area); + } + } + } + +} + +/** +* All area elements have an alt attribute. +* area elements must contain a alt attribute. +* @link http://quail-lib.org/test-info/areaHasAltValue +*/ +class areaHasAltValue extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('area') as $area) { + if(!$area->hasAttribute('alt')) + $this->addReport($area); + } + } + +} + +/** +* area link to sound file must have text transcript. +* area elements must not contain href attribute values that end with (all case insensitive) .wav, .snd, .mp3, .iff, .svx, .sam, .smp, .vce, .vox, .pcm, .aif +* @link http://quail-lib.org/test-info/areaLinksToSoundFile +*/ +class areaLinksToSoundFile extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var array $extensions An array of extensions which menas this is a sound file + */ + var $extensions = array('wav', 'snd', 'mp3', 'iff', 'svx', 'sam', 'smp', 'vce', 'vox', 'pcm', 'aif'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('area') as $area) { + if($area->hasAttribute('href')) { + $filename = explode('.', $area->getAttribute('href')); + $extension = array_pop($filename); + if(in_array($extension, $this->extensions)) + $this->addReport($area); + } + } + } + +} + +/** +* basefont must not be used. +* This error is generated for all basefont elements. +* @link http://quail-lib.org/test-info/basefontIsNotUsed +*/ +class basefontIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'basefont'; +} + +/** +* blink element is not used. +* This error is generated for all blink elements. +* @link http://quail-lib.org/test-info/blinkIsNotUsed +*/ +class blinkIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'blink'; + +} + +/** +* blockquote must not be used for indentation. +* This error is generated if any blockquote element is missing a cite attribute. +* @link http://quail-lib.org/test-info/blockquoteNotUsedForIndentation +*/ +class blockquoteNotUsedForIndentation extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('blockquote') as $blockquote) { + if(!$blockquote->hasAttribute('cite')) + $this->addReport($blockquote); + } + } +} + +/** +* Use the blockquote element to mark up block quotations. +* If body element content is greater than 10 characters (English) then this error will be generated. +* @link http://quail-lib.org/test-info/blockquoteUseForQuotations +*/ +class blockquoteUseForQuotations extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('p') as $paragraph) { + if(in_array(substr(trim($paragraph->nodeValue), 0, 1), array('"', "'")) && + in_array(substr(trim($paragraph->nodeValue), -1, 1), array('"', "'"))) { + $this->addReport($paragraph); + } + } + } + +} + +/** +* The luminosity contrast ratio between active link text and background color is at least 5:1. +* The luminosity contrast ratio between active link text and background color is at least 5:1 +* @link http://quail-lib.org/test-info/bodyActiveLinkColorContrast +*/ +class bodyActiveLinkColorContrast extends bodyColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $foreground The type of item that should be checked for contrast in the foreground + */ + var $foreground = 'alink'; +} + + + + +/** +* The luminosity contrast ratio between link text and background color is at least 5:1. +* The luminosity contrast ratio between link text and background color is at least 5:1 +* @link http://quail-lib.org/test-info/bodyLinkColorContrast +*/ +class bodyLinkColorContrast extends bodyColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $foreground The type of item that should be checked for contrast in the foreground + */ + var $foreground = 'link'; +} + +/** +* Do not use background images. +* The body element must not contain a background attribute. +* @link http://quail-lib.org/test-info/bodyMustNotHaveBackground +*/ +class bodyMustNotHaveBackground extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $body = $this->getAllElements('body'); + if(!$body) + return false; + $body = $body[0]; + if($body->hasAttribute('background')) + $this->addReport(null, null, false); + } +} + +/** +* The luminosity contrast ratio between visited link text and background color is at least 5:1. +* The luminosity contrast ratio between visited link text and background color is at least 5:1 +* @link http://quail-lib.org/test-info/bodyVisitedLinkColorContrast +*/ +class bodyVisitedLinkColorContrast extends bodyColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $foreground The type of item that should be checked for contrast in the foreground + */ + var $foreground = 'vlink'; +} + +/** +* b (bold) element is not used. +* This error will be generated for all B elements. +* @link http://quail-lib.org/test-info/boldIsNotUsed +*/ +class boldIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'bold'; +} + +/** +* All input elements, type of "checkbox", have an explicitly associated label. +* input element that contains a type attribute value of "checkbox" must have an associated label element. An associated label is one in which the for attribute value of the label element is the same as the id attribute value of the input element. +* @link http://quail-lib.org/test-info/checkboxHasLabel +*/ +class checkboxHasLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'checkbox'; + + /** + * @var bool $no_type We are not looking at the type of input here + */ + var $no_type = false; +} + +/** +* All input elements, type of "checkbox", have a label that is positioned close to the control. +* input element with a type attribute value of "checkbox" must have an associated label element positioned close to it. +* @link http://quail-lib.org/test-info/checkboxLabelIsNearby +*/ +class checkboxLabelIsNearby extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'checkbox') + $this->addReport($input); + + } + } +} + +/** +* Document must be readable when stylesheets are not applied. +* This error will be generated for each link element that has a rel attribute with a value of "stylesheet". +* @link http://quail-lib.org/test-info/cssDocumentMakesSenseStyleTurnedOff +*/ +class cssDocumentMakesSenseStyleTurnedOff extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('link') as $link) { + if($link->parentNode->tagName == 'head') { + if($link->getAttribute('rel') == 'stylesheet') + $this->addReport($link); + } + } + } +} + +/** +* Checks that all color and background elements has stufficient contrast. +* +* @link http://quail-lib.org/test-info/cssTextHasContrast +*/ +class cssTextHasContrast extends quailColorTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $default_background The default background color + */ + var $default_background = '#ffffff'; + + /** + * @var string $default_background The default background color + */ + var $default_color = '#000000'; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + if(isset($this->options['css_background'])) { + $this->default_background = $this->options['css_background']; + } + if(isset($this->options['css_foreground'])) { + $this->default_color = $this->options['css_foreground']; + } + $xpath = new DOMXPath($this->dom); + $entries = $xpath->query('//*'); + foreach($entries as $element) { + $style = $this->css->getStyle($element); + if((isset($style['background']) || isset($style['background-color'])) && isset($style['color']) && $element->nodeValue) { + $background = (isset($style['background-color'])) + ? $style['background-color'] + : $style['background']; + if(!$background || $this->options['css_only_use_default']) { + $background = $this->default_background; + } + $luminosity = $this->getLuminosity( + $style['color'], + $background + ); + if($luminosity < 5) { + $this->addReport($element, 'background: '. $background .' fore: '. $style['color'] . ' lum: '. $luminosity); + } + } + } + + } + +} + +/** +* HTML content has a valid doctype declaration. +* Each document must contain a valid doctype declaration. +* @link http://quail-lib.org/test-info/doctypeProvided +*/ +class doctypeProvided extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + if(!$this->dom->doctype->publicId) + $this->addReport(null, null, false); + } + +} + +/** +* Abbreviations must be marked with abbr element. +* If body element content is greater than 10 characters (English) this error will be generated. +* @link http://quail-lib.org/test-info/documentAbbrIsUsed +*/ +class documentAbbrIsUsed extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var string $acronym_tag The tag that is considered an acronym + */ + var $acronym_tag = 'abbr'; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements($this->acronym_tag) as $acronym) { + $predefined[strtoupper(trim($acronym->nodeValue))] = $acronym->getAttribute('title'); + } + $already_reported = array(); + foreach($this->getAllElements(null, 'text') as $text) { + + $words = explode(' ', $text->nodeValue); + if(count($words) > 1 && strtoupper($text->nodeValue) != $text->nodeValue) { + foreach($words as $word) { + $word = preg_replace("/[^a-zA-Zs]/", "", $word); + if(strtoupper($word) == $word && strlen($word) > 1 && !isset($predefined[strtoupper($word)])) + + if(!isset($already_reported[strtoupper($word)])) { + $this->addReport($text, 'Word "'. $word .'" requires an '. $this->acronym_tag .' tag.'); + } + $already_reported[strtoupper($word)] = true; + } + } + } + + } + +} + +/** +* Acronyms must be marked with acronym element. This is the same as the 'abbr' test, but +* looks for ACRONYM elements +* If body element content is greater than 10 characters (English) then this error will be generated. +* @link http://quail-lib.org/test-info/documentAcronymsHaveElement +*/ +class documentAcronymsHaveElement extends documentAbbrIsUsed { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var string $acronym_tag The tag to be searched for as an acronym + */ + var $acronym_tag = 'acronym'; +} + +/** +* All text colors or no text colors are set. +* If the author specifies that the text must be black, then it may override the settings of the user agent and render a page that has black text (specified by the author) on black background (that was set in the user agent). +* @link http://quail-lib.org/test-info/documentAllColorsAreSet +*/ +class documentAllColorsAreSet extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var array $color_attributes An array of all the attributes which are considered + * for computing color + */ + var $color_attributes = array('text', 'bgcolor', 'link', 'alink', 'vlink'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $body = $this->getAllElements('body'); + $body = $body[0]; + if($body) { + $colors = 0; + foreach($this->color_attributes as $attribute) { + if($body->hasAttribute($attribute)) + $colors++; + } + if($colors > 0 && $colors < 5) + $this->addReport(null, null, false); + } + } +} + +/** +* Auto-redirect must not be used. +* meta elements that contain a http-equiv attribute with a value of "refresh" cannot contain a content attribute with a value of (start, case insensitive) "http://". +* @link http://quail-lib.org/test-info/documentAutoRedirectNotUsed +*/ +class documentAutoRedirectNotUsed extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('meta') as $meta) { + if($meta->getAttribute('http-equiv') == 'refresh' && !$meta->hasAttribute('content')) + $this->addReport($meta); + } + + } +} + +/** +* The contrast between active link text and background color is greater than WAI ERT color algorithm threshold. +* The contrast between active link text and background color must be greater than the WAI ERT color algorithm threshold. +* @link http://quail-lib.org/test-info/documentColorWaiActiveLinkAlgorithim +*/ +class documentColorWaiActiveLinkAlgorithim extends bodyWaiErtColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $foreground The type of item that should be checked for contrast in the foreground + */ + var $foreground = 'alink'; +} + +/** +* The contrast between text and background colors is greater than WAI ERT color algorithm threshold. +* The contrast between text and background color must be greater than the WAI ERT color algorithm threshold. +* @link http://quail-lib.org/test-info/documentColorWaiAlgorithim +*/ +class documentColorWaiAlgorithim extends bodyWaiErtColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + +} + +/** +* The contrast between link text and background color is greater than WAI ERT color algorithm threshold. +* The contrast between link text and background color must be greater than the WAI ERT color algorithm threshold. +* @link http://quail-lib.org/test-info/documentColorWaiLinkAlgorithim +*/ +class documentColorWaiLinkAlgorithim extends bodyWaiErtColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $foreground The type of item that should be checked for contrast in the foreground + */ + var $foreground = 'link'; +} + +/** +* The contrast between visited link text and background color is greater than WAI ERT color algorithm threshold. +* The contrast between visited link text and background color must be greater than the WAI ERT color algorithm threshold. +* @link http://quail-lib.org/test-info/documentColorWaiVisitedLinkAlgorithim +*/ +class documentColorWaiVisitedLinkAlgorithim extends bodyWaiErtColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $foreground The type of item that should be checked for contrast in the foreground + */ + var $foreground = 'vlink'; +} + +/** +* Content must be readable when stylesheets are not applied. +* The first occurrence of any element that contains a style attribute will generate this error. +* @link http://quail-lib.org/test-info/documentContentReadableWithoutStylesheets +*/ +class documentContentReadableWithoutStylesheets extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(null, 'text') as $text) { + if($text->hasAttribute('style')) { + $this->addReport(null, null, false); + return false; + } + } + + } +} + +/** +* Document contains a title element. +* title element must be present in head section of document. +* @link http://quail-lib.org/test-info/documentHasTitleElement +*/ +class documentHasTitleElement extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + + $element = $this->dom->getElementsByTagName('title'); + if(!$element->item(0)) + $this->addReport(null, null, false); + + } +} + +/** +* id attributes must be unique. +* Each id attribute value must be unique. +* @link http://quail-lib.org/test-info/documentIDsMustBeUnique +*/ +class documentIDsMustBeUnique extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $xpath = new DOMXPath($this->dom); + $entries = $xpath->query('//*'); + $ids = array(); + foreach($entries as $element) { + if($element->hasAttribute('id')) + $ids[$element->getAttribute('id')][] = $element; + } + if(count($ids) > 0) { + foreach($ids as $id) { + if(count($id) > 1) + $this->addReport($id[1]); + } + } + } +} + +/** +* Document has valid language code. +* html element must have a lang attribute value of valid 2 or 3 letter language code according to ISO specification 639. +* @link http://quail-lib.org/test-info/documentLangIsISO639Standard +*/ +class documentLangIsISO639Standard extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $languages = file(dirname(__FILE__).'/resources/iso639.txt'); + + $element = $this->dom->getElementsByTagName('html'); + $html = $element->item(0); + if(!$html) + return null; + if($html->hasAttribute('lang')) + if(in_array(strtolower($html->getAttribute('lang')), $languages)) + $this->addReport(null, null, false); + + } +} + +/** +* Document has required lang attribute(s). +* html element must contain a lang attribute. +* @link http://quail-lib.org/test-info/documentLangNotIdentified +*/ +class documentLangNotIdentified extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $element = $this->dom->getElementsByTagName('html'); + $html = $element->item(0); + if(!$html) return null; + if(!$html->hasAttribute('lang') || trim($html->getAttribute('lang')) == '') + $this->addReport(null, null, false); + + } +} + +/** +* Meta refresh is not used with a time-out. +* meta elements that contain a http-equiv attribute with a value of "refresh" cannot contain a content attribute with a value of any number greater than zero. +* @link http://quail-lib.org/test-info/documentMetaNotUsedWithTimeout +*/ +class documentMetaNotUsedWithTimeout extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('meta') as $meta) { + if($meta->getAttribute('http-equiv') == 'refresh' && !$meta->getAttribute('content')) + $this->addReport($meta); + } + + } +} + +/** +* The reading direction of all text is correctly marked. +* The reading direction of all text is correctly marked. +*/ + + +/** +* All changes in text direction are marked using the dir attribute. +* Identify changes in the text direction of text that includes nested directional runs by providing the dir attribute on inline elements. A nested directional run is a run of text that includes mixed directional text, for example, a paragraph in English containing a quoted Hebrew sentence which in turn includes a quotation in French. +* @link http://quail-lib.org/test-info/documentReadingDirection +*/ +class documentReadingDirection extends quailTest { + + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var array $right_to_left The language codes that are considered right-to-left + */ + var $right_to_left = array('he', 'ar'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $xpath = new DOMXPath($this->dom); + $entries = $xpath->query('//*'); + foreach($entries as $element) { + if(in_array($element->getAttribute('lang'), $this->right_to_left)) { + + if($element->getAttribute('dir') != 'rtl') + $this->addReport($element); + } + } + } +} + +/** +* Strict doctype is declared. +* A 'strict' doctype must be declared in the document. This can either be the HTML4.01 or XHTML 1.0 strict doctype. +* @link http://quail-lib.org/test-info/documentStrictDocType +*/ +class documentStrictDocType extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + if(strpos(strtolower($this->dom->doctype->publicId), 'strict') === false + && strpos(strtolower($this->dom->doctype->systemId), 'strict') === false) + $this->addReport(null, null, false); + } +} + +/** +* title describes the document. +* This error is generated for each title element. +* @link http://quail-lib.org/test-info/documentTitleDescribesDocument +*/ +class documentTitleDescribesDocument extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $placeholders = file(dirname(__FILE__).'/resources/placeholder.txt'); + $element = $this->dom->getElementsByTagName('title'); + $title = $element->item(0); + if($title) { + $this->addReport($title); + } + } +} + +/** +* title is not placeholder text. +* title element content can not be any one of (case insensitive) \"the title\"" +* @link http://quail-lib.org/test-info/documentTitleIsNotPlaceholder +*/ +class documentTitleIsNotPlaceholder extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $placeholders = file(dirname(__FILE__).'/resources/placeholder.txt'); + $element = $this->dom->getElementsByTagName('title'); + $title = $element->item(0); + if($title) { + if(in_array(strtolower($title->nodeValue), $placeholders)) + $this->addReport(null, null, false); + } + } +} + +/** +* title is short. +* title element content must be less than 150 characters (English). +* @link http://quail-lib.org/test-info/documentTitleIsShort +*/ +class documentTitleIsShort extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + + $element = $this->dom->getElementsByTagName('title'); + $title = $element->item(0); + if($title) { + if(strlen($title->nodeValue)> 150) + $this->addReport(null, null, false); + } + } +} + +/** +* title contains text. +* title element content cannot be empty or whitespace. +* @link http://quail-lib.org/test-info/documentTitleNotEmpty +*/ +class documentTitleNotEmpty extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + + $element = $this->dom->getElementsByTagName('title'); + if($element->length > 0) { + $title = $element->item(0); + if(trim($title->nodeValue) == '') + $this->addReport(null, null, false); + } + } +} + +/** +* Document validates to specification. +* Document must validate to declared doctype. +* @link http://quail-lib.org/test-info/documentValidatesToDocType +*/ +class documentValidatesToDocType extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + if(!@$this->dom->validate()) + $this->addReport(null, null, false); + } +} + +/** +* All visual lists are marked. +* Create lists of related items using list elements appropriate for their purposes. +* @link http://quail-lib.org/test-info/documentVisualListsAreMarkedUp +*/ +class documentVisualListsAreMarkedUp extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $list_cues Things that might be considered to be part of a list + */ + var $list_cues = array('*', '
*', '•', '•'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(null, 'text') as $text) { + foreach($this->list_cues as $cue) { + $first = stripos($text->nodeValue, $cue); + $second = strripos($text->nodeValue, $cue); + if($first && $second && $first != $second) + $this->addReport($text); + } + } + + } +} + +/** +* Words and phrases not in the document's primary language are marked. +* If the body element contains more than 10 characters (English) then this error will be generated. +* @link http://quail-lib.org/test-info/documentWordsNotInLanguageAreMarked +*/ +class documentWordsNotInLanguageAreMarked extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $body = $this->getAllElements('body'); + if(!isset($body[0])) { + return false; + } + $body = $body[0]; + if(!is_object($body)) { + return false; + } + if(!property_exists($body, 'nodeValue')) { + return false; + } + $words = explode(' ', $body->nodeValue); + + if(count($words) > 10) + $this->addReport(null, null, false); + } +} + +/** +* All embed elements have an associated noembed element that contains a text equivalent to the embed element. +* Provide a text equivalent for the embed element. +* @link http://quail-lib.org/test-info/embedHasAssociatedNoEmbed +*/ +class embedHasAssociatedNoEmbed extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('embed') as $embed) { + if(!$this->propertyIsEqual($embed->firstChild, 'tagName', 'noembed') + && !$this->propertyIsEqual($embed->nextSibling, 'tagName', 'noembed')) { + $this->addReport($embed); + } + + } + } +} + +/** +* embed must have alt attribute. +* embed element must have an alt attribute. +* @link http://quail-lib.org/test-info/embedMustHaveAltAttribute +*/ +class embedMustHaveAltAttribute extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('embed') as $embed) { + if(!$embed->hasAttribute('alt')) + $this->addReport($embed); + + } + } +} + +/** +* embed must not have empty Alt text. +* embed element cannot have alt attribute value of null ("") or whitespace. +* @link http://quail-lib.org/test-info/embedMustNotHaveEmptyAlt +*/ +class embedMustNotHaveEmptyAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('embed') as $embed) { + if($embed->hasAttribute('alt') && trim($embed->getAttribute('alt')) == '') + $this->addReport($embed); + + } + } +} + +/** +* embed provides a keyboard mechanism to return focus to the parent window. +* Ensure that keyboard users do not become trapped in a subset of the content that can only be exited using a mouse or pointing device. +* @link http://quail-lib.org/test-info/embedProvidesMechanismToReturnToParent +*/ +class embedProvidesMechanismToReturnToParent extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'embed'; +} + +/** +* Excessive use of emoticons. +* This error is generated if 4 or more emoticons are detected. [Editor's Note - how are emoticons detected?] +* @link http://quail-lib.org/test-info/emoticonsExcessiveUse +*/ +class emoticonsExcessiveUse extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $emoticons = file(dirname(__FILE__).'/resources/emoticons.txt', FILE_IGNORE_NEW_LINES); + $count = 0; + foreach($this->getAllElements(null, 'text') as $element) { + if(strlen($element->nodeValue < 2)) { + $words = explode(' ', $element->nodeValue); + foreach($words as $word) { + if(in_array($word, $emoticons)) { + $count++; + if($count > 4) { + $this->addReport(null, null, false); + return false; + } + } + } + + } + } + + } +} + +class emoticonsMissingAbbr extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $emoticons = file(dirname(__FILE__).'/resources/emoticons.txt', FILE_IGNORE_NEW_LINES); + $count = 0; + foreach($this->getAllElements('abbr') as $abbr) { + $abbreviated[$abbr->nodeValue] = $abbr->getAttribute('title'); + } + foreach($this->getAllElements(null, 'text') as $element) { + if(strlen($element->nodeValue < 2)) { + $words = explode(' ', $element->nodeValue); + foreach($words as $word) { + if(in_array($word, $emoticons)) { + if(!isset($abbreviated[$word])) + $this->addReport($element); + } + } + + } + } + + } +} + +/** +* All input elements, type of "file", have an explicitly associated label. +* input element that contains a type attribute value of "file" must have an associated label element. An associated label is one in which the for attribute value of the label element is the same as the id attribute value of the input element. +* @link http://quail-lib.org/test-info/fileHasLabel +*/ +class fileHasLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'file'; + + /** + * @var bool $no_type We are not looking at the type of input here + */ + var $no_type = false; +} + +/** +* All input elements, type of "file", have a label that is positioned close to the control. +* input element with a type attribute value of "file" must have an associated label element positioned close to it. +* @link http://quail-lib.org/test-info/fileLabelIsNearby +*/ +class fileLabelIsNearby extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'file') + $this->addReport($input); + + } + } +} + +/** +* font must not be used. +* This error is generated for all font elements. +* @link http://quail-lib.org/test-info/fontIsNotUsed +*/ +class fontIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'font'; +} + +class formAllowsCheckIfIrreversable extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'form'; +} + +/** +* Information deleted using a web page can be recovered. +* Help users with disabilities avoid serious consequences as the result of a mistake when performing an action that cannot be reversed. +* @link http://quail-lib.org/test-info/formDeleteIsReversable +*/ +class formDeleteIsReversable extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('delete', 'remove', 'erase'), + 'es' => array('borrar', 'eliminar', 'suprimir'), + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'submit') { + foreach($this->translation() as $word) { + if(strpos(strtolower($input->getAttribute('value')), $word) !== false) + $this->addReport($this->getParent($input, 'form', 'body')); + } + } + } + } +} + +/** +* Form submission data is presented to the user before final acceptance for all irreversable transactions. +* Provide users with a way to ensure their input is correct before completing an irreversible transaction. +* @link http://quail-lib.org/test-info/formErrorMessageHelpsUser +*/ +class formErrorMessageHelpsUser extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'form'; +} + +/** +* All form submission error messages provide assistance in correcting the error. +* Information about the nature and location of the input error is provided in text to enable the users to identify the problem. +* @link http://quail-lib.org/test-info/formHasGoodErrorMessage +*/ +class formHasGoodErrorMessage extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'form'; +} + + +/** +* All form fields that are required are indicated to the user as required. +* Ensure that the label for any interactive component within Web content makes the component's purpose clear. +* @link http://quail-lib.org/test-info/formWithRequiredLabel +*/ +class formWithRequiredLabel extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var array $suspect_styles A list of CSS styles which might mean this is label text + */ + var $suspect_styles = array('font-weight', 'color'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $labels = array(); + foreach($this->getAllElements('label') as $label) { + $labels[] = $label; + if(strpos($label->nodeValue, '*') !== false) { + if($input = $this->dom->getElementById($label->getAttribute('for'))) { + if(!$input->hasAttribute('aria-required') || + strtolower($input->getAttribute('aria-required')) != 'true') { + $this->addReport($label); + } + } + else { + $this->addReport($label); + } + } + } + $styles = array(); + foreach($labels as $k => $label) { + //Now we check through all the labels and see if any are + //colored different than the others + $styles[$k] = $this->css->getStyle($label); + if($this->elementHasChild($label, 'strong') || $this->elementHasChild($label, 'b')) { + $styles[$k]['font-weight'] = 'bold'; + } + if($k) { + foreach($this->suspect_styles as $style) { + if($styles[$k][$style] != $styles[($k - 1)][$style]) { + $form = $this->getElementAncestor($label, 'form'); + if($form) { + $this->addReport($form); + } + else { + $this->addReport($label); + } + } + } + } + } + } +} + +/** +* frame element is not used. +* This error is generated for all frame elements. +* @link http://quail-lib.org/test-info/frameIsNotUsed +*/ +class frameIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'frame'; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + +} + +/** +* Relationship between frames must be described. +* If frameset element contains 3 or more frame elements then frameset element must contain a longdesc attribute that is a valid URL. +* @link http://quail-lib.org/test-info/frameRelationshipsMustBeDescribed +*/ +class frameRelationshipsMustBeDescribed extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frameset') as $frameset) { + + if(!$frameset->hasAttribute('longdesc') && $frameset->childNodes->length > 2) + $this->addReport($frameset); + } + } + +} + +/** +* The source for each frame is accessible content. +* frame content should be accessible, like HTML, not just an image. +* @link http://quail-lib.org/test-info/frameSrcIsAccessible +*/ +class frameSrcIsAccessible extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frame') as $frame) { + if($frame->hasAttribute('src')) { + $extension = array_pop(explode('.', $frame->getAttribute('src'))); + if(in_array($extension, $this->image_extensions)) + $this->addReport($frame); + + } + } + } + +} + +/** +* All frame titles identify the purpose or function of the frame. +* frame title must describe the purpose or function of the frame. +* @link http://quail-lib.org/test-info/frameTitlesDescribeFunction +*/ +class frameTitlesDescribeFunction extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frame') as $frame) { + if($frame->hasAttribute('title')) + $this->addReport($frame); + } + } + +} + +/** +* All frame titles are not empty. +* frame title can't be empty. +* @link http://quail-lib.org/test-info/frameTitlesNotEmpty +*/ +class frameTitlesNotEmpty extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frame') as $frame) { + if(!$frame->hasAttribute('title') || trim($frame->getAttribute('title')) == '') + $this->addReport($frame); + } + } +} + +/** +* All frame titles do not contain placeholder text. +* frame title should not contain placeholder text. +* @link http://quail-lib.org/test-info/frameTitlesNotPlaceholder +*/ +class frameTitlesNotPlaceholder extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('title', 'frame', 'frame title', 'the title'), + 'es' => array('título', 'marco', 'título del marco', 'el título'), + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frame') as $frame) { + if(in_array(trim(strtolower($frame->getAttribute('title'))), $this->translation())) + $this->addReport($frame); + } + } + +} + +/** +* All frames have a title attribute. +* Each frame element must have a title attribute. +* @link http://quail-lib.org/test-info/framesHaveATitle +*/ +class framesHaveATitle extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frame') as $frame) { + if(!$frame->hasAttribute('title')) + $this->addReport($frame); + } + } + +} + +/** +* frameset element is not used. +* This error is generated for all frameset elements. +* @link http://quail-lib.org/test-info/framesetIsNotUsed +*/ +class framesetIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'frameset'; +} + +/** +* frameset must have a noframes section. +* frameset element must contain a noframes section. +* @link http://quail-lib.org/test-info/framesetMustHaveNoFramesSection +*/ +class framesetMustHaveNoFramesSection extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frameset') as $frameset) { + if(!$this->elementHasChild($frameset, 'noframes')) + $this->addReport($frameset); + } + } + +} + +/** +* The header following an h1 is h1 or h2. +* The following header must be equal, one level greater or any level less. +* @link http://quail-lib.org/test-info/headerH1 +*/ +class headerH1 extends quailHeaderTest { + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h1'; + +} + +/** +* All h1 elements are not used for formatting. +* h1 may be used for formatting. Use the proper markup. +* @link http://quail-lib.org/test-info/headerH1Format +*/ +class headerH1Format extends quailTagTest{ + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h1'; +} + +/** +* The header following an h2 is h1, h2 or h3. +* The following header must be equal, one level greater or any level less. +* @link http://quail-lib.org/test-info/headerH2 +*/ +class headerH2 extends quailHeaderTest { + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h2'; + +} + +/** +* All h2 elements are not used for formatting. +* h2 may be used for formatting. Use the proper markup. +* @link http://quail-lib.org/test-info/headerH2Format +*/ +class headerH2Format extends quailTagTest{ + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h2'; +} + +/** +* The header following an h3 is h1, h2, h3 or h4. +* The following header must be equal, one level greater or any level less. +* @link http://quail-lib.org/test-info/headerH3 +*/ +class headerH3 extends quailHeaderTest { + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h3'; + +} + +/** +* All h3 elements are not used for formatting. +* h3 may be used for formatting. Use the proper markup. +* @link http://quail-lib.org/test-info/headerH3Format +*/ +class headerH3Format extends quailTagTest{ + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h3'; +} + +/** +* The header following an h5 is h6 or any header less than h6. +* The following header must be equal, one level greater or any level less. +* @link http://quail-lib.org/test-info/headerH4 +*/ +class headerH4 extends quailHeaderTest { + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h4'; + +} + +/** +* All h4 elements are not used for formatting. +* h4 may be used for formatting. Use the proper markup. +* @link http://quail-lib.org/test-info/headerH4Format +*/ +class headerH4Format extends quailTagTest{ + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h4'; +} + +class headerH5 extends quailHeaderTest { + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h5'; + +} + +/** +* All h5 elements are not used for formatting. +* h5 may be used for formatting. Use the proper markup. +* @link http://quail-lib.org/test-info/headerH5Format +*/ +class headerH5Format extends quailTagTest{ + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h5'; +} + +/** +* All h6 elements are not used for formatting. +* h6 may be used for formatting. Use the proper markup. +* @link http://quail-lib.org/test-info/headerH6Format +*/ +class headerH6Format extends quailTagTest{ + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h6'; +} + +/** +* Each section of content is marked with a header element. +* Using the heading elements, h and h1 - h6, to markup the beginning of each section in the content can assist in navigation. +* @link http://quail-lib.org/test-info/headersUseToMarkSections +*/ +class headersUseToMarkSections extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var array $non_header_tags An array of all tags which might make this a header + */ + var $non_header_tags = array('strong', 'b', 'em', 'i'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $headers = $this->getAllElements(null, 'header'); + $paragraphs = $this->getAllElements('p'); + if(count($headers) == 0 && count($paragraphs) > 1) + $this->addReport(null, null, false); + foreach($paragraphs as $p) { + if((is_object($p->firstChild) + && property_exists($p->firstChild, 'tagName') + && in_array($p->firstChild->tagName, $this->non_header_tags) + && trim($p->nodeValue) == trim($p->firstChild->nodeValue)) + || (is_object($p->firstChild->nextSibling) + && property_exists($p->firstChild->nextSibling, 'tagName') + && in_array($p->firstChild->nextSibling->tagName, $this->non_header_tags) + && trim($p->nodeValue) == trim($p->firstChild->nextSibling->nodeValue)) + || (is_object($p->previousSibling) + && property_exists($p->previousSibling, 'tagName') + && in_array($p->previousSibling->tagName, $this->non_header_tags) + && trim($p->nodeValue) == trim($p->previousSibling->nodeValue))) + $this->addReport($p); + } + } +} + +/** +* i (italic) element is not used. +* This error will be generated for all i elements. +* @link http://quail-lib.org/test-info/iIsNotUsed +*/ +class iIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'i'; +} + +/** +* iframe must not use longdesc. +* Iframe element cannot contain a longdesc attribute. +* @link http://quail-lib.org/test-info/iframeMustNotHaveLongdesc +*/ +class iframeMustNotHaveLongdesc extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('iframe') as $iframe) { + if($iframe->hasAttribute('longdesc')) + $this->addReport($iframe); + + } + } +} + +/** +* All active areas in all server-side image maps have duplicate text links in the document. +* Any img element that contains ismap attribute will generate this error. +* @link http://quail-lib.org/test-info/imageMapServerSide +*/ +class imageMapServerSide extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('ismap')) + $this->addReport($img); + } + + } +} + +/** +* Alt text for all img elements is the empty string ("") if the image is decorative. +* Decorative images must have empty string ("") Alt text. +* @link http://quail-lib.org/test-info/imgAltEmptyForDecorativeImages +*/ +class imgAltEmptyForDecorativeImages extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('alt')) + $this->addReport($img); + } + } + +} + +/** +* Alt text for all img elements used as source anchors identifies the destination of the link. +* img element that is contained by an a (anchor) element must have Alt text that identifies the link destination. +* @link http://quail-lib.org/test-info/imgAltIdentifiesLinkDestination +*/ +class imgAltIdentifiesLinkDestination extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(!$a->nodeValue) { + foreach($a->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'img') + && $child->hasAttribute('alt')) { + $this->addReport($child); + } + } + } + } + + } +} + +/** +* Alt text is not the same as the filename unless author has confirmed it is correct. +* img element cannot have alt attribute value that is the same as its src attribute. +* @link http://quail-lib.org/test-info/imgAltIsDifferent +*/ +class imgAltIsDifferent extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if(trim($img->getAttribute('src')) == trim($img->getAttribute('alt'))) + $this->addReport($img); + } + } + +} + +/** +* Alt text for all img elements contains all text in the image unless the image text is decorative or appears elsewhere in the document. +* This error is generated for all img elements that have a width and height greater than 50. +* @link http://quail-lib.org/test-info/imgAltIsSameInText +*/ +class imgAltIsSameInText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('alt')) + $this->addReport($img); + } + + } +} + +/** +* Image Alt text is long. +* Image Alt text is long or user must confirm that Alt text is as short as possible. +* @link http://quail-lib.org/test-info/imgAltIsTooLong +*/ +class imgAltIsTooLong extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('alt') && strlen($img->getAttribute('alt')) > 100) + $this->addReport($img); + } + + } +} + +/** +* Alt text for all img elements used as source anchors is not empty when there is no other text in the anchor. +* img element cannot have alt attribute value of null or whitespace if the img element is contained by an A element and there is no other link text. +* @link http://quail-lib.org/test-info/imgAltNotEmptyInAnchor +*/ +class imgAltNotEmptyInAnchor extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(!$a->nodeValue && $a->childNodes) { + foreach($a->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'img') + && trim($child->getAttribute('alt')) == '') + $this->addReport($child); + } + } + } + + } +} + +/** +* Alt text for all img elements is not placeholder text unless author has confirmed it is correct. +* img element cannot have alt attribute value of "nbsp" or "spacer". +* @link http://quail-lib.org/test-info/imgAltNotPlaceHolder +*/ +class imgAltNotPlaceHolder extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('nbsp', ' ', 'spacer', 'image', 'img', 'photo'), + 'es' => array('nbsp', ' ', 'spacer', 'espacio', 'imagen', 'img', 'foto') + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('alt')) { + if(strlen($img->getAttribute('alt')) > 0) { + if(in_array($img->getAttribute('alt'), $this->translation()) + || ord($img->getAttribute('alt')) == 194) { + $this->addReport($img); + } + elseif(preg_match("/^([0-9]*)(k|kb|mb|k bytes|k byte)?$/", + strtolower($img->getAttribute('alt')))) { + $this->addReport($img); + } + } + } + } + + } +} + +/** +* All img elements have associated images that do not flicker. +* This error is generated for all img elements that contain a src attribute value that ends with ".gif" (case insensitive). and have a width and height larger than 25. +* @link http://quail-lib.org/test-info/imgGifNoFlicker +*/ +class imgGifNoFlicker extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $gif_control_extension Regular expression for retrieving the GIF + * control extension + */ + var $gif_control_extension = "/21f904[0-9a-f]{2}([0-9a-f]{4})[0-9a-f]{2}00/"; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + + if(substr($img->getAttribute('src'), -4, 4) == '.gif') { + $file = $this->getImageContent($this->getPath($img->getAttribute('src'))); + if($file) { + $file = bin2hex($file); + + // sum all frame delays + $total_delay = 0; + preg_match_all($this->gif_control_extension, $file, $matches); + foreach ($matches[1] as $match) { + // convert little-endian hex unsigned ints to decimals + $delay = hexdec(substr($match,-2) . substr($match, 0, 2)); + if ($delay == 0) $delay = 1; + $total_delay += $delay; + } + + // delays are stored as hundredths of a second, lets convert to seconds + + + if($total_delay > 0) + $this->addReport($img); + } + } + } + + } + + /** + * Retrieves the content of an image + * @param string $image The URL to an image + */ + function getImageContent($image) { + if(strpos($image, '://') == false) { + return @file_get_contents($image); + } + if(function_exists('curl')) { + $curl = new curl_init($image); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + $result = curl_exec($curl); + return $result; + } + return false; + } +} + +/** +* All img elements must have an alt attribute. Duh! +* @link http://quail-lib.org/test-info/imgHasAlt +*/ +class imgHasAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if(!$img->hasAttribute('alt')) + $this->addReport($img); + } + + } +} + +/** +* A long description is used for each img element that does not have Alt text conveying the same information as the image. +* img element must contain a longdesc attribute. +* @link http://quail-lib.org/test-info/imgHasLongDesc +*/ +class imgHasLongDesc extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('longdesc')) { + if(trim(strtolower($img->getAttribute('longdesc'))) == + trim(strtolower($img->getAttribute('alt')))) { + $this->addReport($img); + } + } + } + + } +} + +/** +* Important images should not have spacer Alt text. +* img element cannot have alt attribute value of whitespace if WIDTH and HEIGHT attribute values are both greater than 25. +* @link http://quail-lib.org/test-info/imgImportantNoSpacerAlt +*/ +class imgImportantNoSpacerAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('src') && $img->hasAttribute('alt') && trim($img->getAttribute('alt')) == '') { + if($img->getAttribute('width') > 25 || $img->getAttribute('height') > 25) { + $this->addReport($img); + } + elseif(function_exists('gd_info') && (!$img->hasAttribute('width') || !$img->hasAttribute('height'))) { + $img_file = @getimagesize($this->getPath($img->getAttribute('src'))); + if($img_file) { + if($img_file[0] > 25 || $img_file[1] > 25) + $this->addReport($img); + } + } + } + + } + + } +} + +/** +* All links in all client side image-maps are duplicated within the document. +* img element must not contain a usemap attribute unless all links in the MAP are duplicated within the document. The MAP element is referred by the USEMAP element's usemap attribute. Links within MAP are referred by area elements href attribute contained by MAP element. [Editor's Note - can duplicate links appear anywhere within content or must they be part of a link group?] +* @link http://quail-lib.org/test-info/imgMapAreasHaveDuplicateLink +*/ +class imgMapAreasHaveDuplicateLink extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $all_links = array(); + foreach($this->getAllElements('a') as $a) { + $all_links[$a->getAttribute('href')] = $a->getAttribute('href'); + } + $maps = $this->getElementsByAttribute('map', 'name', true); + + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('usemap')) { + $usemap = $img->getAttribute('usemap'); + if(substr($usemap, 0, 1) == '#') { + $key = substr($usemap, -(strlen($usemap) - 1), (strlen($usemap) - 1)); + } + else { + $key = $usemap; + } + if(isset($maps[$key])) { + foreach($maps[$key]->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'area')) { + if(!isset($all_links[$child->getAttribute('href')])) { + $this->addReport($img); + } + } + } + } + } + } + + } +} + +/** +* All img elements that have a longdesc attribute also have an associated 'd-link'. +* img element that contains a longdesc attribute must have a following d-link. A d-link must consist of an A element that contains only the text "d" or "D". The A element must have an href attribute that is a valid URL and is the same as the img element's longdesc attribute. The d-link must immediately follow the img element, separated only by whitespace. +* @link http://quail-lib.org/test-info/imgNeedsLongDescWDlink +*/ +class imgNeedsLongDescWDlink extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('longdesc')) { + $next = $this->getNextElement($img); + + if(is_object($next) && $next->tagName != 'a') { + $this->addReport($img); + } + else { + if(((!$this->propertyIsEqual($next, 'nodeValue', '[d]', true, true) + && !$this->propertyIsEqual($next, 'nodeValue', 'd', true, true)) ) + || $next->getAttribute('href') != $img->getAttribute('longdesc')) { + $this->addReport($img); + } + } + + } + } + + } +} + +/** +* Non-Decorative images must have Alt text. +* img element cannot have alt attribute value of null ("") if WIDTH and HEIGHT attribute values are both greater than 25. +* @link http://quail-lib.org/test-info/imgNonDecorativeHasAlt +*/ +class imgNonDecorativeHasAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('src') && + ($img->hasAttribute('alt') && html_entity_decode((trim($img->getAttribute('alt')))) == '')) { + $this->addReport($img); + + } + } + + } +} + +/** +* For all img elements, text does not refer to the image by color alone. +* This error is generated for all img elements that have a width and height greater than 100. +* @link http://quail-lib.org/test-info/imgNotReferredToByColorAlone +*/ +class imgNotReferredToByColorAlone extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('alt')) + $this->addReport($img); + } + + } +} + +/** +* Server-side image maps are not used except when image map regions cannot be defined using an available geometric shape. +* A server-side image map should only be used when a client-side image map can not be used. +* @link http://quail-lib.org/test-info/imgServerSideMapNotUsed +*/ +class imgServerSideMapNotUsed extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('ismap')) + $this->addReport($img); + } + } +} + +/** +* All img elements do not contain a title attribute. +* img element must not contain the title attribute. +* @link http://quail-lib.org/test-info/imgShouldNotHaveTitle +*/ +class imgShouldNotHaveTitle extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('title')) + $this->addReport($img); + } + + } +} + +/** +* All img elements with an ismap attribute have a valid usemap attribute. +* img element may not contain an ismap attribute. +* @link http://quail-lib.org/test-info/imgWithMapHasUseMap +*/ +class imgWithMapHasUseMap extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('ismap') && !$img->hasAttribute('usemap')) + $this->addReport($img); + } + + } +} + +/** +* All img elements with images containing math expressions have equivalent MathML markup. +* This error is generated for all img elements that have a width and height greater than 100. +* @link http://quail-lib.org/test-info/imgWithMathShouldHaveMathEquivalent +*/ +class imgWithMathShouldHaveMathEquivalent extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if(($img->getAttribute('width') > 100 + || $img->getAttribute('height') > 100 ) + && (!$this->propertyIsEqual($img->nextSibling, 'tagName', 'math'))) { + $this->addReport($img); + } + + } + } +} + +/** +* All input elements, type of "checkbox", have a valid tab index. +* input element that contains a type attribute value of "checkbox" must have a tabindex attribute. +* @link http://quail-lib.org/test-info/inputCheckboxHasTabIndex +*/ +class inputCheckboxHasTabIndex extends inputTabIndex { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'checkbox'; +} + +/** +* All checkbox groups are marked using fieldset and legend elements. +* form element content must contain both fieldset and legend elements if there are related checkbox buttons. +* @link http://quail-lib.org/test-info/inputCheckboxRequiresFieldset +*/ +class inputCheckboxRequiresFieldset extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'checkbox') { + if(!$this->getParent($input, 'fieldset', 'body')) + $this->addReport($input); + + } + } + } +} + +/** +* input should not use color alone. +* All input elements, except those with a type of "hidden", will generate this error. +* @link http://quail-lib.org/test-info/inputDoesNotUseColorAlone +*/ +class inputDoesNotUseColorAlone extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') != 'hidden') + $this->addReport($input); + } + } + +} + +/** +* All input elements, except those with with a type attribute value of "image", do not have an alt attribute. +* The input element is used to create many kinds of form controls. Although the HTML DTD permits the alt attribute on all of these, it should be used only on image submit buttons. User agent support for this attribute on other types of form controls is not well defined, and other mechanisms are used to label these controls. +* @link http://quail-lib.org/test-info/inputElementsDontHaveAlt +*/ +class inputElementsDontHaveAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') != 'image' && $input->hasAttribute('alt')) + $this->addReport($input); + } + } +} + +/** +* All input elements, type of "file", have a valid tab index. +* input element that contains a type attribute value of "file" must have a tabindex attribute. +* @link http://quail-lib.org/test-info/inputFileHasTabIndex +*/ +class inputFileHasTabIndex extends inputTabIndex { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'file'; +} + +/** +* Alt text for all input elements with a type attribute value of "image" identifies the purpose or function of the image. +* input element with type of "image" must have Alt text that identifies the purpose or function of the image. +* @link http://quail-lib.org/test-info/inputImageAltIdentifiesPurpose +*/ +class inputImageAltIdentifiesPurpose extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image') + $this->addReport($input); + } + } + +} + +/** +* Image used in input element - Alt text should not be the same as the filename. +* input elements cannot have alt attribute values that are the same as their src attribute values. +* @link http://quail-lib.org/test-info/inputImageAltIsNotFileName +*/ +class inputImageAltIsNotFileName extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image' + && strtolower($input->getAttribute('alt')) == strtolower($input->getAttribute('src'))) + $this->addReport($input); + } + } + +} + +/** +* Image used in input element - Alt text should not be placeholder text. +* input elements cannot have alt attribute values that are (case insensitive) (exactly) \"image\"" +* @link http://quail-lib.org/test-info/inputImageAltIsNotPlaceholder +*/ +class inputImageAltIsNotPlaceholder extends imgAltNotPlaceHolder { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image') { + if(in_array($input->getAttribute('alt'), $this->translation()) || ord($input->getAttribute('alt')) == 194) { + $this->addReport($input); + } + elseif(preg_match("/^([0-9]*)(k|kb|mb|k bytes|k byte)?$/", strtolower($input->getAttribute('alt')))) { + $this->addReport($input); + } + } + } + + } +} + +/** +* Alt text for all input elements with a type attribute value of "image" is less than 100 characters (English) or the user has confirmed that the Alt text is as short as possible. +* input elements must have alt attribute value of less than 100 characters (English). +* @link http://quail-lib.org/test-info/inputImageAltIsShort +*/ +class inputImageAltIsShort extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image' && strlen($input->getAttribute('alt')) > 100) + $this->addReport($input); + } + } + +} + +/** +* Alt text for all input elements with a type attribute value of "image" does not use the words "submit" or "button" (English). +* Alt text for form submit buttons must not use the words "submit" or "button". +* @link http://quail-lib.org/test-info/inputImageAltNotRedundant +*/ +class inputImageAltNotRedundant extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('submit', 'button'), + 'es' => array('enviar', 'botón'), + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image') { + foreach($this->translation() as $word) { + if(strpos($input->getAttribute('alt'), $word) !== false) + $this->addReport($input); + } + } + } + } +} + +/** +* All input elements with a type attribute value of "image" have an alt attribute. +* input element with type of "image" must have an alt attribute. +* @link http://quail-lib.org/test-info/inputImageHasAlt +*/ +class inputImageHasAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image' + && (trim($input->getAttribute('alt')) == '' || !$input->hasAttribute('alt'))) + $this->addReport($input); + } + } + +} + +/** +* Alt text for all input elements with a type attribute value of "image" contains all non decorative text in the image. +* This error is generated for all input elements that have a type of "image". +* @link http://quail-lib.org/test-info/inputImageNotDecorative +*/ +class inputImageNotDecorative extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image') + $this->addReport($input); + } + } +} + +/** +* All input elements, type of "password", have a valid tab index. +* input element that contains a type attribute value of "password" must have a tabindex attribute. +* @link http://quail-lib.org/test-info/inputPasswordHasTabIndex +*/ +class inputPasswordHasTabIndex extends inputTabIndex { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'password'; +} + +/** +* All input elements, type of "radio", have a valid tab index. +* input element that contains a type attribute value of "radio" must have a tabindex attribute. +* @link http://quail-lib.org/test-info/inputRadioHasTabIndex +*/ +class inputRadioHasTabIndex extends inputTabIndex { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'radio'; +} + +/** +* All input elements, type of "submit", have a valid tab index. +* input element that contains a type attribute value of "submit" must have a tabindex attribute. +* @link http://quail-lib.org/test-info/inputSubmitHasTabIndex +*/ +class inputSubmitHasTabIndex extends inputTabIndex { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'submit'; +} + +/** +* All input elements, type of "text", have an explicitly associated label. +* input element that contains a type attribute value of "text" must have an associated label element. An associated label is one in which the for attribute value of the label element is the same as the id attribute value of the input element. +* @link http://quail-lib.org/test-info/inputTextHasLabel +*/ +class inputTextHasLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'text'; + + /** + * @var bool $no_type We are not looking at the type of input here + */ + var $no_type = false; +} + +/** +* All input elements, type of "text", have a valid tab index. +* input element that contains a type attribute value of "text" must have a tabindex attribute. +* @link http://quail-lib.org/test-info/inputTextHasTabIndex +*/ +class inputTextHasTabIndex extends inputTabIndex { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'text'; +} + +/** +* input element, type of "text", must have default text. +* input elements that have a type attribute value of "text" must also contain a value attribute that contains text. +* @link http://quail-lib.org/test-info/inputTextHasValue +*/ +class inputTextHasValue extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'text' && !$input->hasAttribute('value')) + $this->addReport($input); + + } + + } +} + +/** +* input control, type of "text", must have valid default text. +* input element with a type of "text" cannot contain a VALUE attribute that is empty or whitespace. +* @link http://quail-lib.org/test-info/inputTextValueNotEmpty +*/ +class inputTextValueNotEmpty extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if(!$input->hasAttribute('value') || trim($input->getAttribute('value')) == '') + $this->addReport($input); + + } + } +} + +/** +* All label elements do not contain input elements. +* label elements should not contain input elements. +* @link http://quail-lib.org/test-info/labelDoesNotContainInput +*/ +class labelDoesNotContainInput extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('label') as $label) { + if($this->elementHasChild($label, 'input') || $this->elementHasChild($label, 'textarea')) + $this->addReport($label); + } + } +} + +/** +* Each input element has only one associated label. +* input element must have only one associated label element. +* @link http://quail-lib.org/test-info/labelMustBeUnique +*/ +class labelMustBeUnique extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $labels = array(); + foreach($this->getAllElements('label') as $label) { + if($label->hasAttribute('for')) + $labels[$label->getAttribute('for')][] = $label; + } + foreach($labels as $label) { + if(count($label) > 1) + $this->addReport($label[1]); + } + } +} + +/** +* Each label associated with an input element contains text. +* Label must contain some text. +* @link http://quail-lib.org/test-info/labelMustNotBeEmpty +*/ +class labelMustNotBeEmpty extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('label') as $label) { + if(!$this->elementContainsReadableText($label)) { + $this->addReport($label); + } + } + } +} + +/** +* legend text describes the group of choices. +* The legend must describe the group of choices. +* @link http://quail-lib.org/test-info/legendDescribesListOfChoices +*/ +class legendDescribesListOfChoices extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'legend'; +} + +/** +* legend text is not empty or whitespace. +* The legend must describe the group of choices. +* @link http://quail-lib.org/test-info/legendTextNotEmpty +*/ +class legendTextNotEmpty extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('legend') as $legend) { + if(!$legend->nodeValue || trim($legend->nodeValue) == '') + $this->addReport($legend); + } + } +} + +/** +* legend text is not placeholder text. +* The legend must describe the group of choices. +* @link http://quail-lib.org/test-info/legendTextNotPlaceholder +*/ +class legendTextNotPlaceholder extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array(' ', ' ', 'legend'), + 'es' => array(' ', ' ', 'relato'), + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('legend') as $legend) { + if(in_array(trim($legend->nodeValue), $this->translation())) + $this->addReport($legend); + } + } + +} + +class liDontUseImageForBullet extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('li') as $li) { + if(!$this->propertyIsEqual($li, 'nodeValue', '', true) + && $this->propertyIsEqual($li->firstChild, 'tagName', 'img')) { + $this->addReport($li); + } + } + + } +} + +/** +* Document should use LINK for alternate content. +* head element must contain a link element with a rel attribute value that equals "alternate" and a href attribute value that is a valid URL. +* @link http://quail-lib.org/test-info/linkUsedForAlternateContent +*/ +class linkUsedForAlternateContent extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $head = $this->getAllElements('head'); + $head = $head[0]; + if($head && property_exists($head, 'childNodes')) { + foreach($head->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'link') && $child->getAttribute('rel') == 'alternate') + return true; + } + } + $this->addReport(null, null, false); + } +} + + + + +/** +* Document uses link element to describe navigation if it is within a collection. +* The link element can provide metadata about the position of an HTML page within a set of Web units or can assist in locating content with a set of Web units. +* @link http://quail-lib.org/test-info/linkUsedToDescribeNavigation +*/ +class linkUsedToDescribeNavigation extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $head = $this->getAllElements('head'); + $head = $head[0]; + if($head->childNodes) { + foreach($head->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'link') && $child->getAttribute('rel') != 'stylesheet') + return true; + } + $this->addReport(null, null, false); + } + } +} + +/** +* List items must not be used to format text. +* OL element should not contain only one LI element. +* @link http://quail-lib.org/test-info/listNotUsedForFormatting +*/ +class listNotUsedForFormatting extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(array('ul', 'ol')) as $list) { + $li_count = 0; + foreach($list->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'li')) { + $li_count++; + } + } + if($li_count < 2) + $this->addReport($list); + } + + } +} + +/** +* marquee element is not used. +* This error will be generated for each marquee element. +* @link http://quail-lib.org/test-info/marqueeIsNotUsed +*/ +class marqueeIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'marquee'; + +} + +/** +* menu items should not be used to format text. +* menu element must contain one LI element. +* @link http://quail-lib.org/test-info/menuNotUsedToFormatText +*/ +class menuNotUsedToFormatText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('menu') as $menu) { + $list_items = 0; + foreach($menu->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'li')) { + $list_items++; + } + } + if($list_items == 1) + $this->addReport($menu); + } + + } +} + +/** +* noembed must have equivalent content. +* This error is generated for each noembed element. +* @link http://quail-lib.org/test-info/noembedHasEquivalentContent +*/ +class noembedHasEquivalentContent extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'noembed'; +} + +/** +* NOFRAMES section must contain text equivalent of FRAMES section. +* This error is generated for each NOFRAMES element. +* @link http://quail-lib.org/test-info/noframesSectionMustHaveTextEquivalent +*/ +class noframesSectionMustHaveTextEquivalent extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frameset') as $frameset) { + if(!$this->elementHasChild($frameset, 'noframes')) + $this->addReport($frameset); + } + foreach($this->getAllElements('noframes') as $noframes) { + $this->addReport($noframes); + } + } + +} + +/** +* Content must be usable when object are disabled. +* If an object element contains a codebase attribute then the codebase attribute value must be null or whitespace. +* @link http://quail-lib.org/test-info/objectContentUsableWhenDisabled +*/ +class objectContentUsableWhenDisabled extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* All objects do not flicker. +* This error is generated for all object elements. +* @link http://quail-lib.org/test-info/objectDoesNotFlicker +*/ +class objectDoesNotFlicker extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; + +} + +/** +* object must not use color alone. +* This error is generated for every applet element. +* @link http://quail-lib.org/test-info/objectDoesNotUseColorAlone +*/ +class objectDoesNotUseColorAlone extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* object user interface must be accessible. +* If an object element contains a codebase attribute then the codebase attribute value must be null or whitespace. +* @link http://quail-lib.org/test-info/objectInterfaceIsAccessible +*/ +class objectInterfaceIsAccessible extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* object link to multimedia file must have text transcript. +* object element cannot contain type attribute value of "video". +* @link http://quail-lib.org/test-info/objectLinkToMultimediaHasTextTranscript +*/ +class objectLinkToMultimediaHasTextTranscript extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('object') as $object) { + if($object->getAttribute('type') == 'video') + $this->addReport($object); + + } + } + +} + +/** +* All objects contain a text equivalent of the object. +* object element must contain a text equivalent for the object in case the object can't be rendered. +* @link http://quail-lib.org/test-info/objectMustContainText +*/ +class objectMustContainText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('object') as $object) { + if(!$object->nodeValue || trim($object->nodeValue) == '') + $this->addReport($object); + + } + } +} + +/** +* Use the embed element within the object element. +* Each object element must contain an embed element. +* @link http://quail-lib.org/test-info/objectMustHaveEmbed +*/ +class objectMustHaveEmbed extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('object') as $object) { + if(!$this->elementHasChild($object, 'embed')) + $this->addReport($object); + } + } +} + +/** +* object must have a title. +* object element must contain a title attribute. +* @link http://quail-lib.org/test-info/objectMustHaveTitle +*/ +class objectMustHaveTitle extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('object') as $object) { + if(!$object->hasAttribute('title')) + $this->addReport($object); + + } + } + +} + + + + +/** +* object must have a valid title. +* object element must not have a title attribute with value of null or whitespace. +* @link http://quail-lib.org/test-info/objectMustHaveValidTitle +*/ +class objectMustHaveValidTitle extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('nbsp', + ' ', + 'object', + 'an object', + 'spacer', + 'image', + 'img', + 'photo', + ' '), + 'es' => array('nbsp', + ' ', + 'objeto', + 'un objeto', + 'espacio', + 'imagen', + 'img', + 'foto', + ' '), + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('object') as $object) { + if($object->hasAttribute('title')) { + if(trim($object->getAttribute('title')) == '') + $this->addReport($object); + elseif(!in_array(trim(strtolower($object->getAttribute('title'))), $this->translation())) + $this->addReport($object); + } + } + } + +} + +/** +* object provides a keyboard mechanism to return focus to the parent window. +* Ensure that keyboard users do not become trapped in a subset of the content that can only be exited using a mouse or pointing device. +* @link http://quail-lib.org/test-info/objectProvidesMechanismToReturnToParent +*/ +class objectProvidesMechanismToReturnToParent extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* object may require a long description. +* This error is generated for every object element. +* @link http://quail-lib.org/test-info/objectShouldHaveLongDescription +*/ +class objectShouldHaveLongDescription extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* Text equivalents for object should be updated if object changes. +* If an object element contains a codebase attribute then the codebase attribute value must be null or whitespace. +* @link http://quail-lib.org/test-info/objectTextUpdatesWhenObjectChanges +*/ +class objectTextUpdatesWhenObjectChanges extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* Content must be usable when objects are disabled. +* If object element contains a CLASSid attribute and any text then this error will be generated. +* @link http://quail-lib.org/test-info/objectUIMustBeAccessible +*/ +class objectUIMustBeAccessible extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* Text equivalents for object should be updated if object changes. +* If object element contains a CLASSid attribute and any text then this error will be generated. +* @link http://quail-lib.org/test-info/objectWithClassIDHasNoText +*/ +class objectWithClassIDHasNoText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('object') as $object) { + if($object->nodeValue && $object->hasAttribute('classid')) + $this->addReport($object); + + } + } +} + +/** +* All p elements are not used as headers. +* All p element content must not be marked with either b, i, u, strong, font, em. +* @link http://quail-lib.org/test-info/pNotUsedAsHeader +*/ +class pNotUsedAsHeader extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + var $head_tags = array('strong', 'em', 'font', 'i', 'b', 'u'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('p') as $p) { + if(($p->nodeValue == $p->firstChild->nodeValue) && + is_object($p->firstChild) && + property_exists($p->firstChild, 'tagName') && + in_array($p->firstChild->tagName, $this->head_tags)) { + $this->addReport($p); + + } + else { + $style = $this->css->getStyle($p); + if($style['font-weight'] == 'bold') { + $this->addReport($p); + } + } + } + } +} + +/** +* All input elements, type of "password", have an explicitly associated label. +* input element that contains a type attribute value of "password" must have an associated label element. An associated label is one in which the for attribute value of the label element is the same as the id attribute value of the input element. +* @link http://quail-lib.org/test-info/passwordHasLabel +*/ +class passwordHasLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'password'; + + /** + * @var bool $no_type We are not looking at the type of input here + */ + var $no_type = false; +} + +/** +* All input elements, type of "password", have a label that is positioned close to the control. +* input element with a type attribute value of "password" must have an associated label element positioned close to it. +* @link http://quail-lib.org/test-info/passwordLabelIsNearby +*/ +class passwordLabelIsNearby extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'password') + $this->addReport($input); + + } + } +} + +/** +* pre element should not be used to create tabular layout. +* This error is generated for each pre element. +* @link http://quail-lib.org/test-info/preShouldNotBeUsedForTabularLayout +*/ +class preShouldNotBeUsedForTabularLayout extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('pre') as $pre) { + $rows = preg_split('/[\n\r]+/', $pre->nodeValue); + if(count($rows) > 1) + $this->addReport($pre); + } + + } +} + +/** +* All input elements, type of "radio", have an explicitly associated label. +* input element that contains a type attribute value of "radio" must have an associated label element. An associated label is one in which the for attribute value of the label element is the same as the id attribute value of the input element. +* @link http://quail-lib.org/test-info/radioHasLabel +*/ +class radioHasLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'radio'; + + /** + * @var bool $no_type We are not looking at the type of input here + */ + var $no_type = false; +} + +/** +* All input elements, type of "radio", have a label that is positioned close to the control. +* input element with a type attribute value of "radio" must have an associated label element positioned close to it. +* @link http://quail-lib.org/test-info/radioLabelIsNearby +*/ +class radioLabelIsNearby extends quailTest { + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'radio') + $this->addReport($input); + + } + } +} + +/** +* All radio button groups are marked using fieldset and legend elements. +* form element content must contain both fieldset and legend elements if there are related radio buttons. +* @link http://quail-lib.org/test-info/radioMarkedWithFieldgroupAndLegend +*/ +class radioMarkedWithFieldgroupAndLegend extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $radios = array(); + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'radio') { + $radios[$input->getAttribute('name')][] = $input; + } + } + foreach($radios as $radio) { + if(count($radio > 1)) { + if(!$this->getParent($radio[0], 'fieldset', 'body')) + $this->addReport($radio[0]); + } + } + } +} + +/** +* @todo This should really only fire once and shouldn't extend quailTagTest +*/ + +/** +* Content must be accessible when script is disabled. +* This error will be generated for all script elements. +* @link http://quail-lib.org/test-info/scriptContentAccessibleWithScriptsTurnedOff +*/ +class scriptContentAccessibleWithScriptsTurnedOff extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'script'; +} + +/** +* script must have a noscript section. +* script elements that occur within the body must be followed by a noscript section. +* @link http://quail-lib.org/test-info/scriptInBodyMustHaveNoscript +*/ +class scriptInBodyMustHaveNoscript extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('script') as $script) { + if(!$this->propertyIsEqual($script->nextSibling, 'tagName', 'noscript') + && !$this->propertyIsEqual($script->parentNode, 'tagName', 'head')) + $this->addReport($script); + + } + } + +} + +/** +* All onclick event handlers have an associated onkeypress event handler. +* Any element that contains an onclick attribute must also contain an onkeypress attribute. +* @link http://quail-lib.org/test-info/scriptOnclickRequiresOnKeypress +*/ +class scriptOnclickRequiresOnKeypress extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'onclick'; + + /** + * @var string $key_value Attribute that is considered a keyboard event + */ + var $key_value = 'onkeypress'; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(array_keys(htmlElements::$html_elements)) as $element) { + if(($element->hasAttribute($this->click_value)) && !$element->hasAttribute($this->key_value)) + $this->addReport($element); + } + } + +} + +/** +* All ondblclick event handlers have corresponding keyboard-specific functions. +* Any element that contains an ondblclick attribute will generate this error. +* @link http://quail-lib.org/test-info/scriptOndblclickRequiresOnKeypress +*/ +class scriptOndblclickRequiresOnKeypress extends scriptOnclickRequiresOnKeypress { + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'ondblclick'; +} + +/** +* All onmousedown event handlers have an associated onkeydown event handler. +* Any element that contains an onmousedown attribute must also contain an onkeydown attribute. +* @link http://quail-lib.org/test-info/scriptOnmousedownRequiresOnKeypress +*/ +class scriptOnmousedownRequiresOnKeypress extends scriptOnclickRequiresOnKeypress { + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'onmousedown'; + + /** + * @var string $key_value Attribute that is considered a keyboard event + */ + var $key_value = 'onkeydown'; +} + +/** +* All onmousemove event handlers have corresponding keyboard-specific functions. +* Any element that contains an onmousemove attribute will generate this error. +* @link http://quail-lib.org/test-info/scriptOnmousemove +*/ +class scriptOnmousemove extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'onmousemove'; + + /** + * @var string $key_value Attribute that is considered a keyboard event + */ + var $key_value = 'onkeypress'; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(array_keys(htmlElements::$html_elements)) as $element) { + if(($element->hasAttribute($this->click_value))) + $this->addReport($element); + } + } + +} + +/** +* All onmouseout event handlers have an associated onblur event handler. +* Any element that contains an onmouseout attribute must also contain an onblur attribute. +* @link http://quail-lib.org/test-info/scriptOnmouseoutHasOnmouseblur +*/ +class scriptOnmouseoutHasOnmouseblur extends scriptOnclickRequiresOnKeypress { + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'onmouseout'; + + /** + * @var string $key_value Attribute that is considered a keyboard event + */ + var $key_value = 'onblur'; +} + +/** +* All onmouseover event handlers have an associated onfocus event handler. +* Any element that contains an onmouseover attribute must also contain an onfocus attribute. +* @link http://quail-lib.org/test-info/scriptOnmouseoverHasOnfocus +*/ +class scriptOnmouseoverHasOnfocus extends scriptOnclickRequiresOnKeypress { + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'onmouseover'; + + /** + * @var string $key_value Attribute that is considered a keyboard event + */ + var $key_value = 'onfocus'; +} + +/** +* All onmouseup event handlers have an associated onkeyup event handler. +* Any element that contains an onmouseup attribute must also contain an onkeyup attribute. +* @link http://quail-lib.org/test-info/scriptOnmouseupHasOnkeyup +*/ +class scriptOnmouseupHasOnkeyup extends scriptOnclickRequiresOnKeypress { + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'onmouseup'; + + /** + * @var string $key_value Attribute that is considered a keyboard event + */ + var $key_value = 'onkeyup'; +} + +/** +* User interface for script must be accessible. +* This error will be generated for all script elements. +* @link http://quail-lib.org/test-info/scriptUIMustBeAccessible +*/ +class scriptUIMustBeAccessible extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'script'; +} + +/** +* script should not cause screen flicker. +* This error will be generated for all script elements. +* @link http://quail-lib.org/test-info/scriptsDoNotFlicker +*/ +class scriptsDoNotFlicker extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'script'; +} + +/** +* Color alone should not be used in the script. +* This error will be generated for all script elements. +* @link http://quail-lib.org/test-info/scriptsDoNotUseColorAlone +*/ +class scriptsDoNotUseColorAlone extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'script'; +} + +/** +* All select elements do not cause an extreme change in context. +* select element cannot contain onchange attribute. +* @link http://quail-lib.org/test-info/selectDoesNotChangeContext +*/ +class selectDoesNotChangeContext extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('select') as $select) { + if($select->hasAttribute('onchange')) + $this->addReport($select); + + } + } +} + +/** +* All select elements have an explicitly associated label. +* select element must have an associated label element. A label element is associated with the select element if the for attribute value of the label is the same as the id attribute of the select element. +* @link http://quail-lib.org/test-info/selectHasAssociatedLabel +*/ +class selectHasAssociatedLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'select'; + + /** + * @var bool $no_type We are looking at a type-specific input element + */ + var $no_type = true; +} + +/** +* All select elements containing a large number options also contain optgroup elements. +* select element content that contains 4 or more option elements must contain at least 2 optgroup elements. +* @link http://quail-lib.org/test-info/selectWithOptionsHasOptgroup +*/ +class selectWithOptionsHasOptgroup extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('select') as $select) { + $options = 0; + foreach($select->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'option')) { + $options++; + } + } + if($options >= 4) { + $this->addReport($select); + } + } + } +} + +/** +* Sites must have a site map. +* Each site must have a site map. +* @link http://quail-lib.org/test-info/siteMap +*/ +class siteMap extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(strtolower(trim($a->nodeValue)) == 'site map') + return true; + } + $this->addReport(null, null, false); + } +} + +/** +* A "skip to content" link appears on all pages with blocks of material prior to the main document. +* Provide a mechanism to bypass blocks of material that are repeated on multiple Web units. +* @link http://quail-lib.org/test-info/skipToContentLinkProvided +*/ +class skipToContentLinkProvided extends quailTest { + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('navigation', 'skip', 'content'), + 'es' => array('navegación', 'saltar', 'contenido'), + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $first_link = $this->getAllElements('a'); + if(!$first_link) { + $this->addReport(null, null, false); + return null; + } + $a = $first_link[0]; + + if(substr($a->getAttribute('href'), 0, 1) == '#') { + + $link_text = explode(' ', strtolower($a->nodeValue)); + if(!in_array($this->translation(), $link_text)) { + $report = true; + foreach($a->childNodes as $child) { + if(method_exists($child, 'hasAttribute')) { + if($child->hasAttribute('alt')) { + $alt = explode(' ', strtolower($child->getAttribute('alt') . $child->nodeValue)); + foreach($this->translation() as $word) { + if(in_array($word, $alt)) { + $report = false; + } + } + } + } + } + if($report) { + $this->addReport(null, null, false); + } + } + + } + else + $this->addReport(null, null, false); + + } + +} + + +/** +* The tab order specified by tabindex attributes follows a logical order. +* Provide a logical tab order when the default tab order does not suffice. +* @link http://quail-lib.org/test-info/tabIndexFollowsLogicalOrder +*/ +class tabIndexFollowsLogicalOrder extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $index = 0; + foreach($this->getAllElements(null, 'form') as $form) { + if(is_numeric($form->getAttribute('tabindex')) + && intval($form->getAttribute('tabindex')) != $index + 1) + $this->addReport($form); + $index++; + } + } +} + +/** +* Table captions identify the table. +* If the table has a caption then the caption must identify the table. +* @link http://quail-lib.org/test-info/tableCaptionIdentifiesTable +*/ +class tableCaptionIdentifiesTable extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'caption'; +} + +/** +* All complex data tables have a summary. +* The summary is useful when the table has a complex structure (for example, when there are several sets of row or column headers, or when there are multiple groups of columns or rows). The summary may also be helpful for simple data tables that contain many columns or rows of data. +* @link http://quail-lib.org/test-info/tableComplexHasSummary +*/ +class tableComplexHasSummary extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if(!$table->hasAttribute('summary') && $table->firstChild->tagName != 'caption') { + $this->addReport($table); + + + } + } + + } +} + +/** +* All data tables contain th elements. +* Data tables must have th elements while layout tables can not have th elements. +* @link http://quail-lib.org/test-info/tableDataShouldHaveTh +*/ +class tableDataShouldHaveTh extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if(!$this->isData($table)) + $this->addReport($table); + + } + + } + +} + +/** +* Substitutes for table header labels must be terse. +* abbr attribute value on th element must be less than 20 characters (English). +* @link http://quail-lib.org/test-info/tableHeaderLabelMustBeTerse +*/ +class tableHeaderLabelMustBeTerse extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr')) { + foreach($child->childNodes as $td) { + if($this->propertyIsEqual($td, 'tagName', 'th')) { + if(strlen($td->getAttribute('abbr')) > 20) + $this->addReport($td); + + } + } + } + } + + } + + } +} + +/** +* Use thead to group repeated table headers, tfoot for repeated table footers, and tbody for other groups of rows. +* @link http://quail-lib.org/test-info/tableIsGrouped +*/ +class tableIsGrouped extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if(!$this->elementHasChild($table, 'thead') + || !$this->elementHasChild($table, 'tbody') + || !$this->elementHasChild($table, 'tfoot')) { + $rows = 0; + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr')) + $rows ++; + } + if($rows > 4) + $this->addReport($table); + } + } + + } +} + +/** +* All layout tables do not contain th elements. +* Data tables must have th elements while layout tables can not have th elements. +* @link http://quail-lib.org/test-info/tableLayoutDataShouldNotHaveTh +*/ +class tableLayoutDataShouldNotHaveTh extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($this->isData($table)) + $this->addReport($table); + + } + + } + +} + +/** +* All layout tables do not contain caption elements. +* table element content cannot contain a caption element if it's a layout table. +* @link http://quail-lib.org/test-info/tableLayoutHasNoCaption +*/ +class tableLayoutHasNoCaption extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($this->elementHasChild($table, 'caption')) { + $first_row = true; + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr') && $first_row) { + if(!$this->elementHasChild($child, 'th')) + $this->addReport($table); + $first_row = false; + } + } + } + } + + } +} + +/** +* All layout tables have an empty summary attribute or no summary attribute. +* The table element, summary attribute for all layout tables contains no printable characters or is absent. +* @link http://quail-lib.org/test-info/tableLayoutHasNoSummary +*/ +class tableLayoutHasNoSummary extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($table->hasAttribute('summary') && strlen(trim($table->getAttribute('summary'))) > 1) { + $first_row = true; + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr') && $first_row) { + if(!$this->elementHasChild($child, 'th')) + $this->addReport($table); + $first_row = false; + } + } + } + } + + } +} + +/** +* All layout tables make sense when linearized. +* This error is generated for all layout tables. If the table contains th elements then it is a data table. If the table does not contain th elements then it is a layout table. +* @link http://quail-lib.org/test-info/tableLayoutMakesSenseLinearized +*/ +class tableLayoutMakesSenseLinearized extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if(!$this->isData($table)) + $this->addReport($table); + + } + + } + +} + +/** +* All data table summaries describe navigation and structure of the table. +* The table summary can't be garbage text. +* @link http://quail-lib.org/test-info/tableSummaryDescribesTable +*/ +class tableSummaryDescribesTable extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($table->hasAttribute('summary')) + $this->addReport($table); + } + } +} + +/** +* Table summaries do not duplicate the table captions. +* The summary and the caption must be different. Caption identifies the table. Summary describes the table contents. +* @link http://quail-lib.org/test-info/tableSummaryDoesNotDuplicateCaption +*/ +class tableSummaryDoesNotDuplicateCaption extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($this->elementHasChild($table, 'caption') && $table->hasAttribute('summary')) { + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'caption')) + $caption = $child; + } + if(strtolower(trim($caption->nodeValue)) == + strtolower(trim($table->getAttribute('summary'))) ) + $this->addReport($table); + + } + } + } +} + +/** +* All data table summaries contain text. +* table element cannot contain an empty summary attribute if it's a data table. +* @link http://quail-lib.org/test-info/tableSummaryIsEmpty +*/ +class tableSummaryIsEmpty extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($table->hasAttribute('summary') && trim($table->getAttribute('summary')) == '') { + $this->addReport($table); + + + } + } + + } +} + +/** +* All data table summaries are greater than 10 printable characters (English). +* table element, summary attribute value must be greater than 10 characters (English) if it's a data table. +* @link http://quail-lib.org/test-info/tableSummaryIsSufficient +*/ +class tableSummaryIsSufficient extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($table->hasAttribute('summary') && strlen(trim($table->getAttribute('summary'))) < 11) { + $this->addReport($table); + + + } + } + + } +} + +/** +* Use colgroup and col elements to group columns. +* @link http://quail-lib.org/test-info/tableUseColGroup +*/ +class tableUseColGroup extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($this->isData($table)) { + if(!$this->elementHasChild($table, 'colgroup') && !$this->elementHasChild($table, 'col')) + $this->addReport($table); + } + } + + } +} + +/** +* Long table header labels require terse substitutes. +* th element content must be less than 20 characters (English) if th element does not contain abbr attribute. +* @link http://quail-lib.org/test-info/tableUsesAbbreviationForHeader +*/ +class tableUsesAbbreviationForHeader extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr')) { + foreach($child->childNodes as $td) { + if($this->propertyIsEqual($td, 'tagName', 'th')) { + if(strlen($td->nodeValue) > 20 && !$td->hasAttribute('abbr')) + $this->addReport($table); + + } + } + } + } + + } + + } +} + +/** +* All data tables contain a caption unless the table is identified within the document. +* Tables must be identified by a caption unless they are identified within the document. +* @link http://quail-lib.org/test-info/tableUsesCaption +*/ +class tableUsesCaption extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($table->firstChild->tagName != 'caption') + $this->addReport($table); + + } + + } +} + +/** +* Data tables that contain both row and column headers use the scope attribute to identify cells. +* The scope attribute may be used to clarify the scope of any cell used as a header. +* @link http://quail-lib.org/test-info/tableWithBothHeadersUseScope +*/ +class tableWithBothHeadersUseScope extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + $fail = false; + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr')) { + if($this->propertyIsEqual($child->firstChild, 'tagName', 'td')) { + if(!$child->firstChild->hasAttribute('scope')) + $fail = true; + } + else { + foreach($child->childNodes as $td) { + if($td->tagName == 'th' && !$td->hasAttribute('scope')) + $fail = true; + } + } + } + } + if($fail) + $this->addReport($table); + } + } +} + +/** +* Data tables that contain more than one row/column of headers use the id and headers attributes to identify cells. +* id and headers attributes allow screen readers to speak the headers associated with each data cell when the relationships are too complex to be identified using the th element alone or the th element with the scope attribute. +* @link http://quail-lib.org/test-info/tableWithMoreHeadersUseID +*/ +class tableWithMoreHeadersUseID extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($this->isData($table)) { + + $row = 0; + $multi_headers = false; + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr')) { + $row ++; + foreach($child->childNodes as $cell) { + if($this->propertyIsEqual($cell, 'tagName', 'th')) { + $th[] = $cell; + if($row > 1) + $multi_headers = true; + } + + } + } + } + if($multi_headers) { + $fail = false; + foreach($th as $cell) { + if(!$cell->hasAttribute('id')) + $fail = true; + } + if($fail) + $this->addReport($table); + } + + } + } + } +} + +/** +* Table markup is used for all tabular information. +* The objective of this technique is to present tabular information in a way that preserves relationships within the information even when users cannot see the table or the presentation format is changed. +* @link http://quail-lib.org/test-info/tabularDataIsInTable +*/ +class tabularDataIsInTable extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(null, 'text') as $text) { + if(strpos($text->nodeValue, "\t") !== false || $text->tagName == 'pre') + $this->addReport($text); + } + } +} + +/** +* All textarea elements have an explicitly associated label. +* All textarea elements must have an explicitly associated label. +* @link http://quail-lib.org/test-info/textareaHasAssociatedLabel +*/ +class textareaHasAssociatedLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'textarea'; + + /** + * @var bool $no_type We are looking at a type-specific input element + */ + var $no_type = true; +} + +/** +* All textarea elements have a label that is positioned close to control. +* textarea element must have an associated label element that is positioned close to it. +* @link http://quail-lib.org/test-info/textareaLabelPositionedClose +*/ +class textareaLabelPositionedClose extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'textarea'; +} + +/** +* Inline SVG entries should contain a title element which describes the content of the SVG +* @link http://quail-lib.org/test-info/svgContainsTitle +*/ +class svgContainsTitle extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('svg') as $svg) { + $title = false; + foreach($svg->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'title')) { + $title = true; + } + } + if(!$title) { + $this->addReport($svg); + } + } + } +} + +/** +* HTML5 video tags have captions. There's unfortunately no way to test for captions yet... +* @link http://quail-lib.org/test-info/videoProvidesCaptions +*/ +class videoProvidesCaptions extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'video'; +} + +/** +* Links to YouTube videos must have a caption +* @link http://quail-lib.org/test-info/videosEmbeddedOrLinkedNeedCaptions +*/ +class videosEmbeddedOrLinkedNeedCaptions extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $services The services that this test will need. We're using + * the youtube library. + */ + var $services = array( + 'youtube' => 'media/youtube', + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(array('a', 'embed')) as $video) { + $attr = ($video->tagName == 'a') + ? 'href' + : 'src'; + + if($video->hasAttribute($attr)) { + foreach($this->services as $service) { + if($service->captionsMissing($video->getAttribute($attr))) { + $this->addReport($video); + } + } + } + } + } + +} + +/** +* Checks that a document is written clearly to a minimum of a 60 on the +* Flesch Reading Ease score (9.9 max grade level). +* @link http://quail-lib.org/test-info/documentIsWrittenClearly +*/ +class documentIsWrittenClearly extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var array $services The services that this test will need. We're using + * the readability library. + */ + var $services = array( + 'readability' => 'readability/readability', + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $readability = $this->services['readability']; + foreach($this->getAllElements(null, 'text') as $element) { + $text = strip_tags($element->nodeValue); + if(str_word_count($text) > 25) { + if($readability->flesch_kincaid_reading_ease($text) < 60) { + $this->addReport($element); + } + } + } + } + +} + +/** +* Headers should have text content so as not to confuse screen-reader users +* @link http://quail-lib.org/test-info/headersHaveText +*/ +class headersHaveText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(null, 'header', true) as $header) { + if(!$this->elementContainsReadableText($header)) { + $this->addReport($header); + } + } + } +} + +/** +* All labels should be associated with an input element. If not, these are considered 'orphans' +* because they have no or the wrong "for" attribute +* @link http://quail-lib.org/test-info/labelsAreAssignedToAnInput +*/ + +class labelsAreAssignedToAnInput extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('label') as $label) { + if(!$label->hasAttribute('for') || !$input = $this->dom->getElementById($label->getAttribute('for'))) { + $this->addReport($label); + } + if(!in_array($input->tagName, array('input', 'select', 'textarea'))) { + $this->addReport($label); + } + } + } +} + +/** +* ALT text on images should not be redundant across the page. Please check that all +* images have alt text which is unique to the image. +* @link http://quail-lib.org/test-info/imgAltTextNotRedundant +*/ +class imgAltTextNotRedundant extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $alt = array(); + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('src') && $img->hasAttribute('alt')) { + if(isset($alt[strtolower(trim($img->getAttribute('alt')))]) && + $alt[strtolower(trim($img->getAttribute('alt')))] != + strtolower(trim($img->getAttribute('src')))) { + $this->addReport($img); + } + $alt[strtolower(trim($img->getAttribute('alt')))] = strtolower(trim($img->getAttribute('src'))); + } + } + unset($alt); + } +} + +/** +* Jump menus that consist of a single form element should not be used +* @link http://quail-lib.org/test-info/selectJumpMenus +*/ +class selectJumpMenus extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('select') as $select) { + $parent = $this->getParent($select, 'form', 'body'); + $fail = true; + if($parent) { + foreach($this->getAllElements('input') as $input) { + if($input->hasAttribute('type') && $input->getAttribute('type') == 'submit') { + $parent_input = $this->getParent($input, 'form', 'body'); + if($parent_input->isSameNode($parent)) { + $fail = false; + } + } + } + } + if($fail) { + $this->addReport($select); + } + } + } +} + + +/** +* Text size is not less than 10px small +* @link http://quail-lib.org/test-info/textIsNotSmall +*/ +class textIsNotSmall extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(null, 'text', true) as $text) { + $style = $this->css->getStyle($text); + if(isset($style['font-size'])) { + if(substr($style['font-size'], -2, 2) == 'px') { + if(intval($style['font-size']) < 10) { + $this->addReport($text); + } + } + if(substr($style['font-size'], -2, 2) == 'em') { + if(floatval($style['font-size']) < .63) { + $this->addReport($text); + } + } + } + } + } + +} + +/*@}*/ \ No newline at end of file diff --git a/quail/common/.svn/text-base/css.php.svn-base b/quail/common/.svn/text-base/css.php.svn-base new file mode 100644 index 0000000..f286195 --- /dev/null +++ b/quail/common/.svn/text-base/css.php.svn-base @@ -0,0 +1,599 @@ +. +* @author Kevin Miller +*/ + +/** +* @file +This class first parses all the CSS in the document and prepares +an index of CSS styles to be used by accessibility tests to determine color and +positioning. + +First, in loadCSS we get all the inline and linked style sheet information + and merge it into a large CSS file string. + +Second, in setStyles we use XPath queries to find all the DOM elements which are +effected by CSS styles and then build up an index in style_index of all the CSS +styles keyed by an attriute we attach to all DOM objects to lookup the style quickly. + +Most of the second step is to get around the problem where XPath DOMNodeList objects +are only marginally referential to the original elements and cannot be altered directly. + +*/ + +/** +* A helper class to parse the document's CSS so we can run accessibility +* tests against it. +*/ +class quailCSS { + + /** + * @var object The DOMDocument object of the current document + */ + var $dom; + + /** + * @var string The URI of the current document + */ + var $uri; + + /** + * @var string The type of request (inherited from the main QUAIL object) + */ + var $type; + + /** + * @var array An array of all the CSS elements and attributes + */ + var $css; + + /** + * @var string Additional CSS information (usually for CMS mode requests) + */ + var $css_string; + + /** + * @var bool Whether or not we are running in CMS mode + */ + var $cms_mode; + + /** + * @var array An array of all the strings which means the current style inherts from above + */ + var $inheritance_strings = array('inherit', 'currentColor'); + + /** + * @var array An array of all the styles keyed by the new attribute quail_style_index + */ + var $style_index = array(); + + /** + * @var int The next index ID to be applied to a node to lookup later in style_index + */ + var $next_index = 0; + + /** + * @var array A list of all the elements which support deprecated styles such as 'background' or 'bgcolor' + */ + var $deprecated_style_elements = array('body', 'table', 'tr', 'td', 'th'); + + /** + * Class constructor. We are just building and importing variables here and then loading the CSS + * @param object $dom The DOMDocument object + * @param string $uri The URI of the request + * @param string $type The type of request + * @param bool $cms_mode Whether we are running in CMS mode + * @param array $css_files An array of additional CSS files to load + */ + function __construct(&$dom, $uri, $type, $path, $cms_mode = false, $css_files = array()) { + $this->dom =& $dom; + $this->type = $type; + $this->uri = $uri; + $this->path = $path; + $this->cms_mode = $cms_mode; + $this->css_files = $css_files; + } + + + /** + * Sets all the styles from the CSS index into the style_index variable. + * To do this, because DOMNodeList doesn't return real elements, we are actually + * setting and attribute on all nodes that references back to a style index we maintain + * in the CSS class itself + */ + private function setStyles() { + if(!is_array($this->css)) { + return null; + } + foreach($this->css as $selector => $style) { + $xpath = new DOMXPath($this->dom); + $entries = @$xpath->query($this->getXpath($selector)); + if($entries->length) { + foreach($entries as $e) { + if(!$e->hasAttribute('quail_style_index')) { + $e->setAttribute('quail_style_index', $this->next_index); + $this->next_index++; + } + $this->addCSSToElement($e, $style, $this->getSpecificity($selector)); + } + } + } + foreach($this->style_index as $k => $style) { + foreach($style as $i => $values) { + $this->style_index[$k][$i] = trim(strtolower($values['value'])); + } + } + } + + /** + * Adds the provided CSS to the element's style entry in style_index. We first + * check the specificity against the items already in the index. + * @param object $element The DOMNode/DOMElement object + * @param array $style The provided CSS Style + * @param int $specificity The specificity total for the CSS selector + */ + private function addCSSToElement($element, $style, $specificity) { + $index_id = $element->getAttribute('quail_style_index'); + foreach($style as $name => $value) { + if(!$this->style_index[$index_id][$name] || + $this->style_index[$index_id][$name]['specificity'] < $specificity + || strpos($value, '!important') !== false) + { + $this->style_index[$index_id][$name] = array( + 'value' => str_replace('!important', '', trim(strtolower($value))), + 'specificity' => $specificity, + ); + } + } + + } + + /** + * Loads all the CSS files from the document using LINK elements or @import commands + */ + private function loadCSS() { + if(count($this->css_files) > 0) { + $css = $this->css_files; + } + else { + $css = array(); + $header_styles = $this->dom->getElementsByTagName('style'); + foreach($header_styles as $header_style) { + if($header_style->nodeValue) { + $this->css_string .= $header_style->nodeValue; + } + } + $style_sheets = $this->dom->getElementsByTagName('link'); + + foreach($style_sheets as $style) { + if($style->hasAttribute('rel') && + strtolower($style->getAttribute('rel')) == 'stylesheet' && + $style->getAttribute('media') != 'print') { + $css[] = $style->getAttribute('href'); + } + } + } + foreach($css as $sheet) { + $this->loadUri($sheet); + } + $this->loadImportedFiles(); + $this->css_string = str_replace(':link', '', $this->css_string); + $this->formatCSS(); + } + + /** + * Imports files from the CSS file using @import commands + */ + private function loadImportedFiles() { + $matches = array(); + preg_match_all('/@import (.*?);/i', $this->css_string, $matches); + if(count($matches[1]) == 0) { + return null; + } + foreach($matches[1] as $match) { + $this->loadUri(trim(str_replace('url', '', $match), '"\')(')); + } + preg_replace('/@import (.*?);/i', '', $this->css_string); + } + + /** + * Returns a specificity count to the given selector. + * Higher specificity means it overrides other styles. + * @param string selector The CSS Selector + */ + public function getSpecificity($selector) { + $selector = $this->parseSelector($selector); + if($selector[0][0] == ' ') { + unset($selector[0][0]); + } + $selector = $selector[0]; + $specificity = 0; + foreach($selector as $part) { + switch(substr(str_replace('*', '', $part), 0, 1)) { + case '.': + $specificity += 10; + case '#': + $specificity += 100; + case ':': + $specificity++; + default: + $specificity++; + } + if(strpos($part, '[id=') != false) { + $specificity += 100; + } + } + return $specificity; + } + + /** + * Interface method for tests to call to lookup the style information for a given DOMNode + * @param object $element A DOMElement/DOMNode object + * @return array An array of style information (can be empty) + */ + public function getStyle($element) { + //To prevent having to parse CSS unless the info is needed, + //we check here if CSS has been set, and if not, run off the parsing + //now. + if(!$this->css) { + $this->loadCSS(); + $this->setStyles(); + } + if(!is_a($element, 'DOMElement')) { + return array(); + } + $style = $this->getNodeStyle($element); + $style = $this->walkUpTreeForInheritance($element, $style); + + if($element->hasAttribute('style')) { + $inline_styles = explode(';', $element->getAttribute('style')); + foreach($inline_styles as $inline_style) { + $s = explode(':', $inline_style); + $style[$s[0]] = trim(strtolower($s[1])); + } + } + if(!is_array($style)) { + return array(); + } + return $style; + } + + /** + * Adds a selector to the CSS index + * @param string $key The CSS selector + * @param string $codestr The CSS Style code string + */ + + private function addSelector($key, $codestr) { + if(strpos($key, '@import') !== false) { + return null; + } + $key = strtolower($key); + $codestr = strtolower($codestr); + if(!isset($this->css[$key])) { + $this->css[$key] = array(); + } + $codes = explode(";",$codestr); + if(count($codes) > 0) { + foreach($codes as $code) { + $code = trim($code); + $explode = explode(":",$code,2); + if(count($explode) > 1) { + list($codekey, $codevalue) = $explode; + if(strlen($codekey) > 0) { + $this->css[$key][trim($codekey)] = trim($codevalue); + } + } + } + } + } + + /** + * Returns the style from the CSS index for a given element by first + * looking into its tag bucket then iterating over every item for an + * element that matches + * @param object The DOMNode/DOMElement object in queryion + * @retun array An array of all the style elements that _directly_ apply + * to that element (ignoring inheritance) + * + */ + private function getNodeStyle($element) { + $style = array(); + if($element->hasAttribute('quail_style_index')) { + $style = $this->style_index[$element->getAttribute('quail_style_index')]; + } + // To support the deprecated 'bgcolor' attribute + if($element->hasAttribute('bgcolor') && in_array($element->tagName, $this->deprecated_style_elements)) { + $style['background-color'] = $element->getAttribute('bgcolor'); + } + return $style; + } + + /** + * A helper function to walk up the DOM tree to the end to build an array + * of styles. + * @param object $element The DOMNode object to walk up from + * @param array $style The current style built for the node + * @return array The array of the DOM element, altered if it was overruled through css inheritance + */ + private function walkUpTreeForInheritance($element, $style) { + while(property_exists($element->parentNode, 'tagName')) { + $parent_style = $this->getNodeStyle($element->parentNode); + + if(is_array($parent_style)) { + foreach($parent_style as $k => $v) { + if(!isset($style[$k]) || in_array($style[$k]['value'], $this->inheritance_strings)) { + $style[$k] = $v; + } + } + } + $element = $element->parentNode; + } + return $style; + } + + /** + * Loads a CSS file from a URI + * @param string $rel The URI of the CSS file + */ + private function loadUri($rel) { + if($this->type == 'file') { + $uri = substr($this->uri, 0, strrpos($this->uri, '/')) .'/'.$rel; + } + else { + $uri = quail::getAbsolutePath($this->uri, $rel); + } + $this->css_string .= @file_get_contents($uri); + + } + + /** + * Formats the CSS to be ready to import into an array of styles + * @return bool Whether there were elements imported or not + */ + private function formatCSS() { + // Remove comments + $str = preg_replace("/\/\*(.*)?\*\//Usi", "", $this->css_string); + // Parse this damn csscode + $parts = explode("}",$str); + if(count($parts) > 0) { + foreach($parts as $part) { + if(strpos($part, '{') !== false) { + list($keystr,$codestr) = explode("{", $part); + $keys = explode(",",trim($keystr)); + if(count($keys) > 0) { + foreach($keys as $key) { + if(strlen($key) > 0) { + $key = str_replace("\n", "", $key); + $key = str_replace("\\", "", $key); + $this->addSelector($key, trim($codestr)); + } + } + } + } + } + } + return (count($this->css) > 0); + } + + /** + * Converts a CSS selector to an Xpath query + * @param string $selector The selector to convert + * @return string An Xpath query string + */ + private function getXpath($selector) { + $query = $this->parseSelector($selector); + + $xpath = '//'; + foreach($query[0] as $k => $q) { + if($q == ' ' && $k) + $xpath .= '//'; + elseif($q == '>' && $k) + $xpath .= '/'; + elseif(substr($q, 0, 1) == '#') + $xpath .= '[ @id = "'. str_replace('#', '', $q) .'" ]'; + + elseif(substr($q, 0, 1) == '.') + $xpath .= '[ @class = "'. str_replace('.', '', $q) .'" ]'; + elseif(substr($q, 0, 1) == '[') + $xpath .= str_replace('[id', '[ @ id', $q); + else + $xpath .= trim($q); + } + return str_replace('//[', '//*[', str_replace('//[ @', '//*[ @', $xpath)); + } + + /** + * Checks that a string is really a regular character + * @param string $char The character + * @return bool Whether the string is a character + */ + private function isChar($char) { + return extension_loaded('mbstring') + ? mb_eregi('\w', $char) + : preg_match('@\w@', $char); + } + + /** + * Parses a CSS selector into an array of rules. + * @param string $query The CSS Selector query + * @return arran An array of the CSS Selector parsed into rule segments + */ + private function parseSelector($query) { + // clean spaces + // TODO include this inside parsing ? + $query = trim( + preg_replace('@\s+@', ' ', + preg_replace('@\s*(>|\\+|~)\s*@', '\\1', $query) + ) + ); + $queries = array(array()); + if (! $query) + return $queries; + $return =& $queries[0]; + $specialChars = array('>',' '); +// $specialCharsMapping = array('/' => '>'); + $specialCharsMapping = array(); + $strlen = mb_strlen($query); + $classChars = array('.', '-'); + $pseudoChars = array('-'); + $tagChars = array('*', '|', '-'); + // split multibyte string + // http://code.google.com/p/phpquery/issues/detail?id=76 + $_query = array(); + for ($i=0; $i<$strlen; $i++) + $_query[] = mb_substr($query, $i, 1); + $query = $_query; + // it works, but i dont like it... + $i = 0; + while( $i < $strlen) { + $c = $query[$i]; + $tmp = ''; + // TAG + if ($this->isChar($c) || in_array($c, $tagChars)) { + while(isset($query[$i]) + && ($this->isChar($query[$i]) || in_array($query[$i], $tagChars))) { + $tmp .= $query[$i]; + $i++; + } + $return[] = $tmp; + // IDs + } else if ( $c == '#') { + $i++; + while( isset($query[$i]) && ($this->isChar($query[$i]) || $query[$i] == '-')) { + $tmp .= $query[$i]; + $i++; + } + $return[] = '#'.$tmp; + // SPECIAL CHARS + } else if (in_array($c, $specialChars)) { + $return[] = $c; + $i++; + // MAPPED SPECIAL MULTICHARS +// } else if ( $c.$query[$i+1] == '//') { +// $return[] = ' '; +// $i = $i+2; + // MAPPED SPECIAL CHARS + } else if ( isset($specialCharsMapping[$c])) { + $return[] = $specialCharsMapping[$c]; + $i++; + // COMMA + } else if ( $c == ',') { + $queries[] = array(); + $return =& $queries[ count($queries)-1 ]; + $i++; + while( isset($query[$i]) && $query[$i] == ' ') + $i++; + // CLASSES + } else if ($c == '.') { + while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $classChars))) { + $tmp .= $query[$i]; + $i++; + } + $return[] = $tmp; + // ~ General Sibling Selector + } else if ($c == '~') { + $spaceAllowed = true; + $tmp .= $query[$i++]; + while( isset($query[$i]) + && ($this->isChar($query[$i]) + || in_array($query[$i], $classChars) + || $query[$i] == '*' + || ($query[$i] == ' ' && $spaceAllowed) + )) { + if ($query[$i] != ' ') + $spaceAllowed = false; + $tmp .= $query[$i]; + $i++; + } + $return[] = $tmp; + // + Adjacent sibling selectors + } else if ($c == '+') { + $spaceAllowed = true; + $tmp .= $query[$i++]; + while( isset($query[$i]) + && ($this->isChar($query[$i]) + || in_array($query[$i], $classChars) + || $query[$i] == '*' + || ($spaceAllowed && $query[$i] == ' ') + )) { + if ($query[$i] != ' ') + $spaceAllowed = false; + $tmp .= $query[$i]; + $i++; + } + $return[] = $tmp; + // ATTRS + } else if ($c == '[') { + $stack = 1; + $tmp .= $c; + while( isset($query[++$i])) { + $tmp .= $query[$i]; + if ( $query[$i] == '[') { + $stack++; + } else if ( $query[$i] == ']') { + $stack--; + if (! $stack ) + break; + } + } + $return[] = $tmp; + $i++; + // PSEUDO CLASSES + } else if ($c == ':') { + $stack = 1; + $tmp .= $query[$i++]; + while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $pseudoChars))) { + $tmp .= $query[$i]; + $i++; + } + // with arguments ? + if ( isset($query[$i]) && $query[$i] == '(') { + $tmp .= $query[$i]; + $stack = 1; + while( isset($query[++$i])) { + $tmp .= $query[$i]; + if ( $query[$i] == '(') { + $stack++; + } else if ( $query[$i] == ')') { + $stack--; + if (! $stack ) + break; + } + } + $return[] = $tmp; + $i++; + } else { + $return[] = $tmp; + } + } else { + $i++; + } + } + foreach($queries as $k => $q) { + if (isset($q[0])) { + if (isset($q[0][0]) && $q[0][0] == ':') + array_unshift($queries[$k], '*'); + if ($q[0] != '>') + array_unshift($queries[$k], ' '); + } + } + return $queries; + } + +} diff --git a/quail/common/.svn/text-base/domExtensions.php.svn-base b/quail/common/.svn/text-base/domExtensions.php.svn-base new file mode 100644 index 0000000..9cc2cc3 --- /dev/null +++ b/quail/common/.svn/text-base/domExtensions.php.svn-base @@ -0,0 +1,39 @@ +. +* @author Kevin Miller +*/ + +/** +* An older attempt at using dom element exteions to introduce +* finding the styling of an element. +* @deprecated +*/ +class QuailDOMElement extends DOMElement { + + var $css_style; + + function setCSS($css) { + $this->css_style = $css; + } + + function getStyle($style = false) { + if(!$style) + return $this->css_style; + else return $this->css_style[$style]; + } +} \ No newline at end of file diff --git a/quail/common/.svn/text-base/elements.php.svn-base b/quail/common/.svn/text-base/elements.php.svn-base new file mode 100644 index 0000000..c931cf4 --- /dev/null +++ b/quail/common/.svn/text-base/elements.php.svn-base @@ -0,0 +1,79 @@ +. +* @author Kevin Miller +*/ + +/** +* This is a helper class which organizes all the HTML +* tags into groups for finding, for example, all elements +* which can possibly hold text that will be rendered on screen. +* +*/ +class htmlElements { + + /** + * @var array An array of HTML tag names and their attributes + * @todo add HTML5 elements here + */ + static $html_elements = array( + 'img' => array('text' => false), + 'p' => array('text' => true), + 'pre' => array('text' => true), + 'span' => array('text' => true), + 'div' => array('text' => true), + 'applet' => array('text' => false), + 'embed' => array('text' => false, 'media' => true), + 'object' => array('text' => false, 'media' => true), + 'area' => array('imagemap' => true), + 'b' => array('text' => true, 'non-emphasis' => true), + 'i' => array('text' => true, 'non-emphasis' => true), + 'font' => array('text' => true, 'font' => true), + 'h1' => array('text' => true, 'header' => true), + 'h2' => array('text' => true, 'header' => true), + 'h3' => array('text' => true, 'header' => true), + 'h4' => array('text' => true, 'header' => true), + 'h5' => array('text' => true, 'header' => true), + 'h6' => array('text' => true, 'header' => true), + 'ul' => array('text' => true, 'list' => true), + 'dl' => array('text' => true, 'list' => true), + 'ol' => array('text' => true, 'list' => true), + 'blockquote' => array('text' => true, 'quote' => true), + 'q' => array('text' => true, 'quote' => true), + 'acronym' => array('acronym' => true, 'text' => true), + 'abbr' => array('acronym' => true, 'text' => true), + 'input' => array('form' => true), + 'select' => array('form' => true), + 'textarea' => array('form' => true), + + ); + + /** + * Retrieves elements by an option. + * @param string $option The option to search fore + * @param bool $value Whether the option should be true or false + * @return array An array of HTML tag names + * @todo this should cache results in a static variable, as many of these can be iterated over again + */ + function getElementsByOption($option, $value = true) { + foreach(self::$html_elements as $k => $element) { + if(isset($element[$option]) && $element[$option] == $value) + $results[] = $k; + } + return $results; + } +} \ No newline at end of file diff --git a/quail/common/.svn/text-base/test.php.svn-base b/quail/common/.svn/text-base/test.php.svn-base new file mode 100644 index 0000000..99a6aff --- /dev/null +++ b/quail/common/.svn/text-base/test.php.svn-base @@ -0,0 +1,990 @@ +. +* @author Kevin Miller +*/ +/** +* The base class for all QUAIL tests. This handles importing DOM objects, adding items +* to the report and provides a few DOM-traversing methods +*/ +class quailTest { + + /** + * @var object The DOMDocument object + */ + var $dom; + + /** + * @var object The QuailCSS object + */ + var $css; + + /** + * @var array The path for the request + */ + var $path; + + /** + * @var bool Whether the test can be used in a CMS (content without HTML head) + */ + + var $cms = true; + + /** + * @var string The base path for this request + */ + var $base_path; + + /** + * @var array An array of quailReportItem objects + */ + var $report; + + /** + * @var int The fallback severity level for all tests + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var array An array of all the extensions that are images + */ + var $image_extensions = array('gif', 'jpg', 'png', 'jpeg', 'tiff', 'svn'); + + /** + * @var string The language domain + */ + var $lang = 'en'; + + /** + * @var array Services this test will be using. Services are loaded and then + * a class is built to replace the service name in this array. + */ + var $services = array(); + + /** + * @var array An array of translatable strings + */ + var $strings = array('en' => ''); + + /** + * The class constructor. We pass items by reference so we can alter the DOM if necessary + * @param object $dom The DOMDocument object + * @param object $css The QuailCSS object + * @param array $path The path of this request + * @param string $language_domain The langauge domain to user + * @param mixed $options Any additional options passed by QUAIL. + */ + function __construct(&$dom, &$css, &$path, $language_domain = 'en', $options = null) { + $this->dom = $dom; + $this->css = $css; + $this->path = $path; + $this->lang = $language_domain; + $this->options = $options; + $this->report = array(); + $this->loadServices(); + $this->check(); + } + + //abstract function check(); + + /** + * If this test requires services, it loads the associated files and creates a new + * service instance locally. + */ + + function loadServices() { + foreach($this->services as $service => $file_name) { + if(!class_exists($service .'Service')) { + require_once('services/'. $file_name .'.php'); + } + $service_name = $service .'Service'; + $this->services[$service] = new $service_name(); + } + } + + /** + * Helper method to collect the report from this test. Some + * tests do additional cleanup by overriding this method + * @return array An array of QuailReportItem objects + */ + function getReport() { + $this->report['severity'] = $this->default_severity; + return $this->report; + } + + /** + * Returns the default severity of the test + * @return int The severity level + */ + function getSeverity() { + return $this->default_severity; + } + /** + * Adds a new QuailReportItem to this current tests collection of reports. + * Most reports pertain to a particular element (like an IMG with no Alt attribute); + * however, some are document-level and just either pass or don't pass + * @param object $element The DOMElement object that pertains to this report + * @param string $message An additional message to add to the report + * @param bool $pass Whether or not this report passed + */ + function addReport($element = null, $message = null, $pass = null) { + $report = new quailReportItem(); + $report->element = $element; + $report->message = $message; + $report->pass = $pass; + $this->report[] = $report; + } + + /** + * Retrieves the full path for a file. + * @param string $file The path to a file + * @return string The absolute path to the file. + */ + function getPath($file) { + if(substr($file, 0, 7) == 'http://' || substr($file, 0, 8) == 'https://') + return $file; + $file = explode('/', $file); + if(count($file) == 1) + return implode('/', $this->path) .'/'. $file[0]; + + $path = $this->path; + foreach($file as $directory) { + if($directory == '..') + array_pop($path); + else + $file_path[] = $directory; + } + + return implode('/', $path) .'/'. implode('/', $file_path); + + } + + /** + * Returns a translated variable. If the translation is unavailable, English is returned + * Because tests only really have one string array, we can get all of this info locally + * @return mixed The translation for the object + */ + function translation() { + if(isset($this->strings[$this->lang])) { + return $this->strings[$this->lang]; + } + if(isset($this->strings['en'])) { + return $this->strings['en']; + } + return false; + } + + /** + * Helper method to find all the elements that fit a particular query + * in the document (either by tag name, or by attributes from the htmlElements object) + * @param mixed $tags Either a single tag name in a string, or an array of tag names + * @param string $options The kind of option to select an element by (see htmlElements) + * @param string $value The value of the above option + * @return array An array of elements that fit the description + * @todo this should cache results in a static variable, as many of these can be iterated over again + */ + function getAllElements($tags = null, $options = false, $value = true) { + if(!is_array($tags)) + $tags = array($tags); + if($options !== false) + $tags = htmlElements::getElementsByOption($options, $value); + $result = array(); + + if(!is_array($tags)) + return array(); + foreach($tags as $tag) { + $elements = $this->dom->getElementsByTagName($tag); + if($elements) { + foreach($elements as $element) { + $result[] = $element; + } + } + } + if(count($result) == 0) + return array(); + return $result; + } + + /** + * Returns true if an element has a child with a given tag name + * @param object $element A DOMElement object + * @param string $child_tag The tag name of the child to find + * @return bool TRUE if the element does have a child with + * the given tag name, otherwise FALSE + */ + function elementHasChild($element, $child_tag) { + foreach($element->childNodes as $child) { + if(property_exists($child, 'tagName') && $child->tagName == $child_tag) + return true; + } + return false; + } + + /** + * Returns the first ancestor reached of a tag, or false if it hits + * the document root or a given tag. + * @param object $element A DOMElement object + * @param string $ancestor_tag The name of the tag we are looking for + * @param string $limit_tag Where to stop searching + */ + function getElementAncestor($element, $ancestor_tag, $limit_tag = 'body') { + while(property_exists($element, 'parentNode')) { + if($element->parentNode->tagName == $ancestor_tag) { + return $element->parentNode; + } + if($element->parentNode->tagName == $limit_tag) { + return false; + } + $element = $element->parentNode; + } + return false; + } + + /** + * Finds all the elements with a given tag name that has + * an attribute + * @param string $tag The tag name to search for + * @param string $attribute The attribute to search on + * @param bool $unique Whether we only want one result per attribute + * @return array An array of DOMElements with the attribute + * value as the key. + * + */ + function getElementsByAttribute($tag, $attribute, $unique = false) { + $results = array(); + foreach($this->getAllElements($tag) as $element) { + if($element->hasAttribute($attribute)) { + if($unique) + $results[$element->getAttribute($attribute)] = $element; + else + $results[$element->getAttribute($attribute)][] = $element; + } + } + return $results; + } + + /** + * Returns the next element after the current one. + * @param object $element A DOMElement object + * @return mixed FALSE if there is no other element, or a DOMElement object + */ + function getNextElement($element) { + $parent = $element->parentNode; + $next = false; + foreach($parent->childNodes as $child) { + if($next) + return $child; + if($child->isSameNode($element)) + $next = true; + } + return false; + } + + /** + * To minimize notices, this compares an object's property to the valus + * and returns true or false. False will also be returned if the object is + * not really an object, or if the property doesn't exist at all + * @param object $object The object too look at + * @param string $property The name of the property + * @param mixed $value The value to check against + * @param bool $trim Whether the property value should be trimmed + * @param book $lower Whether the property value should be compared on lower case + **/ + function propertyIsEqual($object, $property, $value, $trim = false, $lower = false) { + if(!is_object($object)) { + return false; + } + if(!property_exists($object, $property)) { + return false; + } + $property_value = $object->$property; + if($trim) { + $property_value = trim($property_value); + $value = trim($value); + } + if($lower) { + $property_value = strtolower($property_value); + $value = strtolower($value); + } + return ($property_value == $value); + } + + /** + * Returns the parent of an elment that has a given tag Name, but + * stops the search if it hits the $limiter tag + * @param object $element The DOMElement object to search on + * @param string $tag_name The name of the tag of the parent to find + * @param string $limiter The tag name of the element to stop searching on + * regardless of the results (like search for a parent "P" tag + * of this node but stop if you reach "body") + * @return mixed FALSE if no parent is found, or the DOMElement object of the found parent + */ + function getParent($element, $tag_name, $limiter) { + while($element) { + if($element->tagName == $tag_name) + return $element; + if($element->tagName == $limiter) + return false; + $element = $element->parentNode; + } + return false; + } + + /** + * Returns if a GIF files is animated or not + * @url http://us.php.net/manual/en/function.imagecreatefromgif.php#88005 + */ + function imageIsAnimated($filename) { + if(!($fh = @fopen($filename, 'rb'))) + return false; + $count = 0; + //an animated gif contains multiple "frames", with each frame having a + //header made up of: + // * a static 4-byte sequence (\x00\x21\xF9\x04) + // * 4 variable bytes + // * a static 2-byte sequence (\x00\x2C) + + // We read through the file til we reach the end of the file, or we've found + // at least 2 frame headers + while(!feof($fh) && $count < 2) + $chunk = fread($fh, 1024 * 100); //read 100kb at a time + $count += preg_match_all('#\x00\x21\xF9\x04.{4}\x00\x2C#s', $chunk, $matches); + + fclose($fh); + return $count > 1; + } + + /** + * Returns if there are any printable/readable characters within an element. + * This finds both node values or images with alt text. + * @param object $element The given element to look at + * @return bool TRUE if contains readable text, FALSE if otherwise + */ + function elementContainsReadableText($element) { + if(is_a($element, 'DOMText')) { + if(trim($element->wholeText) != '') { + return true; + } + } + else { + if(trim($element->nodeValue) != '' || + ($element->hasAttribute('alt') && trim($element->getAttribute('alt')) != '')) { + return true; + } + if(method_exists($element, 'hasChildNodes') && $element->hasChildNodes()) { + foreach($element->childNodes as $child) { + if($this->elementContainsReadableText($child)) { + return true; + } + } + } + } + return false; + } + +} + +/** +* A special base class for tests that only file a report whenever +* it hits the specified tag regardless of anything about the element +* (especially for tests like "No Blink Tag" - or ones that fire on +* objects that require human attention). To use this class, just override +* the value of the $tag variable. +* +*/ +class quailTagTest extends quailTest { + + /** + * @var string The tag name of this test + */ + var $tag = ''; + + /** + * Shouldn't need to be overridden. We just file one report item for every + * element we find with this class's $tag var. + */ + function check() { + foreach($this->getAllElements($this->tag) as $element) { + $this->addReport($element); + } + } +} + +/** +* Special base test class that deals with tests concerning the logical heirarchy +* of headers. To use it, just extend and change the $tag var. +*/ +class quailHeaderTest extends quailTest { + + /** + * @var string The header tag this test applies to. + */ + var $tag = ''; + + /** + * @var array An array of all the header tags + */ + var $headers = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); + + /** + * The check method gathers all the headers together and walks through them, making sure that + * the logical display of headers makes sense. + */ + function check() { + $tag_number = substr($this->tag, -1, 1); + $doc_headers = array(); + $first_header = $this->dom->getElementsByTagName($this->tag); + if($first_header->item(0)) { + $current = $first_header->item(0); + $previous_number = intval(substr($current->tagName, -1, 1)); + while($current) { + + if(property_exists($current, 'tagName') && in_array($current->tagName, $this->headers)) { + $current_number = intval(substr($current->tagName, -1, 1)); + if($current_number > ($previous_number + 1)) + $this->addReport($current); + $previous_number = intval(substr($current->tagName, -1, 1)); + } + $current = $current->nextSibling; + + } + + } + + } +} + +/** +* Special base class which provides helper methods for tables. +*/ +class quailTableTest extends quailTest { + + /** + * Takes the element object of a main table and returns the number + * of rows and columns in it. + * @param object The DOMElement of the main table tag + * @return array An array with the 'rows' value showing + * the number of rows, and columsn showing the number of columns + */ + function getTable($table) { + $rows = 0; + $columns = 0; + $first_row = true; + if($table->tagName != 'table') + return false; + foreach($table->childNodes as $child) { + if(property_exists($child, 'tagName') && $child->tagName == 'tr') { + $rows++; + if($first_row) { + foreach($child->childNodes as $column_child) { + if($column_child->tagName == 'th' || $column_child->tagName == 'td') + $columns++; + } + $first_row = false; + } + } + } + + return array('rows' => $rows, 'columns' => $columns); + } + + /** + * Finds whether or not the table is a data table. Checks that the + * table has a logical order and uses 'th' or 'thead' tags to illustrate + * the page author thought it was a data table. + * @param object $table The DOMElement object of the table tag + * @return bool TRUE if the element is a data table, otherwise false + */ + function isData($table) { + if($table->tagName != 'table') + return false; + foreach($table->childNodes as $child) { + if(property_exists($child, 'tagName') && $child->tagName == 'tr') { + foreach($child->childNodes as $row_child) { + if(property_exists($row_child, 'tagName') && $row_child->tagName == 'th') + return true; + } + } + if(property_exists($child, 'tagName') && $child->tagName == 'thead') + return true; + } + return false; + } + +} + +/** +* Base test class for tests which checks that the given input tag +* has an associated lable tag. +* To override, just override the tag and type variables, and use $no_type = true if it is a special +* form tag like textarea. +*/ +class inputHasLabel extends quailTest { + + /** + * @var string The tag name that this test applies to + */ + var $tag = 'input'; + + /** + * @var string The type of input tag this is + */ + var $type = 'text'; + + /** + * @var bool Wehether or not we should check the type attribute of the input tags + */ + var $no_type = false; + + /** + * Iterate through all the elemetns using the $tag tagname and the $type attribute (if appropriate) + * and then check it against a list of all LABEL tags. + */ + function check() { + foreach($this->getAllElements('label') as $label) { + if($label->hasAttribute('for')) + $labels[$label->getAttribute('for')] = $label; + else { + foreach($label->childNodes as $child) { + if(property_exists($child, 'tagName') && + $child->tagName == $this->tag && + ($child->getAttribute('type') == $this->type || $this->no_type)) { + $input_in_label[$child->getAttribute('name')] = $child; + } + } + } + } + foreach($this->getAllElements($this->tag) as $input) { + if($input->getAttribute('type') == $this->type || $this->no_type) { + if(!$input->hasAttribute('title')) { + if(!isset($input_in_label[$input->getAttribute('name')])) { + if(!isset($labels[$input->getAttribute('id')]) || trim($labels[$input->getAttribute('id')]->nodeValue) == '') + $this->addReport($input); + } + + } + } + } + } + +} + +/** +* Helper base class to check that input tags have an appropriate tab order +*/ +class inputTabIndex extends quailTest { + + /** + * @var string The tag name that this test applies to + */ + var $tag; + + /** + * @var string The type of input tag this is + */ + var $type; + + /** + * @var bool Wehether or not we should check the type attribute of the input tags + */ + var $no_type = false; + + /** + * Iterate through all the input items and make sure the tabindex exists + * and is numeric. + */ + function check() { + foreach($this->getAllElements($this->tag) as $element) { + if(($element->getAttribute('type') == $this->type) + && (!($element->hasAttribute('tabindex')) + || !is_numeric($element->getAttribute('tabindex')))) + $this->addReport($element); + } + } +} + +/** +* Helper test base for tests dealing with color difference and luminosity. +*/ +class quailColorTest extends quailTest { + + var $color_names = array( + 'aliceblue' => 'f0f8ff', + 'antiquewhite' => 'faebd7', + 'aqua' => '00ffff', + 'aquamarine' => '7fffd4', + 'azure' => 'f0ffff', + 'beige' => 'f5f5dc', + 'bisque' => 'ffe4c4', + 'black' => '000000', + 'blanchedalmond' => 'ffebcd', + 'blue' => '0000ff', + 'blueviolet' => '8a2be2', + 'brown' => 'a52a2a', + 'burlywood' => 'deb887', + 'cadetblue' => '5f9ea0', + 'chartreuse' => '7fff00', + 'chocolate' => 'd2691e', + 'coral' => 'ff7f50', + 'cornflowerblue' => '6495ed', + 'cornsilk' => 'fff8dc', + 'crimson' => 'dc143c', + 'cyan' => '00ffff', + 'darkblue' => '00008b', + 'darkcyan' => '008b8b', + 'darkgoldenrod' => 'b8860b', + 'darkgray' => 'a9a9a9', + 'darkgreen' => '006400', + 'darkkhaki' => 'bdb76b', + 'darkmagenta' => '8b008b', + 'darkolivegreen' => '556b2f', + 'darkorange' => 'ff8c00', + 'darkorchid' => '9932cc', + 'darkred' => '8b0000', + 'darksalmon' => 'e9967a', + 'darkseagreen' => '8fbc8f', + 'darkslateblue' => '483d8b', + 'darkslategray' => '2f4f4f', + 'darkturquoise' => '00ced1', + 'darkviolet' => '9400d3', + 'deeppink' => 'ff1493', + 'deepskyblue' => '00bfff', + 'dimgray' => '696969', + 'dodgerblue' => '1e90ff', + 'firebrick' => 'b22222', + 'floralwhite' => 'fffaf0', + 'forestgreen' => '228b22', + 'fuchsia' => 'ff00ff', + 'gainsboro' => 'dcdcdc', + 'ghostwhite' => 'f8f8ff', + 'gold' => 'ffd700', + 'goldenrod' => 'daa520', + 'gray' => '808080', + 'green' => '008000', + 'greenyellow' => 'adff2f', + 'honeydew' => 'f0fff0', + 'hotpink' => 'ff69b4', + 'indianred' => 'cd5c5c', + 'indigo' => '4b0082', + 'ivory' => 'fffff0', + 'khaki' => 'f0e68c', + 'lavender' => 'e6e6fa', + 'lavenderblush' => 'fff0f5', + 'lawngreen' => '7cfc00', + 'lemonchiffon' => 'fffacd', + 'lightblue' => 'add8e6', + 'lightcoral' => 'f08080', + 'lightcyan' => 'e0ffff', + 'lightgoldenrodyellow' => 'fafad2', + 'lightgrey' => 'd3d3d3', + 'lightgreen' => '90ee90', + 'lightpink' => 'ffb6c1', + 'lightsalmon' => 'ffa07a', + 'lightseagreen' => '20b2aa', + 'lightskyblue' => '87cefa', + 'lightslategray' => '778899', + 'lightsteelblue' => 'b0c4de', + 'lightyellow' => 'ffffe0', + 'lime' => '00ff00', + 'limegreen' => '32cd32', + 'linen' => 'faf0e6', + 'magenta' => 'ff00ff', + 'maroon' => '800000', + 'mediumaquamarine' => '66cdaa', + 'mediumblue' => '0000cd', + 'mediumorchid' => 'ba55d3', + 'mediumpurple' => '9370d8', + 'mediumseagreen' => '3cb371', + 'mediumslateblue' => '7b68ee', + 'mediumspringgreen' => '00fa9a', + 'mediumturquoise' => '48d1cc', + 'mediumvioletred' => 'c71585', + 'midnightblue' => '191970', + 'mintcream' => 'f5fffa', + 'mistyrose' => 'ffe4e1', + 'moccasin' => 'ffe4b5', + 'navajowhite' => 'ffdead', + 'navy' => '000080', + 'oldlace' => 'fdf5e6', + 'olive' => '808000', + 'olivedrab' => '6b8e23', + 'orange' => 'ffa500', + 'orangered' => 'ff4500', + 'orchid' => 'da70d6', + 'palegoldenrod' => 'eee8aa', + 'palegreen' => '98fb98', + 'paleturquoise' => 'afeeee', + 'palevioletred' => 'd87093', + 'papayawhip' => 'ffefd5', + 'peachpuff' => 'ffdab9', + 'peru' => 'cd853f', + 'pink' => 'ffc0cb', + 'plum' => 'dda0dd', + 'powderblue' => 'b0e0e6', + 'purple' => '800080', + 'red' => 'ff0000', + 'rosybrown' => 'bc8f8f', + 'royalblue' => '4169e1', + 'saddlebrown' => '8b4513', + 'salmon' => 'fa8072', + 'sandybrown' => 'f4a460', + 'seagreen' => '2e8b57', + 'seashell' => 'fff5ee', + 'sienna' => 'a0522d', + 'silver' => 'c0c0c0', + 'skyblue' => '87ceeb', + 'slateblue' => '6a5acd', + 'slategray' => '708090', + 'snow' => 'fffafa', + 'springgreen' => '00ff7f', + 'steelblue' => '4682b4', + 'tan' => 'd2b48c', + 'teal' => '008080', + 'thistle' => 'd8bfd8', + 'tomato' => 'ff6347', + 'turquoise' => '40e0d0', + 'violet' => 'ee82ee', + 'wheat' => 'f5deb3', + 'white' => 'ffffff', + 'whitesmoke' => 'f5f5f5', + 'yellow' => 'ffff00', + 'yellowgreen' => '9acd32' + ); + + /** + * Helper method that finds the luminosity between the provided + * foreground and background parameters. + * @param string $foreground The HEX value of the foreground color + * @param string $background The HEX value of the background color + * @return float The luminosity contrast ratio between the colors + */ + function getLuminosity($foreground, $background) { + if($foreground == $background) return 0; + $fore_rgb = $this->getRGB($foreground); + $back_rgb = $this->getRGB($background); + return $this->luminosity($fore_rgb['r'], $back_rgb['r'], + $fore_rgb['g'], $back_rgb['g'], + $fore_rgb['b'], $back_rgb['b']); + } + + /** + * Returns the luminosity between two colors + * @param string $r The first Red value + * @param string $r2 The second Red value + * @param string $g The first Green value + * @param string $g2 The second Green value + * @param string $b The first Blue value + * @param string $b2 The second Blue value + * @return float The luminosity contrast ratio between the colors + */ + function luminosity($r,$r2,$g,$g2,$b,$b2) { + $RsRGB = $r/255; + $GsRGB = $g/255; + $BsRGB = $b/255; + $R = ($RsRGB <= 0.03928) ? $RsRGB/12.92 : pow(($RsRGB+0.055)/1.055, 2.4); + $G = ($GsRGB <= 0.03928) ? $GsRGB/12.92 : pow(($GsRGB+0.055)/1.055, 2.4); + $B = ($BsRGB <= 0.03928) ? $BsRGB/12.92 : pow(($BsRGB+0.055)/1.055, 2.4); + + $RsRGB2 = $r2/255; + $GsRGB2 = $g2/255; + $BsRGB2 = $b2/255; + $R2 = ($RsRGB2 <= 0.03928) ? $RsRGB2/12.92 : pow(($RsRGB2+0.055)/1.055, 2.4); + $G2 = ($GsRGB2 <= 0.03928) ? $GsRGB2/12.92 : pow(($GsRGB2+0.055)/1.055, 2.4); + $B2 = ($BsRGB2 <= 0.03928) ? $BsRGB2/12.92 : pow(($BsRGB2+0.055)/1.055, 2.4); + + if ($r+$g+$b <= $r2+$g2+$b2) { + $l2 = (.2126 * $R + 0.7152 * $G + 0.0722 * $B); + $l1 = (.2126 * $R2 + 0.7152 * $G2 + 0.0722 * $B2); + } else { + $l1 = (.2126 * $R + 0.7152 * $G + 0.0722 * $B); + $l2 = (.2126 * $R2 + 0.7152 * $G2 + 0.0722 * $B2); + } + + $luminosity = round(($l1 + 0.05)/($l2 + 0.05),2); + return $luminosity; + } + + + /** + * Returns the decimal equivalents for a HEX color + * @param string $color The hex color value + * @return array An array where 'r' is the Red value, 'g' is Green, and 'b' is Blue + */ + function getRGB($color) { + $color = $this->convertColor($color); + $c = str_split($color, 2); + if(count($c) != 3) { + return false; + } + $results = array('r' => hexdec($c[0]), 'g' => hexdec($c[1]), 'b' => hexdec($c[2])); + return $results; + } + + /** + * Converts multiple color or backround styles into a simple hex string + * @param string $color The color attribute to convert (this can also be a multi-value css background value) + * @return string A standard CSS hex value for the color + */ + function convertColor($color) { + $color = trim($color); + if(strpos($color, ' ') !== false) { + $colors = explode(' ', $color); + foreach($colors as $background_part) { + if(substr(trim($background_part), 0, 1) == '#' || + in_array(trim($background_part), array_keys($this->color_names)) || + strtolower(substr(trim($background_part), 0, 3)) == 'rgb') { + $color = $background_part; + } + } + } + //Normal hex color + if(substr($color, 0, 1) == '#') { + if(strlen($color) == 7) { + return str_replace('#', '', $color); + } + elseif (strlen($color == 4)) { + return substr($color, 1, 1).substr($color, 1, 1). + substr($color, 2, 1).substr($color, 2, 1). + substr($color, 3, 1).substr($color, 3, 1); + } + } + //Named Color + if(in_array($color, array_keys($this->color_names))) { + return $this->color_names[$color]; + } + //rgb values + if(strtolower(substr($color, 0, 3)) == 'rgb') { + $colors = explode(',', trim(str_replace('rgb(', '', $color), '()')); + if(!count($colors) != 3) { + return false; + } + $r = intval($colors[0]); + $g = intval($colors[1]); + $b = intval($colors[2]); + + $r = dechex($r<0?0:($r>255?255:$r)); + $g = dechex($g<0?0:($g>255?255:$g)); + $b = dechex($b<0?0:($b>255?255:$b)); + + $color = (strlen($r) < 2?'0':'').$r; + $color .= (strlen($g) < 2?'0':'').$g; + $color .= (strlen($b) < 2?'0':'').$b; + return $color; + } + } + + /** + * Returns the WAIERT contrast between two colors + * @see GetLuminosity + */ + function getWaiErtContrast($foreground, $background) { + $fore_rgb = $this->getRGB($foreground); + $back_rgb = $this->getRGB($background); + $diffs = $this->getWaiDiffs($fore_rgb, $back_rgb); + + return $diffs['red'] + $diffs['green'] + $diffs['blue']; + } + + /** + * Returns the WAI ERT Brightness between two colors + * + */ + function getWaiErtBrightness($foreground, $background) { + $fore_rgb = $this->getRGB($foreground); + $back_rgb = $this->getRGB($background); + $color = $this->getWaiDiffs($fore_rgb, $back_rgb); + return (($color['red'] * 299) + ($color['green'] * 587) + ($color['blue'] * 114)) / 1000; + } + + function getWaiDiffs($fore_rgb, $back_rgb) { + $red_diff = ($fore_rgb['r'] > $back_rgb['r']) + ? $fore_rgb['r'] - $back_rgb['r'] + : $back_rgb['r'] - $fore_rgb['r']; + $green_diff = ($fore_rgb['g'] > $back_rgb['g']) + ? $fore_rgb['g'] - $back_rgb['g'] + : $back_rgb['g'] - $fore_rgb['g']; + + $blue_diff = ($fore_rgb['b'] > $back_rgb['b']) + ? $fore_rgb['b'] - $back_rgb['b'] + : $back_rgb['b'] - $fore_rgb['b']; + return array('red' => $red_diff, 'green' => $green_diff, 'blue' => $blue_diff); + } +} + +/** +* Base class for test dealing with WAI ERT color contrast for the document +* Because a lot of the tests deal with text, vlink, alink, etc. +*/ +class bodyWaiErtColorContrast extends quailColorTest { + + /** + * @var string The attribute to check for the background color of the tag + */ + var $background = 'bgcolor'; + + /** + * @var string The attribute to check for the foreground color of the tag + */ + var $foreground = 'text'; + + /** + * Compares the WAI ERT contrast on the given color attributes of the tag + */ + function check() { + $body = $this->getAllElements('body'); + if(!$body) + return false; + $body = $body[0]; + if($body->hasAttribute($this->foreground) && $body->hasAttribute($this->background)) + if( $this->getWaiErtContrast($body->getAttribute($this->foreground), $body->getAttribute($this->background)) < 500) + $this->addReport(null, null, false); + elseif($this->getWaiErtBrightness($body->getAttribute($this->foreground), $body->getAttribute($this->background)) < 125) + $this->addReport(null, null, false); + + } + +} + +/** +* Helper function to support checking the varous color attributes of the tag +* against WCAG standards +*/ +class bodyColorContrast extends quailColorTest { + + /** + * @var string The attribute to check for the background color of the tag + */ + var $background = 'bgcolor'; + + /** + * @var string The attribute to check for the foreground color of the tag + */ + var $foreground = 'text'; + + /** + * Compares the WCAG contrast on the given color attributes of the tag + */ + function check() { + $body = $this->getAllElements('body'); + if(!$body) + return false; + $body = $body[0]; + if($body->hasAttribute($this->foreground) && $body->hasAttribute($this->background)) + if( $this->getLuminosity($body->getAttribute($this->foreground), $body->getAttribute($this->background)) < 5) + $this->addReport(null, null, false); + } +} \ No newline at end of file diff --git a/quail/common/accessibility_tests.php b/quail/common/accessibility_tests.php new file mode 100755 index 0000000..04b9b19 --- /dev/null +++ b/quail/common/accessibility_tests.php @@ -0,0 +1,6042 @@ +. +* @author Kevin Miller +*/ + +/** +* \defgroup tests Accessibility Tests +*/ +/*@{*/ + + +/** +* Adjacent links with same resource must be combined. +* If 2 adjacent links have the same destination then this error will be generated. +*/ + + +/** +* There are no adjacent text and image links having the same destination. +* This objective of this technique is to avoid unnecessary duplication that occurs when adjacent text and iconic versions of a link are contained in a document. +* @link http://quail-lib.org/test-info/aAdjacentWithSameResourceShouldBeCombined +*/ +class aAdjacentWithSameResourceShouldBeCombined extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if($this->propertyIsEqual($a->nextSibling, 'wholeText', '', true)) + $next = $a->nextSibling->nextSibling; + else + $next = $a->nextSibling; + if($this->propertyIsEqual($next, 'tagName', 'a')) { + if($a->getAttribute('href') == $next->getAttribute('href')) + $this->addReport($a); + } + } + } +} + +/** +* Alt text for all img elements used as source anchors is different from the link text. +* If an image occurs within a link, the Alt text should be different from the link text. +* @link http://quail-lib.org/test-info/aImgAltNotRepetative +*/ +class aImgAltNotRepetative extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + foreach($a->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'img')) { + if(trim($a->nodeValue) == trim($child->getAttribute('alt'))) + $this->addReport($child); + } + } + } + } +} + +/** +* Link text does not begin with \"link to\"" or \""go to\"" (English)." +* Alt text for images used as links should not begin with \"link to\"" or \""go to\""." +* @link http://quail-lib.org/test-info/aLinkTextDoesNotBeginWithRedundantWord +*/ +class aLinkTextDoesNotBeginWithRedundantWord extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('link to', 'go to'), + 'es' => array('enlaces a', 'ir a') + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(!$a->nodeValue) { + if(property_exists($a, 'firstChild') && $this->propertyIsEqual($a->firstChild, 'tagName', 'img')) { + $text = $a->firstChild->getAttribute('alt'); + } + } + else + $text = $a->nodeValue; + foreach($this->translation() as $word) { + if(strpos(trim($text), $word) === 0) + $this->addReport($a); + } + } + } +} + +/** +* Include non-link, printable characters (surrounded by spaces) between adjacent links. +* Adjacent links must be separated by printable characters. [Editor's Note - Define adjacent link? Printable characters always?] +* @link http://quail-lib.org/test-info/aLinksAreSeperatedByPrintableCharacters +*/ +class aLinksAreSeperatedByPrintableCharacters extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(property_exists($a, 'nextSibling') + && is_object($a->nextSibling) + && property_exists($a->nextSibling, 'nextSibling') + && $this->propertyIsEqual($a->nextSibling->nextSibling, 'tagName', 'a') + && ($this->propertyIsEqual($a->nextSibling, 'wholeText', '', true) + || !property_exists($a->nextSibling, 'wholeText') + || $this->propertyIsEqual($a->nextSibling, 'nodeValue', '', true) + ) + ) { + $this->addReport($a); + } + } + } +} + +/** +* Anchor should not open new window without warning. +* a (anchor) element must not contain a target attribute unless the target attribute value is either _self, _top, or _parent. +* @link http://quail-lib.org/test-info/aLinksDontOpenNewWindow +*/ +class aLinksDontOpenNewWindow extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $allowed_targets A list of targest allowed that don't open a new window + */ + var $allowed_targets = array('_self', '_parent', '_top'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if($a->hasAttribute('target') + && !in_array($a->getAttribute('target'), $this->allowed_targets)) { + $this->addReport($a); + } + } + } + +} + +/** +* Link text is meaningful when read out of context. +* All a (anchor) elements that contains any text will generate this error. +* @link http://quail-lib.org/test-info/aLinksMakeSenseOutOfContext +*/ +class aLinksMakeSenseOutOfContext extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(strlen($a->nodeValue) > 1) + $this->addReport($a); + } + } + +} + +/** +* Links to multimedia require a text transcript. +* a (anchor) element must not contain an href attribute value that ends with (case insensitive): .wmv, .mpg, .mov, .ram, .aif. +* @link http://quail-lib.org/test-info/aLinksToMultiMediaRequireTranscript +*/ +class aLinksToMultiMediaRequireTranscript extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var array $extensions A list of extensions that are considered links to multimedi + */ + var $extensions = array('wmv', 'mpg', 'mov', 'ram', 'aif'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if($a->hasAttribute('href')) { + $filename = explode('.', $a->getAttribute('href')); + $extension = array_pop($filename); + if(in_array($extension, $this->extensions)) + $this->addReport($a); + } + } + } + +} + +/** +* Sound file must have a text transcript. +* a (anchor) element cannot contain an href attribute value that ends with any of the following (all case insensitive): .wav, .snd, .mp3, .iff, .svx, .sam, .smp, .vce, .vox, .pcm, .aif. +* @link http://quail-lib.org/test-info/aLinksToSoundFilesNeedTranscripts +*/ +class aLinksToSoundFilesNeedTranscripts extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var array $extensions A list of extensions that mean this file is a link to audio + */ + var $extensions = array('wav', 'snd', 'mp3', 'iff', 'svx', 'sam', 'smp', 'vce', 'vox', 'pcm', 'aif'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if($a->hasAttribute('href')) { + $filename = explode('.', $a->getAttribute('href')); + $extension = array_pop($filename); + if(in_array($extension, $this->extensions)) + $this->addReport($a); + } + } + } +} + +/** +* Links to multimedia content should also link to alternate content +* @link http://quail-lib.org/test-info/aMultimediaTextAlternative +*/ +class aMultimediaTextAlternative extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var array $extensions An array of extensionst that mean this is multimedia + */ + var $extensions = array('wmv', 'wav', 'mpg', 'mov', 'ram', 'aif'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if($a->hasAttribute('href')) { + $extension = substr($a->getAttribute('href'), + (strrpos($a->getAttribute('href'), '.') + 1), 4); + if(in_array($extension, $this->extensions)) + $this->addReport($a); + } + } + } +} + +/** +* Each source anchor contains text. +* a (anchor) element must contain text. The text may occur in the anchor text or in the title attribute of the anchor or in the Alt text of an image used within the anchor. +* @link http://quail-lib.org/test-info/aMustContainText +*/ +class aMustContainText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(!$this->elementContainsReadableText($a) && ($a->hasAttribute('href'))) { + $this->addReport($a); + } + } + } + + /** + * Returns if a link is not a candidate to be an anchor (which does + * not need text) + * @param object The element link in question + * @return bool Whether is is a link (TRUE) or an anchor (FALSE) + */ + function isNotAnchor($a) { + return (!($a->hasAttribute('name') && !$a->hasAttribute('href'))); + } +} + +/** +* Anchor element must have a title attribute. +* Each source a (anchor) element must have a title attribute. +* @link http://quail-lib.org/test-info/aMustHaveTitle +*/ +class aMustHaveTitle extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(!$a->hasAttribute('title')) + $this->addReport($a); + } + + } +} + +/** +* Anchor must not use Javascript URL protocol. +* Anchor elements must not have an href attribute value that starts with "javascript:". +* @link http://quail-lib.org/test-info/aMustNotHaveJavascriptHref +*/ +class aMustNotHaveJavascriptHref extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(substr(trim($a->getAttribute('href')), 0, 11) == 'javascript:') + $this->addReport($a); + } + } +} + +/** +* Suspicious link text. +* a (anchor) element cannot contain any of the following text (English): \"click here\"" +* @link http://quail-lib.org/test-info/aSuspiciousLinkText +*/ +class aSuspiciousLinkText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('click here', 'click', 'more', 'here'), + 'es' => array('clic aquí', 'clic', 'haga clic', 'más', 'aquí')); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(in_array(strtolower(trim($a->nodeValue)), $this->translation())) + $this->addReport($a); + } + + } +} + +/** +* The title attribute of all source a (anchor) elements describes the link destination. +* Each source a (anchor) element must have a title attribute that describes the link destination. +* @link http://quail-lib.org/test-info/aTitleDescribesDestination +*/ +class aTitleDescribesDestination extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if($a->hasAttribute('title')) + $this->addReport($a); + } + + } +} + +/** +* Content must have an address for author. +* address element must be present. +* @link http://quail-lib.org/test-info/addressForAuthor +*/ +class addressForAuthor extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('address') as $address) { + foreach($address->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'a')) + return true; + } + } + $this->addReport(null, null, false); + } + +} + +/** +* address of page author must be valid. +* This error will be generated for each address element. [Editor's Note: What is a valid address?] +* @link http://quail-lib.org/test-info/addressForAuthorMustBeValid +*/ +class addressForAuthorMustBeValid extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('address') as $address) { + if ($this->validateEmailAddress($address->nodeValue, array('check_domain' => $this->checkDomain))) + return true; + foreach($address->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'a') + && substr(strtolower($child->getAttribute('href')), 0, 7) == 'mailto:') { + if($this->validateEmailAddress(trim(str_replace('mailto:', '', $child->getAttribute('href'))), + array('check_domain' => $this->checkDomain))) + return true; + + } + } + } + $this->addReport(null, null, false); + } + + + function validateEmailAddress($email) { + // First, we check that there's one @ symbol, + // and that the lengths are right. + if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) { + // Email invalid because wrong number of characters + // in one section or wrong number of @ symbols. + return false; + } + // Split it into sections to make life easier + $email_array = explode("@", $email); + $local_array = explode(".", $email_array[0]); + for ($i = 0; $i < sizeof($local_array); $i++) { + if + (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", + $local_array[$i])) { + return false; + } + } + // Check if domain is IP. If not, + // it should be valid domain name + if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { + $domain_array = explode(".", $email_array[1]); + if (sizeof($domain_array) < 2) { + return false; // Not enough parts to domain + } + for ($i = 0; $i < sizeof($domain_array); $i++) { + if + (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", + $domain_array[$i])) { + return false; + } + } + } + return true; + } + +} + +/** +* applet contains a text equivalent in the body of the applet. +* This error is generated for all applet elements. +* @link http://quail-lib.org/test-info/appletContainsTextEquivalent +*/ +class appletContainsTextEquivalent extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('applet') as $applet) { + if(trim($applet->nodeValue) == '' || !$applet->nodeValue) + $this->addReport($applet); + + } + } + +} + +/** +* applet contains a text equivalent in the body of the applet. +* This error is generated for all applet elements. +* @link http://quail-lib.org/test-info/appletContainsTextEquivalentInAlt +*/ +class appletContainsTextEquivalentInAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('applet') as $applet) { + if(!$applet->hasAttribute('alt') || $applet->getAttribute('alt') == '') + $this->addReport($applet); + + } + } + +} + +/** +* applet provides a keyboard mechanism to return focus to the parent window. +* Ensure that keyboard users do not become trapped in a subset of the content that can only be exited using a mouse or pointing device. +* @link http://quail-lib.org/test-info/appletProvidesMechanismToReturnToParent +*/ +class appletProvidesMechanismToReturnToParent extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'applet'; +} + +/** +* applet text equivalnets are updated as well if the applet content is updated +* @link http://quail-lib.org/test-info/appletTextEquivalentsGetUpdated +*/ +class appletTextEquivalentsGetUpdated extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'applet'; + +} + +/** +* applet user interface must be accessible. +* This error is generated for all applet elements. +* @link http://quail-lib.org/test-info/appletUIMustBeAccessible +*/ +class appletUIMustBeAccessible extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'applet'; +} + +/** +* All applets do not flicker. +* This error is generated for all applet elements. +* @link http://quail-lib.org/test-info/appletsDoNotFlicker +*/ +class appletsDoNotFlicker extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'applet'; + +} + +/** +* applet should not use color alone. +* This error is generated for all applet elements. +* @link http://quail-lib.org/test-info/appletsDoneUseColorAlone +*/ +class appletsDoneUseColorAlone extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'applet'; +} + +/** +* Alt text for all area elements identifies the link destination. +* Alt text for area element must describe the link destination. +* @link http://quail-lib.org/test-info/areaAltIdentifiesDestination +*/ +class areaAltIdentifiesDestination extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'area'; + +} + +/** +* Alt text for all area elements contains all non decorative text in the image area. +* This error is generated for all area elements. +* @link http://quail-lib.org/test-info/areaAltRefersToText +*/ +class areaAltRefersToText extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'area'; +} + +/** +* area should not open new window without warning. +* area element, target attribute values must contain any one of (case insensitive) _self, _top, _parent. +* @link http://quail-lib.org/test-info/areaDontOpenNewWindow +*/ +class areaDontOpenNewWindow extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $allowed_targets A list of targets which are allowed + */ + var $allowed_targets = array('_self', '_parent', '_top'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('area') as $area) { + if($area->hasAttribute('target') + && !in_array($area->getAttribute('target'), $this->allowed_targets)) { + $this->addReport($area); + } + } + } + +} + +/** +* All area elements have an alt attribute. +* area elements must contain a alt attribute. +* @link http://quail-lib.org/test-info/areaHasAltValue +*/ +class areaHasAltValue extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('area') as $area) { + if(!$area->hasAttribute('alt')) + $this->addReport($area); + } + } + +} + +/** +* area link to sound file must have text transcript. +* area elements must not contain href attribute values that end with (all case insensitive) .wav, .snd, .mp3, .iff, .svx, .sam, .smp, .vce, .vox, .pcm, .aif +* @link http://quail-lib.org/test-info/areaLinksToSoundFile +*/ +class areaLinksToSoundFile extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var array $extensions An array of extensions which menas this is a sound file + */ + var $extensions = array('wav', 'snd', 'mp3', 'iff', 'svx', 'sam', 'smp', 'vce', 'vox', 'pcm', 'aif'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('area') as $area) { + if($area->hasAttribute('href')) { + $filename = explode('.', $area->getAttribute('href')); + $extension = array_pop($filename); + if(in_array($extension, $this->extensions)) + $this->addReport($area); + } + } + } + +} + +/** +* basefont must not be used. +* This error is generated for all basefont elements. +* @link http://quail-lib.org/test-info/basefontIsNotUsed +*/ +class basefontIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'basefont'; +} + +/** +* blink element is not used. +* This error is generated for all blink elements. +* @link http://quail-lib.org/test-info/blinkIsNotUsed +*/ +class blinkIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'blink'; + +} + +/** +* blockquote must not be used for indentation. +* This error is generated if any blockquote element is missing a cite attribute. +* @link http://quail-lib.org/test-info/blockquoteNotUsedForIndentation +*/ +class blockquoteNotUsedForIndentation extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('blockquote') as $blockquote) { + if(!$blockquote->hasAttribute('cite')) + $this->addReport($blockquote); + } + } +} + +/** +* Use the blockquote element to mark up block quotations. +* If body element content is greater than 10 characters (English) then this error will be generated. +* @link http://quail-lib.org/test-info/blockquoteUseForQuotations +*/ +class blockquoteUseForQuotations extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('p') as $paragraph) { + if(in_array(substr(trim($paragraph->nodeValue), 0, 1), array('"', "'")) && + in_array(substr(trim($paragraph->nodeValue), -1, 1), array('"', "'"))) { + $this->addReport($paragraph); + } + } + } + +} + +/** +* The luminosity contrast ratio between active link text and background color is at least 5:1. +* The luminosity contrast ratio between active link text and background color is at least 5:1 +* @link http://quail-lib.org/test-info/bodyActiveLinkColorContrast +*/ +class bodyActiveLinkColorContrast extends bodyColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $foreground The type of item that should be checked for contrast in the foreground + */ + var $foreground = 'alink'; +} + + + + +/** +* The luminosity contrast ratio between link text and background color is at least 5:1. +* The luminosity contrast ratio between link text and background color is at least 5:1 +* @link http://quail-lib.org/test-info/bodyLinkColorContrast +*/ +class bodyLinkColorContrast extends bodyColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $foreground The type of item that should be checked for contrast in the foreground + */ + var $foreground = 'link'; +} + +/** +* Do not use background images. +* The body element must not contain a background attribute. +* @link http://quail-lib.org/test-info/bodyMustNotHaveBackground +*/ +class bodyMustNotHaveBackground extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $body = $this->getAllElements('body'); + if(!$body) + return false; + $body = $body[0]; + if($body->hasAttribute('background')) + $this->addReport(null, null, false); + } +} + +/** +* The luminosity contrast ratio between visited link text and background color is at least 5:1. +* The luminosity contrast ratio between visited link text and background color is at least 5:1 +* @link http://quail-lib.org/test-info/bodyVisitedLinkColorContrast +*/ +class bodyVisitedLinkColorContrast extends bodyColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $foreground The type of item that should be checked for contrast in the foreground + */ + var $foreground = 'vlink'; +} + +/** +* b (bold) element is not used. +* This error will be generated for all B elements. +* @link http://quail-lib.org/test-info/boldIsNotUsed +*/ +class boldIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'bold'; +} + +/** +* All input elements, type of "checkbox", have an explicitly associated label. +* input element that contains a type attribute value of "checkbox" must have an associated label element. An associated label is one in which the for attribute value of the label element is the same as the id attribute value of the input element. +* @link http://quail-lib.org/test-info/checkboxHasLabel +*/ +class checkboxHasLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'checkbox'; + + /** + * @var bool $no_type We are not looking at the type of input here + */ + var $no_type = false; +} + +/** +* All input elements, type of "checkbox", have a label that is positioned close to the control. +* input element with a type attribute value of "checkbox" must have an associated label element positioned close to it. +* @link http://quail-lib.org/test-info/checkboxLabelIsNearby +*/ +class checkboxLabelIsNearby extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'checkbox') + $this->addReport($input); + + } + } +} + +/** +* Document must be readable when stylesheets are not applied. +* This error will be generated for each link element that has a rel attribute with a value of "stylesheet". +* @link http://quail-lib.org/test-info/cssDocumentMakesSenseStyleTurnedOff +*/ +class cssDocumentMakesSenseStyleTurnedOff extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('link') as $link) { + if($link->parentNode->tagName == 'head') { + if($link->getAttribute('rel') == 'stylesheet') + $this->addReport($link); + } + } + } +} + +/** +* Checks that all color and background elements has stufficient contrast. +* +* @link http://quail-lib.org/test-info/cssTextHasContrast +*/ +class cssTextHasContrast extends quailColorTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $default_background The default background color + */ + var $default_background = '#ffffff'; + + /** + * @var string $default_background The default background color + */ + var $default_color = '#000000'; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + if(isset($this->options['css_background'])) { + $this->default_background = $this->options['css_background']; + } + if(isset($this->options['css_foreground'])) { + $this->default_color = $this->options['css_foreground']; + } + $xpath = new DOMXPath($this->dom); + $entries = $xpath->query('//*'); + foreach($entries as $element) { + $style = $this->css->getStyle($element); + if((isset($style['background']) || isset($style['background-color'])) && isset($style['color']) && $element->nodeValue) { + $background = (isset($style['background-color'])) + ? $style['background-color'] + : $style['background']; + if(!$background || $this->options['css_only_use_default']) { + $background = $this->default_background; + } + $luminosity = $this->getLuminosity( + $style['color'], + $background + ); + if($luminosity < 5) { + $this->addReport($element, 'background: '. $background .' fore: '. $style['color'] . ' lum: '. $luminosity); + } + } + } + + } + +} + +/** +* HTML content has a valid doctype declaration. +* Each document must contain a valid doctype declaration. +* @link http://quail-lib.org/test-info/doctypeProvided +*/ +class doctypeProvided extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + if(!$this->dom->doctype->publicId) + $this->addReport(null, null, false); + } + +} + +/** +* Abbreviations must be marked with abbr element. +* If body element content is greater than 10 characters (English) this error will be generated. +* @link http://quail-lib.org/test-info/documentAbbrIsUsed +*/ +class documentAbbrIsUsed extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var string $acronym_tag The tag that is considered an acronym + */ + var $acronym_tag = 'abbr'; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements($this->acronym_tag) as $acronym) { + $predefined[strtoupper(trim($acronym->nodeValue))] = $acronym->getAttribute('title'); + } + $already_reported = array(); + foreach($this->getAllElements(null, 'text') as $text) { + + $words = explode(' ', $text->nodeValue); + if(count($words) > 1 && strtoupper($text->nodeValue) != $text->nodeValue) { + foreach($words as $word) { + $word = preg_replace("/[^a-zA-Zs]/", "", $word); + if(strtoupper($word) == $word && strlen($word) > 1 && !isset($predefined[strtoupper($word)])) + + if(!isset($already_reported[strtoupper($word)])) { + $this->addReport($text, 'Word "'. $word .'" requires an '. $this->acronym_tag .' tag.'); + } + $already_reported[strtoupper($word)] = true; + } + } + } + + } + +} + +/** +* Acronyms must be marked with acronym element. This is the same as the 'abbr' test, but +* looks for ACRONYM elements +* If body element content is greater than 10 characters (English) then this error will be generated. +* @link http://quail-lib.org/test-info/documentAcronymsHaveElement +*/ +class documentAcronymsHaveElement extends documentAbbrIsUsed { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var string $acronym_tag The tag to be searched for as an acronym + */ + var $acronym_tag = 'acronym'; +} + +/** +* All text colors or no text colors are set. +* If the author specifies that the text must be black, then it may override the settings of the user agent and render a page that has black text (specified by the author) on black background (that was set in the user agent). +* @link http://quail-lib.org/test-info/documentAllColorsAreSet +*/ +class documentAllColorsAreSet extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var array $color_attributes An array of all the attributes which are considered + * for computing color + */ + var $color_attributes = array('text', 'bgcolor', 'link', 'alink', 'vlink'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $body = $this->getAllElements('body'); + $body = $body[0]; + if($body) { + $colors = 0; + foreach($this->color_attributes as $attribute) { + if($body->hasAttribute($attribute)) + $colors++; + } + if($colors > 0 && $colors < 5) + $this->addReport(null, null, false); + } + } +} + +/** +* Auto-redirect must not be used. +* meta elements that contain a http-equiv attribute with a value of "refresh" cannot contain a content attribute with a value of (start, case insensitive) "http://". +* @link http://quail-lib.org/test-info/documentAutoRedirectNotUsed +*/ +class documentAutoRedirectNotUsed extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('meta') as $meta) { + if($meta->getAttribute('http-equiv') == 'refresh' && !$meta->hasAttribute('content')) + $this->addReport($meta); + } + + } +} + +/** +* The contrast between active link text and background color is greater than WAI ERT color algorithm threshold. +* The contrast between active link text and background color must be greater than the WAI ERT color algorithm threshold. +* @link http://quail-lib.org/test-info/documentColorWaiActiveLinkAlgorithim +*/ +class documentColorWaiActiveLinkAlgorithim extends bodyWaiErtColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $foreground The type of item that should be checked for contrast in the foreground + */ + var $foreground = 'alink'; +} + +/** +* The contrast between text and background colors is greater than WAI ERT color algorithm threshold. +* The contrast between text and background color must be greater than the WAI ERT color algorithm threshold. +* @link http://quail-lib.org/test-info/documentColorWaiAlgorithim +*/ +class documentColorWaiAlgorithim extends bodyWaiErtColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + +} + +/** +* The contrast between link text and background color is greater than WAI ERT color algorithm threshold. +* The contrast between link text and background color must be greater than the WAI ERT color algorithm threshold. +* @link http://quail-lib.org/test-info/documentColorWaiLinkAlgorithim +*/ +class documentColorWaiLinkAlgorithim extends bodyWaiErtColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $foreground The type of item that should be checked for contrast in the foreground + */ + var $foreground = 'link'; +} + +/** +* The contrast between visited link text and background color is greater than WAI ERT color algorithm threshold. +* The contrast between visited link text and background color must be greater than the WAI ERT color algorithm threshold. +* @link http://quail-lib.org/test-info/documentColorWaiVisitedLinkAlgorithim +*/ +class documentColorWaiVisitedLinkAlgorithim extends bodyWaiErtColorContrast { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $foreground The type of item that should be checked for contrast in the foreground + */ + var $foreground = 'vlink'; +} + +/** +* Content must be readable when stylesheets are not applied. +* The first occurrence of any element that contains a style attribute will generate this error. +* @link http://quail-lib.org/test-info/documentContentReadableWithoutStylesheets +*/ +class documentContentReadableWithoutStylesheets extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(null, 'text') as $text) { + if($text->hasAttribute('style')) { + $this->addReport(null, null, false); + return false; + } + } + + } +} + +/** +* Document contains a title element. +* title element must be present in head section of document. +* @link http://quail-lib.org/test-info/documentHasTitleElement +*/ +class documentHasTitleElement extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + + $element = $this->dom->getElementsByTagName('title'); + if(!$element->item(0)) + $this->addReport(null, null, false); + + } +} + +/** +* id attributes must be unique. +* Each id attribute value must be unique. +* @link http://quail-lib.org/test-info/documentIDsMustBeUnique +*/ +class documentIDsMustBeUnique extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $xpath = new DOMXPath($this->dom); + $entries = $xpath->query('//*'); + $ids = array(); + foreach($entries as $element) { + if($element->hasAttribute('id')) + $ids[$element->getAttribute('id')][] = $element; + } + if(count($ids) > 0) { + foreach($ids as $id) { + if(count($id) > 1) + $this->addReport($id[1]); + } + } + } +} + +/** +* Document has valid language code. +* html element must have a lang attribute value of valid 2 or 3 letter language code according to ISO specification 639. +* @link http://quail-lib.org/test-info/documentLangIsISO639Standard +*/ +class documentLangIsISO639Standard extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $languages = file(dirname(__FILE__).'/resources/iso639.txt'); + + $element = $this->dom->getElementsByTagName('html'); + $html = $element->item(0); + if(!$html) + return null; + if($html->hasAttribute('lang')) + if(in_array(strtolower($html->getAttribute('lang')), $languages)) + $this->addReport(null, null, false); + + } +} + +/** +* Document has required lang attribute(s). +* html element must contain a lang attribute. +* @link http://quail-lib.org/test-info/documentLangNotIdentified +*/ +class documentLangNotIdentified extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $element = $this->dom->getElementsByTagName('html'); + $html = $element->item(0); + if(!$html) return null; + if(!$html->hasAttribute('lang') || trim($html->getAttribute('lang')) == '') + $this->addReport(null, null, false); + + } +} + +/** +* Meta refresh is not used with a time-out. +* meta elements that contain a http-equiv attribute with a value of "refresh" cannot contain a content attribute with a value of any number greater than zero. +* @link http://quail-lib.org/test-info/documentMetaNotUsedWithTimeout +*/ +class documentMetaNotUsedWithTimeout extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('meta') as $meta) { + if($meta->getAttribute('http-equiv') == 'refresh' && !$meta->getAttribute('content')) + $this->addReport($meta); + } + + } +} + +/** +* The reading direction of all text is correctly marked. +* The reading direction of all text is correctly marked. +*/ + + +/** +* All changes in text direction are marked using the dir attribute. +* Identify changes in the text direction of text that includes nested directional runs by providing the dir attribute on inline elements. A nested directional run is a run of text that includes mixed directional text, for example, a paragraph in English containing a quoted Hebrew sentence which in turn includes a quotation in French. +* @link http://quail-lib.org/test-info/documentReadingDirection +*/ +class documentReadingDirection extends quailTest { + + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var array $right_to_left The language codes that are considered right-to-left + */ + var $right_to_left = array('he', 'ar'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $xpath = new DOMXPath($this->dom); + $entries = $xpath->query('//*'); + foreach($entries as $element) { + if(in_array($element->getAttribute('lang'), $this->right_to_left)) { + + if($element->getAttribute('dir') != 'rtl') + $this->addReport($element); + } + } + } +} + +/** +* Strict doctype is declared. +* A 'strict' doctype must be declared in the document. This can either be the HTML4.01 or XHTML 1.0 strict doctype. +* @link http://quail-lib.org/test-info/documentStrictDocType +*/ +class documentStrictDocType extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + if(strpos(strtolower($this->dom->doctype->publicId), 'strict') === false + && strpos(strtolower($this->dom->doctype->systemId), 'strict') === false) + $this->addReport(null, null, false); + } +} + +/** +* title describes the document. +* This error is generated for each title element. +* @link http://quail-lib.org/test-info/documentTitleDescribesDocument +*/ +class documentTitleDescribesDocument extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $placeholders = file(dirname(__FILE__).'/resources/placeholder.txt'); + $element = $this->dom->getElementsByTagName('title'); + $title = $element->item(0); + if($title) { + $this->addReport($title); + } + } +} + +/** +* title is not placeholder text. +* title element content can not be any one of (case insensitive) \"the title\"" +* @link http://quail-lib.org/test-info/documentTitleIsNotPlaceholder +*/ +class documentTitleIsNotPlaceholder extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $placeholders = file(dirname(__FILE__).'/resources/placeholder.txt'); + $element = $this->dom->getElementsByTagName('title'); + $title = $element->item(0); + if($title) { + if(in_array(strtolower($title->nodeValue), $placeholders)) + $this->addReport(null, null, false); + } + } +} + +/** +* title is short. +* title element content must be less than 150 characters (English). +* @link http://quail-lib.org/test-info/documentTitleIsShort +*/ +class documentTitleIsShort extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + + $element = $this->dom->getElementsByTagName('title'); + $title = $element->item(0); + if($title) { + if(strlen($title->nodeValue)> 150) + $this->addReport(null, null, false); + } + } +} + +/** +* title contains text. +* title element content cannot be empty or whitespace. +* @link http://quail-lib.org/test-info/documentTitleNotEmpty +*/ +class documentTitleNotEmpty extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + + $element = $this->dom->getElementsByTagName('title'); + if($element->length > 0) { + $title = $element->item(0); + if(trim($title->nodeValue) == '') + $this->addReport(null, null, false); + } + } +} + +/** +* Document validates to specification. +* Document must validate to declared doctype. +* @link http://quail-lib.org/test-info/documentValidatesToDocType +*/ +class documentValidatesToDocType extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + if(!@$this->dom->validate()) + $this->addReport(null, null, false); + } +} + +/** +* All visual lists are marked. +* Create lists of related items using list elements appropriate for their purposes. +* @link http://quail-lib.org/test-info/documentVisualListsAreMarkedUp +*/ +class documentVisualListsAreMarkedUp extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $list_cues Things that might be considered to be part of a list + */ + var $list_cues = array('*', '
*', '•', '•'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(null, 'text') as $text) { + foreach($this->list_cues as $cue) { + $first = stripos($text->nodeValue, $cue); + $second = strripos($text->nodeValue, $cue); + if($first && $second && $first != $second) + $this->addReport($text); + } + } + + } +} + +/** +* Words and phrases not in the document's primary language are marked. +* If the body element contains more than 10 characters (English) then this error will be generated. +* @link http://quail-lib.org/test-info/documentWordsNotInLanguageAreMarked +*/ +class documentWordsNotInLanguageAreMarked extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $body = $this->getAllElements('body'); + if(!isset($body[0])) { + return false; + } + $body = $body[0]; + if(!is_object($body)) { + return false; + } + if(!property_exists($body, 'nodeValue')) { + return false; + } + $words = explode(' ', $body->nodeValue); + + if(count($words) > 10) + $this->addReport(null, null, false); + } +} + +/** +* All embed elements have an associated noembed element that contains a text equivalent to the embed element. +* Provide a text equivalent for the embed element. +* @link http://quail-lib.org/test-info/embedHasAssociatedNoEmbed +*/ +class embedHasAssociatedNoEmbed extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('embed') as $embed) { + if(!$this->propertyIsEqual($embed->firstChild, 'tagName', 'noembed') + && !$this->propertyIsEqual($embed->nextSibling, 'tagName', 'noembed')) { + $this->addReport($embed); + } + + } + } +} + +/** +* embed must have alt attribute. +* embed element must have an alt attribute. +* @link http://quail-lib.org/test-info/embedMustHaveAltAttribute +*/ +class embedMustHaveAltAttribute extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('embed') as $embed) { + if(!$embed->hasAttribute('alt')) + $this->addReport($embed); + + } + } +} + +/** +* embed must not have empty Alt text. +* embed element cannot have alt attribute value of null ("") or whitespace. +* @link http://quail-lib.org/test-info/embedMustNotHaveEmptyAlt +*/ +class embedMustNotHaveEmptyAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('embed') as $embed) { + if($embed->hasAttribute('alt') && trim($embed->getAttribute('alt')) == '') + $this->addReport($embed); + + } + } +} + +/** +* embed provides a keyboard mechanism to return focus to the parent window. +* Ensure that keyboard users do not become trapped in a subset of the content that can only be exited using a mouse or pointing device. +* @link http://quail-lib.org/test-info/embedProvidesMechanismToReturnToParent +*/ +class embedProvidesMechanismToReturnToParent extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'embed'; +} + +/** +* Excessive use of emoticons. +* This error is generated if 4 or more emoticons are detected. [Editor's Note - how are emoticons detected?] +* @link http://quail-lib.org/test-info/emoticonsExcessiveUse +*/ +class emoticonsExcessiveUse extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $emoticons = file(dirname(__FILE__).'/resources/emoticons.txt', FILE_IGNORE_NEW_LINES); + $count = 0; + foreach($this->getAllElements(null, 'text') as $element) { + if(strlen($element->nodeValue < 2)) { + $words = explode(' ', $element->nodeValue); + foreach($words as $word) { + if(in_array($word, $emoticons)) { + $count++; + if($count > 4) { + $this->addReport(null, null, false); + return false; + } + } + } + + } + } + + } +} + +class emoticonsMissingAbbr extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $emoticons = file(dirname(__FILE__).'/resources/emoticons.txt', FILE_IGNORE_NEW_LINES); + $count = 0; + foreach($this->getAllElements('abbr') as $abbr) { + $abbreviated[$abbr->nodeValue] = $abbr->getAttribute('title'); + } + foreach($this->getAllElements(null, 'text') as $element) { + if(strlen($element->nodeValue < 2)) { + $words = explode(' ', $element->nodeValue); + foreach($words as $word) { + if(in_array($word, $emoticons)) { + if(!isset($abbreviated[$word])) + $this->addReport($element); + } + } + + } + } + + } +} + +/** +* All input elements, type of "file", have an explicitly associated label. +* input element that contains a type attribute value of "file" must have an associated label element. An associated label is one in which the for attribute value of the label element is the same as the id attribute value of the input element. +* @link http://quail-lib.org/test-info/fileHasLabel +*/ +class fileHasLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'file'; + + /** + * @var bool $no_type We are not looking at the type of input here + */ + var $no_type = false; +} + +/** +* All input elements, type of "file", have a label that is positioned close to the control. +* input element with a type attribute value of "file" must have an associated label element positioned close to it. +* @link http://quail-lib.org/test-info/fileLabelIsNearby +*/ +class fileLabelIsNearby extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'file') + $this->addReport($input); + + } + } +} + +/** +* font must not be used. +* This error is generated for all font elements. +* @link http://quail-lib.org/test-info/fontIsNotUsed +*/ +class fontIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'font'; +} + +class formAllowsCheckIfIrreversable extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'form'; +} + +/** +* Information deleted using a web page can be recovered. +* Help users with disabilities avoid serious consequences as the result of a mistake when performing an action that cannot be reversed. +* @link http://quail-lib.org/test-info/formDeleteIsReversable +*/ +class formDeleteIsReversable extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('delete', 'remove', 'erase'), + 'es' => array('borrar', 'eliminar', 'suprimir'), + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'submit') { + foreach($this->translation() as $word) { + if(strpos(strtolower($input->getAttribute('value')), $word) !== false) + $this->addReport($this->getParent($input, 'form', 'body')); + } + } + } + } +} + +/** +* Form submission data is presented to the user before final acceptance for all irreversable transactions. +* Provide users with a way to ensure their input is correct before completing an irreversible transaction. +* @link http://quail-lib.org/test-info/formErrorMessageHelpsUser +*/ +class formErrorMessageHelpsUser extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'form'; +} + +/** +* All form submission error messages provide assistance in correcting the error. +* Information about the nature and location of the input error is provided in text to enable the users to identify the problem. +* @link http://quail-lib.org/test-info/formHasGoodErrorMessage +*/ +class formHasGoodErrorMessage extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'form'; +} + + +/** +* All form fields that are required are indicated to the user as required. +* Ensure that the label for any interactive component within Web content makes the component's purpose clear. +* @link http://quail-lib.org/test-info/formWithRequiredLabel +*/ +class formWithRequiredLabel extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var array $suspect_styles A list of CSS styles which might mean this is label text + */ + var $suspect_styles = array('font-weight', 'color'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $labels = array(); + foreach($this->getAllElements('label') as $label) { + $labels[] = $label; + if(strpos($label->nodeValue, '*') !== false) { + if($input = $this->dom->getElementById($label->getAttribute('for'))) { + if(!$input->hasAttribute('aria-required') || + strtolower($input->getAttribute('aria-required')) != 'true') { + $this->addReport($label); + } + } + else { + $this->addReport($label); + } + } + } + $styles = array(); + foreach($labels as $k => $label) { + //Now we check through all the labels and see if any are + //colored different than the others + $styles[$k] = $this->css->getStyle($label); + if($this->elementHasChild($label, 'strong') || $this->elementHasChild($label, 'b')) { + $styles[$k]['font-weight'] = 'bold'; + } + if($k) { + foreach($this->suspect_styles as $style) { + if($styles[$k][$style] != $styles[($k - 1)][$style]) { + $form = $this->getElementAncestor($label, 'form'); + if($form) { + $this->addReport($form); + } + else { + $this->addReport($label); + } + } + } + } + } + } +} + +/** +* frame element is not used. +* This error is generated for all frame elements. +* @link http://quail-lib.org/test-info/frameIsNotUsed +*/ +class frameIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'frame'; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + +} + +/** +* Relationship between frames must be described. +* If frameset element contains 3 or more frame elements then frameset element must contain a longdesc attribute that is a valid URL. +* @link http://quail-lib.org/test-info/frameRelationshipsMustBeDescribed +*/ +class frameRelationshipsMustBeDescribed extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frameset') as $frameset) { + + if(!$frameset->hasAttribute('longdesc') && $frameset->childNodes->length > 2) + $this->addReport($frameset); + } + } + +} + +/** +* The source for each frame is accessible content. +* frame content should be accessible, like HTML, not just an image. +* @link http://quail-lib.org/test-info/frameSrcIsAccessible +*/ +class frameSrcIsAccessible extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frame') as $frame) { + if($frame->hasAttribute('src')) { + $extension = array_pop(explode('.', $frame->getAttribute('src'))); + if(in_array($extension, $this->image_extensions)) + $this->addReport($frame); + + } + } + } + +} + +/** +* All frame titles identify the purpose or function of the frame. +* frame title must describe the purpose or function of the frame. +* @link http://quail-lib.org/test-info/frameTitlesDescribeFunction +*/ +class frameTitlesDescribeFunction extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frame') as $frame) { + if($frame->hasAttribute('title')) + $this->addReport($frame); + } + } + +} + +/** +* All frame titles are not empty. +* frame title can't be empty. +* @link http://quail-lib.org/test-info/frameTitlesNotEmpty +*/ +class frameTitlesNotEmpty extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frame') as $frame) { + if(!$frame->hasAttribute('title') || trim($frame->getAttribute('title')) == '') + $this->addReport($frame); + } + } +} + +/** +* All frame titles do not contain placeholder text. +* frame title should not contain placeholder text. +* @link http://quail-lib.org/test-info/frameTitlesNotPlaceholder +*/ +class frameTitlesNotPlaceholder extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('title', 'frame', 'frame title', 'the title'), + 'es' => array('título', 'marco', 'título del marco', 'el título'), + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frame') as $frame) { + if(in_array(trim(strtolower($frame->getAttribute('title'))), $this->translation())) + $this->addReport($frame); + } + } + +} + +/** +* All frames have a title attribute. +* Each frame element must have a title attribute. +* @link http://quail-lib.org/test-info/framesHaveATitle +*/ +class framesHaveATitle extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frame') as $frame) { + if(!$frame->hasAttribute('title')) + $this->addReport($frame); + } + } + +} + +/** +* frameset element is not used. +* This error is generated for all frameset elements. +* @link http://quail-lib.org/test-info/framesetIsNotUsed +*/ +class framesetIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'frameset'; +} + +/** +* frameset must have a noframes section. +* frameset element must contain a noframes section. +* @link http://quail-lib.org/test-info/framesetMustHaveNoFramesSection +*/ +class framesetMustHaveNoFramesSection extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frameset') as $frameset) { + if(!$this->elementHasChild($frameset, 'noframes')) + $this->addReport($frameset); + } + } + +} + +/** +* The header following an h1 is h1 or h2. +* The following header must be equal, one level greater or any level less. +* @link http://quail-lib.org/test-info/headerH1 +*/ +class headerH1 extends quailHeaderTest { + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h1'; + +} + +/** +* All h1 elements are not used for formatting. +* h1 may be used for formatting. Use the proper markup. +* @link http://quail-lib.org/test-info/headerH1Format +*/ +class headerH1Format extends quailTagTest{ + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h1'; +} + +/** +* The header following an h2 is h1, h2 or h3. +* The following header must be equal, one level greater or any level less. +* @link http://quail-lib.org/test-info/headerH2 +*/ +class headerH2 extends quailHeaderTest { + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h2'; + +} + +/** +* All h2 elements are not used for formatting. +* h2 may be used for formatting. Use the proper markup. +* @link http://quail-lib.org/test-info/headerH2Format +*/ +class headerH2Format extends quailTagTest{ + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h2'; +} + +/** +* The header following an h3 is h1, h2, h3 or h4. +* The following header must be equal, one level greater or any level less. +* @link http://quail-lib.org/test-info/headerH3 +*/ +class headerH3 extends quailHeaderTest { + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h3'; + +} + +/** +* All h3 elements are not used for formatting. +* h3 may be used for formatting. Use the proper markup. +* @link http://quail-lib.org/test-info/headerH3Format +*/ +class headerH3Format extends quailTagTest{ + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h3'; +} + +/** +* The header following an h5 is h6 or any header less than h6. +* The following header must be equal, one level greater or any level less. +* @link http://quail-lib.org/test-info/headerH4 +*/ +class headerH4 extends quailHeaderTest { + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h4'; + +} + +/** +* All h4 elements are not used for formatting. +* h4 may be used for formatting. Use the proper markup. +* @link http://quail-lib.org/test-info/headerH4Format +*/ +class headerH4Format extends quailTagTest{ + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h4'; +} + +class headerH5 extends quailHeaderTest { + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h5'; + +} + +/** +* All h5 elements are not used for formatting. +* h5 may be used for formatting. Use the proper markup. +* @link http://quail-lib.org/test-info/headerH5Format +*/ +class headerH5Format extends quailTagTest{ + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h5'; +} + +/** +* All h6 elements are not used for formatting. +* h6 may be used for formatting. Use the proper markup. +* @link http://quail-lib.org/test-info/headerH6Format +*/ +class headerH6Format extends quailTagTest{ + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'h6'; +} + +/** +* Each section of content is marked with a header element. +* Using the heading elements, h and h1 - h6, to markup the beginning of each section in the content can assist in navigation. +* @link http://quail-lib.org/test-info/headersUseToMarkSections +*/ +class headersUseToMarkSections extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var array $non_header_tags An array of all tags which might make this a header + */ + var $non_header_tags = array('strong', 'b', 'em', 'i'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $headers = $this->getAllElements(null, 'header'); + $paragraphs = $this->getAllElements('p'); + if(count($headers) == 0 && count($paragraphs) > 1) + $this->addReport(null, null, false); + foreach($paragraphs as $p) { + if((is_object($p->firstChild) + && property_exists($p->firstChild, 'tagName') + && in_array($p->firstChild->tagName, $this->non_header_tags) + && trim($p->nodeValue) == trim($p->firstChild->nodeValue)) + || (is_object($p->firstChild->nextSibling) + && property_exists($p->firstChild->nextSibling, 'tagName') + && in_array($p->firstChild->nextSibling->tagName, $this->non_header_tags) + && trim($p->nodeValue) == trim($p->firstChild->nextSibling->nodeValue)) + || (is_object($p->previousSibling) + && property_exists($p->previousSibling, 'tagName') + && in_array($p->previousSibling->tagName, $this->non_header_tags) + && trim($p->nodeValue) == trim($p->previousSibling->nodeValue))) + $this->addReport($p); + } + } +} + +/** +* i (italic) element is not used. +* This error will be generated for all i elements. +* @link http://quail-lib.org/test-info/iIsNotUsed +*/ +class iIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'i'; +} + +/** +* iframe must not use longdesc. +* Iframe element cannot contain a longdesc attribute. +* @link http://quail-lib.org/test-info/iframeMustNotHaveLongdesc +*/ +class iframeMustNotHaveLongdesc extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('iframe') as $iframe) { + if($iframe->hasAttribute('longdesc')) + $this->addReport($iframe); + + } + } +} + +/** +* All active areas in all server-side image maps have duplicate text links in the document. +* Any img element that contains ismap attribute will generate this error. +* @link http://quail-lib.org/test-info/imageMapServerSide +*/ +class imageMapServerSide extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('ismap')) + $this->addReport($img); + } + + } +} + +/** +* Alt text for all img elements is the empty string ("") if the image is decorative. +* Decorative images must have empty string ("") Alt text. +* @link http://quail-lib.org/test-info/imgAltEmptyForDecorativeImages +*/ +class imgAltEmptyForDecorativeImages extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('alt')) + $this->addReport($img); + } + } + +} + +/** +* Alt text for all img elements used as source anchors identifies the destination of the link. +* img element that is contained by an a (anchor) element must have Alt text that identifies the link destination. +* @link http://quail-lib.org/test-info/imgAltIdentifiesLinkDestination +*/ +class imgAltIdentifiesLinkDestination extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(!$a->nodeValue) { + foreach($a->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'img') + && $child->hasAttribute('alt')) { + $this->addReport($child); + } + } + } + } + + } +} + +/** +* Alt text is not the same as the filename unless author has confirmed it is correct. +* img element cannot have alt attribute value that is the same as its src attribute. +* @link http://quail-lib.org/test-info/imgAltIsDifferent +*/ +class imgAltIsDifferent extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if(trim($img->getAttribute('src')) == trim($img->getAttribute('alt'))) + $this->addReport($img); + } + } + +} + +/** +* Alt text for all img elements contains all text in the image unless the image text is decorative or appears elsewhere in the document. +* This error is generated for all img elements that have a width and height greater than 50. +* @link http://quail-lib.org/test-info/imgAltIsSameInText +*/ +class imgAltIsSameInText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('alt')) + $this->addReport($img); + } + + } +} + +/** +* Image Alt text is long. +* Image Alt text is long or user must confirm that Alt text is as short as possible. +* @link http://quail-lib.org/test-info/imgAltIsTooLong +*/ +class imgAltIsTooLong extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('alt') && strlen($img->getAttribute('alt')) > 100) + $this->addReport($img); + } + + } +} + +/** +* Alt text for all img elements used as source anchors is not empty when there is no other text in the anchor. +* img element cannot have alt attribute value of null or whitespace if the img element is contained by an A element and there is no other link text. +* @link http://quail-lib.org/test-info/imgAltNotEmptyInAnchor +*/ +class imgAltNotEmptyInAnchor extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(!$a->nodeValue && $a->childNodes) { + foreach($a->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'img') + && trim($child->getAttribute('alt')) == '') + $this->addReport($child); + } + } + } + + } +} + +/** +* Alt text for all img elements is not placeholder text unless author has confirmed it is correct. +* img element cannot have alt attribute value of "nbsp" or "spacer". +* @link http://quail-lib.org/test-info/imgAltNotPlaceHolder +*/ +class imgAltNotPlaceHolder extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('nbsp', ' ', 'spacer', 'image', 'img', 'photo'), + 'es' => array('nbsp', ' ', 'spacer', 'espacio', 'imagen', 'img', 'foto') + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('alt')) { + if(strlen($img->getAttribute('alt')) > 0) { + if(in_array($img->getAttribute('alt'), $this->translation()) + || ord($img->getAttribute('alt')) == 194) { + $this->addReport($img); + } + elseif(preg_match("/^([0-9]*)(k|kb|mb|k bytes|k byte)?$/", + strtolower($img->getAttribute('alt')))) { + $this->addReport($img); + } + } + } + } + + } +} + +/** +* All img elements have associated images that do not flicker. +* This error is generated for all img elements that contain a src attribute value that ends with ".gif" (case insensitive). and have a width and height larger than 25. +* @link http://quail-lib.org/test-info/imgGifNoFlicker +*/ +class imgGifNoFlicker extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $gif_control_extension Regular expression for retrieving the GIF + * control extension + */ + var $gif_control_extension = "/21f904[0-9a-f]{2}([0-9a-f]{4})[0-9a-f]{2}00/"; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + + if(substr($img->getAttribute('src'), -4, 4) == '.gif') { + $file = $this->getImageContent($this->getPath($img->getAttribute('src'))); + if($file) { + $file = bin2hex($file); + + // sum all frame delays + $total_delay = 0; + preg_match_all($this->gif_control_extension, $file, $matches); + foreach ($matches[1] as $match) { + // convert little-endian hex unsigned ints to decimals + $delay = hexdec(substr($match,-2) . substr($match, 0, 2)); + if ($delay == 0) $delay = 1; + $total_delay += $delay; + } + + // delays are stored as hundredths of a second, lets convert to seconds + + + if($total_delay > 0) + $this->addReport($img); + } + } + } + + } + + /** + * Retrieves the content of an image + * @param string $image The URL to an image + */ + function getImageContent($image) { + if(strpos($image, '://') == false) { + return @file_get_contents($image); + } + if(function_exists('curl')) { + $curl = new curl_init($image); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + $result = curl_exec($curl); + return $result; + } + return false; + } +} + +/** +* All img elements must have an alt attribute. Duh! +* @link http://quail-lib.org/test-info/imgHasAlt +*/ +class imgHasAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if(!$img->hasAttribute('alt')) + $this->addReport($img); + } + + } +} + +/** +* A long description is used for each img element that does not have Alt text conveying the same information as the image. +* img element must contain a longdesc attribute. +* @link http://quail-lib.org/test-info/imgHasLongDesc +*/ +class imgHasLongDesc extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('longdesc')) { + if(trim(strtolower($img->getAttribute('longdesc'))) == + trim(strtolower($img->getAttribute('alt')))) { + $this->addReport($img); + } + } + } + + } +} + +/** +* Important images should not have spacer Alt text. +* img element cannot have alt attribute value of whitespace if WIDTH and HEIGHT attribute values are both greater than 25. +* @link http://quail-lib.org/test-info/imgImportantNoSpacerAlt +*/ +class imgImportantNoSpacerAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('src') && $img->hasAttribute('alt') && trim($img->getAttribute('alt')) == '') { + if($img->getAttribute('width') > 25 || $img->getAttribute('height') > 25) { + $this->addReport($img); + } + elseif(function_exists('gd_info') && (!$img->hasAttribute('width') || !$img->hasAttribute('height'))) { + $img_file = @getimagesize($this->getPath($img->getAttribute('src'))); + if($img_file) { + if($img_file[0] > 25 || $img_file[1] > 25) + $this->addReport($img); + } + } + } + + } + + } +} + +/** +* All links in all client side image-maps are duplicated within the document. +* img element must not contain a usemap attribute unless all links in the MAP are duplicated within the document. The MAP element is referred by the USEMAP element's usemap attribute. Links within MAP are referred by area elements href attribute contained by MAP element. [Editor's Note - can duplicate links appear anywhere within content or must they be part of a link group?] +* @link http://quail-lib.org/test-info/imgMapAreasHaveDuplicateLink +*/ +class imgMapAreasHaveDuplicateLink extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $all_links = array(); + foreach($this->getAllElements('a') as $a) { + $all_links[$a->getAttribute('href')] = $a->getAttribute('href'); + } + $maps = $this->getElementsByAttribute('map', 'name', true); + + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('usemap')) { + $usemap = $img->getAttribute('usemap'); + if(substr($usemap, 0, 1) == '#') { + $key = substr($usemap, -(strlen($usemap) - 1), (strlen($usemap) - 1)); + } + else { + $key = $usemap; + } + if(isset($maps[$key])) { + foreach($maps[$key]->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'area')) { + if(!isset($all_links[$child->getAttribute('href')])) { + $this->addReport($img); + } + } + } + } + } + } + + } +} + +/** +* All img elements that have a longdesc attribute also have an associated 'd-link'. +* img element that contains a longdesc attribute must have a following d-link. A d-link must consist of an A element that contains only the text "d" or "D". The A element must have an href attribute that is a valid URL and is the same as the img element's longdesc attribute. The d-link must immediately follow the img element, separated only by whitespace. +* @link http://quail-lib.org/test-info/imgNeedsLongDescWDlink +*/ +class imgNeedsLongDescWDlink extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('longdesc')) { + $next = $this->getNextElement($img); + + if(is_object($next) && $next->tagName != 'a') { + $this->addReport($img); + } + else { + if(((!$this->propertyIsEqual($next, 'nodeValue', '[d]', true, true) + && !$this->propertyIsEqual($next, 'nodeValue', 'd', true, true)) ) + || $next->getAttribute('href') != $img->getAttribute('longdesc')) { + $this->addReport($img); + } + } + + } + } + + } +} + +/** +* Non-Decorative images must have Alt text. +* img element cannot have alt attribute value of null ("") if WIDTH and HEIGHT attribute values are both greater than 25. +* @link http://quail-lib.org/test-info/imgNonDecorativeHasAlt +*/ +class imgNonDecorativeHasAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('src') && + ($img->hasAttribute('alt') && html_entity_decode((trim($img->getAttribute('alt')))) == '')) { + $this->addReport($img); + + } + } + + } +} + +/** +* For all img elements, text does not refer to the image by color alone. +* This error is generated for all img elements that have a width and height greater than 100. +* @link http://quail-lib.org/test-info/imgNotReferredToByColorAlone +*/ +class imgNotReferredToByColorAlone extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('alt')) + $this->addReport($img); + } + + } +} + +/** +* Server-side image maps are not used except when image map regions cannot be defined using an available geometric shape. +* A server-side image map should only be used when a client-side image map can not be used. +* @link http://quail-lib.org/test-info/imgServerSideMapNotUsed +*/ +class imgServerSideMapNotUsed extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('ismap')) + $this->addReport($img); + } + } +} + +/** +* All img elements do not contain a title attribute. +* img element must not contain the title attribute. +* @link http://quail-lib.org/test-info/imgShouldNotHaveTitle +*/ +class imgShouldNotHaveTitle extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('title')) + $this->addReport($img); + } + + } +} + +/** +* All img elements with an ismap attribute have a valid usemap attribute. +* img element may not contain an ismap attribute. +* @link http://quail-lib.org/test-info/imgWithMapHasUseMap +*/ +class imgWithMapHasUseMap extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('ismap') && !$img->hasAttribute('usemap')) + $this->addReport($img); + } + + } +} + +/** +* All img elements with images containing math expressions have equivalent MathML markup. +* This error is generated for all img elements that have a width and height greater than 100. +* @link http://quail-lib.org/test-info/imgWithMathShouldHaveMathEquivalent +*/ +class imgWithMathShouldHaveMathEquivalent extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('img') as $img) { + if(($img->getAttribute('width') > 100 + || $img->getAttribute('height') > 100 ) + && (!$this->propertyIsEqual($img->nextSibling, 'tagName', 'math'))) { + $this->addReport($img); + } + + } + } +} + +/** +* All input elements, type of "checkbox", have a valid tab index. +* input element that contains a type attribute value of "checkbox" must have a tabindex attribute. +* @link http://quail-lib.org/test-info/inputCheckboxHasTabIndex +*/ +class inputCheckboxHasTabIndex extends inputTabIndex { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'checkbox'; +} + +/** +* All checkbox groups are marked using fieldset and legend elements. +* form element content must contain both fieldset and legend elements if there are related checkbox buttons. +* @link http://quail-lib.org/test-info/inputCheckboxRequiresFieldset +*/ +class inputCheckboxRequiresFieldset extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'checkbox') { + if(!$this->getParent($input, 'fieldset', 'body')) + $this->addReport($input); + + } + } + } +} + +/** +* input should not use color alone. +* All input elements, except those with a type of "hidden", will generate this error. +* @link http://quail-lib.org/test-info/inputDoesNotUseColorAlone +*/ +class inputDoesNotUseColorAlone extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') != 'hidden') + $this->addReport($input); + } + } + +} + +/** +* All input elements, except those with with a type attribute value of "image", do not have an alt attribute. +* The input element is used to create many kinds of form controls. Although the HTML DTD permits the alt attribute on all of these, it should be used only on image submit buttons. User agent support for this attribute on other types of form controls is not well defined, and other mechanisms are used to label these controls. +* @link http://quail-lib.org/test-info/inputElementsDontHaveAlt +*/ +class inputElementsDontHaveAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') != 'image' && $input->hasAttribute('alt')) + $this->addReport($input); + } + } +} + +/** +* All input elements, type of "file", have a valid tab index. +* input element that contains a type attribute value of "file" must have a tabindex attribute. +* @link http://quail-lib.org/test-info/inputFileHasTabIndex +*/ +class inputFileHasTabIndex extends inputTabIndex { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'file'; +} + +/** +* Alt text for all input elements with a type attribute value of "image" identifies the purpose or function of the image. +* input element with type of "image" must have Alt text that identifies the purpose or function of the image. +* @link http://quail-lib.org/test-info/inputImageAltIdentifiesPurpose +*/ +class inputImageAltIdentifiesPurpose extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image') + $this->addReport($input); + } + } + +} + +/** +* Image used in input element - Alt text should not be the same as the filename. +* input elements cannot have alt attribute values that are the same as their src attribute values. +* @link http://quail-lib.org/test-info/inputImageAltIsNotFileName +*/ +class inputImageAltIsNotFileName extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image' + && strtolower($input->getAttribute('alt')) == strtolower($input->getAttribute('src'))) + $this->addReport($input); + } + } + +} + +/** +* Image used in input element - Alt text should not be placeholder text. +* input elements cannot have alt attribute values that are (case insensitive) (exactly) \"image\"" +* @link http://quail-lib.org/test-info/inputImageAltIsNotPlaceholder +*/ +class inputImageAltIsNotPlaceholder extends imgAltNotPlaceHolder { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image') { + if(in_array($input->getAttribute('alt'), $this->translation()) || ord($input->getAttribute('alt')) == 194) { + $this->addReport($input); + } + elseif(preg_match("/^([0-9]*)(k|kb|mb|k bytes|k byte)?$/", strtolower($input->getAttribute('alt')))) { + $this->addReport($input); + } + } + } + + } +} + +/** +* Alt text for all input elements with a type attribute value of "image" is less than 100 characters (English) or the user has confirmed that the Alt text is as short as possible. +* input elements must have alt attribute value of less than 100 characters (English). +* @link http://quail-lib.org/test-info/inputImageAltIsShort +*/ +class inputImageAltIsShort extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image' && strlen($input->getAttribute('alt')) > 100) + $this->addReport($input); + } + } + +} + +/** +* Alt text for all input elements with a type attribute value of "image" does not use the words "submit" or "button" (English). +* Alt text for form submit buttons must not use the words "submit" or "button". +* @link http://quail-lib.org/test-info/inputImageAltNotRedundant +*/ +class inputImageAltNotRedundant extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('submit', 'button'), + 'es' => array('enviar', 'botón'), + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image') { + foreach($this->translation() as $word) { + if(strpos($input->getAttribute('alt'), $word) !== false) + $this->addReport($input); + } + } + } + } +} + +/** +* All input elements with a type attribute value of "image" have an alt attribute. +* input element with type of "image" must have an alt attribute. +* @link http://quail-lib.org/test-info/inputImageHasAlt +*/ +class inputImageHasAlt extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image' + && (trim($input->getAttribute('alt')) == '' || !$input->hasAttribute('alt'))) + $this->addReport($input); + } + } + +} + +/** +* Alt text for all input elements with a type attribute value of "image" contains all non decorative text in the image. +* This error is generated for all input elements that have a type of "image". +* @link http://quail-lib.org/test-info/inputImageNotDecorative +*/ +class inputImageNotDecorative extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'image') + $this->addReport($input); + } + } +} + +/** +* All input elements, type of "password", have a valid tab index. +* input element that contains a type attribute value of "password" must have a tabindex attribute. +* @link http://quail-lib.org/test-info/inputPasswordHasTabIndex +*/ +class inputPasswordHasTabIndex extends inputTabIndex { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'password'; +} + +/** +* All input elements, type of "radio", have a valid tab index. +* input element that contains a type attribute value of "radio" must have a tabindex attribute. +* @link http://quail-lib.org/test-info/inputRadioHasTabIndex +*/ +class inputRadioHasTabIndex extends inputTabIndex { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'radio'; +} + +/** +* All input elements, type of "submit", have a valid tab index. +* input element that contains a type attribute value of "submit" must have a tabindex attribute. +* @link http://quail-lib.org/test-info/inputSubmitHasTabIndex +*/ +class inputSubmitHasTabIndex extends inputTabIndex { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'submit'; +} + +/** +* All input elements, type of "text", have an explicitly associated label. +* input element that contains a type attribute value of "text" must have an associated label element. An associated label is one in which the for attribute value of the label element is the same as the id attribute value of the input element. +* @link http://quail-lib.org/test-info/inputTextHasLabel +*/ +class inputTextHasLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'text'; + + /** + * @var bool $no_type We are not looking at the type of input here + */ + var $no_type = false; +} + +/** +* All input elements, type of "text", have a valid tab index. +* input element that contains a type attribute value of "text" must have a tabindex attribute. +* @link http://quail-lib.org/test-info/inputTextHasTabIndex +*/ +class inputTextHasTabIndex extends inputTabIndex { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'text'; +} + +/** +* input element, type of "text", must have default text. +* input elements that have a type attribute value of "text" must also contain a value attribute that contains text. +* @link http://quail-lib.org/test-info/inputTextHasValue +*/ +class inputTextHasValue extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'text' && !$input->hasAttribute('value')) + $this->addReport($input); + + } + + } +} + +/** +* input control, type of "text", must have valid default text. +* input element with a type of "text" cannot contain a VALUE attribute that is empty or whitespace. +* @link http://quail-lib.org/test-info/inputTextValueNotEmpty +*/ +class inputTextValueNotEmpty extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if(!$input->hasAttribute('value') || trim($input->getAttribute('value')) == '') + $this->addReport($input); + + } + } +} + +/** +* All label elements do not contain input elements. +* label elements should not contain input elements. +* @link http://quail-lib.org/test-info/labelDoesNotContainInput +*/ +class labelDoesNotContainInput extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('label') as $label) { + if($this->elementHasChild($label, 'input') || $this->elementHasChild($label, 'textarea')) + $this->addReport($label); + } + } +} + +/** +* Each input element has only one associated label. +* input element must have only one associated label element. +* @link http://quail-lib.org/test-info/labelMustBeUnique +*/ +class labelMustBeUnique extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $labels = array(); + foreach($this->getAllElements('label') as $label) { + if($label->hasAttribute('for')) + $labels[$label->getAttribute('for')][] = $label; + } + foreach($labels as $label) { + if(count($label) > 1) + $this->addReport($label[1]); + } + } +} + +/** +* Each label associated with an input element contains text. +* Label must contain some text. +* @link http://quail-lib.org/test-info/labelMustNotBeEmpty +*/ +class labelMustNotBeEmpty extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('label') as $label) { + if(!$this->elementContainsReadableText($label)) { + $this->addReport($label); + } + } + } +} + +/** +* legend text describes the group of choices. +* The legend must describe the group of choices. +* @link http://quail-lib.org/test-info/legendDescribesListOfChoices +*/ +class legendDescribesListOfChoices extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'legend'; +} + +/** +* legend text is not empty or whitespace. +* The legend must describe the group of choices. +* @link http://quail-lib.org/test-info/legendTextNotEmpty +*/ +class legendTextNotEmpty extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('legend') as $legend) { + if(!$legend->nodeValue || trim($legend->nodeValue) == '') + $this->addReport($legend); + } + } +} + +/** +* legend text is not placeholder text. +* The legend must describe the group of choices. +* @link http://quail-lib.org/test-info/legendTextNotPlaceholder +*/ +class legendTextNotPlaceholder extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array(' ', ' ', 'legend'), + 'es' => array(' ', ' ', 'relato'), + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('legend') as $legend) { + if(in_array(trim($legend->nodeValue), $this->translation())) + $this->addReport($legend); + } + } + +} + +class liDontUseImageForBullet extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('li') as $li) { + if(!$this->propertyIsEqual($li, 'nodeValue', '', true) + && $this->propertyIsEqual($li->firstChild, 'tagName', 'img')) { + $this->addReport($li); + } + } + + } +} + +/** +* Document should use LINK for alternate content. +* head element must contain a link element with a rel attribute value that equals "alternate" and a href attribute value that is a valid URL. +* @link http://quail-lib.org/test-info/linkUsedForAlternateContent +*/ +class linkUsedForAlternateContent extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $head = $this->getAllElements('head'); + $head = $head[0]; + if($head && property_exists($head, 'childNodes')) { + foreach($head->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'link') && $child->getAttribute('rel') == 'alternate') + return true; + } + } + $this->addReport(null, null, false); + } +} + + + + +/** +* Document uses link element to describe navigation if it is within a collection. +* The link element can provide metadata about the position of an HTML page within a set of Web units or can assist in locating content with a set of Web units. +* @link http://quail-lib.org/test-info/linkUsedToDescribeNavigation +*/ +class linkUsedToDescribeNavigation extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $head = $this->getAllElements('head'); + $head = $head[0]; + if($head->childNodes) { + foreach($head->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'link') && $child->getAttribute('rel') != 'stylesheet') + return true; + } + $this->addReport(null, null, false); + } + } +} + +/** +* List items must not be used to format text. +* OL element should not contain only one LI element. +* @link http://quail-lib.org/test-info/listNotUsedForFormatting +*/ +class listNotUsedForFormatting extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(array('ul', 'ol')) as $list) { + $li_count = 0; + foreach($list->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'li')) { + $li_count++; + } + } + if($li_count < 2) + $this->addReport($list); + } + + } +} + +/** +* marquee element is not used. +* This error will be generated for each marquee element. +* @link http://quail-lib.org/test-info/marqueeIsNotUsed +*/ +class marqueeIsNotUsed extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'marquee'; + +} + +/** +* menu items should not be used to format text. +* menu element must contain one LI element. +* @link http://quail-lib.org/test-info/menuNotUsedToFormatText +*/ +class menuNotUsedToFormatText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('menu') as $menu) { + $list_items = 0; + foreach($menu->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'li')) { + $list_items++; + } + } + if($list_items == 1) + $this->addReport($menu); + } + + } +} + +/** +* noembed must have equivalent content. +* This error is generated for each noembed element. +* @link http://quail-lib.org/test-info/noembedHasEquivalentContent +*/ +class noembedHasEquivalentContent extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'noembed'; +} + +/** +* NOFRAMES section must contain text equivalent of FRAMES section. +* This error is generated for each NOFRAMES element. +* @link http://quail-lib.org/test-info/noframesSectionMustHaveTextEquivalent +*/ +class noframesSectionMustHaveTextEquivalent extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('frameset') as $frameset) { + if(!$this->elementHasChild($frameset, 'noframes')) + $this->addReport($frameset); + } + foreach($this->getAllElements('noframes') as $noframes) { + $this->addReport($noframes); + } + } + +} + +/** +* Content must be usable when object are disabled. +* If an object element contains a codebase attribute then the codebase attribute value must be null or whitespace. +* @link http://quail-lib.org/test-info/objectContentUsableWhenDisabled +*/ +class objectContentUsableWhenDisabled extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* All objects do not flicker. +* This error is generated for all object elements. +* @link http://quail-lib.org/test-info/objectDoesNotFlicker +*/ +class objectDoesNotFlicker extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; + +} + +/** +* object must not use color alone. +* This error is generated for every applet element. +* @link http://quail-lib.org/test-info/objectDoesNotUseColorAlone +*/ +class objectDoesNotUseColorAlone extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* object user interface must be accessible. +* If an object element contains a codebase attribute then the codebase attribute value must be null or whitespace. +* @link http://quail-lib.org/test-info/objectInterfaceIsAccessible +*/ +class objectInterfaceIsAccessible extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* object link to multimedia file must have text transcript. +* object element cannot contain type attribute value of "video". +* @link http://quail-lib.org/test-info/objectLinkToMultimediaHasTextTranscript +*/ +class objectLinkToMultimediaHasTextTranscript extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('object') as $object) { + if($object->getAttribute('type') == 'video') + $this->addReport($object); + + } + } + +} + +/** +* All objects contain a text equivalent of the object. +* object element must contain a text equivalent for the object in case the object can't be rendered. +* @link http://quail-lib.org/test-info/objectMustContainText +*/ +class objectMustContainText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('object') as $object) { + if(!$object->nodeValue || trim($object->nodeValue) == '') + $this->addReport($object); + + } + } +} + +/** +* Use the embed element within the object element. +* Each object element must contain an embed element. +* @link http://quail-lib.org/test-info/objectMustHaveEmbed +*/ +class objectMustHaveEmbed extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('object') as $object) { + if(!$this->elementHasChild($object, 'embed')) + $this->addReport($object); + } + } +} + +/** +* object must have a title. +* object element must contain a title attribute. +* @link http://quail-lib.org/test-info/objectMustHaveTitle +*/ +class objectMustHaveTitle extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('object') as $object) { + if(!$object->hasAttribute('title')) + $this->addReport($object); + + } + } + +} + + + + +/** +* object must have a valid title. +* object element must not have a title attribute with value of null or whitespace. +* @link http://quail-lib.org/test-info/objectMustHaveValidTitle +*/ +class objectMustHaveValidTitle extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('nbsp', + ' ', + 'object', + 'an object', + 'spacer', + 'image', + 'img', + 'photo', + ' '), + 'es' => array('nbsp', + ' ', + 'objeto', + 'un objeto', + 'espacio', + 'imagen', + 'img', + 'foto', + ' '), + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('object') as $object) { + if($object->hasAttribute('title')) { + if(trim($object->getAttribute('title')) == '') + $this->addReport($object); + elseif(!in_array(trim(strtolower($object->getAttribute('title'))), $this->translation())) + $this->addReport($object); + } + } + } + +} + +/** +* object provides a keyboard mechanism to return focus to the parent window. +* Ensure that keyboard users do not become trapped in a subset of the content that can only be exited using a mouse or pointing device. +* @link http://quail-lib.org/test-info/objectProvidesMechanismToReturnToParent +*/ +class objectProvidesMechanismToReturnToParent extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* object may require a long description. +* This error is generated for every object element. +* @link http://quail-lib.org/test-info/objectShouldHaveLongDescription +*/ +class objectShouldHaveLongDescription extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* Text equivalents for object should be updated if object changes. +* If an object element contains a codebase attribute then the codebase attribute value must be null or whitespace. +* @link http://quail-lib.org/test-info/objectTextUpdatesWhenObjectChanges +*/ +class objectTextUpdatesWhenObjectChanges extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* Content must be usable when objects are disabled. +* If object element contains a CLASSid attribute and any text then this error will be generated. +* @link http://quail-lib.org/test-info/objectUIMustBeAccessible +*/ +class objectUIMustBeAccessible extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'object'; +} + +/** +* Text equivalents for object should be updated if object changes. +* If object element contains a CLASSid attribute and any text then this error will be generated. +* @link http://quail-lib.org/test-info/objectWithClassIDHasNoText +*/ +class objectWithClassIDHasNoText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('object') as $object) { + if($object->nodeValue && $object->hasAttribute('classid')) + $this->addReport($object); + + } + } +} + +/** +* All p elements are not used as headers. +* All p element content must not be marked with either b, i, u, strong, font, em. +* @link http://quail-lib.org/test-info/pNotUsedAsHeader +*/ +class pNotUsedAsHeader extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + var $head_tags = array('strong', 'em', 'font', 'i', 'b', 'u'); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('p') as $p) { + if(($p->nodeValue == $p->firstChild->nodeValue) && + is_object($p->firstChild) && + property_exists($p->firstChild, 'tagName') && + in_array($p->firstChild->tagName, $this->head_tags)) { + $this->addReport($p); + + } + else { + $style = $this->css->getStyle($p); + if($style['font-weight'] == 'bold') { + $this->addReport($p); + } + } + } + } +} + +/** +* All input elements, type of "password", have an explicitly associated label. +* input element that contains a type attribute value of "password" must have an associated label element. An associated label is one in which the for attribute value of the label element is the same as the id attribute value of the input element. +* @link http://quail-lib.org/test-info/passwordHasLabel +*/ +class passwordHasLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'password'; + + /** + * @var bool $no_type We are not looking at the type of input here + */ + var $no_type = false; +} + +/** +* All input elements, type of "password", have a label that is positioned close to the control. +* input element with a type attribute value of "password" must have an associated label element positioned close to it. +* @link http://quail-lib.org/test-info/passwordLabelIsNearby +*/ +class passwordLabelIsNearby extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'password') + $this->addReport($input); + + } + } +} + +/** +* pre element should not be used to create tabular layout. +* This error is generated for each pre element. +* @link http://quail-lib.org/test-info/preShouldNotBeUsedForTabularLayout +*/ +class preShouldNotBeUsedForTabularLayout extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('pre') as $pre) { + $rows = preg_split('/[\n\r]+/', $pre->nodeValue); + if(count($rows) > 1) + $this->addReport($pre); + } + + } +} + +/** +* All input elements, type of "radio", have an explicitly associated label. +* input element that contains a type attribute value of "radio" must have an associated label element. An associated label is one in which the for attribute value of the label element is the same as the id attribute value of the input element. +* @link http://quail-lib.org/test-info/radioHasLabel +*/ +class radioHasLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'input'; + + /** + * @var string $type The type of input we're looking for + */ + var $type = 'radio'; + + /** + * @var bool $no_type We are not looking at the type of input here + */ + var $no_type = false; +} + +/** +* All input elements, type of "radio", have a label that is positioned close to the control. +* input element with a type attribute value of "radio" must have an associated label element positioned close to it. +* @link http://quail-lib.org/test-info/radioLabelIsNearby +*/ +class radioLabelIsNearby extends quailTest { + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'radio') + $this->addReport($input); + + } + } +} + +/** +* All radio button groups are marked using fieldset and legend elements. +* form element content must contain both fieldset and legend elements if there are related radio buttons. +* @link http://quail-lib.org/test-info/radioMarkedWithFieldgroupAndLegend +*/ +class radioMarkedWithFieldgroupAndLegend extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $radios = array(); + foreach($this->getAllElements('input') as $input) { + if($input->getAttribute('type') == 'radio') { + $radios[$input->getAttribute('name')][] = $input; + } + } + foreach($radios as $radio) { + if(count($radio > 1)) { + if(!$this->getParent($radio[0], 'fieldset', 'body')) + $this->addReport($radio[0]); + } + } + } +} + +/** +* @todo This should really only fire once and shouldn't extend quailTagTest +*/ + +/** +* Content must be accessible when script is disabled. +* This error will be generated for all script elements. +* @link http://quail-lib.org/test-info/scriptContentAccessibleWithScriptsTurnedOff +*/ +class scriptContentAccessibleWithScriptsTurnedOff extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'script'; +} + +/** +* script must have a noscript section. +* script elements that occur within the body must be followed by a noscript section. +* @link http://quail-lib.org/test-info/scriptInBodyMustHaveNoscript +*/ +class scriptInBodyMustHaveNoscript extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('script') as $script) { + if(!$this->propertyIsEqual($script->nextSibling, 'tagName', 'noscript') + && !$this->propertyIsEqual($script->parentNode, 'tagName', 'head')) + $this->addReport($script); + + } + } + +} + +/** +* All onclick event handlers have an associated onkeypress event handler. +* Any element that contains an onclick attribute must also contain an onkeypress attribute. +* @link http://quail-lib.org/test-info/scriptOnclickRequiresOnKeypress +*/ +class scriptOnclickRequiresOnKeypress extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'onclick'; + + /** + * @var string $key_value Attribute that is considered a keyboard event + */ + var $key_value = 'onkeypress'; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(array_keys(htmlElements::$html_elements)) as $element) { + if(($element->hasAttribute($this->click_value)) && !$element->hasAttribute($this->key_value)) + $this->addReport($element); + } + } + +} + +/** +* All ondblclick event handlers have corresponding keyboard-specific functions. +* Any element that contains an ondblclick attribute will generate this error. +* @link http://quail-lib.org/test-info/scriptOndblclickRequiresOnKeypress +*/ +class scriptOndblclickRequiresOnKeypress extends scriptOnclickRequiresOnKeypress { + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'ondblclick'; +} + +/** +* All onmousedown event handlers have an associated onkeydown event handler. +* Any element that contains an onmousedown attribute must also contain an onkeydown attribute. +* @link http://quail-lib.org/test-info/scriptOnmousedownRequiresOnKeypress +*/ +class scriptOnmousedownRequiresOnKeypress extends scriptOnclickRequiresOnKeypress { + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'onmousedown'; + + /** + * @var string $key_value Attribute that is considered a keyboard event + */ + var $key_value = 'onkeydown'; +} + +/** +* All onmousemove event handlers have corresponding keyboard-specific functions. +* Any element that contains an onmousemove attribute will generate this error. +* @link http://quail-lib.org/test-info/scriptOnmousemove +*/ +class scriptOnmousemove extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'onmousemove'; + + /** + * @var string $key_value Attribute that is considered a keyboard event + */ + var $key_value = 'onkeypress'; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(array_keys(htmlElements::$html_elements)) as $element) { + if(($element->hasAttribute($this->click_value))) + $this->addReport($element); + } + } + +} + +/** +* All onmouseout event handlers have an associated onblur event handler. +* Any element that contains an onmouseout attribute must also contain an onblur attribute. +* @link http://quail-lib.org/test-info/scriptOnmouseoutHasOnmouseblur +*/ +class scriptOnmouseoutHasOnmouseblur extends scriptOnclickRequiresOnKeypress { + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'onmouseout'; + + /** + * @var string $key_value Attribute that is considered a keyboard event + */ + var $key_value = 'onblur'; +} + +/** +* All onmouseover event handlers have an associated onfocus event handler. +* Any element that contains an onmouseover attribute must also contain an onfocus attribute. +* @link http://quail-lib.org/test-info/scriptOnmouseoverHasOnfocus +*/ +class scriptOnmouseoverHasOnfocus extends scriptOnclickRequiresOnKeypress { + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'onmouseover'; + + /** + * @var string $key_value Attribute that is considered a keyboard event + */ + var $key_value = 'onfocus'; +} + +/** +* All onmouseup event handlers have an associated onkeyup event handler. +* Any element that contains an onmouseup attribute must also contain an onkeyup attribute. +* @link http://quail-lib.org/test-info/scriptOnmouseupHasOnkeyup +*/ +class scriptOnmouseupHasOnkeyup extends scriptOnclickRequiresOnKeypress { + + /** + * @var string $click_value Attribute that is considered a mouse-only event + */ + var $click_value = 'onmouseup'; + + /** + * @var string $key_value Attribute that is considered a keyboard event + */ + var $key_value = 'onkeyup'; +} + +/** +* User interface for script must be accessible. +* This error will be generated for all script elements. +* @link http://quail-lib.org/test-info/scriptUIMustBeAccessible +*/ +class scriptUIMustBeAccessible extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'script'; +} + +/** +* script should not cause screen flicker. +* This error will be generated for all script elements. +* @link http://quail-lib.org/test-info/scriptsDoNotFlicker +*/ +class scriptsDoNotFlicker extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'script'; +} + +/** +* Color alone should not be used in the script. +* This error will be generated for all script elements. +* @link http://quail-lib.org/test-info/scriptsDoNotUseColorAlone +*/ +class scriptsDoNotUseColorAlone extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'script'; +} + +/** +* All select elements do not cause an extreme change in context. +* select element cannot contain onchange attribute. +* @link http://quail-lib.org/test-info/selectDoesNotChangeContext +*/ +class selectDoesNotChangeContext extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('select') as $select) { + if($select->hasAttribute('onchange')) + $this->addReport($select); + + } + } +} + +/** +* All select elements have an explicitly associated label. +* select element must have an associated label element. A label element is associated with the select element if the for attribute value of the label is the same as the id attribute of the select element. +* @link http://quail-lib.org/test-info/selectHasAssociatedLabel +*/ +class selectHasAssociatedLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'select'; + + /** + * @var bool $no_type We are looking at a type-specific input element + */ + var $no_type = true; +} + +/** +* All select elements containing a large number options also contain optgroup elements. +* select element content that contains 4 or more option elements must contain at least 2 optgroup elements. +* @link http://quail-lib.org/test-info/selectWithOptionsHasOptgroup +*/ +class selectWithOptionsHasOptgroup extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('select') as $select) { + $options = 0; + foreach($select->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'option')) { + $options++; + } + } + if($options >= 4) { + $this->addReport($select); + } + } + } +} + +/** +* Sites must have a site map. +* Each site must have a site map. +* @link http://quail-lib.org/test-info/siteMap +*/ +class siteMap extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('a') as $a) { + if(strtolower(trim($a->nodeValue)) == 'site map') + return true; + } + $this->addReport(null, null, false); + } +} + +/** +* A "skip to content" link appears on all pages with blocks of material prior to the main document. +* Provide a mechanism to bypass blocks of material that are repeated on multiple Web units. +* @link http://quail-lib.org/test-info/skipToContentLinkProvided +*/ +class skipToContentLinkProvided extends quailTest { + + /** + * @var bool $cms This test does not apply to content management systems (is document-related) + */ + var $cms = false; + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var array $strings An array of strings, broken up by language domain + */ + var $strings = array('en' => array('navigation', 'skip', 'content'), + 'es' => array('navegación', 'saltar', 'contenido'), + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $first_link = $this->getAllElements('a'); + if(!$first_link) { + $this->addReport(null, null, false); + return null; + } + $a = $first_link[0]; + + if(substr($a->getAttribute('href'), 0, 1) == '#') { + + $link_text = explode(' ', strtolower($a->nodeValue)); + if(!in_array($this->translation(), $link_text)) { + $report = true; + foreach($a->childNodes as $child) { + if(method_exists($child, 'hasAttribute')) { + if($child->hasAttribute('alt')) { + $alt = explode(' ', strtolower($child->getAttribute('alt') . $child->nodeValue)); + foreach($this->translation() as $word) { + if(in_array($word, $alt)) { + $report = false; + } + } + } + } + } + if($report) { + $this->addReport(null, null, false); + } + } + + } + else + $this->addReport(null, null, false); + + } + +} + + +/** +* The tab order specified by tabindex attributes follows a logical order. +* Provide a logical tab order when the default tab order does not suffice. +* @link http://quail-lib.org/test-info/tabIndexFollowsLogicalOrder +*/ +class tabIndexFollowsLogicalOrder extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $index = 0; + foreach($this->getAllElements(null, 'form') as $form) { + if(is_numeric($form->getAttribute('tabindex')) + && intval($form->getAttribute('tabindex')) != $index + 1) + $this->addReport($form); + $index++; + } + } +} + +/** +* Table captions identify the table. +* If the table has a caption then the caption must identify the table. +* @link http://quail-lib.org/test-info/tableCaptionIdentifiesTable +*/ +class tableCaptionIdentifiesTable extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'caption'; +} + +/** +* All complex data tables have a summary. +* The summary is useful when the table has a complex structure (for example, when there are several sets of row or column headers, or when there are multiple groups of columns or rows). The summary may also be helpful for simple data tables that contain many columns or rows of data. +* @link http://quail-lib.org/test-info/tableComplexHasSummary +*/ +class tableComplexHasSummary extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if(!$table->hasAttribute('summary') && $table->firstChild->tagName != 'caption') { + $this->addReport($table); + + + } + } + + } +} + +/** +* All data tables contain th elements. +* Data tables must have th elements while layout tables can not have th elements. +* @link http://quail-lib.org/test-info/tableDataShouldHaveTh +*/ +class tableDataShouldHaveTh extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if(!$this->isData($table)) + $this->addReport($table); + + } + + } + +} + +/** +* Substitutes for table header labels must be terse. +* abbr attribute value on th element must be less than 20 characters (English). +* @link http://quail-lib.org/test-info/tableHeaderLabelMustBeTerse +*/ +class tableHeaderLabelMustBeTerse extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr')) { + foreach($child->childNodes as $td) { + if($this->propertyIsEqual($td, 'tagName', 'th')) { + if(strlen($td->getAttribute('abbr')) > 20) + $this->addReport($td); + + } + } + } + } + + } + + } +} + +/** +* Use thead to group repeated table headers, tfoot for repeated table footers, and tbody for other groups of rows. +* @link http://quail-lib.org/test-info/tableIsGrouped +*/ +class tableIsGrouped extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if(!$this->elementHasChild($table, 'thead') + || !$this->elementHasChild($table, 'tbody') + || !$this->elementHasChild($table, 'tfoot')) { + $rows = 0; + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr')) + $rows ++; + } + if($rows > 4) + $this->addReport($table); + } + } + + } +} + +/** +* All layout tables do not contain th elements. +* Data tables must have th elements while layout tables can not have th elements. +* @link http://quail-lib.org/test-info/tableLayoutDataShouldNotHaveTh +*/ +class tableLayoutDataShouldNotHaveTh extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($this->isData($table)) + $this->addReport($table); + + } + + } + +} + +/** +* All layout tables do not contain caption elements. +* table element content cannot contain a caption element if it's a layout table. +* @link http://quail-lib.org/test-info/tableLayoutHasNoCaption +*/ +class tableLayoutHasNoCaption extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($this->elementHasChild($table, 'caption')) { + $first_row = true; + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr') && $first_row) { + if(!$this->elementHasChild($child, 'th')) + $this->addReport($table); + $first_row = false; + } + } + } + } + + } +} + +/** +* All layout tables have an empty summary attribute or no summary attribute. +* The table element, summary attribute for all layout tables contains no printable characters or is absent. +* @link http://quail-lib.org/test-info/tableLayoutHasNoSummary +*/ +class tableLayoutHasNoSummary extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($table->hasAttribute('summary') && strlen(trim($table->getAttribute('summary'))) > 1) { + $first_row = true; + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr') && $first_row) { + if(!$this->elementHasChild($child, 'th')) + $this->addReport($table); + $first_row = false; + } + } + } + } + + } +} + +/** +* All layout tables make sense when linearized. +* This error is generated for all layout tables. If the table contains th elements then it is a data table. If the table does not contain th elements then it is a layout table. +* @link http://quail-lib.org/test-info/tableLayoutMakesSenseLinearized +*/ +class tableLayoutMakesSenseLinearized extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if(!$this->isData($table)) + $this->addReport($table); + + } + + } + +} + +/** +* All data table summaries describe navigation and structure of the table. +* The table summary can't be garbage text. +* @link http://quail-lib.org/test-info/tableSummaryDescribesTable +*/ +class tableSummaryDescribesTable extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($table->hasAttribute('summary')) + $this->addReport($table); + } + } +} + +/** +* Table summaries do not duplicate the table captions. +* The summary and the caption must be different. Caption identifies the table. Summary describes the table contents. +* @link http://quail-lib.org/test-info/tableSummaryDoesNotDuplicateCaption +*/ +class tableSummaryDoesNotDuplicateCaption extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($this->elementHasChild($table, 'caption') && $table->hasAttribute('summary')) { + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'caption')) + $caption = $child; + } + if(strtolower(trim($caption->nodeValue)) == + strtolower(trim($table->getAttribute('summary'))) ) + $this->addReport($table); + + } + } + } +} + +/** +* All data table summaries contain text. +* table element cannot contain an empty summary attribute if it's a data table. +* @link http://quail-lib.org/test-info/tableSummaryIsEmpty +*/ +class tableSummaryIsEmpty extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($table->hasAttribute('summary') && trim($table->getAttribute('summary')) == '') { + $this->addReport($table); + + + } + } + + } +} + +/** +* All data table summaries are greater than 10 printable characters (English). +* table element, summary attribute value must be greater than 10 characters (English) if it's a data table. +* @link http://quail-lib.org/test-info/tableSummaryIsSufficient +*/ +class tableSummaryIsSufficient extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($table->hasAttribute('summary') && strlen(trim($table->getAttribute('summary'))) < 11) { + $this->addReport($table); + + + } + } + + } +} + +/** +* Use colgroup and col elements to group columns. +* @link http://quail-lib.org/test-info/tableUseColGroup +*/ +class tableUseColGroup extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($this->isData($table)) { + if(!$this->elementHasChild($table, 'colgroup') && !$this->elementHasChild($table, 'col')) + $this->addReport($table); + } + } + + } +} + +/** +* Long table header labels require terse substitutes. +* th element content must be less than 20 characters (English) if th element does not contain abbr attribute. +* @link http://quail-lib.org/test-info/tableUsesAbbreviationForHeader +*/ +class tableUsesAbbreviationForHeader extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr')) { + foreach($child->childNodes as $td) { + if($this->propertyIsEqual($td, 'tagName', 'th')) { + if(strlen($td->nodeValue) > 20 && !$td->hasAttribute('abbr')) + $this->addReport($table); + + } + } + } + } + + } + + } +} + +/** +* All data tables contain a caption unless the table is identified within the document. +* Tables must be identified by a caption unless they are identified within the document. +* @link http://quail-lib.org/test-info/tableUsesCaption +*/ +class tableUsesCaption extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($table->firstChild->tagName != 'caption') + $this->addReport($table); + + } + + } +} + +/** +* Data tables that contain both row and column headers use the scope attribute to identify cells. +* The scope attribute may be used to clarify the scope of any cell used as a header. +* @link http://quail-lib.org/test-info/tableWithBothHeadersUseScope +*/ +class tableWithBothHeadersUseScope extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + $fail = false; + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr')) { + if($this->propertyIsEqual($child->firstChild, 'tagName', 'td')) { + if(!$child->firstChild->hasAttribute('scope')) + $fail = true; + } + else { + foreach($child->childNodes as $td) { + if($td->tagName == 'th' && !$td->hasAttribute('scope')) + $fail = true; + } + } + } + } + if($fail) + $this->addReport($table); + } + } +} + +/** +* Data tables that contain more than one row/column of headers use the id and headers attributes to identify cells. +* id and headers attributes allow screen readers to speak the headers associated with each data cell when the relationships are too complex to be identified using the th element alone or the th element with the scope attribute. +* @link http://quail-lib.org/test-info/tableWithMoreHeadersUseID +*/ +class tableWithMoreHeadersUseID extends quailTableTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('table') as $table) { + if($this->isData($table)) { + + $row = 0; + $multi_headers = false; + foreach($table->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'tr')) { + $row ++; + foreach($child->childNodes as $cell) { + if($this->propertyIsEqual($cell, 'tagName', 'th')) { + $th[] = $cell; + if($row > 1) + $multi_headers = true; + } + + } + } + } + if($multi_headers) { + $fail = false; + foreach($th as $cell) { + if(!$cell->hasAttribute('id')) + $fail = true; + } + if($fail) + $this->addReport($table); + } + + } + } + } +} + +/** +* Table markup is used for all tabular information. +* The objective of this technique is to present tabular information in a way that preserves relationships within the information even when users cannot see the table or the presentation format is changed. +* @link http://quail-lib.org/test-info/tabularDataIsInTable +*/ +class tabularDataIsInTable extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(null, 'text') as $text) { + if(strpos($text->nodeValue, "\t") !== false || $text->tagName == 'pre') + $this->addReport($text); + } + } +} + +/** +* All textarea elements have an explicitly associated label. +* All textarea elements must have an explicitly associated label. +* @link http://quail-lib.org/test-info/textareaHasAssociatedLabel +*/ +class textareaHasAssociatedLabel extends inputHasLabel { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'textarea'; + + /** + * @var bool $no_type We are looking at a type-specific input element + */ + var $no_type = true; +} + +/** +* All textarea elements have a label that is positioned close to control. +* textarea element must have an associated label element that is positioned close to it. +* @link http://quail-lib.org/test-info/textareaLabelPositionedClose +*/ +class textareaLabelPositionedClose extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'textarea'; +} + +/** +* Inline SVG entries should contain a title element which describes the content of the SVG +* @link http://quail-lib.org/test-info/svgContainsTitle +*/ +class svgContainsTitle extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('svg') as $svg) { + $title = false; + foreach($svg->childNodes as $child) { + if($this->propertyIsEqual($child, 'tagName', 'title')) { + $title = true; + } + } + if(!$title) { + $this->addReport($svg); + } + } + } +} + +/** +* HTML5 video tags have captions. There's unfortunately no way to test for captions yet... +* @link http://quail-lib.org/test-info/videoProvidesCaptions +*/ +class videoProvidesCaptions extends quailTagTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var string $tag The tag this test will fire on + */ + var $tag = 'video'; +} + +/** +* Links to YouTube videos must have a caption +* @link http://quail-lib.org/test-info/videosEmbeddedOrLinkedNeedCaptions +*/ +class videosEmbeddedOrLinkedNeedCaptions extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * @var array $services The services that this test will need. We're using + * the youtube library. + */ + var $services = array( + 'youtube' => 'media/youtube', + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(array('a', 'embed')) as $video) { + $attr = ($video->tagName == 'a') + ? 'href' + : 'src'; + + if($video->hasAttribute($attr)) { + foreach($this->services as $service) { + if($service->captionsMissing($video->getAttribute($attr))) { + $this->addReport($video); + } + } + } + } + } + +} + +/** +* Checks that a document is written clearly to a minimum of a 60 on the +* Flesch Reading Ease score (9.9 max grade level). +* @link http://quail-lib.org/test-info/documentIsWrittenClearly +*/ +class documentIsWrittenClearly extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * @var array $services The services that this test will need. We're using + * the readability library. + */ + var $services = array( + 'readability' => 'readability/readability', + ); + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $readability = $this->services['readability']; + foreach($this->getAllElements(null, 'text') as $element) { + $text = strip_tags($element->nodeValue); + if(str_word_count($text) > 25) { + if($readability->flesch_kincaid_reading_ease($text) < 60) { + $this->addReport($element); + } + } + } + } + +} + +/** +* Headers should have text content so as not to confuse screen-reader users +* @link http://quail-lib.org/test-info/headersHaveText +*/ +class headersHaveText extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(null, 'header', true) as $header) { + if(!$this->elementContainsReadableText($header)) { + $this->addReport($header); + } + } + } +} + +/** +* All labels should be associated with an input element. If not, these are considered 'orphans' +* because they have no or the wrong "for" attribute +* @link http://quail-lib.org/test-info/labelsAreAssignedToAnInput +*/ + +class labelsAreAssignedToAnInput extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('label') as $label) { + if(!$label->hasAttribute('for') || !$input = $this->dom->getElementById($label->getAttribute('for'))) { + $this->addReport($label); + } + if(!in_array($input->tagName, array('input', 'select', 'textarea'))) { + $this->addReport($label); + } + } + } +} + +/** +* ALT text on images should not be redundant across the page. Please check that all +* images have alt text which is unique to the image. +* @link http://quail-lib.org/test-info/imgAltTextNotRedundant +*/ +class imgAltTextNotRedundant extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_SEVERE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + $alt = array(); + foreach($this->getAllElements('img') as $img) { + if($img->hasAttribute('src') && $img->hasAttribute('alt')) { + if(isset($alt[strtolower(trim($img->getAttribute('alt')))]) && + $alt[strtolower(trim($img->getAttribute('alt')))] != + strtolower(trim($img->getAttribute('src')))) { + $this->addReport($img); + } + $alt[strtolower(trim($img->getAttribute('alt')))] = strtolower(trim($img->getAttribute('src'))); + } + } + unset($alt); + } +} + +/** +* Jump menus that consist of a single form element should not be used +* @link http://quail-lib.org/test-info/selectJumpMenus +*/ +class selectJumpMenus extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements('select') as $select) { + $parent = $this->getParent($select, 'form', 'body'); + $fail = true; + if($parent) { + foreach($this->getAllElements('input') as $input) { + if($input->hasAttribute('type') && $input->getAttribute('type') == 'submit') { + $parent_input = $this->getParent($input, 'form', 'body'); + if($parent_input->isSameNode($parent)) { + $fail = false; + } + } + } + } + if($fail) { + $this->addReport($select); + } + } + } +} + + +/** +* Text size is not less than 10px small +* @link http://quail-lib.org/test-info/textIsNotSmall +*/ +class textIsNotSmall extends quailTest { + + /** + * @var int $default_severity The default severity code for this test. + */ + var $default_severity = QUAIL_TEST_MODERATE; + + /** + * The main check function. This is called by the parent class to actually check content + */ + function check() { + foreach($this->getAllElements(null, 'text', true) as $text) { + $style = $this->css->getStyle($text); + if(isset($style['font-size'])) { + if(substr($style['font-size'], -2, 2) == 'px') { + if(intval($style['font-size']) < 10) { + $this->addReport($text); + } + } + if(substr($style['font-size'], -2, 2) == 'em') { + if(floatval($style['font-size']) < .63) { + $this->addReport($text); + } + } + } + } + } + +} + +/*@}*/ \ No newline at end of file diff --git a/quail/common/css.php b/quail/common/css.php new file mode 100644 index 0000000..f286195 --- /dev/null +++ b/quail/common/css.php @@ -0,0 +1,599 @@ +. +* @author Kevin Miller +*/ + +/** +* @file +This class first parses all the CSS in the document and prepares +an index of CSS styles to be used by accessibility tests to determine color and +positioning. + +First, in loadCSS we get all the inline and linked style sheet information + and merge it into a large CSS file string. + +Second, in setStyles we use XPath queries to find all the DOM elements which are +effected by CSS styles and then build up an index in style_index of all the CSS +styles keyed by an attriute we attach to all DOM objects to lookup the style quickly. + +Most of the second step is to get around the problem where XPath DOMNodeList objects +are only marginally referential to the original elements and cannot be altered directly. + +*/ + +/** +* A helper class to parse the document's CSS so we can run accessibility +* tests against it. +*/ +class quailCSS { + + /** + * @var object The DOMDocument object of the current document + */ + var $dom; + + /** + * @var string The URI of the current document + */ + var $uri; + + /** + * @var string The type of request (inherited from the main QUAIL object) + */ + var $type; + + /** + * @var array An array of all the CSS elements and attributes + */ + var $css; + + /** + * @var string Additional CSS information (usually for CMS mode requests) + */ + var $css_string; + + /** + * @var bool Whether or not we are running in CMS mode + */ + var $cms_mode; + + /** + * @var array An array of all the strings which means the current style inherts from above + */ + var $inheritance_strings = array('inherit', 'currentColor'); + + /** + * @var array An array of all the styles keyed by the new attribute quail_style_index + */ + var $style_index = array(); + + /** + * @var int The next index ID to be applied to a node to lookup later in style_index + */ + var $next_index = 0; + + /** + * @var array A list of all the elements which support deprecated styles such as 'background' or 'bgcolor' + */ + var $deprecated_style_elements = array('body', 'table', 'tr', 'td', 'th'); + + /** + * Class constructor. We are just building and importing variables here and then loading the CSS + * @param object $dom The DOMDocument object + * @param string $uri The URI of the request + * @param string $type The type of request + * @param bool $cms_mode Whether we are running in CMS mode + * @param array $css_files An array of additional CSS files to load + */ + function __construct(&$dom, $uri, $type, $path, $cms_mode = false, $css_files = array()) { + $this->dom =& $dom; + $this->type = $type; + $this->uri = $uri; + $this->path = $path; + $this->cms_mode = $cms_mode; + $this->css_files = $css_files; + } + + + /** + * Sets all the styles from the CSS index into the style_index variable. + * To do this, because DOMNodeList doesn't return real elements, we are actually + * setting and attribute on all nodes that references back to a style index we maintain + * in the CSS class itself + */ + private function setStyles() { + if(!is_array($this->css)) { + return null; + } + foreach($this->css as $selector => $style) { + $xpath = new DOMXPath($this->dom); + $entries = @$xpath->query($this->getXpath($selector)); + if($entries->length) { + foreach($entries as $e) { + if(!$e->hasAttribute('quail_style_index')) { + $e->setAttribute('quail_style_index', $this->next_index); + $this->next_index++; + } + $this->addCSSToElement($e, $style, $this->getSpecificity($selector)); + } + } + } + foreach($this->style_index as $k => $style) { + foreach($style as $i => $values) { + $this->style_index[$k][$i] = trim(strtolower($values['value'])); + } + } + } + + /** + * Adds the provided CSS to the element's style entry in style_index. We first + * check the specificity against the items already in the index. + * @param object $element The DOMNode/DOMElement object + * @param array $style The provided CSS Style + * @param int $specificity The specificity total for the CSS selector + */ + private function addCSSToElement($element, $style, $specificity) { + $index_id = $element->getAttribute('quail_style_index'); + foreach($style as $name => $value) { + if(!$this->style_index[$index_id][$name] || + $this->style_index[$index_id][$name]['specificity'] < $specificity + || strpos($value, '!important') !== false) + { + $this->style_index[$index_id][$name] = array( + 'value' => str_replace('!important', '', trim(strtolower($value))), + 'specificity' => $specificity, + ); + } + } + + } + + /** + * Loads all the CSS files from the document using LINK elements or @import commands + */ + private function loadCSS() { + if(count($this->css_files) > 0) { + $css = $this->css_files; + } + else { + $css = array(); + $header_styles = $this->dom->getElementsByTagName('style'); + foreach($header_styles as $header_style) { + if($header_style->nodeValue) { + $this->css_string .= $header_style->nodeValue; + } + } + $style_sheets = $this->dom->getElementsByTagName('link'); + + foreach($style_sheets as $style) { + if($style->hasAttribute('rel') && + strtolower($style->getAttribute('rel')) == 'stylesheet' && + $style->getAttribute('media') != 'print') { + $css[] = $style->getAttribute('href'); + } + } + } + foreach($css as $sheet) { + $this->loadUri($sheet); + } + $this->loadImportedFiles(); + $this->css_string = str_replace(':link', '', $this->css_string); + $this->formatCSS(); + } + + /** + * Imports files from the CSS file using @import commands + */ + private function loadImportedFiles() { + $matches = array(); + preg_match_all('/@import (.*?);/i', $this->css_string, $matches); + if(count($matches[1]) == 0) { + return null; + } + foreach($matches[1] as $match) { + $this->loadUri(trim(str_replace('url', '', $match), '"\')(')); + } + preg_replace('/@import (.*?);/i', '', $this->css_string); + } + + /** + * Returns a specificity count to the given selector. + * Higher specificity means it overrides other styles. + * @param string selector The CSS Selector + */ + public function getSpecificity($selector) { + $selector = $this->parseSelector($selector); + if($selector[0][0] == ' ') { + unset($selector[0][0]); + } + $selector = $selector[0]; + $specificity = 0; + foreach($selector as $part) { + switch(substr(str_replace('*', '', $part), 0, 1)) { + case '.': + $specificity += 10; + case '#': + $specificity += 100; + case ':': + $specificity++; + default: + $specificity++; + } + if(strpos($part, '[id=') != false) { + $specificity += 100; + } + } + return $specificity; + } + + /** + * Interface method for tests to call to lookup the style information for a given DOMNode + * @param object $element A DOMElement/DOMNode object + * @return array An array of style information (can be empty) + */ + public function getStyle($element) { + //To prevent having to parse CSS unless the info is needed, + //we check here if CSS has been set, and if not, run off the parsing + //now. + if(!$this->css) { + $this->loadCSS(); + $this->setStyles(); + } + if(!is_a($element, 'DOMElement')) { + return array(); + } + $style = $this->getNodeStyle($element); + $style = $this->walkUpTreeForInheritance($element, $style); + + if($element->hasAttribute('style')) { + $inline_styles = explode(';', $element->getAttribute('style')); + foreach($inline_styles as $inline_style) { + $s = explode(':', $inline_style); + $style[$s[0]] = trim(strtolower($s[1])); + } + } + if(!is_array($style)) { + return array(); + } + return $style; + } + + /** + * Adds a selector to the CSS index + * @param string $key The CSS selector + * @param string $codestr The CSS Style code string + */ + + private function addSelector($key, $codestr) { + if(strpos($key, '@import') !== false) { + return null; + } + $key = strtolower($key); + $codestr = strtolower($codestr); + if(!isset($this->css[$key])) { + $this->css[$key] = array(); + } + $codes = explode(";",$codestr); + if(count($codes) > 0) { + foreach($codes as $code) { + $code = trim($code); + $explode = explode(":",$code,2); + if(count($explode) > 1) { + list($codekey, $codevalue) = $explode; + if(strlen($codekey) > 0) { + $this->css[$key][trim($codekey)] = trim($codevalue); + } + } + } + } + } + + /** + * Returns the style from the CSS index for a given element by first + * looking into its tag bucket then iterating over every item for an + * element that matches + * @param object The DOMNode/DOMElement object in queryion + * @retun array An array of all the style elements that _directly_ apply + * to that element (ignoring inheritance) + * + */ + private function getNodeStyle($element) { + $style = array(); + if($element->hasAttribute('quail_style_index')) { + $style = $this->style_index[$element->getAttribute('quail_style_index')]; + } + // To support the deprecated 'bgcolor' attribute + if($element->hasAttribute('bgcolor') && in_array($element->tagName, $this->deprecated_style_elements)) { + $style['background-color'] = $element->getAttribute('bgcolor'); + } + return $style; + } + + /** + * A helper function to walk up the DOM tree to the end to build an array + * of styles. + * @param object $element The DOMNode object to walk up from + * @param array $style The current style built for the node + * @return array The array of the DOM element, altered if it was overruled through css inheritance + */ + private function walkUpTreeForInheritance($element, $style) { + while(property_exists($element->parentNode, 'tagName')) { + $parent_style = $this->getNodeStyle($element->parentNode); + + if(is_array($parent_style)) { + foreach($parent_style as $k => $v) { + if(!isset($style[$k]) || in_array($style[$k]['value'], $this->inheritance_strings)) { + $style[$k] = $v; + } + } + } + $element = $element->parentNode; + } + return $style; + } + + /** + * Loads a CSS file from a URI + * @param string $rel The URI of the CSS file + */ + private function loadUri($rel) { + if($this->type == 'file') { + $uri = substr($this->uri, 0, strrpos($this->uri, '/')) .'/'.$rel; + } + else { + $uri = quail::getAbsolutePath($this->uri, $rel); + } + $this->css_string .= @file_get_contents($uri); + + } + + /** + * Formats the CSS to be ready to import into an array of styles + * @return bool Whether there were elements imported or not + */ + private function formatCSS() { + // Remove comments + $str = preg_replace("/\/\*(.*)?\*\//Usi", "", $this->css_string); + // Parse this damn csscode + $parts = explode("}",$str); + if(count($parts) > 0) { + foreach($parts as $part) { + if(strpos($part, '{') !== false) { + list($keystr,$codestr) = explode("{", $part); + $keys = explode(",",trim($keystr)); + if(count($keys) > 0) { + foreach($keys as $key) { + if(strlen($key) > 0) { + $key = str_replace("\n", "", $key); + $key = str_replace("\\", "", $key); + $this->addSelector($key, trim($codestr)); + } + } + } + } + } + } + return (count($this->css) > 0); + } + + /** + * Converts a CSS selector to an Xpath query + * @param string $selector The selector to convert + * @return string An Xpath query string + */ + private function getXpath($selector) { + $query = $this->parseSelector($selector); + + $xpath = '//'; + foreach($query[0] as $k => $q) { + if($q == ' ' && $k) + $xpath .= '//'; + elseif($q == '>' && $k) + $xpath .= '/'; + elseif(substr($q, 0, 1) == '#') + $xpath .= '[ @id = "'. str_replace('#', '', $q) .'" ]'; + + elseif(substr($q, 0, 1) == '.') + $xpath .= '[ @class = "'. str_replace('.', '', $q) .'" ]'; + elseif(substr($q, 0, 1) == '[') + $xpath .= str_replace('[id', '[ @ id', $q); + else + $xpath .= trim($q); + } + return str_replace('//[', '//*[', str_replace('//[ @', '//*[ @', $xpath)); + } + + /** + * Checks that a string is really a regular character + * @param string $char The character + * @return bool Whether the string is a character + */ + private function isChar($char) { + return extension_loaded('mbstring') + ? mb_eregi('\w', $char) + : preg_match('@\w@', $char); + } + + /** + * Parses a CSS selector into an array of rules. + * @param string $query The CSS Selector query + * @return arran An array of the CSS Selector parsed into rule segments + */ + private function parseSelector($query) { + // clean spaces + // TODO include this inside parsing ? + $query = trim( + preg_replace('@\s+@', ' ', + preg_replace('@\s*(>|\\+|~)\s*@', '\\1', $query) + ) + ); + $queries = array(array()); + if (! $query) + return $queries; + $return =& $queries[0]; + $specialChars = array('>',' '); +// $specialCharsMapping = array('/' => '>'); + $specialCharsMapping = array(); + $strlen = mb_strlen($query); + $classChars = array('.', '-'); + $pseudoChars = array('-'); + $tagChars = array('*', '|', '-'); + // split multibyte string + // http://code.google.com/p/phpquery/issues/detail?id=76 + $_query = array(); + for ($i=0; $i<$strlen; $i++) + $_query[] = mb_substr($query, $i, 1); + $query = $_query; + // it works, but i dont like it... + $i = 0; + while( $i < $strlen) { + $c = $query[$i]; + $tmp = ''; + // TAG + if ($this->isChar($c) || in_array($c, $tagChars)) { + while(isset($query[$i]) + && ($this->isChar($query[$i]) || in_array($query[$i], $tagChars))) { + $tmp .= $query[$i]; + $i++; + } + $return[] = $tmp; + // IDs + } else if ( $c == '#') { + $i++; + while( isset($query[$i]) && ($this->isChar($query[$i]) || $query[$i] == '-')) { + $tmp .= $query[$i]; + $i++; + } + $return[] = '#'.$tmp; + // SPECIAL CHARS + } else if (in_array($c, $specialChars)) { + $return[] = $c; + $i++; + // MAPPED SPECIAL MULTICHARS +// } else if ( $c.$query[$i+1] == '//') { +// $return[] = ' '; +// $i = $i+2; + // MAPPED SPECIAL CHARS + } else if ( isset($specialCharsMapping[$c])) { + $return[] = $specialCharsMapping[$c]; + $i++; + // COMMA + } else if ( $c == ',') { + $queries[] = array(); + $return =& $queries[ count($queries)-1 ]; + $i++; + while( isset($query[$i]) && $query[$i] == ' ') + $i++; + // CLASSES + } else if ($c == '.') { + while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $classChars))) { + $tmp .= $query[$i]; + $i++; + } + $return[] = $tmp; + // ~ General Sibling Selector + } else if ($c == '~') { + $spaceAllowed = true; + $tmp .= $query[$i++]; + while( isset($query[$i]) + && ($this->isChar($query[$i]) + || in_array($query[$i], $classChars) + || $query[$i] == '*' + || ($query[$i] == ' ' && $spaceAllowed) + )) { + if ($query[$i] != ' ') + $spaceAllowed = false; + $tmp .= $query[$i]; + $i++; + } + $return[] = $tmp; + // + Adjacent sibling selectors + } else if ($c == '+') { + $spaceAllowed = true; + $tmp .= $query[$i++]; + while( isset($query[$i]) + && ($this->isChar($query[$i]) + || in_array($query[$i], $classChars) + || $query[$i] == '*' + || ($spaceAllowed && $query[$i] == ' ') + )) { + if ($query[$i] != ' ') + $spaceAllowed = false; + $tmp .= $query[$i]; + $i++; + } + $return[] = $tmp; + // ATTRS + } else if ($c == '[') { + $stack = 1; + $tmp .= $c; + while( isset($query[++$i])) { + $tmp .= $query[$i]; + if ( $query[$i] == '[') { + $stack++; + } else if ( $query[$i] == ']') { + $stack--; + if (! $stack ) + break; + } + } + $return[] = $tmp; + $i++; + // PSEUDO CLASSES + } else if ($c == ':') { + $stack = 1; + $tmp .= $query[$i++]; + while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $pseudoChars))) { + $tmp .= $query[$i]; + $i++; + } + // with arguments ? + if ( isset($query[$i]) && $query[$i] == '(') { + $tmp .= $query[$i]; + $stack = 1; + while( isset($query[++$i])) { + $tmp .= $query[$i]; + if ( $query[$i] == '(') { + $stack++; + } else if ( $query[$i] == ')') { + $stack--; + if (! $stack ) + break; + } + } + $return[] = $tmp; + $i++; + } else { + $return[] = $tmp; + } + } else { + $i++; + } + } + foreach($queries as $k => $q) { + if (isset($q[0])) { + if (isset($q[0][0]) && $q[0][0] == ':') + array_unshift($queries[$k], '*'); + if ($q[0] != '>') + array_unshift($queries[$k], ' '); + } + } + return $queries; + } + +} diff --git a/quail/common/domExtensions.php b/quail/common/domExtensions.php new file mode 100644 index 0000000..9cc2cc3 --- /dev/null +++ b/quail/common/domExtensions.php @@ -0,0 +1,39 @@ +. +* @author Kevin Miller +*/ + +/** +* An older attempt at using dom element exteions to introduce +* finding the styling of an element. +* @deprecated +*/ +class QuailDOMElement extends DOMElement { + + var $css_style; + + function setCSS($css) { + $this->css_style = $css; + } + + function getStyle($style = false) { + if(!$style) + return $this->css_style; + else return $this->css_style[$style]; + } +} \ No newline at end of file diff --git a/quail/common/elements.php b/quail/common/elements.php new file mode 100644 index 0000000..c931cf4 --- /dev/null +++ b/quail/common/elements.php @@ -0,0 +1,79 @@ +. +* @author Kevin Miller +*/ + +/** +* This is a helper class which organizes all the HTML +* tags into groups for finding, for example, all elements +* which can possibly hold text that will be rendered on screen. +* +*/ +class htmlElements { + + /** + * @var array An array of HTML tag names and their attributes + * @todo add HTML5 elements here + */ + static $html_elements = array( + 'img' => array('text' => false), + 'p' => array('text' => true), + 'pre' => array('text' => true), + 'span' => array('text' => true), + 'div' => array('text' => true), + 'applet' => array('text' => false), + 'embed' => array('text' => false, 'media' => true), + 'object' => array('text' => false, 'media' => true), + 'area' => array('imagemap' => true), + 'b' => array('text' => true, 'non-emphasis' => true), + 'i' => array('text' => true, 'non-emphasis' => true), + 'font' => array('text' => true, 'font' => true), + 'h1' => array('text' => true, 'header' => true), + 'h2' => array('text' => true, 'header' => true), + 'h3' => array('text' => true, 'header' => true), + 'h4' => array('text' => true, 'header' => true), + 'h5' => array('text' => true, 'header' => true), + 'h6' => array('text' => true, 'header' => true), + 'ul' => array('text' => true, 'list' => true), + 'dl' => array('text' => true, 'list' => true), + 'ol' => array('text' => true, 'list' => true), + 'blockquote' => array('text' => true, 'quote' => true), + 'q' => array('text' => true, 'quote' => true), + 'acronym' => array('acronym' => true, 'text' => true), + 'abbr' => array('acronym' => true, 'text' => true), + 'input' => array('form' => true), + 'select' => array('form' => true), + 'textarea' => array('form' => true), + + ); + + /** + * Retrieves elements by an option. + * @param string $option The option to search fore + * @param bool $value Whether the option should be true or false + * @return array An array of HTML tag names + * @todo this should cache results in a static variable, as many of these can be iterated over again + */ + function getElementsByOption($option, $value = true) { + foreach(self::$html_elements as $k => $element) { + if(isset($element[$option]) && $element[$option] == $value) + $results[] = $k; + } + return $results; + } +} \ No newline at end of file diff --git a/quail/common/resources/.svn/all-wcprops b/quail/common/resources/.svn/all-wcprops new file mode 100644 index 0000000..0de4a7c --- /dev/null +++ b/quail/common/resources/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 51 +/svn/!svn/ver/232/tags/0.4.1/quail/common/resources +END +placeholder.txt +K 25 +svn:wc:ra_dav:version-url +V 67 +/svn/!svn/ver/232/tags/0.4.1/quail/common/resources/placeholder.txt +END +iso639.txt +K 25 +svn:wc:ra_dav:version-url +V 62 +/svn/!svn/ver/232/tags/0.4.1/quail/common/resources/iso639.txt +END +emoticons.txt +K 25 +svn:wc:ra_dav:version-url +V 65 +/svn/!svn/ver/232/tags/0.4.1/quail/common/resources/emoticons.txt +END diff --git a/quail/common/resources/.svn/entries b/quail/common/resources/.svn/entries new file mode 100644 index 0000000..c28c8b0 --- /dev/null +++ b/quail/common/resources/.svn/entries @@ -0,0 +1,130 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/quail/common/resources +https://keveemiller@quail-lib.googlecode.com/svn + + + +2009-04-20T18:04:31.060453Z +9 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +placeholder.txt +file + + + + +2010-12-08T21:44:08.000000Z +69c1a091e9a221c99862c8aaaee770c3 +2009-04-17T23:37:18.955251Z +2 +keveemiller + + + + + + + + + + + + + + + + + + + + + +82 + +iso639.txt +file + + + + +2010-12-08T21:44:08.000000Z +79fd16f7ab8ae9b0e0db9c7f8d43fc22 +2009-04-17T23:37:18.955251Z +2 +keveemiller + + + + + + + + + + + + + + + + + + + + + +600 + +emoticons.txt +file + + + + +2010-12-08T21:44:08.000000Z +04a0a28b4910a0d558eaa7790859ef9a +2009-04-20T18:04:31.060453Z +9 +keveemiller + + + + + + + + + + + + + + + + + + + + + +595 + diff --git a/quail/common/resources/.svn/text-base/emoticons.txt.svn-base b/quail/common/resources/.svn/text-base/emoticons.txt.svn-base new file mode 100644 index 0000000..f65e3cb --- /dev/null +++ b/quail/common/resources/.svn/text-base/emoticons.txt.svn-base @@ -0,0 +1,152 @@ +:) +:-) +:^) +=) +B) +8) +c8 +cB +=] +:] +x] +:-) +:) +:o) +=] +:-D +:D +=D +:-( +:( +=( +D: +D= +38* +]:8) +:(] +:@ +=@ +8) +;-) +;) +*) +X( +(|) +(_|_) +(_:_) +:( +8c +Bc +B( +|8c +|8C +:[ +=[ +=( +=C +:P +:p +:Þ +:b +|D +:O +=O +:/ +:-/ +:-\ +:\ +8/ +8\ +>/ +>\ +=/ +:| +:l +=| +xP +XP +xD +XD +:-D +=D +:S +:s +^o) +=S +:3 +>:3 +>=3or=3 +:E +=E +:F +=F +:X +:# +:-{) +:-* +>:O +XO +:-(o) +:@ +>:@ +>=O +D=< +>:( +>[ +D< +>:) +}:) +0:) +O=) +O=] +<3 +x3♥ +-- +XD +XP +X3 +%-) +%-( +8-) +8-0 +80 +X-( +X( +X[ +:-& +=& +;^) +:-} +=} +:-\ +:-/ +=/ +=\ +o____0 +<:} +>:L +>=L +:9 +=9 +>:D +>=D +:0->-<|: +o->-<}: +})i({ +(=C +V.v.V +_/\___\o/__ +_/\_*\o/*__ +@=:-) +<:D-|< +^_^ +=^_^= +\m/(>_<)\m/ \ No newline at end of file diff --git a/quail/common/resources/.svn/text-base/iso639.txt.svn-base b/quail/common/resources/.svn/text-base/iso639.txt.svn-base new file mode 100644 index 0000000..d024ed6 --- /dev/null +++ b/quail/common/resources/.svn/text-base/iso639.txt.svn-base @@ -0,0 +1,200 @@ +bh +bi +nb +bs +br +bg +my +es +ca +km +ch +ce +ny +ny +zh +za +cu +cu +cv +kw +co +cr +hr +cs +da +dv +dv +nl +dz +en +eo +et +ee +fo +fj +fi +nl +fr +ff +gd +gl +lg +ka +de +ki +el +kl +gn +gu +ht +ht +ha +he +hz +hi +ho +hu +is +io +ig +id +ia +ie +iu +ik +ga +it +ja +jv +kl +kn +kr +ks +kk +ki +rw +ky +kv +kg +ko +kj +ku +kj +ky +lo +la +lv +lb +li +li +li +ln +lt +lu +lb +mk +mg +ms +ml +dv +mt +gv +mi +mr +mh +ro +ro +mn +na +nv +nv +nd +nr +ng +ne +nd +se +no +nb +nn +ii +ny +nn +ie +oc +oj +cu +cu +cu +or +om +os +os +pi +pa +ps +fa +pl +pt +pa +ps +qu +ro +rm +rn +ru +sm +sg +sa +sc +gd +sr +sn +ii +sd +si +si +sk +sl +so +st +nr +es +su +sw +ss +sv +tl +ty +tg +ta +tt +te +th +bo +ti +to +ts +tn +tr +tk +tw +ug +uk +ur +ug +uz +ca +ve +vi +vo +wa +cy +fy +wo +xh +yi +yo +za +zu diff --git a/quail/common/resources/.svn/text-base/placeholder.txt.svn-base b/quail/common/resources/.svn/text-base/placeholder.txt.svn-base new file mode 100644 index 0000000..263517f --- /dev/null +++ b/quail/common/resources/.svn/text-base/placeholder.txt.svn-base @@ -0,0 +1,9 @@ +title +untitled +untitled document +this is the title +the title +  + +new page +new \ No newline at end of file diff --git a/quail/common/resources/emoticons.txt b/quail/common/resources/emoticons.txt new file mode 100644 index 0000000..f65e3cb --- /dev/null +++ b/quail/common/resources/emoticons.txt @@ -0,0 +1,152 @@ +:) +:-) +:^) +=) +B) +8) +c8 +cB +=] +:] +x] +:-) +:) +:o) +=] +:-D +:D +=D +:-( +:( +=( +D: +D= +38* +]:8) +:(] +:@ +=@ +8) +;-) +;) +*) +X( +(|) +(_|_) +(_:_) +:( +8c +Bc +B( +|8c +|8C +:[ +=[ +=( +=C +:P +:p +:Þ +:b +|D +:O +=O +:/ +:-/ +:-\ +:\ +8/ +8\ +>/ +>\ +=/ +:| +:l +=| +xP +XP +xD +XD +:-D +=D +:S +:s +^o) +=S +:3 +>:3 +>=3or=3 +:E +=E +:F +=F +:X +:# +:-{) +:-* +>:O +XO +:-(o) +:@ +>:@ +>=O +D=< +>:( +>[ +D< +>:) +}:) +0:) +O=) +O=] +<3 +x3♥ +-- +XD +XP +X3 +%-) +%-( +8-) +8-0 +80 +X-( +X( +X[ +:-& +=& +;^) +:-} +=} +:-\ +:-/ +=/ +=\ +o____0 +<:} +>:L +>=L +:9 +=9 +>:D +>=D +:0->-<|: +o->-<}: +})i({ +(=C +V.v.V +_/\___\o/__ +_/\_*\o/*__ +@=:-) +<:D-|< +^_^ +=^_^= +\m/(>_<)\m/ \ No newline at end of file diff --git a/quail/common/resources/iso639.txt b/quail/common/resources/iso639.txt new file mode 100644 index 0000000..d024ed6 --- /dev/null +++ b/quail/common/resources/iso639.txt @@ -0,0 +1,200 @@ +bh +bi +nb +bs +br +bg +my +es +ca +km +ch +ce +ny +ny +zh +za +cu +cu +cv +kw +co +cr +hr +cs +da +dv +dv +nl +dz +en +eo +et +ee +fo +fj +fi +nl +fr +ff +gd +gl +lg +ka +de +ki +el +kl +gn +gu +ht +ht +ha +he +hz +hi +ho +hu +is +io +ig +id +ia +ie +iu +ik +ga +it +ja +jv +kl +kn +kr +ks +kk +ki +rw +ky +kv +kg +ko +kj +ku +kj +ky +lo +la +lv +lb +li +li +li +ln +lt +lu +lb +mk +mg +ms +ml +dv +mt +gv +mi +mr +mh +ro +ro +mn +na +nv +nv +nd +nr +ng +ne +nd +se +no +nb +nn +ii +ny +nn +ie +oc +oj +cu +cu +cu +or +om +os +os +pi +pa +ps +fa +pl +pt +pa +ps +qu +ro +rm +rn +ru +sm +sg +sa +sc +gd +sr +sn +ii +sd +si +si +sk +sl +so +st +nr +es +su +sw +ss +sv +tl +ty +tg +ta +tt +te +th +bo +ti +to +ts +tn +tr +tk +tw +ug +uk +ur +ug +uz +ca +ve +vi +vo +wa +cy +fy +wo +xh +yi +yo +za +zu diff --git a/quail/common/resources/placeholder.txt b/quail/common/resources/placeholder.txt new file mode 100644 index 0000000..263517f --- /dev/null +++ b/quail/common/resources/placeholder.txt @@ -0,0 +1,9 @@ +title +untitled +untitled document +this is the title +the title +  + +new page +new \ No newline at end of file diff --git a/quail/common/services/.svn/all-wcprops b/quail/common/services/.svn/all-wcprops new file mode 100644 index 0000000..cd33e22 --- /dev/null +++ b/quail/common/services/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 50 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services +END diff --git a/quail/common/services/.svn/entries b/quail/common/services/.svn/entries new file mode 100644 index 0000000..47d89b8 --- /dev/null +++ b/quail/common/services/.svn/entries @@ -0,0 +1,34 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/quail/common/services +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-06-02T02:36:27.623564Z +186 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +media +dir + +readability +dir + diff --git a/quail/common/services/media/.svn/all-wcprops b/quail/common/services/media/.svn/all-wcprops new file mode 100644 index 0000000..d2b6d18 --- /dev/null +++ b/quail/common/services/media/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 56 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services/media +END +youtube.php +K 25 +svn:wc:ra_dav:version-url +V 68 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services/media/youtube.php +END +mediaService.php +K 25 +svn:wc:ra_dav:version-url +V 73 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services/media/mediaService.php +END diff --git a/quail/common/services/media/.svn/entries b/quail/common/services/media/.svn/entries new file mode 100644 index 0000000..e4bbfd4 --- /dev/null +++ b/quail/common/services/media/.svn/entries @@ -0,0 +1,96 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/quail/common/services/media +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-05-28T00:44:38.243232Z +182 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +youtube.php +file + + + + +2010-12-08T21:44:03.000000Z +bb2a2f74ef87008c15ff2badeb6ef11a +2010-05-28T00:44:38.243232Z +182 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1573 + +mediaService.php +file + + + + +2010-12-08T21:44:03.000000Z +faa325cfe1f45cfbd4b7dbfc7ffc087e +2010-05-28T00:44:38.243232Z +182 +keveemiller + + + + + + + + + + + + + + + + + + + + + +212 + diff --git a/quail/common/services/media/.svn/text-base/mediaService.php.svn-base b/quail/common/services/media/.svn/text-base/mediaService.php.svn-base new file mode 100644 index 0000000..c9f5bf0 --- /dev/null +++ b/quail/common/services/media/.svn/text-base/mediaService.php.svn-base @@ -0,0 +1,13 @@ +isYouTubeVideo($link_url)) { + $result = file_get_contents(sprintf($this->search_url, $code)); + if(!$result) { + return false; + } + if (strpos($result, 'video:'. $code) === false) { + return true; + } + } + return false; + } + + /** + * Checks to see if the provided link URL is a YouTube video. If so, it returns + * the video code, if not, it returns null. + * @param string $link_url The URL to the video or video resource + * @return mixed FALSE if it's not a YouTube video, or a string video ID if it is + */ + private function isYouTubeVideo($link_url) { + $matches = null; + foreach($this->regex as $pattern) { + if(preg_match($pattern, trim($link_url), $matches)) { + return $matches[1]; + } + } + return false; + } +} \ No newline at end of file diff --git a/quail/common/services/media/mediaService.php b/quail/common/services/media/mediaService.php new file mode 100644 index 0000000..c9f5bf0 --- /dev/null +++ b/quail/common/services/media/mediaService.php @@ -0,0 +1,13 @@ +isYouTubeVideo($link_url)) { + $result = file_get_contents(sprintf($this->search_url, $code)); + if(!$result) { + return false; + } + if (strpos($result, 'video:'. $code) === false) { + return true; + } + } + return false; + } + + /** + * Checks to see if the provided link URL is a YouTube video. If so, it returns + * the video code, if not, it returns null. + * @param string $link_url The URL to the video or video resource + * @return mixed FALSE if it's not a YouTube video, or a string video ID if it is + */ + private function isYouTubeVideo($link_url) { + $matches = null; + foreach($this->regex as $pattern) { + if(preg_match($pattern, trim($link_url), $matches)) { + return $matches[1]; + } + } + return false; + } +} \ No newline at end of file diff --git a/quail/common/services/readability/.svn/all-wcprops b/quail/common/services/readability/.svn/all-wcprops new file mode 100644 index 0000000..cda55d6 --- /dev/null +++ b/quail/common/services/readability/.svn/all-wcprops @@ -0,0 +1,11 @@ +K 25 +svn:wc:ra_dav:version-url +V 62 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services/readability +END +readability.php +K 25 +svn:wc:ra_dav:version-url +V 78 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services/readability/readability.php +END diff --git a/quail/common/services/readability/.svn/entries b/quail/common/services/readability/.svn/entries new file mode 100644 index 0000000..3b308d0 --- /dev/null +++ b/quail/common/services/readability/.svn/entries @@ -0,0 +1,65 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/quail/common/services/readability +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-06-02T02:36:27.623564Z +186 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +readability.php +file + + + + +2010-12-08T21:44:07.000000Z +4ee0803666308c7898d668ff61c58b6c +2010-06-02T02:36:27.623564Z +186 +keveemiller + + + + + + + + + + + + + + + + + + + + + +261 + +php-text-statistics +dir + diff --git a/quail/common/services/readability/.svn/text-base/readability.php.svn-base b/quail/common/services/readability/.svn/text-base/readability.php.svn-base new file mode 100644 index 0000000..0cb4185 --- /dev/null +++ b/quail/common/services/readability/.svn/text-base/readability.php.svn-base @@ -0,0 +1,15 @@ +flesch_kincaid_reading_ease($text); + + */ + +class TextStatistics { + + protected $strEncoding = ''; // Used to hold character encoding to be used by object, if set + + /** + * Constructor. + * + * @param string $strEncoding Optional character encoding. + * @return void + */ + public function __construct($strEncoding = '') { + if ($strEncoding <> '') { + // Encoding is given. Use it! + $this->strEncoding = $strEncoding; + } + } + + /** + * Gives the Flesch-Kincaid Reading Ease of text entered rounded to one digit + * @param strText Text to be checked + */ + function flesch_kincaid_reading_ease($strText) { + $strText = $this->clean_text($strText); + return round((206.835 - (1.015 * $this->average_words_per_sentence($strText)) - (84.6 * $this->average_syllables_per_word($strText))), 1); + } + + /** + * Gives the Flesch-Kincaid Grade level of text entered rounded to one digit + * @param strText Text to be checked + */ + function flesch_kincaid_grade_level($strText) { + $strText = $this->clean_text($strText); + return round(((0.39 * $this->average_words_per_sentence($strText)) + (11.8 * $this->average_syllables_per_word($strText)) - 15.59), 1); + } + + /** + * Gives the Gunning-Fog score of text entered rounded to one digit + * @param strText Text to be checked + */ + public function gunning_fog_score($strText) { + $strText = $this->clean_text($strText); + return round((($this->average_words_per_sentence($strText) + $this->percentage_words_with_three_syllables($strText, false)) * 0.4), 1); + } + + /** + * Gives the Coleman-Liau Index of text entered rounded to one digit + * @param strText Text to be checked + */ + public function coleman_liau_index($strText) { + $strText = $this->clean_text($strText); + return round( ( (5.89 * ($this->letter_count($strText) / $this->word_count($strText))) - (0.3 * ($this->sentence_count($strText) / $this->word_count($strText))) - 15.8 ), 1); + } + + /** + * Gives the SMOG Index of text entered rounded to one digit + * @param strText Text to be checked + */ + public function smog_index($strText) { + $strText = $this->clean_text($strText); + return round(1.043 * sqrt(($this->words_with_three_syllables($strText) * (30 / $this->sentence_count($strText))) + 3.1291), 1); + } + + /** + * Gives the Automated Readability Index of text entered rounded to one digit + * @param strText Text to be checked + */ + public function automated_readability_index($strText) { + $strText = $this->clean_text($strText); + return round(((4.71 * ($this->letter_count($strText) / $this->word_count($strText))) + (0.5 * ($this->word_count($strText) / $this->sentence_count($strText))) - 21.43), 1); + } + + /** + * Gives string length. Tries mb_strlen and if that fails uses regular strlen. + * @param strText Text to be measured + */ + public function text_length($strText) { + $intTextLength = 0; + try { + if ($this->strEncoding == '') { + $intTextLength = mb_strlen($strText); + } else { + $intTextLength = mb_strlen($strText, $this->strEncoding); + } + } catch (Exception $e) { + $intTextLength = strlen($strText); + } + return $intTextLength; + } + + /** + * Gives letter count (ignores all non-letters). Tries mb_strlen and if that fails uses regular strlen. + * @param strText Text to be measured + */ + public function letter_count($strText) { + $strText = $this->clean_text($strText); // To clear out newlines etc + $intTextLength = 0; + $strText = preg_replace('/[^A-Za-z]+/', '', $strText); + try { + if ($this->strEncoding == '') { + $intTextLength = mb_strlen($strText); + } else { + $intTextLength = mb_strlen($strText, $this->strEncoding); + } + } catch (Exception $e) { + $intTextLength = strlen($strText); + } + return $intTextLength; + } + + /** + * Trims, removes line breaks, multiple spaces and generally cleans text before processing. + * @param strText Text to be transformed + */ + protected function clean_text($strText) { + // all these tags should be preceeded by a full stop. + $fullStopTags = array('li', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'dd'); + foreach ($fullStopTags as $tag) { + $strText = str_ireplace('', '.', $strText); + } + $strText = strip_tags($strText); + $strText = preg_replace('/[,:;()-]/', ' ', $strText); // Replace commans, hyphens etc (count them as spaces) + $strText = preg_replace('/[\.!?]/', '.', $strText); // Unify terminators + $strText = trim($strText) . '.'; // Add final terminator, just in case it's missing. + $strText = preg_replace('/[ ]*(\n|\r\n|\r)[ ]*/', ' ', $strText); // Replace new lines with spaces + $strText = preg_replace('/([\.])[\. ]+/', '$1', $strText); // Check for duplicated terminators + $strText = trim(preg_replace('/[ ]*([\.])/', '$1 ', $strText)); // Pad sentence terminators + $strText = preg_replace('/[ ]+/', ' ', $strText); // Remove multiple spaces + $strText = preg_replace_callback('/\. [^ ]+/', create_function('$matches', 'return strtolower($matches[0]);'), $strText); // Lower case all words following terminators (for gunning fog score) + return $strText; + } + + /** + * Converts string to lower case. Tries mb_strtolower and if that fails uses regular strtolower. + * @param strText Text to be transformed + */ + protected function lower_case($strText) { + $strLowerCaseText = ''; + try { + if ($this->strEncoding == '') { + $strLowerCaseText = mb_strtolower($strText); + } else { + $strLowerCaseText = mb_strtolower($strText, $this->strEncoding); + } + } catch (Exception $e) { + $strLowerCaseText = strtolower($strText); + } + return $strLowerCaseText; + } + + /** + * Converts string to upper case. Tries mb_strtoupper and if that fails uses regular strtoupper. + * @param strText Text to be transformed + */ + protected function upper_case($strText) { + $strUpperCaseText = ''; + try { + if ($this->strEncoding == '') { + $strUpperCaseText = mb_strtoupper($strText); + } else { + $strUpperCaseText = mb_strtoupper($strText, $this->strEncoding); + } + } catch (Exception $e) { + $strUpperCaseText = strtoupper($strText); + } + return $strUpperCaseText; + } + + /** + * Gets portion of string. Tries mb_substr and if that fails uses regular substr. + * @param strText Text to be cut up + * @param intStart Start character + * @param intLenght Length + */ + protected function substring($strText, $intStart, $intLength) { + $strSubstring = ''; + try { + if ($this->strEncoding == '') { + $strSubstring = mb_substr($strText, $intStart, $intLength); + } else { + $strSubstring = mb_substr($strText, $intStart, $intLength, $this->strEncoding); + } + } catch (Exception $e) { + $strSubstring = substr($strText, $intStart, $intLength); + } + return $strSubstring; + } + + /** + * Returns sentence count for text. + * @param strText Text to be measured + */ + public function sentence_count($strText) { + $strText = $this->clean_text($strText); + // Will be tripped up by "Mr." or "U.K.". Not a major concern at this point. + $intSentences = max(1, $this->text_length(preg_replace('/[^\.!?]/', '', $strText))); + return $intSentences; + } + + /** + * Returns word count for text. + * @param strText Text to be measured + */ + public function word_count($strText) { + $strText = $this->clean_text($strText); + // Will be tripped by by em dashes with spaces either side, among other similar characters + $intWords = 1 + $this->text_length(preg_replace('/[^ ]/', '', $strText)); // Space count + 1 is word count + return $intWords; + } + + /** + * Returns average words per sentence for text. + * @param strText Text to be measured + */ + public function average_words_per_sentence($strText) { + $strText = $this->clean_text($strText); + $intSentenceCount = $this->sentence_count($strText); + $intWordCount = $this->word_count($strText); + return ($intWordCount / $intSentenceCount); + } + + /** + * Returns average syllables per word for text. + * @param strText Text to be measured + */ + public function average_syllables_per_word($strText) { + $strText = $this->clean_text($strText); + $intSyllableCount = 0; + $intWordCount = $this->word_count($strText); + $arrWords = explode(' ', $strText); + for ($i = 0; $i < $intWordCount; $i++) { + $intSyllableCount += $this->syllable_count($arrWords[$i]); + } + return ($intSyllableCount / $intWordCount); + } + + /** + * Returns the number of words with more than three syllables + * @param strText Text to be measured + * @param blnCountProperNouns Boolean - should proper nouns be included in words count + */ + public function words_with_three_syllables($strText, $blnCountProperNouns = true) { + $strText = $this->clean_text($strText); + $intLongWordCount = 0; + $intWordCount = $this->word_count($strText); + $arrWords = explode(' ', $strText); + for ($i = 0; $i < $intWordCount; $i++) { + if ($this->syllable_count($arrWords[$i]) > 2) { + if ($blnCountProperNouns) { + $intLongWordCount++; + } else { + $strFirstLetter = $this->substring($arrWords[$i], 0, 1); + if ($strFirstLetter !== $this->upper_case($strFirstLetter)) { + // First letter is lower case. Count it. + $intLongWordCount++; + } + } + } + } + return ($intLongWordCount); + } + + /** + * Returns the percentage of words with more than three syllables + * @param strText Text to be measured + * @param blnCountProperNouns Boolean - should proper nouns be included in words count + */ + public function percentage_words_with_three_syllables($strText, $blnCountProperNouns = true) { + $strText = $this->clean_text($strText); + $intWordCount = $this->word_count($strText); + $intLongWordCount = $this->words_with_three_syllables($strText, $blnCountProperNouns); + $intPercentage = (($intLongWordCount / $intWordCount) * 100); + return ($intPercentage); + } + + /** + * Returns the number of syllables in the word. + * Based in part on Greg Fast's Perl module Lingua::EN::Syllables + * @param strWord Word to be measured + */ + public function syllable_count($strWord) { + + $intSyllableCount = 0; + $strWord = $this->lower_case($strWord); + + // Specific common exceptions that don't follow the rule set below are handled individually + // Array of problem words (with word as key, syllable count as value) + $arrProblemWords = Array( + 'simile' => 3 + ,'forever' => 3 + ,'shoreline' => 2 + ); + if (isset($arrProblemWords[$strWord])) { + $intSyllableCount = $arrProblemWords[$strWord]; + } + if ($intSyllableCount > 0) { + return $intSyllableCount; + } + + // These syllables would be counted as two but should be one + $arrSubSyllables = Array( + 'cial' + ,'tia' + ,'cius' + ,'cious' + ,'giu' + ,'ion' + ,'iou' + ,'sia$' + ,'[^aeiuoyt]{2,}ed$' + ,'.ely$' + ,'[cg]h?e[rsd]?$' + ,'rved?$' + ,'[aeiouy][dt]es?$' + ,'[aeiouy][^aeiouydt]e[rsd]?$' + ,'^[dr]e[aeiou][^aeiou]+$' // Sorts out deal, deign etc + ,'[aeiouy]rse$' // Purse, hearse + ); + + // These syllables would be counted as one but should be two + $arrAddSyllables = Array( + 'ia' + ,'riet' + ,'dien' + ,'iu' + ,'io' + ,'ii' + ,'[aeiouym]bl$' + ,'[aeiou]{3}' + ,'^mc' + ,'ism$' + ,'([^aeiouy])\1l$' + ,'[^l]lien' + ,'^coa[dglx].' + ,'[^gq]ua[^auieo]' + ,'dnt$' + ,'uity$' + ,'ie(r|st)$' + ); + + // Single syllable prefixes and suffixes + $arrPrefixSuffix = Array( + '/^un/' + ,'/^fore/' + ,'/ly$/' + ,'/less$/' + ,'/ful$/' + ,'/ers?$/' + ,'/ings?$/' + ); + + // Remove prefixes and suffixes and count how many were taken + $strWord = preg_replace($arrPrefixSuffix, '', $strWord, -1, $intPrefixSuffixCount); + + // Removed non-word characters from word + $strWord = preg_replace('/[^a-z]/is', '', $strWord); + $arrWordParts = preg_split('/[^aeiouy]+/', $strWord); + $intWordPartCount = 0; + foreach ($arrWordParts as $strWordPart) { + if ($strWordPart <> '') { + $intWordPartCount++; + } + } + + // Some syllables do not follow normal rules - check for them + // Thanks to Joe Kovar for correcting a bug in the following lines + $intSyllableCount = $intWordPartCount + $intPrefixSuffixCount; + foreach ($arrSubSyllables as $strSyllable) { + $intSyllableCount -= preg_match('~' . $strSyllable . '~', $strWord); + } + foreach ($arrAddSyllables as $strSyllable) { + $intSyllableCount += preg_match('~' . $strSyllable . '~', $strWord); + } + $intSyllableCount = ($intSyllableCount == 0) ? 1 : $intSyllableCount; + return $intSyllableCount; + } + + } + +?> \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/.svn/text-base/TextStatistics.php4.svn-base b/quail/common/services/readability/php-text-statistics/.svn/text-base/TextStatistics.php4.svn-base new file mode 100644 index 0000000..73cf346 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/.svn/text-base/TextStatistics.php4.svn-base @@ -0,0 +1,354 @@ +flesch_kincaid_reading_ease($text); + class TextStatistics { + + var $strEncoding = ''; // Used to hold character encoding to be used by object, if set + + /** + * Constructor. + * + * @param string $strEncoding Optional character encoding. + * @return void + */ + function __construct($strEncoding = '') { + if ($strEncoding <> '') { + // Encoding is given. Use it! + $this->strEncoding = $strEncoding; + } + } + + function TextStatistics() { + $this->__construct(); + } + + /** + * Gives the Flesch-Kincaid Reading Ease of text entered rounded to one digit + * @param strText Text to be checked + */ + function flesch_kincaid_reading_ease($strText) { + $strText = $this->clean_text($strText); + return round((206.835 - (1.015 * $this->average_words_per_sentence($strText)) - (84.6 * $this->average_syllables_per_word($strText))), 1); + } + + /** + * Gives the Flesch-Kincaid Grade level of text entered rounded to one digit + * @param strText Text to be checked + */ + function flesch_kincaid_grade_level($strText) { + $strText = $this->clean_text($strText); + return round(((0.39 * $this->average_words_per_sentence($strText)) + (11.8 * $this->average_syllables_per_word($strText)) - 15.59), 1); + } + + /** + * Gives the Gunning-Fog score of text entered rounded to one digit + * @param strText Text to be checked + */ + function gunning_fog_score($strText) { + $strText = $this->clean_text($strText); + return round((($this->average_words_per_sentence($strText) + $this->percentage_words_with_three_syllables($strText, false)) * 0.4), 1); + } + + /** + * Gives the Coleman-Liau Index of text entered rounded to one digit + * @param strText Text to be checked + */ + function coleman_liau_index($strText) { + $strText = $this->clean_text($strText); + return round( ( (5.89 * ($this->letter_count($strText) / $this->word_count($strText))) - (0.3 * ($this->sentence_count($strText) / $this->word_count($strText))) - 15.8 ), 1); + } + + /** + * Gives the SMOG Index of text entered rounded to one digit + * @param strText Text to be checked + */ + function smog_index($strText) { + $strText = $this->clean_text($strText); + return round(1.043 * sqrt(($this->words_with_three_syllables($strText) * (30 / $this->sentence_count($strText))) + 3.1291), 1); + } + + /** + * Gives the Automated Readability Index of text entered rounded to one digit + * @param strText Text to be checked + */ + function automated_readability_index($strText) { + $strText = $this->clean_text($strText); + return round(((4.71 * ($this->letter_count($strText) / $this->word_count($strText))) + (0.5 * ($this->word_count($strText) / $this->sentence_count($strText))) - 21.43), 1); + } + + /** + * Gives letter count (ignores all non-letters). + * @param strText Text to be measured + */ + function letter_count($strText) { + $strText = $this->clean_text($strText); // To clear out newlines etc + $intTextLength = 0; + $strText = preg_replace('/[^A-Za-z]+/', '', $strText); + $intTextLength = strlen($strText); + return $intTextLength; + } + + /** + * Trims, removes line breaks, multiple spaces and generally cleans text before processing. + * @param strText Text to be transformed + */ + function clean_text($strText) { + $strText = preg_replace('/[,:;()-]/', ' ', $strText); // Replace commans, hyphens etc (count them as spaces) + $strText = preg_replace('/[\.!?]/', '.', $strText); // Unify terminators + $strText = trim($strText) . '.'; // Add final terminator, just in case it's missing. + $strText = preg_replace('/[ ]*(\n|\r\n|\r)[ ]*/', ' ', $strText); // Replace new lines with spaces + $strText = preg_replace('/([\.])[\. ]+/', '$1', $strText); // Check for duplicated terminators + $strText = trim(preg_replace('/[ ]*([\.])/', '$1 ', $strText)); // Pad sentence terminators + $strText = preg_replace('/[ ]+/', ' ', $strText); // Remove multiple spaces + $strText = preg_replace_callback('/\. [^ ]+/', create_function('$matches', 'return strtolower($matches[0]);'), $strText); // Lower case all words following terminators (for gunning fog score) + return $strText; + } + + /** + * Returns sentence count for text. + * @param strText Text to be measured + */ + function sentence_count($strText) { + $strText = $this->clean_text($strText); + // Will be tripped up by "Mr." or "U.K.". Not a major concern at this point. + $intSentences = max(1, strlen(preg_replace('/[^\.!?]/', '', $strText))); + return $intSentences; + } + + /** + * Returns word count for text. + * @param strText Text to be measured + */ + function word_count($strText) { + $strText = $this->clean_text($strText); + // Will be tripped by by em dashes with spaces either side, among other similar characters + $intWords = 1 + strlen(preg_replace('/[^ ]/', '', $strText)); // Space count + 1 is word count + return $intWords; + } + + /** + * Returns average words per sentence for text. + * @param strText Text to be measured + */ + function average_words_per_sentence($strText) { + $strText = $this->clean_text($strText); + $intSentenceCount = $this->sentence_count($strText); + $intWordCount = $this->word_count($strText); + return ($intWordCount / $intSentenceCount); + } + + /** + * Returns average syllables per word for text. + * @param strText Text to be measured + */ + function average_syllables_per_word($strText) { + $strText = $this->clean_text($strText); + $intSyllableCount = 0; + $intWordCount = $this->word_count($strText); + $arrWords = explode(' ', $strText); + for ($i = 0; $i < $intWordCount; $i++) { + $intSyllableCount += $this->syllable_count($arrWords[$i]); + } + return ($intSyllableCount / $intWordCount); + } + + /** + * Returns the number of words with more than three syllables + * @param strText Text to be measured + * @param blnCountProperNouns Boolean - should proper nouns be included in words count + */ + function words_with_three_syllables($strText, $blnCountProperNouns = true) { + $strText = $this->clean_text($strText); + $intLongWordCount = 0; + $intWordCount = $this->word_count($strText); + $arrWords = explode(' ', $strText); + for ($i = 0; $i < $intWordCount; $i++) { + if ($this->syllable_count($arrWords[$i]) > 2) { + if ($blnCountProperNouns) { + $intLongWordCount++; + } else { + $strFirstLetter = substr($arrWords[$i], 0, 1); + if ($strFirstLetter !== strtoupper($strFirstLetter)) { + // First letter is lower case. Count it. + $intLongWordCount++; + } + } + } + } + return ($intLongWordCount); + } + + /** + * Returns the percentage of words with more than three syllables + * @param strText Text to be measured + * @param blnCountProperNouns Boolean - should proper nouns be included in words count + */ + function percentage_words_with_three_syllables($strText, $blnCountProperNouns = true) { + $strText = $this->clean_text($strText); + $intWordCount = $this->word_count($strText); + $intLongWordCount = $this->words_with_three_syllables($strText, $blnCountProperNouns); + $intPercentage = (($intLongWordCount / $intWordCount) * 100); + return ($intPercentage); + } + + /** + * Returns the number of syllables in the word. + * Based in part on Greg Fast's Perl module Lingua::EN::Syllables + * @param strWord Word to be measured + */ + function syllable_count($strWord) { + + $intSyllableCount = 0; + $strWord = strtolower($strWord); + + // Specific common exceptions that don't follow the rule set below are handled individually + // Array of problem words (with word as key, syllable count as value) + $arrProblemWords = Array( + 'simile' => 3 + ,'forever' => 3 + ,'shoreline' => 2 + ); + $intSyllableCount = $arrProblemWords[$strWord]; + if ($intSyllableCount > 0) { + return $intSyllableCount; + } + + // These syllables would be counted as two but should be one + $arrSubSyllables = Array( + 'cial' + ,'tia' + ,'cius' + ,'cious' + ,'giu' + ,'ion' + ,'iou' + ,'sia$' + ,'[^aeiuoyt]{2,}ed$' + ,'.ely$' + ,'[cg]h?e[rsd]?$' + ,'rved?$' + ,'[aeiouy][dt]es?$' + ,'[aeiouy][^aeiouydt]e[rsd]?$' + ,'^[dr]e[aeiou][^aeiou]+$' // Sorts out deal, deign etc + ,'[aeiouy]rse$' // Purse, hearse + ); + + // These syllables would be counted as one but should be two + $arrAddSyllables = Array( + 'ia' + ,'riet' + ,'dien' + ,'iu' + ,'io' + ,'ii' + ,'[aeiouym]bl$' + ,'[aeiou]{3}' + ,'^mc' + ,'ism$' + ,'([^aeiouy])\1l$' + ,'[^l]lien' + ,'^coa[dglx].' + ,'[^gq]ua[^auieo]' + ,'dnt$' + ,'uity$' + ,'ie(r|st)$' + ); + + // Single syllable prefixes and suffixes + $arrPrefixSuffix = Array( + '/^un/' + ,'/^fore/' + ,'/ly$/' + ,'/less$/' + ,'/ful$/' + ,'/ers?$/' + ,'/ings?$/' + ); + + // Remove prefixes and suffixes and count how many were taken + $intPrefixSuffixCount = 0; + foreach ($arrPrefixSuffix as $strPrefixSuffix) { + $intPrefixSuffixCount += preg_match_all($strPrefixSuffix, $strWord, $matches); + } + $strWord = preg_replace($arrPrefixSuffix, '', $strWord); + + // Removed non-word characters from word + $strWord = preg_replace('/[^a-z]/is', '', $strWord); + $arrWordParts = preg_split('/[^aeiouy]+/', $strWord); + $intWordPartCount = 0; + foreach ($arrWordParts as $strWordPart) { + if ($strWordPart <> '') { + $intWordPartCount++; + } + } + + // Some syllables do not follow normal rules - check for them + // Thanks to Joe Kovar for correcting a bug in the following lines + $intSyllableCount = $intWordPartCount + $intPrefixSuffixCount; + foreach ($arrSubSyllables as $strSyllable) { + $intSyllableCount -= preg_match('~' . $strSyllable . '~', $strWord); + } + foreach ($arrAddSyllables as $strSyllable) { + $intSyllableCount += preg_match('~' . $strSyllable . '~', $strWord); + } + $intSyllableCount = ($intSyllableCount == 0) ? 1 : $intSyllableCount; + return $intSyllableCount; + } + + } + +?> \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/README.txt b/quail/common/services/readability/php-text-statistics/README.txt new file mode 100644 index 0000000..b47cb80 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/README.txt @@ -0,0 +1,3 @@ +This is a class is included as part of QUAIL, but is not maintained by the QUAIL team. You can read more about this class at: + +http://code.google.com/p/php-text-statistics/ \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/TextStatistics.php b/quail/common/services/readability/php-text-statistics/TextStatistics.php new file mode 100644 index 0000000..e187399 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/TextStatistics.php @@ -0,0 +1,413 @@ +flesch_kincaid_reading_ease($text); + + */ + +class TextStatistics { + + protected $strEncoding = ''; // Used to hold character encoding to be used by object, if set + + /** + * Constructor. + * + * @param string $strEncoding Optional character encoding. + * @return void + */ + public function __construct($strEncoding = '') { + if ($strEncoding <> '') { + // Encoding is given. Use it! + $this->strEncoding = $strEncoding; + } + } + + /** + * Gives the Flesch-Kincaid Reading Ease of text entered rounded to one digit + * @param strText Text to be checked + */ + function flesch_kincaid_reading_ease($strText) { + $strText = $this->clean_text($strText); + return round((206.835 - (1.015 * $this->average_words_per_sentence($strText)) - (84.6 * $this->average_syllables_per_word($strText))), 1); + } + + /** + * Gives the Flesch-Kincaid Grade level of text entered rounded to one digit + * @param strText Text to be checked + */ + function flesch_kincaid_grade_level($strText) { + $strText = $this->clean_text($strText); + return round(((0.39 * $this->average_words_per_sentence($strText)) + (11.8 * $this->average_syllables_per_word($strText)) - 15.59), 1); + } + + /** + * Gives the Gunning-Fog score of text entered rounded to one digit + * @param strText Text to be checked + */ + public function gunning_fog_score($strText) { + $strText = $this->clean_text($strText); + return round((($this->average_words_per_sentence($strText) + $this->percentage_words_with_three_syllables($strText, false)) * 0.4), 1); + } + + /** + * Gives the Coleman-Liau Index of text entered rounded to one digit + * @param strText Text to be checked + */ + public function coleman_liau_index($strText) { + $strText = $this->clean_text($strText); + return round( ( (5.89 * ($this->letter_count($strText) / $this->word_count($strText))) - (0.3 * ($this->sentence_count($strText) / $this->word_count($strText))) - 15.8 ), 1); + } + + /** + * Gives the SMOG Index of text entered rounded to one digit + * @param strText Text to be checked + */ + public function smog_index($strText) { + $strText = $this->clean_text($strText); + return round(1.043 * sqrt(($this->words_with_three_syllables($strText) * (30 / $this->sentence_count($strText))) + 3.1291), 1); + } + + /** + * Gives the Automated Readability Index of text entered rounded to one digit + * @param strText Text to be checked + */ + public function automated_readability_index($strText) { + $strText = $this->clean_text($strText); + return round(((4.71 * ($this->letter_count($strText) / $this->word_count($strText))) + (0.5 * ($this->word_count($strText) / $this->sentence_count($strText))) - 21.43), 1); + } + + /** + * Gives string length. Tries mb_strlen and if that fails uses regular strlen. + * @param strText Text to be measured + */ + public function text_length($strText) { + $intTextLength = 0; + try { + if ($this->strEncoding == '') { + $intTextLength = mb_strlen($strText); + } else { + $intTextLength = mb_strlen($strText, $this->strEncoding); + } + } catch (Exception $e) { + $intTextLength = strlen($strText); + } + return $intTextLength; + } + + /** + * Gives letter count (ignores all non-letters). Tries mb_strlen and if that fails uses regular strlen. + * @param strText Text to be measured + */ + public function letter_count($strText) { + $strText = $this->clean_text($strText); // To clear out newlines etc + $intTextLength = 0; + $strText = preg_replace('/[^A-Za-z]+/', '', $strText); + try { + if ($this->strEncoding == '') { + $intTextLength = mb_strlen($strText); + } else { + $intTextLength = mb_strlen($strText, $this->strEncoding); + } + } catch (Exception $e) { + $intTextLength = strlen($strText); + } + return $intTextLength; + } + + /** + * Trims, removes line breaks, multiple spaces and generally cleans text before processing. + * @param strText Text to be transformed + */ + protected function clean_text($strText) { + // all these tags should be preceeded by a full stop. + $fullStopTags = array('li', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'dd'); + foreach ($fullStopTags as $tag) { + $strText = str_ireplace('', '.', $strText); + } + $strText = strip_tags($strText); + $strText = preg_replace('/[,:;()-]/', ' ', $strText); // Replace commans, hyphens etc (count them as spaces) + $strText = preg_replace('/[\.!?]/', '.', $strText); // Unify terminators + $strText = trim($strText) . '.'; // Add final terminator, just in case it's missing. + $strText = preg_replace('/[ ]*(\n|\r\n|\r)[ ]*/', ' ', $strText); // Replace new lines with spaces + $strText = preg_replace('/([\.])[\. ]+/', '$1', $strText); // Check for duplicated terminators + $strText = trim(preg_replace('/[ ]*([\.])/', '$1 ', $strText)); // Pad sentence terminators + $strText = preg_replace('/[ ]+/', ' ', $strText); // Remove multiple spaces + $strText = preg_replace_callback('/\. [^ ]+/', create_function('$matches', 'return strtolower($matches[0]);'), $strText); // Lower case all words following terminators (for gunning fog score) + return $strText; + } + + /** + * Converts string to lower case. Tries mb_strtolower and if that fails uses regular strtolower. + * @param strText Text to be transformed + */ + protected function lower_case($strText) { + $strLowerCaseText = ''; + try { + if ($this->strEncoding == '') { + $strLowerCaseText = mb_strtolower($strText); + } else { + $strLowerCaseText = mb_strtolower($strText, $this->strEncoding); + } + } catch (Exception $e) { + $strLowerCaseText = strtolower($strText); + } + return $strLowerCaseText; + } + + /** + * Converts string to upper case. Tries mb_strtoupper and if that fails uses regular strtoupper. + * @param strText Text to be transformed + */ + protected function upper_case($strText) { + $strUpperCaseText = ''; + try { + if ($this->strEncoding == '') { + $strUpperCaseText = mb_strtoupper($strText); + } else { + $strUpperCaseText = mb_strtoupper($strText, $this->strEncoding); + } + } catch (Exception $e) { + $strUpperCaseText = strtoupper($strText); + } + return $strUpperCaseText; + } + + /** + * Gets portion of string. Tries mb_substr and if that fails uses regular substr. + * @param strText Text to be cut up + * @param intStart Start character + * @param intLenght Length + */ + protected function substring($strText, $intStart, $intLength) { + $strSubstring = ''; + try { + if ($this->strEncoding == '') { + $strSubstring = mb_substr($strText, $intStart, $intLength); + } else { + $strSubstring = mb_substr($strText, $intStart, $intLength, $this->strEncoding); + } + } catch (Exception $e) { + $strSubstring = substr($strText, $intStart, $intLength); + } + return $strSubstring; + } + + /** + * Returns sentence count for text. + * @param strText Text to be measured + */ + public function sentence_count($strText) { + $strText = $this->clean_text($strText); + // Will be tripped up by "Mr." or "U.K.". Not a major concern at this point. + $intSentences = max(1, $this->text_length(preg_replace('/[^\.!?]/', '', $strText))); + return $intSentences; + } + + /** + * Returns word count for text. + * @param strText Text to be measured + */ + public function word_count($strText) { + $strText = $this->clean_text($strText); + // Will be tripped by by em dashes with spaces either side, among other similar characters + $intWords = 1 + $this->text_length(preg_replace('/[^ ]/', '', $strText)); // Space count + 1 is word count + return $intWords; + } + + /** + * Returns average words per sentence for text. + * @param strText Text to be measured + */ + public function average_words_per_sentence($strText) { + $strText = $this->clean_text($strText); + $intSentenceCount = $this->sentence_count($strText); + $intWordCount = $this->word_count($strText); + return ($intWordCount / $intSentenceCount); + } + + /** + * Returns average syllables per word for text. + * @param strText Text to be measured + */ + public function average_syllables_per_word($strText) { + $strText = $this->clean_text($strText); + $intSyllableCount = 0; + $intWordCount = $this->word_count($strText); + $arrWords = explode(' ', $strText); + for ($i = 0; $i < $intWordCount; $i++) { + $intSyllableCount += $this->syllable_count($arrWords[$i]); + } + return ($intSyllableCount / $intWordCount); + } + + /** + * Returns the number of words with more than three syllables + * @param strText Text to be measured + * @param blnCountProperNouns Boolean - should proper nouns be included in words count + */ + public function words_with_three_syllables($strText, $blnCountProperNouns = true) { + $strText = $this->clean_text($strText); + $intLongWordCount = 0; + $intWordCount = $this->word_count($strText); + $arrWords = explode(' ', $strText); + for ($i = 0; $i < $intWordCount; $i++) { + if ($this->syllable_count($arrWords[$i]) > 2) { + if ($blnCountProperNouns) { + $intLongWordCount++; + } else { + $strFirstLetter = $this->substring($arrWords[$i], 0, 1); + if ($strFirstLetter !== $this->upper_case($strFirstLetter)) { + // First letter is lower case. Count it. + $intLongWordCount++; + } + } + } + } + return ($intLongWordCount); + } + + /** + * Returns the percentage of words with more than three syllables + * @param strText Text to be measured + * @param blnCountProperNouns Boolean - should proper nouns be included in words count + */ + public function percentage_words_with_three_syllables($strText, $blnCountProperNouns = true) { + $strText = $this->clean_text($strText); + $intWordCount = $this->word_count($strText); + $intLongWordCount = $this->words_with_three_syllables($strText, $blnCountProperNouns); + $intPercentage = (($intLongWordCount / $intWordCount) * 100); + return ($intPercentage); + } + + /** + * Returns the number of syllables in the word. + * Based in part on Greg Fast's Perl module Lingua::EN::Syllables + * @param strWord Word to be measured + */ + public function syllable_count($strWord) { + + $intSyllableCount = 0; + $strWord = $this->lower_case($strWord); + + // Specific common exceptions that don't follow the rule set below are handled individually + // Array of problem words (with word as key, syllable count as value) + $arrProblemWords = Array( + 'simile' => 3 + ,'forever' => 3 + ,'shoreline' => 2 + ); + if (isset($arrProblemWords[$strWord])) { + $intSyllableCount = $arrProblemWords[$strWord]; + } + if ($intSyllableCount > 0) { + return $intSyllableCount; + } + + // These syllables would be counted as two but should be one + $arrSubSyllables = Array( + 'cial' + ,'tia' + ,'cius' + ,'cious' + ,'giu' + ,'ion' + ,'iou' + ,'sia$' + ,'[^aeiuoyt]{2,}ed$' + ,'.ely$' + ,'[cg]h?e[rsd]?$' + ,'rved?$' + ,'[aeiouy][dt]es?$' + ,'[aeiouy][^aeiouydt]e[rsd]?$' + ,'^[dr]e[aeiou][^aeiou]+$' // Sorts out deal, deign etc + ,'[aeiouy]rse$' // Purse, hearse + ); + + // These syllables would be counted as one but should be two + $arrAddSyllables = Array( + 'ia' + ,'riet' + ,'dien' + ,'iu' + ,'io' + ,'ii' + ,'[aeiouym]bl$' + ,'[aeiou]{3}' + ,'^mc' + ,'ism$' + ,'([^aeiouy])\1l$' + ,'[^l]lien' + ,'^coa[dglx].' + ,'[^gq]ua[^auieo]' + ,'dnt$' + ,'uity$' + ,'ie(r|st)$' + ); + + // Single syllable prefixes and suffixes + $arrPrefixSuffix = Array( + '/^un/' + ,'/^fore/' + ,'/ly$/' + ,'/less$/' + ,'/ful$/' + ,'/ers?$/' + ,'/ings?$/' + ); + + // Remove prefixes and suffixes and count how many were taken + $strWord = preg_replace($arrPrefixSuffix, '', $strWord, -1, $intPrefixSuffixCount); + + // Removed non-word characters from word + $strWord = preg_replace('/[^a-z]/is', '', $strWord); + $arrWordParts = preg_split('/[^aeiouy]+/', $strWord); + $intWordPartCount = 0; + foreach ($arrWordParts as $strWordPart) { + if ($strWordPart <> '') { + $intWordPartCount++; + } + } + + // Some syllables do not follow normal rules - check for them + // Thanks to Joe Kovar for correcting a bug in the following lines + $intSyllableCount = $intWordPartCount + $intPrefixSuffixCount; + foreach ($arrSubSyllables as $strSyllable) { + $intSyllableCount -= preg_match('~' . $strSyllable . '~', $strWord); + } + foreach ($arrAddSyllables as $strSyllable) { + $intSyllableCount += preg_match('~' . $strSyllable . '~', $strWord); + } + $intSyllableCount = ($intSyllableCount == 0) ? 1 : $intSyllableCount; + return $intSyllableCount; + } + + } + +?> \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/TextStatistics.php4 b/quail/common/services/readability/php-text-statistics/TextStatistics.php4 new file mode 100644 index 0000000..73cf346 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/TextStatistics.php4 @@ -0,0 +1,354 @@ +flesch_kincaid_reading_ease($text); + class TextStatistics { + + var $strEncoding = ''; // Used to hold character encoding to be used by object, if set + + /** + * Constructor. + * + * @param string $strEncoding Optional character encoding. + * @return void + */ + function __construct($strEncoding = '') { + if ($strEncoding <> '') { + // Encoding is given. Use it! + $this->strEncoding = $strEncoding; + } + } + + function TextStatistics() { + $this->__construct(); + } + + /** + * Gives the Flesch-Kincaid Reading Ease of text entered rounded to one digit + * @param strText Text to be checked + */ + function flesch_kincaid_reading_ease($strText) { + $strText = $this->clean_text($strText); + return round((206.835 - (1.015 * $this->average_words_per_sentence($strText)) - (84.6 * $this->average_syllables_per_word($strText))), 1); + } + + /** + * Gives the Flesch-Kincaid Grade level of text entered rounded to one digit + * @param strText Text to be checked + */ + function flesch_kincaid_grade_level($strText) { + $strText = $this->clean_text($strText); + return round(((0.39 * $this->average_words_per_sentence($strText)) + (11.8 * $this->average_syllables_per_word($strText)) - 15.59), 1); + } + + /** + * Gives the Gunning-Fog score of text entered rounded to one digit + * @param strText Text to be checked + */ + function gunning_fog_score($strText) { + $strText = $this->clean_text($strText); + return round((($this->average_words_per_sentence($strText) + $this->percentage_words_with_three_syllables($strText, false)) * 0.4), 1); + } + + /** + * Gives the Coleman-Liau Index of text entered rounded to one digit + * @param strText Text to be checked + */ + function coleman_liau_index($strText) { + $strText = $this->clean_text($strText); + return round( ( (5.89 * ($this->letter_count($strText) / $this->word_count($strText))) - (0.3 * ($this->sentence_count($strText) / $this->word_count($strText))) - 15.8 ), 1); + } + + /** + * Gives the SMOG Index of text entered rounded to one digit + * @param strText Text to be checked + */ + function smog_index($strText) { + $strText = $this->clean_text($strText); + return round(1.043 * sqrt(($this->words_with_three_syllables($strText) * (30 / $this->sentence_count($strText))) + 3.1291), 1); + } + + /** + * Gives the Automated Readability Index of text entered rounded to one digit + * @param strText Text to be checked + */ + function automated_readability_index($strText) { + $strText = $this->clean_text($strText); + return round(((4.71 * ($this->letter_count($strText) / $this->word_count($strText))) + (0.5 * ($this->word_count($strText) / $this->sentence_count($strText))) - 21.43), 1); + } + + /** + * Gives letter count (ignores all non-letters). + * @param strText Text to be measured + */ + function letter_count($strText) { + $strText = $this->clean_text($strText); // To clear out newlines etc + $intTextLength = 0; + $strText = preg_replace('/[^A-Za-z]+/', '', $strText); + $intTextLength = strlen($strText); + return $intTextLength; + } + + /** + * Trims, removes line breaks, multiple spaces and generally cleans text before processing. + * @param strText Text to be transformed + */ + function clean_text($strText) { + $strText = preg_replace('/[,:;()-]/', ' ', $strText); // Replace commans, hyphens etc (count them as spaces) + $strText = preg_replace('/[\.!?]/', '.', $strText); // Unify terminators + $strText = trim($strText) . '.'; // Add final terminator, just in case it's missing. + $strText = preg_replace('/[ ]*(\n|\r\n|\r)[ ]*/', ' ', $strText); // Replace new lines with spaces + $strText = preg_replace('/([\.])[\. ]+/', '$1', $strText); // Check for duplicated terminators + $strText = trim(preg_replace('/[ ]*([\.])/', '$1 ', $strText)); // Pad sentence terminators + $strText = preg_replace('/[ ]+/', ' ', $strText); // Remove multiple spaces + $strText = preg_replace_callback('/\. [^ ]+/', create_function('$matches', 'return strtolower($matches[0]);'), $strText); // Lower case all words following terminators (for gunning fog score) + return $strText; + } + + /** + * Returns sentence count for text. + * @param strText Text to be measured + */ + function sentence_count($strText) { + $strText = $this->clean_text($strText); + // Will be tripped up by "Mr." or "U.K.". Not a major concern at this point. + $intSentences = max(1, strlen(preg_replace('/[^\.!?]/', '', $strText))); + return $intSentences; + } + + /** + * Returns word count for text. + * @param strText Text to be measured + */ + function word_count($strText) { + $strText = $this->clean_text($strText); + // Will be tripped by by em dashes with spaces either side, among other similar characters + $intWords = 1 + strlen(preg_replace('/[^ ]/', '', $strText)); // Space count + 1 is word count + return $intWords; + } + + /** + * Returns average words per sentence for text. + * @param strText Text to be measured + */ + function average_words_per_sentence($strText) { + $strText = $this->clean_text($strText); + $intSentenceCount = $this->sentence_count($strText); + $intWordCount = $this->word_count($strText); + return ($intWordCount / $intSentenceCount); + } + + /** + * Returns average syllables per word for text. + * @param strText Text to be measured + */ + function average_syllables_per_word($strText) { + $strText = $this->clean_text($strText); + $intSyllableCount = 0; + $intWordCount = $this->word_count($strText); + $arrWords = explode(' ', $strText); + for ($i = 0; $i < $intWordCount; $i++) { + $intSyllableCount += $this->syllable_count($arrWords[$i]); + } + return ($intSyllableCount / $intWordCount); + } + + /** + * Returns the number of words with more than three syllables + * @param strText Text to be measured + * @param blnCountProperNouns Boolean - should proper nouns be included in words count + */ + function words_with_three_syllables($strText, $blnCountProperNouns = true) { + $strText = $this->clean_text($strText); + $intLongWordCount = 0; + $intWordCount = $this->word_count($strText); + $arrWords = explode(' ', $strText); + for ($i = 0; $i < $intWordCount; $i++) { + if ($this->syllable_count($arrWords[$i]) > 2) { + if ($blnCountProperNouns) { + $intLongWordCount++; + } else { + $strFirstLetter = substr($arrWords[$i], 0, 1); + if ($strFirstLetter !== strtoupper($strFirstLetter)) { + // First letter is lower case. Count it. + $intLongWordCount++; + } + } + } + } + return ($intLongWordCount); + } + + /** + * Returns the percentage of words with more than three syllables + * @param strText Text to be measured + * @param blnCountProperNouns Boolean - should proper nouns be included in words count + */ + function percentage_words_with_three_syllables($strText, $blnCountProperNouns = true) { + $strText = $this->clean_text($strText); + $intWordCount = $this->word_count($strText); + $intLongWordCount = $this->words_with_three_syllables($strText, $blnCountProperNouns); + $intPercentage = (($intLongWordCount / $intWordCount) * 100); + return ($intPercentage); + } + + /** + * Returns the number of syllables in the word. + * Based in part on Greg Fast's Perl module Lingua::EN::Syllables + * @param strWord Word to be measured + */ + function syllable_count($strWord) { + + $intSyllableCount = 0; + $strWord = strtolower($strWord); + + // Specific common exceptions that don't follow the rule set below are handled individually + // Array of problem words (with word as key, syllable count as value) + $arrProblemWords = Array( + 'simile' => 3 + ,'forever' => 3 + ,'shoreline' => 2 + ); + $intSyllableCount = $arrProblemWords[$strWord]; + if ($intSyllableCount > 0) { + return $intSyllableCount; + } + + // These syllables would be counted as two but should be one + $arrSubSyllables = Array( + 'cial' + ,'tia' + ,'cius' + ,'cious' + ,'giu' + ,'ion' + ,'iou' + ,'sia$' + ,'[^aeiuoyt]{2,}ed$' + ,'.ely$' + ,'[cg]h?e[rsd]?$' + ,'rved?$' + ,'[aeiouy][dt]es?$' + ,'[aeiouy][^aeiouydt]e[rsd]?$' + ,'^[dr]e[aeiou][^aeiou]+$' // Sorts out deal, deign etc + ,'[aeiouy]rse$' // Purse, hearse + ); + + // These syllables would be counted as one but should be two + $arrAddSyllables = Array( + 'ia' + ,'riet' + ,'dien' + ,'iu' + ,'io' + ,'ii' + ,'[aeiouym]bl$' + ,'[aeiou]{3}' + ,'^mc' + ,'ism$' + ,'([^aeiouy])\1l$' + ,'[^l]lien' + ,'^coa[dglx].' + ,'[^gq]ua[^auieo]' + ,'dnt$' + ,'uity$' + ,'ie(r|st)$' + ); + + // Single syllable prefixes and suffixes + $arrPrefixSuffix = Array( + '/^un/' + ,'/^fore/' + ,'/ly$/' + ,'/less$/' + ,'/ful$/' + ,'/ers?$/' + ,'/ings?$/' + ); + + // Remove prefixes and suffixes and count how many were taken + $intPrefixSuffixCount = 0; + foreach ($arrPrefixSuffix as $strPrefixSuffix) { + $intPrefixSuffixCount += preg_match_all($strPrefixSuffix, $strWord, $matches); + } + $strWord = preg_replace($arrPrefixSuffix, '', $strWord); + + // Removed non-word characters from word + $strWord = preg_replace('/[^a-z]/is', '', $strWord); + $arrWordParts = preg_split('/[^aeiouy]+/', $strWord); + $intWordPartCount = 0; + foreach ($arrWordParts as $strWordPart) { + if ($strWordPart <> '') { + $intWordPartCount++; + } + } + + // Some syllables do not follow normal rules - check for them + // Thanks to Joe Kovar for correcting a bug in the following lines + $intSyllableCount = $intWordPartCount + $intPrefixSuffixCount; + foreach ($arrSubSyllables as $strSyllable) { + $intSyllableCount -= preg_match('~' . $strSyllable . '~', $strWord); + } + foreach ($arrAddSyllables as $strSyllable) { + $intSyllableCount += preg_match('~' . $strSyllable . '~', $strWord); + } + $intSyllableCount = ($intSyllableCount == 0) ? 1 : $intSyllableCount; + return $intSyllableCount; + } + + } + +?> \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/resources/.svn/all-wcprops b/quail/common/services/readability/php-text-statistics/resources/.svn/all-wcprops new file mode 100644 index 0000000..2281afd --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/resources/.svn/all-wcprops @@ -0,0 +1,17 @@ +K 25 +svn:wc:ra_dav:version-url +V 92 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services/readability/php-text-statistics/resources +END +SpacheWordList.php +K 25 +svn:wc:ra_dav:version-url +V 111 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services/readability/php-text-statistics/resources/SpacheWordList.php +END +DaleChallWordList.php +K 25 +svn:wc:ra_dav:version-url +V 114 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services/readability/php-text-statistics/resources/DaleChallWordList.php +END diff --git a/quail/common/services/readability/php-text-statistics/resources/.svn/entries b/quail/common/services/readability/php-text-statistics/resources/.svn/entries new file mode 100644 index 0000000..2252583 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/resources/.svn/entries @@ -0,0 +1,96 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/quail/common/services/readability/php-text-statistics/resources +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-06-02T02:36:27.623564Z +186 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +SpacheWordList.php +file + + + + +2010-12-08T21:44:04.000000Z +a828b6e96fe3caf345bdbfd5f096cc72 +2010-06-02T02:36:27.623564Z +186 +keveemiller + + + + + + + + + + + + + + + + + + + + + +18811 + +DaleChallWordList.php +file + + + + +2010-12-08T21:44:04.000000Z +e92583a5367880241a63153f5bc685e9 +2010-06-02T02:36:27.623564Z +186 +keveemiller + + + + + + + + + + + + + + + + + + + + + +54148 + diff --git a/quail/common/services/readability/php-text-statistics/resources/.svn/text-base/DaleChallWordList.php.svn-base b/quail/common/services/readability/php-text-statistics/resources/.svn/text-base/DaleChallWordList.php.svn-base new file mode 100644 index 0000000..c76c228 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/resources/.svn/text-base/DaleChallWordList.php.svn-base @@ -0,0 +1,2954 @@ + \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/resources/.svn/text-base/SpacheWordList.php.svn-base b/quail/common/services/readability/php-text-statistics/resources/.svn/text-base/SpacheWordList.php.svn-base new file mode 100644 index 0000000..936c95a --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/resources/.svn/text-base/SpacheWordList.php.svn-base @@ -0,0 +1,1070 @@ + \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/resources/DaleChallWordList.php b/quail/common/services/readability/php-text-statistics/resources/DaleChallWordList.php new file mode 100644 index 0000000..c76c228 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/resources/DaleChallWordList.php @@ -0,0 +1,2954 @@ + \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/resources/SpacheWordList.php b/quail/common/services/readability/php-text-statistics/resources/SpacheWordList.php new file mode 100644 index 0000000..936c95a --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/resources/SpacheWordList.php @@ -0,0 +1,1070 @@ + \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/tests/.svn/all-wcprops b/quail/common/services/readability/php-text-statistics/tests/.svn/all-wcprops new file mode 100644 index 0000000..4b0335c --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/tests/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 88 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services/readability/php-text-statistics/tests +END +TextStatisticsMelvilleMobyDick.php +K 25 +svn:wc:ra_dav:version-url +V 123 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services/readability/php-text-statistics/tests/TextStatisticsMelvilleMobyDick.php +END +TextStatisticsKiplingIf.php +K 25 +svn:wc:ra_dav:version-url +V 116 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services/readability/php-text-statistics/tests/TextStatisticsKiplingIf.php +END +TextStatisticsTest.php +K 25 +svn:wc:ra_dav:version-url +V 111 +/svn/!svn/ver/232/tags/0.4.1/quail/common/services/readability/php-text-statistics/tests/TextStatisticsTest.php +END diff --git a/quail/common/services/readability/php-text-statistics/tests/.svn/entries b/quail/common/services/readability/php-text-statistics/tests/.svn/entries new file mode 100644 index 0000000..15fb08c --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/tests/.svn/entries @@ -0,0 +1,130 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/quail/common/services/readability/php-text-statistics/tests +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-06-02T02:36:27.623564Z +186 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +TextStatisticsMelvilleMobyDick.php +file + + + + +2010-12-08T21:44:04.000000Z +25b4f36d050e525a563cfd5ccf45497f +2010-06-02T02:36:27.623564Z +186 +keveemiller + + + + + + + + + + + + + + + + + + + + + +24295 + +TextStatisticsKiplingIf.php +file + + + + +2010-12-08T21:44:04.000000Z +e9b2c0d217caf4bd7338240cf4cc99f0 +2010-06-02T02:36:27.623564Z +186 +keveemiller + + + + + + + + + + + + + + + + + + + + + +32682 + +TextStatisticsTest.php +file + + + + +2010-12-08T21:44:04.000000Z +c401fea5be77bfd21b48c7e4d9dcf3cb +2010-06-02T02:36:27.623564Z +186 +keveemiller + + + + + + + + + + + + + + + + + + + + + +23772 + diff --git a/quail/common/services/readability/php-text-statistics/tests/.svn/text-base/TextStatisticsKiplingIf.php.svn-base b/quail/common/services/readability/php-text-statistics/tests/.svn/text-base/TextStatisticsKiplingIf.php.svn-base new file mode 100644 index 0000000..08bbf75 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/tests/.svn/text-base/TextStatisticsKiplingIf.php.svn-base @@ -0,0 +1,459 @@ +TextStatistics = new TextStatistics(); + } + + public function tearDown() { + unset($this->objTextStatistics); + } + + /* Test Syllables + -------------------- */ + + public function testKiplingSyllables() { // The Words from If, in order + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('keep'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('head'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('when'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('all'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('about'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Are'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('losing'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('theirs'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('blaming'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('it'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('on'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('trust'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('yourself'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('when'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('all'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('men'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('doubt'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('But'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('make'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('allowance'), 3); + $this->assertEquals($this->TextStatistics->syllable_count('for'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('their'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('doubting'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('too,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('wait'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('not'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('be'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('tired'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('by'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('waiting,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('Or'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('being'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('lied'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('about,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('don\'t'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('deal'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('in'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('lies,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Or'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('being'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('hated,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('don\'t'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('give'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('way'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('to'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('hating,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('yet'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('don\'t'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('look'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('too'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('good,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('nor'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('talk'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('too'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('wise:'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('dream'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('-and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('not'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('make'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('dreams'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('master,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('think'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('-and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('not'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('make'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('thoughts'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('aim;'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('meet'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('with'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Triumph'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Disaster'), 3); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('treat'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('those'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('two'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('impostors'), 3); + $this->assertEquals($this->TextStatistics->syllable_count('just'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('same;'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('bear'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('to'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('hear'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('truth'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you\'ve'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('spoken'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('Twisted'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('by'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('knaves'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('to'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('make'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('a'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('trap'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('for'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('fools,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Or'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('watch'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('things'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('gave'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('life'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('to,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('broken,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('stoop'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('build'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('\'em'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('up'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('with'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('worn'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('-out'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('tools:'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('make'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('one'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('heap'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('of'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('all'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('winnings'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('risk'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('it'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('all'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('on'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('one'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('turn'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('of'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('pitch'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('-and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('-toss,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('lose,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('start'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('again'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('at'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('beginnings'), 3); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('never'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('breath'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('a'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('word'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('about'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('loss;'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('force'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('heart'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('nerve'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('sinew'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('To'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('serve'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('turn'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('long'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('after'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('they'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('are'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('gone,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('so'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('hold'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('on'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('when'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('there'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('is'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('nothing'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('in'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Except'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Will'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('which'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('says'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('to'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('them:'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('"Hold'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('on!"'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('talk'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('with'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('crowds'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('keep'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('virtue,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('Or'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('walk'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('with'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('kings'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('-nor'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('lose'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('common'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('touch,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('neither'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('foes'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('nor'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('loving'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('friends'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('hurt'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you;'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('all'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('men'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('count'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('with'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('but'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('none'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('too'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('much'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('fill'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('unforgiving'), 4); + $this->assertEquals($this->TextStatistics->syllable_count('minute'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('With'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('sixty'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('seconds\''), 2); + $this->assertEquals($this->TextStatistics->syllable_count('worth'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('of'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('distance'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('run,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Yours'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('is'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Earth'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('everything'), 4); + $this->assertEquals($this->TextStatistics->syllable_count('that\'s'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('in'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('it,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('which'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('is'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('more'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you\'ll'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('be'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('a'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Man,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('my'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('son!'), 1); + } + + /* Test Words + -------------------- */ + + public function testWordCount() { + $this->assertEquals(292, $this->TextStatistics->word_count($this->strText)); + } + + /* Test Sentences + -------------------- */ + + public function testSentenceCount() { + $this->assertEquals(1, $this->TextStatistics->sentence_count($this->strText)); + } + + /* Test Letter Count + -------------------- */ + + public function testTextLengthCheck() { + $this->assertEquals(1125, $this->TextStatistics->letter_count($this->strText)); + } + + /* Test Flesch Kincaid Reading Ease + -------------------- */ + + public function testFleschKincaidReadingEase() { + $this->assertEquals(-187.5, $this->TextStatistics->flesch_kincaid_reading_ease($this->strText)); + } + + /* Test Flesch Kincaid Grade Level + -------------------- */ + + public function testFleschKincaidGradeLevel() { + $this->assertEquals(111.9, $this->TextStatistics->flesch_kincaid_grade_level($this->strText)); + } + + /* Test Gunning Fog Score + -------------------- */ + + public function testGunningFogScore() { + $this->assertEquals(117.5, $this->TextStatistics->gunning_fog_score($this->strText)); + } + + /* Test Coleman Liau Index + -------------------- */ + + public function testColemanLiauIndex() { + $this->assertEquals(6.9, $this->TextStatistics->coleman_liau_index($this->strText)); + } + + /* Test SMOG Index + -------------------- */ + + public function testSMOGIndex() { + $this->assertEquals(14.1, $this->TextStatistics->smog_index($this->strText)); + } + + /* Test Automated Readability Index + -------------------- */ + + public function testAutomatedReadabilityIndex() { + $this->assertEquals(142.7, $this->TextStatistics->automated_readability_index($this->strText)); + } + + } + +?> \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/tests/.svn/text-base/TextStatisticsMelvilleMobyDick.php.svn-base b/quail/common/services/readability/php-text-statistics/tests/.svn/text-base/TextStatisticsMelvilleMobyDick.php.svn-base new file mode 100644 index 0000000..0b76ed2 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/tests/.svn/text-base/TextStatisticsMelvilleMobyDick.php.svn-base @@ -0,0 +1,342 @@ +TextStatistics = new TextStatistics(); + } + + public function tearDown() { + unset($this->objTextStatistics); + } + + /* Test Syllables + -------------------- */ + + public function testKiplingSyllables() { // The Words from If, in order + $this->assertEquals(1, $this->TextStatistics->syllable_count('Call')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('me')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('Ishmael')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('Some')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('years')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('ago')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('never')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('mind')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('how')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('long')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('precisely')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('having')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('little')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('or')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('no')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('money')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('in')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('my')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('purse')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('nothing')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('particular')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('to')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('interest')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('me')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('on')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('shore')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('thought')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('would')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('sail')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('about')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('a')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('little')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('see')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('watery')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('part')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('of')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('world')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('It')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('is')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('a')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('way')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('have')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('of')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('driving')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('off')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('spleen')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('regulating')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('circulation')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('Whenever')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('find')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('myself')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('growing')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('grim')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('about')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('mouth')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('whenever')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('it')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('is')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('a')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('damp')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('drizzly')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('November')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('in')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('my')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('soul')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('whenever')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('find')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('myself')); + $this->assertEquals(6, $this->TextStatistics->syllable_count('involuntarily')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('pausing')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('before')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('coffin')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('warehouses')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('bringing')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('up')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('rear')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('of')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('every')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('funeral')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('meet')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('especially')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('whenever')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('my')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('hypos')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('get')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('such')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('an')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('upper')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('hand')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('of')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('me')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('that')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('it')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('requires')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('a')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('strong')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('moral')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('principle')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('to')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('prevent')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('me')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('from')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('deliberately')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('stepping')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('into')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('street')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('methodically')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('knocking')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('people\'s')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('hats')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('off')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('then')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('account')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('it')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('high')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('time')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('to')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('get')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('to')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('sea')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('as')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('soon')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('as')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('can')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('This')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('is')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('my')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('substitute')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('for')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('pistol')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('ball')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('With')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('a')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('philosophical')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('flourish')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('Cato')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('throws')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('himself')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('upon')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('his')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('sword')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('quietly')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('take')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('to')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('ship')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('There')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('is')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('nothing')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('surprising')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('in')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('this')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('If')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('they')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('but')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('knew')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('it')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('almost')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('all')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('men')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('in')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('their')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('degree')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('some')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('time')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('or')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('other')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('cherish')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('very')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('nearly')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('same')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('feelings')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('towards')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('ocean')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('with')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('me')); + } + + /* Test Word Count + -------------------- */ + + public function testWordCount() { + $this->assertEquals(201, $this->TextStatistics->word_count($this->strText)); + } + + /* Test Long Word Count + -------------------- */ + + public function testLongWordCount() { + $this->assertEquals(23, $this->TextStatistics->words_with_three_syllables($this->strText, true)); // Include proper nouns + $this->assertEquals(22, $this->TextStatistics->words_with_three_syllables($this->strText, false)); // Don't include proper nouns + } + + /* Test Sentences + -------------------- */ + + public function testSentenceCount() { + $this->assertEquals(8, $this->TextStatistics->sentence_count($this->strText)); + } + + /* Test Letter Count + -------------------- */ + + public function testTextLengthCheck() { + $this->assertEquals(884, $this->TextStatistics->letter_count($this->strText)); + } + + /* Test Flesch Kincaid Reading Ease + -------------------- */ + + public function testFleschKincaidReadingEase() { + $this->assertEquals(53.4, $this->TextStatistics->flesch_kincaid_reading_ease($this->strText)); + } + + /* Test Flesch Kincaid Grade Level + -------------------- */ + + public function testFleschKincaidGradeLevel() { + $this->assertEquals(12.1, $this->TextStatistics->flesch_kincaid_grade_level($this->strText)); + } + + /* Test Gunning Fog Score + -------------------- */ + + public function testGunningFogScore() { + $this->assertEquals(14.4, $this->TextStatistics->gunning_fog_score($this->strText)); + } + + /* Test Coleman Liau Index + -------------------- */ + + public function testColemanLiauIndex() { + $this->assertEquals(10.1, $this->TextStatistics->coleman_liau_index($this->strText)); + } + + /* Test SMOG Index + -------------------- */ + + public function testSMOGIndex() { + $this->assertEquals(9.9, $this->TextStatistics->smog_index($this->strText)); + } + + /* Test Automated Readability Index + -------------------- */ + + public function testAutomatedReadabilityIndex() { + $this->assertEquals(11.8, $this->TextStatistics->automated_readability_index($this->strText)); + } + + } + +?> \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/tests/.svn/text-base/TextStatisticsTest.php.svn-base b/quail/common/services/readability/php-text-statistics/tests/.svn/text-base/TextStatisticsTest.php.svn-base new file mode 100644 index 0000000..aac0609 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/tests/.svn/text-base/TextStatisticsTest.php.svn-base @@ -0,0 +1,279 @@ +TextStatistics = new TextStatistics(); + } + + public function tearDown() { + unset($this->objTextStatistics); + } + + /* Test Syllables + -------------------- */ + + public function testSyllableCountBasicWords() { // "Normal" words + $this->assertEquals(1, $this->TextStatistics->syllable_count('a')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('was')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('foobar')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('hello')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('world')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('wonderful')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('simple')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('easy')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('hard')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('quick')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('brown')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('fox')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('jumped')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('over')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('lazy')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('dog')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('camera')); + } + + public function testSyllableCountComplexWords() { // Odd syllables, long words, difficult sounds + $this->assertEquals(12, $this->TextStatistics->syllable_count('antidisestablishmentarianism')); + $this->assertEquals(14, $this->TextStatistics->syllable_count('supercalifragilisticexpialidocious')); + $this->assertEquals(8, $this->TextStatistics->syllable_count('chlorofluorocarbonation')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('forethoughtfulness')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('phosphorescent')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('theoretician')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('promiscuity')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('unbutlering')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('continuity')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('craunched')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('squelched')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('scrounge')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('coughed')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('smile')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('monopoly')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('doughey')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('doughier')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('leguminous')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('thoroughbreds')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('special')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('delicious')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('spatial')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('pacifism')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('coagulant')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('shouldn\'t')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('mcdonald')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('audience')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('finance')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('prevalence')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('impropriety')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('alien')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('dreadnought')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('verandah')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('similar')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('similarly')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('central')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('cyst')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('term')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('order')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('fur')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('sugar')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('paper')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('make')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('gem')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('program')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('hopeless')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('hopelessly')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('careful')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('carefully')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('stuffy')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('thistle')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('teacher')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('unhappy')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('ambiguity')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('validity')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('ambiguous')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('deserve')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('blooper')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('scooped')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('deserve')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('deal')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('death')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('dearth')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('deign')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('reign')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('bedsore')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('anorexia')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('anymore')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('cored')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('sore')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('foremost')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('restore')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('minute')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('manticores')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('asparagus')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('unexplored')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('unexploded')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('CAPITALS')); + } + + // These are fairly common words that are exceptions to given rules and that can not + // easily be programmed for. I've added them here for documentation purposes as much + // as anything else. If you find a way to program rules for any of these, move them + // into the section above. Many compound words will end up here. + public function testSyllableCountProgrammedExceptions() { + $this->assertEquals(3, $this->TextStatistics->syllable_count('simile')); + // Compounds that have caused problems so far + // Problem: far too many compound words to list exhaustively. + $this->assertEquals(2, $this->TextStatistics->syllable_count('shoreline')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('forever')); + } + + public function testAverageSyllablesPerWord() { + $this->assertEquals(1, $this->TextStatistics->average_syllables_per_word('and then there was one')); + $this->assertEquals(2, $this->TextStatistics->average_syllables_per_word('because special ducklings deserve rainbows')); + $this->assertEquals(1.5, $this->TextStatistics->average_syllables_per_word('and then there was one because special ducklings deserve rainbows')); + } + + /* Test Words + -------------------- */ + + public function testWordCount() { + $this->assertEquals(9, $this->TextStatistics->word_count('The quick brown fox jumped over the lazy dog')); + $this->assertEquals(9, $this->TextStatistics->word_count('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(9, $this->TextStatistics->word_count('The quick brown fox jumped over the lazy dog. ')); + $this->assertEquals(9, $this->TextStatistics->word_count(' The quick brown fox jumped over the lazy dog. ')); + $this->assertEquals(9, $this->TextStatistics->word_count(' The quick brown fox jumped over the lazy dog. ')); + $this->assertEquals(2, $this->TextStatistics->word_count('Yes. No.')); + $this->assertEquals(2, $this->TextStatistics->word_count('Yes.No.')); + $this->assertEquals(2, $this->TextStatistics->word_count('Yes.No.')); + $this->assertEquals(2, $this->TextStatistics->word_count('Yes . No.')); + $this->assertEquals(2, $this->TextStatistics->word_count('Yes .No.')); + $this->assertEquals(2, $this->TextStatistics->word_count('Yes - No. ')); + } + + public function testCheckPercentageWordsWithThreeSyllables() { + $this->assertEquals(9, number_format($this->TextStatistics->percentage_words_with_three_syllables('there is just one word with three syllables in this sentence'))); + $this->assertEquals(9, number_format($this->TextStatistics->percentage_words_with_three_syllables('there is just one word with three syllables in this sentence', true))); + $this->assertEquals(0, number_format($this->TextStatistics->percentage_words_with_three_syllables('there are no valid words with three Syllables in this sentence', false))); + $this->assertEquals(5, number_format($this->TextStatistics->percentage_words_with_three_syllables('there is one and only one word with three or more syllables in this long boring sentence of twenty words'))); + $this->assertEquals(10, number_format($this->TextStatistics->percentage_words_with_three_syllables('there are two and only two words with three or more syllables in this long sentence of exactly twenty words'))); + $this->assertEquals(5, number_format($this->TextStatistics->percentage_words_with_three_syllables('there is Actually only one valid word with three or more syllables in this long sentence of Exactly twenty words', false))); + $this->assertEquals(0, number_format($this->TextStatistics->percentage_words_with_three_syllables('no long words in this sentence'))); + $this->assertEquals(0, number_format($this->TextStatistics->percentage_words_with_three_syllables('no long valid words in this sentence because the test ignores proper case words like this Behemoth', false))); + } + + public function testTextLengthCheck() { + $this->assertEquals(1, $this->TextStatistics->letter_count('a')); + $this->assertEquals(0, $this->TextStatistics->letter_count('')); + $this->assertEquals(46, $this->TextStatistics->letter_count('this sentence has 30 characters, not including the digits')); + } + + /* Test Sentences + -------------------- */ + + public function testSentenceCount() { + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence')); + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence.')); + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence!')); + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence?')); + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence..')); + $this->assertEquals(2, $this->TextStatistics->sentence_count('This is a sentence. So is this.')); + $this->assertEquals(2, $this->TextStatistics->sentence_count("This is a sentence. \n\n So is this, but this is multi-line!")); + $this->assertEquals(2, $this->TextStatistics->sentence_count('This is a sentence,. So is this.')); + $this->assertEquals(2, $this->TextStatistics->sentence_count('This is a sentence!? So is this.')); + $this->assertEquals(3, $this->TextStatistics->sentence_count('This is a sentence. So is this. And this one as well.')); + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence - but just one.')); + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence (but just one).')); + } + + public function testAverageWordsPerSentence() { + $this->assertEquals(4, $this->TextStatistics->average_words_per_sentence('This is a sentence')); + $this->assertEquals(4, $this->TextStatistics->average_words_per_sentence('This is a sentence.')); + $this->assertEquals(4, $this->TextStatistics->average_words_per_sentence('This is a sentence. ')); + $this->assertEquals(4, $this->TextStatistics->average_words_per_sentence('This is a sentence. This is a sentence')); + $this->assertEquals(4, $this->TextStatistics->average_words_per_sentence('This is a sentence. This is a sentence.')); + $this->assertEquals(4, $this->TextStatistics->average_words_per_sentence('This, is - a sentence . This is a sentence. ')); + $this->assertEquals(5.5, $this->TextStatistics->average_words_per_sentence('This is a sentence with extra text. This is a sentence. ')); + $this->assertEquals(6, $this->TextStatistics->average_words_per_sentence('This is a sentence with some extra text. This is a sentence. ')); + } + + /* Test Scores + -------------------- */ + + // Please note that scores for all of these sentences and scoring systems have all been calculated by hand and should therefore be accurate. + // All values have been rounded to a single decimal point. PHP can be temperamental when it comes to floats. + + public function testFleschKincaidReadingEase() { + $this->assertEquals(121.2, $this->TextStatistics->flesch_kincaid_reading_ease('This. Is. A. Nice. Set. Of. Small. Words. Of. One. Part. Each.')); // Best score possible + $this->assertEquals(94.3, $this->TextStatistics->flesch_kincaid_reading_ease('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(94.3, $this->TextStatistics->flesch_kincaid_reading_ease('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(94.3, $this->TextStatistics->flesch_kincaid_reading_ease('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog')); + $this->assertEquals(94.3, $this->TextStatistics->flesch_kincaid_reading_ease("The quick brown fox jumped over the lazy dog. \n\n The quick brown fox jumped over the lazy dog.")); + $this->assertEquals(50.5, $this->TextStatistics->flesch_kincaid_reading_ease('Now it is time for a more complicated sentence, including several longer words.')); + } + + public function testFleschKincaidGradeLevel() { + $this->assertEquals(-3.4, $this->TextStatistics->flesch_kincaid_grade_level('This. Is. A. Nice. Set. Of. Small. Words. Of. One. Part. Each.')); // Best score possible + $this->assertEquals(2.3, $this->TextStatistics->flesch_kincaid_grade_level('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(2.3, $this->TextStatistics->flesch_kincaid_grade_level('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(2.3, $this->TextStatistics->flesch_kincaid_grade_level('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog')); + $this->assertEquals(2.3, $this->TextStatistics->flesch_kincaid_grade_level("The quick brown fox jumped over the lazy dog. \n\n The quick brown fox jumped over the lazy dog.")); + $this->assertEquals(9.4, $this->TextStatistics->flesch_kincaid_grade_level('Now it is time for a more complicated sentence, including several longer words.')); + } + + public function testGunningFogScore() { + $this->assertEquals(0.4, $this->TextStatistics->gunning_fog_score('This. Is. A. Nice. Set. Of. Small. Words. Of. One. Part. Each.')); // Best possible score + $this->assertEquals(3.6, $this->TextStatistics->gunning_fog_score('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(3.6, $this->TextStatistics->gunning_fog_score('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(3.6, $this->TextStatistics->gunning_fog_score("The quick brown fox jumped over the lazy dog. \n\n The quick brown fox jumped over the lazy dog.")); + $this->assertEquals(3.6, $this->TextStatistics->gunning_fog_score('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog')); + $this->assertEquals(14.4, $this->TextStatistics->gunning_fog_score('Now it is time for a more complicated sentence, including several longer words.')); + $this->assertEquals(8.3, $this->TextStatistics->gunning_fog_score('Now it is time for a more Complicated sentence, including Several longer words.')); // Two proper nouns, ignored + } + + public function testColemanLiauIndex() { + $this->assertEquals(3.0, $this->TextStatistics->coleman_liau_index('This. Is. A. Nice. Set. Of. Small. Words. Of. One. Part. Each.')); // Best possible score would be if all words were 1 character + $this->assertEquals(7.7, $this->TextStatistics->coleman_liau_index('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(7.7, $this->TextStatistics->coleman_liau_index('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(7.7, $this->TextStatistics->coleman_liau_index("The quick brown fox jumped over the lazy dog. \n\n The quick brown fox jumped over the lazy dog.")); + $this->assertEquals(7.7, $this->TextStatistics->coleman_liau_index('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog')); + $this->assertEquals(13.6, $this->TextStatistics->coleman_liau_index('Now it is time for a more complicated sentence, including several longer words.')); + } + + public function testSMOGIndex() { + $this->assertEquals(1.8, $this->TextStatistics->smog_index('This. Is. A. Nice. Set. Of. Small. Words. Of. One. Part. Each.')); // Should be 1.8 for any text with no words of 3+ syllables + $this->assertEquals(1.8, $this->TextStatistics->smog_index('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(1.8, $this->TextStatistics->smog_index('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(1.8, $this->TextStatistics->smog_index("The quick brown fox jumped over the lazy dog. \n\n The quick brown fox jumped over the lazy dog.")); + $this->assertEquals(1.8, $this->TextStatistics->smog_index('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog')); + $this->assertEquals(10.1, $this->TextStatistics->smog_index('Now it is time for a more complicated sentence, including several longer words.')); + } + + public function testAutomatedReadabilityIndex() { + $this->assertEquals(-5.6, $this->TextStatistics->automated_readability_index('This. Is. A. Nice. Set. Of. Small. Words. Of. One. Part. Each.')); + $this->assertEquals(1.9, $this->TextStatistics->automated_readability_index('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(1.9, $this->TextStatistics->automated_readability_index('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(1.9, $this->TextStatistics->automated_readability_index("The quick brown fox jumped over the lazy dog. \n\n The quick brown fox jumped over the lazy dog.")); + $this->assertEquals(1.9, $this->TextStatistics->automated_readability_index('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog')); + $this->assertEquals(8.6, $this->TextStatistics->automated_readability_index('Now it is time for a more complicated sentence, including several longer words.')); + } + + } + +?> \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/tests/TextStatisticsKiplingIf.php b/quail/common/services/readability/php-text-statistics/tests/TextStatisticsKiplingIf.php new file mode 100644 index 0000000..08bbf75 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/tests/TextStatisticsKiplingIf.php @@ -0,0 +1,459 @@ +TextStatistics = new TextStatistics(); + } + + public function tearDown() { + unset($this->objTextStatistics); + } + + /* Test Syllables + -------------------- */ + + public function testKiplingSyllables() { // The Words from If, in order + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('keep'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('head'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('when'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('all'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('about'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Are'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('losing'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('theirs'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('blaming'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('it'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('on'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('trust'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('yourself'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('when'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('all'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('men'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('doubt'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('But'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('make'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('allowance'), 3); + $this->assertEquals($this->TextStatistics->syllable_count('for'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('their'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('doubting'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('too,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('wait'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('not'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('be'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('tired'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('by'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('waiting,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('Or'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('being'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('lied'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('about,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('don\'t'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('deal'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('in'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('lies,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Or'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('being'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('hated,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('don\'t'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('give'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('way'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('to'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('hating,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('yet'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('don\'t'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('look'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('too'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('good,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('nor'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('talk'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('too'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('wise:'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('dream'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('-and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('not'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('make'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('dreams'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('master,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('think'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('-and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('not'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('make'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('thoughts'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('aim;'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('meet'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('with'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Triumph'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Disaster'), 3); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('treat'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('those'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('two'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('impostors'), 3); + $this->assertEquals($this->TextStatistics->syllable_count('just'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('same;'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('bear'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('to'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('hear'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('truth'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you\'ve'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('spoken'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('Twisted'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('by'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('knaves'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('to'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('make'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('a'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('trap'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('for'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('fools,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Or'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('watch'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('things'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('gave'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('life'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('to,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('broken,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('stoop'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('build'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('\'em'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('up'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('with'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('worn'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('-out'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('tools:'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('make'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('one'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('heap'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('of'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('all'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('winnings'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('risk'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('it'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('all'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('on'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('one'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('turn'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('of'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('pitch'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('-and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('-toss,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('lose,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('start'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('again'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('at'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('beginnings'), 3); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('never'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('breath'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('a'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('word'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('about'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('loss;'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('force'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('heart'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('nerve'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('sinew'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('To'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('serve'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('turn'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('long'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('after'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('they'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('are'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('gone,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('so'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('hold'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('on'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('when'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('there'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('is'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('nothing'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('in'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Except'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Will'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('which'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('says'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('to'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('them:'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('"Hold'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('on!"'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('talk'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('with'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('crowds'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('keep'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('your'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('virtue,'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('Or'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('walk'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('with'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('kings'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('-nor'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('lose'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('common'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('touch,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('neither'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('foes'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('nor'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('loving'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('friends'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('hurt'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you;'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('all'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('men'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('count'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('with'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('but'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('none'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('too'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('much'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('If'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('can'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('fill'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('unforgiving'), 4); + $this->assertEquals($this->TextStatistics->syllable_count('minute'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('With'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('sixty'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('seconds\''), 2); + $this->assertEquals($this->TextStatistics->syllable_count('worth'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('of'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('distance'), 2); + $this->assertEquals($this->TextStatistics->syllable_count('run,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Yours'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('is'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('the'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Earth'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('and'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('everything'), 4); + $this->assertEquals($this->TextStatistics->syllable_count('that\'s'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('in'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('it,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('And'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('which'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('is'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('more'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('you\'ll'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('be'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('a'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('Man,'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('my'), 1); + $this->assertEquals($this->TextStatistics->syllable_count('son!'), 1); + } + + /* Test Words + -------------------- */ + + public function testWordCount() { + $this->assertEquals(292, $this->TextStatistics->word_count($this->strText)); + } + + /* Test Sentences + -------------------- */ + + public function testSentenceCount() { + $this->assertEquals(1, $this->TextStatistics->sentence_count($this->strText)); + } + + /* Test Letter Count + -------------------- */ + + public function testTextLengthCheck() { + $this->assertEquals(1125, $this->TextStatistics->letter_count($this->strText)); + } + + /* Test Flesch Kincaid Reading Ease + -------------------- */ + + public function testFleschKincaidReadingEase() { + $this->assertEquals(-187.5, $this->TextStatistics->flesch_kincaid_reading_ease($this->strText)); + } + + /* Test Flesch Kincaid Grade Level + -------------------- */ + + public function testFleschKincaidGradeLevel() { + $this->assertEquals(111.9, $this->TextStatistics->flesch_kincaid_grade_level($this->strText)); + } + + /* Test Gunning Fog Score + -------------------- */ + + public function testGunningFogScore() { + $this->assertEquals(117.5, $this->TextStatistics->gunning_fog_score($this->strText)); + } + + /* Test Coleman Liau Index + -------------------- */ + + public function testColemanLiauIndex() { + $this->assertEquals(6.9, $this->TextStatistics->coleman_liau_index($this->strText)); + } + + /* Test SMOG Index + -------------------- */ + + public function testSMOGIndex() { + $this->assertEquals(14.1, $this->TextStatistics->smog_index($this->strText)); + } + + /* Test Automated Readability Index + -------------------- */ + + public function testAutomatedReadabilityIndex() { + $this->assertEquals(142.7, $this->TextStatistics->automated_readability_index($this->strText)); + } + + } + +?> \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/tests/TextStatisticsMelvilleMobyDick.php b/quail/common/services/readability/php-text-statistics/tests/TextStatisticsMelvilleMobyDick.php new file mode 100644 index 0000000..0b76ed2 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/tests/TextStatisticsMelvilleMobyDick.php @@ -0,0 +1,342 @@ +TextStatistics = new TextStatistics(); + } + + public function tearDown() { + unset($this->objTextStatistics); + } + + /* Test Syllables + -------------------- */ + + public function testKiplingSyllables() { // The Words from If, in order + $this->assertEquals(1, $this->TextStatistics->syllable_count('Call')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('me')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('Ishmael')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('Some')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('years')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('ago')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('never')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('mind')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('how')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('long')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('precisely')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('having')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('little')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('or')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('no')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('money')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('in')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('my')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('purse')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('nothing')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('particular')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('to')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('interest')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('me')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('on')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('shore')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('thought')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('would')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('sail')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('about')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('a')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('little')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('see')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('watery')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('part')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('of')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('world')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('It')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('is')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('a')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('way')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('have')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('of')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('driving')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('off')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('spleen')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('regulating')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('circulation')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('Whenever')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('find')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('myself')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('growing')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('grim')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('about')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('mouth')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('whenever')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('it')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('is')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('a')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('damp')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('drizzly')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('November')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('in')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('my')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('soul')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('whenever')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('find')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('myself')); + $this->assertEquals(6, $this->TextStatistics->syllable_count('involuntarily')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('pausing')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('before')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('coffin')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('warehouses')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('bringing')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('up')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('rear')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('of')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('every')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('funeral')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('meet')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('especially')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('whenever')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('my')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('hypos')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('get')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('such')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('an')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('upper')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('hand')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('of')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('me')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('that')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('it')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('requires')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('a')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('strong')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('moral')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('principle')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('to')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('prevent')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('me')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('from')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('deliberately')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('stepping')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('into')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('street')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('methodically')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('knocking')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('people\'s')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('hats')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('off')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('then')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('account')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('it')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('high')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('time')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('to')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('get')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('to')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('sea')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('as')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('soon')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('as')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('can')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('This')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('is')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('my')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('substitute')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('for')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('pistol')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('ball')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('With')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('a')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('philosophical')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('flourish')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('Cato')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('throws')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('himself')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('upon')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('his')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('sword')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('I')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('quietly')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('take')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('to')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('ship')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('There')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('is')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('nothing')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('surprising')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('in')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('this')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('If')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('they')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('but')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('knew')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('it')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('almost')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('all')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('men')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('in')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('their')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('degree')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('some')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('time')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('or')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('other')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('cherish')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('very')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('nearly')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('same')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('feelings')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('towards')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('ocean')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('with')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('me')); + } + + /* Test Word Count + -------------------- */ + + public function testWordCount() { + $this->assertEquals(201, $this->TextStatistics->word_count($this->strText)); + } + + /* Test Long Word Count + -------------------- */ + + public function testLongWordCount() { + $this->assertEquals(23, $this->TextStatistics->words_with_three_syllables($this->strText, true)); // Include proper nouns + $this->assertEquals(22, $this->TextStatistics->words_with_three_syllables($this->strText, false)); // Don't include proper nouns + } + + /* Test Sentences + -------------------- */ + + public function testSentenceCount() { + $this->assertEquals(8, $this->TextStatistics->sentence_count($this->strText)); + } + + /* Test Letter Count + -------------------- */ + + public function testTextLengthCheck() { + $this->assertEquals(884, $this->TextStatistics->letter_count($this->strText)); + } + + /* Test Flesch Kincaid Reading Ease + -------------------- */ + + public function testFleschKincaidReadingEase() { + $this->assertEquals(53.4, $this->TextStatistics->flesch_kincaid_reading_ease($this->strText)); + } + + /* Test Flesch Kincaid Grade Level + -------------------- */ + + public function testFleschKincaidGradeLevel() { + $this->assertEquals(12.1, $this->TextStatistics->flesch_kincaid_grade_level($this->strText)); + } + + /* Test Gunning Fog Score + -------------------- */ + + public function testGunningFogScore() { + $this->assertEquals(14.4, $this->TextStatistics->gunning_fog_score($this->strText)); + } + + /* Test Coleman Liau Index + -------------------- */ + + public function testColemanLiauIndex() { + $this->assertEquals(10.1, $this->TextStatistics->coleman_liau_index($this->strText)); + } + + /* Test SMOG Index + -------------------- */ + + public function testSMOGIndex() { + $this->assertEquals(9.9, $this->TextStatistics->smog_index($this->strText)); + } + + /* Test Automated Readability Index + -------------------- */ + + public function testAutomatedReadabilityIndex() { + $this->assertEquals(11.8, $this->TextStatistics->automated_readability_index($this->strText)); + } + + } + +?> \ No newline at end of file diff --git a/quail/common/services/readability/php-text-statistics/tests/TextStatisticsTest.php b/quail/common/services/readability/php-text-statistics/tests/TextStatisticsTest.php new file mode 100644 index 0000000..aac0609 --- /dev/null +++ b/quail/common/services/readability/php-text-statistics/tests/TextStatisticsTest.php @@ -0,0 +1,279 @@ +TextStatistics = new TextStatistics(); + } + + public function tearDown() { + unset($this->objTextStatistics); + } + + /* Test Syllables + -------------------- */ + + public function testSyllableCountBasicWords() { // "Normal" words + $this->assertEquals(1, $this->TextStatistics->syllable_count('a')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('was')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('the')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('and')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('foobar')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('hello')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('world')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('wonderful')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('simple')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('easy')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('hard')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('quick')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('brown')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('fox')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('jumped')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('over')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('lazy')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('dog')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('camera')); + } + + public function testSyllableCountComplexWords() { // Odd syllables, long words, difficult sounds + $this->assertEquals(12, $this->TextStatistics->syllable_count('antidisestablishmentarianism')); + $this->assertEquals(14, $this->TextStatistics->syllable_count('supercalifragilisticexpialidocious')); + $this->assertEquals(8, $this->TextStatistics->syllable_count('chlorofluorocarbonation')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('forethoughtfulness')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('phosphorescent')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('theoretician')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('promiscuity')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('unbutlering')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('continuity')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('craunched')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('squelched')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('scrounge')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('coughed')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('smile')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('monopoly')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('doughey')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('doughier')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('leguminous')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('thoroughbreds')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('special')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('delicious')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('spatial')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('pacifism')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('coagulant')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('shouldn\'t')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('mcdonald')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('audience')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('finance')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('prevalence')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('impropriety')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('alien')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('dreadnought')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('verandah')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('similar')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('similarly')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('central')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('cyst')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('term')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('order')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('fur')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('sugar')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('paper')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('make')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('gem')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('program')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('hopeless')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('hopelessly')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('careful')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('carefully')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('stuffy')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('thistle')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('teacher')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('unhappy')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('ambiguity')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('validity')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('ambiguous')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('deserve')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('blooper')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('scooped')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('deserve')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('deal')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('death')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('dearth')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('deign')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('reign')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('bedsore')); + $this->assertEquals(5, $this->TextStatistics->syllable_count('anorexia')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('anymore')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('cored')); + $this->assertEquals(1, $this->TextStatistics->syllable_count('sore')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('foremost')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('restore')); + $this->assertEquals(2, $this->TextStatistics->syllable_count('minute')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('manticores')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('asparagus')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('unexplored')); + $this->assertEquals(4, $this->TextStatistics->syllable_count('unexploded')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('CAPITALS')); + } + + // These are fairly common words that are exceptions to given rules and that can not + // easily be programmed for. I've added them here for documentation purposes as much + // as anything else. If you find a way to program rules for any of these, move them + // into the section above. Many compound words will end up here. + public function testSyllableCountProgrammedExceptions() { + $this->assertEquals(3, $this->TextStatistics->syllable_count('simile')); + // Compounds that have caused problems so far + // Problem: far too many compound words to list exhaustively. + $this->assertEquals(2, $this->TextStatistics->syllable_count('shoreline')); + $this->assertEquals(3, $this->TextStatistics->syllable_count('forever')); + } + + public function testAverageSyllablesPerWord() { + $this->assertEquals(1, $this->TextStatistics->average_syllables_per_word('and then there was one')); + $this->assertEquals(2, $this->TextStatistics->average_syllables_per_word('because special ducklings deserve rainbows')); + $this->assertEquals(1.5, $this->TextStatistics->average_syllables_per_word('and then there was one because special ducklings deserve rainbows')); + } + + /* Test Words + -------------------- */ + + public function testWordCount() { + $this->assertEquals(9, $this->TextStatistics->word_count('The quick brown fox jumped over the lazy dog')); + $this->assertEquals(9, $this->TextStatistics->word_count('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(9, $this->TextStatistics->word_count('The quick brown fox jumped over the lazy dog. ')); + $this->assertEquals(9, $this->TextStatistics->word_count(' The quick brown fox jumped over the lazy dog. ')); + $this->assertEquals(9, $this->TextStatistics->word_count(' The quick brown fox jumped over the lazy dog. ')); + $this->assertEquals(2, $this->TextStatistics->word_count('Yes. No.')); + $this->assertEquals(2, $this->TextStatistics->word_count('Yes.No.')); + $this->assertEquals(2, $this->TextStatistics->word_count('Yes.No.')); + $this->assertEquals(2, $this->TextStatistics->word_count('Yes . No.')); + $this->assertEquals(2, $this->TextStatistics->word_count('Yes .No.')); + $this->assertEquals(2, $this->TextStatistics->word_count('Yes - No. ')); + } + + public function testCheckPercentageWordsWithThreeSyllables() { + $this->assertEquals(9, number_format($this->TextStatistics->percentage_words_with_three_syllables('there is just one word with three syllables in this sentence'))); + $this->assertEquals(9, number_format($this->TextStatistics->percentage_words_with_three_syllables('there is just one word with three syllables in this sentence', true))); + $this->assertEquals(0, number_format($this->TextStatistics->percentage_words_with_three_syllables('there are no valid words with three Syllables in this sentence', false))); + $this->assertEquals(5, number_format($this->TextStatistics->percentage_words_with_three_syllables('there is one and only one word with three or more syllables in this long boring sentence of twenty words'))); + $this->assertEquals(10, number_format($this->TextStatistics->percentage_words_with_three_syllables('there are two and only two words with three or more syllables in this long sentence of exactly twenty words'))); + $this->assertEquals(5, number_format($this->TextStatistics->percentage_words_with_three_syllables('there is Actually only one valid word with three or more syllables in this long sentence of Exactly twenty words', false))); + $this->assertEquals(0, number_format($this->TextStatistics->percentage_words_with_three_syllables('no long words in this sentence'))); + $this->assertEquals(0, number_format($this->TextStatistics->percentage_words_with_three_syllables('no long valid words in this sentence because the test ignores proper case words like this Behemoth', false))); + } + + public function testTextLengthCheck() { + $this->assertEquals(1, $this->TextStatistics->letter_count('a')); + $this->assertEquals(0, $this->TextStatistics->letter_count('')); + $this->assertEquals(46, $this->TextStatistics->letter_count('this sentence has 30 characters, not including the digits')); + } + + /* Test Sentences + -------------------- */ + + public function testSentenceCount() { + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence')); + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence.')); + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence!')); + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence?')); + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence..')); + $this->assertEquals(2, $this->TextStatistics->sentence_count('This is a sentence. So is this.')); + $this->assertEquals(2, $this->TextStatistics->sentence_count("This is a sentence. \n\n So is this, but this is multi-line!")); + $this->assertEquals(2, $this->TextStatistics->sentence_count('This is a sentence,. So is this.')); + $this->assertEquals(2, $this->TextStatistics->sentence_count('This is a sentence!? So is this.')); + $this->assertEquals(3, $this->TextStatistics->sentence_count('This is a sentence. So is this. And this one as well.')); + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence - but just one.')); + $this->assertEquals(1, $this->TextStatistics->sentence_count('This is a sentence (but just one).')); + } + + public function testAverageWordsPerSentence() { + $this->assertEquals(4, $this->TextStatistics->average_words_per_sentence('This is a sentence')); + $this->assertEquals(4, $this->TextStatistics->average_words_per_sentence('This is a sentence.')); + $this->assertEquals(4, $this->TextStatistics->average_words_per_sentence('This is a sentence. ')); + $this->assertEquals(4, $this->TextStatistics->average_words_per_sentence('This is a sentence. This is a sentence')); + $this->assertEquals(4, $this->TextStatistics->average_words_per_sentence('This is a sentence. This is a sentence.')); + $this->assertEquals(4, $this->TextStatistics->average_words_per_sentence('This, is - a sentence . This is a sentence. ')); + $this->assertEquals(5.5, $this->TextStatistics->average_words_per_sentence('This is a sentence with extra text. This is a sentence. ')); + $this->assertEquals(6, $this->TextStatistics->average_words_per_sentence('This is a sentence with some extra text. This is a sentence. ')); + } + + /* Test Scores + -------------------- */ + + // Please note that scores for all of these sentences and scoring systems have all been calculated by hand and should therefore be accurate. + // All values have been rounded to a single decimal point. PHP can be temperamental when it comes to floats. + + public function testFleschKincaidReadingEase() { + $this->assertEquals(121.2, $this->TextStatistics->flesch_kincaid_reading_ease('This. Is. A. Nice. Set. Of. Small. Words. Of. One. Part. Each.')); // Best score possible + $this->assertEquals(94.3, $this->TextStatistics->flesch_kincaid_reading_ease('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(94.3, $this->TextStatistics->flesch_kincaid_reading_ease('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(94.3, $this->TextStatistics->flesch_kincaid_reading_ease('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog')); + $this->assertEquals(94.3, $this->TextStatistics->flesch_kincaid_reading_ease("The quick brown fox jumped over the lazy dog. \n\n The quick brown fox jumped over the lazy dog.")); + $this->assertEquals(50.5, $this->TextStatistics->flesch_kincaid_reading_ease('Now it is time for a more complicated sentence, including several longer words.')); + } + + public function testFleschKincaidGradeLevel() { + $this->assertEquals(-3.4, $this->TextStatistics->flesch_kincaid_grade_level('This. Is. A. Nice. Set. Of. Small. Words. Of. One. Part. Each.')); // Best score possible + $this->assertEquals(2.3, $this->TextStatistics->flesch_kincaid_grade_level('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(2.3, $this->TextStatistics->flesch_kincaid_grade_level('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(2.3, $this->TextStatistics->flesch_kincaid_grade_level('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog')); + $this->assertEquals(2.3, $this->TextStatistics->flesch_kincaid_grade_level("The quick brown fox jumped over the lazy dog. \n\n The quick brown fox jumped over the lazy dog.")); + $this->assertEquals(9.4, $this->TextStatistics->flesch_kincaid_grade_level('Now it is time for a more complicated sentence, including several longer words.')); + } + + public function testGunningFogScore() { + $this->assertEquals(0.4, $this->TextStatistics->gunning_fog_score('This. Is. A. Nice. Set. Of. Small. Words. Of. One. Part. Each.')); // Best possible score + $this->assertEquals(3.6, $this->TextStatistics->gunning_fog_score('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(3.6, $this->TextStatistics->gunning_fog_score('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(3.6, $this->TextStatistics->gunning_fog_score("The quick brown fox jumped over the lazy dog. \n\n The quick brown fox jumped over the lazy dog.")); + $this->assertEquals(3.6, $this->TextStatistics->gunning_fog_score('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog')); + $this->assertEquals(14.4, $this->TextStatistics->gunning_fog_score('Now it is time for a more complicated sentence, including several longer words.')); + $this->assertEquals(8.3, $this->TextStatistics->gunning_fog_score('Now it is time for a more Complicated sentence, including Several longer words.')); // Two proper nouns, ignored + } + + public function testColemanLiauIndex() { + $this->assertEquals(3.0, $this->TextStatistics->coleman_liau_index('This. Is. A. Nice. Set. Of. Small. Words. Of. One. Part. Each.')); // Best possible score would be if all words were 1 character + $this->assertEquals(7.7, $this->TextStatistics->coleman_liau_index('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(7.7, $this->TextStatistics->coleman_liau_index('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(7.7, $this->TextStatistics->coleman_liau_index("The quick brown fox jumped over the lazy dog. \n\n The quick brown fox jumped over the lazy dog.")); + $this->assertEquals(7.7, $this->TextStatistics->coleman_liau_index('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog')); + $this->assertEquals(13.6, $this->TextStatistics->coleman_liau_index('Now it is time for a more complicated sentence, including several longer words.')); + } + + public function testSMOGIndex() { + $this->assertEquals(1.8, $this->TextStatistics->smog_index('This. Is. A. Nice. Set. Of. Small. Words. Of. One. Part. Each.')); // Should be 1.8 for any text with no words of 3+ syllables + $this->assertEquals(1.8, $this->TextStatistics->smog_index('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(1.8, $this->TextStatistics->smog_index('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(1.8, $this->TextStatistics->smog_index("The quick brown fox jumped over the lazy dog. \n\n The quick brown fox jumped over the lazy dog.")); + $this->assertEquals(1.8, $this->TextStatistics->smog_index('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog')); + $this->assertEquals(10.1, $this->TextStatistics->smog_index('Now it is time for a more complicated sentence, including several longer words.')); + } + + public function testAutomatedReadabilityIndex() { + $this->assertEquals(-5.6, $this->TextStatistics->automated_readability_index('This. Is. A. Nice. Set. Of. Small. Words. Of. One. Part. Each.')); + $this->assertEquals(1.9, $this->TextStatistics->automated_readability_index('The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(1.9, $this->TextStatistics->automated_readability_index('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.')); + $this->assertEquals(1.9, $this->TextStatistics->automated_readability_index("The quick brown fox jumped over the lazy dog. \n\n The quick brown fox jumped over the lazy dog.")); + $this->assertEquals(1.9, $this->TextStatistics->automated_readability_index('The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog')); + $this->assertEquals(8.6, $this->TextStatistics->automated_readability_index('Now it is time for a more complicated sentence, including several longer words.')); + } + + } + +?> \ No newline at end of file diff --git a/quail/common/services/readability/readability.php b/quail/common/services/readability/readability.php new file mode 100644 index 0000000..0cb4185 --- /dev/null +++ b/quail/common/services/readability/readability.php @@ -0,0 +1,15 @@ +. +* @author Kevin Miller +*/ +/** +* The base class for all QUAIL tests. This handles importing DOM objects, adding items +* to the report and provides a few DOM-traversing methods +*/ +class quailTest { + + /** + * @var object The DOMDocument object + */ + var $dom; + + /** + * @var object The QuailCSS object + */ + var $css; + + /** + * @var array The path for the request + */ + var $path; + + /** + * @var bool Whether the test can be used in a CMS (content without HTML head) + */ + + var $cms = true; + + /** + * @var string The base path for this request + */ + var $base_path; + + /** + * @var array An array of quailReportItem objects + */ + var $report; + + /** + * @var int The fallback severity level for all tests + */ + var $default_severity = QUAIL_TEST_SUGGESTION; + + /** + * @var array An array of all the extensions that are images + */ + var $image_extensions = array('gif', 'jpg', 'png', 'jpeg', 'tiff', 'svn'); + + /** + * @var string The language domain + */ + var $lang = 'en'; + + /** + * @var array Services this test will be using. Services are loaded and then + * a class is built to replace the service name in this array. + */ + var $services = array(); + + /** + * @var array An array of translatable strings + */ + var $strings = array('en' => ''); + + /** + * The class constructor. We pass items by reference so we can alter the DOM if necessary + * @param object $dom The DOMDocument object + * @param object $css The QuailCSS object + * @param array $path The path of this request + * @param string $language_domain The langauge domain to user + * @param mixed $options Any additional options passed by QUAIL. + */ + function __construct(&$dom, &$css, &$path, $language_domain = 'en', $options = null) { + $this->dom = $dom; + $this->css = $css; + $this->path = $path; + $this->lang = $language_domain; + $this->options = $options; + $this->report = array(); + $this->loadServices(); + $this->check(); + } + + //abstract function check(); + + /** + * If this test requires services, it loads the associated files and creates a new + * service instance locally. + */ + + function loadServices() { + foreach($this->services as $service => $file_name) { + if(!class_exists($service .'Service')) { + require_once('services/'. $file_name .'.php'); + } + $service_name = $service .'Service'; + $this->services[$service] = new $service_name(); + } + } + + /** + * Helper method to collect the report from this test. Some + * tests do additional cleanup by overriding this method + * @return array An array of QuailReportItem objects + */ + function getReport() { + $this->report['severity'] = $this->default_severity; + return $this->report; + } + + /** + * Returns the default severity of the test + * @return int The severity level + */ + function getSeverity() { + return $this->default_severity; + } + /** + * Adds a new QuailReportItem to this current tests collection of reports. + * Most reports pertain to a particular element (like an IMG with no Alt attribute); + * however, some are document-level and just either pass or don't pass + * @param object $element The DOMElement object that pertains to this report + * @param string $message An additional message to add to the report + * @param bool $pass Whether or not this report passed + */ + function addReport($element = null, $message = null, $pass = null) { + $report = new quailReportItem(); + $report->element = $element; + $report->message = $message; + $report->pass = $pass; + $this->report[] = $report; + } + + /** + * Retrieves the full path for a file. + * @param string $file The path to a file + * @return string The absolute path to the file. + */ + function getPath($file) { + if(substr($file, 0, 7) == 'http://' || substr($file, 0, 8) == 'https://') + return $file; + $file = explode('/', $file); + if(count($file) == 1) + return implode('/', $this->path) .'/'. $file[0]; + + $path = $this->path; + foreach($file as $directory) { + if($directory == '..') + array_pop($path); + else + $file_path[] = $directory; + } + + return implode('/', $path) .'/'. implode('/', $file_path); + + } + + /** + * Returns a translated variable. If the translation is unavailable, English is returned + * Because tests only really have one string array, we can get all of this info locally + * @return mixed The translation for the object + */ + function translation() { + if(isset($this->strings[$this->lang])) { + return $this->strings[$this->lang]; + } + if(isset($this->strings['en'])) { + return $this->strings['en']; + } + return false; + } + + /** + * Helper method to find all the elements that fit a particular query + * in the document (either by tag name, or by attributes from the htmlElements object) + * @param mixed $tags Either a single tag name in a string, or an array of tag names + * @param string $options The kind of option to select an element by (see htmlElements) + * @param string $value The value of the above option + * @return array An array of elements that fit the description + * @todo this should cache results in a static variable, as many of these can be iterated over again + */ + function getAllElements($tags = null, $options = false, $value = true) { + if(!is_array($tags)) + $tags = array($tags); + if($options !== false) + $tags = htmlElements::getElementsByOption($options, $value); + $result = array(); + + if(!is_array($tags)) + return array(); + foreach($tags as $tag) { + $elements = $this->dom->getElementsByTagName($tag); + if($elements) { + foreach($elements as $element) { + $result[] = $element; + } + } + } + if(count($result) == 0) + return array(); + return $result; + } + + /** + * Returns true if an element has a child with a given tag name + * @param object $element A DOMElement object + * @param string $child_tag The tag name of the child to find + * @return bool TRUE if the element does have a child with + * the given tag name, otherwise FALSE + */ + function elementHasChild($element, $child_tag) { + foreach($element->childNodes as $child) { + if(property_exists($child, 'tagName') && $child->tagName == $child_tag) + return true; + } + return false; + } + + /** + * Returns the first ancestor reached of a tag, or false if it hits + * the document root or a given tag. + * @param object $element A DOMElement object + * @param string $ancestor_tag The name of the tag we are looking for + * @param string $limit_tag Where to stop searching + */ + function getElementAncestor($element, $ancestor_tag, $limit_tag = 'body') { + while(property_exists($element, 'parentNode')) { + if($element->parentNode->tagName == $ancestor_tag) { + return $element->parentNode; + } + if($element->parentNode->tagName == $limit_tag) { + return false; + } + $element = $element->parentNode; + } + return false; + } + + /** + * Finds all the elements with a given tag name that has + * an attribute + * @param string $tag The tag name to search for + * @param string $attribute The attribute to search on + * @param bool $unique Whether we only want one result per attribute + * @return array An array of DOMElements with the attribute + * value as the key. + * + */ + function getElementsByAttribute($tag, $attribute, $unique = false) { + $results = array(); + foreach($this->getAllElements($tag) as $element) { + if($element->hasAttribute($attribute)) { + if($unique) + $results[$element->getAttribute($attribute)] = $element; + else + $results[$element->getAttribute($attribute)][] = $element; + } + } + return $results; + } + + /** + * Returns the next element after the current one. + * @param object $element A DOMElement object + * @return mixed FALSE if there is no other element, or a DOMElement object + */ + function getNextElement($element) { + $parent = $element->parentNode; + $next = false; + foreach($parent->childNodes as $child) { + if($next) + return $child; + if($child->isSameNode($element)) + $next = true; + } + return false; + } + + /** + * To minimize notices, this compares an object's property to the valus + * and returns true or false. False will also be returned if the object is + * not really an object, or if the property doesn't exist at all + * @param object $object The object too look at + * @param string $property The name of the property + * @param mixed $value The value to check against + * @param bool $trim Whether the property value should be trimmed + * @param book $lower Whether the property value should be compared on lower case + **/ + function propertyIsEqual($object, $property, $value, $trim = false, $lower = false) { + if(!is_object($object)) { + return false; + } + if(!property_exists($object, $property)) { + return false; + } + $property_value = $object->$property; + if($trim) { + $property_value = trim($property_value); + $value = trim($value); + } + if($lower) { + $property_value = strtolower($property_value); + $value = strtolower($value); + } + return ($property_value == $value); + } + + /** + * Returns the parent of an elment that has a given tag Name, but + * stops the search if it hits the $limiter tag + * @param object $element The DOMElement object to search on + * @param string $tag_name The name of the tag of the parent to find + * @param string $limiter The tag name of the element to stop searching on + * regardless of the results (like search for a parent "P" tag + * of this node but stop if you reach "body") + * @return mixed FALSE if no parent is found, or the DOMElement object of the found parent + */ + function getParent($element, $tag_name, $limiter) { + while($element) { + if($element->tagName == $tag_name) + return $element; + if($element->tagName == $limiter) + return false; + $element = $element->parentNode; + } + return false; + } + + /** + * Returns if a GIF files is animated or not + * @url http://us.php.net/manual/en/function.imagecreatefromgif.php#88005 + */ + function imageIsAnimated($filename) { + if(!($fh = @fopen($filename, 'rb'))) + return false; + $count = 0; + //an animated gif contains multiple "frames", with each frame having a + //header made up of: + // * a static 4-byte sequence (\x00\x21\xF9\x04) + // * 4 variable bytes + // * a static 2-byte sequence (\x00\x2C) + + // We read through the file til we reach the end of the file, or we've found + // at least 2 frame headers + while(!feof($fh) && $count < 2) + $chunk = fread($fh, 1024 * 100); //read 100kb at a time + $count += preg_match_all('#\x00\x21\xF9\x04.{4}\x00\x2C#s', $chunk, $matches); + + fclose($fh); + return $count > 1; + } + + /** + * Returns if there are any printable/readable characters within an element. + * This finds both node values or images with alt text. + * @param object $element The given element to look at + * @return bool TRUE if contains readable text, FALSE if otherwise + */ + function elementContainsReadableText($element) { + if(is_a($element, 'DOMText')) { + if(trim($element->wholeText) != '') { + return true; + } + } + else { + if(trim($element->nodeValue) != '' || + ($element->hasAttribute('alt') && trim($element->getAttribute('alt')) != '')) { + return true; + } + if(method_exists($element, 'hasChildNodes') && $element->hasChildNodes()) { + foreach($element->childNodes as $child) { + if($this->elementContainsReadableText($child)) { + return true; + } + } + } + } + return false; + } + +} + +/** +* A special base class for tests that only file a report whenever +* it hits the specified tag regardless of anything about the element +* (especially for tests like "No Blink Tag" - or ones that fire on +* objects that require human attention). To use this class, just override +* the value of the $tag variable. +* +*/ +class quailTagTest extends quailTest { + + /** + * @var string The tag name of this test + */ + var $tag = ''; + + /** + * Shouldn't need to be overridden. We just file one report item for every + * element we find with this class's $tag var. + */ + function check() { + foreach($this->getAllElements($this->tag) as $element) { + $this->addReport($element); + } + } +} + +/** +* Special base test class that deals with tests concerning the logical heirarchy +* of headers. To use it, just extend and change the $tag var. +*/ +class quailHeaderTest extends quailTest { + + /** + * @var string The header tag this test applies to. + */ + var $tag = ''; + + /** + * @var array An array of all the header tags + */ + var $headers = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); + + /** + * The check method gathers all the headers together and walks through them, making sure that + * the logical display of headers makes sense. + */ + function check() { + $tag_number = substr($this->tag, -1, 1); + $doc_headers = array(); + $first_header = $this->dom->getElementsByTagName($this->tag); + if($first_header->item(0)) { + $current = $first_header->item(0); + $previous_number = intval(substr($current->tagName, -1, 1)); + while($current) { + + if(property_exists($current, 'tagName') && in_array($current->tagName, $this->headers)) { + $current_number = intval(substr($current->tagName, -1, 1)); + if($current_number > ($previous_number + 1)) + $this->addReport($current); + $previous_number = intval(substr($current->tagName, -1, 1)); + } + $current = $current->nextSibling; + + } + + } + + } +} + +/** +* Special base class which provides helper methods for tables. +*/ +class quailTableTest extends quailTest { + + /** + * Takes the element object of a main table and returns the number + * of rows and columns in it. + * @param object The DOMElement of the main table tag + * @return array An array with the 'rows' value showing + * the number of rows, and columsn showing the number of columns + */ + function getTable($table) { + $rows = 0; + $columns = 0; + $first_row = true; + if($table->tagName != 'table') + return false; + foreach($table->childNodes as $child) { + if(property_exists($child, 'tagName') && $child->tagName == 'tr') { + $rows++; + if($first_row) { + foreach($child->childNodes as $column_child) { + if($column_child->tagName == 'th' || $column_child->tagName == 'td') + $columns++; + } + $first_row = false; + } + } + } + + return array('rows' => $rows, 'columns' => $columns); + } + + /** + * Finds whether or not the table is a data table. Checks that the + * table has a logical order and uses 'th' or 'thead' tags to illustrate + * the page author thought it was a data table. + * @param object $table The DOMElement object of the table tag + * @return bool TRUE if the element is a data table, otherwise false + */ + function isData($table) { + if($table->tagName != 'table') + return false; + foreach($table->childNodes as $child) { + if(property_exists($child, 'tagName') && $child->tagName == 'tr') { + foreach($child->childNodes as $row_child) { + if(property_exists($row_child, 'tagName') && $row_child->tagName == 'th') + return true; + } + } + if(property_exists($child, 'tagName') && $child->tagName == 'thead') + return true; + } + return false; + } + +} + +/** +* Base test class for tests which checks that the given input tag +* has an associated lable tag. +* To override, just override the tag and type variables, and use $no_type = true if it is a special +* form tag like textarea. +*/ +class inputHasLabel extends quailTest { + + /** + * @var string The tag name that this test applies to + */ + var $tag = 'input'; + + /** + * @var string The type of input tag this is + */ + var $type = 'text'; + + /** + * @var bool Wehether or not we should check the type attribute of the input tags + */ + var $no_type = false; + + /** + * Iterate through all the elemetns using the $tag tagname and the $type attribute (if appropriate) + * and then check it against a list of all LABEL tags. + */ + function check() { + foreach($this->getAllElements('label') as $label) { + if($label->hasAttribute('for')) + $labels[$label->getAttribute('for')] = $label; + else { + foreach($label->childNodes as $child) { + if(property_exists($child, 'tagName') && + $child->tagName == $this->tag && + ($child->getAttribute('type') == $this->type || $this->no_type)) { + $input_in_label[$child->getAttribute('name')] = $child; + } + } + } + } + foreach($this->getAllElements($this->tag) as $input) { + if($input->getAttribute('type') == $this->type || $this->no_type) { + if(!$input->hasAttribute('title')) { + if(!isset($input_in_label[$input->getAttribute('name')])) { + if(!isset($labels[$input->getAttribute('id')]) || trim($labels[$input->getAttribute('id')]->nodeValue) == '') + $this->addReport($input); + } + + } + } + } + } + +} + +/** +* Helper base class to check that input tags have an appropriate tab order +*/ +class inputTabIndex extends quailTest { + + /** + * @var string The tag name that this test applies to + */ + var $tag; + + /** + * @var string The type of input tag this is + */ + var $type; + + /** + * @var bool Wehether or not we should check the type attribute of the input tags + */ + var $no_type = false; + + /** + * Iterate through all the input items and make sure the tabindex exists + * and is numeric. + */ + function check() { + foreach($this->getAllElements($this->tag) as $element) { + if(($element->getAttribute('type') == $this->type) + && (!($element->hasAttribute('tabindex')) + || !is_numeric($element->getAttribute('tabindex')))) + $this->addReport($element); + } + } +} + +/** +* Helper test base for tests dealing with color difference and luminosity. +*/ +class quailColorTest extends quailTest { + + var $color_names = array( + 'aliceblue' => 'f0f8ff', + 'antiquewhite' => 'faebd7', + 'aqua' => '00ffff', + 'aquamarine' => '7fffd4', + 'azure' => 'f0ffff', + 'beige' => 'f5f5dc', + 'bisque' => 'ffe4c4', + 'black' => '000000', + 'blanchedalmond' => 'ffebcd', + 'blue' => '0000ff', + 'blueviolet' => '8a2be2', + 'brown' => 'a52a2a', + 'burlywood' => 'deb887', + 'cadetblue' => '5f9ea0', + 'chartreuse' => '7fff00', + 'chocolate' => 'd2691e', + 'coral' => 'ff7f50', + 'cornflowerblue' => '6495ed', + 'cornsilk' => 'fff8dc', + 'crimson' => 'dc143c', + 'cyan' => '00ffff', + 'darkblue' => '00008b', + 'darkcyan' => '008b8b', + 'darkgoldenrod' => 'b8860b', + 'darkgray' => 'a9a9a9', + 'darkgreen' => '006400', + 'darkkhaki' => 'bdb76b', + 'darkmagenta' => '8b008b', + 'darkolivegreen' => '556b2f', + 'darkorange' => 'ff8c00', + 'darkorchid' => '9932cc', + 'darkred' => '8b0000', + 'darksalmon' => 'e9967a', + 'darkseagreen' => '8fbc8f', + 'darkslateblue' => '483d8b', + 'darkslategray' => '2f4f4f', + 'darkturquoise' => '00ced1', + 'darkviolet' => '9400d3', + 'deeppink' => 'ff1493', + 'deepskyblue' => '00bfff', + 'dimgray' => '696969', + 'dodgerblue' => '1e90ff', + 'firebrick' => 'b22222', + 'floralwhite' => 'fffaf0', + 'forestgreen' => '228b22', + 'fuchsia' => 'ff00ff', + 'gainsboro' => 'dcdcdc', + 'ghostwhite' => 'f8f8ff', + 'gold' => 'ffd700', + 'goldenrod' => 'daa520', + 'gray' => '808080', + 'green' => '008000', + 'greenyellow' => 'adff2f', + 'honeydew' => 'f0fff0', + 'hotpink' => 'ff69b4', + 'indianred' => 'cd5c5c', + 'indigo' => '4b0082', + 'ivory' => 'fffff0', + 'khaki' => 'f0e68c', + 'lavender' => 'e6e6fa', + 'lavenderblush' => 'fff0f5', + 'lawngreen' => '7cfc00', + 'lemonchiffon' => 'fffacd', + 'lightblue' => 'add8e6', + 'lightcoral' => 'f08080', + 'lightcyan' => 'e0ffff', + 'lightgoldenrodyellow' => 'fafad2', + 'lightgrey' => 'd3d3d3', + 'lightgreen' => '90ee90', + 'lightpink' => 'ffb6c1', + 'lightsalmon' => 'ffa07a', + 'lightseagreen' => '20b2aa', + 'lightskyblue' => '87cefa', + 'lightslategray' => '778899', + 'lightsteelblue' => 'b0c4de', + 'lightyellow' => 'ffffe0', + 'lime' => '00ff00', + 'limegreen' => '32cd32', + 'linen' => 'faf0e6', + 'magenta' => 'ff00ff', + 'maroon' => '800000', + 'mediumaquamarine' => '66cdaa', + 'mediumblue' => '0000cd', + 'mediumorchid' => 'ba55d3', + 'mediumpurple' => '9370d8', + 'mediumseagreen' => '3cb371', + 'mediumslateblue' => '7b68ee', + 'mediumspringgreen' => '00fa9a', + 'mediumturquoise' => '48d1cc', + 'mediumvioletred' => 'c71585', + 'midnightblue' => '191970', + 'mintcream' => 'f5fffa', + 'mistyrose' => 'ffe4e1', + 'moccasin' => 'ffe4b5', + 'navajowhite' => 'ffdead', + 'navy' => '000080', + 'oldlace' => 'fdf5e6', + 'olive' => '808000', + 'olivedrab' => '6b8e23', + 'orange' => 'ffa500', + 'orangered' => 'ff4500', + 'orchid' => 'da70d6', + 'palegoldenrod' => 'eee8aa', + 'palegreen' => '98fb98', + 'paleturquoise' => 'afeeee', + 'palevioletred' => 'd87093', + 'papayawhip' => 'ffefd5', + 'peachpuff' => 'ffdab9', + 'peru' => 'cd853f', + 'pink' => 'ffc0cb', + 'plum' => 'dda0dd', + 'powderblue' => 'b0e0e6', + 'purple' => '800080', + 'red' => 'ff0000', + 'rosybrown' => 'bc8f8f', + 'royalblue' => '4169e1', + 'saddlebrown' => '8b4513', + 'salmon' => 'fa8072', + 'sandybrown' => 'f4a460', + 'seagreen' => '2e8b57', + 'seashell' => 'fff5ee', + 'sienna' => 'a0522d', + 'silver' => 'c0c0c0', + 'skyblue' => '87ceeb', + 'slateblue' => '6a5acd', + 'slategray' => '708090', + 'snow' => 'fffafa', + 'springgreen' => '00ff7f', + 'steelblue' => '4682b4', + 'tan' => 'd2b48c', + 'teal' => '008080', + 'thistle' => 'd8bfd8', + 'tomato' => 'ff6347', + 'turquoise' => '40e0d0', + 'violet' => 'ee82ee', + 'wheat' => 'f5deb3', + 'white' => 'ffffff', + 'whitesmoke' => 'f5f5f5', + 'yellow' => 'ffff00', + 'yellowgreen' => '9acd32' + ); + + /** + * Helper method that finds the luminosity between the provided + * foreground and background parameters. + * @param string $foreground The HEX value of the foreground color + * @param string $background The HEX value of the background color + * @return float The luminosity contrast ratio between the colors + */ + function getLuminosity($foreground, $background) { + if($foreground == $background) return 0; + $fore_rgb = $this->getRGB($foreground); + $back_rgb = $this->getRGB($background); + return $this->luminosity($fore_rgb['r'], $back_rgb['r'], + $fore_rgb['g'], $back_rgb['g'], + $fore_rgb['b'], $back_rgb['b']); + } + + /** + * Returns the luminosity between two colors + * @param string $r The first Red value + * @param string $r2 The second Red value + * @param string $g The first Green value + * @param string $g2 The second Green value + * @param string $b The first Blue value + * @param string $b2 The second Blue value + * @return float The luminosity contrast ratio between the colors + */ + function luminosity($r,$r2,$g,$g2,$b,$b2) { + $RsRGB = $r/255; + $GsRGB = $g/255; + $BsRGB = $b/255; + $R = ($RsRGB <= 0.03928) ? $RsRGB/12.92 : pow(($RsRGB+0.055)/1.055, 2.4); + $G = ($GsRGB <= 0.03928) ? $GsRGB/12.92 : pow(($GsRGB+0.055)/1.055, 2.4); + $B = ($BsRGB <= 0.03928) ? $BsRGB/12.92 : pow(($BsRGB+0.055)/1.055, 2.4); + + $RsRGB2 = $r2/255; + $GsRGB2 = $g2/255; + $BsRGB2 = $b2/255; + $R2 = ($RsRGB2 <= 0.03928) ? $RsRGB2/12.92 : pow(($RsRGB2+0.055)/1.055, 2.4); + $G2 = ($GsRGB2 <= 0.03928) ? $GsRGB2/12.92 : pow(($GsRGB2+0.055)/1.055, 2.4); + $B2 = ($BsRGB2 <= 0.03928) ? $BsRGB2/12.92 : pow(($BsRGB2+0.055)/1.055, 2.4); + + if ($r+$g+$b <= $r2+$g2+$b2) { + $l2 = (.2126 * $R + 0.7152 * $G + 0.0722 * $B); + $l1 = (.2126 * $R2 + 0.7152 * $G2 + 0.0722 * $B2); + } else { + $l1 = (.2126 * $R + 0.7152 * $G + 0.0722 * $B); + $l2 = (.2126 * $R2 + 0.7152 * $G2 + 0.0722 * $B2); + } + + $luminosity = round(($l1 + 0.05)/($l2 + 0.05),2); + return $luminosity; + } + + + /** + * Returns the decimal equivalents for a HEX color + * @param string $color The hex color value + * @return array An array where 'r' is the Red value, 'g' is Green, and 'b' is Blue + */ + function getRGB($color) { + $color = $this->convertColor($color); + $c = str_split($color, 2); + if(count($c) != 3) { + return false; + } + $results = array('r' => hexdec($c[0]), 'g' => hexdec($c[1]), 'b' => hexdec($c[2])); + return $results; + } + + /** + * Converts multiple color or backround styles into a simple hex string + * @param string $color The color attribute to convert (this can also be a multi-value css background value) + * @return string A standard CSS hex value for the color + */ + function convertColor($color) { + $color = trim($color); + if(strpos($color, ' ') !== false) { + $colors = explode(' ', $color); + foreach($colors as $background_part) { + if(substr(trim($background_part), 0, 1) == '#' || + in_array(trim($background_part), array_keys($this->color_names)) || + strtolower(substr(trim($background_part), 0, 3)) == 'rgb') { + $color = $background_part; + } + } + } + //Normal hex color + if(substr($color, 0, 1) == '#') { + if(strlen($color) == 7) { + return str_replace('#', '', $color); + } + elseif (strlen($color == 4)) { + return substr($color, 1, 1).substr($color, 1, 1). + substr($color, 2, 1).substr($color, 2, 1). + substr($color, 3, 1).substr($color, 3, 1); + } + } + //Named Color + if(in_array($color, array_keys($this->color_names))) { + return $this->color_names[$color]; + } + //rgb values + if(strtolower(substr($color, 0, 3)) == 'rgb') { + $colors = explode(',', trim(str_replace('rgb(', '', $color), '()')); + if(!count($colors) != 3) { + return false; + } + $r = intval($colors[0]); + $g = intval($colors[1]); + $b = intval($colors[2]); + + $r = dechex($r<0?0:($r>255?255:$r)); + $g = dechex($g<0?0:($g>255?255:$g)); + $b = dechex($b<0?0:($b>255?255:$b)); + + $color = (strlen($r) < 2?'0':'').$r; + $color .= (strlen($g) < 2?'0':'').$g; + $color .= (strlen($b) < 2?'0':'').$b; + return $color; + } + } + + /** + * Returns the WAIERT contrast between two colors + * @see GetLuminosity + */ + function getWaiErtContrast($foreground, $background) { + $fore_rgb = $this->getRGB($foreground); + $back_rgb = $this->getRGB($background); + $diffs = $this->getWaiDiffs($fore_rgb, $back_rgb); + + return $diffs['red'] + $diffs['green'] + $diffs['blue']; + } + + /** + * Returns the WAI ERT Brightness between two colors + * + */ + function getWaiErtBrightness($foreground, $background) { + $fore_rgb = $this->getRGB($foreground); + $back_rgb = $this->getRGB($background); + $color = $this->getWaiDiffs($fore_rgb, $back_rgb); + return (($color['red'] * 299) + ($color['green'] * 587) + ($color['blue'] * 114)) / 1000; + } + + function getWaiDiffs($fore_rgb, $back_rgb) { + $red_diff = ($fore_rgb['r'] > $back_rgb['r']) + ? $fore_rgb['r'] - $back_rgb['r'] + : $back_rgb['r'] - $fore_rgb['r']; + $green_diff = ($fore_rgb['g'] > $back_rgb['g']) + ? $fore_rgb['g'] - $back_rgb['g'] + : $back_rgb['g'] - $fore_rgb['g']; + + $blue_diff = ($fore_rgb['b'] > $back_rgb['b']) + ? $fore_rgb['b'] - $back_rgb['b'] + : $back_rgb['b'] - $fore_rgb['b']; + return array('red' => $red_diff, 'green' => $green_diff, 'blue' => $blue_diff); + } +} + +/** +* Base class for test dealing with WAI ERT color contrast for the document +* Because a lot of the tests deal with text, vlink, alink, etc. +*/ +class bodyWaiErtColorContrast extends quailColorTest { + + /** + * @var string The attribute to check for the background color of the tag + */ + var $background = 'bgcolor'; + + /** + * @var string The attribute to check for the foreground color of the tag + */ + var $foreground = 'text'; + + /** + * Compares the WAI ERT contrast on the given color attributes of the tag + */ + function check() { + $body = $this->getAllElements('body'); + if(!$body) + return false; + $body = $body[0]; + if($body->hasAttribute($this->foreground) && $body->hasAttribute($this->background)) + if( $this->getWaiErtContrast($body->getAttribute($this->foreground), $body->getAttribute($this->background)) < 500) + $this->addReport(null, null, false); + elseif($this->getWaiErtBrightness($body->getAttribute($this->foreground), $body->getAttribute($this->background)) < 125) + $this->addReport(null, null, false); + + } + +} + +/** +* Helper function to support checking the varous color attributes of the tag +* against WCAG standards +*/ +class bodyColorContrast extends quailColorTest { + + /** + * @var string The attribute to check for the background color of the tag + */ + var $background = 'bgcolor'; + + /** + * @var string The attribute to check for the foreground color of the tag + */ + var $foreground = 'text'; + + /** + * Compares the WCAG contrast on the given color attributes of the tag + */ + function check() { + $body = $this->getAllElements('body'); + if(!$body) + return false; + $body = $body[0]; + if($body->hasAttribute($this->foreground) && $body->hasAttribute($this->background)) + if( $this->getLuminosity($body->getAttribute($this->foreground), $body->getAttribute($this->background)) < 5) + $this->addReport(null, null, false); + } +} \ No newline at end of file diff --git a/quail/guidelines/.svn/all-wcprops b/quail/guidelines/.svn/all-wcprops new file mode 100644 index 0000000..5e1510c --- /dev/null +++ b/quail/guidelines/.svn/all-wcprops @@ -0,0 +1,53 @@ +K 25 +svn:wc:ra_dav:version-url +V 45 +/svn/!svn/ver/232/tags/0.4.1/quail/guidelines +END +section508.php +K 25 +svn:wc:ra_dav:version-url +V 60 +/svn/!svn/ver/232/tags/0.4.1/quail/guidelines/section508.php +END +wcag1a.php +K 25 +svn:wc:ra_dav:version-url +V 56 +/svn/!svn/ver/232/tags/0.4.1/quail/guidelines/wcag1a.php +END +wcag1aa.php +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/quail/guidelines/wcag1aa.php +END +wcag2a.php +K 25 +svn:wc:ra_dav:version-url +V 56 +/svn/!svn/ver/232/tags/0.4.1/quail/guidelines/wcag2a.php +END +wcag1aaa.php +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/quail/guidelines/wcag1aaa.php +END +wcag2aa.php +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/quail/guidelines/wcag2aa.php +END +wcag2aaa.php +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/quail/guidelines/wcag2aaa.php +END +all.php +K 25 +svn:wc:ra_dav:version-url +V 53 +/svn/!svn/ver/232/tags/0.4.1/quail/guidelines/all.php +END diff --git a/quail/guidelines/.svn/entries b/quail/guidelines/.svn/entries new file mode 100644 index 0000000..4363348 --- /dev/null +++ b/quail/guidelines/.svn/entries @@ -0,0 +1,303 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/quail/guidelines +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-08-21T07:01:43.361020Z +224 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +translations +dir + +section508.php +file + + + + +2010-12-08T21:44:08.000000Z +dbefcc941fc2fef963fdf81c2f0b1829 +2010-08-01T02:28:33.393553Z +212 +keveemiller + + + + + + + + + + + + + + + + + + + + + +2507 + +wcag1a.php +file + + + + +2010-12-08T21:44:08.000000Z +28c84c5b2c9b445c2484b4007a5594c6 +2010-08-01T02:28:33.393553Z +212 +keveemiller + + + + + + + + + + + + + + + + + + + + + +2569 + +wcag1aa.php +file + + + + +2010-12-08T21:44:08.000000Z +6048ad3f8cde9c548657d19ea4e021ca +2010-08-01T02:28:33.393553Z +212 +keveemiller + + + + + + + + + + + + + + + + + + + + + +3734 + +wcag2a.php +file + + + + +2010-12-08T21:44:08.000000Z +471ee57e60f59238d94e3a900e412901 +2010-08-01T02:28:33.393553Z +212 +keveemiller + + + + + + + + + + + + + + + + + + + + + +4347 + +wcag1aaa.php +file + + + + +2010-12-08T21:44:08.000000Z +0acbb398dc7213dc4f14fc2ffc325d90 +2010-08-01T02:28:33.393553Z +212 +keveemiller + + + + + + + + + + + + + + + + + + + + + +4524 + +wcag2aa.php +file + + + + +2010-12-08T21:44:08.000000Z +23fa65185be6c6c376923a3be059d7bb +2010-08-01T02:28:33.393553Z +212 +keveemiller + + + + + + + + + + + + + + + + + + + + + +4887 + +wcag2aaa.php +file + + + + +2010-12-08T21:44:08.000000Z +f2cddfa18d6296806a791f08373e485c +2010-08-01T02:28:33.393553Z +212 +keveemiller + + + + + + + + + + + + + + + + + + + + + +4982 + +all.php +file + + + + +2010-12-08T21:44:08.000000Z +74decd23f86591aa296bb4e8d355d118 +2010-07-03T00:42:03.995242Z +201 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1547 + diff --git a/quail/guidelines/.svn/text-base/all.php.svn-base b/quail/guidelines/.svn/text-base/all.php.svn-base new file mode 100644 index 0000000..3966a8c --- /dev/null +++ b/quail/guidelines/.svn/text-base/all.php.svn-base @@ -0,0 +1,51 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup guidelines */ +/*@{*/ + +/** + * A list of all tests. This is useful for other services that need to provide + * lists of all available tests. + * + */ + +class AllGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array(); + + /** + * We are overriding the parent run method to load + * a list of all classes which extend quailTest. + */ + function run($arg = null, $language = 'en') { + foreach(get_declared_classes() as $classname) { + $parents = class_parents($classname); + if(isset($parents['quailTest']) && substr($classname, 0, 5) != 'quail') { + $this->tests[] = $classname; + } + } + parent::run($arg, $language); + } +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/.svn/text-base/section508.php.svn-base b/quail/guidelines/.svn/text-base/section508.php.svn-base new file mode 100644 index 0000000..3e24887 --- /dev/null +++ b/quail/guidelines/.svn/text-base/section508.php.svn-base @@ -0,0 +1,86 @@ +. +* @author Kevin Miller +*/ + + +/** \addtogroup guidelines */ +/*@{*/ + +/** + * Section 508 Guideline + */ +class Section508Guideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgAltIsDifferent', + 'imgAltIsTooLong', + 'imgNonDecorativeHasAlt', + 'imgImportantNoSpacerAlt', + 'imgAltNotPlaceHolder', + 'imgAltNotEmptyInAnchor', + 'imgAltIsSameInText', + 'objectTextUpdatesWhenObjectChanges', + 'objectLinkToMultimediaHasTextTranscript', + 'objectMustContainText', + 'scriptInBodyMustHaveNoscript', + 'aLinksToMultiMediaRequireTranscript', + 'imgNotReferredToByColorAlone', + 'appletsDoneUseColorAlone', + 'inputDoesNotUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'imgMapAreasHaveDuplicateLink', + 'imgWithMapHasUseMap', + 'tableDataShouldHaveTh', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'frameSrcIsAccessible', + 'frameRelationshipsMustBeDescribed', + 'framesetMustHaveNoFramesSection', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'scriptInBodyMustHaveNoscript', + 'appletContainsTextEquivalentInAlt', + 'appletContainsTextEquivalent', + 'appletUIMustBeAccessible', + 'inputTextHasLabel', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'inputImageAltIsShort', + 'inputImageAltIsNotFileName', + 'inputImageAltIsNotPlaceholder', + 'inputTextHasValue', + 'selectHasAssociatedLabel', + 'passwordHasLabel', + 'checkboxHasLabel', + 'fileHasLabel', + 'radioHasLabel', + 'skipToContentLinkProvided', + 'documentAutoRedirectNotUsed', + 'documentMetaNotUsedWithTimeout', + 'headersHaveText', + ); +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/.svn/text-base/wcag1a.php.svn-base b/quail/guidelines/.svn/text-base/wcag1a.php.svn-base new file mode 100644 index 0000000..7d83e3a --- /dev/null +++ b/quail/guidelines/.svn/text-base/wcag1a.php.svn-base @@ -0,0 +1,84 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup guidelines */ +/*@{*/ + +/** +* WCAG 1.0 Level A Guideline +*/ +class Wcag1aGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgNonDecorativeHasAlt', + 'imgImportantNoSpacerAlt', + 'imgHasLongDesc', + 'imgAltIsSameInText', + 'aLinksToSoundFilesNeedTranscripts', + 'aLinksToMultiMediaRequireTranscript', + 'appletContainsTextEquivalentInAlt', + 'frameRelationshipsMustBeDescribed', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'areaHasAltValue', + 'areaAltIdentifiesDestination', + 'areaLinksToSoundFile', + 'objectTextUpdatesWhenObjectChanges', + 'objectContentUsableWhenDisabled', + 'objectLinkToMultimediaHasTextTranscript', + 'objectMustHaveTitle', + 'objectMustHaveValidTitle', + 'objectMustContainText', + 'scriptInBodyMustHaveNoscript', + 'objectWithClassIDHasNoText', + 'imageMapServerSide', + 'imgNotReferredToByColorAlone', + 'appletsDoneUseColorAlone', + 'inputDoesNotUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'documentWordsNotInLanguageAreMarked', + 'tableDataShouldHaveTh', + 'cssDocumentMakesSenseStyleTurnedOff', + 'documentContentReadableWithoutStylesheets', + 'objectTextUpdatesWhenObjectChanges', + 'objectWithClassIDHasNoText', + 'appletContainsTextEquivalent', + 'objectContentUsableWhenDisabled', + 'objectUIMustBeAccessible', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'appletUIMustBeAccessible', + 'objectInterfaceIsAccessible', + 'scriptUIMustBeAccessible', + 'imgWithMapHasUseMap', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'svgContainsTitle', + 'headersHaveText', + ); +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/.svn/text-base/wcag1aa.php.svn-base b/quail/guidelines/.svn/text-base/wcag1aa.php.svn-base new file mode 100644 index 0000000..25767fa --- /dev/null +++ b/quail/guidelines/.svn/text-base/wcag1aa.php.svn-base @@ -0,0 +1,129 @@ +. +* @author Kevin Miller +*/ + + +/** \addtogroup guidelines */ +/*@{*/ + +/** +* WCAG 1.0 Level AA Guideline +*/ +class Wcag1aaGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgNonDecorativeHasAlt', + 'imgImportantNoSpacerAlt', + 'imgHasLongDesc', + 'imgAltIsSameInText', + 'aLinksToSoundFilesNeedTranscripts', + 'aLinksToMultiMediaRequireTranscript', + 'appletContainsTextEquivalentInAlt', + 'frameRelationshipsMustBeDescribed', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'areaHasAltValue', + 'areaAltIdentifiesDestination', + 'areaLinksToSoundFile', + 'objectTextUpdatesWhenObjectChanges', + 'objectContentUsableWhenDisabled', + 'objectLinkToMultimediaHasTextTranscript', + 'objectMustHaveTitle', + 'objectMustHaveValidTitle', + 'objectMustContainText', + 'objectWithClassIDHasNoText', + 'imageMapServerSide', + 'imgNotReferredToByColorAlone', + 'appletsDoneUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'documentWordsNotInLanguageAreMarked', + 'tableDataShouldHaveTh', + 'cssDocumentMakesSenseStyleTurnedOff', + 'documentContentReadableWithoutStylesheets', + 'objectTextUpdatesWhenObjectChanges', + 'objectWithClassIDHasNoText', + 'appletContainsTextEquivalent', + 'objectContentUsableWhenDisabled', + 'objectUIMustBeAccessible', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'appletUIMustBeAccessible', + 'objectInterfaceIsAccessible', + 'scriptUIMustBeAccessible', + 'imgWithMapHasUseMap', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'imgWithMathShouldHaveMathEquivalent', + 'documentValidatesToDocType', + 'basefontIsNotUsed', + 'fontIsNotUsed', + 'headerH1', + 'headerH2', + 'headerH3', + 'headerH4', + 'headerH1Format', + 'headerH2Format', + 'headerH3Format', + 'headerH4Format', + 'headerH5Format', + 'headerH6Format', + 'menuNotUsedToFormatText', + 'listNotUsedForFormatting', + 'blockquoteNotUsedForIndentation', + 'tableLayoutDataShouldNotHaveTh', + 'framesetMustHaveNoFramesSection', + 'noframesSectionMustHaveTextEquivalent', + 'blinkIsNotUsed', + 'marqueeIsNotUsed', + 'documentMetaNotUsedWithTimeout', + 'documentAutoRedirectNotUsed', + 'aLinksDontOpenNewWindow', + 'areaDontOpenNewWindow', + 'textareaLabelPositionedClose', + 'passwordLabelIsNearby', + 'checkboxLabelIsNearby', + 'fileLabelIsNearby', + 'radioLabelIsNearby', + 'frameRelationshipsMustBeDescribed', + 'inputTextHasLabel', + 'selectHasAssociatedLabel', + 'textareaHasAssociatedLabel', + 'passwordHasLabel', + 'checkboxHasLabel', + 'radioHasLabel', + 'aLinksMakeSenseOutOfContext', + 'aSuspiciousLinkText', + 'documentHasTitleElement', + 'documentTitleNotEmpty', + 'documentTitleIsShort', + 'documentTitleIsNotPlaceholder', + 'documentTitleDescribesDocument', + 'svgContainsTitle', + 'cssTextHasContrast', + 'headersHaveText', + ); +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/.svn/text-base/wcag1aaa.php.svn-base b/quail/guidelines/.svn/text-base/wcag1aaa.php.svn-base new file mode 100644 index 0000000..3110ff2 --- /dev/null +++ b/quail/guidelines/.svn/text-base/wcag1aaa.php.svn-base @@ -0,0 +1,154 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup guidelines */ +/*@{*/ + +/** +* WCAG 1.0 Level AAA Guideline +*/ +class Wcag1aaaGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgNonDecorativeHasAlt', + 'imgImportantNoSpacerAlt', + 'imgHasLongDesc', + 'imgAltIsSameInText', + 'aLinksToSoundFilesNeedTranscripts', + 'aLinksToMultiMediaRequireTranscript', + 'appletContainsTextEquivalentInAlt', + 'frameRelationshipsMustBeDescribed', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'areaHasAltValue', + 'areaAltIdentifiesDestination', + 'areaLinksToSoundFile', + 'objectTextUpdatesWhenObjectChanges', + 'objectContentUsableWhenDisabled', + 'objectLinkToMultimediaHasTextTranscript', + 'objectMustHaveTitle', + 'objectMustHaveValidTitle', + 'objectMustContainText', + 'objectWithClassIDHasNoText', + 'imgMapAreasHaveDuplicateLink', + 'imgNotReferredToByColorAlone', + 'appletsDoneUseColorAlone', + 'inputDoesNotUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'documentWordsNotInLanguageAreMarked', + 'tableDataShouldHaveTh', + 'cssDocumentMakesSenseStyleTurnedOff', + 'documentContentReadableWithoutStylesheets', + 'objectTextUpdatesWhenObjectChanges', + 'objectWithClassIDHasNoText', + 'appletContainsTextEquivalent', + 'objectContentUsableWhenDisabled', + 'objectUIMustBeAccessible', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'appletUIMustBeAccessible', + 'objectInterfaceIsAccessible', + 'scriptUIMustBeAccessible', + 'imgWithMapHasUseMap', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'imgWithMathShouldHaveMathEquivalent', + 'documentValidatesToDocType', + 'basefontIsNotUsed', + 'fontIsNotUsed', + 'headerH1', + 'headerH2', + 'headerH3', + 'headerH4', + 'headerH1Format', + 'headerH2Format', + 'headerH3Format', + 'headerH4Format', + 'headerH5Format', + 'headerH6Format', + 'menuNotUsedToFormatText', + 'listNotUsedForFormatting', + 'blockquoteNotUsedForIndentation', + 'tableLayoutDataShouldNotHaveTh', + 'scriptOnclickRequiresOnKeypress', + 'scriptOndblclickRequiresOnKeypress', + 'scriptOnmousedownRequiresOnKeypress', + 'scriptOnmousemove', + 'scriptOnmouseoutHasOnmouseblur', + 'scriptOnmouseoverHasOnfocus', + 'scriptOnmouseupHasOnkeyup', + 'framesetMustHaveNoFramesSection', + 'noframesSectionMustHaveTextEquivalent', + 'blinkIsNotUsed', + 'marqueeIsNotUsed', + 'documentMetaNotUsedWithTimeout', + 'documentAutoRedirectNotUsed', + 'aLinksDontOpenNewWindow', + 'areaDontOpenNewWindow', + 'textareaLabelPositionedClose', + 'passwordLabelIsNearby', + 'checkboxLabelIsNearby', + 'fileLabelIsNearby', + 'radioLabelIsNearby', + 'frameRelationshipsMustBeDescribed', + 'inputTextHasLabel', + 'selectHasAssociatedLabel', + 'textareaHasAssociatedLabel', + 'passwordHasLabel', + 'checkboxHasLabel', + 'radioHasLabel', + 'aLinksMakeSenseOutOfContext', + 'aSuspiciousLinkText', + 'documentHasTitleElement', + 'documentTitleNotEmpty', + 'documentTitleIsShort', + 'documentTitleIsNotPlaceholder', + 'documentTitleDescribesDocument', + 'addressForAuthor', + 'imgMapAreasHaveDuplicateLink', + 'documentAbbrIsUsed', + 'documentAcronymsHaveElement', + 'documentLangNotIdentified', + 'documentLangIsISO639Standard', + 'tableComplexHasSummary', + 'tableSummaryIsEmpty', + 'tableSummaryIsSufficient', + 'tableLayoutHasNoSummary', + 'inputTextHasTabIndex', + 'inputRadioHasTabIndex', + 'inputPasswordHasTabIndex', + 'inputCheckboxHasTabIndex', + 'inputFileHasTabIndex', + 'aLinksAreSeperatedByPrintableCharacters', + 'skipToContentLinkProvided', + 'svgContainsTitle', + 'cssTextHasContrast', + 'headersHaveText', + ); + +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/.svn/text-base/wcag2a.php.svn-base b/quail/guidelines/.svn/text-base/wcag2a.php.svn-base new file mode 100644 index 0000000..ec3d538 --- /dev/null +++ b/quail/guidelines/.svn/text-base/wcag2a.php.svn-base @@ -0,0 +1,146 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup guidelines */ +/*@{*/ + +/** +* WCAG 2.0 Level A Guideline +*/ +class Wcag2aGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgAltIsDifferent', + 'imgAltIsTooLong', + 'imgAltNotPlaceHolder', + 'imgAltNotEmptyInAnchor', + 'imgHasLongDesc', + 'imgAltIsSameInText', + 'imgAltEmptyForDecorativeImages', + 'appletContainsTextEquivalentInAlt', + 'appletContainsTextEquivalent', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'inputImageAltIsShort', + 'inputImageAltIsNotPlaceholder', + 'areaHasAltValue', + 'areaAltIdentifiesDestination', + 'areaLinksToSoundFile', + 'objectMustContainText', + 'embedHasAssociatedNoEmbed', + 'inputImageNotDecorative', + 'areaAltRefersToText', + 'inputElementsDontHaveAlt', + 'aLinksToSoundFilesNeedTranscripts', + 'aLinksToMultiMediaRequireTranscript', + 'objectShouldHaveLongDescription', + 'inputTextHasLabel', + 'pNotUsedAsHeader', + 'selectHasAssociatedLabel', + 'textareaHasAssociatedLabel', + 'textareaLabelPositionedClose', + 'tableComplexHasSummary', + 'tableSummaryIsEmpty', + 'tableLayoutHasNoSummary', + 'tableLayoutHasNoCaption', + 'passwordHasLabel', + 'checkboxHasLabel', + 'fileHasLabel', + 'radioHasLabel', + 'passwordLabelIsNearby', + 'checkboxLabelIsNearby', + 'fileLabelIsNearby', + 'radioLabelIsNearby', + 'tableLayoutMakesSenseLinearized', + 'tableLayoutDataShouldNotHaveTh', + 'tableUsesCaption', + 'preShouldNotBeUsedForTabularLayout', + 'radioMarkedWithFieldgroupAndLegend', + 'tableSummaryDescribesTable', + 'tableIsGrouped', + 'tableUseColGroup', + 'tabularDataIsInTable', + 'tableCaptionIdentifiesTable', + 'tableSummaryDoesNotDuplicateCaption', + 'tableWithBothHeadersUseScope', + 'tableWithMoreHeadersUseID', + 'inputCheckboxRequiresFieldset', + 'documentVisualListsAreMarkedUp', + 'documentReadingDirection', + 'tableLayoutMakesSenseLinearized', + 'imgNotReferredToByColorAlone', + 'appletsDoneUseColorAlone', + 'inputDoesNotUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'bodyColorContrast', + 'bodyLinkColorContrast', + 'bodyActiveLinkColorContrast', + 'bodyVisitedLinkColorContrast', + 'documentAllColorsAreSet', + 'appletUIMustBeAccessible', + 'objectInterfaceIsAccessible', + 'scriptUIMustBeAccessible', + 'scriptOndblclickRequiresOnKeypress', + 'scriptOnmousedownRequiresOnKeypress', + 'scriptOnmousemove', + 'scriptOnmouseoutHasOnmouseblur', + 'scriptOnmouseoverHasOnfocus', + 'scriptOnmouseupHasOnkeyup', + 'appletProvidesMechanismToReturnToParent', + 'objectProvidesMechanismToReturnToParent', + 'embedProvidesMechanismToReturnToParent', + 'documentMetaNotUsedWithTimeout', + 'blinkIsNotUsed', + 'marqueeIsNotUsed', + 'documentAutoRedirectNotUsed', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'skipToContentLinkProvided', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'documentHasTitleElement', + 'documentTitleNotEmpty', + 'documentTitleIsShort', + 'documentTitleIsNotPlaceholder', + 'documentTitleDescribesDocument', + 'aLinksMakeSenseOutOfContext', + 'aSuspiciousLinkText', + 'aMustContainText', + 'documentLangNotIdentified', + 'documentLangIsISO639Standard', + 'documentWordsNotInLanguageAreMarked', + 'areaDontOpenNewWindow', + 'selectDoesNotChangeContext', + 'labelMustBeUnique', + 'labelMustNotBeEmpty', + 'formWithRequiredLabel', + 'documentIDsMustBeUnique', + 'svgContainsTitle', + 'headersHaveText', + ); +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/.svn/text-base/wcag2aa.php.svn-base b/quail/guidelines/.svn/text-base/wcag2aa.php.svn-base new file mode 100644 index 0000000..94302c8 --- /dev/null +++ b/quail/guidelines/.svn/text-base/wcag2aa.php.svn-base @@ -0,0 +1,171 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup guidelines */ +/*@{*/ + +/** +* WCAG 2.0 Level AA Guideline +*/ +class Wcag2aaGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgAltIsDifferent', + 'imgAltIsTooLong', + 'imgAltNotPlaceHolder', + 'imgAltNotEmptyInAnchor', + 'imgHasLongDesc', + 'imgAltIsSameInText', + 'imgAltEmptyForDecorativeImages', + 'appletContainsTextEquivalentInAlt', + 'appletContainsTextEquivalent', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'inputImageAltIsShort', + 'inputImageAltIsNotPlaceholder', + 'areaHasAltValue', + 'areaAltIdentifiesDestination', + 'areaLinksToSoundFile', + 'objectMustContainText', + 'embedHasAssociatedNoEmbed', + 'inputImageNotDecorative', + 'areaAltRefersToText', + 'inputElementsDontHaveAlt', + 'aLinksToSoundFilesNeedTranscripts', + 'aLinksToMultiMediaRequireTranscript', + 'inputTextHasLabel', + 'pNotUsedAsHeader', + 'selectHasAssociatedLabel', + 'textareaHasAssociatedLabel', + 'textareaLabelPositionedClose', + 'tableComplexHasSummary', + 'tableSummaryIsEmpty', + 'tableLayoutHasNoSummary', + 'tableLayoutHasNoCaption', + 'passwordHasLabel', + 'checkboxHasLabel', + 'fileHasLabel', + 'radioHasLabel', + 'passwordLabelIsNearby', + 'checkboxLabelIsNearby', + 'fileLabelIsNearby', + 'radioLabelIsNearby', + 'tableDataShouldHaveTh', + 'tableLayoutDataShouldNotHaveTh', + 'tableUsesCaption', + 'preShouldNotBeUsedForTabularLayout', + 'radioMarkedWithFieldgroupAndLegend', + 'tableSummaryDescribesTable', + 'tableIsGrouped', + 'tableUseColGroup', + 'tabularDataIsInTable', + 'tableCaptionIdentifiesTable', + 'tableSummaryDoesNotDuplicateCaption', + 'tableWithBothHeadersUseScope', + 'tableWithMoreHeadersUseID', + 'inputCheckboxRequiresFieldset', + 'documentVisualListsAreMarkedUp', + 'documentReadingDirection', + 'tableLayoutMakesSenseLinearized', + 'appletUIMustBeAccessible', + 'objectInterfaceIsAccessible', + 'scriptUIMustBeAccessible', + 'scriptOndblclickRequiresOnKeypress', + 'scriptOnmousedownRequiresOnKeypress', + 'scriptOnmousemove', + 'scriptOnmouseoutHasOnmouseblur', + 'scriptOnmouseoverHasOnfocus', + 'scriptOnmouseupHasOnkeyup', + 'documentMetaNotUsedWithTimeout', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'skipToContentLinkProvided', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'documentWordsNotInLanguageAreMarked', + 'documentLangNotIdentified', + 'documentLangIsISO639Standard', + 'areaDontOpenNewWindow', + 'selectDoesNotChangeContext', + 'documentIDsMustBeUnique', + 'objectShouldHaveLongDescription', + 'blinkIsNotUsed', + 'marqueeIsNotUsed', + 'documentAutoRedirectNotUsed', + 'documentHasTitleElement', + 'documentTitleNotEmpty', + 'documentTitleIsShort', + 'documentTitleIsNotPlaceholder', + 'documentTitleDescribesDocument', + 'appletProvidesMechanismToReturnToParent', + 'objectProvidesMechanismToReturnToParent', + 'embedProvidesMechanismToReturnToParent', + 'imgAltIsSameInText', + 'boldIsNotUsed', + 'iIsNotUsed', + 'basefontIsNotUsed', + 'fontIsNotUsed', + 'bodyColorContrast', + 'bodyLinkColorContrast', + 'bodyActiveLinkColorContrast', + 'bodyVisitedLinkColorContrast', + 'imgNotReferredToByColorAlone', + 'appletsDoneUseColorAlone', + 'inputDoesNotUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'documentAllColorsAreSet', + 'aLinksMakeSenseOutOfContext', + 'aSuspiciousLinkText', + 'aMustContainText', + 'siteMap', + 'headerH1', + 'headerH2', + 'headerH3', + 'headerH4', + 'headerH4', + 'headerH1Format', + 'headerH2Format', + 'headerH3Format', + 'headerH4Format', + 'headerH5Format', + 'headerH6Format', + 'tabIndexFollowsLogicalOrder', + 'listNotUsedForFormatting', + 'blockquoteNotUsedForIndentation', + 'blockquoteUseForQuotations', + 'labelMustBeUnique', + 'labelMustNotBeEmpty', + 'formWithRequiredLabel', + 'formHasGoodErrorMessage', + 'formErrorMessageHelpsUser', + 'formDeleteIsReversable', + 'svgContainsTitle', + 'cssTextHasContrast', + 'headersHaveText', + ); +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/.svn/text-base/wcag2aaa.php.svn-base b/quail/guidelines/.svn/text-base/wcag2aaa.php.svn-base new file mode 100644 index 0000000..1277d3d --- /dev/null +++ b/quail/guidelines/.svn/text-base/wcag2aaa.php.svn-base @@ -0,0 +1,175 @@ +. +* @author Kevin Miller +*/ + + +/** \addtogroup guidelines */ +/*@{*/ + +/** +* WCAG 2.0 Level AAA Guideline +*/ +class Wcag2aaaGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgAltIsDifferent', + 'imgAltIsTooLong', + 'imgAltNotPlaceHolder', + 'imgAltNotEmptyInAnchor', + 'imgHasLongDesc', + 'imgAltIsSameInText', + 'imgAltEmptyForDecorativeImages', + 'appletContainsTextEquivalentInAlt', + 'appletContainsTextEquivalent', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'inputImageAltIsShort', + 'inputImageAltIsNotPlaceholder', + 'areaHasAltValue', + 'areaAltIdentifiesDestination', + 'objectMustContainText', + 'embedHasAssociatedNoEmbed', + 'inputImageNotDecorative', + 'inputElementsDontHaveAlt', + 'aLinksToSoundFilesNeedTranscripts', + 'aLinksToMultiMediaRequireTranscript', + 'objectShouldHaveLongDescription', + 'inputTextHasLabel', + 'pNotUsedAsHeader', + 'selectHasAssociatedLabel', + 'textareaHasAssociatedLabel', + 'textareaLabelPositionedClose', + 'tableComplexHasSummary', + 'tableSummaryIsEmpty', + 'tableLayoutHasNoSummary', + 'tableLayoutHasNoCaption', + 'passwordHasLabel', + 'checkboxHasLabel', + 'fileHasLabel', + 'radioHasLabel', + 'passwordLabelIsNearby', + 'checkboxLabelIsNearby', + 'fileLabelIsNearby', + 'radioLabelIsNearby', + 'tableDataShouldHaveTh', + 'tableLayoutDataShouldNotHaveTh', + 'tableUsesCaption', + 'preShouldNotBeUsedForTabularLayout', + 'radioMarkedWithFieldgroupAndLegend', + 'tableSummaryDescribesTable', + 'tableIsGrouped', + 'tableUseColGroup', + 'tabularDataIsInTable', + 'tableCaptionIdentifiesTable', + 'tableSummaryDoesNotDuplicateCaption', + 'tableWithBothHeadersUseScope', + 'tableWithMoreHeadersUseID', + 'inputCheckboxRequiresFieldset', + 'documentVisualListsAreMarkedUp', + 'documentReadingDirection', + 'tableLayoutMakesSenseLinearized', + 'boldIsNotUsed', + 'iIsNotUsed', + 'basefontIsNotUsed', + 'fontIsNotUsed', + 'inputDoesNotUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'bodyColorContrast', + 'bodyLinkColorContrast', + 'bodyActiveLinkColorContrast', + 'bodyVisitedLinkColorContrast', + 'documentAllColorsAreSet', + 'bodyColorContrast', + 'bodyLinkColorContrast', + 'bodyActiveLinkColorContrast', + 'bodyVisitedLinkColorContrast', + 'objectInterfaceIsAccessible', + 'scriptUIMustBeAccessible', + 'scriptOndblclickRequiresOnKeypress', + 'scriptOnmousedownRequiresOnKeypress', + 'scriptOnmousemove', + 'scriptOnmouseoutHasOnmouseblur', + 'scriptOnmouseoverHasOnfocus', + 'scriptOnmouseupHasOnkeyup', + 'appletProvidesMechanismToReturnToParent', + 'objectProvidesMechanismToReturnToParent', + 'embedProvidesMechanismToReturnToParent', + 'documentMetaNotUsedWithTimeout', + 'blinkIsNotUsed', + 'marqueeIsNotUsed', + 'documentAutoRedirectNotUsed', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'skipToContentLinkProvided', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'documentHasTitleElement', + 'documentTitleNotEmpty', + 'documentTitleIsShort', + 'documentTitleIsNotPlaceholder', + 'documentTitleDescribesDocument', + 'aMustContainText', + 'siteMap', + 'headerH1', + 'headerH2', + 'headerH3', + 'headerH4', + 'headerH4', + 'headerH1Format', + 'headerH2Format', + 'headerH3Format', + 'headerH4Format', + 'headerH5Format', + 'headerH6Format', + 'headersUseToMarkSections', + 'documentLangNotIdentified', + 'documentLangIsISO639Standard', + 'documentWordsNotInLanguageAreMarked', + 'selectDoesNotChangeContext', + 'tabIndexFollowsLogicalOrder', + 'listNotUsedForFormatting', + 'blockquoteNotUsedForIndentation', + 'blockquoteUseForQuotations', + 'aLinksDontOpenNewWindow', + 'documentIDsMustBeUnique', + 'imgAltIsSameInText', + 'documentAbbrIsUsed', + 'documentAcronymsHaveElement', + 'labelMustBeUnique', + 'labelMustNotBeEmpty', + 'formWithRequiredLabel', + 'formHasGoodErrorMessage', + 'formErrorMessageHelpsUser', + 'formDeleteIsReversable', + 'formErrorMessageHelpsUser', + 'formDeleteIsReversable', + 'svgContainsTitle', + 'documentIsWrittenClearly', + 'cssTextHasContrast', + 'headersHaveText', + ); +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/all.php b/quail/guidelines/all.php new file mode 100644 index 0000000..3966a8c --- /dev/null +++ b/quail/guidelines/all.php @@ -0,0 +1,51 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup guidelines */ +/*@{*/ + +/** + * A list of all tests. This is useful for other services that need to provide + * lists of all available tests. + * + */ + +class AllGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array(); + + /** + * We are overriding the parent run method to load + * a list of all classes which extend quailTest. + */ + function run($arg = null, $language = 'en') { + foreach(get_declared_classes() as $classname) { + $parents = class_parents($classname); + if(isset($parents['quailTest']) && substr($classname, 0, 5) != 'quail') { + $this->tests[] = $classname; + } + } + parent::run($arg, $language); + } +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/section508.php b/quail/guidelines/section508.php new file mode 100644 index 0000000..3e24887 --- /dev/null +++ b/quail/guidelines/section508.php @@ -0,0 +1,86 @@ +. +* @author Kevin Miller +*/ + + +/** \addtogroup guidelines */ +/*@{*/ + +/** + * Section 508 Guideline + */ +class Section508Guideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgAltIsDifferent', + 'imgAltIsTooLong', + 'imgNonDecorativeHasAlt', + 'imgImportantNoSpacerAlt', + 'imgAltNotPlaceHolder', + 'imgAltNotEmptyInAnchor', + 'imgAltIsSameInText', + 'objectTextUpdatesWhenObjectChanges', + 'objectLinkToMultimediaHasTextTranscript', + 'objectMustContainText', + 'scriptInBodyMustHaveNoscript', + 'aLinksToMultiMediaRequireTranscript', + 'imgNotReferredToByColorAlone', + 'appletsDoneUseColorAlone', + 'inputDoesNotUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'imgMapAreasHaveDuplicateLink', + 'imgWithMapHasUseMap', + 'tableDataShouldHaveTh', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'frameSrcIsAccessible', + 'frameRelationshipsMustBeDescribed', + 'framesetMustHaveNoFramesSection', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'scriptInBodyMustHaveNoscript', + 'appletContainsTextEquivalentInAlt', + 'appletContainsTextEquivalent', + 'appletUIMustBeAccessible', + 'inputTextHasLabel', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'inputImageAltIsShort', + 'inputImageAltIsNotFileName', + 'inputImageAltIsNotPlaceholder', + 'inputTextHasValue', + 'selectHasAssociatedLabel', + 'passwordHasLabel', + 'checkboxHasLabel', + 'fileHasLabel', + 'radioHasLabel', + 'skipToContentLinkProvided', + 'documentAutoRedirectNotUsed', + 'documentMetaNotUsedWithTimeout', + 'headersHaveText', + ); +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/translations/.svn/all-wcprops b/quail/guidelines/translations/.svn/all-wcprops new file mode 100644 index 0000000..dcdacb1 --- /dev/null +++ b/quail/guidelines/translations/.svn/all-wcprops @@ -0,0 +1,11 @@ +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/quail/guidelines/translations +END +en.txt +K 25 +svn:wc:ra_dav:version-url +V 65 +/svn/!svn/ver/232/tags/0.4.1/quail/guidelines/translations/en.txt +END diff --git a/quail/guidelines/translations/.svn/entries b/quail/guidelines/translations/.svn/entries new file mode 100644 index 0000000..8101b3d --- /dev/null +++ b/quail/guidelines/translations/.svn/entries @@ -0,0 +1,62 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/quail/guidelines/translations +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-08-21T07:01:43.361020Z +224 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +en.txt +file + + + + +2010-12-08T21:44:08.000000Z +90192354ef7812ae5403a019e4622001 +2010-08-21T07:01:43.361020Z +224 +keveemiller + + + + + + + + + + + + + + + + + + + + + +94809 + diff --git a/quail/guidelines/translations/.svn/text-base/en.txt.svn-base b/quail/guidelines/translations/.svn/text-base/en.txt.svn-base new file mode 100644 index 0000000..9889ee9 --- /dev/null +++ b/quail/guidelines/translations/.svn/text-base/en.txt.svn-base @@ -0,0 +1,239 @@ +"imgHasAlt","Image elements must have an ""alt"" attribute","

All img elements must have an alt attribute

Example

Wrong

<img src=""dog.jpg"">

Right

<img src=""dog.jpg"" alt=""A photograph of a dog"">

","1" +"imgAltIsDifferent","Image ""alt"" attributes should not be the same as the filename","

All img elements should have an ""alt"" attribute that is not just the name of the file, unless the filename communicates everything about the file.

Example

Wrong

<img src=""dog.jpg"" alt=""dog.jpg"">

Right

<img src=""dog.jpg"" alt=""A photograph of a dog"">

","1" +"imgAltIsTooLong","Image Alt text is short","

All ""alt"" attributes for img elements should be clear and concise. ""Alt"" attributes over 100 characters long should be reviewed to see if they are too long.

Example

Wrong

<img src=""dog.jpg"" alt=""A photograph of my very, very, very special dog whom I love so much. He is a very good dog, a loving dog, and my constant companion these many years. Yes, all agree, my dog is a good dog."">

Right

<img src=""dog.jpg"" alt=""A photograph of a dog"">

","1" +"imgNonDecorativeHasAlt","Any non-decorative images should have a non-empty ""alt"" attribute","

Any image that is not used decorativey or which is purely for layout purposes cannot have an empty ""alt"" attribute.

Example

Wrong

<img src=""dog.jpg"" alt="""">

Right

<img src=""dog.jpg"" alt=""A photograph of a dog"">

","2" +"imgImportantNoSpacerAlt","Images that are important should not have a purely white-space ""alt"" attribute","

Any image that is not used decorativey or which is purely for layout purposes cannot have an ""alt"" attribute that consists solely of white space (i.e. a space, or a new line).

Example

Wrong

<img src=""dog.jpg"" alt="" "">

Right

<img src=""dog.jpg"" alt=""A photograph of a dog"">

","1" +"imgAltNotPlaceHolder","Images should not have a simple placeholder text as an ""alt"" attribute","

Any image that is not used decorativey or which is purely for layout purposes cannot have an ""alt"" attribute that consists solely of placeholders. Placeholders include:

  • nbsp
  • &nbsp;
  • spacer
  • image
  • img
  • photo

Example

Wrong

<img src=""dog.jpg"" alt=""image"">

Right

<img src=""dog.jpg"" alt=""A photograph of a dog"">

","1" +"imgAltNotEmptyInAnchor","An image within a link cannot have an empty ""alt"" attribute if there is no other text within the link","

Any image that is within a link (an a element) that has no other text cannot have an empty or missing ""alt"" attribute.

Example

Wrong

<a href=""index.html""><img src=""home.png"" alt="""">

Right

<a href=""index.html""><img src=""home.png"" alt=""Return Home""></a>

","1" +"imgHasLongDesc","A ""longdesc"" attribute is required for any image where additional information not in the ""alt"" attribute is required","

Any image that has an ""alt"" attribute that does not fully convey the meaning of the image must have a ""longdesc"" attribute.

Example

Wrong

<img src=""complexImage.png"" alt=""A complex image that cannot be described succinctly."">

Right

<img src=""complexImage.png"" alt=""A complex image that cannot be described succinctly."" longdesc=""longer_description.html"">

","1" +"imgNeedsLongDescWDlink","An image with a ""longdesc"" attribute should have a corresponding description link","

Any image that has a ""longdesc"" attribute must also have a corresponding ""d-link,"" or Description link. This should point to the same resource as the ""longdesc"" attribute and should only contain the text ""d"".

Example

Wrong

<img src=""complexImage.png"" alt=""A complex image that cannot be described succinctly."" longdesc=""longer_description.html"">

Right

<img src=""complexImage.png"" alt=""A complex image that cannot be described succinctly."" longdesc=""longer_description.html""><a href=""longer_description.html"">d</a>

","1" +"imgGifNoFlicker","Any animated GIF should not flicker","

Animated GIF files should not flicker with a frequency over 2 Hz and lower than 55 Hz. You can check the flicker rate of this GIF using an online tool.

","1" +"imgAltIsSameInText","Check that any text within an image is also in the ""alt"" attribute","

If an image has text within it, that text should be repeated in the ""alt"" attribute, unless the text is purely decorative.

","3" +"imgWithMapHasUseMap","Any image with an ""ismap"" attribute have a valid ""usemap"" attribute","

If an image has an ""ismap"" attribute, it must also have a ""usemap"" attribute.

","1" +"imgMapAreasHaveDuplicateLink","All links within a client-side image are duplicated elsewhere in the document","

Any image that has a ""usemap"" attribute must have links replicated somewhere else in the document.

Example

Wrong

<p><map name=""imagemap"" id=""map1""><area shape=""poly"" coords=""185,0,355,0,295,123"" href=""horses.html"" alt=""horses""/><area shape=""poly"" coords=""336,202,549,203,549"" href=""dogs.html"" alt=""dogs""/><area shape=""rect"" coords=""0,10,172,10"" href=""birds.html"" alt=""birds""/></map></p><p><img src=""navigation.gif"" usemap=""#imagemap"" alt=""navigation""/></p>

Right
<map name=""imagemap"" id=""map1""><area shape=""poly"" coords=""185,0,355,0,295,123"" href=""horses.html"" alt=""horses""/><area shape=""poly"" coords=""336,202,549,203,549"" href=""dogs.html"" alt=""dogs""/><area shape=""rect"" coords=""0,10,172,10"" href=""birds.html"" alt=""birds""/></map></p><p><img src=""navigation.gif"" usemap=""#imagemap"" alt=""navigation""/></p><p><a href=""horses.html"">Horses</a> | <a href=""dogs.html"">Dogs</a> | <a href=""birds.html"">Birds</a></p>","1" +"imgNotReferredToByColorAlone","For any image, the ""alt"" text cannot refer to color alone","

The ""alt"" text or content text for any image should not refer to the image by color alone. This is often fixed by changing the ""alt"" text to the meaning of the image, rather than a literal interpretation of the image.

Example

Wrong

<img src=""red-light.png"" alt=""A Red Light"">

Right

<img src=""red-ligh.png"" alt=""Stop!"">

","3" +"imgAltIdentifiesLinkDestination","Any image within a link must have ""alt"" text the describes the link destination","

Any image that is within a link should have an ""alt"" attribute which identifies the destination or purpose of the link.

Example

Wrong

<a href=""home.html""><img src=""home.png"" alt=""A house""></a>

Right

<a href=""home.html""><img src=""home.png"" alt=""Return to the home page""></a>

","3" +"imgAltEmptyForDecorativeImages","If an image is purely decorative, the ""alt"" text must be empty","

Any image that is only decorative (serves no function or adds to the purpose of the page content) should have an ""alt"" attribute, but the ""alt"" text should be empty with no white space.

Example

Wrong

<img src=""decoration.png"" alt=""A nice floral pattern to make things pretty."">

Right

<img src=""decoration.png"" alt="""">

","3" +"aLinksToSoundFilesNeedTranscripts","Any links to a sound file should also include a link to a transcript","

Links to a sound file should be followed by a link to a transcript of the file.

Example

Wrong

<a href=""interview.mp3"">Listen to the interview</a>

Right

<a href=""interview.mp3"">Listen to the interview</a> <a href=""transcript.html"">(transcript)</a>

","3" +"aLinksDontOpenNewWindow","Links should not open a new window without warning","

Links which open a new window using the ""target"" attribute should warn users.

Example

Wrong

<a href=""page.html"">View my page</a>

Right

<a href=""page.html"">View my page (opens new window)</a>

","1" +"aLinksMakeSenseOutOfContext","The text in links should make sense out of context","

All links should make sense out of context. Many non-sighted users skip from link-to-link to navigate a page, and links which do not make sense on their own can make the page difficult to navigate.

Example

Wrong

To know more about me, visit my <a href=""page.html"">page</a>.

Right

To know more about me, <a href=""page.html"">visit my page</a>.

","3" +"aLinksToMultiMediaRequireTranscript","Any links to a multimedia file should also include a link to a transcript","

Links to a multimedia file should be followed by a link to a transcript of the file.

Example

Wrong

<a href=""interview.mov"">Watch the interview</a>

Right

<a href=""interview.mov"">Watch the interview</a> <a href=""transcript.html"">(transcript)</a>

","3" +"appletsDoneUseColorAlone","Applets should not use color alone to communicate content","

Applets should contain content that makes sense without color and is accessible to users who are color blind.

Applets cannot be checked using automated tools, this should be reviewed manually.

","3" +"appletsDoNotFlicker","All applets do not flicker","

Applets should not flicker.

Applets cannot be checked using automated tools, this should be reviewed manually.

","3" +"appletContainsTextEquivalentInAlt","All applets should contain a text equivalent in the ""alt"" attribute","

Applets should contain their text equivalents or description in an ""alt"" attribute.

Example

Wrong

<applet archive=""whyareyouusingapplet.jar""></applet>

Right

<applet archive=""whyareyouusingapplet.jar"" alt=""Why are you still using applets?""></applet>

","2" +"appletContainsTextEquivalent","All applets should contain the same content within the body of the applet","

Applets should contain their text equivalents or description within the applet tag itself.

Example

Wrong

<applet archive=""whyareyouusingapplet.jar""></applet>

Right

<applet archive=""whyareyouusingapplet.jar"">Why are you still using applets?</applet>

","1" +"appletUIMustBeAccessible","Any user interface in an applet must be accessible","

Applet content should be assessed for accessibility.

Applets cannot be checked using automated tools, this should be reviewed manually.

","3" +"blinkIsNotUsed","The ""blink"" tag should not be used","

The blink tag should not be used. Ever.

Example

Wrong

<blink>Please read me!</blink>

Right

<strong>Please read me!</strong>

","1" +"skipToContentLinkProvided","A ""skip to content"" link should exist as one of the first links on the page","

A link reading ""skip to content,"" or using similar wording, should exist at the beginning of the page to help non-sighted or keyboard-using users jump directly to page content.

","2" +"doctypeProvided","The document should contain a valid ""doctype"" declaration","

Each document must contain a valid doctype declaration..

Example

Wrong

<html>

Right

<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Strict//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""><html xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en"">

","1" +"objectDoesNotFlicker","Objects do not flicker","

The content within an object tag must not flicker.

","3" +"framesHaveATitle","All ""frame"" elements should have a ""title"" attribute","

Each frame elements should have a ""title"" attribute.

Example

Wrong

<frame src=""navigation.html""></frame>

Right

<frame src=""navigation.html"" title=""The site navigation""></frame>

","1" +"frameTitlesDescribeFunction","All ""frame"" elemetns should have a ""title"" attribute that describes the purpose of the frame","

Each frame elements should have a ""title"" attribute which describes the purpose or function of the frame.

Example

Wrong

<frame src=""navigation.html""></frame>

Right

<frame src=""navigation.html"" title=""The site navigation""></frame>

","3" +"frameSrcIsAccessible","The source for each frame is accessible content.","

Each frame should contain accessible content, and contain content accessible to screen readers, like HTML as opposed to an image.

","3" +"frameRelationshipsMustBeDescribed","Complex framesets should contain a ""longdesc"" attribute","

If a frameset contains three or more frames, use a ""longdesc"" attribute to help describe the purpose of the frames.

Example

Wrong

<frameset cols=""25%,50%,25%""> <frame src=""frame_1.htm"" /> <frame src=""frame_2.htm"" /> <frame src=""frame_3.htm"" /></frameset>

Right

<frameset cols=""25%,50%,25%"" longdesc=""description.html""> <frame src=""frame_1.htm"" /> <frame src=""frame_2.htm"" /> <frame src=""frame_3.htm"" /></frameset>

","2" +"framesetMustHaveNoFramesSection","All framesets should contain a noframes section","

If a frameset contains three or more frames, use a ""longdesc"" attribute to help describe the purpose of the frames.

Example

Wrong

<frameset cols=""25%,50%,25%""> <frame src=""frame_1.htm"" /> <frame src=""frame_2.htm"" /> <frame src=""frame_3.htm"" /></frameset>

Right

<frameset cols=""25%,50%,25%"" longdesc=""description.html""> <frame src=""frame_1.htm"" /> <frame src=""frame_2.htm"" /> <frame src=""frame_3.htm"" /> <noframes> <body> This is more information for users without frames. It should contain links to all the other frames. </body> </noframes></frameset>

","1" +"noframesSectionMustHaveTextEquivalent","All ""noframes"" elements should contain the text content from all frames","

The noframes content should either replicate or link to the content visible within the frames.

","2" +"headerH1","The header following an h1 is h1 or h2","

The header following an h1 element should either be an h2 or another h1.

Users of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.

+","3" +"headerH2","The header following an h2 is h1, h2 or h3","

The header following an h2 element should either be an h3, h1 or another h2.

Users of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.

","3" +"headerH3","The header following an h3 is h1, h2, h3 or h4","

The header following an h3 element should either be an h4, h2, h1 or another h3.

Users of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.

","3" +"headerH4","The header following an h4 is h1, h2, h3, h4 or h5","

The header following an h4 element should either be an h5, h3, h2, h1, or another h4.

Users of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.

","3" +"headerH5","The header following an h5 is h6 or any header less than h6","

The header following an h5 element should either be an h6, h3, h2, h1, or another h5.

Users of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.

+","3" +"headerH1Format","All h1 elements are not used for formatting","

An h1 element may not be used purely for formatting.

Users of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.

Example

Wrong

<h1>I wanted a line to be bold and large but this is just a regular paragraph.</h1>

Right

<p class=""large-item""><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>

","3" +"headerH2Format","All h2 elements are not used for formatting","

An h2 element may not be used purely for formatting.

Users of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.

Example

Wrong

<h2>I wanted a line to be bold and large but this is just a regular paragraph.</h2>

Right

<p class=""large-item""><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>

","3" +"headerH3Format","All h3 elements are not used for formatting","

An h3 element may not be used purely for formatting.

Users of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.

Example

Wrong

<h3>I wanted a line to be bold and large but this is just a regular paragraph.</h3>

Right

<p class=""large-item""><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>

","3" +"headerH4Format","All h4 elements are not used for formatting","

An h4 element may not be used purely for formatting.

Users of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.

Example

Wrong

<h4>I wanted a line to be bold and large but this is just a regular paragraph.</h4>

Right

<p class=""large-item""><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>

","3" +"headerH5Format","All h5 elements are not used for formatting","

An h5 element may not be used purely for formatting.

Users of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.

Example

Wrong

<h5>I wanted a line to be bold and large but this is just a regular paragraph.</h5>

Right

<p class=""large-item""><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>

","3" +"headerH6Format","All h6 elements are not used for formatting","

An h6 element may not be used purely for formatting.

Users of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.

Example

Wrong

<h6>I wanted a line to be bold and large but this is just a regular paragraph.</h6>

Right

<p class=""large-item""><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>

","3" +"documentLangNotIdentified","The document must have a ""lang"" attribute","

The document should have a default langauge, by setting the ""lang"" attribute in the html element.

Example

Wrong

<html>

Right

<html lang=""en"">

","1" +"documentLangIsISO639Standard","The document's language attribute should be a standard code","

The document should have a default langauge, and that language should use the valid 2 or 3 letter language code according to ISO specification 639.

Example

Wrong

<html lang=""English"">

Right

<html lang=""en"">

","1" +"documentHasTitleElement","The document should have a title element","

The document should have a title element.

Example

Wrong

<html lang=""en""><head></head><body>....

Right

<html lang=""en""><head><title>My Great Web page</title></head><body>....

","1" +"documentTitleNotEmpty","The document should not have an empty title","

The document should have a title element that is not white space

Example

Wrong

<html lang=""en""><head><title> </title></head><body>....

Right

<html lang=""en""><head><title>My Great Web page</title></head><body>....

","1" +"documentTitleIsShort","The document title should be short","

The document title should be short and succinct. This test fails at 150 characters, but authors should consider this to be a suggestion.

Example

Wrong

<html lang=""en""><head><title>A really long title about a page about salamanders that take a long time to read which offers little to the user and is a waste of time.</title></head><body>....

Right

<html lang=""en""><head><title>All about salamanders</title></head><body>....

","2" +"documentTitleIsNotPlaceholder","The document title should not be placeholder text","

The document title should not be wasted placeholder text which does not describe the page.

Example

Wrong

<html lang=""en""><head><title>title</title></head><body>....

Right

<html lang=""en""><head><title>All about salamanders</title></head><body>....

","1" +"documentTitleDescribesDocument","The title describes the document","

The document title should actually describe the page. Often, screen readers use the title to navigate from one window to another.

This test is a suggestion and should be reviewed manually.

Example

Wrong

<html lang=""en""><head><title>Some page about something</title></head><body>....

Right

<html lang=""en""><head><title>All about salamanders</title></head><body>....

","3" +"inputDoesNotUseColorAlone","An ""input"" element should not use color alone","

All input elements should not refer to content by color alone.

","3" +"inputTextHasLabel","All ""input"" elements should have a corresponding ""label""","

All input elements should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

Enter your first name: <input type=""text"" name=""first_name""/>

Right

<label for=""first_name"">Enter your first name:</label> <input id=""first_name"" type=""text"" name=""first_name""/>

","1" +"inputImageHasAlt","All ""input"" elements with a type of ""image"" must have an ""alt"" attribute","

All input elements with a type of ""image"" should have an ""alt"" attribute.

Example

Wrong

<input type=""image"" name=""search"" src=""search.png""/>

Right

<input type=""image"" name=""search"" src=""search.png"" alt=""Search""/>

","1" +"inputImageAltIdentifiesPurpose","All ""input"" elements with a type of ""image"" must have an ""alt"" attribute that describes the function of the input","

All input elements with a type of ""image"" should have an ""alt"" attribute, and that attribute should describe the function of the image.

Example

Wrong

<input type=""image"" name=""search"" src=""search.png"" alt=""A Button""/>

Right

<input type=""image"" name=""search"" src=""search.png"" alt=""Search""/>

","3" +"inputImageAltIsShort","All ""input"" elements with a type of ""image"" must have an ""alt"" attribute which is as short as possible","

All input elements with a type of ""image"" should have an ""alt"" attribute, and that attribute should be as short as possible. This test will fail if the ""alt"" text is over 100 characters long.

Example

Wrong

<input type=""image"" name=""search"" src=""select_home.png"" alt=""Select this as a house which you would consider purchasing at a later time if it might strike your fancy to do so.""/>

Right

<input type=""image"" name=""search"" src=""select_home.png"" alt=""Select house""/>

","1" +"inputImageAltIsNotFileName","All ""input"" elements with a type of ""image"" must have an ""alt"" attribute which is not the same as the filename","

All input elements with a type of ""image"" should have an ""alt"" attribute, and that attribute should not just be the file name.

Example

Wrong

<input type=""image"" name=""search"" src=""select_home.png"" alt=""select_home.png""/>

Right

<input type=""image"" name=""search"" src=""select_home.png"" alt=""Select house""/>

","1" +"inputImageAltIsNotPlaceholder","All ""input"" elements with a type of ""image"" must have an ""alt"" attribute which is not placeholder text","

All input elements with a type of ""image"" should have an ""alt"" attribute, and that attribute should not just be placeholder text like ""image"" or ""button"".

Example

Wrong

<input type=""image"" name=""search"" src=""search.png"" alt=""image""/>

Right

<input type=""image"" name=""search"" src=""search.png"" alt=""Search""/>

","1" +"inputTextHasValue","All ""input"" elements of type ""text"" must have a default text","

All input elements with a type of ""text"" should have a default text.

Example

Wrong

<label for=""search"">Search: </label><input type=""text"" name=""search"" id=""search""/>

Right

<label for=""search"">Search: </label><input type=""text"" name=""search"" id=""search"" value=""Search""/>

","1" +"areaHasAltValue","All ""area"" elements must have an ""alt"" attribute","

All area elements within a map must have an ""alt"" attribute.

Example

Wrong

<map name=""worldmap""> <area shape=""rect"" coords=""0,0,82,126"" href=""north-america.htm""/> </map>

Right

<map name=""worldmap""> <area shape=""rect"" coords=""0,0,82,126"" href=""north-america.htm"" alt=""North America""/> </map>

","1" +"areaAltIdentifiesDestination","All ""area"" elements must have an ""alt"" attribute which describes the link destination","

All area elements within a map must have an ""alt"" attribute, and that ""alt"" attribute should describe the link destination or function

Example

Wrong

<map name=""worldmap""> <area shape=""rect"" coords=""0,0,82,126"" href=""north-america.htm"" alt=""A green blob in the middle of an ocean""/> </map>

Right

<map name=""worldmap""> <area shape=""rect"" coords=""0,0,82,126"" href=""north-america.htm"" alt=""North America""/> </map>

","3" +"areaLinksToSoundFile","All ""area"" elements which link to a sound file should also provide a link to a transcript","

All area elements which link to a sound file should have a text transcript

Example

Wrong

<map name=""people""> <area shape=""rect"" coords=""0,0,82,126"" href=""janet.mp3"" alt=""Listen to Janet""/> </map>

Right

<map name=""people""> <area shape=""rect"" coords=""0,0,82,126"" href=""janet.mp3"" alt=""Listen to Janet""/> </map><a href=""janet-transcript.html"">Read transcript of Janet.</a>

","3" +"areaDontOpenNewWindow","No ""area"" elements should open a new window without warning","

No area elements should open a new window without warning.

Example

Wrong

<map name=""worldmap""> <area shape=""rect"" coords=""0,0,82,126"" href=""north-america.htm"" target=""_blank"" alt=""North America""/> </map>

Right

<map name=""worldmap""> <area shape=""rect"" coords=""0,0,82,126"" href=""north-america.htm"" target=""_blank"" alt=""North America (opens a new window)""/> </map>

","1" +"marqueeIsNotUsed","The ""marquee"" tag should not be used","

The marquee element is difficult for users to read and is not a standard HTML element. Try to find another way to convey the importance of this text.

Example

Wrong

<marquee>This is really hard to read</marquee>

Right

<strong>This is much easier to read</strong>

","1" +"menuNotUsedToFormatText","""Menu"" elements should not be used for formattin","

Menu is a deprecated tag, but is still honored in a transitional DTD. Menu tags are to provide structure for a document and should not be used for formatting. If a menu tag is to be used, it should only contain an ordered or unordered list of links.

Example

Wrong

<menu>Something I wanted Indented</menu>

Right

<p style=""margin-left: 20px;"">Something I wanted indented.</p>

","3" +"documentAutoRedirectNotUsed","Auto-redirect with ""meta"" elements must not be used","

Because different users have different speeds and abilities when it comes to parsing the content of a page, a ""meta-refresh"" method to redirect users can prevent users from fully understanding the document before being redirected. If a pure redirect is needed, use an HTTP 302 code or similar, and if not, just provide a simple page with a link to the newest page.

Example

Wrong

<head><meta http-equiv=""refresh"" content=""2;url=http://example.com""></head>

Right

<head></head><body><a href=""http://example.com"">Continue to example.com</a></body>

","1" +"documentMetaNotUsedWithTimeout","""Meta"" elements must not be used to refresh the content of a page","

Because different users have different speeds and abilities when it comes to parsing the content of a page, a ""meta-refresh"" method to reload the content of the page can prevent users from having full access to the content. Try to use a ""refresh this"" link instead..

Example

Wrong

<head><meta http-equiv=""refresh"" content=""60""></head>

Right

<head></head><body><a href=""here.html"">Refresh</a></body>

","1" +"objectDoesNotUseColorAlone","Objects must not use color to communicate alone","

Objects should contain content that makes sense without color and is accessible to users who are color blind.

Objects cannot be checked using automated tools, this should be reviewed manually.

","3" +"objectTextUpdatesWhenObjectChanges","The text equivalents of an object should update if the object changes","

If an object changes, the text equivalent of that object should also change.

Objects cannot be checked using automated tools, this should be reviewed manually.

","3" +"objectContentUsableWhenDisabled","When objects are disabled, content should still be available","

The content within objects should still be available, even if the object is disabled. To do this, place a link to the direct object source within the object tag.

Example

Wrong

<object src=""something.html""></object>

Right

<object src=""something.html""><a href=""something.html"">Read something</a></object>

","3" +"objectInterfaceIsAccessible","Interfaces within objects must be accessible","

Object content should be assessed for accessibility.

Objects cannot be checked using automated tools, this should be reviewed manually.

","3" +"objectLinkToMultimediaHasTextTranscript","Objects which reference multimedia files should also provide a link to a transcript","

If an object contains a video, a link to the transcript should be provided near the object.

Example

Wrong

<object src=""video.mov""></object>

Right

<object src=""video.mov""></object><a href=""transcript.html"">Read Transcript of the video</a>

","3" +"objectMustHaveTitle","Objects should have a title attribute","

All object elements should contain a ""title"" attribute.

Example

Wrong

<object src=""widget.html""></object>

Right

<object src=""widget.html"" title=""A small web widget""></object>

","1" +"objectMustHaveValidTitle","Objects must not have an empty title attribute","

All object elements should have a ""title"" attribute which is not empty.

Example

Wrong

<object src=""widget.html"" title=""""></object>

Right

<object src=""widget.html"" title=""A small web widget""></object>

","1" +"objectMustContainText","Objects must contain their text equivalents","

All object elements should contain a text equivalent if the object cannot be rendered.

Example

Wrong

<object src=""widget.html"" title=""""></object>

Right

<object src=""widget.html"" title=""A small web widget"">A widget of stock prices. <a href=""widget.html"">Access this widget.</a></object>

","1" +"listNotUsedForFormatting","Lists should not be used for formatting","

Lists like ul and ol are to provide a structured list, and should not be used to format text. This test views any list with just one item as suspicious, but should be manually reviewed.

Example

Wrong

<ul><li>Something I just wanted indented</li></ul>

Right

<p style=""margin-left: 10px;"">Something I just wanted indented</p>

","3" +"pNotUsedAsHeader","Paragraphs must not be used for headers","

Headers like h1-h6 are extremely useful for non-sighted users to navigate the structure of the page, and formatting a paragraph to just be big or bold, while it might visually look like a header, does not make it one.

Example

Wrong

<p><strong>Something that really should be a header</strong></p>

Right

<h3>Something that really should be a header</h3>

","1" +"scriptsDoNotUseColorAlone","The interface in scripts should not use color alone","

All scripts should be assessed to see if their interface does not have an interface which requires distinguishing beteween colors alone.

","3" +"scriptsDoNotFlicker","Scripts should not cause the screen to flicker","

All scripts should be assessed to see if their interface does not flicker.

","3" +"scriptContentAccessibleWithScriptsTurnedOff","Content on the page should still be available if scripts are disabled","

All scripts should be assessed to see if, when the user is browing with scrips turned off, the page content is still available.

","3" +"scriptUIMustBeAccessible","The user interface for scripts should be accessible","

All scripts should be assessed to see if their interface is accessible.

","3" +"scriptInBodyMustHaveNoscript","Scripts should have a corresponding ""noscript"" element","

Scripts should be followed by a noscripts element to guide the user to content in an alternative way.

Example

Wrong

<script type=""text/javascript"">document.write(""Hello World!"")</script>

Right

<script type=""text/javascript"">document.write(""Hello World!"")</script><noscript>Hello, World!</noscript>

","1" +"selectHasAssociatedLabel","All select elements have an explicitly associated label.","

All select elements should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

Select your state: <select name=""state"">...

Right

<label for=""state"">Select your state:</label> <select id=""state"" name=""state"">...

","1" +"selectDoesNotChangeContext","""Select"" elemetns must not contain an ""onchange"" attribute","

Actions like ""onchange"" can take control away from users who are trying to navigate the page. Using an ""onchange"" attribute for things like select-list menus should instead be replaced with a drop-down and a button which initiates the action.

Example

Wrong

<form><select onchange=""location = this.options[this.selectedIndex].value;""><option value=""home.html"">Home Page</option><option value=""dog.html"">My Dog</option></select></form>

Right

<form action=""go.html""><select><option value=""home.html"">Home Page</option><option value=""dog.html"">My Dog</option></select><input type=""submit"" value=""Go""/></form>

","1" +"textareaHasAssociatedLabel","All textareas should have a corresponding label","

All textarea elements should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

Enter your essay: <textarea name=""essay""></textarea>

Right

<label for=""essay"">Enter your essay:</label> <textarea id=""essay"" name=""essay""></textarea>

","1" +"textareaLabelPositionedClose","All textareas should have a label that is close to it","

All textarea elements should have a corresponding label element that is close in proximity..

Example

Wrong

<label for=""essay"">Enter your essay:</label> [... lots of stuff ...] <textarea id=""essay"" name=""essay""></textarea>

Right

<label for=""essay"">Enter your essay:</label> <textarea id=""essay"" name=""essay""></textarea>

","2" +"cssDocumentMakesSenseStyleTurnedOff","The document must be readable with styles turned off","

With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear.

","3" +"documentAbbrIsUsed","Abbreviations must be marked with an ""abbr"" element","

Abbreviations should be marked with an abbr element, at least once on the page for each abbreviation.

Example

Wrong

<p>I work for the CIA.</p>

Right

<p>I work for the <abbr title=""Central Intelligence Agency"">CIA</abbr>.</p>

","2" +"documentAcronymsHaveElement","Acronyms must be marked with an ""acronym"" element","

Abbreviations should be marked with an acronym element, at least once on the page for each abbreviation.

Example

Wrong

<p>I work for the CIA.</p>

Right

<p>I work for the <acronym title=""Central Intelligence Agency"">CIA</acronym>.</p>

","2" +"blockquoteNotUsedForIndentation","The ""blockquote"" tag should not be used just for indentation","

Blockquote tags are for actual long passages of quoted material, not just for formatting. Instead of using blockquote to indent content, use style sheets.

Automated tests cannot tell if this is an actual quote or not, so the content of any blockquote should be reviwed manually to see if it is an actual quote or not.

Example

Wrong

<blockquote>Something I just wanted indented.</blockquote>

Right

<p style=""margin-left: 20px;"">Something I just wanted indented.</p>

","2" +"scriptOnclickRequiresOnKeypress","If an element has an ""onclick"" attribute, it should also have an ""onkeypress"" attribute","

If an element has an ""onclick"" attribute, it should also have an ""onkeypress"" attribute. This helps ensure that users who only have the keyboard can access the features as well.

Example

Wrong

<a onclick=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a onclick=""alert('Hello, there');"" onkeypress=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"scriptOndblclickRequiresOnKeypress","Any element with an ""ondblclick"" attribute shoul have a keyboard-related action as well","

If an element has an ""ondblclick"" attribute, it should also have an attribute that would make the action available with the keyboard only.

Example

Wrong

<a ondblclick=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a ondblclick=""alert('Hello, there');"" onkeypress=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"scriptOnmousedownRequiresOnKeypress","If an element has a ""mousedown"" attribute, it should also have an ""onkeydown"" attribute","

If an element has an ""onmousedown"" attribute, it should also have an ""onkeydown"" attribute. This helps ensure that users who only have the keyboard can access the features as well.

Example

Wrong

<a onclick=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a onclick=""alert('Hello, there');"" onkeydown=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"scriptOnmousemove","Any element with an ""onmousemove"" attribute shoul have a keyboard-related action as well","

If an element has an ""onmousemove"" attribute, it should also have an attribute that would make the action available with the keyboard only.

Example

Wrong

<a onmousemove=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a onmousemove=""alert('Hello, there');"" onkeypdown=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"scriptOnmouseoutHasOnmouseblur","If an element has a ""onmouseout"" attribute, it should also have an ""onblur"" attribute","

If an element has an ""onmouseout"" attribute, it should also have an ""onblur"" attribute. This helps ensure that users who only have the keyboard can access the features as well.

Example

Wrong

<a onmouseout=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a onmouseout=""alert('Hello, there');"" onblur=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"scriptOnmouseoverHasOnfocus","If an element has an ""onmouseover"" attribute, it should also have an ""onfocus"" attribute","

If an element has an ""onmouseover"" attribute, it should also have an ""onfocus"" attribute. This helps ensure that users who only have the keyboard can access the features as well.

Example

Wrong

<a onmouseover=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a onmouseover=""alert('Hello, there');"" onfocus=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"scriptOnmouseupHasOnkeyup","If an element has an ""onmouseup"" attribute, it should also have an ""onkeyup"" attribute","

If an element has an ""onmouseout"" attribute, it should also have an ""onkeyup"" attribute. This helps ensure that users who only have the keyboard can access the features as well.

Example

Wrong

<a onmouseout=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a onmouseout=""alert('Hello, there');"" onkeyup=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"documentContentReadableWithoutStylesheets","Content should be readable without style sheets","

With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear.

","3" +"documentWordsNotInLanguageAreMarked","Any words or phrases which are not the document's primary language should be marked","

If a document has words or phrases which are not in the document's primary language, those words or phrases should be properly marked. This helps indicate which language or voice a screen-reader should use to read the text.

Example

Wrong

<p>This is a paragraph in english.</p><p>Esta frase es en espa&ntilde;ol.</p> (Spanish)</p>

Right

<p>This is a paragraph in english.</p><p lang=""es"">Esta frase es en espa&ntilde;ol.</p>

","3" +"tableComplexHasSummary","Complex tables should have a summary","

If a table is complex (for example, has some cells with ""colspan"" attributes, or multiple headers), it should have a ""summary"" attribute.

Example

Wrong

<table>

Right

<table summary=""A table of data"">

","2" +"tableSummaryIsEmpty","All data tables should have a summary","

If a table contains data, it should have a ""summary"" attribute.

Example

Wrong

<table>

Right

<table summary=""A table of data"">

","2" +"tableSummaryIsSufficient","All data tables should have an adequate summary","

If a table contains data, it should have a ""summary"" attribute that completely communicates the function and use of the table.

Example

Wrong

<table summary=""A table of stuff"">

Right

<table summary=""A comparison of population rates amongst North American cities."">

","3" +"tableLayoutHasNoSummary","All tables used for layout have no summary or an empty summary","

If a table contains no data, and is used simply for layout, then it should not have a ""summary"" attribute, or the ""summary attribute should be empty.

Example

Wrong

<table summary=""The sidebar of this page"">

Right

<table>

","1" +"tableLayoutHasNoCaption","All tables used for layout have no ""caption"" element","

If a table contains no data, and is used simply for layout, then it should not contain a caption element.

Example

Wrong

<table><caption>The layout of this page, broken into two areas.</caption>...

Right

<table>...

","1" +"boldIsNotUsed","The ""b"" (bold) element is not used","

The b (bold) element provides no emphasis for non-sighted readers. Use the strong tag instead.

Example

Wrong

<p>I think that you <b>should really read this</b>.</p>

Right

<p>I think that you <strong>should really read this</strong>.</p>

","1" +"iIsNotUsed","The ""i"" (italic) element is not used","

The i (italic) element provides no emphasis for non-sighted readers. Use the em tag instead.

Example

Wrong

<p>I think that you <i>should really read this</i>.</p>

Right

<p>I think that you <em>should really read this</em>.</p>

","1" +"passwordHasLabel","All password input elements should have a corresponding label","

All input elements with a type of ""password""should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

Enter your password: <input type=""password"" name=""pass"">

Right

<label for=""pass"">Enter your password:</label> <input type=""password"" name=""pass"" id=""pass"">

","1" +"checkboxHasLabel","All checkboxes must have a corresponding label","

All input elements with a type of ""checkbox"" should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

Sign up for our newsletter: <input type=""checkbox"" name=""newsletter"" value=""yes""/>

Right

<label for=""newsletter"">Sign up for our newsletter:</label> <input type=""checkbox"" name=""newsletter"" id=""newsletter"" value=""yes""/>

","1" +"fileHasLabel","All ""file"" input elements have a corresponding label","

All input elements of type ""file"" should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

Upload your file: <input type=""file"" name=""the_file""/>

Right

<label for=""the_file"">Upload your file:</label> <input type=""file"" id=""the_file"" name=""the_file""/>

","1" +"radioHasLabel","All ""radio"" input elements have a corresponding label","

All input elements of type ""radio"" should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

<input type=""radio"" name=""sex"" value=""male"">Male

Right

<input type=""radio"" name=""sex"" value=""male"" id=""male""><label for=""male"">Male</label>

","1" +"passwordLabelIsNearby","All ""password"" input elements have a label that is close","

All input elements of type ""password"" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away.

","2" +"checkboxLabelIsNearby","All ""checkbox"" input elements have a label that is close","

All input elements of type ""checkbox"" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away.

","2" +"fileLabelIsNearby","All ""file"" input elements have a label that is close","

All input elements of type ""file"" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away.

","2" +"radioLabelIsNearby","All ""radio"" input elements have a label that is close","

All input elements of type ""radio"" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away.

","2" +"inputTextValueNotEmpty","""Text"" input elements require a non-whitespace default text","

All input elements with a type of ""text"" should have a default text which is not empty.

Example

Wrong

<label for=""search"">Search: </label><input type=""text"" name=""search"" id=""search"" value=""""/>

Right

<label for=""search"">Search: </label><input type=""text"" name=""search"" id=""search"" value=""Search""/>

","1" +"objectWithClassIDHasNoText","Objects with ""classid"" attributes should change their text if the content of the object changes","

Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes.

","1" +"objectUIMustBeAccessible","Content within an ""object"" element should be usable with objects disabled","

Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes.

","3" +"blockquoteUseForQuotations","If long quotes are in the document, use the ""blockquote"" element to mark them","

Blockquote tags are for actual long passages of quoted material, and should be used in these cases.

Automated tests cannot tell if text is an actual quote or not, so the content of any blockquote should be reviwed manually.

Example

Wrong

<p>A long quote of several sentences. This should probably be placed in a blockquote, as it is too long to read in a single sentence, and the presence of a blockquote tag would help indicate it is actually an excerpt from somewhere else.</p>

Right

<p><blockquote>A long quote of several sentences. This should probably be placed in a blockquote, as it is too long to read in a single sentence, and the presence of a blockquote tag would help indicate it is actually an excerpt from somewhere else.</blockquote>

","2" +"imageMapServerSide","All links in a server-side map should have duplicate links available in the document","

Any image with an ""usemap"" attribute for a server-side image map should have the available links duplicated elsewhere.

","1" +"tableLayoutMakesSenseLinearized","All tables used for layout should make sense when removed","

If a table element is used for layout purposes only, then the content of the table should make sense if the table is linearized.

","3" +"aLinksAreSeperatedByPrintableCharacters","Lists of links should be seperated by printable characters","

If a list of links is provided within the same element, those links should be seperated by a non-linked, printable character. Structures like lists are not included in this.

Example

Wrong

<a href=""a.html"">Page A</a> <a href=""b.html"">Page B</a> <a href=""c.html"">Page C</a>

Right

<a href=""a.html"">Page A</a> | <a href=""b.html"">Page B</a> | <a href=""c.html"">Page C</a>

","1" +"imgWithMathShouldHaveMathEquivalent","Images which contain math equations should provide equivalent MathML","

Images which contain math equations should be accompanied or link to a document with the equivalent equation marked up with MathML.

Example

Wrong

<img src=""equation.png"" alt=""An equation which describes the average wind velocity of an unlaiden swallow. "">

Right

<img src=""equation.png"" alt=""An equation which describes the average wind velocity of an unlaiden swallow. The equation is available after this image.""><mrow><apply> <eq/> <apply> <plus/> <apply> <power/> <ci>x</ci> <cn>2</cn> </apply> <apply> <times/> <cn>4</cn> <ci>x</ci> </apply> <cn>4</cn> </apply> <cn>0</cn></apply></mrow>

","3" +"tableDataShouldHaveTh","Data tables should contain ""th"" elements","

Tables which contain data (as opposed to layout tables) should contain th elements to mark headers for screen readers and enhance the structure of the document.

Example

Wrong

<table><tr><td>Header One</td><td>Header Two</td></tr><tr><td>1.30</td><td>4.50</td></tr></table>

Right

<table><tr><th>Header One</th><th>Header Two</th></tr><tr><td>1.30</td><td>4.50</td></tr></table>

","1" +"tableLayoutDataShouldNotHaveTh","Layout tables should not contain ""th"" elements","

Tables which are used purely for layout (as opposed to data tables), should not contain th elements, which would make the table appear to be a data table.

Example

Wrong

<table><tr><th>Sidebar</th><th>Content</th><tr><td>Navigation</td><td>Stuff</td></tr></table>

Right

<table><tr><td>Sidebar</td><td>Content</td><tr><td>Navigation</td><td>Stuff</td></tr></table>

","3" +"inputTextHasTabIndex","All ""text"" input elements require a valid ""tabindex"" attribute","

All input elements of type ""text"" should have a ""tabindex"" attribute to help navigate the form with a keyboard alone.

","1" +"inputRadioHasTabIndex","All ""radio"" input elements require a valid ""tabindex"" attribute","

All input elements of type ""radio"" should have a ""tabindex"" attribute to help navigate the form with a keyboard alone.

","1" +"inputPasswordHasTabIndex","All ""password"" input elements require a valid ""tabindex"" attribute","

All input elements of type ""password"" should have a ""tabindex"" attribute to help navigate the form with a keyboard alone.

","1" +"inputCheckboxHasTabIndex","All ""checkbox"" input elements require a valid ""tabindex"" attribute","

All input elements of type ""checkbox"" should have a ""tabindex"" attribute to help navigate the form with a keyboard alone.

","1" +"inputFileHasTabIndex","All ""file"" input elements require a valid ""tabindex"" attribute","

All input elements of type ""file"" should have a ""tabindex"" attribute to help navigate the form with a keyboard alone.

","1" +"addressForAuthor","The document should contain an address for the author","

Documents should provide a valid email address within an address element.

+","1" +"addressForAuthorMustBeValid","The document should contain a valid email address for the author","

Documents should provide a valid email address within an address element.

+","2" +"linkUsedToDescribeNavigation","Document uses link element to describe navigation if it is within a collection.","The link element can provide metadata about the position of an HTML page within a set of Web units or can assist in locating content with a set of Web units.","1" +"linkUsedForAlternateContent","Use a ""link"" element for alternate content","

Documents which contain things like videos, sound, or other forms of media that are not accessible, should provide a link element with a ""rel"" attribute of ""alternate"" in the document header.

Example

<head><link rel=""alternate"" href=""transcription.html""/></head>

","3" +"tableUsesCaption","Data tables should contain a ""caption"" element if not described elsewhere","

Unless otherwise described in the document, tables should contain caption elements to describe the purpose of the table.

Example

A short description of this table
","1" +"tableUsesAbbreviationForHeader","Table headers over 20 characters should provide an ""abbr"" attribute","

For long table headers, use an ""abbr"" attribute that is less than short (less than 20 characters long).

Examples

Wrong

<th>The total number of people who liked chocolate</th>

Right

<th abbr=""Like Chocolate"">The total number of people who liked chocolate</th>

","3" +"tableHeaderLabelMustBeTerse","Table header lables must be terse","

The ""abbr"" attribute for table headers must be terse (less than 20 characters long).

","2" +"preShouldNotBeUsedForTabularLayout","""Pre"" elements should not be used for tabular data","

If a pre element is used for tabular data, change the data to use a well-formed table.

+","3" +"imgShouldNotHaveTitle","Images should not have a ""title"" attribute","

Images should not contain a ""title"" attribute.

Example

Wrong

<img src=""dog.png"" alt=""My brown dog"" title=""A dog""/>

Right

<img src=""dog.png"" alt=""My brown dog""/>

","1" +"objectShouldHaveLongDescription","An object might require a long description","

Objects might require a long description, especially if their content is complicated.

Example

Wrong

<object data=""map_of_the_world.mov""></object>

Right

<object data=""map_of_the_world.mov"" longdesc=""description.html""></object>

","3" +"emoticonsExcessiveUse","Emoticons should not be used excessively","

Emoticons should not be used excessively to communicate feelings or content. Try to rewrite the document to have more textual meaning, or wrapping the emoticons in an abbr element as outlined below. Emoticons are not read by screen-readers, and are often used to communicate feelings or other things which are relevant to the content of the document.

Example

Wrong

Of course, I'll get on it right away ;)

Right

Of course, I'll get on it right away <abbr title=""wink"">;)</abbr>

","2" +"embedHasAssociatedNoEmbed","All ""embed"" elements have an associated ""noembed"" element","

Because some users cannot use the embed element, provide alternative content in a noembed element.

Example

Wrong

<embed src=""html.mov""/>

Right

<embed src=""html.mov""/><noembed>A move with <a href=""transcript.html"">an available transcript</a>.</embed>

","1" +"noembedHasEquivalentContent","""Noembed"" elements must be the same content as their ""embed"" element","

All noembed elements must contain or link to an accessible version of their embed counterparts.

Example

Wrong

<embed src=""podcast.mp3""/><noembed>Some podcast</noembed>

Right

<embed src=""podcast.mp3""/><noembed>A podcast about dogs. <a href=""transcript.html"">Read the full transcript</a>.</noembed>

","3" +"embedMustHaveAltAttribute","""Embed"" elements must have an ""alt"" attribute","

All embed elements must have an ""alt"" attribute.

Example

Wrong

<embed src=""dog.mov""/>

Right

<embed src=""dog.mov"" alt=""A movie featuring a dog dancing a ballet.""/>

","1" +"embedMustNotHaveEmptyAlt","""Embed"" elements cannot have an empty ""alt"" attribute","

All embed elements must have an ""alt"" attribute that is not empty.

Example

Wrong

<embed src=""dog.mov"" alt=""""/>

Right

<embed src=""dog.mov"" alt=""A movie featuring a dog dancing a ballet.""/>

","1" +"iframeMustNotHaveLongdesc","Inline frames (""iframes"") should not have a ""longdesc"" attribute","

Iframe elements should not have a ""longdesc"" attribute.

","1" +"radioMarkedWithFieldgroupAndLegend","All radio button groups are marked using fieldset and legend elements.","form element content must contain both fieldset and legend elements if there are related radio buttons.","1" +"selectWithOptionsHasOptgroup","Form select elements should use optgroups for long selections","

Select form elements with long lists of items should use the optgroup tag to group like selections together.

","2" +"aSuspiciousLinkText","Link text should be useful","

Because many users of screen-readers use links to navigate the page, providing links with text that simply read ""click here"" gives no hint of the function of the link, nor the link destination. Consider rewriting links to convey the meaning of the text

Example

Wrong

To read more of my great article, <a href=""article.html"">click here</a>.

Right

You can also <a href=""article.html"">read more of my great article</a>.

","1" +"aMustContainText","Links should contain text","

Because many users of screen-readers use links to navigate the page, providing links with no text (or with images that have empty ""alt"" attributes and no other readable text) hinders these users.

Example

Wrong

<a href=""home.png""></a>

<a href=""home.png""><img src=""home.png"" alt="""">/</a>

Right

<a href=""home.png"">Return Home</a>

<a href=""home.png""><img src=""home.png"" alt=""Return Home"">/</a>

","1" +"aImgAltNotRepetative","When an image is in a link, its ""alt"" attribute should not repeat other text in the link","

Images within a link should not have an alt attribute that simply repeats the text found in the link. This will cause screen readers to simply repeat the text twice.

Example

Wrong

<a href=""home.html""><img src=""home.png"" alt=""Return home"">Return home</a>

Right

<a href=""home.html""><img src=""home.png"" alt="""">Return home</a>

","1" +"basefontIsNotUsed","""Basefont"" should not be used","

The basefont tag is deprecated and should not be used. Investigate using stylesheets instead.

","1" +"fontIsNotUsed","""Font"" elements should not be used","

The basefont tag is deprecated and should not be used. Investigate using stylesheets instead.

","1" +"aAdjacentWithSameResourceShouldBeCombined","Adjacent links that point to the same location should be merged","

Because many users of screen-readers use links to navigate the page, providing two links right next to eachother that points to the same location can be confusing. Try combining the links.

Example

Wrong

You can also <a href=""article.html"">read more of</a> <a href=""article.html"">my great article</a>.

Right

You can also <a href=""article.html"">read more of my great article</a>.

","1" +"aMustNotHaveJavascriptHref","Links should not use ""javascript"" in their location","

Anchor (a) elements may not use the ""javascript"" protocol in their ""href"" attributes.

","1" +"bodyMustNotHaveBackground","Body elements do not use a background image","

The body element for the page may not have a ""background"" attribute.

","1" +"objectMustHaveEmbed","Every object should contain an ""embed"" element","

Every object element must also contain an embed element.

Example

Wrong

<object data=""movie.mov""></object>

Right

<object data=""movie.mov""><embed src=""movie.mov""></embed></object>

","1" +"siteMap","Websites must have a site map","

Every web site should have a page which provides a site map or another method to navigate most of the site from a single page to save time for users of assistive devices.

+","3" +"documentIDsMustBeUnique","All element ""id"" attributes must be unique","

Element ""id"" attributes must be unique.

Example

Wrong

<p id=""paragraph"">First Paragraph</p><p id=""paragraph"">Second Paragraph</p>

Right

<p id=""paragraph-1"">First Paragraph</p><p id=""paragraph-2"">Second Paragraph</p>

","1" +"labelDoesNotContainInput","""Label"" elements should not contain an input element","

Label elements should not contain an input element as well.

Example

Wrong

<label for=""first_name"">First name: <input type=""text"" id=""first_name"" name=""first_name""/></label>

Right

<label for=""first_name"">First name: </label><input type=""text"" id=""first_name"" name=""first_name""/>

","1" +"labelMustBeUnique","Every form input must have only one label","

Each form input should have only one label element.

Example

Wrong

<label for=""first_name""> First name:</label> <label for=""first_name"">(Required)</label> <input type=""text"" id=""first_name"" name=""first_name""/>

Right

<label for=""first_name""> First name: (Required)</label> <input type=""text"" id=""first_name"" name=""first_name""/>

","1" +"labelMustNotBeEmpty","Labels must contain text","

Label elements should contain text which communicates the purpose of its assigned input element.

Example

Wrong

<label for=""first_name""> </label>First name: <input type=""text"" id=""first_name"" name=""first_name""/>

Right

<label for=""first_name"">First name: </label><input type=""text"" id=""first_name"" name=""first_name""/>

","1" +"aMustHaveTitle","All links must have a ""title"" attribute","

Every link must have a ""title"" attribute.

Example

Wrong

<a href=""home.html"">Home</a>

Right

<a href=""home.html"" title=""Return to home"">Home</a>

","1" +"aTitleDescribesDestination","The title attribute of all source a (anchor) elements describes the link destination.","

Every link must have a ""title"" attribute which describes the purpose or destination of the link.

Example

Wrong

<a href=""home.html"" title=""A web page"">Home</a>

Right

<a href=""home.html"" title=""Return to home"">Home</a>

","3" +"inputImageAltNotRedundant","The ""alt"" text for input ""image"" submit buttons must not be filler text","

Every form image button should not simply use filler text like ""button"" or ""submit"" as the ""alt"" text.

Example

Wrong

<input type=""image"" src=""mangifier.png"" alt=""submit""/>

Right

<input type=""image"" src=""mangifier.png"" alt=""Search this site""/>

","1" +"inputImageNotDecorative","The ""alt"" text for input ""image"" buttons must be the same as text inside the image","

Every form image button which has text within the image (say, a picture of the word ""Search"" in a special font), should have the same text within the ""alt"" attribute.

Example

Wrong

<input type=""image"" src=""search.png"" alt=""A pretty picture""/>

Right

<input type=""image"" src=""search.png"" alt=""Search this site""/>

","3" +"areaAltRefersToText","Alt text for ""area"" elements should replicate the text found in the image","

If an image is being used as a map, and an area encompasses text within the image, then the ""alt"" attribute of that area element should be the same as the text found in the image.

","3" +"aLinkTextDoesNotBeginWithRedundantWord","Link text should not begin with redundant text","

Link text should not begin with redundant words or phrases like ""link,"" ""link to,"" or ""go to.""

","1" +"imgServerSideMapNotUsed","Server-side image maps should not be used","

Server-side image maps should not be used.

","1" +"legendDescribesListOfChoices","All ""legend"" elements must describe the group of choices","

If a legend element is used in a fieldset, the legend content must describe the group of choices.

Example

Wrong

<fieldset> <legend>Some fields:</legend> <label for=""name"">Name:</label> <input type=""text"" size=""30"" id=""name""/><br /> <label for=""email"">Email:</label> <input type=""text"" size=""30"" id=""email""/><br /></fieldset>

Right

<fieldset> <legend>Personal Information:</legend> <label for=""name"">Name:</label> <input type=""text"" size=""30"" id=""name""/><br /> <label for=""email"">Email:</label> <input type=""text"" size=""30"" id=""email""/><br /></fieldset>

","3" +"legendTextNotEmpty","""Legend"" text must not contain just whitespace","

If a legend element is used in a fieldset, the legend should not contain empty text.

Example

Wrong

<fieldset> <legend> </legend> <label for=""name"">Name:</label> <input type=""text"" size=""30"" id=""name""/><br /> <label for=""email"">Email:</label> <input type=""text"" size=""30"" id=""email""/><br /></fieldset>

Right

<fieldset> <legend>Personal Information:</legend> <label for=""name"">Name:</label> <input type=""text"" size=""30"" id=""name""/><br /> <label for=""email"">Email:</label> <input type=""text"" size=""30"" id=""email""/><br /></fieldset>

","1" +"legendTextNotPlaceholder","""Legend"" text must not contain placeholder text like ""form"" or ""field""","

If a legend element is used in a fieldset, the legend should not contain useless placeholder text.

Example

Wrong

<fieldset> <legend>Form</legend> <label for=""name"">Name:</label> <input type=""text"" size=""30"" id=""name""/><br /> <label for=""email"">Email:</label> <input type=""text"" size=""30"" id=""email""/><br /></fieldset>

Right

<fieldset> <legend>Personal Information:</legend> <label for=""name"">Name:</label> <input type=""text"" size=""30"" id=""name""/><br /> <label for=""email"">Email:</label> <input type=""text"" size=""30"" id=""email""/><br /></fieldset>

","1" +"frameTitlesNotEmpty","Frames cannot have empty ""title"" attributes","

All frame elements must have a valid ""title"" attribute.

","1" +"frameTitlesNotPlaceholder","Frames cannot have ""title"" attributes that are just placeholder text","

Frame ""title"" attributes should not be simple placeholder text like ""frame,"" but should instead describe the purpose or content of the frame.

+","1" +"tableSummaryDescribesTable","Table summaries should describe the navigation and structure of the table","

Table summary elements should describe the navigation tools and structure of the table, as well as provide an overview of what the table describes.

+","3" +"bodyColorContrast","Contrast between text and background should be 5:1","

The contrast ratio of text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it.

+","3" +"bodyLinkColorContrast","Contrast between link text and background should be 5:1","

The contrast ratio of link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it.

+","1" +"bodyActiveLinkColorContrast","Contrast between active link text and background should be 5:1","

The contrast ratio of active link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it.

+","1" +"bodyVisitedLinkColorContrast","Contrast between visited link text and background should be 5:1","

The contrast ratio of visited link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it.

+","1" +"documentStrictDocType","The page uses a strict doctype","

The doctype of the page or document should be either an HTML or XHTML strict doctype.

","1" +"documentColorWaiAlgorithim","Contrast between text and the background must be greater than the WAI ERT color algorithm threshold","

The contrast between foreground text and the background must be more than the WAI ERT threshold. Learn more about WAI ERT color contrast and how to measure it.

+","1" +"documentColorWaiLinkAlgorithim","Contrast between link text and the background must be greater than the WAI ERT color algorithm threshold","

The contrast between foreground link text and the background must be more than the WAI ERT threshold. Learn more about WAI ERT color contrast and how to measure it.

+","1" +"documentColorWaiActiveLinkAlgorithim","Contrast between active link text and the background must be greater than the WAI ERT color algorithm threshold","

The contrast between foreground active link text and the background must be more than the WAI ERT threshold. Learn more about WAI ERT color contrast and how to measure it.

+","1" +"documentColorWaiVisitedLinkAlgorithim","Contrast between visited link text and the background must be greater than the WAI ERT color algorithm threshold","

The contrast between foreground visited link text and the background must be more than the WAI ERT threshold. Learn more about WAI ERT color contrast and how to measure it.

+","1" +"tableIsGrouped","Mark up the areas of tables using ""thead,"" ""tbody,"" and ""tfooter""","

To help describe the strucutre of a table, use the thead element to highlight the table header, tbody around the table body, and tfooter to describe the table footer (if applicable).

","2" +"tableUseColGroup","Group columns using ""colgroup"" or ""col"" elements","

To help complex table headers make sense, use colgroup or col to group them together.

","3" +"documentValidatesToDocType","Document must validate to the doctype","

The document must validate to the declared doctype.

","1" +"framesetIsNotUsed","The ""frameset"" element should not be used","

Frameset elements should not be used.

","1" +"frameIsNotUsed","Frames are not used","

Frame elements should not be used.

","1" +"documentReadingDirection","Reading direction of text is correctly marked","

Where required, the reading direction of the document (for language that read in different directions), or portions of the text, must be declared.

+","2" +"aAdjacentWithSameResourceShouldBeCombined","Adjacent links to the same destination should be merged","

Merge redundant links to the same location, even if the included link consists of both an image and text.

Example

Wrong

<a href=""home.html""><img src=""home.png"" alt=""Return Home""/></a><a href=""home.html"">Return home</a>

Right

<a href=""home.html""><img src=""home.png"" alt=""Return Home""/> Return home</a>

","1" +"inputElementsDontHaveAlt","Input elements which are not images should not have an ""alt"" attribute","

Because of inconsistencies in how user agents use the ""alt"" attribute, this attribute should only be used on input elements of type ""image.""

","1" +"tabularDataIsInTable","All tabular information should use a table","

Tables should be used when displaying tabular information.

","2" +"tableCaptionIdentifiesTable","Captions should identify their table","

Check to make sure that a table's caption identifies the table with a name, figure number, etc.

","3" +"tableSummaryDoesNotDuplicateCaption","Table ""summary"" elements should not duplicate the ""caption"" element","

The summary and the caption must be different, as both provide different information. A caption","1" +"tableWithBothHeadersUseScope","Data tables with multiple headers should use the ""scope"" attribute","

Where there are table headers for both rows and columns, use the ""scope"" attribute to help relate those headers with their appropriate cells.

","2" +"tableWithMoreHeadersUseID","Complex data tables should provide ""id"" attributes to headers, and ""headers"" attributes for data cells","

Complex data tables should give an ""id"" attribute to each th element, and then give a list of all the ids that apply to a data cell using the ""headers"" attribute.

","2" +"formWithRequiredLabel","Input items which are required are marked as so in the label element","

If a form element is required, it should marked as so. This should not be a mere red asterisk, but instead either a 'required' image with alt text of ""required"" or the actual text ""required."" The indicator that an item is required should be included in the input element's label element.

Examples

Wrong

<label for=""first_name"">First Name</label>*<input type=""text"" id=""first_name"" name=""first_name""/>

<label for=""first_name"">First Name (required)</label> <input type=""text"" id=""first_name"" name=""first_name""/>

","3" +"inputCheckboxRequiresFieldset","Logical groups of check boxes should be grouped with a ""fieldset""","

Related ""checkbox"" input fields should be grouped together using a fieldset

Example

Wrong

<input type=""checkbox"" name=""option-a"" id=""a""/><label for=""a"">Option A</label><br/><input type=""checkbox"" name=""option-b"" id=""b""/><label for=""b"">Option B</label>

Right

<fieldset><legend>Several options</legend><input type=""checkbox"" name=""option-a"" id=""a""/><label for=""a"">Option A</label><br/><input type=""checkbox"" name=""option-b"" id=""b""/><label for=""b"">Option B</label></fieldset>

","1" +"documentVisualListsAreMarkedUp","Visual lists of items are marked using ordered or unordered lists","

Use the ordered (ol) or unordered (ul) elements for lists of items, instead of just using new lines which start with numbers or characters to create a visual list.

Example

Wrong

1. Item One<br/>2. Item Two<br/>3.Item Three

Right

<ol><li>Item One</li><li>2. Item Two</li><li>3.Item Three</ol>

","1" +"documentAllColorsAreSet","All the document colors must be set","

If any colors for text or the background are set in the body element, then all colors must be set.

","1" +"appletProvidesMechanismToReturnToParent","All applets should provide a way for keyboard users to escape","

Ensure that a user who has only a keyboard as an input device can escape an applet element. This requires manual confirmation.

","3" +"objectProvidesMechanismToReturnToParent","All objects should provide a way for keyboard users to escape","

Ensure that a user who has only a keyboard as an input device can escape a object element. This requires manual confirmation.

","3" +"embedProvidesMechanismToReturnToParent","All embed elements should provide a way for keyboard users to escape","

Ensure that a user who has only a keyboard as an input device can escape an embed element. This requires manual confirmation.

","3" +"headersUseToMarkSections","Use headers to mark the beginning of each section","

Check that each logical section of the page is broken or introduced with a header (<h1-h6>) element.

","2" +"inputSubmitHasTabIndex","All input elements, type of ""submit"", have a valid tab index.","input element that contains a type attribute value of ""submit"" must have a tabindex attribute.","1" +"tabIndexFollowsLogicalOrder","The tab order of a document is logical","

Check that the tab-order of a page is logical.

","2" +"formHasGoodErrorMessage","Form error messages should assist in solving errors","

If the form has some required fields or other ways in which the user can commit an error, check that the reply is accessible. Use the words ""required"" or ""error"" within the label element of input items where the errors happened, and check that the beginning of the form highlights each form error. This is not something that can be checked through automated testing and requires manual checks.

","3" +"formErrorMessageHelpsUser","Forms offer the user a way to check the results of their form before performing an irrevokable action","

If the form allows users to perform some irrevokable action, like ordreing a product, ensure that users have the ability to review the contents of the form they submitted first. This is not something that can be checked through automated testing and requires manual confirmation.

","3" +"documentReadingDirection","Changes in text decoration should be marked up","

Changes in text direction in inline content should be indicated using any HTML element (for example, span) with a ""dir"" attribute indicating left-to-right or right-to-left. For example, a Hebrew phrase within an english paragraph should have it's own text direction indicated.

","2" +"formDeleteIsReversable","Deleting items using a form should be reversable","

Check that, if a form has the option to delete an item, that the user has a chance to either reverse the delete process, or is asked for confirmation before the item is deleted. This is not something that can be checked through automated testing and requires manual confirmation.

","3" +"svgContainsTitle", "Inline SVG should use Title elements","

Any inline SVG image should have an embedded title element","1" +"cssTextHasContrast","All elements should have appropriate color contrast","

For users who have color blindness, all text or other elements should have a color contrast of 5:1.

","1" +"videoProvidesCaptions","All video tags must provide captions","

All HTML5 video tags must provide captions.

","2" +"videosEmbeddedOrLinkedNeedCaptions","All linked or embedded videos need captions","

Any video hosted or otherwise which is linked or embedded must have a caption.

","1" +"documentIsWrittenClearly","The document should be written to the target audience and read clearly","

If a document is beyond a 10th grade level, then a summary or other guide should also be provided to guide the user through the content.

","2" +"headersHaveText","All headers should contain readable text","

Users with screen readers use headings like the tabs h1 to navigate the structure of a page. All headings should contain either text, or images with appropriate alt attributes.

","1" +"labelsAreAssignedToAnInput","All labels should be associated with an input","

All label elements should be assigned to an input item, and should have a for attribute which equals the id attribute of a form element.

","1" +"imgAltTextNotRedundant","Unless the image files are the same, no image should contain redundant alt text","

Every distinct image on a page should have it's own alt text which is different than all the others on the page to avoid redundancy and confusion.

Example

Wrong

<img src="rex.jpg" alt="this is an image of rex"><img src="me.jpg" alt="this is an image of rex">

Right

<img src="rex.jpg" alt="this is an image of rex"><img src="me.jpg" alt="a photo of myself">

","1" +"selectJumpMenus","Select jump menus should jump on button press, not on state change","

If you wish to use a 'Jump' menu with a select item that then redirects users to another page, the jump should occur on the user pressing a button, rather than on the change event of that select eleemnt.

","2" +"textIsNotSmall","The text size is not less than 9 pixels high","

To help users with difficulty reading small text, ensure text size is no less than 9 pixels high.

","2" \ No newline at end of file diff --git a/quail/guidelines/translations/en.txt b/quail/guidelines/translations/en.txt new file mode 100644 index 0000000..9889ee9 --- /dev/null +++ b/quail/guidelines/translations/en.txt @@ -0,0 +1,239 @@ +"imgHasAlt","Image elements must have an ""alt"" attribute","

All img elements must have an alt attribute

Example

Wrong

<img src=""dog.jpg"">

Right

<img src=""dog.jpg"" alt=""A photograph of a dog"">

","1" +"imgAltIsDifferent","Image ""alt"" attributes should not be the same as the filename","

All img elements should have an ""alt"" attribute that is not just the name of the file, unless the filename communicates everything about the file.

Example

Wrong

<img src=""dog.jpg"" alt=""dog.jpg"">

Right

<img src=""dog.jpg"" alt=""A photograph of a dog"">

","1" +"imgAltIsTooLong","Image Alt text is short","

All ""alt"" attributes for img elements should be clear and concise. ""Alt"" attributes over 100 characters long should be reviewed to see if they are too long.

Example

Wrong

<img src=""dog.jpg"" alt=""A photograph of my very, very, very special dog whom I love so much. He is a very good dog, a loving dog, and my constant companion these many years. Yes, all agree, my dog is a good dog."">

Right

<img src=""dog.jpg"" alt=""A photograph of a dog"">

","1" +"imgNonDecorativeHasAlt","Any non-decorative images should have a non-empty ""alt"" attribute","

Any image that is not used decorativey or which is purely for layout purposes cannot have an empty ""alt"" attribute.

Example

Wrong

<img src=""dog.jpg"" alt="""">

Right

<img src=""dog.jpg"" alt=""A photograph of a dog"">

","2" +"imgImportantNoSpacerAlt","Images that are important should not have a purely white-space ""alt"" attribute","

Any image that is not used decorativey or which is purely for layout purposes cannot have an ""alt"" attribute that consists solely of white space (i.e. a space, or a new line).

Example

Wrong

<img src=""dog.jpg"" alt="" "">

Right

<img src=""dog.jpg"" alt=""A photograph of a dog"">

","1" +"imgAltNotPlaceHolder","Images should not have a simple placeholder text as an ""alt"" attribute","

Any image that is not used decorativey or which is purely for layout purposes cannot have an ""alt"" attribute that consists solely of placeholders. Placeholders include:

  • nbsp
  • &nbsp;
  • spacer
  • image
  • img
  • photo

Example

Wrong

<img src=""dog.jpg"" alt=""image"">

Right

<img src=""dog.jpg"" alt=""A photograph of a dog"">

","1" +"imgAltNotEmptyInAnchor","An image within a link cannot have an empty ""alt"" attribute if there is no other text within the link","

Any image that is within a link (an a element) that has no other text cannot have an empty or missing ""alt"" attribute.

Example

Wrong

<a href=""index.html""><img src=""home.png"" alt="""">

Right

<a href=""index.html""><img src=""home.png"" alt=""Return Home""></a>

","1" +"imgHasLongDesc","A ""longdesc"" attribute is required for any image where additional information not in the ""alt"" attribute is required","

Any image that has an ""alt"" attribute that does not fully convey the meaning of the image must have a ""longdesc"" attribute.

Example

Wrong

<img src=""complexImage.png"" alt=""A complex image that cannot be described succinctly."">

Right

<img src=""complexImage.png"" alt=""A complex image that cannot be described succinctly."" longdesc=""longer_description.html"">

","1" +"imgNeedsLongDescWDlink","An image with a ""longdesc"" attribute should have a corresponding description link","

Any image that has a ""longdesc"" attribute must also have a corresponding ""d-link,"" or Description link. This should point to the same resource as the ""longdesc"" attribute and should only contain the text ""d"".

Example

Wrong

<img src=""complexImage.png"" alt=""A complex image that cannot be described succinctly."" longdesc=""longer_description.html"">

Right

<img src=""complexImage.png"" alt=""A complex image that cannot be described succinctly."" longdesc=""longer_description.html""><a href=""longer_description.html"">d</a>

","1" +"imgGifNoFlicker","Any animated GIF should not flicker","

Animated GIF files should not flicker with a frequency over 2 Hz and lower than 55 Hz. You can check the flicker rate of this GIF using an online tool.

","1" +"imgAltIsSameInText","Check that any text within an image is also in the ""alt"" attribute","

If an image has text within it, that text should be repeated in the ""alt"" attribute, unless the text is purely decorative.

","3" +"imgWithMapHasUseMap","Any image with an ""ismap"" attribute have a valid ""usemap"" attribute","

If an image has an ""ismap"" attribute, it must also have a ""usemap"" attribute.

","1" +"imgMapAreasHaveDuplicateLink","All links within a client-side image are duplicated elsewhere in the document","

Any image that has a ""usemap"" attribute must have links replicated somewhere else in the document.

Example

Wrong

<p><map name=""imagemap"" id=""map1""><area shape=""poly"" coords=""185,0,355,0,295,123"" href=""horses.html"" alt=""horses""/><area shape=""poly"" coords=""336,202,549,203,549"" href=""dogs.html"" alt=""dogs""/><area shape=""rect"" coords=""0,10,172,10"" href=""birds.html"" alt=""birds""/></map></p><p><img src=""navigation.gif"" usemap=""#imagemap"" alt=""navigation""/></p>

Right
<map name=""imagemap"" id=""map1""><area shape=""poly"" coords=""185,0,355,0,295,123"" href=""horses.html"" alt=""horses""/><area shape=""poly"" coords=""336,202,549,203,549"" href=""dogs.html"" alt=""dogs""/><area shape=""rect"" coords=""0,10,172,10"" href=""birds.html"" alt=""birds""/></map></p><p><img src=""navigation.gif"" usemap=""#imagemap"" alt=""navigation""/></p><p><a href=""horses.html"">Horses</a> | <a href=""dogs.html"">Dogs</a> | <a href=""birds.html"">Birds</a></p>","1" +"imgNotReferredToByColorAlone","For any image, the ""alt"" text cannot refer to color alone","

The ""alt"" text or content text for any image should not refer to the image by color alone. This is often fixed by changing the ""alt"" text to the meaning of the image, rather than a literal interpretation of the image.

Example

Wrong

<img src=""red-light.png"" alt=""A Red Light"">

Right

<img src=""red-ligh.png"" alt=""Stop!"">

","3" +"imgAltIdentifiesLinkDestination","Any image within a link must have ""alt"" text the describes the link destination","

Any image that is within a link should have an ""alt"" attribute which identifies the destination or purpose of the link.

Example

Wrong

<a href=""home.html""><img src=""home.png"" alt=""A house""></a>

Right

<a href=""home.html""><img src=""home.png"" alt=""Return to the home page""></a>

","3" +"imgAltEmptyForDecorativeImages","If an image is purely decorative, the ""alt"" text must be empty","

Any image that is only decorative (serves no function or adds to the purpose of the page content) should have an ""alt"" attribute, but the ""alt"" text should be empty with no white space.

Example

Wrong

<img src=""decoration.png"" alt=""A nice floral pattern to make things pretty."">

Right

<img src=""decoration.png"" alt="""">

","3" +"aLinksToSoundFilesNeedTranscripts","Any links to a sound file should also include a link to a transcript","

Links to a sound file should be followed by a link to a transcript of the file.

Example

Wrong

<a href=""interview.mp3"">Listen to the interview</a>

Right

<a href=""interview.mp3"">Listen to the interview</a> <a href=""transcript.html"">(transcript)</a>

","3" +"aLinksDontOpenNewWindow","Links should not open a new window without warning","

Links which open a new window using the ""target"" attribute should warn users.

Example

Wrong

<a href=""page.html"">View my page</a>

Right

<a href=""page.html"">View my page (opens new window)</a>

","1" +"aLinksMakeSenseOutOfContext","The text in links should make sense out of context","

All links should make sense out of context. Many non-sighted users skip from link-to-link to navigate a page, and links which do not make sense on their own can make the page difficult to navigate.

Example

Wrong

To know more about me, visit my <a href=""page.html"">page</a>.

Right

To know more about me, <a href=""page.html"">visit my page</a>.

","3" +"aLinksToMultiMediaRequireTranscript","Any links to a multimedia file should also include a link to a transcript","

Links to a multimedia file should be followed by a link to a transcript of the file.

Example

Wrong

<a href=""interview.mov"">Watch the interview</a>

Right

<a href=""interview.mov"">Watch the interview</a> <a href=""transcript.html"">(transcript)</a>

","3" +"appletsDoneUseColorAlone","Applets should not use color alone to communicate content","

Applets should contain content that makes sense without color and is accessible to users who are color blind.

Applets cannot be checked using automated tools, this should be reviewed manually.

","3" +"appletsDoNotFlicker","All applets do not flicker","

Applets should not flicker.

Applets cannot be checked using automated tools, this should be reviewed manually.

","3" +"appletContainsTextEquivalentInAlt","All applets should contain a text equivalent in the ""alt"" attribute","

Applets should contain their text equivalents or description in an ""alt"" attribute.

Example

Wrong

<applet archive=""whyareyouusingapplet.jar""></applet>

Right

<applet archive=""whyareyouusingapplet.jar"" alt=""Why are you still using applets?""></applet>

","2" +"appletContainsTextEquivalent","All applets should contain the same content within the body of the applet","

Applets should contain their text equivalents or description within the applet tag itself.

Example

Wrong

<applet archive=""whyareyouusingapplet.jar""></applet>

Right

<applet archive=""whyareyouusingapplet.jar"">Why are you still using applets?</applet>

","1" +"appletUIMustBeAccessible","Any user interface in an applet must be accessible","

Applet content should be assessed for accessibility.

Applets cannot be checked using automated tools, this should be reviewed manually.

","3" +"blinkIsNotUsed","The ""blink"" tag should not be used","

The blink tag should not be used. Ever.

Example

Wrong

<blink>Please read me!</blink>

Right

<strong>Please read me!</strong>

","1" +"skipToContentLinkProvided","A ""skip to content"" link should exist as one of the first links on the page","

A link reading ""skip to content,"" or using similar wording, should exist at the beginning of the page to help non-sighted or keyboard-using users jump directly to page content.

","2" +"doctypeProvided","The document should contain a valid ""doctype"" declaration","

Each document must contain a valid doctype declaration..

Example

Wrong

<html>

Right

<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Strict//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""><html xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en"">

","1" +"objectDoesNotFlicker","Objects do not flicker","

The content within an object tag must not flicker.

","3" +"framesHaveATitle","All ""frame"" elements should have a ""title"" attribute","

Each frame elements should have a ""title"" attribute.

Example

Wrong

<frame src=""navigation.html""></frame>

Right

<frame src=""navigation.html"" title=""The site navigation""></frame>

","1" +"frameTitlesDescribeFunction","All ""frame"" elemetns should have a ""title"" attribute that describes the purpose of the frame","

Each frame elements should have a ""title"" attribute which describes the purpose or function of the frame.

Example

Wrong

<frame src=""navigation.html""></frame>

Right

<frame src=""navigation.html"" title=""The site navigation""></frame>

","3" +"frameSrcIsAccessible","The source for each frame is accessible content.","

Each frame should contain accessible content, and contain content accessible to screen readers, like HTML as opposed to an image.

","3" +"frameRelationshipsMustBeDescribed","Complex framesets should contain a ""longdesc"" attribute","

If a frameset contains three or more frames, use a ""longdesc"" attribute to help describe the purpose of the frames.

Example

Wrong

<frameset cols=""25%,50%,25%""> <frame src=""frame_1.htm"" /> <frame src=""frame_2.htm"" /> <frame src=""frame_3.htm"" /></frameset>

Right

<frameset cols=""25%,50%,25%"" longdesc=""description.html""> <frame src=""frame_1.htm"" /> <frame src=""frame_2.htm"" /> <frame src=""frame_3.htm"" /></frameset>

","2" +"framesetMustHaveNoFramesSection","All framesets should contain a noframes section","

If a frameset contains three or more frames, use a ""longdesc"" attribute to help describe the purpose of the frames.

Example

Wrong

<frameset cols=""25%,50%,25%""> <frame src=""frame_1.htm"" /> <frame src=""frame_2.htm"" /> <frame src=""frame_3.htm"" /></frameset>

Right

<frameset cols=""25%,50%,25%"" longdesc=""description.html""> <frame src=""frame_1.htm"" /> <frame src=""frame_2.htm"" /> <frame src=""frame_3.htm"" /> <noframes> <body> This is more information for users without frames. It should contain links to all the other frames. </body> </noframes></frameset>

","1" +"noframesSectionMustHaveTextEquivalent","All ""noframes"" elements should contain the text content from all frames","

The noframes content should either replicate or link to the content visible within the frames.

","2" +"headerH1","The header following an h1 is h1 or h2","

The header following an h1 element should either be an h2 or another h1.

Users of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.

+","3" +"headerH2","The header following an h2 is h1, h2 or h3","

The header following an h2 element should either be an h3, h1 or another h2.

Users of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.

","3" +"headerH3","The header following an h3 is h1, h2, h3 or h4","

The header following an h3 element should either be an h4, h2, h1 or another h3.

Users of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.

","3" +"headerH4","The header following an h4 is h1, h2, h3, h4 or h5","

The header following an h4 element should either be an h5, h3, h2, h1, or another h4.

Users of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.

","3" +"headerH5","The header following an h5 is h6 or any header less than h6","

The header following an h5 element should either be an h6, h3, h2, h1, or another h5.

Users of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.

+","3" +"headerH1Format","All h1 elements are not used for formatting","

An h1 element may not be used purely for formatting.

Users of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.

Example

Wrong

<h1>I wanted a line to be bold and large but this is just a regular paragraph.</h1>

Right

<p class=""large-item""><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>

","3" +"headerH2Format","All h2 elements are not used for formatting","

An h2 element may not be used purely for formatting.

Users of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.

Example

Wrong

<h2>I wanted a line to be bold and large but this is just a regular paragraph.</h2>

Right

<p class=""large-item""><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>

","3" +"headerH3Format","All h3 elements are not used for formatting","

An h3 element may not be used purely for formatting.

Users of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.

Example

Wrong

<h3>I wanted a line to be bold and large but this is just a regular paragraph.</h3>

Right

<p class=""large-item""><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>

","3" +"headerH4Format","All h4 elements are not used for formatting","

An h4 element may not be used purely for formatting.

Users of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.

Example

Wrong

<h4>I wanted a line to be bold and large but this is just a regular paragraph.</h4>

Right

<p class=""large-item""><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>

","3" +"headerH5Format","All h5 elements are not used for formatting","

An h5 element may not be used purely for formatting.

Users of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.

Example

Wrong

<h5>I wanted a line to be bold and large but this is just a regular paragraph.</h5>

Right

<p class=""large-item""><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>

","3" +"headerH6Format","All h6 elements are not used for formatting","

An h6 element may not be used purely for formatting.

Users of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.

Example

Wrong

<h6>I wanted a line to be bold and large but this is just a regular paragraph.</h6>

Right

<p class=""large-item""><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>

","3" +"documentLangNotIdentified","The document must have a ""lang"" attribute","

The document should have a default langauge, by setting the ""lang"" attribute in the html element.

Example

Wrong

<html>

Right

<html lang=""en"">

","1" +"documentLangIsISO639Standard","The document's language attribute should be a standard code","

The document should have a default langauge, and that language should use the valid 2 or 3 letter language code according to ISO specification 639.

Example

Wrong

<html lang=""English"">

Right

<html lang=""en"">

","1" +"documentHasTitleElement","The document should have a title element","

The document should have a title element.

Example

Wrong

<html lang=""en""><head></head><body>....

Right

<html lang=""en""><head><title>My Great Web page</title></head><body>....

","1" +"documentTitleNotEmpty","The document should not have an empty title","

The document should have a title element that is not white space

Example

Wrong

<html lang=""en""><head><title> </title></head><body>....

Right

<html lang=""en""><head><title>My Great Web page</title></head><body>....

","1" +"documentTitleIsShort","The document title should be short","

The document title should be short and succinct. This test fails at 150 characters, but authors should consider this to be a suggestion.

Example

Wrong

<html lang=""en""><head><title>A really long title about a page about salamanders that take a long time to read which offers little to the user and is a waste of time.</title></head><body>....

Right

<html lang=""en""><head><title>All about salamanders</title></head><body>....

","2" +"documentTitleIsNotPlaceholder","The document title should not be placeholder text","

The document title should not be wasted placeholder text which does not describe the page.

Example

Wrong

<html lang=""en""><head><title>title</title></head><body>....

Right

<html lang=""en""><head><title>All about salamanders</title></head><body>....

","1" +"documentTitleDescribesDocument","The title describes the document","

The document title should actually describe the page. Often, screen readers use the title to navigate from one window to another.

This test is a suggestion and should be reviewed manually.

Example

Wrong

<html lang=""en""><head><title>Some page about something</title></head><body>....

Right

<html lang=""en""><head><title>All about salamanders</title></head><body>....

","3" +"inputDoesNotUseColorAlone","An ""input"" element should not use color alone","

All input elements should not refer to content by color alone.

","3" +"inputTextHasLabel","All ""input"" elements should have a corresponding ""label""","

All input elements should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

Enter your first name: <input type=""text"" name=""first_name""/>

Right

<label for=""first_name"">Enter your first name:</label> <input id=""first_name"" type=""text"" name=""first_name""/>

","1" +"inputImageHasAlt","All ""input"" elements with a type of ""image"" must have an ""alt"" attribute","

All input elements with a type of ""image"" should have an ""alt"" attribute.

Example

Wrong

<input type=""image"" name=""search"" src=""search.png""/>

Right

<input type=""image"" name=""search"" src=""search.png"" alt=""Search""/>

","1" +"inputImageAltIdentifiesPurpose","All ""input"" elements with a type of ""image"" must have an ""alt"" attribute that describes the function of the input","

All input elements with a type of ""image"" should have an ""alt"" attribute, and that attribute should describe the function of the image.

Example

Wrong

<input type=""image"" name=""search"" src=""search.png"" alt=""A Button""/>

Right

<input type=""image"" name=""search"" src=""search.png"" alt=""Search""/>

","3" +"inputImageAltIsShort","All ""input"" elements with a type of ""image"" must have an ""alt"" attribute which is as short as possible","

All input elements with a type of ""image"" should have an ""alt"" attribute, and that attribute should be as short as possible. This test will fail if the ""alt"" text is over 100 characters long.

Example

Wrong

<input type=""image"" name=""search"" src=""select_home.png"" alt=""Select this as a house which you would consider purchasing at a later time if it might strike your fancy to do so.""/>

Right

<input type=""image"" name=""search"" src=""select_home.png"" alt=""Select house""/>

","1" +"inputImageAltIsNotFileName","All ""input"" elements with a type of ""image"" must have an ""alt"" attribute which is not the same as the filename","

All input elements with a type of ""image"" should have an ""alt"" attribute, and that attribute should not just be the file name.

Example

Wrong

<input type=""image"" name=""search"" src=""select_home.png"" alt=""select_home.png""/>

Right

<input type=""image"" name=""search"" src=""select_home.png"" alt=""Select house""/>

","1" +"inputImageAltIsNotPlaceholder","All ""input"" elements with a type of ""image"" must have an ""alt"" attribute which is not placeholder text","

All input elements with a type of ""image"" should have an ""alt"" attribute, and that attribute should not just be placeholder text like ""image"" or ""button"".

Example

Wrong

<input type=""image"" name=""search"" src=""search.png"" alt=""image""/>

Right

<input type=""image"" name=""search"" src=""search.png"" alt=""Search""/>

","1" +"inputTextHasValue","All ""input"" elements of type ""text"" must have a default text","

All input elements with a type of ""text"" should have a default text.

Example

Wrong

<label for=""search"">Search: </label><input type=""text"" name=""search"" id=""search""/>

Right

<label for=""search"">Search: </label><input type=""text"" name=""search"" id=""search"" value=""Search""/>

","1" +"areaHasAltValue","All ""area"" elements must have an ""alt"" attribute","

All area elements within a map must have an ""alt"" attribute.

Example

Wrong

<map name=""worldmap""> <area shape=""rect"" coords=""0,0,82,126"" href=""north-america.htm""/> </map>

Right

<map name=""worldmap""> <area shape=""rect"" coords=""0,0,82,126"" href=""north-america.htm"" alt=""North America""/> </map>

","1" +"areaAltIdentifiesDestination","All ""area"" elements must have an ""alt"" attribute which describes the link destination","

All area elements within a map must have an ""alt"" attribute, and that ""alt"" attribute should describe the link destination or function

Example

Wrong

<map name=""worldmap""> <area shape=""rect"" coords=""0,0,82,126"" href=""north-america.htm"" alt=""A green blob in the middle of an ocean""/> </map>

Right

<map name=""worldmap""> <area shape=""rect"" coords=""0,0,82,126"" href=""north-america.htm"" alt=""North America""/> </map>

","3" +"areaLinksToSoundFile","All ""area"" elements which link to a sound file should also provide a link to a transcript","

All area elements which link to a sound file should have a text transcript

Example

Wrong

<map name=""people""> <area shape=""rect"" coords=""0,0,82,126"" href=""janet.mp3"" alt=""Listen to Janet""/> </map>

Right

<map name=""people""> <area shape=""rect"" coords=""0,0,82,126"" href=""janet.mp3"" alt=""Listen to Janet""/> </map><a href=""janet-transcript.html"">Read transcript of Janet.</a>

","3" +"areaDontOpenNewWindow","No ""area"" elements should open a new window without warning","

No area elements should open a new window without warning.

Example

Wrong

<map name=""worldmap""> <area shape=""rect"" coords=""0,0,82,126"" href=""north-america.htm"" target=""_blank"" alt=""North America""/> </map>

Right

<map name=""worldmap""> <area shape=""rect"" coords=""0,0,82,126"" href=""north-america.htm"" target=""_blank"" alt=""North America (opens a new window)""/> </map>

","1" +"marqueeIsNotUsed","The ""marquee"" tag should not be used","

The marquee element is difficult for users to read and is not a standard HTML element. Try to find another way to convey the importance of this text.

Example

Wrong

<marquee>This is really hard to read</marquee>

Right

<strong>This is much easier to read</strong>

","1" +"menuNotUsedToFormatText","""Menu"" elements should not be used for formattin","

Menu is a deprecated tag, but is still honored in a transitional DTD. Menu tags are to provide structure for a document and should not be used for formatting. If a menu tag is to be used, it should only contain an ordered or unordered list of links.

Example

Wrong

<menu>Something I wanted Indented</menu>

Right

<p style=""margin-left: 20px;"">Something I wanted indented.</p>

","3" +"documentAutoRedirectNotUsed","Auto-redirect with ""meta"" elements must not be used","

Because different users have different speeds and abilities when it comes to parsing the content of a page, a ""meta-refresh"" method to redirect users can prevent users from fully understanding the document before being redirected. If a pure redirect is needed, use an HTTP 302 code or similar, and if not, just provide a simple page with a link to the newest page.

Example

Wrong

<head><meta http-equiv=""refresh"" content=""2;url=http://example.com""></head>

Right

<head></head><body><a href=""http://example.com"">Continue to example.com</a></body>

","1" +"documentMetaNotUsedWithTimeout","""Meta"" elements must not be used to refresh the content of a page","

Because different users have different speeds and abilities when it comes to parsing the content of a page, a ""meta-refresh"" method to reload the content of the page can prevent users from having full access to the content. Try to use a ""refresh this"" link instead..

Example

Wrong

<head><meta http-equiv=""refresh"" content=""60""></head>

Right

<head></head><body><a href=""here.html"">Refresh</a></body>

","1" +"objectDoesNotUseColorAlone","Objects must not use color to communicate alone","

Objects should contain content that makes sense without color and is accessible to users who are color blind.

Objects cannot be checked using automated tools, this should be reviewed manually.

","3" +"objectTextUpdatesWhenObjectChanges","The text equivalents of an object should update if the object changes","

If an object changes, the text equivalent of that object should also change.

Objects cannot be checked using automated tools, this should be reviewed manually.

","3" +"objectContentUsableWhenDisabled","When objects are disabled, content should still be available","

The content within objects should still be available, even if the object is disabled. To do this, place a link to the direct object source within the object tag.

Example

Wrong

<object src=""something.html""></object>

Right

<object src=""something.html""><a href=""something.html"">Read something</a></object>

","3" +"objectInterfaceIsAccessible","Interfaces within objects must be accessible","

Object content should be assessed for accessibility.

Objects cannot be checked using automated tools, this should be reviewed manually.

","3" +"objectLinkToMultimediaHasTextTranscript","Objects which reference multimedia files should also provide a link to a transcript","

If an object contains a video, a link to the transcript should be provided near the object.

Example

Wrong

<object src=""video.mov""></object>

Right

<object src=""video.mov""></object><a href=""transcript.html"">Read Transcript of the video</a>

","3" +"objectMustHaveTitle","Objects should have a title attribute","

All object elements should contain a ""title"" attribute.

Example

Wrong

<object src=""widget.html""></object>

Right

<object src=""widget.html"" title=""A small web widget""></object>

","1" +"objectMustHaveValidTitle","Objects must not have an empty title attribute","

All object elements should have a ""title"" attribute which is not empty.

Example

Wrong

<object src=""widget.html"" title=""""></object>

Right

<object src=""widget.html"" title=""A small web widget""></object>

","1" +"objectMustContainText","Objects must contain their text equivalents","

All object elements should contain a text equivalent if the object cannot be rendered.

Example

Wrong

<object src=""widget.html"" title=""""></object>

Right

<object src=""widget.html"" title=""A small web widget"">A widget of stock prices. <a href=""widget.html"">Access this widget.</a></object>

","1" +"listNotUsedForFormatting","Lists should not be used for formatting","

Lists like ul and ol are to provide a structured list, and should not be used to format text. This test views any list with just one item as suspicious, but should be manually reviewed.

Example

Wrong

<ul><li>Something I just wanted indented</li></ul>

Right

<p style=""margin-left: 10px;"">Something I just wanted indented</p>

","3" +"pNotUsedAsHeader","Paragraphs must not be used for headers","

Headers like h1-h6 are extremely useful for non-sighted users to navigate the structure of the page, and formatting a paragraph to just be big or bold, while it might visually look like a header, does not make it one.

Example

Wrong

<p><strong>Something that really should be a header</strong></p>

Right

<h3>Something that really should be a header</h3>

","1" +"scriptsDoNotUseColorAlone","The interface in scripts should not use color alone","

All scripts should be assessed to see if their interface does not have an interface which requires distinguishing beteween colors alone.

","3" +"scriptsDoNotFlicker","Scripts should not cause the screen to flicker","

All scripts should be assessed to see if their interface does not flicker.

","3" +"scriptContentAccessibleWithScriptsTurnedOff","Content on the page should still be available if scripts are disabled","

All scripts should be assessed to see if, when the user is browing with scrips turned off, the page content is still available.

","3" +"scriptUIMustBeAccessible","The user interface for scripts should be accessible","

All scripts should be assessed to see if their interface is accessible.

","3" +"scriptInBodyMustHaveNoscript","Scripts should have a corresponding ""noscript"" element","

Scripts should be followed by a noscripts element to guide the user to content in an alternative way.

Example

Wrong

<script type=""text/javascript"">document.write(""Hello World!"")</script>

Right

<script type=""text/javascript"">document.write(""Hello World!"")</script><noscript>Hello, World!</noscript>

","1" +"selectHasAssociatedLabel","All select elements have an explicitly associated label.","

All select elements should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

Select your state: <select name=""state"">...

Right

<label for=""state"">Select your state:</label> <select id=""state"" name=""state"">...

","1" +"selectDoesNotChangeContext","""Select"" elemetns must not contain an ""onchange"" attribute","

Actions like ""onchange"" can take control away from users who are trying to navigate the page. Using an ""onchange"" attribute for things like select-list menus should instead be replaced with a drop-down and a button which initiates the action.

Example

Wrong

<form><select onchange=""location = this.options[this.selectedIndex].value;""><option value=""home.html"">Home Page</option><option value=""dog.html"">My Dog</option></select></form>

Right

<form action=""go.html""><select><option value=""home.html"">Home Page</option><option value=""dog.html"">My Dog</option></select><input type=""submit"" value=""Go""/></form>

","1" +"textareaHasAssociatedLabel","All textareas should have a corresponding label","

All textarea elements should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

Enter your essay: <textarea name=""essay""></textarea>

Right

<label for=""essay"">Enter your essay:</label> <textarea id=""essay"" name=""essay""></textarea>

","1" +"textareaLabelPositionedClose","All textareas should have a label that is close to it","

All textarea elements should have a corresponding label element that is close in proximity..

Example

Wrong

<label for=""essay"">Enter your essay:</label> [... lots of stuff ...] <textarea id=""essay"" name=""essay""></textarea>

Right

<label for=""essay"">Enter your essay:</label> <textarea id=""essay"" name=""essay""></textarea>

","2" +"cssDocumentMakesSenseStyleTurnedOff","The document must be readable with styles turned off","

With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear.

","3" +"documentAbbrIsUsed","Abbreviations must be marked with an ""abbr"" element","

Abbreviations should be marked with an abbr element, at least once on the page for each abbreviation.

Example

Wrong

<p>I work for the CIA.</p>

Right

<p>I work for the <abbr title=""Central Intelligence Agency"">CIA</abbr>.</p>

","2" +"documentAcronymsHaveElement","Acronyms must be marked with an ""acronym"" element","

Abbreviations should be marked with an acronym element, at least once on the page for each abbreviation.

Example

Wrong

<p>I work for the CIA.</p>

Right

<p>I work for the <acronym title=""Central Intelligence Agency"">CIA</acronym>.</p>

","2" +"blockquoteNotUsedForIndentation","The ""blockquote"" tag should not be used just for indentation","

Blockquote tags are for actual long passages of quoted material, not just for formatting. Instead of using blockquote to indent content, use style sheets.

Automated tests cannot tell if this is an actual quote or not, so the content of any blockquote should be reviwed manually to see if it is an actual quote or not.

Example

Wrong

<blockquote>Something I just wanted indented.</blockquote>

Right

<p style=""margin-left: 20px;"">Something I just wanted indented.</p>

","2" +"scriptOnclickRequiresOnKeypress","If an element has an ""onclick"" attribute, it should also have an ""onkeypress"" attribute","

If an element has an ""onclick"" attribute, it should also have an ""onkeypress"" attribute. This helps ensure that users who only have the keyboard can access the features as well.

Example

Wrong

<a onclick=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a onclick=""alert('Hello, there');"" onkeypress=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"scriptOndblclickRequiresOnKeypress","Any element with an ""ondblclick"" attribute shoul have a keyboard-related action as well","

If an element has an ""ondblclick"" attribute, it should also have an attribute that would make the action available with the keyboard only.

Example

Wrong

<a ondblclick=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a ondblclick=""alert('Hello, there');"" onkeypress=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"scriptOnmousedownRequiresOnKeypress","If an element has a ""mousedown"" attribute, it should also have an ""onkeydown"" attribute","

If an element has an ""onmousedown"" attribute, it should also have an ""onkeydown"" attribute. This helps ensure that users who only have the keyboard can access the features as well.

Example

Wrong

<a onclick=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a onclick=""alert('Hello, there');"" onkeydown=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"scriptOnmousemove","Any element with an ""onmousemove"" attribute shoul have a keyboard-related action as well","

If an element has an ""onmousemove"" attribute, it should also have an attribute that would make the action available with the keyboard only.

Example

Wrong

<a onmousemove=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a onmousemove=""alert('Hello, there');"" onkeypdown=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"scriptOnmouseoutHasOnmouseblur","If an element has a ""onmouseout"" attribute, it should also have an ""onblur"" attribute","

If an element has an ""onmouseout"" attribute, it should also have an ""onblur"" attribute. This helps ensure that users who only have the keyboard can access the features as well.

Example

Wrong

<a onmouseout=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a onmouseout=""alert('Hello, there');"" onblur=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"scriptOnmouseoverHasOnfocus","If an element has an ""onmouseover"" attribute, it should also have an ""onfocus"" attribute","

If an element has an ""onmouseover"" attribute, it should also have an ""onfocus"" attribute. This helps ensure that users who only have the keyboard can access the features as well.

Example

Wrong

<a onmouseover=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a onmouseover=""alert('Hello, there');"" onfocus=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"scriptOnmouseupHasOnkeyup","If an element has an ""onmouseup"" attribute, it should also have an ""onkeyup"" attribute","

If an element has an ""onmouseout"" attribute, it should also have an ""onkeyup"" attribute. This helps ensure that users who only have the keyboard can access the features as well.

Example

Wrong

<a onmouseout=""alert('Hello, there');"" href=""#"">Open an alert.</a>

Right

<a onmouseout=""alert('Hello, there');"" onkeyup=""alert('Hello, there');"" href=""#"">Open an alert.</a>

","1" +"documentContentReadableWithoutStylesheets","Content should be readable without style sheets","

With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear.

","3" +"documentWordsNotInLanguageAreMarked","Any words or phrases which are not the document's primary language should be marked","

If a document has words or phrases which are not in the document's primary language, those words or phrases should be properly marked. This helps indicate which language or voice a screen-reader should use to read the text.

Example

Wrong

<p>This is a paragraph in english.</p><p>Esta frase es en espa&ntilde;ol.</p> (Spanish)</p>

Right

<p>This is a paragraph in english.</p><p lang=""es"">Esta frase es en espa&ntilde;ol.</p>

","3" +"tableComplexHasSummary","Complex tables should have a summary","

If a table is complex (for example, has some cells with ""colspan"" attributes, or multiple headers), it should have a ""summary"" attribute.

Example

Wrong

<table>

Right

<table summary=""A table of data"">

","2" +"tableSummaryIsEmpty","All data tables should have a summary","

If a table contains data, it should have a ""summary"" attribute.

Example

Wrong

<table>

Right

<table summary=""A table of data"">

","2" +"tableSummaryIsSufficient","All data tables should have an adequate summary","

If a table contains data, it should have a ""summary"" attribute that completely communicates the function and use of the table.

Example

Wrong

<table summary=""A table of stuff"">

Right

<table summary=""A comparison of population rates amongst North American cities."">

","3" +"tableLayoutHasNoSummary","All tables used for layout have no summary or an empty summary","

If a table contains no data, and is used simply for layout, then it should not have a ""summary"" attribute, or the ""summary attribute should be empty.

Example

Wrong

<table summary=""The sidebar of this page"">

Right

<table>

","1" +"tableLayoutHasNoCaption","All tables used for layout have no ""caption"" element","

If a table contains no data, and is used simply for layout, then it should not contain a caption element.

Example

Wrong

<table><caption>The layout of this page, broken into two areas.</caption>...

Right

<table>...

","1" +"boldIsNotUsed","The ""b"" (bold) element is not used","

The b (bold) element provides no emphasis for non-sighted readers. Use the strong tag instead.

Example

Wrong

<p>I think that you <b>should really read this</b>.</p>

Right

<p>I think that you <strong>should really read this</strong>.</p>

","1" +"iIsNotUsed","The ""i"" (italic) element is not used","

The i (italic) element provides no emphasis for non-sighted readers. Use the em tag instead.

Example

Wrong

<p>I think that you <i>should really read this</i>.</p>

Right

<p>I think that you <em>should really read this</em>.</p>

","1" +"passwordHasLabel","All password input elements should have a corresponding label","

All input elements with a type of ""password""should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

Enter your password: <input type=""password"" name=""pass"">

Right

<label for=""pass"">Enter your password:</label> <input type=""password"" name=""pass"" id=""pass"">

","1" +"checkboxHasLabel","All checkboxes must have a corresponding label","

All input elements with a type of ""checkbox"" should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

Sign up for our newsletter: <input type=""checkbox"" name=""newsletter"" value=""yes""/>

Right

<label for=""newsletter"">Sign up for our newsletter:</label> <input type=""checkbox"" name=""newsletter"" id=""newsletter"" value=""yes""/>

","1" +"fileHasLabel","All ""file"" input elements have a corresponding label","

All input elements of type ""file"" should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

Upload your file: <input type=""file"" name=""the_file""/>

Right

<label for=""the_file"">Upload your file:</label> <input type=""file"" id=""the_file"" name=""the_file""/>

","1" +"radioHasLabel","All ""radio"" input elements have a corresponding label","

All input elements of type ""radio"" should have a corresponding label element. Screen readers often enter a ""form mode"" where only label text is read aloud to the user, and missing labels can make a form unusable in these cases.

Example

Wrong

<input type=""radio"" name=""sex"" value=""male"">Male

Right

<input type=""radio"" name=""sex"" value=""male"" id=""male""><label for=""male"">Male</label>

","1" +"passwordLabelIsNearby","All ""password"" input elements have a label that is close","

All input elements of type ""password"" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away.

","2" +"checkboxLabelIsNearby","All ""checkbox"" input elements have a label that is close","

All input elements of type ""checkbox"" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away.

","2" +"fileLabelIsNearby","All ""file"" input elements have a label that is close","

All input elements of type ""file"" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away.

","2" +"radioLabelIsNearby","All ""radio"" input elements have a label that is close","

All input elements of type ""radio"" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away.

","2" +"inputTextValueNotEmpty","""Text"" input elements require a non-whitespace default text","

All input elements with a type of ""text"" should have a default text which is not empty.

Example

Wrong

<label for=""search"">Search: </label><input type=""text"" name=""search"" id=""search"" value=""""/>

Right

<label for=""search"">Search: </label><input type=""text"" name=""search"" id=""search"" value=""Search""/>

","1" +"objectWithClassIDHasNoText","Objects with ""classid"" attributes should change their text if the content of the object changes","

Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes.

","1" +"objectUIMustBeAccessible","Content within an ""object"" element should be usable with objects disabled","

Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes.

","3" +"blockquoteUseForQuotations","If long quotes are in the document, use the ""blockquote"" element to mark them","

Blockquote tags are for actual long passages of quoted material, and should be used in these cases.

Automated tests cannot tell if text is an actual quote or not, so the content of any blockquote should be reviwed manually.

Example

Wrong

<p>A long quote of several sentences. This should probably be placed in a blockquote, as it is too long to read in a single sentence, and the presence of a blockquote tag would help indicate it is actually an excerpt from somewhere else.</p>

Right

<p><blockquote>A long quote of several sentences. This should probably be placed in a blockquote, as it is too long to read in a single sentence, and the presence of a blockquote tag would help indicate it is actually an excerpt from somewhere else.</blockquote>

","2" +"imageMapServerSide","All links in a server-side map should have duplicate links available in the document","

Any image with an ""usemap"" attribute for a server-side image map should have the available links duplicated elsewhere.

","1" +"tableLayoutMakesSenseLinearized","All tables used for layout should make sense when removed","

If a table element is used for layout purposes only, then the content of the table should make sense if the table is linearized.

","3" +"aLinksAreSeperatedByPrintableCharacters","Lists of links should be seperated by printable characters","

If a list of links is provided within the same element, those links should be seperated by a non-linked, printable character. Structures like lists are not included in this.

Example

Wrong

<a href=""a.html"">Page A</a> <a href=""b.html"">Page B</a> <a href=""c.html"">Page C</a>

Right

<a href=""a.html"">Page A</a> | <a href=""b.html"">Page B</a> | <a href=""c.html"">Page C</a>

","1" +"imgWithMathShouldHaveMathEquivalent","Images which contain math equations should provide equivalent MathML","

Images which contain math equations should be accompanied or link to a document with the equivalent equation marked up with MathML.

Example

Wrong

<img src=""equation.png"" alt=""An equation which describes the average wind velocity of an unlaiden swallow. "">

Right

<img src=""equation.png"" alt=""An equation which describes the average wind velocity of an unlaiden swallow. The equation is available after this image.""><mrow><apply> <eq/> <apply> <plus/> <apply> <power/> <ci>x</ci> <cn>2</cn> </apply> <apply> <times/> <cn>4</cn> <ci>x</ci> </apply> <cn>4</cn> </apply> <cn>0</cn></apply></mrow>

","3" +"tableDataShouldHaveTh","Data tables should contain ""th"" elements","

Tables which contain data (as opposed to layout tables) should contain th elements to mark headers for screen readers and enhance the structure of the document.

Example

Wrong

<table><tr><td>Header One</td><td>Header Two</td></tr><tr><td>1.30</td><td>4.50</td></tr></table>

Right

<table><tr><th>Header One</th><th>Header Two</th></tr><tr><td>1.30</td><td>4.50</td></tr></table>

","1" +"tableLayoutDataShouldNotHaveTh","Layout tables should not contain ""th"" elements","

Tables which are used purely for layout (as opposed to data tables), should not contain th elements, which would make the table appear to be a data table.

Example

Wrong

<table><tr><th>Sidebar</th><th>Content</th><tr><td>Navigation</td><td>Stuff</td></tr></table>

Right

<table><tr><td>Sidebar</td><td>Content</td><tr><td>Navigation</td><td>Stuff</td></tr></table>

","3" +"inputTextHasTabIndex","All ""text"" input elements require a valid ""tabindex"" attribute","

All input elements of type ""text"" should have a ""tabindex"" attribute to help navigate the form with a keyboard alone.

","1" +"inputRadioHasTabIndex","All ""radio"" input elements require a valid ""tabindex"" attribute","

All input elements of type ""radio"" should have a ""tabindex"" attribute to help navigate the form with a keyboard alone.

","1" +"inputPasswordHasTabIndex","All ""password"" input elements require a valid ""tabindex"" attribute","

All input elements of type ""password"" should have a ""tabindex"" attribute to help navigate the form with a keyboard alone.

","1" +"inputCheckboxHasTabIndex","All ""checkbox"" input elements require a valid ""tabindex"" attribute","

All input elements of type ""checkbox"" should have a ""tabindex"" attribute to help navigate the form with a keyboard alone.

","1" +"inputFileHasTabIndex","All ""file"" input elements require a valid ""tabindex"" attribute","

All input elements of type ""file"" should have a ""tabindex"" attribute to help navigate the form with a keyboard alone.

","1" +"addressForAuthor","The document should contain an address for the author","

Documents should provide a valid email address within an address element.

+","1" +"addressForAuthorMustBeValid","The document should contain a valid email address for the author","

Documents should provide a valid email address within an address element.

+","2" +"linkUsedToDescribeNavigation","Document uses link element to describe navigation if it is within a collection.","The link element can provide metadata about the position of an HTML page within a set of Web units or can assist in locating content with a set of Web units.","1" +"linkUsedForAlternateContent","Use a ""link"" element for alternate content","

Documents which contain things like videos, sound, or other forms of media that are not accessible, should provide a link element with a ""rel"" attribute of ""alternate"" in the document header.

Example

<head><link rel=""alternate"" href=""transcription.html""/></head>

","3" +"tableUsesCaption","Data tables should contain a ""caption"" element if not described elsewhere","

Unless otherwise described in the document, tables should contain caption elements to describe the purpose of the table.

Example

A short description of this table
","1" +"tableUsesAbbreviationForHeader","Table headers over 20 characters should provide an ""abbr"" attribute","

For long table headers, use an ""abbr"" attribute that is less than short (less than 20 characters long).

Examples

Wrong

<th>The total number of people who liked chocolate</th>

Right

<th abbr=""Like Chocolate"">The total number of people who liked chocolate</th>

","3" +"tableHeaderLabelMustBeTerse","Table header lables must be terse","

The ""abbr"" attribute for table headers must be terse (less than 20 characters long).

","2" +"preShouldNotBeUsedForTabularLayout","""Pre"" elements should not be used for tabular data","

If a pre element is used for tabular data, change the data to use a well-formed table.

+","3" +"imgShouldNotHaveTitle","Images should not have a ""title"" attribute","

Images should not contain a ""title"" attribute.

Example

Wrong

<img src=""dog.png"" alt=""My brown dog"" title=""A dog""/>

Right

<img src=""dog.png"" alt=""My brown dog""/>

","1" +"objectShouldHaveLongDescription","An object might require a long description","

Objects might require a long description, especially if their content is complicated.

Example

Wrong

<object data=""map_of_the_world.mov""></object>

Right

<object data=""map_of_the_world.mov"" longdesc=""description.html""></object>

","3" +"emoticonsExcessiveUse","Emoticons should not be used excessively","

Emoticons should not be used excessively to communicate feelings or content. Try to rewrite the document to have more textual meaning, or wrapping the emoticons in an abbr element as outlined below. Emoticons are not read by screen-readers, and are often used to communicate feelings or other things which are relevant to the content of the document.

Example

Wrong

Of course, I'll get on it right away ;)

Right

Of course, I'll get on it right away <abbr title=""wink"">;)</abbr>

","2" +"embedHasAssociatedNoEmbed","All ""embed"" elements have an associated ""noembed"" element","

Because some users cannot use the embed element, provide alternative content in a noembed element.

Example

Wrong

<embed src=""html.mov""/>

Right

<embed src=""html.mov""/><noembed>A move with <a href=""transcript.html"">an available transcript</a>.</embed>

","1" +"noembedHasEquivalentContent","""Noembed"" elements must be the same content as their ""embed"" element","

All noembed elements must contain or link to an accessible version of their embed counterparts.

Example

Wrong

<embed src=""podcast.mp3""/><noembed>Some podcast</noembed>

Right

<embed src=""podcast.mp3""/><noembed>A podcast about dogs. <a href=""transcript.html"">Read the full transcript</a>.</noembed>

","3" +"embedMustHaveAltAttribute","""Embed"" elements must have an ""alt"" attribute","

All embed elements must have an ""alt"" attribute.

Example

Wrong

<embed src=""dog.mov""/>

Right

<embed src=""dog.mov"" alt=""A movie featuring a dog dancing a ballet.""/>

","1" +"embedMustNotHaveEmptyAlt","""Embed"" elements cannot have an empty ""alt"" attribute","

All embed elements must have an ""alt"" attribute that is not empty.

Example

Wrong

<embed src=""dog.mov"" alt=""""/>

Right

<embed src=""dog.mov"" alt=""A movie featuring a dog dancing a ballet.""/>

","1" +"iframeMustNotHaveLongdesc","Inline frames (""iframes"") should not have a ""longdesc"" attribute","

Iframe elements should not have a ""longdesc"" attribute.

","1" +"radioMarkedWithFieldgroupAndLegend","All radio button groups are marked using fieldset and legend elements.","form element content must contain both fieldset and legend elements if there are related radio buttons.","1" +"selectWithOptionsHasOptgroup","Form select elements should use optgroups for long selections","

Select form elements with long lists of items should use the optgroup tag to group like selections together.

","2" +"aSuspiciousLinkText","Link text should be useful","

Because many users of screen-readers use links to navigate the page, providing links with text that simply read ""click here"" gives no hint of the function of the link, nor the link destination. Consider rewriting links to convey the meaning of the text

Example

Wrong

To read more of my great article, <a href=""article.html"">click here</a>.

Right

You can also <a href=""article.html"">read more of my great article</a>.

","1" +"aMustContainText","Links should contain text","

Because many users of screen-readers use links to navigate the page, providing links with no text (or with images that have empty ""alt"" attributes and no other readable text) hinders these users.

Example

Wrong

<a href=""home.png""></a>

<a href=""home.png""><img src=""home.png"" alt="""">/</a>

Right

<a href=""home.png"">Return Home</a>

<a href=""home.png""><img src=""home.png"" alt=""Return Home"">/</a>

","1" +"aImgAltNotRepetative","When an image is in a link, its ""alt"" attribute should not repeat other text in the link","

Images within a link should not have an alt attribute that simply repeats the text found in the link. This will cause screen readers to simply repeat the text twice.

Example

Wrong

<a href=""home.html""><img src=""home.png"" alt=""Return home"">Return home</a>

Right

<a href=""home.html""><img src=""home.png"" alt="""">Return home</a>

","1" +"basefontIsNotUsed","""Basefont"" should not be used","

The basefont tag is deprecated and should not be used. Investigate using stylesheets instead.

","1" +"fontIsNotUsed","""Font"" elements should not be used","

The basefont tag is deprecated and should not be used. Investigate using stylesheets instead.

","1" +"aAdjacentWithSameResourceShouldBeCombined","Adjacent links that point to the same location should be merged","

Because many users of screen-readers use links to navigate the page, providing two links right next to eachother that points to the same location can be confusing. Try combining the links.

Example

Wrong

You can also <a href=""article.html"">read more of</a> <a href=""article.html"">my great article</a>.

Right

You can also <a href=""article.html"">read more of my great article</a>.

","1" +"aMustNotHaveJavascriptHref","Links should not use ""javascript"" in their location","

Anchor (a) elements may not use the ""javascript"" protocol in their ""href"" attributes.

","1" +"bodyMustNotHaveBackground","Body elements do not use a background image","

The body element for the page may not have a ""background"" attribute.

","1" +"objectMustHaveEmbed","Every object should contain an ""embed"" element","

Every object element must also contain an embed element.

Example

Wrong

<object data=""movie.mov""></object>

Right

<object data=""movie.mov""><embed src=""movie.mov""></embed></object>

","1" +"siteMap","Websites must have a site map","

Every web site should have a page which provides a site map or another method to navigate most of the site from a single page to save time for users of assistive devices.

+","3" +"documentIDsMustBeUnique","All element ""id"" attributes must be unique","

Element ""id"" attributes must be unique.

Example

Wrong

<p id=""paragraph"">First Paragraph</p><p id=""paragraph"">Second Paragraph</p>

Right

<p id=""paragraph-1"">First Paragraph</p><p id=""paragraph-2"">Second Paragraph</p>

","1" +"labelDoesNotContainInput","""Label"" elements should not contain an input element","

Label elements should not contain an input element as well.

Example

Wrong

<label for=""first_name"">First name: <input type=""text"" id=""first_name"" name=""first_name""/></label>

Right

<label for=""first_name"">First name: </label><input type=""text"" id=""first_name"" name=""first_name""/>

","1" +"labelMustBeUnique","Every form input must have only one label","

Each form input should have only one label element.

Example

Wrong

<label for=""first_name""> First name:</label> <label for=""first_name"">(Required)</label> <input type=""text"" id=""first_name"" name=""first_name""/>

Right

<label for=""first_name""> First name: (Required)</label> <input type=""text"" id=""first_name"" name=""first_name""/>

","1" +"labelMustNotBeEmpty","Labels must contain text","

Label elements should contain text which communicates the purpose of its assigned input element.

Example

Wrong

<label for=""first_name""> </label>First name: <input type=""text"" id=""first_name"" name=""first_name""/>

Right

<label for=""first_name"">First name: </label><input type=""text"" id=""first_name"" name=""first_name""/>

","1" +"aMustHaveTitle","All links must have a ""title"" attribute","

Every link must have a ""title"" attribute.

Example

Wrong

<a href=""home.html"">Home</a>

Right

<a href=""home.html"" title=""Return to home"">Home</a>

","1" +"aTitleDescribesDestination","The title attribute of all source a (anchor) elements describes the link destination.","

Every link must have a ""title"" attribute which describes the purpose or destination of the link.

Example

Wrong

<a href=""home.html"" title=""A web page"">Home</a>

Right

<a href=""home.html"" title=""Return to home"">Home</a>

","3" +"inputImageAltNotRedundant","The ""alt"" text for input ""image"" submit buttons must not be filler text","

Every form image button should not simply use filler text like ""button"" or ""submit"" as the ""alt"" text.

Example

Wrong

<input type=""image"" src=""mangifier.png"" alt=""submit""/>

Right

<input type=""image"" src=""mangifier.png"" alt=""Search this site""/>

","1" +"inputImageNotDecorative","The ""alt"" text for input ""image"" buttons must be the same as text inside the image","

Every form image button which has text within the image (say, a picture of the word ""Search"" in a special font), should have the same text within the ""alt"" attribute.

Example

Wrong

<input type=""image"" src=""search.png"" alt=""A pretty picture""/>

Right

<input type=""image"" src=""search.png"" alt=""Search this site""/>

","3" +"areaAltRefersToText","Alt text for ""area"" elements should replicate the text found in the image","

If an image is being used as a map, and an area encompasses text within the image, then the ""alt"" attribute of that area element should be the same as the text found in the image.

","3" +"aLinkTextDoesNotBeginWithRedundantWord","Link text should not begin with redundant text","

Link text should not begin with redundant words or phrases like ""link,"" ""link to,"" or ""go to.""

","1" +"imgServerSideMapNotUsed","Server-side image maps should not be used","

Server-side image maps should not be used.

","1" +"legendDescribesListOfChoices","All ""legend"" elements must describe the group of choices","

If a legend element is used in a fieldset, the legend content must describe the group of choices.

Example

Wrong

<fieldset> <legend>Some fields:</legend> <label for=""name"">Name:</label> <input type=""text"" size=""30"" id=""name""/><br /> <label for=""email"">Email:</label> <input type=""text"" size=""30"" id=""email""/><br /></fieldset>

Right

<fieldset> <legend>Personal Information:</legend> <label for=""name"">Name:</label> <input type=""text"" size=""30"" id=""name""/><br /> <label for=""email"">Email:</label> <input type=""text"" size=""30"" id=""email""/><br /></fieldset>

","3" +"legendTextNotEmpty","""Legend"" text must not contain just whitespace","

If a legend element is used in a fieldset, the legend should not contain empty text.

Example

Wrong

<fieldset> <legend> </legend> <label for=""name"">Name:</label> <input type=""text"" size=""30"" id=""name""/><br /> <label for=""email"">Email:</label> <input type=""text"" size=""30"" id=""email""/><br /></fieldset>

Right

<fieldset> <legend>Personal Information:</legend> <label for=""name"">Name:</label> <input type=""text"" size=""30"" id=""name""/><br /> <label for=""email"">Email:</label> <input type=""text"" size=""30"" id=""email""/><br /></fieldset>

","1" +"legendTextNotPlaceholder","""Legend"" text must not contain placeholder text like ""form"" or ""field""","

If a legend element is used in a fieldset, the legend should not contain useless placeholder text.

Example

Wrong

<fieldset> <legend>Form</legend> <label for=""name"">Name:</label> <input type=""text"" size=""30"" id=""name""/><br /> <label for=""email"">Email:</label> <input type=""text"" size=""30"" id=""email""/><br /></fieldset>

Right

<fieldset> <legend>Personal Information:</legend> <label for=""name"">Name:</label> <input type=""text"" size=""30"" id=""name""/><br /> <label for=""email"">Email:</label> <input type=""text"" size=""30"" id=""email""/><br /></fieldset>

","1" +"frameTitlesNotEmpty","Frames cannot have empty ""title"" attributes","

All frame elements must have a valid ""title"" attribute.

","1" +"frameTitlesNotPlaceholder","Frames cannot have ""title"" attributes that are just placeholder text","

Frame ""title"" attributes should not be simple placeholder text like ""frame,"" but should instead describe the purpose or content of the frame.

+","1" +"tableSummaryDescribesTable","Table summaries should describe the navigation and structure of the table","

Table summary elements should describe the navigation tools and structure of the table, as well as provide an overview of what the table describes.

+","3" +"bodyColorContrast","Contrast between text and background should be 5:1","

The contrast ratio of text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it.

+","3" +"bodyLinkColorContrast","Contrast between link text and background should be 5:1","

The contrast ratio of link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it.

+","1" +"bodyActiveLinkColorContrast","Contrast between active link text and background should be 5:1","

The contrast ratio of active link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it.

+","1" +"bodyVisitedLinkColorContrast","Contrast between visited link text and background should be 5:1","

The contrast ratio of visited link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it.

+","1" +"documentStrictDocType","The page uses a strict doctype","

The doctype of the page or document should be either an HTML or XHTML strict doctype.

","1" +"documentColorWaiAlgorithim","Contrast between text and the background must be greater than the WAI ERT color algorithm threshold","

The contrast between foreground text and the background must be more than the WAI ERT threshold. Learn more about WAI ERT color contrast and how to measure it.

+","1" +"documentColorWaiLinkAlgorithim","Contrast between link text and the background must be greater than the WAI ERT color algorithm threshold","

The contrast between foreground link text and the background must be more than the WAI ERT threshold. Learn more about WAI ERT color contrast and how to measure it.

+","1" +"documentColorWaiActiveLinkAlgorithim","Contrast between active link text and the background must be greater than the WAI ERT color algorithm threshold","

The contrast between foreground active link text and the background must be more than the WAI ERT threshold. Learn more about WAI ERT color contrast and how to measure it.

+","1" +"documentColorWaiVisitedLinkAlgorithim","Contrast between visited link text and the background must be greater than the WAI ERT color algorithm threshold","

The contrast between foreground visited link text and the background must be more than the WAI ERT threshold. Learn more about WAI ERT color contrast and how to measure it.

+","1" +"tableIsGrouped","Mark up the areas of tables using ""thead,"" ""tbody,"" and ""tfooter""","

To help describe the strucutre of a table, use the thead element to highlight the table header, tbody around the table body, and tfooter to describe the table footer (if applicable).

","2" +"tableUseColGroup","Group columns using ""colgroup"" or ""col"" elements","

To help complex table headers make sense, use colgroup or col to group them together.

","3" +"documentValidatesToDocType","Document must validate to the doctype","

The document must validate to the declared doctype.

","1" +"framesetIsNotUsed","The ""frameset"" element should not be used","

Frameset elements should not be used.

","1" +"frameIsNotUsed","Frames are not used","

Frame elements should not be used.

","1" +"documentReadingDirection","Reading direction of text is correctly marked","

Where required, the reading direction of the document (for language that read in different directions), or portions of the text, must be declared.

+","2" +"aAdjacentWithSameResourceShouldBeCombined","Adjacent links to the same destination should be merged","

Merge redundant links to the same location, even if the included link consists of both an image and text.

Example

Wrong

<a href=""home.html""><img src=""home.png"" alt=""Return Home""/></a><a href=""home.html"">Return home</a>

Right

<a href=""home.html""><img src=""home.png"" alt=""Return Home""/> Return home</a>

","1" +"inputElementsDontHaveAlt","Input elements which are not images should not have an ""alt"" attribute","

Because of inconsistencies in how user agents use the ""alt"" attribute, this attribute should only be used on input elements of type ""image.""

","1" +"tabularDataIsInTable","All tabular information should use a table","

Tables should be used when displaying tabular information.

","2" +"tableCaptionIdentifiesTable","Captions should identify their table","

Check to make sure that a table's caption identifies the table with a name, figure number, etc.

","3" +"tableSummaryDoesNotDuplicateCaption","Table ""summary"" elements should not duplicate the ""caption"" element","

The summary and the caption must be different, as both provide different information. A caption","1" +"tableWithBothHeadersUseScope","Data tables with multiple headers should use the ""scope"" attribute","

Where there are table headers for both rows and columns, use the ""scope"" attribute to help relate those headers with their appropriate cells.

","2" +"tableWithMoreHeadersUseID","Complex data tables should provide ""id"" attributes to headers, and ""headers"" attributes for data cells","

Complex data tables should give an ""id"" attribute to each th element, and then give a list of all the ids that apply to a data cell using the ""headers"" attribute.

","2" +"formWithRequiredLabel","Input items which are required are marked as so in the label element","

If a form element is required, it should marked as so. This should not be a mere red asterisk, but instead either a 'required' image with alt text of ""required"" or the actual text ""required."" The indicator that an item is required should be included in the input element's label element.

Examples

Wrong

<label for=""first_name"">First Name</label>*<input type=""text"" id=""first_name"" name=""first_name""/>

<label for=""first_name"">First Name (required)</label> <input type=""text"" id=""first_name"" name=""first_name""/>

","3" +"inputCheckboxRequiresFieldset","Logical groups of check boxes should be grouped with a ""fieldset""","

Related ""checkbox"" input fields should be grouped together using a fieldset

Example

Wrong

<input type=""checkbox"" name=""option-a"" id=""a""/><label for=""a"">Option A</label><br/><input type=""checkbox"" name=""option-b"" id=""b""/><label for=""b"">Option B</label>

Right

<fieldset><legend>Several options</legend><input type=""checkbox"" name=""option-a"" id=""a""/><label for=""a"">Option A</label><br/><input type=""checkbox"" name=""option-b"" id=""b""/><label for=""b"">Option B</label></fieldset>

","1" +"documentVisualListsAreMarkedUp","Visual lists of items are marked using ordered or unordered lists","

Use the ordered (ol) or unordered (ul) elements for lists of items, instead of just using new lines which start with numbers or characters to create a visual list.

Example

Wrong

1. Item One<br/>2. Item Two<br/>3.Item Three

Right

<ol><li>Item One</li><li>2. Item Two</li><li>3.Item Three</ol>

","1" +"documentAllColorsAreSet","All the document colors must be set","

If any colors for text or the background are set in the body element, then all colors must be set.

","1" +"appletProvidesMechanismToReturnToParent","All applets should provide a way for keyboard users to escape","

Ensure that a user who has only a keyboard as an input device can escape an applet element. This requires manual confirmation.

","3" +"objectProvidesMechanismToReturnToParent","All objects should provide a way for keyboard users to escape","

Ensure that a user who has only a keyboard as an input device can escape a object element. This requires manual confirmation.

","3" +"embedProvidesMechanismToReturnToParent","All embed elements should provide a way for keyboard users to escape","

Ensure that a user who has only a keyboard as an input device can escape an embed element. This requires manual confirmation.

","3" +"headersUseToMarkSections","Use headers to mark the beginning of each section","

Check that each logical section of the page is broken or introduced with a header (<h1-h6>) element.

","2" +"inputSubmitHasTabIndex","All input elements, type of ""submit"", have a valid tab index.","input element that contains a type attribute value of ""submit"" must have a tabindex attribute.","1" +"tabIndexFollowsLogicalOrder","The tab order of a document is logical","

Check that the tab-order of a page is logical.

","2" +"formHasGoodErrorMessage","Form error messages should assist in solving errors","

If the form has some required fields or other ways in which the user can commit an error, check that the reply is accessible. Use the words ""required"" or ""error"" within the label element of input items where the errors happened, and check that the beginning of the form highlights each form error. This is not something that can be checked through automated testing and requires manual checks.

","3" +"formErrorMessageHelpsUser","Forms offer the user a way to check the results of their form before performing an irrevokable action","

If the form allows users to perform some irrevokable action, like ordreing a product, ensure that users have the ability to review the contents of the form they submitted first. This is not something that can be checked through automated testing and requires manual confirmation.

","3" +"documentReadingDirection","Changes in text decoration should be marked up","

Changes in text direction in inline content should be indicated using any HTML element (for example, span) with a ""dir"" attribute indicating left-to-right or right-to-left. For example, a Hebrew phrase within an english paragraph should have it's own text direction indicated.

","2" +"formDeleteIsReversable","Deleting items using a form should be reversable","

Check that, if a form has the option to delete an item, that the user has a chance to either reverse the delete process, or is asked for confirmation before the item is deleted. This is not something that can be checked through automated testing and requires manual confirmation.

","3" +"svgContainsTitle", "Inline SVG should use Title elements","

Any inline SVG image should have an embedded title element","1" +"cssTextHasContrast","All elements should have appropriate color contrast","

For users who have color blindness, all text or other elements should have a color contrast of 5:1.

","1" +"videoProvidesCaptions","All video tags must provide captions","

All HTML5 video tags must provide captions.

","2" +"videosEmbeddedOrLinkedNeedCaptions","All linked or embedded videos need captions","

Any video hosted or otherwise which is linked or embedded must have a caption.

","1" +"documentIsWrittenClearly","The document should be written to the target audience and read clearly","

If a document is beyond a 10th grade level, then a summary or other guide should also be provided to guide the user through the content.

","2" +"headersHaveText","All headers should contain readable text","

Users with screen readers use headings like the tabs h1 to navigate the structure of a page. All headings should contain either text, or images with appropriate alt attributes.

","1" +"labelsAreAssignedToAnInput","All labels should be associated with an input","

All label elements should be assigned to an input item, and should have a for attribute which equals the id attribute of a form element.

","1" +"imgAltTextNotRedundant","Unless the image files are the same, no image should contain redundant alt text","

Every distinct image on a page should have it's own alt text which is different than all the others on the page to avoid redundancy and confusion.

Example

Wrong

<img src="rex.jpg" alt="this is an image of rex"><img src="me.jpg" alt="this is an image of rex">

Right

<img src="rex.jpg" alt="this is an image of rex"><img src="me.jpg" alt="a photo of myself">

","1" +"selectJumpMenus","Select jump menus should jump on button press, not on state change","

If you wish to use a 'Jump' menu with a select item that then redirects users to another page, the jump should occur on the user pressing a button, rather than on the change event of that select eleemnt.

","2" +"textIsNotSmall","The text size is not less than 9 pixels high","

To help users with difficulty reading small text, ensure text size is no less than 9 pixels high.

","2" \ No newline at end of file diff --git a/quail/guidelines/wcag1a.php b/quail/guidelines/wcag1a.php new file mode 100644 index 0000000..7d83e3a --- /dev/null +++ b/quail/guidelines/wcag1a.php @@ -0,0 +1,84 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup guidelines */ +/*@{*/ + +/** +* WCAG 1.0 Level A Guideline +*/ +class Wcag1aGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgNonDecorativeHasAlt', + 'imgImportantNoSpacerAlt', + 'imgHasLongDesc', + 'imgAltIsSameInText', + 'aLinksToSoundFilesNeedTranscripts', + 'aLinksToMultiMediaRequireTranscript', + 'appletContainsTextEquivalentInAlt', + 'frameRelationshipsMustBeDescribed', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'areaHasAltValue', + 'areaAltIdentifiesDestination', + 'areaLinksToSoundFile', + 'objectTextUpdatesWhenObjectChanges', + 'objectContentUsableWhenDisabled', + 'objectLinkToMultimediaHasTextTranscript', + 'objectMustHaveTitle', + 'objectMustHaveValidTitle', + 'objectMustContainText', + 'scriptInBodyMustHaveNoscript', + 'objectWithClassIDHasNoText', + 'imageMapServerSide', + 'imgNotReferredToByColorAlone', + 'appletsDoneUseColorAlone', + 'inputDoesNotUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'documentWordsNotInLanguageAreMarked', + 'tableDataShouldHaveTh', + 'cssDocumentMakesSenseStyleTurnedOff', + 'documentContentReadableWithoutStylesheets', + 'objectTextUpdatesWhenObjectChanges', + 'objectWithClassIDHasNoText', + 'appletContainsTextEquivalent', + 'objectContentUsableWhenDisabled', + 'objectUIMustBeAccessible', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'appletUIMustBeAccessible', + 'objectInterfaceIsAccessible', + 'scriptUIMustBeAccessible', + 'imgWithMapHasUseMap', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'svgContainsTitle', + 'headersHaveText', + ); +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/wcag1aa.php b/quail/guidelines/wcag1aa.php new file mode 100644 index 0000000..25767fa --- /dev/null +++ b/quail/guidelines/wcag1aa.php @@ -0,0 +1,129 @@ +. +* @author Kevin Miller +*/ + + +/** \addtogroup guidelines */ +/*@{*/ + +/** +* WCAG 1.0 Level AA Guideline +*/ +class Wcag1aaGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgNonDecorativeHasAlt', + 'imgImportantNoSpacerAlt', + 'imgHasLongDesc', + 'imgAltIsSameInText', + 'aLinksToSoundFilesNeedTranscripts', + 'aLinksToMultiMediaRequireTranscript', + 'appletContainsTextEquivalentInAlt', + 'frameRelationshipsMustBeDescribed', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'areaHasAltValue', + 'areaAltIdentifiesDestination', + 'areaLinksToSoundFile', + 'objectTextUpdatesWhenObjectChanges', + 'objectContentUsableWhenDisabled', + 'objectLinkToMultimediaHasTextTranscript', + 'objectMustHaveTitle', + 'objectMustHaveValidTitle', + 'objectMustContainText', + 'objectWithClassIDHasNoText', + 'imageMapServerSide', + 'imgNotReferredToByColorAlone', + 'appletsDoneUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'documentWordsNotInLanguageAreMarked', + 'tableDataShouldHaveTh', + 'cssDocumentMakesSenseStyleTurnedOff', + 'documentContentReadableWithoutStylesheets', + 'objectTextUpdatesWhenObjectChanges', + 'objectWithClassIDHasNoText', + 'appletContainsTextEquivalent', + 'objectContentUsableWhenDisabled', + 'objectUIMustBeAccessible', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'appletUIMustBeAccessible', + 'objectInterfaceIsAccessible', + 'scriptUIMustBeAccessible', + 'imgWithMapHasUseMap', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'imgWithMathShouldHaveMathEquivalent', + 'documentValidatesToDocType', + 'basefontIsNotUsed', + 'fontIsNotUsed', + 'headerH1', + 'headerH2', + 'headerH3', + 'headerH4', + 'headerH1Format', + 'headerH2Format', + 'headerH3Format', + 'headerH4Format', + 'headerH5Format', + 'headerH6Format', + 'menuNotUsedToFormatText', + 'listNotUsedForFormatting', + 'blockquoteNotUsedForIndentation', + 'tableLayoutDataShouldNotHaveTh', + 'framesetMustHaveNoFramesSection', + 'noframesSectionMustHaveTextEquivalent', + 'blinkIsNotUsed', + 'marqueeIsNotUsed', + 'documentMetaNotUsedWithTimeout', + 'documentAutoRedirectNotUsed', + 'aLinksDontOpenNewWindow', + 'areaDontOpenNewWindow', + 'textareaLabelPositionedClose', + 'passwordLabelIsNearby', + 'checkboxLabelIsNearby', + 'fileLabelIsNearby', + 'radioLabelIsNearby', + 'frameRelationshipsMustBeDescribed', + 'inputTextHasLabel', + 'selectHasAssociatedLabel', + 'textareaHasAssociatedLabel', + 'passwordHasLabel', + 'checkboxHasLabel', + 'radioHasLabel', + 'aLinksMakeSenseOutOfContext', + 'aSuspiciousLinkText', + 'documentHasTitleElement', + 'documentTitleNotEmpty', + 'documentTitleIsShort', + 'documentTitleIsNotPlaceholder', + 'documentTitleDescribesDocument', + 'svgContainsTitle', + 'cssTextHasContrast', + 'headersHaveText', + ); +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/wcag1aaa.php b/quail/guidelines/wcag1aaa.php new file mode 100644 index 0000000..3110ff2 --- /dev/null +++ b/quail/guidelines/wcag1aaa.php @@ -0,0 +1,154 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup guidelines */ +/*@{*/ + +/** +* WCAG 1.0 Level AAA Guideline +*/ +class Wcag1aaaGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgNonDecorativeHasAlt', + 'imgImportantNoSpacerAlt', + 'imgHasLongDesc', + 'imgAltIsSameInText', + 'aLinksToSoundFilesNeedTranscripts', + 'aLinksToMultiMediaRequireTranscript', + 'appletContainsTextEquivalentInAlt', + 'frameRelationshipsMustBeDescribed', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'areaHasAltValue', + 'areaAltIdentifiesDestination', + 'areaLinksToSoundFile', + 'objectTextUpdatesWhenObjectChanges', + 'objectContentUsableWhenDisabled', + 'objectLinkToMultimediaHasTextTranscript', + 'objectMustHaveTitle', + 'objectMustHaveValidTitle', + 'objectMustContainText', + 'objectWithClassIDHasNoText', + 'imgMapAreasHaveDuplicateLink', + 'imgNotReferredToByColorAlone', + 'appletsDoneUseColorAlone', + 'inputDoesNotUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'documentWordsNotInLanguageAreMarked', + 'tableDataShouldHaveTh', + 'cssDocumentMakesSenseStyleTurnedOff', + 'documentContentReadableWithoutStylesheets', + 'objectTextUpdatesWhenObjectChanges', + 'objectWithClassIDHasNoText', + 'appletContainsTextEquivalent', + 'objectContentUsableWhenDisabled', + 'objectUIMustBeAccessible', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'appletUIMustBeAccessible', + 'objectInterfaceIsAccessible', + 'scriptUIMustBeAccessible', + 'imgWithMapHasUseMap', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'imgWithMathShouldHaveMathEquivalent', + 'documentValidatesToDocType', + 'basefontIsNotUsed', + 'fontIsNotUsed', + 'headerH1', + 'headerH2', + 'headerH3', + 'headerH4', + 'headerH1Format', + 'headerH2Format', + 'headerH3Format', + 'headerH4Format', + 'headerH5Format', + 'headerH6Format', + 'menuNotUsedToFormatText', + 'listNotUsedForFormatting', + 'blockquoteNotUsedForIndentation', + 'tableLayoutDataShouldNotHaveTh', + 'scriptOnclickRequiresOnKeypress', + 'scriptOndblclickRequiresOnKeypress', + 'scriptOnmousedownRequiresOnKeypress', + 'scriptOnmousemove', + 'scriptOnmouseoutHasOnmouseblur', + 'scriptOnmouseoverHasOnfocus', + 'scriptOnmouseupHasOnkeyup', + 'framesetMustHaveNoFramesSection', + 'noframesSectionMustHaveTextEquivalent', + 'blinkIsNotUsed', + 'marqueeIsNotUsed', + 'documentMetaNotUsedWithTimeout', + 'documentAutoRedirectNotUsed', + 'aLinksDontOpenNewWindow', + 'areaDontOpenNewWindow', + 'textareaLabelPositionedClose', + 'passwordLabelIsNearby', + 'checkboxLabelIsNearby', + 'fileLabelIsNearby', + 'radioLabelIsNearby', + 'frameRelationshipsMustBeDescribed', + 'inputTextHasLabel', + 'selectHasAssociatedLabel', + 'textareaHasAssociatedLabel', + 'passwordHasLabel', + 'checkboxHasLabel', + 'radioHasLabel', + 'aLinksMakeSenseOutOfContext', + 'aSuspiciousLinkText', + 'documentHasTitleElement', + 'documentTitleNotEmpty', + 'documentTitleIsShort', + 'documentTitleIsNotPlaceholder', + 'documentTitleDescribesDocument', + 'addressForAuthor', + 'imgMapAreasHaveDuplicateLink', + 'documentAbbrIsUsed', + 'documentAcronymsHaveElement', + 'documentLangNotIdentified', + 'documentLangIsISO639Standard', + 'tableComplexHasSummary', + 'tableSummaryIsEmpty', + 'tableSummaryIsSufficient', + 'tableLayoutHasNoSummary', + 'inputTextHasTabIndex', + 'inputRadioHasTabIndex', + 'inputPasswordHasTabIndex', + 'inputCheckboxHasTabIndex', + 'inputFileHasTabIndex', + 'aLinksAreSeperatedByPrintableCharacters', + 'skipToContentLinkProvided', + 'svgContainsTitle', + 'cssTextHasContrast', + 'headersHaveText', + ); + +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/wcag2a.php b/quail/guidelines/wcag2a.php new file mode 100644 index 0000000..ec3d538 --- /dev/null +++ b/quail/guidelines/wcag2a.php @@ -0,0 +1,146 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup guidelines */ +/*@{*/ + +/** +* WCAG 2.0 Level A Guideline +*/ +class Wcag2aGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgAltIsDifferent', + 'imgAltIsTooLong', + 'imgAltNotPlaceHolder', + 'imgAltNotEmptyInAnchor', + 'imgHasLongDesc', + 'imgAltIsSameInText', + 'imgAltEmptyForDecorativeImages', + 'appletContainsTextEquivalentInAlt', + 'appletContainsTextEquivalent', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'inputImageAltIsShort', + 'inputImageAltIsNotPlaceholder', + 'areaHasAltValue', + 'areaAltIdentifiesDestination', + 'areaLinksToSoundFile', + 'objectMustContainText', + 'embedHasAssociatedNoEmbed', + 'inputImageNotDecorative', + 'areaAltRefersToText', + 'inputElementsDontHaveAlt', + 'aLinksToSoundFilesNeedTranscripts', + 'aLinksToMultiMediaRequireTranscript', + 'objectShouldHaveLongDescription', + 'inputTextHasLabel', + 'pNotUsedAsHeader', + 'selectHasAssociatedLabel', + 'textareaHasAssociatedLabel', + 'textareaLabelPositionedClose', + 'tableComplexHasSummary', + 'tableSummaryIsEmpty', + 'tableLayoutHasNoSummary', + 'tableLayoutHasNoCaption', + 'passwordHasLabel', + 'checkboxHasLabel', + 'fileHasLabel', + 'radioHasLabel', + 'passwordLabelIsNearby', + 'checkboxLabelIsNearby', + 'fileLabelIsNearby', + 'radioLabelIsNearby', + 'tableLayoutMakesSenseLinearized', + 'tableLayoutDataShouldNotHaveTh', + 'tableUsesCaption', + 'preShouldNotBeUsedForTabularLayout', + 'radioMarkedWithFieldgroupAndLegend', + 'tableSummaryDescribesTable', + 'tableIsGrouped', + 'tableUseColGroup', + 'tabularDataIsInTable', + 'tableCaptionIdentifiesTable', + 'tableSummaryDoesNotDuplicateCaption', + 'tableWithBothHeadersUseScope', + 'tableWithMoreHeadersUseID', + 'inputCheckboxRequiresFieldset', + 'documentVisualListsAreMarkedUp', + 'documentReadingDirection', + 'tableLayoutMakesSenseLinearized', + 'imgNotReferredToByColorAlone', + 'appletsDoneUseColorAlone', + 'inputDoesNotUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'bodyColorContrast', + 'bodyLinkColorContrast', + 'bodyActiveLinkColorContrast', + 'bodyVisitedLinkColorContrast', + 'documentAllColorsAreSet', + 'appletUIMustBeAccessible', + 'objectInterfaceIsAccessible', + 'scriptUIMustBeAccessible', + 'scriptOndblclickRequiresOnKeypress', + 'scriptOnmousedownRequiresOnKeypress', + 'scriptOnmousemove', + 'scriptOnmouseoutHasOnmouseblur', + 'scriptOnmouseoverHasOnfocus', + 'scriptOnmouseupHasOnkeyup', + 'appletProvidesMechanismToReturnToParent', + 'objectProvidesMechanismToReturnToParent', + 'embedProvidesMechanismToReturnToParent', + 'documentMetaNotUsedWithTimeout', + 'blinkIsNotUsed', + 'marqueeIsNotUsed', + 'documentAutoRedirectNotUsed', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'skipToContentLinkProvided', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'documentHasTitleElement', + 'documentTitleNotEmpty', + 'documentTitleIsShort', + 'documentTitleIsNotPlaceholder', + 'documentTitleDescribesDocument', + 'aLinksMakeSenseOutOfContext', + 'aSuspiciousLinkText', + 'aMustContainText', + 'documentLangNotIdentified', + 'documentLangIsISO639Standard', + 'documentWordsNotInLanguageAreMarked', + 'areaDontOpenNewWindow', + 'selectDoesNotChangeContext', + 'labelMustBeUnique', + 'labelMustNotBeEmpty', + 'formWithRequiredLabel', + 'documentIDsMustBeUnique', + 'svgContainsTitle', + 'headersHaveText', + ); +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/wcag2aa.php b/quail/guidelines/wcag2aa.php new file mode 100644 index 0000000..94302c8 --- /dev/null +++ b/quail/guidelines/wcag2aa.php @@ -0,0 +1,171 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup guidelines */ +/*@{*/ + +/** +* WCAG 2.0 Level AA Guideline +*/ +class Wcag2aaGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgAltIsDifferent', + 'imgAltIsTooLong', + 'imgAltNotPlaceHolder', + 'imgAltNotEmptyInAnchor', + 'imgHasLongDesc', + 'imgAltIsSameInText', + 'imgAltEmptyForDecorativeImages', + 'appletContainsTextEquivalentInAlt', + 'appletContainsTextEquivalent', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'inputImageAltIsShort', + 'inputImageAltIsNotPlaceholder', + 'areaHasAltValue', + 'areaAltIdentifiesDestination', + 'areaLinksToSoundFile', + 'objectMustContainText', + 'embedHasAssociatedNoEmbed', + 'inputImageNotDecorative', + 'areaAltRefersToText', + 'inputElementsDontHaveAlt', + 'aLinksToSoundFilesNeedTranscripts', + 'aLinksToMultiMediaRequireTranscript', + 'inputTextHasLabel', + 'pNotUsedAsHeader', + 'selectHasAssociatedLabel', + 'textareaHasAssociatedLabel', + 'textareaLabelPositionedClose', + 'tableComplexHasSummary', + 'tableSummaryIsEmpty', + 'tableLayoutHasNoSummary', + 'tableLayoutHasNoCaption', + 'passwordHasLabel', + 'checkboxHasLabel', + 'fileHasLabel', + 'radioHasLabel', + 'passwordLabelIsNearby', + 'checkboxLabelIsNearby', + 'fileLabelIsNearby', + 'radioLabelIsNearby', + 'tableDataShouldHaveTh', + 'tableLayoutDataShouldNotHaveTh', + 'tableUsesCaption', + 'preShouldNotBeUsedForTabularLayout', + 'radioMarkedWithFieldgroupAndLegend', + 'tableSummaryDescribesTable', + 'tableIsGrouped', + 'tableUseColGroup', + 'tabularDataIsInTable', + 'tableCaptionIdentifiesTable', + 'tableSummaryDoesNotDuplicateCaption', + 'tableWithBothHeadersUseScope', + 'tableWithMoreHeadersUseID', + 'inputCheckboxRequiresFieldset', + 'documentVisualListsAreMarkedUp', + 'documentReadingDirection', + 'tableLayoutMakesSenseLinearized', + 'appletUIMustBeAccessible', + 'objectInterfaceIsAccessible', + 'scriptUIMustBeAccessible', + 'scriptOndblclickRequiresOnKeypress', + 'scriptOnmousedownRequiresOnKeypress', + 'scriptOnmousemove', + 'scriptOnmouseoutHasOnmouseblur', + 'scriptOnmouseoverHasOnfocus', + 'scriptOnmouseupHasOnkeyup', + 'documentMetaNotUsedWithTimeout', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'skipToContentLinkProvided', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'documentWordsNotInLanguageAreMarked', + 'documentLangNotIdentified', + 'documentLangIsISO639Standard', + 'areaDontOpenNewWindow', + 'selectDoesNotChangeContext', + 'documentIDsMustBeUnique', + 'objectShouldHaveLongDescription', + 'blinkIsNotUsed', + 'marqueeIsNotUsed', + 'documentAutoRedirectNotUsed', + 'documentHasTitleElement', + 'documentTitleNotEmpty', + 'documentTitleIsShort', + 'documentTitleIsNotPlaceholder', + 'documentTitleDescribesDocument', + 'appletProvidesMechanismToReturnToParent', + 'objectProvidesMechanismToReturnToParent', + 'embedProvidesMechanismToReturnToParent', + 'imgAltIsSameInText', + 'boldIsNotUsed', + 'iIsNotUsed', + 'basefontIsNotUsed', + 'fontIsNotUsed', + 'bodyColorContrast', + 'bodyLinkColorContrast', + 'bodyActiveLinkColorContrast', + 'bodyVisitedLinkColorContrast', + 'imgNotReferredToByColorAlone', + 'appletsDoneUseColorAlone', + 'inputDoesNotUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'documentAllColorsAreSet', + 'aLinksMakeSenseOutOfContext', + 'aSuspiciousLinkText', + 'aMustContainText', + 'siteMap', + 'headerH1', + 'headerH2', + 'headerH3', + 'headerH4', + 'headerH4', + 'headerH1Format', + 'headerH2Format', + 'headerH3Format', + 'headerH4Format', + 'headerH5Format', + 'headerH6Format', + 'tabIndexFollowsLogicalOrder', + 'listNotUsedForFormatting', + 'blockquoteNotUsedForIndentation', + 'blockquoteUseForQuotations', + 'labelMustBeUnique', + 'labelMustNotBeEmpty', + 'formWithRequiredLabel', + 'formHasGoodErrorMessage', + 'formErrorMessageHelpsUser', + 'formDeleteIsReversable', + 'svgContainsTitle', + 'cssTextHasContrast', + 'headersHaveText', + ); +} +/*@}*/ \ No newline at end of file diff --git a/quail/guidelines/wcag2aaa.php b/quail/guidelines/wcag2aaa.php new file mode 100644 index 0000000..1277d3d --- /dev/null +++ b/quail/guidelines/wcag2aaa.php @@ -0,0 +1,175 @@ +. +* @author Kevin Miller +*/ + + +/** \addtogroup guidelines */ +/*@{*/ + +/** +* WCAG 2.0 Level AAA Guideline +*/ +class Wcag2aaaGuideline extends quailGuideline{ + + /** + * @var array An array of test class names which will be called for this guideline + */ + var $tests = array( + 'imgHasAlt', + 'imgAltIsDifferent', + 'imgAltIsTooLong', + 'imgAltNotPlaceHolder', + 'imgAltNotEmptyInAnchor', + 'imgHasLongDesc', + 'imgAltIsSameInText', + 'imgAltEmptyForDecorativeImages', + 'appletContainsTextEquivalentInAlt', + 'appletContainsTextEquivalent', + 'inputImageHasAlt', + 'inputImageAltIdentifiesPurpose', + 'inputImageAltIsShort', + 'inputImageAltIsNotPlaceholder', + 'areaHasAltValue', + 'areaAltIdentifiesDestination', + 'objectMustContainText', + 'embedHasAssociatedNoEmbed', + 'inputImageNotDecorative', + 'inputElementsDontHaveAlt', + 'aLinksToSoundFilesNeedTranscripts', + 'aLinksToMultiMediaRequireTranscript', + 'objectShouldHaveLongDescription', + 'inputTextHasLabel', + 'pNotUsedAsHeader', + 'selectHasAssociatedLabel', + 'textareaHasAssociatedLabel', + 'textareaLabelPositionedClose', + 'tableComplexHasSummary', + 'tableSummaryIsEmpty', + 'tableLayoutHasNoSummary', + 'tableLayoutHasNoCaption', + 'passwordHasLabel', + 'checkboxHasLabel', + 'fileHasLabel', + 'radioHasLabel', + 'passwordLabelIsNearby', + 'checkboxLabelIsNearby', + 'fileLabelIsNearby', + 'radioLabelIsNearby', + 'tableDataShouldHaveTh', + 'tableLayoutDataShouldNotHaveTh', + 'tableUsesCaption', + 'preShouldNotBeUsedForTabularLayout', + 'radioMarkedWithFieldgroupAndLegend', + 'tableSummaryDescribesTable', + 'tableIsGrouped', + 'tableUseColGroup', + 'tabularDataIsInTable', + 'tableCaptionIdentifiesTable', + 'tableSummaryDoesNotDuplicateCaption', + 'tableWithBothHeadersUseScope', + 'tableWithMoreHeadersUseID', + 'inputCheckboxRequiresFieldset', + 'documentVisualListsAreMarkedUp', + 'documentReadingDirection', + 'tableLayoutMakesSenseLinearized', + 'boldIsNotUsed', + 'iIsNotUsed', + 'basefontIsNotUsed', + 'fontIsNotUsed', + 'inputDoesNotUseColorAlone', + 'objectDoesNotUseColorAlone', + 'scriptsDoNotUseColorAlone', + 'bodyColorContrast', + 'bodyLinkColorContrast', + 'bodyActiveLinkColorContrast', + 'bodyVisitedLinkColorContrast', + 'documentAllColorsAreSet', + 'bodyColorContrast', + 'bodyLinkColorContrast', + 'bodyActiveLinkColorContrast', + 'bodyVisitedLinkColorContrast', + 'objectInterfaceIsAccessible', + 'scriptUIMustBeAccessible', + 'scriptOndblclickRequiresOnKeypress', + 'scriptOnmousedownRequiresOnKeypress', + 'scriptOnmousemove', + 'scriptOnmouseoutHasOnmouseblur', + 'scriptOnmouseoverHasOnfocus', + 'scriptOnmouseupHasOnkeyup', + 'appletProvidesMechanismToReturnToParent', + 'objectProvidesMechanismToReturnToParent', + 'embedProvidesMechanismToReturnToParent', + 'documentMetaNotUsedWithTimeout', + 'blinkIsNotUsed', + 'marqueeIsNotUsed', + 'documentAutoRedirectNotUsed', + 'imgGifNoFlicker', + 'appletsDoNotFlicker', + 'objectDoesNotFlicker', + 'scriptsDoNotFlicker', + 'skipToContentLinkProvided', + 'framesHaveATitle', + 'frameTitlesDescribeFunction', + 'documentHasTitleElement', + 'documentTitleNotEmpty', + 'documentTitleIsShort', + 'documentTitleIsNotPlaceholder', + 'documentTitleDescribesDocument', + 'aMustContainText', + 'siteMap', + 'headerH1', + 'headerH2', + 'headerH3', + 'headerH4', + 'headerH4', + 'headerH1Format', + 'headerH2Format', + 'headerH3Format', + 'headerH4Format', + 'headerH5Format', + 'headerH6Format', + 'headersUseToMarkSections', + 'documentLangNotIdentified', + 'documentLangIsISO639Standard', + 'documentWordsNotInLanguageAreMarked', + 'selectDoesNotChangeContext', + 'tabIndexFollowsLogicalOrder', + 'listNotUsedForFormatting', + 'blockquoteNotUsedForIndentation', + 'blockquoteUseForQuotations', + 'aLinksDontOpenNewWindow', + 'documentIDsMustBeUnique', + 'imgAltIsSameInText', + 'documentAbbrIsUsed', + 'documentAcronymsHaveElement', + 'labelMustBeUnique', + 'labelMustNotBeEmpty', + 'formWithRequiredLabel', + 'formHasGoodErrorMessage', + 'formErrorMessageHelpsUser', + 'formDeleteIsReversable', + 'formErrorMessageHelpsUser', + 'formDeleteIsReversable', + 'svgContainsTitle', + 'documentIsWrittenClearly', + 'cssTextHasContrast', + 'headersHaveText', + ); +} +/*@}*/ \ No newline at end of file diff --git a/quail/quail.php b/quail/quail.php new file mode 100644 index 0000000..a92a4b2 --- /dev/null +++ b/quail/quail.php @@ -0,0 +1,733 @@ +. +* @author Kevin Miller +*/ + +/** +* @var int A severe failure +*/ +define('QUAIL_TEST_SEVERE', 1); +define('QUAIL_TEST_MODERATE', 2); +define('QUAIL_TEST_SUGGESTION', 3); +define('QUAIL_LIB_VERSION', 041); + +/** +* +* +*/ +require_once('common/test.php'); +require_once('common/css.php'); +require_once('common/elements.php'); +require_once('common/domExtensions.php'); +require_once('common/accessibility_tests.php'); + +/** +* The main interface class for quail. +* +*/ +class quail { + /** + * @var object The central QUAIL DOMDocument object + */ + var $dom; + + /** + * @var string The type of request this is (either 'string', 'file', or 'uri' + */ + var $type; + + /** + * @var string The value of the request. Either HTML, a URI, or the path to a file + */ + var $value; + + /** + * @var string The base URI of the current request (used to rebuild page if necessary) + */ + var $uri; + + /** + * @var string The translation domain of the currnet library + */ + var $domain; + + /** + * @var string The name of the guideline + */ + var $guideline_name = 'wcag'; + + /** + * @var string The name of the reporter to use + */ + var $reporter_name = 'static'; + + /** + * @var object A QUAIL reporting object + */ + var $reporter; + + /** + * @var object The central guideline object + */ + var $guideline; + + /** + * @var string The base URL for any request of type URI + */ + var $base_url; + + /** + * @var array An array of the current file or URI path + */ + var $path = array(); + + /** + * @var array An array of additional CSS files to load (useful for CMS content) + */ + var $css_files; + + /** + * @var object The QuailCSS object + */ + var $css; + + /** + * @var array An array of additional options + */ + var $options = array( + 'cms_mode' => false, + 'start_element' => 0, + 'end_element' => 0, + 'cms_template' => array()); + + /** + * @var bool An indicator if the DOMDocument loaded. If not, this means that the + * HTML given to it was so munged it wouldn't even load. + */ + var $is_valid = true; + + /** + * The class constructor + * @param string $value Either the HTML string to check or the file/uri of the request + * @param string $guideline The name of the guideline + * @param string $type The type of the request (either file, uri, or string) + * @param string $reporter The name of the reporter to use + * @param string $domain The domain of the translation language to use + */ + function __construct($value, $guideline = 'wcag', $type = 'string', $reporter = 'static', $domain = 'en') { + $this->dom = new DOMDocument(); + $this->type = $type; + if($type == 'uri' || $type == 'file') { + $this->uri = $value; + } + $this->domain = $domain; + $this->guideline_name = $guideline; + $this->reporter_name = $reporter; + $this->value = $value; + + } + + /** + * Preapres the DOMDocument object for quail. It loads based on the file type + * declaration and first scrubs the value using prepareValue() + */ + function prepareDOM() { + $this->prepareValue(); + $this->is_valid = @$this->dom->loadHTML($this->value); + $this->prepareBaseUrl($this->value, $this->type); + } + + /** + * If the CMS mode options are set, then we remove some items fromt the + * HTML value before sending it back. + * + */ + function prepareValue() { + + //We ignore the 'string' type because it would mean the value already contains HTML + if($this->type == 'file' || $this->type == 'uri') { + $this->value = @file_get_contents($this->value); + } + } + + + /** + * Set global predefined options for QUAIL. First we check that the + * array key has been defined. + * @param mixed $variable Either an array of values, or a variable name of the option + * @param mixed $value If this is a single option, the value of the option + */ + function setOption($variable, $value = null) { + if(!is_array($variable)) { + $variable = array($variable => $value); + } + foreach($variable as $k => $value) { + if(isset($this->options[$k])) { + $this->options[$k] = $value; + } + } + } + + /** + * Returns an absolute path from a relative one + * @param string $absolute The absolute URL + * @param string $relative The relative path + * @return string A new path + */ + + function getAbsolutePath($absolute, $relative) { + if(substr($relative, 0, 2) == '//') { + if($this->uri) { + $current = parse_url($this->uri); + } + else { + $current = array('scheme' => 'http'); + } + return $current['scheme'] .':'. $relative; + } + $relative_url = parse_url($relative); + if (isset($relative_url['scheme'])) { + return $relative; + } + $absolute_url = parse_url($absolute); + if(isset($absolute_url['path'])) { + $path = dirname($absolute_url['path']); + } + if ($relative{0} == '/') { + $c_parts = array_filter(explode('/', $relative)); + } + else { + $a_parts = array_filter(explode('/', $path)); + $r_parts = array_filter(explode('/', $relative)); + $c_parts = array_merge($a_parts, $r_parts); + foreach ($c_parts as $i => $part) { + if ($part == '.') { + $c_parts[$i] = NULL; + } + if ($part == '..') { + $c_parts[$i - 1] = NULL; + $c_parts[$i] = NULL; + } + } + $c_parts = array_filter($c_parts); + } + $path = implode('/', $c_parts); + $url = ""; + if (isset($absolute_url['scheme'])) { + $url = $absolute_url['scheme'] .'://'; + } + if (isset($absolute_url['user'])) { + $url .= $absolute_url['user']; + if ($absolute_url['pass']) { + $url .= ':'. $absolute_url['user']; + } + $url .= '@'; + } + if (isset($absolute_url['host'])) { + $url .= $absolute_url['host']; + if(isset($absolute_url['port'])) { + $url .= ':'. $absolute_url['port']; + } + $url .= '/'; + } + $url .= $path; + return $url; + } + + /** + * Sets the URI if this is for a string or to change where + * QUAIL will look for resources like CSS files + * @param string $uri The URI to set + */ + function setUri($uri) { + if(parse_url($uri)) { + $this->uri = $uri; + } + } + + /** + * Formats the base URL for either a file or uri request. We are essentially + * formatting a base url for future reporters to use to find CSS files or + * for tests that use external resources (images, objects, etc) to run tests on them. + * @param string $value The path value + * @param string $type The type of request + */ + function prepareBaseUrl($value, $type) { + if($type == 'file') { + $path = explode('/', $this->uri); + array_pop($path); + $this->path = $path; + } + elseif($type == 'uri' || $this->uri) { + + $parts = explode('://', $this->uri); + $this->path[] = $parts[0] .':/'; + if(is_array($parts[1])) { + foreach(explode('/', $this->getBaseFromFile($parts[1])) as $part) { + $this->path[] = $part; + } + } + else { + $this->path[] = $parts[1] .'/'; + } + } + } + + /** + * Retrieves the absolute path to a file + * @param string $file The path to a file + * @return string The absolute path to a file + */ + function getBaseFromFile($file) { + $find = '/'; + $after_find = substr(strrchr($file, $find), 1); + $strlen_str = strlen($after_find); + $result = substr($file, 0, -$strlen_str); + return $result; + } + + + + /** + * Helper method to add an additional CSS file + * @param string $css The URI or file path to a CSS file + */ + function addCSS($css) { + if(is_array($css)) { + $this->css_files = $css; + } + else { + $this->css_files[] = $css; + } + } + + /** + * Retrives a single error from the current reporter + * @param string $error The error key + * @return object A QuailReportItem object + */ + function getError($error) { + return $this->reporter->getError($error); + } + + /** + * A local method to load the required file for a reporter and set it for the current QUAIL object + * @param array $options An array of options for the reporter + */ + function loadReporter($options = array()) { + $classname = 'report'.ucfirst($this->reporter_name); + if(!class_exists($classname)) { + require_once('reporters/reporter.'. $this->reporter_name .'.php'); + } + $this->reporter = new $classname($this->dom, $this->css, $this->guideline, $this->path); + if(count($options)) + $this->reporter->setOptions($options); + } + + + /** + * Checks that the DOM object is valid or not + * @return bool Whether the DOMDocument is valid + */ + function isValid() { + return $this->is_valid; + } + + + /** + * Starts running automated checks. Loads the CSS file parser + * and the guideline object. + */ + function runCheck($options = null) { + $this->prepareDOM(); + if(!$this->isValid()) + return false; + $this->getCSSObject(); + $classname = ucfirst(strtolower($this->guideline_name)).'Guideline'; + if(!class_exists($classname)) { + require_once('guidelines/'. $this->guideline_name .'.php'); + } + $this->guideline = new $classname($this->dom, $this->css, $this->path, $options, $this->domain, $this->options['cms_mode']); + } + + /** + * Loads the quailCSS object + */ + function getCSSObject() { + $this->css = new quailCSS($this->dom, $this->uri, $this->type, $this->path, false, $this->css_files); + } + + /** + * Returns a formatted report from the current reporter. + * @param array $options An array of all the options + * @return mixed See the documentation on your reporter's getReport method. + */ + function getReport($options = array()) { + if(!$this->reporter) + $this->loadReporter($options); + if($options) { + $this->reporter->setOptions($options); + } + return $this->reporter->getReport(); + } + + /** + * Runs one test on the current DOMDocument + * @pararm string $test The name of the test to run + * @reutrn object The QuailReportItem returned from the test + */ + function getTest($test) { + if(!class_exists($test)) { + return false; + } + $test_class = new $test($this->dom, $this->css, $this->path); + return $test_class->report; + } + + /** + * Retrieves the default severity of a test + * @pararm string $test The name of the test to run + * @reutrn object The severity level of the test + */ + function getTestSeverity($test) { + $test_class = new $test($this->dom, $this->css, $this->path); + return $test_class->getSeverity(); + } + + /** + * A general cleanup function which just does some memory + * cleanup by unsetting the particularly large local vars. + */ + function cleanup() { + unset($this->dom); + unset($this->css); + unset($this->guideline); + unset($this->reporter); + } +} + +/** +* The base classe for a reporter +*/ +class quailReporter { + + /** + * @var object The current document's DOMDocument + */ + var $dom; + + /** + * @var object The current quailCSS object + */ + var $css; + + /** + * @var array An array of test names and the translation for the problems with it + */ + var $translation; + + /** + * @var array A collection of quailReportItem objects + */ + var $report; + + /** + * @var array The path to the current document + */ + var $path; + + /** + * @var object Additional options for this reporter + */ + var $options; + + /** + * @var array An array of attributes to search for to turn into absolute paths rather than + * relative paths + */ + var $absolute_attributes = array('src', 'href'); + + /** + * The class constructor + * @param object $dom The current DOMDocument object + * @param object $css The current QuailCSS object + * @param object $guideline The current guideline object + * @param string $domain The current translation domain + * @param string $path The current path + */ + function __construct(&$dom, &$css, &$guideline, $path = '') { + $this->dom = &$dom; + $this->css = &$css; + $this->path = $path; + $this->options = new stdClass; + $this->guideline = &$guideline; + } + + + + /** + * Sets options for the reporter + * @param array $options an array of options + */ + function setOptions($options) { + foreach($options as $key => $value) { + $this->options->$key = $value; + } + } + + /** + * Sets the absolute path for an element + * @param object $element A DOMElement object to turn into an absolute path + */ + function setAbsolutePath(&$element) { + foreach($this->absolute_attributes as $attribute) { + if($element->hasAttribute($attribute)) + $attr = $attribute; + } + + if($attr) { + $item = $element->getAttribute($attr); + //We are ignoring items with absolute URLs + if(strpos($item, '://') === false) { + + $item = implode('/', $this->path) . ltrim($item, '/'); + $element->setAttribute($attr, $item); + + } + } + if($element->tagName == 'style') { + if(strpos($element->nodeValue, '@import') !== false) { + + + } + } + } + +} + +/** +* A report item. There is one per issue with the report +* +*/ +class quailReportItem { + + /** + * @var object The DOMElement that the report item refers to (if any) + */ + var $element; + + /** + * @var string The error message + */ + var $message; + + /** + * @var bool Whether the check needs to be manually verified + */ + var $manual; + + /** + * @var bool For document-level tests, this says whether the test passed or not + */ + var $pass; + + /** + * Returns the line number of the report item. Unfortunately we can't use getLineNo + * if we are before PHP 5.3, so if not we try to get the line number through a more + * circuitous way. + */ + function getLine() { + if(is_object($this->element) && method_exists($this->element, 'getLineNo')) { + return $this->element->getLineNo(); + } + return 0; + } + + /** + * Returns the current element in plain HTML form + * @param array $extra_attributes An array of extra attributes to add to the element + * @return string An HTML string version of the provided DOMElement object + */ + function getHTML($extra_attributes = array()) { + if(!$this->element) + return ''; + $result_dom = new DOMDocument(); + try { + + $result_element = $result_dom->createElement(utf8_encode($this->element->tagName)); + } + catch (Exception $e) { + return false; + } + foreach($this->element->attributes as $attribute) { + if($attribute->name != 'quail_style_index') { + $result_element->setAttribute($attribute->name, $attribute->value); + } + } + foreach($extra_attributes as $name => $value) { + $result_element->setAttribute($name, $value); + } + $result_element->nodeValue = htmlentities($this->element->nodeValue); + //We utf8 encode per http://us2.php.net/manual/en/domdocument.save.php#67952 + //$result_dom->appendChild(utf8_encode($result_element)); + @$result_dom->appendChild($result_element); + return @$result_dom->saveHTML(); + + } + +} + +/** +* The base class for a guideline +* +*/ +class quailGuideline { + + /** + * @var object The current document's DOMDocument + */ + var $dom; + + /** + * @var object The current quailCSS object + */ + var $css; + + /** + * @var array The path to the current document + */ + var $path; + + /** + * @var array An array of report objects + */ + var $report; + + /** + * @var array An array of translations for all this guideline's tests + */ + var $translations; + + /** + * @var bool Whether we are running in CMS mode + */ + var $cms_mode = false; + + /** + * @var array An array of all the severity levels for every test + */ + + var $severity = array(); + + /** + * The class constructor + * @param object $dom The current DOMDocument object + * @param object $css The current QuailCSS object + * @param string $path The current path + */ + + function __construct(&$dom, &$css, &$path, $arg = null, $domain = 'en', $cms_mode = false) { + $this->dom = &$dom; + $this->css = &$css; + $this->path = &$path; + $this->cms_mode = $cms_mode; + $this->loadTranslations($domain); + $this->run($arg, $domain); + } + + /** + * Returns an array of all the tests associated with the current guideline + * @return array + */ + function getTests() { + return $this->tests; + } + + /** + * Loads translations from a file. This can be overriden, just as long as the + * local variable 'translations' is an associative array with test function names + * as the key + */ + function loadTranslations($domain) { + $csv = fopen(dirname(__FILE__) .'/guidelines/translations/'. $domain .'.txt', 'r'); + if ($csv) { + while ($translation = fgetcsv($csv)) { + if(count($translation) == 4) { + $this->translations[$translation[0]] = array( + 'title' => $translation[1], + 'description' => $translation[2], + ); + } + } + } + } + /** + * Returns the translation for a test name. + * @param string $test The function name of the test + */ + function getTranslation($testname) { + $translation = (isset($this->translations[$testname])) + ? $this->translations[$testname] + : $testname; + return $translation; + } + /** + * Iterates through each test string, makes a new test object, and runs it against the current DOM + */ + function run($arg = null, $language = 'en') { + foreach($this->tests as $testname => $options) { + if(is_numeric($testname) && !is_array($options)) { + $testname = $options; + } + if(class_exists($testname) && $this->dom) { + $$testname = new $testname($this->dom, $this->css, $this->path, $language, $arg); + if(!$this->cms_mode || ($$testname->cms && $this->cms_mode)) { + $this->report[$testname] = $$testname->getReport(); + } + $this->severity[$testname] = $$testname->default_severity; + unset($$testname); + } + else { + $this->report[$testname] = false; + } + } + } + + /** + * Returns all the Report variable + * @reutrn mixed Look to your report to see what it returns + */ + function getReport(){ + return $this->report; + } + + /** + * Returns the severity level of a given test + * @param string $testname The name of the test + * @return int The severity level + */ + function getSeverity($testname) { + if(isset($this->tests[$testname]['severity'])) { + return $this->tests[$testname]['severity']; + } + if(isset($this->severity[$testname])) { + return $this->severity[$testname]; + } + return QUAIL_TEST_MODERATE; + } +} \ No newline at end of file diff --git a/quail/reporters/.svn/all-wcprops b/quail/reporters/.svn/all-wcprops new file mode 100644 index 0000000..8fecccb --- /dev/null +++ b/quail/reporters/.svn/all-wcprops @@ -0,0 +1,35 @@ +K 25 +svn:wc:ra_dav:version-url +V 44 +/svn/!svn/ver/232/tags/0.4.1/quail/reporters +END +reporter.array.php +K 25 +svn:wc:ra_dav:version-url +V 63 +/svn/!svn/ver/232/tags/0.4.1/quail/reporters/reporter.array.php +END +reporter.xml.php +K 25 +svn:wc:ra_dav:version-url +V 61 +/svn/!svn/ver/232/tags/0.4.1/quail/reporters/reporter.xml.php +END +reporter.codeHighlight.php +K 25 +svn:wc:ra_dav:version-url +V 71 +/svn/!svn/ver/232/tags/0.4.1/quail/reporters/reporter.codeHighlight.php +END +reporter.demo.php +K 25 +svn:wc:ra_dav:version-url +V 62 +/svn/!svn/ver/232/tags/0.4.1/quail/reporters/reporter.demo.php +END +reporter.static.php +K 25 +svn:wc:ra_dav:version-url +V 64 +/svn/!svn/ver/232/tags/0.4.1/quail/reporters/reporter.static.php +END diff --git a/quail/reporters/.svn/entries b/quail/reporters/.svn/entries new file mode 100644 index 0000000..ab47231 --- /dev/null +++ b/quail/reporters/.svn/entries @@ -0,0 +1,198 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/quail/reporters +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-09-05T17:05:37.678400Z +231 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +reporter.array.php +file + + + + +2010-12-08T21:44:03.000000Z +fa0cc3cfbf6b0e98fc1e1efec93582bb +2010-04-11T21:36:15.313600Z +159 +keveemiller + + + + + + + + + + + + + + + + + + + + + +2000 + +reporter.xml.php +file + + + + +2010-12-08T21:44:03.000000Z +02dc773006e51fea11a813e2110daf0a +2010-04-11T22:20:47.172683Z +160 +keveemiller + + + + + + + + + + + + + + + + + + + + + +2475 + +reporter.codeHighlight.php +file + + + + +2010-12-08T21:44:03.000000Z +10187434a8dfced429554586657477ff +2010-09-05T17:05:37.678400Z +231 +keveemiller + + + + + + + + + + + + + + + + + + + + + +2917 + +reporter.demo.php +file + + + + +2010-12-08T21:44:03.000000Z +d9426ab44baf7fd15397210aa9b8f8a9 +2010-02-15T00:29:18.130166Z +127 +keveemiller + + + + + + + + + + + + + + + + + + + + + +5995 + +reporter.static.php +file + + + + +2010-12-08T21:44:03.000000Z +8e40ef84ed98929899b7388369556c23 +2010-02-15T00:29:18.130166Z +127 +keveemiller + + + + + + + + + + + + + + + + + + + + + +2086 + diff --git a/quail/reporters/.svn/text-base/reporter.array.php.svn-base b/quail/reporters/.svn/text-base/reporter.array.php.svn-base new file mode 100644 index 0000000..b1bfecc --- /dev/null +++ b/quail/reporters/.svn/text-base/reporter.array.php.svn-base @@ -0,0 +1,56 @@ +. +* @author Kevin Miller +*/ +/** \addtogroup reporters */ +/*@{*/ +/** +* An array reporter that simply returns an unformatted and nested PHP array of +* tests and report objects +*/ + +class reportArray extends quailReporter { + + /** + * Generates a static list of errors within a div. + * @return array A nested array of tests and problems with Report Item objects + */ + function getReport() { + $results = $this->guideline->getReport(); + if(!is_array($results)) + return null; + foreach($results as $testname => $test) { + $translation = $this->guideline->getTranslation($testname); + $output[$testname]['severity'] = $this->guideline->getSeverity($testname); + $output[$testname]['title'] = $translation['title']; + $output[$testname]['body'] = $translation['description']; + foreach($test as $k => $problem) { + if(is_object($problem)) { + $output[$testname]['problems'][$k]['element'] = htmlentities($problem->getHtml()); + $output[$testname]['problems'][$k]['line'] = $problem->getLine(); + if($problem->message) { + $output[$testname]['problems']['message'] = $problem->message; + } + $output[$testname]['problems']['pass'] = $problem->pass; + } + } + } + return $output; + } +} +/*@}*/ \ No newline at end of file diff --git a/quail/reporters/.svn/text-base/reporter.codeHighlight.php.svn-base b/quail/reporters/.svn/text-base/reporter.codeHighlight.php.svn-base new file mode 100644 index 0000000..db85aa5 --- /dev/null +++ b/quail/reporters/.svn/text-base/reporter.codeHighlight.php.svn-base @@ -0,0 +1,78 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup reporters */ +/*@{*/ +/** +* Returns a formatted HTML view of the problems +*/ +class reportCodeHighlight extends quailReporter { + + /** + * @var array An array of the classnames to be associated with items + */ + var $classnames = array(QUAIL_TEST_SEVERE => 'quail_severe', + QUAIL_TEST_MODERATE => 'quail_moderate', + QUAIL_TEST_SUGGESTION => 'quail_suggestion', + ); + + /** + * The getReport method - we iterate through every test item and + * add additional attributes to build the report UI. + * @return string A fully-formed HTML document. + */ + function getReport() { + $problems = $this->guideline->getReport(); + if(is_array($problems)) { + foreach($problems as $testname => $test) { + if(!isset($this->options->display_level) || $this->options->display_level >= $test['severity'] && is_array($test)) { + foreach($test as $k => $problem) { + if(is_object($problem) + && property_exists($problem, 'element') + && is_object($problem->element)) { + //Wrap each error with a "wrapper" node who's tag name is the severity + //level class. We'll fix this later and change them back to 'span' elements + //after we have converted the HTML code to entities. + $severity_wrapper = $this->dom->createElement($this->classnames[$test['severity']]); + $severity_wrapper->setAttribute('class', $this->classnames[$test['severity']] .' '. $testname); + $severity_wrapper->setAttribute('test', $testname); + $severity_wrapper->appendChild($problem->element->cloneNode(TRUE)); + $parent = $problem->element->parentNode; + if(is_object($parent)) { + $parent->replaceChild($severity_wrapper, $problem->element); + } + } + } + } + } + } + $this->dom->formatOutput = true; + $html = htmlspecialchars($this->dom->saveHTML()); + $html = str_replace('"', '"', $html); + foreach($this->classnames as $severity => $name) { + $html = preg_replace('/<'. $name .'([^&]+)+\>/', '', $html); + $html = str_replace('</'. $name .'>', '', $html); + } + return $html; + } +} + +/*@}*/ \ No newline at end of file diff --git a/quail/reporters/.svn/text-base/reporter.demo.php.svn-base b/quail/reporters/.svn/text-base/reporter.demo.php.svn-base new file mode 100644 index 0000000..ff58315 --- /dev/null +++ b/quail/reporters/.svn/text-base/reporter.demo.php.svn-base @@ -0,0 +1,157 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup reporters */ +/*@{*/ +/** +* Returns the entire document marked-up to highlight problems. +*/ +class reportDemo extends quailReporter { + + /** + * @var array An array of the classnames to be associated with items + */ + var $classnames = array(QUAIL_TEST_SEVERE => 'quail_severe', + QUAIL_TEST_MODERATE => 'quail_moderate', + QUAIL_TEST_SUGGESTION => 'quail_suggestion', + ); + + /** + * The getReport method - we iterate through every test item and + * add additional attributes to build the report UI. + * @return string A fully-formed HTML document. + */ + function getReport() { + $problems = $this->guideline->getReport(); + if(is_array($problems)) { + foreach($problems as $testname => $test) { + if(!isset($this->options->display_level) || $this->options->display_level >= $test['severity'] && is_array($test)) { + foreach($test as $k => $problem) { + if(is_object($problem) && property_exists($problem, 'element') && is_object($problem->element)) { + $existing = $problem->element->getAttribute('style'); + $problem->element->setAttribute('style', + $existing .'; border: 2px solid red;'); + if(isset($this->options->image_url)) { + $image = $this->dom->createElement('img'); + $image = $problem->element->parentNode->insertBefore($image, $problem->element); + $image->setAttribute('alt', $testname); + if($problem->message) { + $image->setAttribute('title', $problem->message); + } + $image->setAttribute('src', $this->options->image_url[$test['severity']]); + + } + //$problem->nodeValue .= $this->guideline->getSeverity($k); + } + } + } + } + } + + return $this->completeURLs($this->dom->saveHTML(), implode('/', $this->path)); + } + + + /** + * Finds the final postion of a needle in the haystack + */ + function strnpos($haystack, $needle, $occurance, $pos = 0) { + for ($i = 1; $i <= $occurance; $i++) { + $pos = strpos($haystack, $needle, $pos) + 1; + } + return $pos - 1; + } + + /** + * A helper function for completeURLs. Parses a URL into an the scheme, host, and path + * @param string $url The URL to parse + * @return array An array that includes the scheme, host, and path of the URL + */ + function parseURL($url) { + //protocol(1), auth user(2), auth password(3), hostname(4), path(5), filename(6), file extension(7) and query(8) + $pattern = "/^(?:(http[s]?):\/\/(?:(.*):(.*)@)?([^\/]+))?((?:[\/])?(?:[^\.]*?)?(?:[\/])?)?(?:([^\/^\.]+)\.([^\?]+))?(?:\?(.+))?$/i"; + preg_match($pattern, $url, $matches); + + $URI_PARTS["scheme"] = $matches[1]; + $URI_PARTS["host"] = $matches[4]; + $URI_PARTS["path"] = $matches[5]; + + return $URI_PARTS; + } + + /** + * Turns all relative links to absolute links so that the page can be rendered correctly. + * @param string $HTML A complete HTML document + * @param string $url The absolute URL to the document + * @return string A HTML document with all the relative links converted to absolute links + */ + function completeURLs($HTML, $url) { + $URI_PARTS = $this->parseURL($url); + $path = trim($URI_PARTS["path"], "/"); + $host_url = trim($URI_PARTS["host"], "/"); + + //$host = $URI_PARTS["scheme"]."://".trim($URI_PARTS["host"], "/")."/".$path; //ORIGINAL + $host = $URI_PARTS["scheme"]."://".$host_url."/".$path."/"; + $host_no_path = $URI_PARTS["scheme"]."://".$host_url."/"; + + //Proxifies local META redirects + $HTML = preg_replace('@\s"\']+)\\1[^>]*>/i', "
", $HTML); + + //Matches '/[any assortment of chars or nums]/../' + $HTML = preg_replace("#\/(\w*?)\/\.\.\/(.*?)>#ims", "/\$2>", $HTML); + + //Matches '/./' + $HTML = preg_replace("#\/\.\/(.*?)>#ims", "/\$1>", $HTML); + + //Handles CSS2 imports + if (strpos($HTML, "import url(\"http") == false && (strpos($HTML, "import \"http") == false) && strpos($HTML, "import url(\"www") == false && (strpos($HTML, "import \"www") == false)) { + $pattern = "#import .(.*?).;#ims"; + $mainurl = substr($host, 0, $this->strnpos($host, "/", 3)); + $replace = "import '".$mainurl."\$1';"; + $HTML = preg_replace($pattern, $replace, $HTML); + } + + return $HTML; + } + +} + +/*@}*/ \ No newline at end of file diff --git a/quail/reporters/.svn/text-base/reporter.static.php.svn-base b/quail/reporters/.svn/text-base/reporter.static.php.svn-base new file mode 100644 index 0000000..548fd0d --- /dev/null +++ b/quail/reporters/.svn/text-base/reporter.static.php.svn-base @@ -0,0 +1,65 @@ +. +* @author Kevin Miller +*/ +/** \addtogroup reporters */ +/*@{*/ +/** +* A static reporter. Generates a list of errors which do not pass and their severity. +* This is just a demonstration of what you can do with a reporter. +*/ + +class reportStatic extends quailReporter { + + /** + * Generates a static list of errors within a div. + * @return string A fully-formatted report + */ + function getReport() { + $output = ''; + foreach($this->guideline->getReport() as $testname => $test) { + if(count($test) > 0) { + $severity = $this->guideline->getSeverity($testname); + $translation = $this->guideline->getTranslation($testname); + $output .= '

'. $translation['title'] .'

'. $translation['description'] .'
'; + if(is_array($test)) { + foreach($test as $k => $problem) { + if(is_object($problem)) + $output .= '

'.($k+1).'

'. htmlentities($problem->getHtml()) .'

'; + + } + } + $output .='

'; + switch($severity) { + case QUAIL_TEST_SEVERE: + $output .= 'Severe error'; + break; + case QUAIL_TEST_MODERATE: + $output .= 'Moderate error'; + break; + case QUAIL_TEST_SUGGESTION: + $output .= 'Suggestion'; + break; + } + $output .='

'; + } + } + return $output; + } +} +/*@}*/ \ No newline at end of file diff --git a/quail/reporters/.svn/text-base/reporter.xml.php.svn-base b/quail/reporters/.svn/text-base/reporter.xml.php.svn-base new file mode 100644 index 0000000..e86de42 --- /dev/null +++ b/quail/reporters/.svn/text-base/reporter.xml.php.svn-base @@ -0,0 +1,64 @@ +. +* @author Kevin Miller +*/ +/** \addtogroup reporters */ +/*@{*/ +/** +* Returns an ATOM feed of all the issues - useful to run this as a web service +*/ + +class reportXml extends quailReporter { + + /** + * Generates an ATOM feed of accessibility problems + * @return array A nested array of tests and problems with Report Item objects + */ + function getReport() { + $output = " + "; + $results = $this->guideline->getReport(); + if(!is_array($results)) + return null; + foreach($results as $testname => $test) { + $translation = $this->guideline->getTranslation($testname); + $output .= "\n\t + ". date('c') .""; + $output .= "\n\t". $translation['title'] .""; + $output .= "\n\t"; + $output .= "\n\t"; + foreach($test as $k => $problem) { + if(is_object($problem)) { + $output .= "\n\tgetHtml()) ."]]>"; + $output .= "\n\t". $problem->getLine() .""; + if($problem->message) { + $output .= "\n\t$problem->message"; + } + $output .= "\n\t$problem->pass"; + } + } + $output .= "\n\t"; + $output .= ""; + } + $output .= ""; + return $output; + } +} +/*@}*/ \ No newline at end of file diff --git a/quail/reporters/reporter.array.php b/quail/reporters/reporter.array.php new file mode 100644 index 0000000..b1bfecc --- /dev/null +++ b/quail/reporters/reporter.array.php @@ -0,0 +1,56 @@ +. +* @author Kevin Miller +*/ +/** \addtogroup reporters */ +/*@{*/ +/** +* An array reporter that simply returns an unformatted and nested PHP array of +* tests and report objects +*/ + +class reportArray extends quailReporter { + + /** + * Generates a static list of errors within a div. + * @return array A nested array of tests and problems with Report Item objects + */ + function getReport() { + $results = $this->guideline->getReport(); + if(!is_array($results)) + return null; + foreach($results as $testname => $test) { + $translation = $this->guideline->getTranslation($testname); + $output[$testname]['severity'] = $this->guideline->getSeverity($testname); + $output[$testname]['title'] = $translation['title']; + $output[$testname]['body'] = $translation['description']; + foreach($test as $k => $problem) { + if(is_object($problem)) { + $output[$testname]['problems'][$k]['element'] = htmlentities($problem->getHtml()); + $output[$testname]['problems'][$k]['line'] = $problem->getLine(); + if($problem->message) { + $output[$testname]['problems']['message'] = $problem->message; + } + $output[$testname]['problems']['pass'] = $problem->pass; + } + } + } + return $output; + } +} +/*@}*/ \ No newline at end of file diff --git a/quail/reporters/reporter.codeHighlight.php b/quail/reporters/reporter.codeHighlight.php new file mode 100644 index 0000000..db85aa5 --- /dev/null +++ b/quail/reporters/reporter.codeHighlight.php @@ -0,0 +1,78 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup reporters */ +/*@{*/ +/** +* Returns a formatted HTML view of the problems +*/ +class reportCodeHighlight extends quailReporter { + + /** + * @var array An array of the classnames to be associated with items + */ + var $classnames = array(QUAIL_TEST_SEVERE => 'quail_severe', + QUAIL_TEST_MODERATE => 'quail_moderate', + QUAIL_TEST_SUGGESTION => 'quail_suggestion', + ); + + /** + * The getReport method - we iterate through every test item and + * add additional attributes to build the report UI. + * @return string A fully-formed HTML document. + */ + function getReport() { + $problems = $this->guideline->getReport(); + if(is_array($problems)) { + foreach($problems as $testname => $test) { + if(!isset($this->options->display_level) || $this->options->display_level >= $test['severity'] && is_array($test)) { + foreach($test as $k => $problem) { + if(is_object($problem) + && property_exists($problem, 'element') + && is_object($problem->element)) { + //Wrap each error with a "wrapper" node who's tag name is the severity + //level class. We'll fix this later and change them back to 'span' elements + //after we have converted the HTML code to entities. + $severity_wrapper = $this->dom->createElement($this->classnames[$test['severity']]); + $severity_wrapper->setAttribute('class', $this->classnames[$test['severity']] .' '. $testname); + $severity_wrapper->setAttribute('test', $testname); + $severity_wrapper->appendChild($problem->element->cloneNode(TRUE)); + $parent = $problem->element->parentNode; + if(is_object($parent)) { + $parent->replaceChild($severity_wrapper, $problem->element); + } + } + } + } + } + } + $this->dom->formatOutput = true; + $html = htmlspecialchars($this->dom->saveHTML()); + $html = str_replace('"', '"', $html); + foreach($this->classnames as $severity => $name) { + $html = preg_replace('/<'. $name .'([^&]+)+\>/', '', $html); + $html = str_replace('</'. $name .'>', '', $html); + } + return $html; + } +} + +/*@}*/ \ No newline at end of file diff --git a/quail/reporters/reporter.demo.php b/quail/reporters/reporter.demo.php new file mode 100644 index 0000000..ff58315 --- /dev/null +++ b/quail/reporters/reporter.demo.php @@ -0,0 +1,157 @@ +. +* @author Kevin Miller +*/ + +/** \addtogroup reporters */ +/*@{*/ +/** +* Returns the entire document marked-up to highlight problems. +*/ +class reportDemo extends quailReporter { + + /** + * @var array An array of the classnames to be associated with items + */ + var $classnames = array(QUAIL_TEST_SEVERE => 'quail_severe', + QUAIL_TEST_MODERATE => 'quail_moderate', + QUAIL_TEST_SUGGESTION => 'quail_suggestion', + ); + + /** + * The getReport method - we iterate through every test item and + * add additional attributes to build the report UI. + * @return string A fully-formed HTML document. + */ + function getReport() { + $problems = $this->guideline->getReport(); + if(is_array($problems)) { + foreach($problems as $testname => $test) { + if(!isset($this->options->display_level) || $this->options->display_level >= $test['severity'] && is_array($test)) { + foreach($test as $k => $problem) { + if(is_object($problem) && property_exists($problem, 'element') && is_object($problem->element)) { + $existing = $problem->element->getAttribute('style'); + $problem->element->setAttribute('style', + $existing .'; border: 2px solid red;'); + if(isset($this->options->image_url)) { + $image = $this->dom->createElement('img'); + $image = $problem->element->parentNode->insertBefore($image, $problem->element); + $image->setAttribute('alt', $testname); + if($problem->message) { + $image->setAttribute('title', $problem->message); + } + $image->setAttribute('src', $this->options->image_url[$test['severity']]); + + } + //$problem->nodeValue .= $this->guideline->getSeverity($k); + } + } + } + } + } + + return $this->completeURLs($this->dom->saveHTML(), implode('/', $this->path)); + } + + + /** + * Finds the final postion of a needle in the haystack + */ + function strnpos($haystack, $needle, $occurance, $pos = 0) { + for ($i = 1; $i <= $occurance; $i++) { + $pos = strpos($haystack, $needle, $pos) + 1; + } + return $pos - 1; + } + + /** + * A helper function for completeURLs. Parses a URL into an the scheme, host, and path + * @param string $url The URL to parse + * @return array An array that includes the scheme, host, and path of the URL + */ + function parseURL($url) { + //protocol(1), auth user(2), auth password(3), hostname(4), path(5), filename(6), file extension(7) and query(8) + $pattern = "/^(?:(http[s]?):\/\/(?:(.*):(.*)@)?([^\/]+))?((?:[\/])?(?:[^\.]*?)?(?:[\/])?)?(?:([^\/^\.]+)\.([^\?]+))?(?:\?(.+))?$/i"; + preg_match($pattern, $url, $matches); + + $URI_PARTS["scheme"] = $matches[1]; + $URI_PARTS["host"] = $matches[4]; + $URI_PARTS["path"] = $matches[5]; + + return $URI_PARTS; + } + + /** + * Turns all relative links to absolute links so that the page can be rendered correctly. + * @param string $HTML A complete HTML document + * @param string $url The absolute URL to the document + * @return string A HTML document with all the relative links converted to absolute links + */ + function completeURLs($HTML, $url) { + $URI_PARTS = $this->parseURL($url); + $path = trim($URI_PARTS["path"], "/"); + $host_url = trim($URI_PARTS["host"], "/"); + + //$host = $URI_PARTS["scheme"]."://".trim($URI_PARTS["host"], "/")."/".$path; //ORIGINAL + $host = $URI_PARTS["scheme"]."://".$host_url."/".$path."/"; + $host_no_path = $URI_PARTS["scheme"]."://".$host_url."/"; + + //Proxifies local META redirects + $HTML = preg_replace('@\s"\']+)\\1[^>]*>/i', "", $HTML); + + //Matches '/[any assortment of chars or nums]/../' + $HTML = preg_replace("#\/(\w*?)\/\.\.\/(.*?)>#ims", "/\$2>", $HTML); + + //Matches '/./' + $HTML = preg_replace("#\/\.\/(.*?)>#ims", "/\$1>", $HTML); + + //Handles CSS2 imports + if (strpos($HTML, "import url(\"http") == false && (strpos($HTML, "import \"http") == false) && strpos($HTML, "import url(\"www") == false && (strpos($HTML, "import \"www") == false)) { + $pattern = "#import .(.*?).;#ims"; + $mainurl = substr($host, 0, $this->strnpos($host, "/", 3)); + $replace = "import '".$mainurl."\$1';"; + $HTML = preg_replace($pattern, $replace, $HTML); + } + + return $HTML; + } + +} + +/*@}*/ \ No newline at end of file diff --git a/quail/reporters/reporter.static.php b/quail/reporters/reporter.static.php new file mode 100644 index 0000000..548fd0d --- /dev/null +++ b/quail/reporters/reporter.static.php @@ -0,0 +1,65 @@ +. +* @author Kevin Miller +*/ +/** \addtogroup reporters */ +/*@{*/ +/** +* A static reporter. Generates a list of errors which do not pass and their severity. +* This is just a demonstration of what you can do with a reporter. +*/ + +class reportStatic extends quailReporter { + + /** + * Generates a static list of errors within a div. + * @return string A fully-formatted report + */ + function getReport() { + $output = ''; + foreach($this->guideline->getReport() as $testname => $test) { + if(count($test) > 0) { + $severity = $this->guideline->getSeverity($testname); + $translation = $this->guideline->getTranslation($testname); + $output .= '

'. $translation['title'] .'

'. $translation['description'] .'
'; + if(is_array($test)) { + foreach($test as $k => $problem) { + if(is_object($problem)) + $output .= '

'.($k+1).'

'. htmlentities($problem->getHtml()) .'

'; + + } + } + $output .='

'; + switch($severity) { + case QUAIL_TEST_SEVERE: + $output .= 'Severe error'; + break; + case QUAIL_TEST_MODERATE: + $output .= 'Moderate error'; + break; + case QUAIL_TEST_SUGGESTION: + $output .= 'Suggestion'; + break; + } + $output .='

'; + } + } + return $output; + } +} +/*@}*/ \ No newline at end of file diff --git a/quail/reporters/reporter.xml.php b/quail/reporters/reporter.xml.php new file mode 100644 index 0000000..e86de42 --- /dev/null +++ b/quail/reporters/reporter.xml.php @@ -0,0 +1,64 @@ +. +* @author Kevin Miller +*/ +/** \addtogroup reporters */ +/*@{*/ +/** +* Returns an ATOM feed of all the issues - useful to run this as a web service +*/ + +class reportXml extends quailReporter { + + /** + * Generates an ATOM feed of accessibility problems + * @return array A nested array of tests and problems with Report Item objects + */ + function getReport() { + $output = " + "; + $results = $this->guideline->getReport(); + if(!is_array($results)) + return null; + foreach($results as $testname => $test) { + $translation = $this->guideline->getTranslation($testname); + $output .= "\n\t + ". date('c') .""; + $output .= "\n\t". $translation['title'] .""; + $output .= "\n\t"; + $output .= "\n\t"; + foreach($test as $k => $problem) { + if(is_object($problem)) { + $output .= "\n\tgetHtml()) ."]]>"; + $output .= "\n\t". $problem->getLine() .""; + if($problem->message) { + $output .= "\n\t$problem->message"; + } + $output .= "\n\t$problem->pass"; + } + } + $output .= "\n\t"; + $output .= ""; + } + $output .= ""; + return $output; + } +} +/*@}*/ \ No newline at end of file diff --git a/tests/.svn/all-wcprops b/tests/.svn/all-wcprops new file mode 100644 index 0000000..3837323 --- /dev/null +++ b/tests/.svn/all-wcprops @@ -0,0 +1,29 @@ +K 25 +svn:wc:ra_dav:version-url +V 34 +/svn/!svn/ver/232/tags/0.4.1/tests +END +cssTestInterface.php +K 25 +svn:wc:ra_dav:version-url +V 55 +/svn/!svn/ver/232/tags/0.4.1/tests/cssTestInterface.php +END +cssTests.php +K 25 +svn:wc:ra_dav:version-url +V 47 +/svn/!svn/ver/232/tags/0.4.1/tests/cssTests.php +END +quailTests.php +K 25 +svn:wc:ra_dav:version-url +V 49 +/svn/!svn/ver/232/tags/0.4.1/tests/quailTests.php +END +index.php +K 25 +svn:wc:ra_dav:version-url +V 44 +/svn/!svn/ver/232/tags/0.4.1/tests/index.php +END diff --git a/tests/.svn/dir-prop-base b/tests/.svn/dir-prop-base new file mode 100644 index 0000000..0e73d17 --- /dev/null +++ b/tests/.svn/dir-prop-base @@ -0,0 +1,6 @@ +K 10 +svn:ignore +V 11 +simpletest + +END diff --git a/tests/.svn/entries b/tests/.svn/entries new file mode 100644 index 0000000..8064817 --- /dev/null +++ b/tests/.svn/entries @@ -0,0 +1,167 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/tests +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-09-04T21:59:16.426567Z +230 +keveemiller +has-props + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +cssTestInterface.php +file + + + + +2010-12-08T21:44:03.000000Z +2863206e59c18b61e6bc09747cd9c203 +2009-11-14T21:03:55.958690Z +89 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1239 + +cssTests.php +file + + + + +2010-12-08T21:44:03.000000Z +e4ed3e0364370410994a175a4e4e614f +2010-04-11T21:21:25.595720Z +157 +keveemiller + + + + + + + + + + + + + + + + + + + + + +6964 + +testfiles +dir + +quailTests.php +file + + + + +2010-12-08T21:44:03.000000Z +5194045fcbce7ff84f043f96206658c3 +2010-08-21T07:01:43.361020Z +224 +keveemiller + + + + + + + + + + + + + + + + + + + + + +4879 + +index.php +file + + + + +2010-12-08T21:44:03.000000Z +d39c457d5b09baac2dfa24ad5817979b +2010-09-04T21:59:16.426567Z +230 +keveemiller + + + + + + + + + + + + + + + + + + + + + +80759 + diff --git a/tests/.svn/text-base/cssTestInterface.php.svn-base b/tests/.svn/text-base/cssTestInterface.php.svn-base new file mode 100644 index 0000000..cc95cbc --- /dev/null +++ b/tests/.svn/text-base/cssTestInterface.php.svn-base @@ -0,0 +1,50 @@ +file_base . $filename; + $this->dom = new DOMDocument(); + $this->dom->loadHTMLFile($filename); + $this->css = new quailCSS($this->dom, $filename, 'file', $this->getPath($this->file_base)); + } + + function renderHTML() { + $xpath = new DOMXPath($this->dom); + $entries = $xpath->query('//*'); + foreach($entries as $element) { + $style = $this->css->getStyle($element); + $element->setAttribute('title' , 'b: '. $style['background-color'] .' f: '. $style['color']); + } + return $this->dom->saveHTML(); + } + + function getPath($path) { + $parts = explode('://', $this->uri); + $this->path[] = $parts[0] .':/'; + if(is_array($parts[1])) { + foreach(explode('/', $this->getBaseFromFile($parts[1])) as $part) { + $this->path[] = $part; + } + } + else { + $this->path[] = $parts[1] .'/'; + } + } +} + +$test = new cssTestInterface('cssComplexTest1.html'); +/*print_r($test->css->dom_index); +foreach($test->css->dom_index as $i) { + print $i[0]['element']->tagName .'
'; + print_r($i[0]['style']); + print '
'; + +}*/ +print $test->renderHTML(); \ No newline at end of file diff --git a/tests/.svn/text-base/cssTests.php.svn-base b/tests/.svn/text-base/cssTests.php.svn-base new file mode 100644 index 0000000..66408ab --- /dev/null +++ b/tests/.svn/text-base/cssTests.php.svn-base @@ -0,0 +1,178 @@ +loadHTML(file_get_contents($url)); + $uri = $url; + $type = 'uri'; + $path = '/'; + return new quailCSS($dom, $uri, $type, $path); + } + + function test_wcagCss1() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-1.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background-color'] == 'lime'); + foreach($css->dom->getElementsByTagName('li') as $li) { + $style = $css->getStyle($li); + $this->assertTrue($style['background-color'] == 'lime'); + } + } + + + function test_wcagCss2() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-2.html'); + $paragraph = $css->dom->getElementsByTagName('address'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background-color'] == 'lime'); + } + + function test_wcagCss3() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-3a.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['color'] == 'lime'); + $li = $css->dom->getElementsByTagName('li'); + $style = $css->getStyle($li->item(0)); + $this->assertTrue($style['color'] == 'lime'); + } + + function test_wcagCss4() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-4.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background-color'] == 'lime'); + } + + + function test_wcagCss7b() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-7b.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background'] == 'lime'); + } + + function test_wcagCss13() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-13.html'); + foreach($css->dom->getElementsByTagName('li') as $li) { + $style = $css->getStyle($li); + $this->assertTrue($style['background-color'] == 'lime'); + } + } + + function test_wcagCss14b() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14b.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background'] == 'green'); + $this->assertTrue($style['color'] == 'white'); + $style = $css->getStyle($paragraph->item(1)); + $this->assertTrue($style['background'] == 'green'); + } + + function test_wcagCss14c() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14c.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $div = $css->dom->getElementsByTagName('div'); + $style = $css->getStyle($div->item(0)); + $this->assertTrue($style['background'] == 'green'); + $address = $css->dom->getElementsByTagName('address'); + $style = $css->getStyle($div->item(0)); + $this->assertTrue($style['background'] == 'green'); + } + + function test_wcagCss14d() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14d.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background'] == 'green'); + $this->assertTrue($style['color'] == 'white'); + } + + function test_wcagCss14e() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14e.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background'] == 'green'); + $this->assertTrue($style['color'] == 'white'); + $div = $css->dom->getElementsByTagName('div'); + $address = $css->dom->getElementsByTagName('address'); + } + + function test_wcagCss15() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-15.html'); + foreach($css->dom->getElementsByTagName('li') as $li) { + $style = $css->getStyle($li); + $this->assertTrue($style['background-color'] == 'lime'); + } + } + + function test_wcagCss15b() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-15b.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background'] == 'green'); + $this->assertTrue($style['color'] == 'white'); + $div = $css->dom->getElementsByTagName('div'); + $style = $css->getStyle($div->item(0)); + $this->assertTrue($style['background'] == 'green'); + + } + + /** + * We are skipping pseudo classes + */ + function test_wcagCss43() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-43.html'); + $paragraphs = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraphs->item(0)); + $this->assertTrue($style['background-color'] == 'lime'); + $style = $css->getStyle($paragraphs->item(1)); + $this->assertTrue($style['background-color'] == 'lime'); + $style = $css->getStyle($paragraphs->item(2)); + $this->assertTrue($style['background-color'] != 'lime'); + } + + function test_wcagCss43b() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-43b.html'); + $paragraphs = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraphs->item(0)); + $this->assertTrue($style['background-color'] != 'lime'); + $style = $css->getStyle($paragraphs->item(1)); + $this->assertTrue($style['background-color'] != 'lime'); + $style = $css->getStyle($paragraphs->item(2)); + $this->assertTrue($style['background-color'] == 'lime'); + } + + /** + * Child combinator (#44) + */ + function test_wcagCss44() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-44.html'); + $paragraphs = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraphs->item(2)); + $this->assertTrue($style['background-color'] != 'lime'); + } + + /** + * Color text + */ + function test_wcagCssColorText301() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Color/current/html4/t0301-color-text-a.htm'); + $paragraphs = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraphs->item(0)); + $this->assertTrue($style['color'] == 'green'); + } +} + + +$tests = &new TestOfCSSTests(); +$tests->run(new HtmlReporter()); \ No newline at end of file diff --git a/tests/.svn/text-base/index.php.svn-base b/tests/.svn/text-base/index.php.svn-base new file mode 100644 index 0000000..a0e0087 --- /dev/null +++ b/tests/.svn/text-base/index.php.svn-base @@ -0,0 +1,2443 @@ +runCheck(); + + return $quail->getTest($test); + } + + + // 1 + function test1_imgHasAlt() { + $results = $this->getTest('1-1.html', 'imgHasAlt'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + $results = $this->getTest('1-2.html', 'imgHasAlt'); + $this->assertTrue(count($results) == 0); + } + + //2 + function test2_imgAltIsDifferent() { + $results = $this->getTest('2-1.html', 'imgAltIsDifferent'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('2-2.html', 'imgAltIsDifferent'); + $this->assertTrue(count($results) == 0); + } + + //3 + function test4_imgAltIsTooLong() { + $results = $this->getTest('3-1.html', 'imgAltIsTooLong'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('3-2.html', 'imgAltIsTooLong'); + $this->assertTrue(count($results) == 0); + } + + //4 + function test4_imgNonDecorativeHasAlt() { + $results = $this->getTest('4-1.html', 'imgNonDecorativeHasAlt'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('4-2.html', 'imgNonDecorativeHasAlt'); + $this->assertTrue(count($results) == 0); + } + + //5 + function test5_imgImportantNoSpacerAlt() { + $results = $this->getTest('5-1.html', 'imgImportantNoSpacerAlt'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('5-2.html', 'imgImportantNoSpacerAlt'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('5-3.html', 'imgImportantNoSpacerAlt'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'big-fail.png'); + } + + //6 + function test6_imgAltNotPlaceHolder() { + $results = $this->getTest('6-1.html', 'imgAltNotPlaceHolder'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('6-2.html', 'imgAltNotPlaceHolder'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('6-3.html', 'imgAltNotPlaceHolder'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('6-4.html', 'imgAltNotPlaceHolder'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('6-5.html', 'imgAltNotPlaceHolder'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('6-6.html', 'imgAltNotPlaceHolder'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('6-7.html', 'imgAltNotPlaceHolder'); + $this->assertTrue(count($results) == 0); + } + + //7 + function test7_imgAltNotEmptyInAnchor() { + $results = $this->getTest('7-1.html', 'imgAltNotEmptyInAnchor'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('7-2.html', 'imgAltNotEmptyInAnchor'); + $this->assertTrue(count($results) == 0); + } + + //8 + function test8_imgHasLongDesc() { + $results = $this->getTest('8-1.html', 'imgHasLongDesc'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'chart.gif'); + + $results = $this->getTest('8-2.html', 'imgHasLongDesc'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('8-3.html', 'imgHasLongDesc'); + //$this->assertTrue($results[0]->element->getAttribute('src') == 'chart.gif'); + + $results = $this->getTest('8-4.html', 'imgHasLongDesc'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('8-5.html', 'imgHasLongDesc'); + $this->assertTrue(count($results) == 0); + } + + //9 + function test9_imgNeedsLongDescWDlink() { + $results = $this->getTest('9-1.html', 'imgNeedsLongDescWDlink'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('9-2.html', 'imgNeedsLongDescWDlink'); + $this->assertTrue(count($results) == 0); + } + + //10 + function test10_imgGifNoFlicker() { + $results = $this->getTest('10-1.html', 'imgGifNoFlicker'); + //$this->assertTrue($results[0]->element->getAttribute('src') == 'eatatjoes.gif'); + + $results = $this->getTest('10-2.html', 'imgGifNoFlicker'); + $this->assertTrue(count($results) == 0); + } + + + //11 + function test11_imgAltIsSameInText() { + $results = $this->getTest('11-1.html', 'imgAltIsSameInText'); + $this->assertTrue($results[0]->element->getAttribute('alt') == 'logo'); + + $results = $this->getTest('11-2.html', 'imgAltIsSameInText'); + $this->assertTrue($results[0]->element->getAttribute('alt') == 'W3C Working Draft logo'); + } + + //12 + function test12_imgWithMapHasUseMap() { + $results = $this->getTest('12-1.html', 'imgWithMapHasUseMap'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'image.gif'); + + $results = $this->getTest('12-2.html', 'imgWithMapHasUseMap'); + $this->assertTrue(count($results) == 0); + } + + //13 + function test13_imgMapAreasHaveDuplicateLink() { + $results = $this->getTest('13-1.html', 'imgMapAreasHaveDuplicateLink'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'navigation.gif'); + + $results = $this->getTest('13-2.html', 'imgMapAreasHaveDuplicateLink'); + $this->assertTrue(count($results) == 0); + + + $results = $this->getTest('13-3.html', 'imgMapAreasHaveDuplicateLink'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'navigation.gif'); + } + + //14 + function test14_imgNotReferredToByColorAlone() { + $results = $this->getTest('14-1.html', 'imgNotReferredToByColorAlone'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'kids.jpg'); + + $results = $this->getTest('14-2.html', 'imgNotReferredToByColorAlone'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'kids.jpg'); + + $results = $this->getTest('14-3.html', 'imgNotReferredToByColorAlone'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'kids.jpg'); + } + + //15 + function test15_imgAltIdentifiesLinkDestination() { + $results = $this->getTest('15-1.html', 'imgAltIdentifiesLinkDestination'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'topo.gif'); + + $results = $this->getTest('15-2.html', 'imgAltIdentifiesLinkDestination'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'topo.gif'); + + } + + //16 + function test16_imgAltEmptyForDecorativeImages() { + $results = $this->getTest('16-1.html', 'imgAltEmptyForDecorativeImages'); + $this->assertTrue($results[0]->element->getAttribute('src') == '10pttab.gif'); + + $results = $this->getTest('16-2.html', 'imgAltEmptyForDecorativeImages'); + $this->assertTrue($results[0]->element->getAttribute('src') == '10pttab.gif'); + + $results = $this->getTest('16-3.html', 'imgAltEmptyForDecorativeImages'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'star.gif'); + + $results = $this->getTest('16-4.html', 'imgAltEmptyForDecorativeImages'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'star.gif'); + } + + + //17 + function test17_aLinksToSoundFilesNeedTranscripts() { + $results = $this->getTest('17-1.html', 'aLinksToSoundFilesNeedTranscripts'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'carol-talking.wav'); + } + + //18 + function test18_aLinksDontOpenNewWindow() { + $results = $this->getTest('18-1.html', 'aLinksDontOpenNewWindow'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'newwindow.html'); + + $results = $this->getTest('18-2.html', 'aLinksDontOpenNewWindow'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('18-3.html', 'aLinksDontOpenNewWindow'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('18-4.html', 'aLinksDontOpenNewWindow'); + $this->assertTrue(count($results) == 0); + } + + + //19 + function test19_aLinksMakeSenseOutOfContext() { + $results = $this->getTest('19-1.html', 'aLinksMakeSenseOutOfContext'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'dogs.html'); + + + } + + //20 + function test20_aLinksToMultiMediaRequireTranscript() { + $results = $this->getTest('20-1.html', 'aLinksToMultiMediaRequireTranscript'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'movie.wmv'); + + $results = $this->getTest('20-2.html', 'aLinksToMultiMediaRequireTranscript'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('20-3.html', 'aLinksToMultiMediaRequireTranscript'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'movie.mpg'); + + $results = $this->getTest('20-4.html', 'aLinksToMultiMediaRequireTranscript'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'movie.mov'); + + $results = $this->getTest('20-5.html', 'aLinksToMultiMediaRequireTranscript'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'movie.ram'); + + $results = $this->getTest('20-6.html', 'aLinksToMultiMediaRequireTranscript'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'movie.aif'); + } + + //21 + function test21_appletsDoneUseColorAlone() { + + $results = $this->getTest('21-1.html', 'appletsDoneUseColorAlone'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('21-2.html', 'appletsDoneUseColorAlone'); + $this->assertTrue(count($results) == 0); + } + + //22 + function test22_appletsDoNotFlicker() { + + $results = $this->getTest('22-1.html', 'appletsDoNotFlicker'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('22-2.html', 'appletsDoNotFlicker'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + } + + //23 + function test23_appletContainsTextEquivalentInAlt() { + + $results = $this->getTest('23-1.html', 'appletContainsTextEquivalentInAlt'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('23-2.html', 'appletContainsTextEquivalentInAlt'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('23-3.html', 'appletContainsTextEquivalentInAlt'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + } + + + //24 + function test24_appletTextEquivalentsGetUpdated() { + + $results = $this->getTest('23-1.html', 'appletTextEquivalentsGetUpdated'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('23-2.html', 'appletTextEquivalentsGetUpdated'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + } + + //25 + function test25_appletContainsTextEquivalent() { + + $results = $this->getTest('25-1.html', 'appletContainsTextEquivalent'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('25-2.html', 'appletContainsTextEquivalent'); + $this->assertTrue(count($results) == 0); + + } + + //26 + function test26_appletUIMustBeAccessible() { + + $results = $this->getTest('26-1.html', 'appletUIMustBeAccessible'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('26-2.html', 'appletUIMustBeAccessible'); + $this->assertTrue(count($results) == 0); + + } + + //27 + function test27_blinkIsNotUsed() { + + $results = $this->getTest('27-1.html', 'blinkIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'blink'); + + $results = $this->getTest('27-2.html', 'blinkIsNotUsed'); + $this->assertTrue(count($results) == 0); + + } + + //28 + function test28_skipToContentLinkProvided() { + + $results = $this->getTest('28-1.html', 'skipToContentLinkProvided'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('28-2.html', 'skipToContentLinkProvided'); + $this->assertTrue(count($results) == 0); + + } + + //29 + function test29_doctypeProvided() { + + $results = $this->getTest('29-1.html', 'doctypeProvided'); + if(isset($results[0])) { + $this->assertTrue($results[0]->pass == false); + } + $results = $this->getTest('29-2.html', 'doctypeProvided'); + $this->assertTrue(count($results) == 0); + + } + + //30 + function test30_objectDoesNotFlicker() { + + $results = $this->getTest('30-1.html', 'objectDoesNotFlicker'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + $results = $this->getTest('30-2.html', 'objectDoesNotFlicker'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + } + + //31 + function test31_framesHaveATitle() { + + $results = $this->getTest('31-1.html', 'framesHaveATitle'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('31-2.html', 'framesHaveATitle'); + $this->assertTrue(count($results) == 0); + + } + + //32 + function test32_frameTitlesDescribeFunction() { + + $results = $this->getTest('32-1.html', 'frameTitlesDescribeFunction'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('32-2.html', 'frameTitlesDescribeFunction'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('32-3.html', 'frameTitlesDescribeFunction'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + } + + //33 + function test33_frameSrcIsAccessible() { + + $results = $this->getTest('33-1.html', 'frameSrcIsAccessible'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('32-2.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-3.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-4.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-5.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-6.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-7.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-8.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-9.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + } + + //34 + function test34_frameRelationshipsMustBeDescribed() { + + $results = $this->getTest('34-1.html', 'frameRelationshipsMustBeDescribed'); + $this->assertTrue($results[0]->element->tagName == 'frameset'); + + $results = $this->getTest('34-2.html', 'frameRelationshipsMustBeDescribed'); + $this->assertTrue(count($results) == 0); + + } + + //35 + function test35_framesetMustHaveNoFramesSection() { + + $results = $this->getTest('35-1.html', 'framesetMustHaveNoFramesSection'); + $this->assertTrue($results[0]->element->tagName == 'frameset'); + + $results = $this->getTest('35-2.html', 'framesetMustHaveNoFramesSection'); + $this->assertTrue(count($results) == 0); + + } + + //36 + function test36_noframesSectionMustHaveTextEquivalent() { + + $results = $this->getTest('36-1.html', 'noframesSectionMustHaveTextEquivalent'); + $this->assertTrue($results[0]->element->tagName == 'noframes'); + + $results = $this->getTest('36-2.html', 'noframesSectionMustHaveTextEquivalent'); + $this->assertTrue($results[0]->element->tagName == 'frameset'); + + } + + //37 + function test37_headerH1() { + + $results = $this->getTest('37-1.html', 'headerH1'); + $this->assertTrue($results[0]->element->tagName == 'h3'); + + $results = $this->getTest('37-2.html', 'headerH1'); + + $this->assertTrue(count($results) == 0); + + } + + //38 + function test38_headerH2() { + + $results = $this->getTest('38-1.html', 'headerH2'); + $this->assertTrue($results[0]->element->tagName == 'h4'); + + $results = $this->getTest('38-2.html', 'headerH2'); + $this->assertTrue(count($results) == 0); + + } + + //39 + function test39_headerH3() { + + $results = $this->getTest('39-1.html', 'headerH3'); + $this->assertTrue($results[0]->element->tagName == 'h5'); + + $results = $this->getTest('39-2.html', 'headerH3'); + $this->assertTrue(count($results) == 0); + + } + + //40 + function test40_headerH4() { + + $results = $this->getTest('40-1.html', 'headerH4'); + $this->assertTrue($results[0]->element->tagName == 'h6'); + + $results = $this->getTest('40-2.html', 'headerH4'); + $this->assertTrue(count($results) == 0); + + } + + //41 + function test41_headerH5() { + + $results = $this->getTest('41-1.html', 'headerH4'); + $this->assertTrue($results[0]->element->tagName == 'h6'); + + $results = $this->getTest('41-2.html', 'headerH4'); + $this->assertTrue(count($results) == 0); + + } + + //42 - 47 + function test41_47_headerFormatting() { + for($i = 1; $i < 7; $i++) { + $classname = 'headerH'. $i .'Format'; + $filename = ($i + 41) . '-1.html'; + $results = $this->getTest($filename, $classname); + $this->assertTrue($results[0]->element->tagName == 'h'. $i); + + } + } + + //48 + function test48_documentLangNotIdentified() { + $results = $this->getTest('48-1.html', 'documentLangNotIdentified'); + $this->assertTrue($results[0]->pass == false); + + $results = $this->getTest('48-2.html', 'documentLangNotIdentified'); + $this->assertTrue(count($results) == 0); + } + + //49 + function test49_documentLangIsISO639Standard() { + $results = $this->getTest('49-1.html', 'documentLangIsISO639Standard'); + if(isset($reuslts[0])) { + $this->assertTrue($results[0]->pass == false); + } + $results = $this->getTest('49-2.html', 'documentLangIsISO639Standard'); + $this->assertTrue(count($results) == 0); + } + + //50 + function test50_documentHasTitleElement() { + $results = $this->getTest('50-1.html', 'documentHasTitleElement'); + $this->assertTrue($results[0]->pass == false); + + + $results = $this->getTest('50-2.html', 'documentHasTitleElement'); + $this->assertTrue(count($results) == 0); + } + + //51 + function test51_documentTitleNotEmpty() { + $results = $this->getTest('51-1.html', 'documentTitleNotEmpty'); + $this->assertTrue($results[0]->pass == false); + + + $results = $this->getTest('51-2.html', 'documentTitleNotEmpty'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('51-3.html', 'documentTitleNotEmpty'); + $this->assertTrue($results[0]->pass == false); + } + + //52 + function test52_documentTitleIsShort() { + $results = $this->getTest('52-1.html', 'documentTitleIsShort'); + $this->assertTrue($results[0]->pass == false); + + + $results = $this->getTest('52-2.html', 'documentTitleIsShort'); + $this->assertTrue(count($results) == 0); + } + + //53 + function test53_documentTitleIsNotPlaceholder() { + $results = $this->getTest('53-1.html', 'documentTitleIsNotPlaceholder'); + if(isset($results[0])) { + $this->assertTrue($results[0]->pass == false); + } + + $results = $this->getTest('53-2.html', 'documentTitleIsNotPlaceholder'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('53-3.html', 'documentTitleIsNotPlaceholder'); + if(isset($results[0])) { + $this->assertTrue($results[0]->pass == false); + } + + $results = $this->getTest('53-4.html', 'documentTitleIsNotPlaceholder'); + $this->assertTrue(!isset($results[0]->pass)); + + $results = $this->getTest('53-5.html', 'documentTitleIsNotPlaceholder'); + $this->assertTrue(!isset($results[0]->pass)); + } + + //54 + function test54_documentTitleDescribesDocument() { + $results = $this->getTest('54-1.html', 'documentTitleDescribesDocument'); + $this->assertTrue($results[0]->element->tagName == 'title'); + + + $results = $this->getTest('54-2.html', 'documentTitleDescribesDocument'); + $this->assertTrue($results[0]->element->tagName == 'title'); + } + + //55 + function test55_inputDoesNotUseColorAlone() { + $results = $this->getTest('55-1.html', 'inputDoesNotUseColorAlone'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('55-2.html', 'inputDoesNotUseColorAlone'); + $this->assertTrue(count($results) == 0); + } + + //57 + function test57_inputTextHasLabel() { + $results = $this->getTest('57-1.html', 'inputTextHasLabel'); + $this->assertTrue($results[0]->element->getAttribute('name') == 'firstname'); + + + $results = $this->getTest('57-2.html', 'inputTextHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('57-3.html', 'inputTextHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('57-4.html', 'inputTextHasLabel'); + $this->assertTrue(count($results) == 0); + } + + //58 + function test58_inputImageHasAlt() { + $results = $this->getTest('58-1.html', 'inputImageHasAlt'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('58-2.html', 'inputImageHasAlt'); + $this->assertTrue(count($results) == 0); + } + + //59 + function test59_inputImageAltIdentifiesPurpose() { + $results = $this->getTest('59-1.html', 'inputImageAltIdentifiesPurpose'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('59-2.html', 'inputImageAltIdentifiesPurpose'); + $this->assertTrue($results[0]->element->tagName == 'input'); + } + + //60 + function test60_inputImageAltIsShort() { + $results = $this->getTest('60-1.html', 'inputImageAltIsShort'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('60-2.html', 'inputImageAltIsShort'); + $this->assertTrue(count($results) == 0); + } + + //61 + function test61_inputImageAltIsNotFileName() { + $results = $this->getTest('61-1.html', 'inputImageAltIsNotFileName'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('61-2.html', 'inputImageAltIsNotFileName'); + $this->assertTrue(count($results) == 0); + } + + //62 + function test62_inputImageAltIsNotPlaceholder() { + $results = $this->getTest('62-1.html', 'inputImageAltIsNotPlaceholder'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('62-2.html', 'inputImageAltIsNotPlaceholder'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('62-3.html', 'inputImageAltIsNotPlaceholder'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('62-4.html', 'inputImageAltIsNotPlaceholder'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + } + + //63 + function test63_inputTextHasValue() { + $results = $this->getTest('63-1.html', 'inputTextHasValue'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('63-2.html', 'inputTextHasValue'); + $this->assertTrue(count($results) == 0); + } + + //64 + function test64_areaHasAltValue() { + $results = $this->getTest('64-1.html', 'areaHasAltValue'); + $this->assertTrue($results[0]->element->tagName == 'area'); + + + $results = $this->getTest('64-2.html', 'areaHasAltValue'); + $this->assertTrue(count($results) == 0); + } + + //65 + function test65_areaAltIdentifiesDestination() { + $results = $this->getTest('65-1.html', 'areaAltIdentifiesDestination'); + $this->assertTrue($results[0]->element->tagName == 'area'); + + + $results = $this->getTest('65-2.html', 'areaAltIdentifiesDestination'); + $this->assertTrue($results[0]->element->tagName == 'area'); + } + + //66 + function test66_areaLinksToSoundFile() { + $results = $this->getTest('66-1.html', 'areaLinksToSoundFile'); + $this->assertTrue($results[0]->element->tagName == 'area'); + + + $results = $this->getTest('66-2.html', 'areaLinksToSoundFile'); + $this->assertTrue($results[0]->element->tagName == 'area'); + } + + //68 + function test68_areaDontOpenNewWindow() { + $results = $this->getTest('68-1.html', 'areaDontOpenNewWindow'); + $this->assertTrue($results[0]->element->tagName == 'area'); + + $results = $this->getTest('68-2.html', 'areaDontOpenNewWindow'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('68-3.html', 'areaDontOpenNewWindow'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('68-4.html', 'areaDontOpenNewWindow'); + $this->assertTrue(count($results) == 0); + } + + //69 + function test69_marqueeIsNotUsed() { + $results = $this->getTest('69-1.html', 'marqueeIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'marquee'); + + + $results = $this->getTest('69-2.html', 'marqueeIsNotUsed'); + $this->assertTrue(count($results) == 0); + } + + //70 + function test70_menuNotUsedToFormatText() { + $results = $this->getTest('70-1.html', 'menuNotUsedToFormatText'); + $this->assertTrue($results[0]->element->tagName == 'menu'); + + + $results = $this->getTest('70-2.html', 'menuNotUsedToFormatText'); + $this->assertTrue(count($results) == 0); + } + + //71 + function test71_documentAutoRedirectNotUsed() { + $results = $this->getTest('71-1.html', 'documentAutoRedirectNotUsed'); + if(isset($reuslts[0])) { + $this->assertTrue($results[0]->pass == false); + } + + $results = $this->getTest('71-2.html', 'documentAutoRedirectNotUsed'); + $this->assertTrue(count($results) == 0); + } + + //72 + function test72_documentMetaNotUsedWithTimeout() { + $results = $this->getTest('72-1.html', 'documentMetaNotUsedWithTimeout'); + if(isset($results[0])) { + $this->assertTrue($results[0]->pass == false); + } + + $results = $this->getTest('72-2.html', 'documentMetaNotUsedWithTimeout'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('72-2.html', 'documentMetaNotUsedWithTimeout'); + $this->assertTrue(count($results) == 0); + } + + //73 + function test73_objectDoesNotUseColorAlone() { + $results = $this->getTest('73-1.html', 'objectDoesNotUseColorAlone'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('73-2.html', 'objectDoesNotUseColorAlone'); + $this->assertTrue(count($results) == 0); + } + + //74 + function test74_objectTextUpdatesWhenObjectChanges() { + $results = $this->getTest('74-1.html', 'objectTextUpdatesWhenObjectChanges'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('74-2.html', 'objectTextUpdatesWhenObjectChanges'); + $this->assertTrue(count($results) == 0); + } + + //75 + function test75_objectContentUsableWhenDisabled() { + $results = $this->getTest('75-1.html', 'objectContentUsableWhenDisabled'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('75-2.html', 'objectContentUsableWhenDisabled'); + $this->assertTrue(count($results) == 0); + } + + //76 + function test76_objectInterfaceIsAccessible() { + $results = $this->getTest('76-1.html', 'objectInterfaceIsAccessible'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('76-2.html', 'objectInterfaceIsAccessible'); + $this->assertTrue(count($results) == 0); + } + + //77 + function test77_objectLinkToMultimediaHasTextTranscript() { + $results = $this->getTest('77-1.html', 'objectLinkToMultimediaHasTextTranscript'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('77-2.html', 'objectLinkToMultimediaHasTextTranscript'); + $this->assertTrue(count($results) == 0); + } + + //78 + function test78_objectMustHaveTitle() { + $results = $this->getTest('78-1.html', 'objectMustHaveTitle'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('78-2.html', 'objectMustHaveTitle'); + $this->assertTrue(count($results) == 0); + } + + //79 + function test79_objectMustHaveValidTitle() { + $results = $this->getTest('79-1.html', 'objectMustHaveValidTitle'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('79-2.html', 'objectMustHaveValidTitle'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + $results = $this->getTest('79-3.html', 'objectMustHaveValidTitle'); + $this->assertTrue($results[0]->element->tagName == 'object'); + } + + //80 + function test80_objectMustContainText() { + $results = $this->getTest('80-1.html', 'objectMustContainText'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('80-2.html', 'objectMustContainText'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('80-3.html', 'objectMustContainText'); + $this->assertTrue($results[0]->element->tagName == 'object'); + } + + //81 + function test81_listNotUsedForFormatting() { + $results = $this->getTest('81-1.html', 'listNotUsedForFormatting'); + $this->assertTrue($results[0]->element->tagName == 'ol'); + + + $results = $this->getTest('81-2.html', 'listNotUsedForFormatting'); + $this->assertTrue(count($results) == 0); + } + + //82 + function test82_pNotUsedAsHeader() { + $results = $this->getTest('82-1.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + + $results = $this->getTest('82-2.html', 'pNotUsedAsHeader'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('82-3.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('82-4.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('82-5.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('82-6.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('82-7.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('82-8.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('82-9.html', 'pNotUsedAsHeader'); + $this->assertTrue(count($results) == 0); + + } + + //86 + function test86_scriptsDoNotUseColorAlone() { + $results = $this->getTest('86-1.html', 'scriptsDoNotUseColorAlone'); + $this->assertTrue($results[0]->element->tagName == 'script'); + + + $results = $this->getTest('86-2.html', 'scriptsDoNotUseColorAlone'); + $this->assertTrue(count($results) == 0); + } + + //87 + function test87_scriptsDoNotFlicker() { + $results = $this->getTest('87-1.html', 'scriptsDoNotFlicker'); + $this->assertTrue($results[0]->element->tagName == 'script'); + + + $results = $this->getTest('87-2.html', 'scriptsDoNotFlicker'); + $this->assertTrue(count($results) == 0); + } + + //88 + function test88_scriptContentAccessibleWithScriptsTurnedOff() { + $results = $this->getTest('88-1.html', 'scriptContentAccessibleWithScriptsTurnedOff'); + $this->assertTrue($results[0]->element->tagName == 'script'); + + + $results = $this->getTest('88-2.html', 'scriptContentAccessibleWithScriptsTurnedOff'); + $this->assertTrue(count($results) == 0); + } + + //89 + function test89_scriptUIMustBeAccessible() { + $results = $this->getTest('89-1.html', 'scriptUIMustBeAccessible'); + $this->assertTrue($results[0]->element->tagName == 'script'); + + + $results = $this->getTest('89-2.html', 'scriptUIMustBeAccessible'); + $this->assertTrue(count($results) == 0); + } + + //90 + function test90_scriptInBodyMustHaveNoscript() { + $results = $this->getTest('90-1.html', 'scriptInBodyMustHaveNoscript'); + $this->assertTrue($results[0]->element->tagName == 'script'); + + + $results = $this->getTest('90-2.html', 'scriptInBodyMustHaveNoscript'); + $this->assertTrue(count($results) == 0); + } + + //91 + function test91_selectHasAssociatedLabel() { + $results = $this->getTest('91-1.html', 'selectHasAssociatedLabel'); + $this->assertTrue($results[0]->element->tagName == 'select'); + + + $results = $this->getTest('91-2.html', 'selectHasAssociatedLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('91-3.html', 'selectHasAssociatedLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('91-4.html', 'selectHasAssociatedLabel'); + $this->assertTrue(count($results) == 0); + } + + //92 + function test92_selectDoesNotChangeContext() { + $results = $this->getTest('92-1.html', 'selectDoesNotChangeContext'); + $this->assertTrue($results[0]->element->tagName == 'select'); + + + $results = $this->getTest('92-2.html', 'selectDoesNotChangeContext'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('92-3.html', 'selectDoesNotChangeContext'); + $this->assertTrue($results[0]->element->tagName == 'select'); + } + + //93 + function test95_textareaHasAssociatedLabel() { + $results = $this->getTest('95-1.html', 'textareaHasAssociatedLabel'); + $this->assertTrue($results[0]->element->tagName == 'textarea'); + + + $results = $this->getTest('95-2.html', 'textareaHasAssociatedLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('95-3.html', 'textareaHasAssociatedLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('95-4.html', 'textareaHasAssociatedLabel'); + $this->assertTrue(count($results) == 0); + } + + //96 + function test96_textareaLabelPositionedClose() { + $results = $this->getTest('96-1.html', 'textareaLabelPositionedClose'); + $this->assertTrue($results[0]->element->tagName == 'textarea'); + + + $results = $this->getTest('96-2.html', 'textareaLabelPositionedClose'); + $this->assertTrue($results[0]->element->tagName == 'textarea'); + } + + + //97 + function test97_cssDocumentMakesSenseStyleTurnedOff() { + $results = $this->getTest('97-1.html', 'cssDocumentMakesSenseStyleTurnedOff'); + $this->assertTrue($results[0]->element->tagName == 'link'); + + + $results = $this->getTest('97-2.html', 'cssDocumentMakesSenseStyleTurnedOff'); + $this->assertTrue(count($results) == 0); + } + + //98 + function test98_documentAbbrIsUsed() { + $results = $this->getTest('98-1.html', 'documentAbbrIsUsed'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + + $results = $this->getTest('98-2.html', 'documentAbbrIsUsed'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('98-3.html', 'documentAbbrIsUsed'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('98-4.html', 'documentAbbrIsUsed'); + $this->assertTrue(count($results) == 0); + + } + + //99 + function test99_documentAcronymsHaveElement() { + $results = $this->getTest('99-1.html', 'documentAcronymsHaveElement'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + + $results = $this->getTest('99-2.html', 'documentAcronymsHaveElement'); + $this->assertTrue(count($results) == 0); + } + + //100 + function test100_blockquoteNotUsedForIndentation() { + $results = $this->getTest('100-1.html', 'blockquoteNotUsedForIndentation'); + $this->assertTrue($results[0]->element->tagName == 'blockquote'); + + + $results = $this->getTest('100-2.html', 'blockquoteNotUsedForIndentation'); + $this->assertTrue(count($results) == 0); + } + + //102 + function test102_scriptOnclickRequiresOnKeypress() { + $results = $this->getTest('102-1.html', 'scriptOnclickRequiresOnKeypress'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('102-2.html', 'scriptOnclickRequiresOnKeypress'); + $this->assertTrue(count($results) == 0); + } + + //103 + function test103_scriptOndblclickRequiresOnKeypress() { + $results = $this->getTest('103-1.html', 'scriptOndblclickRequiresOnKeypress'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('103-2.html', 'scriptOndblclickRequiresOnKeypress'); + $this->assertTrue(count($results) == 0); + } + + //104 + function test104_scriptOnmousedownRequiresOnKeypress() { + $results = $this->getTest('104-1.html', 'scriptOnmousedownRequiresOnKeypress'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('104-2.html', 'scriptOnmousedownRequiresOnKeypress'); + $this->assertTrue(count($results) == 0); + } + + //105 + function test105_scriptOnmousemove() { + $results = $this->getTest('105-1.html', 'scriptOnmousemove'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('105-2.html', 'scriptOnmousemove'); + $this->assertTrue(count($results) == 0); + } + + + //106 + function test106_scriptOnmouseoutHasOnmouseblur() { + $results = $this->getTest('106-1.html', 'scriptOnmouseoutHasOnmouseblur'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('106-2.html', 'scriptOnmouseoutHasOnmouseblur'); + $this->assertTrue(count($results) == 0); + } + + //107 + function test107_scriptOnmouseoverHasOnfocus() { + $results = $this->getTest('107-1.html', 'scriptOnmouseoverHasOnfocus'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('107-2.html', 'scriptOnmouseoverHasOnfocus'); + $this->assertTrue(count($results) == 0); + } + + //108 + function test108_scriptOnmouseupHasOnkeyup() { + $results = $this->getTest('108-1.html', 'scriptOnmouseupHasOnkeyup'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('108-2.html', 'scriptOnmouseupHasOnkeyup'); + $this->assertTrue(count($results) == 0); + } + + //109 + function test109_documentContentReadableWithoutStylesheets() { + $results = $this->getTest('109-1.html', 'documentContentReadableWithoutStylesheets'); + $this->assertTrue($results[0]->pass === false); + + + $results = $this->getTest('109-2.html', 'documentContentReadableWithoutStylesheets'); + $this->assertTrue(count($results) == 0); + } + + //110 + function test110_documentWordsNotInLanguageAreMarked() { + $results = $this->getTest('110-1.html', 'documentWordsNotInLanguageAreMarked'); + $this->assertTrue($results[0]->pass === false); + + + $results = $this->getTest('110-2.html', 'documentWordsNotInLanguageAreMarked'); + $this->assertTrue($results[0]->pass === false); + } + + //111 + function test111_tableComplexHasSummary() { + $results = $this->getTest('111-1.html', 'tableComplexHasSummary'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + + $results = $this->getTest('111-2.html', 'tableComplexHasSummary'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('111-3.html', 'tableComplexHasSummary'); + $this->assertTrue(count($results) == 0); + } + + //112 + function test112_tableSummaryIsEmpty() { + $results = $this->getTest('112-1.html', 'tableSummaryIsEmpty'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + + $results = $this->getTest('112-2.html', 'tableSummaryIsEmpty'); + $this->assertTrue(count($results) == 0); + + } + + //113 + function test113_tableSummaryIsEmpty() { + $results = $this->getTest('113-1.html', 'tableSummaryIsSufficient'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + + $results = $this->getTest('113-2.html', 'tableSummaryIsSufficient'); + $this->assertTrue(count($results) == 0); + + } + + //114 + function test114_tableLayoutHasNoSummary() { + $results = $this->getTest('114-1.html', 'tableLayoutHasNoSummary'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + + $results = $this->getTest('114-2.html', 'tableLayoutHasNoSummary'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('114-3.html', 'tableLayoutHasNoSummary'); + $this->assertTrue(count($results) == 0); + + } + + //115 + function test115_tableLayoutHasNoCaption() { + $results = $this->getTest('115-1.html', 'tableLayoutHasNoCaption'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + + $results = $this->getTest('115-2.html', 'tableLayoutHasNoCaption'); + $this->assertTrue(count($results) == 0); + + + } + + //116 + function test116_boldIsNotUsed() { + $results = $this->getTest('116-1.html', 'boldIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'bold'); + + + $results = $this->getTest('116-2.html', 'boldIsNotUsed'); + $this->assertTrue(count($results) == 0); + + + } + + //117 + function test117_iIsNotUsed() { + $results = $this->getTest('117-1.html', 'iIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'i'); + + + $results = $this->getTest('117-2.html', 'iIsNotUsed'); + $this->assertTrue(count($results) == 0); + + + } + + //118 + function test118_passwordHasLabel() { + $results = $this->getTest('118-1.html', 'passwordHasLabel'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('118-2.html', 'passwordHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('118-3.html', 'passwordHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('118-4.html', 'passwordHasLabel'); + $this->assertTrue(count($results) == 0); + + } + + //119 + function test119_checkboxHasLabel() { + $results = $this->getTest('119-1.html', 'checkboxHasLabel'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('119-2.html', 'checkboxHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('119-3.html', 'checkboxHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('119-4.html', 'checkboxHasLabel'); + $this->assertTrue(count($results) == 0); + + } + + + //120 + function test120_fileHasLabel() { + $results = $this->getTest('120-1.html', 'fileHasLabel'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('120-2.html', 'fileHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('120-3.html', 'fileHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('120-4.html', 'fileHasLabel'); + $this->assertTrue(count($results) == 0); + + } + + //121 + function test121_radioHasLabel() { + $results = $this->getTest('121-1.html', 'radioHasLabel'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('121-2.html', 'radioHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('121-3.html', 'radioHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('121-4.html', 'radioHasLabel'); + $this->assertTrue(count($results) == 0); + + } + + //122 + function test122_passwordLabelIsNearby() { + $results = $this->getTest('122-1.html', 'passwordLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('122-2.html', 'passwordLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + } + + //123 + function test123_checkboxLabelIsNearby() { + $results = $this->getTest('123-1.html', 'checkboxLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('123-2.html', 'checkboxLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + } + + //124 + function test124_fileLabelIsNearby() { + $results = $this->getTest('124-1.html', 'fileLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('124-2.html', 'fileLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + } + + //125 + function test125_radioIsNearby() { + $results = $this->getTest('125-1.html', 'radioLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('125-2.html', 'radioLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + } + + //126 + function test126_inputTextValueNotEmpty() { + $results = $this->getTest('126-1.html', 'inputTextValueNotEmpty'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('126-2.html', 'inputTextValueNotEmpty'); + $this->assertTrue(count($results) == 0); + } + + //127 && 128 + function test127_objectWithClassIDHasNoText() { + $results = $this->getTest('127-1.html', 'objectWithClassIDHasNoText'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('127-2.html', 'objectWithClassIDHasNoText'); + $this->assertTrue(count($results) == 0); + } + + //129 + function test129_objectUIMustBeAccessible() { + $results = $this->getTest('128-1.html', 'objectUIMustBeAccessible'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('128-2.html', 'objectUIMustBeAccessible'); + $this->assertTrue($results[0]->element->tagName == 'object'); + } + + //131 + function test131_blockquoteUseForQuotations() { + $results = $this->getTest('131-1.html', 'blockquoteUseForQuotations'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + + $results = $this->getTest('131-2.html', 'blockquoteUseForQuotations'); + $this->assertTrue(count($results) == 0); + } + + //132 + function test132_imageMapServerSide() { + $results = $this->getTest('132-1.html', 'imageMapServerSide'); + $this->assertTrue($results[0]->element->tagName == 'img'); + + + $results = $this->getTest('132-2.html', 'imageMapServerSide'); + $this->assertTrue($results[0]->element->tagName == 'img'); + } + + //133 + function test133_tableLayoutMakesSenseLinearized() { + $results = $this->getTest('133-1.html', 'tableLayoutMakesSenseLinearized'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + + $results = $this->getTest('133-2.html', 'tableLayoutMakesSenseLinearized'); + $this->assertTrue($results[0]->element->tagName == 'table'); + } + + //134 + function test134_aLinksAreSeperatedByPrintableCharacters() { + $results = $this->getTest('134-1.html', 'aLinksAreSeperatedByPrintableCharacters'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('134-2.html', 'aLinksAreSeperatedByPrintableCharacters'); + $this->assertTrue(count($results) == 0); + } + + //135 + function test135_imgWithMathShouldHaveMathEquivalent() { + $results = $this->getTest('135-1.html', 'imgWithMathShouldHaveMathEquivalent'); + $this->assertTrue($results[0]->element->tagName == 'img'); + + $results = $this->getTest('135-2.html', 'imgWithMathShouldHaveMathEquivalent'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('135-2.xhtml', 'imgWithMathShouldHaveMathEquivalent'); + $this->assertTrue(count($results) == 0); + } + + //136 + function test136_tableDataShouldHaveTh() { + $results = $this->getTest('136-1.html', 'tableDataShouldHaveTh'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('136-2.html', 'tableDataShouldHaveTh'); + $this->assertTrue(count($results) == 0); + } + +//137 + function test137_tableLayoutDataShouldNotHaveTh() { + $results = $this->getTest('137-1.html', 'tableLayoutDataShouldNotHaveTh'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('137-2.html', 'tableLayoutDataShouldNotHaveTh'); + $this->assertTrue(count($results) == 0); + } + +//138 + function test138_inputTextHasTabIndex() { + $results = $this->getTest('138-1.html', 'inputTextHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('138-2.html', 'inputTextHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('138-3.html', 'inputTextHasTabIndex'); + $this->assertTrue(count($results) == 0); + } + +//139 + function test139_inputRadioHasTabIndex() { + $results = $this->getTest('139-1.html', 'inputRadioHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('139-2.html', 'inputRadioHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('139-3.html', 'inputRadioHasTabIndex'); + $this->assertTrue(count($results) == 0); + } + +//140 + function test140_inputPasswordHasTabIndex() { + $results = $this->getTest('140-1.html', 'inputPasswordHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('140-2.html', 'inputPasswordHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('140-3.html', 'inputPasswordHasTabIndex'); + $this->assertTrue(count($results) == 0); + } + +//141 + function test141_inputCheckboxHasTabIndex() { + $results = $this->getTest('141-1.html', 'inputCheckboxHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('141-2.html', 'inputCheckboxHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('141-3.html', 'inputCheckboxHasTabIndex'); + $this->assertTrue(count($results) == 0); + } + +//142 + function test142_inputFileHasTabIndex() { + $results = $this->getTest('142-1.html', 'inputFileHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('142-2.html', 'inputFileHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('142-3.html', 'inputFileHasTabIndex'); + $this->assertTrue(count($results) == 0); + } + +//143 + function test143_addressForAuthor() { + $results = $this->getTest('143-1.html', 'addressForAuthor'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('143-2.html', 'addressForAuthor'); + $this->assertTrue(count($results) == 0); + } + +//144 + function test144_addressForAuthorMustBeValid() { + $results = $this->getTest('144-1.html', 'addressForAuthorMustBeValid'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('144-2.html', 'addressForAuthorMustBeValid'); + $this->assertTrue(count($results) == 0); + } + + //skipped 145-146 - redundant + + //147 + function test147_linkUsedToDescribeNavigation() { + $results = $this->getTest('147-1.html', 'linkUsedToDescribeNavigation'); + //$this->assertTrue($results[0]->pass === false); + $results = $this->getTest('147-2.html', 'linkUsedToDescribeNavigation'); + $this->assertTrue(count($results) == 0); + } + + //148 + function test148_linkUsedForAlternateContent() { + $results = $this->getTest('148-1.html', 'linkUsedForAlternateContent'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('148-2.html', 'linkUsedForAlternateContent'); + $this->assertTrue(count($results) == 0); + } + + //149 - SKIPPED + + //150 + function test150_liDontUseImageForBullet() { + $results = $this->getTest('150-1.html', 'liDontUseImageForBullet'); + $this->assertTrue($results[0]->element->tagName == 'li'); + + $results = $this->getTest('150-2.html', 'liDontUseImageForBullet'); + $this->assertTrue(count($results) == 0); + } + + //151 + function test151_tableUsesCaption() { + $results = $this->getTest('151-1.html', 'tableUsesCaption'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('151-2.html', 'tableUsesCaption'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('151-3.html', 'tableUsesCaption'); + $this->assertTrue($results[0]->element->tagName == 'table'); + } + //152 + function test152_tableUsesAbbreviationForHeader() { + $results = $this->getTest('152-1.html', 'tableUsesAbbreviationForHeader'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('152-2.html', 'tableUsesAbbreviationForHeader'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('152-3.html', 'tableUsesAbbreviationForHeader'); + $this->assertTrue(count($results) == 0); + } + + //153 + function test153_tableHeaderLabelMustBeTerse() { + $results = $this->getTest('153-1.html', 'tableHeaderLabelMustBeTerse'); + $this->assertTrue($results[0]->element->tagName == 'th'); + + $results = $this->getTest('153-2.html', 'tableHeaderLabelMustBeTerse'); + $this->assertTrue(count($results) == 0); + } + + //154 + function test154_preShouldNotBeUsedForTabularLayout() { + $results = $this->getTest('154-1.html', 'preShouldNotBeUsedForTabularLayout'); + $this->assertTrue($results[0]->element->tagName == 'pre'); + + $results = $this->getTest('154-2.html', 'preShouldNotBeUsedForTabularLayout'); + $this->assertTrue(count($results) == 0); + } + + //155-158 skipped + + //159 + function test159_imgShouldNotHaveTitle() { + $results = $this->getTest('159-1.html', 'imgShouldNotHaveTitle'); + $this->assertTrue($results[0]->element->tagName == 'img'); + + $results = $this->getTest('159-2.html', 'imgShouldNotHaveTitle'); + $this->assertTrue(count($results) == 0); + } + + //160 + function test160_objectShouldHaveLongDescription() { + $results = $this->getTest('160-1.html', 'objectShouldHaveLongDescription'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + $results = $this->getTest('160-2.html', 'objectShouldHaveLongDescription'); + $this->assertTrue(count($results) == 0); + } + + //161 + function test161_emoticonsExcessiveUse() { + $results = $this->getTest('161-1.html', 'emoticonsExcessiveUse'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('161-2.html', 'emoticonsExcessiveUse'); + $this->assertTrue(count($results) == 0); + } + + //162 + function test162_emoticonsMissingAbbr() { + $results = $this->getTest('161-1.html', 'emoticonsMissingAbbr'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('161-2.html', 'emoticonsMissingAbbr'); + $this->assertTrue(count($results) == 0); + } + + //163 + function test163_embedHasAssociatedNoEmbed() { + $results = $this->getTest('163-1.html', 'embedHasAssociatedNoEmbed'); + $this->assertTrue($results[0]->element->tagName == 'embed'); + + $results = $this->getTest('163-2.html', 'embedHasAssociatedNoEmbed'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('163-3.html', 'embedHasAssociatedNoEmbed'); + $this->assertTrue(count($results) == 0); + } + + //164 + function test164_noembedHasEquivalentContent() { + $results = $this->getTest('164-1.html', 'noembedHasEquivalentContent'); + $this->assertTrue($results[0]->element->tagName == 'noembed'); + + $results = $this->getTest('164-2.html', 'noembedHasEquivalentContent'); + $this->assertTrue(count($results) == 0); + } + + //165 + function test165_embedMustHaveAltAttribute() { + $results = $this->getTest('165-1.html', 'embedMustHaveAltAttribute'); + $this->assertTrue($results[0]->element->tagName == 'embed'); + + $results = $this->getTest('165-2.html', 'embedMustHaveAltAttribute'); + $this->assertTrue(count($results) == 0); + } + + //166 + function test166_embedMustNotHaveEmptyAlt() { + $results = $this->getTest('166-1.html', 'embedMustNotHaveEmptyAlt'); + $this->assertTrue($results[0]->element->tagName == 'embed'); + + $results = $this->getTest('166-2.html', 'embedMustNotHaveEmptyAlt'); + $this->assertTrue(count($results) == 0); + } + + //167 + function test167_iframeMustNotHaveLongdesc() { + $results = $this->getTest('167-1.html', 'iframeMustNotHaveLongdesc'); + $this->assertTrue($results[0]->element->tagName == 'iframe'); + + $results = $this->getTest('167-2.html', 'iframeMustNotHaveLongdesc'); + $this->assertTrue(count($results) == 0); + } + + //168 + function test168_radioMarkedWithFieldgroupAndLegend() { + $results = $this->getTest('168-1.html', 'radioMarkedWithFieldgroupAndLegend'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('168-2.html', 'radioMarkedWithFieldgroupAndLegend'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('168-3.html', 'radioMarkedWithFieldgroupAndLegend'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('168-4.html', 'radioMarkedWithFieldgroupAndLegend'); + $this->assertTrue(count($results) == 0); + } + + //169 + function test169_selectWithOptionsHasOptgroup() { + $results = $this->getTest('169-1.html', 'selectWithOptionsHasOptgroup'); + $this->assertTrue($results[0]->element->tagName == 'select'); + + $results = $this->getTest('169-2.html', 'selectWithOptionsHasOptgroup'); + $this->assertTrue(count($results) == 0); + } + + //173 + function test173_aSuspiciousLinkText() { + $results = $this->getTest('173-1.html', 'aSuspiciousLinkText'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('173-2.html', 'aSuspiciousLinkText'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('173-3.html', 'aSuspiciousLinkText'); + $this->assertTrue($results[0]->element->tagName == 'a'); + } + + //174 + function test174_aMustContainText() { + $results = $this->getTest('174-1.html', 'aMustContainText'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('174-2.html', 'aMustContainText'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('174-3.html', 'aMustContainText'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('174-4.html', 'aMustContainText'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('174-5.html', 'aMustContainText'); + $this->assertTrue(count($results) == 0); + + } + + + //175 + function test175_aImgAltNotRepetative() { + $results = $this->getTest('175-1.html', 'aImgAltNotRepetative'); + $this->assertTrue($results[0]->element->tagName == 'img'); + + $results = $this->getTest('175-2.html', 'aImgAltNotRepetative'); + $this->assertTrue(count($results) == 0); + } + + //176 + function test176_basefontIsNotUsed() { + $results = $this->getTest('176-1.html', 'basefontIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'basefont'); + + $results = $this->getTest('176-2.html', 'basefontIsNotUsed'); + $this->assertTrue(count($results) == 0); + } + + //177 + function test177_fontIsNotUsed() { + $results = $this->getTest('177-1.html', 'fontIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'font'); + + $results = $this->getTest('177-2.html', 'fontIsNotUsed'); + $this->assertTrue(count($results) == 0); + } + + //Skipped 178-179 + + //180 + function test180_aAdjacentWithSameResourceShouldBeCombined() { + $results = $this->getTest('180-1.html', 'aAdjacentWithSameResourceShouldBeCombined'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('180-2.html', 'aAdjacentWithSameResourceShouldBeCombined'); + $this->assertTrue(count($results) == 0); + } + + //181 + function test181_aMustNotHaveJavascriptHref() { + $results = $this->getTest('181-1.html', 'aMustNotHaveJavascriptHref'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('181-2.html', 'aMustNotHaveJavascriptHref'); + $this->assertTrue(count($results) == 0); + } + + //182 + function test182_bodyMustNotHaveBackground() { + $results = $this->getTest('182-1.html', 'bodyMustNotHaveBackground'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('182-2.html', 'bodyMustNotHaveBackground'); + $this->assertTrue(count($results) == 0); + } + + //183 + function test183_objectMustHaveEmbed() { + $results = $this->getTest('183-1.html', 'objectMustHaveEmbed'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + $results = $this->getTest('183-2.html', 'objectMustHaveEmbed'); + $this->assertTrue(count($results) == 0); + } + + //184 + function test184_siteMap() { + $results = $this->getTest('184-1.html', 'siteMap'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('184-2.html', 'siteMap'); + $this->assertTrue(count($results) == 0); + } + + //185 + function test185_documentIDsMustBeUnique() { + $results = $this->getTest('185-1.html', 'documentIDsMustBeUnique'); + $this->assertTrue($results[0]->element->tagName == 'th'); + + $results = $this->getTest('185-2.html', 'documentIDsMustBeUnique'); + $this->assertTrue(count($results) == 0); + } + + //186 + function test186_labelDoesNotContainInput() { + $results = $this->getTest('186-1.html', 'labelDoesNotContainInput'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('186-2.html', 'labelDoesNotContainInput'); + $this->assertTrue(count($results) == 0); + } + + //187 + function test187_labelMustBeUnique() { + $results = $this->getTest('187-1.html', 'labelMustBeUnique'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('187-2.html', 'labelMustBeUnique'); + $this->assertTrue(count($results) == 0); + } + + //188 + function test188_labelMustNotBeEmpty() { + $results = $this->getTest('188-1.html', 'labelMustNotBeEmpty'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('188-2.html', 'labelMustNotBeEmpty'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('188-3.html', 'labelMustNotBeEmpty'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('188-3.html', 'labelMustNotBeEmpty'); + $this->assertTrue($results[0]->element->tagName == 'label'); + } + + //190 + function test190_aMustHaveTitle() { + $results = $this->getTest('190-1.html', 'aMustHaveTitle'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('190-2.html', 'aMustHaveTitle'); + $this->assertTrue(count($results) == 0); + } + + //191 + function test191_aTitleDescribesDestination() { + $results = $this->getTest('191-1.html', 'aTitleDescribesDestination'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('191-2.html', 'aTitleDescribesDestination'); + $this->assertTrue($results[0]->element->tagName == 'a'); + } + + //192 + function test192_inputImageAltNotRedundant() { + $results = $this->getTest('192-1.html', 'inputImageAltNotRedundant'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('192-2.html', 'inputImageAltNotRedundant'); + $this->assertTrue(count($results) == 0); + } + + //193 + function test193_inputImageNotDecorative() { + $results = $this->getTest('193-1.html', 'inputImageNotDecorative'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('193-2.html', 'inputImageNotDecorative'); + $this->assertTrue($results[0]->element->tagName == 'input'); + } + + //194 + function test194_areaAltRefersToText() { + $results = $this->getTest('194-1.html', 'areaAltRefersToText'); + $this->assertTrue($results[0]->element->tagName == 'area'); + + $results = $this->getTest('194-2.html', 'areaAltRefersToText'); + $this->assertTrue($results[0]->element->tagName == 'area'); + } + + //195 + function test195_aLinkTextDoesNotBeginWithRedundantWord() { + $results = $this->getTest('195-1.html', 'aLinkTextDoesNotBeginWithRedundantWord'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('195-2.html', 'aLinkTextDoesNotBeginWithRedundantWord'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('195-3.html', 'aLinkTextDoesNotBeginWithRedundantWord'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('195-4.html', 'aLinkTextDoesNotBeginWithRedundantWord'); + $this->assertTrue(count($results) == 0); + } + + //196 + function test196_imgServerSideMapNotUsed() { + $results = $this->getTest('196-1.html', 'imgServerSideMapNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'img'); + + $results = $this->getTest('196-2.html', 'imgServerSideMapNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'img'); + } + + //Skipped 197 + //198 + function test198_legendDescribesListOfChoices() { + $results = $this->getTest('198-1.html', 'legendDescribesListOfChoices'); + $this->assertTrue($results[0]->element->tagName == 'legend'); + + $results = $this->getTest('198-2.html', 'legendDescribesListOfChoices'); + $this->assertTrue($results[0]->element->tagName == 'legend'); + } + + //199 + function test199_legendTextNotEmpty() { + $results = $this->getTest('199-1.html', 'legendTextNotEmpty'); + $this->assertTrue($results[0]->element->tagName == 'legend'); + + $results = $this->getTest('199-2.html', 'legendTextNotEmpty'); + $this->assertTrue(count($results) == 0); + } + + //200 + function test200_legendTextNotPlaceholder() { + $results = $this->getTest('200-1.html', 'legendTextNotPlaceholder'); + $this->assertTrue($results[0]->element->tagName == 'legend'); + + $results = $this->getTest('200-2.html', 'legendTextNotPlaceholder'); + $this->assertTrue(count($results) == 0); + } + + //201 + function test201_frameTitlesNotEmpty() { + $results = $this->getTest('201-1.html', 'frameTitlesNotEmpty'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('201-2.html', 'frameTitlesNotEmpty'); + $this->assertTrue(count($results) == 0); + } + + //202 + function test202_frameTitlesNotPlaceholder() { + $results = $this->getTest('202-1.html', 'frameTitlesNotPlaceholder'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('202-2.html', 'frameTitlesNotPlaceholder'); + $this->assertTrue(count($results) == 0); + } + + //203 + function test203_tableSummaryDescribesTable() { + $results = $this->getTest('203-1.html', 'tableSummaryDescribesTable'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('203-2.html', 'tableSummaryDescribesTable'); + $this->assertTrue($results[0]->element->tagName == 'table'); + } + + //204-220 skipped - already covered in previous tests + //221 + function test221_bodyColorContrast() { + $results = $this->getTest('221-1.html', 'bodyColorContrast'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('221-2.html', 'bodyColorContrast'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('221-3.html', 'bodyColorContrast'); + $this->assertTrue(count($results) == 0); + } + + //222 + function test222_bodyLinkColorContrast() { + $results = $this->getTest('222-1.html', 'bodyLinkColorContrast'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('222-2.html', 'bodyLinkColorContrast'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('222-3.html', 'bodyLinkColorContrast'); + $this->assertTrue(count($results) == 0); + } + + //223 + function test223_bodyActiveLinkColorContrast() { + $results = $this->getTest('223-1.html', 'bodyActiveLinkColorContrast'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('223-2.html', 'bodyActiveLinkColorContrast'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('223-3.html', 'bodyActiveLinkColorContrast'); + $this->assertTrue(count($results) == 0); + } + + //224 + function test224_bodyVisitedLinkColorContrast() { + $results = $this->getTest('224-1.html', 'bodyVisitedLinkColorContrast'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('224-2.html', 'bodyVisitedLinkColorContrast'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('224-3.html', 'bodyVisitedLinkColorContrast'); + $this->assertTrue(count($results) == 0); + } + + //225 + function test225_documentStrictDocType() { + + $results = $this->getTest('225-1.html', 'documentStrictDocType'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('225-2.html', 'documentStrictDocType'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('225-3.html', 'documentStrictDocType'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('225-4.html', 'documentStrictDocType'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('225-5.html', 'documentStrictDocType'); + $this->assertTrue($results[0]->pass === false); + } + + //226 + function test226_documentColorWaiAlgorithim() { + + $results = $this->getTest('226-1.html', 'documentColorWaiAlgorithim'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('226-2.html', 'documentColorWaiAlgorithim'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('226-3.html', 'documentColorWaiAlgorithim'); + $this->assertTrue(count($results) == 0); + } + + //227 + function test227_documentColorWaiLinkAlgorithim() { + + $results = $this->getTest('227-1.html', 'documentColorWaiLinkAlgorithim'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('227-2.html', 'documentColorWaiLinkAlgorithim'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('227-3.html', 'documentColorWaiLinkAlgorithim'); + $this->assertTrue(count($results) == 0); + } + + //228 + function test228_documentColorWaiActiveLinkAlgorithim() { + + $results = $this->getTest('228-1.html', 'documentColorWaiActiveLinkAlgorithim'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('228-2.html', 'documentColorWaiActiveLinkAlgorithim'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('228-3.html', 'documentColorWaiActiveLinkAlgorithim'); + $this->assertTrue(count($results) == 0); + } + + //229 + function test229_documentColorWaiVisitedLinkAlgorithim() { + + $results = $this->getTest('229-1.html', 'documentColorWaiVisitedLinkAlgorithim'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('229-2.html', 'documentColorWaiVisitedLinkAlgorithim'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('229-3.html', 'documentColorWaiVisitedLinkAlgorithim'); + $this->assertTrue(count($results) == 0); + } + + //230 + function test230_tableIsGrouped() { + + $results = $this->getTest('230-1.html', 'tableIsGrouped'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('230-2.html', 'tableIsGrouped'); + $this->assertTrue(count($results) == 0); + } + + //231 + function test231_tableUseColGroup() { + + $results = $this->getTest('231-1.html', 'tableUseColGroup'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('231-2.html', 'tableUseColGroup'); + $this->assertTrue(count($results) == 0); + } + + //232 + function test232_documentValidatesToDocType() { + + $results = $this->getTest('232-1.html', 'documentValidatesToDocType'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('232-2.html', 'documentValidatesToDocType'); + $this->assertTrue($results[0]->pass === false); + } + + //233 + function test233_framesetIsNotUsed() { + + $results = $this->getTest('233-1.html', 'framesetIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'frameset'); + + $results = $this->getTest('232-2.html', 'framesetIsNotUsed'); + $this->assertTrue(count($results) == 0); + } + + //234 + function test234_frameIsNotUsed() { + + $results = $this->getTest('234-1.html', 'frameIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('234-2.html', 'frameIsNotUsed'); + $this->assertTrue(count($results) == 0); + } + + //235 + function test235_documentReadingDirection() { + + $results = $this->getTest('235-1.html', 'documentReadingDirection'); + $this->assertTrue($results[0]->element->tagName == 'blockquote'); + + $results = $this->getTest('235-2.html', 'documentReadingDirection'); + $this->assertTrue(count($results) == 0); + } + + //236 + function test236_aAdjacentDontPointToSameResource() { + + $results = $this->getTest('236-1.html', 'aAdjacentWithSameResourceShouldBeCombined'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('236-2.html', 'aAdjacentWithSameResourceShouldBeCombined'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('236-1.html', 'aAdjacentWithSameResourceShouldBeCombined'); + $this->assertTrue($results[0]->element->tagName == 'a'); + } + + //skipped 237 + + //238 + function test238_inputElementsDontHaveAlt() { + + $results = $this->getTest('238-1.html', 'inputElementsDontHaveAlt'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('238-2.html', 'inputElementsDontHaveAlt'); + $this->assertTrue(count($results) == 0); + } + + //skipped 239 & 240 + + + //241 + function test241_tabularDataIsInTable() { + + $results = $this->getTest('241-1.html', 'tabularDataIsInTable'); + $this->assertTrue($results[0]->element->tagName == 'pre'); + + $results = $this->getTest('241-2.html', 'tabularDataIsInTable'); + $this->assertTrue(count($results) == 0); + } + + //242 + function test242_tableCaptionIdentifiesTable() { + + $results = $this->getTest('242-1.html', 'tableCaptionIdentifiesTable'); + $this->assertTrue($results[0]->element->tagName == 'caption'); + + $results = $this->getTest('242-2.html', 'tableCaptionIdentifiesTable'); + $this->assertTrue($results[0]->element->tagName == 'caption'); + } + + //243 + function test243_tableSummaryDoesNotDuplicateCaption() { + + $results = $this->getTest('243-1.html', 'tableSummaryDoesNotDuplicateCaption'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('243-2.html', 'tableSummaryDoesNotDuplicateCaption'); + $this->assertTrue(count($results) == 0); + } + + //244 + function test244_tableWithBothHeadersUseScope() { + + $results = $this->getTest('244-1.html', 'tableWithBothHeadersUseScope'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('244-2.html', 'tableWithBothHeadersUseScope'); + $this->assertTrue(count($results) == 0); + } + + //245 + function test245_tableWithMoreHeadersUseID() { + + $results = $this->getTest('245-1.html', 'tableWithMoreHeadersUseID'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('245-2.html', 'tableWithMoreHeadersUseID'); + $this->assertTrue(count($results) == 0); + } + + //246 + function test246_formWithRequiredLabel() { + + $results = $this->getTest('246-1.html', 'formWithRequiredLabel'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('246-2.html', 'formWithRequiredLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('246-3.html', 'formWithRequiredLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('246-4.html', 'formWithRequiredLabel'); + $this->assertTrue($results[0]->element->tagName == 'form'); + + $results = $this->getTest('246-5.html', 'formWithRequiredLabel'); + $this->assertTrue($results[0]->element->tagName == 'form'); + } + + //247 + function test247_inputCheckboxRequiresFieldset() { + + $results = $this->getTest('247-1.html', 'inputCheckboxRequiresFieldset'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('247-2.html', 'inputCheckboxRequiresFieldset'); + $this->assertTrue(count($results) == 0); + } + + //248 + function test248_documentVisualListsAreMarkedUp() { + + $results = $this->getTest('248-1.html', 'documentVisualListsAreMarkedUp'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('248-2.html', 'documentVisualListsAreMarkedUp'); + $this->assertTrue(count($results) == 0); + } + + //skipped 249 - 250 - 251 + + //252 + function test252_documentAllColorsAreSet() { + + $results = $this->getTest('252-1.html', 'documentAllColorsAreSet'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('252-2.html', 'documentAllColorsAreSet'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('252-3.html', 'documentAllColorsAreSet'); + $this->assertTrue(count($results) == 0); + } + + //258 + function test258_appletProvidesMechanismToReturnToParent() { + + $results = $this->getTest('258-1.html', 'appletProvidesMechanismToReturnToParent'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('258-2.html', 'appletProvidesMechanismToReturnToParent'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + } + + //259 + function test259_objectProvidesMechanismToReturnToParent() { + + $results = $this->getTest('259-1.html', 'objectProvidesMechanismToReturnToParent'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + $results = $this->getTest('259-2.html', 'objectProvidesMechanismToReturnToParent'); + $this->assertTrue($results[0]->element->tagName == 'object'); + } + + //260 + function test260_embedProvidesMechanismToReturnToParent() { + + $results = $this->getTest('260-1.html', 'embedProvidesMechanismToReturnToParent'); + $this->assertTrue($results[0]->element->tagName == 'embed'); + + $results = $this->getTest('260-2.html', 'embedProvidesMechanismToReturnToParent'); + $this->assertTrue($results[0]->element->tagName == 'embed'); + } + + + + //261 + function test261_headersUseToMarkSections() { + + $results = $this->getTest('261-1.html', 'headersUseToMarkSections'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('261-2.html', 'headersUseToMarkSections'); + $this->assertTrue(count($results) == 0 ); + + $results = $this->getTest('261-3.html', 'headersUseToMarkSections'); + $this->assertTrue(count($results) == 0 ); + } + //skipped 262-263 + + //264 + function test264_inputSubmitHasTabIndex() { + + $results = $this->getTest('264-1.html', 'inputSubmitHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('264-2.html', 'inputSubmitHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('264-3.html', 'inputSubmitHasTabIndex'); + $this->assertTrue(count($results) == 0 ); + } + + //265 + function test264_tabIndexFollowsLogicalOrder() { + + $results = $this->getTest('265-1.html', 'tabIndexFollowsLogicalOrder'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('265-2.html', 'tabIndexFollowsLogicalOrder'); + $this->assertTrue(count($results) == 0 ); + } + + //267 + + //268 + function test268_formHasGoodErrorMessage() { + + $results = $this->getTest('268-1.html', 'formHasGoodErrorMessage'); + $this->assertTrue($results[0]->element->tagName == 'form'); + + $results = $this->getTest('268-2.html', 'formHasGoodErrorMessage'); + $this->assertTrue($results[0]->element->tagName == 'form'); + } + + //269 + function test269_formErrorMessageHelpsUser() { + + $results = $this->getTest('269-1.html', 'formErrorMessageHelpsUser'); + $this->assertTrue($results[0]->element->tagName == 'form'); + + $results = $this->getTest('269-2.html', 'formErrorMessageHelpsUser'); + $this->assertTrue($results[0]->element->tagName == 'form'); + } + + //270 + function test270_formAllowsCheckIfIrreversable() { + + $results = $this->getTest('269-1.html', 'formAllowsCheckIfIrreversable'); + $this->assertTrue($results[0]->element->tagName == 'form'); + + $results = $this->getTest('269-2.html', 'formAllowsCheckIfIrreversable'); + $this->assertTrue($results[0]->element->tagName == 'form'); + } + + //skipped 271 + + //271 + function test271_documentReadingDirection() { + + $results = $this->getTest('271-1.html', 'documentReadingDirection'); + $this->assertTrue($results[0]->element->tagName == 'span'); + + $results = $this->getTest('271-2.html', 'documentReadingDirection'); + $this->assertTrue(count($results) == 0); + } + + //272 + function test272_formDeleteIsReversable() { + + $results = $this->getTest('272-1.html', 'formDeleteIsReversable'); + $this->assertTrue($results[0]->element->tagName == 'form'); + + $results = $this->getTest('272-2.html', 'formDeleteIsReversable'); + $this->assertTrue($results[0]->element->tagName == 'form'); + } + + //273 - 276 skipped +} + +$tests = &new TestOfTests(); +$tests->run(new HtmlReporter()); + + diff --git a/tests/.svn/text-base/quailTests.php.svn-base b/tests/.svn/text-base/quailTests.php.svn-base new file mode 100644 index 0000000..910bff4 --- /dev/null +++ b/tests/.svn/text-base/quailTests.php.svn-base @@ -0,0 +1,134 @@ +runCheck(); + + return $quail->getTest($test); + } + + function test_svgContainsTitle() { + $results = $this->getTest('svgContainsTitle-fail.html', 'svgContainsTitle'); + $this->assertTrue($results[0]->element->tagName == 'svg'); + $results = $this->getTest('svgContainsTitle-pass.html', 'svgContainsTitle'); + $this->assertTrue(count($results) == 0); + } + function test_cssTextHasContrast() { + $results = $this->getTest('cssContrast.html', 'cssTextHasContrast'); + $this->assertTrue($results[0]->element->tagName == 'p'); + } + + function test_complexCssTextHasContrast() { + $results = $this->getTest('cssContrast2.html', 'cssTextHasContrast'); + $this->assertTrue($results[0]->element->tagName == 'p'); + } + + function test_cssTextContrastWithColorConversion() { + $results = $this->getTest('cssContrast3.html', 'cssTextHasContrast'); + $this->assertTrue($results[0]->element->tagName == 'div'); + + } + + function test_cssTextContrastWithComplexBackground() { + $results = $this->getTest('cssContrast4.html', 'cssTextHasContrast'); + $this->assertTrue($results[0]->element->tagName == 'pre'); + + } + function test_cssTextContrastWithInlineAndIncludedFiles() { + $results = $this->getTest('cssContrast5.html', 'cssTextHasContrast'); + $this->assertTrue($results[0]->element->tagName == 'pre'); + + } + function test_videoProvidesCaptions() { + $results = $this->getTest('videoTestFail.html', 'videoProvidesCaptions'); + $this->assertTrue($results[0]->element->tagName == 'video'); + + } + + function test_videosEmbeddedOrLinkedNeedCaptions() { + $results = $this->getTest('videosEmbeddedOrLinkedNeedCaptions-fail.html', + 'videosEmbeddedOrLinkedNeedCaptions'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('videosEmbeddedOrLinkedNeedCaptions-pass.html', + 'videosEmbeddedOrLinkedNeedCaptions'); + $this->assertTrue(count($results) == 0); + + } + + function test_documentIsWrittenClearly() { + $results = $this->getTest('documentIsWrittenClearly-fail.html', 'documentIsWrittenClearly'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('documentIsWrittenClearly-pass.html', 'documentIsWrittenClearly'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('documentIsWrittenClearly-pass-2.html', 'documentIsWrittenClearly'); + $this->assertTrue(count($results) == 0); + + } + + function test_headersHaveText() { + $results = $this->getTest('headersHaveText-fail.html', 'headersHaveText'); + $this->assertTrue($results[0]->element->tagName == 'h2'); + + $results = $this->getTest('headersHaveText-fail2.html', 'headersHaveText'); + $this->assertTrue($results[0]->element->tagName == 'h2'); + + $results = $this->getTest('headersHaveText-pass.html', 'headersHaveText'); + $this->assertTrue(count($results) == 0); + + } + + function test_labelsAreAssignedToAnInput() { + $results = $this->getTest('labelsAreAssignedToAnInput-fail.html', 'labelsAreAssignedToAnInput'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('labelsAreAssignedToAnInput-fail2.html', 'labelsAreAssignedToAnInput'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('labelsAreAssignedToAnInput-fail3.html', 'labelsAreAssignedToAnInput'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('labelsAreAssignedToAnInput-pass.html', 'labelsAreAssignedToAnInput'); + $this->assertTrue(count($results) == 0); + + } + + function test_imgAltTextNotRedundant() { + $results = $this->getTest('imgAltTextNotRedundant-fail.html', 'imgAltTextNotRedundant'); + $this->assertTrue($results[0]->element->tagName == 'img'); + + $results = $this->getTest('imgAltTextNotRedundant-pass.html', 'imgAltTextNotRedundant'); + $this->assertTrue(count($results) == 0); + + } + + function test_selectJumpMenus() { + $results = $this->getTest('selectJumpMenus-fail.html', 'selectJumpMenus'); + $this->assertTrue($results[0]->element->tagName == 'select'); + + $results = $this->getTest('selectJumpMenus-pass.html', 'selectJumpMenus'); + $this->assertTrue(count($results) == 0); + + } + + function test_textIsNotSmall() { + $results = $this->getTest('textIsNotSmall-fail.html', 'textIsNotSmall'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('textIsNotSmall-pass.html', 'textIsNotSmall'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('textIsNotSmall-fail2.html', 'textIsNotSmall'); + $this->assertTrue($results[0]->element->tagName == 'p'); + } +} + +$tests = &new TestOfQuailTests(); +$tests->run(new HtmlReporter()); \ No newline at end of file diff --git a/tests/cssTestInterface.php b/tests/cssTestInterface.php new file mode 100644 index 0000000..cc95cbc --- /dev/null +++ b/tests/cssTestInterface.php @@ -0,0 +1,50 @@ +file_base . $filename; + $this->dom = new DOMDocument(); + $this->dom->loadHTMLFile($filename); + $this->css = new quailCSS($this->dom, $filename, 'file', $this->getPath($this->file_base)); + } + + function renderHTML() { + $xpath = new DOMXPath($this->dom); + $entries = $xpath->query('//*'); + foreach($entries as $element) { + $style = $this->css->getStyle($element); + $element->setAttribute('title' , 'b: '. $style['background-color'] .' f: '. $style['color']); + } + return $this->dom->saveHTML(); + } + + function getPath($path) { + $parts = explode('://', $this->uri); + $this->path[] = $parts[0] .':/'; + if(is_array($parts[1])) { + foreach(explode('/', $this->getBaseFromFile($parts[1])) as $part) { + $this->path[] = $part; + } + } + else { + $this->path[] = $parts[1] .'/'; + } + } +} + +$test = new cssTestInterface('cssComplexTest1.html'); +/*print_r($test->css->dom_index); +foreach($test->css->dom_index as $i) { + print $i[0]['element']->tagName .'
'; + print_r($i[0]['style']); + print '
'; + +}*/ +print $test->renderHTML(); \ No newline at end of file diff --git a/tests/cssTests.php b/tests/cssTests.php new file mode 100644 index 0000000..66408ab --- /dev/null +++ b/tests/cssTests.php @@ -0,0 +1,178 @@ +loadHTML(file_get_contents($url)); + $uri = $url; + $type = 'uri'; + $path = '/'; + return new quailCSS($dom, $uri, $type, $path); + } + + function test_wcagCss1() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-1.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background-color'] == 'lime'); + foreach($css->dom->getElementsByTagName('li') as $li) { + $style = $css->getStyle($li); + $this->assertTrue($style['background-color'] == 'lime'); + } + } + + + function test_wcagCss2() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-2.html'); + $paragraph = $css->dom->getElementsByTagName('address'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background-color'] == 'lime'); + } + + function test_wcagCss3() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-3a.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['color'] == 'lime'); + $li = $css->dom->getElementsByTagName('li'); + $style = $css->getStyle($li->item(0)); + $this->assertTrue($style['color'] == 'lime'); + } + + function test_wcagCss4() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-4.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background-color'] == 'lime'); + } + + + function test_wcagCss7b() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-7b.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background'] == 'lime'); + } + + function test_wcagCss13() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-13.html'); + foreach($css->dom->getElementsByTagName('li') as $li) { + $style = $css->getStyle($li); + $this->assertTrue($style['background-color'] == 'lime'); + } + } + + function test_wcagCss14b() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14b.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background'] == 'green'); + $this->assertTrue($style['color'] == 'white'); + $style = $css->getStyle($paragraph->item(1)); + $this->assertTrue($style['background'] == 'green'); + } + + function test_wcagCss14c() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14c.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $div = $css->dom->getElementsByTagName('div'); + $style = $css->getStyle($div->item(0)); + $this->assertTrue($style['background'] == 'green'); + $address = $css->dom->getElementsByTagName('address'); + $style = $css->getStyle($div->item(0)); + $this->assertTrue($style['background'] == 'green'); + } + + function test_wcagCss14d() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14d.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background'] == 'green'); + $this->assertTrue($style['color'] == 'white'); + } + + function test_wcagCss14e() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-14e.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background'] == 'green'); + $this->assertTrue($style['color'] == 'white'); + $div = $css->dom->getElementsByTagName('div'); + $address = $css->dom->getElementsByTagName('address'); + } + + function test_wcagCss15() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-15.html'); + foreach($css->dom->getElementsByTagName('li') as $li) { + $style = $css->getStyle($li); + $this->assertTrue($style['background-color'] == 'lime'); + } + } + + function test_wcagCss15b() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-15b.html'); + $paragraph = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraph->item(0)); + $this->assertTrue($style['background'] == 'green'); + $this->assertTrue($style['color'] == 'white'); + $div = $css->dom->getElementsByTagName('div'); + $style = $css->getStyle($div->item(0)); + $this->assertTrue($style['background'] == 'green'); + + } + + /** + * We are skipping pseudo classes + */ + function test_wcagCss43() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-43.html'); + $paragraphs = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraphs->item(0)); + $this->assertTrue($style['background-color'] == 'lime'); + $style = $css->getStyle($paragraphs->item(1)); + $this->assertTrue($style['background-color'] == 'lime'); + $style = $css->getStyle($paragraphs->item(2)); + $this->assertTrue($style['background-color'] != 'lime'); + } + + function test_wcagCss43b() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-43b.html'); + $paragraphs = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraphs->item(0)); + $this->assertTrue($style['background-color'] != 'lime'); + $style = $css->getStyle($paragraphs->item(1)); + $this->assertTrue($style['background-color'] != 'lime'); + $style = $css->getStyle($paragraphs->item(2)); + $this->assertTrue($style['background-color'] == 'lime'); + } + + /** + * Child combinator (#44) + */ + function test_wcagCss44() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/css3-modsel-44.html'); + $paragraphs = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraphs->item(2)); + $this->assertTrue($style['background-color'] != 'lime'); + } + + /** + * Color text + */ + function test_wcagCssColorText301() { + $css = $this->getCSSObject('http://www.w3.org/Style/CSS/Test/CSS3/Color/current/html4/t0301-color-text-a.htm'); + $paragraphs = $css->dom->getElementsByTagName('p'); + $style = $css->getStyle($paragraphs->item(0)); + $this->assertTrue($style['color'] == 'green'); + } +} + + +$tests = &new TestOfCSSTests(); +$tests->run(new HtmlReporter()); \ No newline at end of file diff --git a/tests/index.php b/tests/index.php new file mode 100644 index 0000000..a0e0087 --- /dev/null +++ b/tests/index.php @@ -0,0 +1,2443 @@ +runCheck(); + + return $quail->getTest($test); + } + + + // 1 + function test1_imgHasAlt() { + $results = $this->getTest('1-1.html', 'imgHasAlt'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + $results = $this->getTest('1-2.html', 'imgHasAlt'); + $this->assertTrue(count($results) == 0); + } + + //2 + function test2_imgAltIsDifferent() { + $results = $this->getTest('2-1.html', 'imgAltIsDifferent'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('2-2.html', 'imgAltIsDifferent'); + $this->assertTrue(count($results) == 0); + } + + //3 + function test4_imgAltIsTooLong() { + $results = $this->getTest('3-1.html', 'imgAltIsTooLong'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('3-2.html', 'imgAltIsTooLong'); + $this->assertTrue(count($results) == 0); + } + + //4 + function test4_imgNonDecorativeHasAlt() { + $results = $this->getTest('4-1.html', 'imgNonDecorativeHasAlt'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('4-2.html', 'imgNonDecorativeHasAlt'); + $this->assertTrue(count($results) == 0); + } + + //5 + function test5_imgImportantNoSpacerAlt() { + $results = $this->getTest('5-1.html', 'imgImportantNoSpacerAlt'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('5-2.html', 'imgImportantNoSpacerAlt'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('5-3.html', 'imgImportantNoSpacerAlt'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'big-fail.png'); + } + + //6 + function test6_imgAltNotPlaceHolder() { + $results = $this->getTest('6-1.html', 'imgAltNotPlaceHolder'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('6-2.html', 'imgAltNotPlaceHolder'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('6-3.html', 'imgAltNotPlaceHolder'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('6-4.html', 'imgAltNotPlaceHolder'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('6-5.html', 'imgAltNotPlaceHolder'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('6-6.html', 'imgAltNotPlaceHolder'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('6-7.html', 'imgAltNotPlaceHolder'); + $this->assertTrue(count($results) == 0); + } + + //7 + function test7_imgAltNotEmptyInAnchor() { + $results = $this->getTest('7-1.html', 'imgAltNotEmptyInAnchor'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('7-2.html', 'imgAltNotEmptyInAnchor'); + $this->assertTrue(count($results) == 0); + } + + //8 + function test8_imgHasLongDesc() { + $results = $this->getTest('8-1.html', 'imgHasLongDesc'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'chart.gif'); + + $results = $this->getTest('8-2.html', 'imgHasLongDesc'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('8-3.html', 'imgHasLongDesc'); + //$this->assertTrue($results[0]->element->getAttribute('src') == 'chart.gif'); + + $results = $this->getTest('8-4.html', 'imgHasLongDesc'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('8-5.html', 'imgHasLongDesc'); + $this->assertTrue(count($results) == 0); + } + + //9 + function test9_imgNeedsLongDescWDlink() { + $results = $this->getTest('9-1.html', 'imgNeedsLongDescWDlink'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'rex.jpg'); + + $results = $this->getTest('9-2.html', 'imgNeedsLongDescWDlink'); + $this->assertTrue(count($results) == 0); + } + + //10 + function test10_imgGifNoFlicker() { + $results = $this->getTest('10-1.html', 'imgGifNoFlicker'); + //$this->assertTrue($results[0]->element->getAttribute('src') == 'eatatjoes.gif'); + + $results = $this->getTest('10-2.html', 'imgGifNoFlicker'); + $this->assertTrue(count($results) == 0); + } + + + //11 + function test11_imgAltIsSameInText() { + $results = $this->getTest('11-1.html', 'imgAltIsSameInText'); + $this->assertTrue($results[0]->element->getAttribute('alt') == 'logo'); + + $results = $this->getTest('11-2.html', 'imgAltIsSameInText'); + $this->assertTrue($results[0]->element->getAttribute('alt') == 'W3C Working Draft logo'); + } + + //12 + function test12_imgWithMapHasUseMap() { + $results = $this->getTest('12-1.html', 'imgWithMapHasUseMap'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'image.gif'); + + $results = $this->getTest('12-2.html', 'imgWithMapHasUseMap'); + $this->assertTrue(count($results) == 0); + } + + //13 + function test13_imgMapAreasHaveDuplicateLink() { + $results = $this->getTest('13-1.html', 'imgMapAreasHaveDuplicateLink'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'navigation.gif'); + + $results = $this->getTest('13-2.html', 'imgMapAreasHaveDuplicateLink'); + $this->assertTrue(count($results) == 0); + + + $results = $this->getTest('13-3.html', 'imgMapAreasHaveDuplicateLink'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'navigation.gif'); + } + + //14 + function test14_imgNotReferredToByColorAlone() { + $results = $this->getTest('14-1.html', 'imgNotReferredToByColorAlone'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'kids.jpg'); + + $results = $this->getTest('14-2.html', 'imgNotReferredToByColorAlone'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'kids.jpg'); + + $results = $this->getTest('14-3.html', 'imgNotReferredToByColorAlone'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'kids.jpg'); + } + + //15 + function test15_imgAltIdentifiesLinkDestination() { + $results = $this->getTest('15-1.html', 'imgAltIdentifiesLinkDestination'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'topo.gif'); + + $results = $this->getTest('15-2.html', 'imgAltIdentifiesLinkDestination'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'topo.gif'); + + } + + //16 + function test16_imgAltEmptyForDecorativeImages() { + $results = $this->getTest('16-1.html', 'imgAltEmptyForDecorativeImages'); + $this->assertTrue($results[0]->element->getAttribute('src') == '10pttab.gif'); + + $results = $this->getTest('16-2.html', 'imgAltEmptyForDecorativeImages'); + $this->assertTrue($results[0]->element->getAttribute('src') == '10pttab.gif'); + + $results = $this->getTest('16-3.html', 'imgAltEmptyForDecorativeImages'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'star.gif'); + + $results = $this->getTest('16-4.html', 'imgAltEmptyForDecorativeImages'); + $this->assertTrue($results[0]->element->getAttribute('src') == 'star.gif'); + } + + + //17 + function test17_aLinksToSoundFilesNeedTranscripts() { + $results = $this->getTest('17-1.html', 'aLinksToSoundFilesNeedTranscripts'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'carol-talking.wav'); + } + + //18 + function test18_aLinksDontOpenNewWindow() { + $results = $this->getTest('18-1.html', 'aLinksDontOpenNewWindow'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'newwindow.html'); + + $results = $this->getTest('18-2.html', 'aLinksDontOpenNewWindow'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('18-3.html', 'aLinksDontOpenNewWindow'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('18-4.html', 'aLinksDontOpenNewWindow'); + $this->assertTrue(count($results) == 0); + } + + + //19 + function test19_aLinksMakeSenseOutOfContext() { + $results = $this->getTest('19-1.html', 'aLinksMakeSenseOutOfContext'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'dogs.html'); + + + } + + //20 + function test20_aLinksToMultiMediaRequireTranscript() { + $results = $this->getTest('20-1.html', 'aLinksToMultiMediaRequireTranscript'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'movie.wmv'); + + $results = $this->getTest('20-2.html', 'aLinksToMultiMediaRequireTranscript'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('20-3.html', 'aLinksToMultiMediaRequireTranscript'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'movie.mpg'); + + $results = $this->getTest('20-4.html', 'aLinksToMultiMediaRequireTranscript'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'movie.mov'); + + $results = $this->getTest('20-5.html', 'aLinksToMultiMediaRequireTranscript'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'movie.ram'); + + $results = $this->getTest('20-6.html', 'aLinksToMultiMediaRequireTranscript'); + $this->assertTrue($results[0]->element->getAttribute('href') == 'movie.aif'); + } + + //21 + function test21_appletsDoneUseColorAlone() { + + $results = $this->getTest('21-1.html', 'appletsDoneUseColorAlone'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('21-2.html', 'appletsDoneUseColorAlone'); + $this->assertTrue(count($results) == 0); + } + + //22 + function test22_appletsDoNotFlicker() { + + $results = $this->getTest('22-1.html', 'appletsDoNotFlicker'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('22-2.html', 'appletsDoNotFlicker'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + } + + //23 + function test23_appletContainsTextEquivalentInAlt() { + + $results = $this->getTest('23-1.html', 'appletContainsTextEquivalentInAlt'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('23-2.html', 'appletContainsTextEquivalentInAlt'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('23-3.html', 'appletContainsTextEquivalentInAlt'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + } + + + //24 + function test24_appletTextEquivalentsGetUpdated() { + + $results = $this->getTest('23-1.html', 'appletTextEquivalentsGetUpdated'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('23-2.html', 'appletTextEquivalentsGetUpdated'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + } + + //25 + function test25_appletContainsTextEquivalent() { + + $results = $this->getTest('25-1.html', 'appletContainsTextEquivalent'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('25-2.html', 'appletContainsTextEquivalent'); + $this->assertTrue(count($results) == 0); + + } + + //26 + function test26_appletUIMustBeAccessible() { + + $results = $this->getTest('26-1.html', 'appletUIMustBeAccessible'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('26-2.html', 'appletUIMustBeAccessible'); + $this->assertTrue(count($results) == 0); + + } + + //27 + function test27_blinkIsNotUsed() { + + $results = $this->getTest('27-1.html', 'blinkIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'blink'); + + $results = $this->getTest('27-2.html', 'blinkIsNotUsed'); + $this->assertTrue(count($results) == 0); + + } + + //28 + function test28_skipToContentLinkProvided() { + + $results = $this->getTest('28-1.html', 'skipToContentLinkProvided'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('28-2.html', 'skipToContentLinkProvided'); + $this->assertTrue(count($results) == 0); + + } + + //29 + function test29_doctypeProvided() { + + $results = $this->getTest('29-1.html', 'doctypeProvided'); + if(isset($results[0])) { + $this->assertTrue($results[0]->pass == false); + } + $results = $this->getTest('29-2.html', 'doctypeProvided'); + $this->assertTrue(count($results) == 0); + + } + + //30 + function test30_objectDoesNotFlicker() { + + $results = $this->getTest('30-1.html', 'objectDoesNotFlicker'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + $results = $this->getTest('30-2.html', 'objectDoesNotFlicker'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + } + + //31 + function test31_framesHaveATitle() { + + $results = $this->getTest('31-1.html', 'framesHaveATitle'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('31-2.html', 'framesHaveATitle'); + $this->assertTrue(count($results) == 0); + + } + + //32 + function test32_frameTitlesDescribeFunction() { + + $results = $this->getTest('32-1.html', 'frameTitlesDescribeFunction'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('32-2.html', 'frameTitlesDescribeFunction'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('32-3.html', 'frameTitlesDescribeFunction'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + } + + //33 + function test33_frameSrcIsAccessible() { + + $results = $this->getTest('33-1.html', 'frameSrcIsAccessible'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('32-2.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-3.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-4.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-5.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-6.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-7.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-8.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('32-9.html', 'frameSrcIsAccessible'); + $this->assertTrue(count($results) == 0); + + } + + //34 + function test34_frameRelationshipsMustBeDescribed() { + + $results = $this->getTest('34-1.html', 'frameRelationshipsMustBeDescribed'); + $this->assertTrue($results[0]->element->tagName == 'frameset'); + + $results = $this->getTest('34-2.html', 'frameRelationshipsMustBeDescribed'); + $this->assertTrue(count($results) == 0); + + } + + //35 + function test35_framesetMustHaveNoFramesSection() { + + $results = $this->getTest('35-1.html', 'framesetMustHaveNoFramesSection'); + $this->assertTrue($results[0]->element->tagName == 'frameset'); + + $results = $this->getTest('35-2.html', 'framesetMustHaveNoFramesSection'); + $this->assertTrue(count($results) == 0); + + } + + //36 + function test36_noframesSectionMustHaveTextEquivalent() { + + $results = $this->getTest('36-1.html', 'noframesSectionMustHaveTextEquivalent'); + $this->assertTrue($results[0]->element->tagName == 'noframes'); + + $results = $this->getTest('36-2.html', 'noframesSectionMustHaveTextEquivalent'); + $this->assertTrue($results[0]->element->tagName == 'frameset'); + + } + + //37 + function test37_headerH1() { + + $results = $this->getTest('37-1.html', 'headerH1'); + $this->assertTrue($results[0]->element->tagName == 'h3'); + + $results = $this->getTest('37-2.html', 'headerH1'); + + $this->assertTrue(count($results) == 0); + + } + + //38 + function test38_headerH2() { + + $results = $this->getTest('38-1.html', 'headerH2'); + $this->assertTrue($results[0]->element->tagName == 'h4'); + + $results = $this->getTest('38-2.html', 'headerH2'); + $this->assertTrue(count($results) == 0); + + } + + //39 + function test39_headerH3() { + + $results = $this->getTest('39-1.html', 'headerH3'); + $this->assertTrue($results[0]->element->tagName == 'h5'); + + $results = $this->getTest('39-2.html', 'headerH3'); + $this->assertTrue(count($results) == 0); + + } + + //40 + function test40_headerH4() { + + $results = $this->getTest('40-1.html', 'headerH4'); + $this->assertTrue($results[0]->element->tagName == 'h6'); + + $results = $this->getTest('40-2.html', 'headerH4'); + $this->assertTrue(count($results) == 0); + + } + + //41 + function test41_headerH5() { + + $results = $this->getTest('41-1.html', 'headerH4'); + $this->assertTrue($results[0]->element->tagName == 'h6'); + + $results = $this->getTest('41-2.html', 'headerH4'); + $this->assertTrue(count($results) == 0); + + } + + //42 - 47 + function test41_47_headerFormatting() { + for($i = 1; $i < 7; $i++) { + $classname = 'headerH'. $i .'Format'; + $filename = ($i + 41) . '-1.html'; + $results = $this->getTest($filename, $classname); + $this->assertTrue($results[0]->element->tagName == 'h'. $i); + + } + } + + //48 + function test48_documentLangNotIdentified() { + $results = $this->getTest('48-1.html', 'documentLangNotIdentified'); + $this->assertTrue($results[0]->pass == false); + + $results = $this->getTest('48-2.html', 'documentLangNotIdentified'); + $this->assertTrue(count($results) == 0); + } + + //49 + function test49_documentLangIsISO639Standard() { + $results = $this->getTest('49-1.html', 'documentLangIsISO639Standard'); + if(isset($reuslts[0])) { + $this->assertTrue($results[0]->pass == false); + } + $results = $this->getTest('49-2.html', 'documentLangIsISO639Standard'); + $this->assertTrue(count($results) == 0); + } + + //50 + function test50_documentHasTitleElement() { + $results = $this->getTest('50-1.html', 'documentHasTitleElement'); + $this->assertTrue($results[0]->pass == false); + + + $results = $this->getTest('50-2.html', 'documentHasTitleElement'); + $this->assertTrue(count($results) == 0); + } + + //51 + function test51_documentTitleNotEmpty() { + $results = $this->getTest('51-1.html', 'documentTitleNotEmpty'); + $this->assertTrue($results[0]->pass == false); + + + $results = $this->getTest('51-2.html', 'documentTitleNotEmpty'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('51-3.html', 'documentTitleNotEmpty'); + $this->assertTrue($results[0]->pass == false); + } + + //52 + function test52_documentTitleIsShort() { + $results = $this->getTest('52-1.html', 'documentTitleIsShort'); + $this->assertTrue($results[0]->pass == false); + + + $results = $this->getTest('52-2.html', 'documentTitleIsShort'); + $this->assertTrue(count($results) == 0); + } + + //53 + function test53_documentTitleIsNotPlaceholder() { + $results = $this->getTest('53-1.html', 'documentTitleIsNotPlaceholder'); + if(isset($results[0])) { + $this->assertTrue($results[0]->pass == false); + } + + $results = $this->getTest('53-2.html', 'documentTitleIsNotPlaceholder'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('53-3.html', 'documentTitleIsNotPlaceholder'); + if(isset($results[0])) { + $this->assertTrue($results[0]->pass == false); + } + + $results = $this->getTest('53-4.html', 'documentTitleIsNotPlaceholder'); + $this->assertTrue(!isset($results[0]->pass)); + + $results = $this->getTest('53-5.html', 'documentTitleIsNotPlaceholder'); + $this->assertTrue(!isset($results[0]->pass)); + } + + //54 + function test54_documentTitleDescribesDocument() { + $results = $this->getTest('54-1.html', 'documentTitleDescribesDocument'); + $this->assertTrue($results[0]->element->tagName == 'title'); + + + $results = $this->getTest('54-2.html', 'documentTitleDescribesDocument'); + $this->assertTrue($results[0]->element->tagName == 'title'); + } + + //55 + function test55_inputDoesNotUseColorAlone() { + $results = $this->getTest('55-1.html', 'inputDoesNotUseColorAlone'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('55-2.html', 'inputDoesNotUseColorAlone'); + $this->assertTrue(count($results) == 0); + } + + //57 + function test57_inputTextHasLabel() { + $results = $this->getTest('57-1.html', 'inputTextHasLabel'); + $this->assertTrue($results[0]->element->getAttribute('name') == 'firstname'); + + + $results = $this->getTest('57-2.html', 'inputTextHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('57-3.html', 'inputTextHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('57-4.html', 'inputTextHasLabel'); + $this->assertTrue(count($results) == 0); + } + + //58 + function test58_inputImageHasAlt() { + $results = $this->getTest('58-1.html', 'inputImageHasAlt'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('58-2.html', 'inputImageHasAlt'); + $this->assertTrue(count($results) == 0); + } + + //59 + function test59_inputImageAltIdentifiesPurpose() { + $results = $this->getTest('59-1.html', 'inputImageAltIdentifiesPurpose'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('59-2.html', 'inputImageAltIdentifiesPurpose'); + $this->assertTrue($results[0]->element->tagName == 'input'); + } + + //60 + function test60_inputImageAltIsShort() { + $results = $this->getTest('60-1.html', 'inputImageAltIsShort'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('60-2.html', 'inputImageAltIsShort'); + $this->assertTrue(count($results) == 0); + } + + //61 + function test61_inputImageAltIsNotFileName() { + $results = $this->getTest('61-1.html', 'inputImageAltIsNotFileName'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('61-2.html', 'inputImageAltIsNotFileName'); + $this->assertTrue(count($results) == 0); + } + + //62 + function test62_inputImageAltIsNotPlaceholder() { + $results = $this->getTest('62-1.html', 'inputImageAltIsNotPlaceholder'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('62-2.html', 'inputImageAltIsNotPlaceholder'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('62-3.html', 'inputImageAltIsNotPlaceholder'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('62-4.html', 'inputImageAltIsNotPlaceholder'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + } + + //63 + function test63_inputTextHasValue() { + $results = $this->getTest('63-1.html', 'inputTextHasValue'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('63-2.html', 'inputTextHasValue'); + $this->assertTrue(count($results) == 0); + } + + //64 + function test64_areaHasAltValue() { + $results = $this->getTest('64-1.html', 'areaHasAltValue'); + $this->assertTrue($results[0]->element->tagName == 'area'); + + + $results = $this->getTest('64-2.html', 'areaHasAltValue'); + $this->assertTrue(count($results) == 0); + } + + //65 + function test65_areaAltIdentifiesDestination() { + $results = $this->getTest('65-1.html', 'areaAltIdentifiesDestination'); + $this->assertTrue($results[0]->element->tagName == 'area'); + + + $results = $this->getTest('65-2.html', 'areaAltIdentifiesDestination'); + $this->assertTrue($results[0]->element->tagName == 'area'); + } + + //66 + function test66_areaLinksToSoundFile() { + $results = $this->getTest('66-1.html', 'areaLinksToSoundFile'); + $this->assertTrue($results[0]->element->tagName == 'area'); + + + $results = $this->getTest('66-2.html', 'areaLinksToSoundFile'); + $this->assertTrue($results[0]->element->tagName == 'area'); + } + + //68 + function test68_areaDontOpenNewWindow() { + $results = $this->getTest('68-1.html', 'areaDontOpenNewWindow'); + $this->assertTrue($results[0]->element->tagName == 'area'); + + $results = $this->getTest('68-2.html', 'areaDontOpenNewWindow'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('68-3.html', 'areaDontOpenNewWindow'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('68-4.html', 'areaDontOpenNewWindow'); + $this->assertTrue(count($results) == 0); + } + + //69 + function test69_marqueeIsNotUsed() { + $results = $this->getTest('69-1.html', 'marqueeIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'marquee'); + + + $results = $this->getTest('69-2.html', 'marqueeIsNotUsed'); + $this->assertTrue(count($results) == 0); + } + + //70 + function test70_menuNotUsedToFormatText() { + $results = $this->getTest('70-1.html', 'menuNotUsedToFormatText'); + $this->assertTrue($results[0]->element->tagName == 'menu'); + + + $results = $this->getTest('70-2.html', 'menuNotUsedToFormatText'); + $this->assertTrue(count($results) == 0); + } + + //71 + function test71_documentAutoRedirectNotUsed() { + $results = $this->getTest('71-1.html', 'documentAutoRedirectNotUsed'); + if(isset($reuslts[0])) { + $this->assertTrue($results[0]->pass == false); + } + + $results = $this->getTest('71-2.html', 'documentAutoRedirectNotUsed'); + $this->assertTrue(count($results) == 0); + } + + //72 + function test72_documentMetaNotUsedWithTimeout() { + $results = $this->getTest('72-1.html', 'documentMetaNotUsedWithTimeout'); + if(isset($results[0])) { + $this->assertTrue($results[0]->pass == false); + } + + $results = $this->getTest('72-2.html', 'documentMetaNotUsedWithTimeout'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('72-2.html', 'documentMetaNotUsedWithTimeout'); + $this->assertTrue(count($results) == 0); + } + + //73 + function test73_objectDoesNotUseColorAlone() { + $results = $this->getTest('73-1.html', 'objectDoesNotUseColorAlone'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('73-2.html', 'objectDoesNotUseColorAlone'); + $this->assertTrue(count($results) == 0); + } + + //74 + function test74_objectTextUpdatesWhenObjectChanges() { + $results = $this->getTest('74-1.html', 'objectTextUpdatesWhenObjectChanges'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('74-2.html', 'objectTextUpdatesWhenObjectChanges'); + $this->assertTrue(count($results) == 0); + } + + //75 + function test75_objectContentUsableWhenDisabled() { + $results = $this->getTest('75-1.html', 'objectContentUsableWhenDisabled'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('75-2.html', 'objectContentUsableWhenDisabled'); + $this->assertTrue(count($results) == 0); + } + + //76 + function test76_objectInterfaceIsAccessible() { + $results = $this->getTest('76-1.html', 'objectInterfaceIsAccessible'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('76-2.html', 'objectInterfaceIsAccessible'); + $this->assertTrue(count($results) == 0); + } + + //77 + function test77_objectLinkToMultimediaHasTextTranscript() { + $results = $this->getTest('77-1.html', 'objectLinkToMultimediaHasTextTranscript'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('77-2.html', 'objectLinkToMultimediaHasTextTranscript'); + $this->assertTrue(count($results) == 0); + } + + //78 + function test78_objectMustHaveTitle() { + $results = $this->getTest('78-1.html', 'objectMustHaveTitle'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('78-2.html', 'objectMustHaveTitle'); + $this->assertTrue(count($results) == 0); + } + + //79 + function test79_objectMustHaveValidTitle() { + $results = $this->getTest('79-1.html', 'objectMustHaveValidTitle'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('79-2.html', 'objectMustHaveValidTitle'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + $results = $this->getTest('79-3.html', 'objectMustHaveValidTitle'); + $this->assertTrue($results[0]->element->tagName == 'object'); + } + + //80 + function test80_objectMustContainText() { + $results = $this->getTest('80-1.html', 'objectMustContainText'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('80-2.html', 'objectMustContainText'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('80-3.html', 'objectMustContainText'); + $this->assertTrue($results[0]->element->tagName == 'object'); + } + + //81 + function test81_listNotUsedForFormatting() { + $results = $this->getTest('81-1.html', 'listNotUsedForFormatting'); + $this->assertTrue($results[0]->element->tagName == 'ol'); + + + $results = $this->getTest('81-2.html', 'listNotUsedForFormatting'); + $this->assertTrue(count($results) == 0); + } + + //82 + function test82_pNotUsedAsHeader() { + $results = $this->getTest('82-1.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + + $results = $this->getTest('82-2.html', 'pNotUsedAsHeader'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('82-3.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('82-4.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('82-5.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('82-6.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('82-7.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('82-8.html', 'pNotUsedAsHeader'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('82-9.html', 'pNotUsedAsHeader'); + $this->assertTrue(count($results) == 0); + + } + + //86 + function test86_scriptsDoNotUseColorAlone() { + $results = $this->getTest('86-1.html', 'scriptsDoNotUseColorAlone'); + $this->assertTrue($results[0]->element->tagName == 'script'); + + + $results = $this->getTest('86-2.html', 'scriptsDoNotUseColorAlone'); + $this->assertTrue(count($results) == 0); + } + + //87 + function test87_scriptsDoNotFlicker() { + $results = $this->getTest('87-1.html', 'scriptsDoNotFlicker'); + $this->assertTrue($results[0]->element->tagName == 'script'); + + + $results = $this->getTest('87-2.html', 'scriptsDoNotFlicker'); + $this->assertTrue(count($results) == 0); + } + + //88 + function test88_scriptContentAccessibleWithScriptsTurnedOff() { + $results = $this->getTest('88-1.html', 'scriptContentAccessibleWithScriptsTurnedOff'); + $this->assertTrue($results[0]->element->tagName == 'script'); + + + $results = $this->getTest('88-2.html', 'scriptContentAccessibleWithScriptsTurnedOff'); + $this->assertTrue(count($results) == 0); + } + + //89 + function test89_scriptUIMustBeAccessible() { + $results = $this->getTest('89-1.html', 'scriptUIMustBeAccessible'); + $this->assertTrue($results[0]->element->tagName == 'script'); + + + $results = $this->getTest('89-2.html', 'scriptUIMustBeAccessible'); + $this->assertTrue(count($results) == 0); + } + + //90 + function test90_scriptInBodyMustHaveNoscript() { + $results = $this->getTest('90-1.html', 'scriptInBodyMustHaveNoscript'); + $this->assertTrue($results[0]->element->tagName == 'script'); + + + $results = $this->getTest('90-2.html', 'scriptInBodyMustHaveNoscript'); + $this->assertTrue(count($results) == 0); + } + + //91 + function test91_selectHasAssociatedLabel() { + $results = $this->getTest('91-1.html', 'selectHasAssociatedLabel'); + $this->assertTrue($results[0]->element->tagName == 'select'); + + + $results = $this->getTest('91-2.html', 'selectHasAssociatedLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('91-3.html', 'selectHasAssociatedLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('91-4.html', 'selectHasAssociatedLabel'); + $this->assertTrue(count($results) == 0); + } + + //92 + function test92_selectDoesNotChangeContext() { + $results = $this->getTest('92-1.html', 'selectDoesNotChangeContext'); + $this->assertTrue($results[0]->element->tagName == 'select'); + + + $results = $this->getTest('92-2.html', 'selectDoesNotChangeContext'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('92-3.html', 'selectDoesNotChangeContext'); + $this->assertTrue($results[0]->element->tagName == 'select'); + } + + //93 + function test95_textareaHasAssociatedLabel() { + $results = $this->getTest('95-1.html', 'textareaHasAssociatedLabel'); + $this->assertTrue($results[0]->element->tagName == 'textarea'); + + + $results = $this->getTest('95-2.html', 'textareaHasAssociatedLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('95-3.html', 'textareaHasAssociatedLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('95-4.html', 'textareaHasAssociatedLabel'); + $this->assertTrue(count($results) == 0); + } + + //96 + function test96_textareaLabelPositionedClose() { + $results = $this->getTest('96-1.html', 'textareaLabelPositionedClose'); + $this->assertTrue($results[0]->element->tagName == 'textarea'); + + + $results = $this->getTest('96-2.html', 'textareaLabelPositionedClose'); + $this->assertTrue($results[0]->element->tagName == 'textarea'); + } + + + //97 + function test97_cssDocumentMakesSenseStyleTurnedOff() { + $results = $this->getTest('97-1.html', 'cssDocumentMakesSenseStyleTurnedOff'); + $this->assertTrue($results[0]->element->tagName == 'link'); + + + $results = $this->getTest('97-2.html', 'cssDocumentMakesSenseStyleTurnedOff'); + $this->assertTrue(count($results) == 0); + } + + //98 + function test98_documentAbbrIsUsed() { + $results = $this->getTest('98-1.html', 'documentAbbrIsUsed'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + + $results = $this->getTest('98-2.html', 'documentAbbrIsUsed'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('98-3.html', 'documentAbbrIsUsed'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('98-4.html', 'documentAbbrIsUsed'); + $this->assertTrue(count($results) == 0); + + } + + //99 + function test99_documentAcronymsHaveElement() { + $results = $this->getTest('99-1.html', 'documentAcronymsHaveElement'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + + $results = $this->getTest('99-2.html', 'documentAcronymsHaveElement'); + $this->assertTrue(count($results) == 0); + } + + //100 + function test100_blockquoteNotUsedForIndentation() { + $results = $this->getTest('100-1.html', 'blockquoteNotUsedForIndentation'); + $this->assertTrue($results[0]->element->tagName == 'blockquote'); + + + $results = $this->getTest('100-2.html', 'blockquoteNotUsedForIndentation'); + $this->assertTrue(count($results) == 0); + } + + //102 + function test102_scriptOnclickRequiresOnKeypress() { + $results = $this->getTest('102-1.html', 'scriptOnclickRequiresOnKeypress'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('102-2.html', 'scriptOnclickRequiresOnKeypress'); + $this->assertTrue(count($results) == 0); + } + + //103 + function test103_scriptOndblclickRequiresOnKeypress() { + $results = $this->getTest('103-1.html', 'scriptOndblclickRequiresOnKeypress'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('103-2.html', 'scriptOndblclickRequiresOnKeypress'); + $this->assertTrue(count($results) == 0); + } + + //104 + function test104_scriptOnmousedownRequiresOnKeypress() { + $results = $this->getTest('104-1.html', 'scriptOnmousedownRequiresOnKeypress'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('104-2.html', 'scriptOnmousedownRequiresOnKeypress'); + $this->assertTrue(count($results) == 0); + } + + //105 + function test105_scriptOnmousemove() { + $results = $this->getTest('105-1.html', 'scriptOnmousemove'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('105-2.html', 'scriptOnmousemove'); + $this->assertTrue(count($results) == 0); + } + + + //106 + function test106_scriptOnmouseoutHasOnmouseblur() { + $results = $this->getTest('106-1.html', 'scriptOnmouseoutHasOnmouseblur'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('106-2.html', 'scriptOnmouseoutHasOnmouseblur'); + $this->assertTrue(count($results) == 0); + } + + //107 + function test107_scriptOnmouseoverHasOnfocus() { + $results = $this->getTest('107-1.html', 'scriptOnmouseoverHasOnfocus'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('107-2.html', 'scriptOnmouseoverHasOnfocus'); + $this->assertTrue(count($results) == 0); + } + + //108 + function test108_scriptOnmouseupHasOnkeyup() { + $results = $this->getTest('108-1.html', 'scriptOnmouseupHasOnkeyup'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('108-2.html', 'scriptOnmouseupHasOnkeyup'); + $this->assertTrue(count($results) == 0); + } + + //109 + function test109_documentContentReadableWithoutStylesheets() { + $results = $this->getTest('109-1.html', 'documentContentReadableWithoutStylesheets'); + $this->assertTrue($results[0]->pass === false); + + + $results = $this->getTest('109-2.html', 'documentContentReadableWithoutStylesheets'); + $this->assertTrue(count($results) == 0); + } + + //110 + function test110_documentWordsNotInLanguageAreMarked() { + $results = $this->getTest('110-1.html', 'documentWordsNotInLanguageAreMarked'); + $this->assertTrue($results[0]->pass === false); + + + $results = $this->getTest('110-2.html', 'documentWordsNotInLanguageAreMarked'); + $this->assertTrue($results[0]->pass === false); + } + + //111 + function test111_tableComplexHasSummary() { + $results = $this->getTest('111-1.html', 'tableComplexHasSummary'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + + $results = $this->getTest('111-2.html', 'tableComplexHasSummary'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('111-3.html', 'tableComplexHasSummary'); + $this->assertTrue(count($results) == 0); + } + + //112 + function test112_tableSummaryIsEmpty() { + $results = $this->getTest('112-1.html', 'tableSummaryIsEmpty'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + + $results = $this->getTest('112-2.html', 'tableSummaryIsEmpty'); + $this->assertTrue(count($results) == 0); + + } + + //113 + function test113_tableSummaryIsEmpty() { + $results = $this->getTest('113-1.html', 'tableSummaryIsSufficient'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + + $results = $this->getTest('113-2.html', 'tableSummaryIsSufficient'); + $this->assertTrue(count($results) == 0); + + } + + //114 + function test114_tableLayoutHasNoSummary() { + $results = $this->getTest('114-1.html', 'tableLayoutHasNoSummary'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + + $results = $this->getTest('114-2.html', 'tableLayoutHasNoSummary'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('114-3.html', 'tableLayoutHasNoSummary'); + $this->assertTrue(count($results) == 0); + + } + + //115 + function test115_tableLayoutHasNoCaption() { + $results = $this->getTest('115-1.html', 'tableLayoutHasNoCaption'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + + $results = $this->getTest('115-2.html', 'tableLayoutHasNoCaption'); + $this->assertTrue(count($results) == 0); + + + } + + //116 + function test116_boldIsNotUsed() { + $results = $this->getTest('116-1.html', 'boldIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'bold'); + + + $results = $this->getTest('116-2.html', 'boldIsNotUsed'); + $this->assertTrue(count($results) == 0); + + + } + + //117 + function test117_iIsNotUsed() { + $results = $this->getTest('117-1.html', 'iIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'i'); + + + $results = $this->getTest('117-2.html', 'iIsNotUsed'); + $this->assertTrue(count($results) == 0); + + + } + + //118 + function test118_passwordHasLabel() { + $results = $this->getTest('118-1.html', 'passwordHasLabel'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('118-2.html', 'passwordHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('118-3.html', 'passwordHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('118-4.html', 'passwordHasLabel'); + $this->assertTrue(count($results) == 0); + + } + + //119 + function test119_checkboxHasLabel() { + $results = $this->getTest('119-1.html', 'checkboxHasLabel'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('119-2.html', 'checkboxHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('119-3.html', 'checkboxHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('119-4.html', 'checkboxHasLabel'); + $this->assertTrue(count($results) == 0); + + } + + + //120 + function test120_fileHasLabel() { + $results = $this->getTest('120-1.html', 'fileHasLabel'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('120-2.html', 'fileHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('120-3.html', 'fileHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('120-4.html', 'fileHasLabel'); + $this->assertTrue(count($results) == 0); + + } + + //121 + function test121_radioHasLabel() { + $results = $this->getTest('121-1.html', 'radioHasLabel'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('121-2.html', 'radioHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('121-3.html', 'radioHasLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('121-4.html', 'radioHasLabel'); + $this->assertTrue(count($results) == 0); + + } + + //122 + function test122_passwordLabelIsNearby() { + $results = $this->getTest('122-1.html', 'passwordLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('122-2.html', 'passwordLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + } + + //123 + function test123_checkboxLabelIsNearby() { + $results = $this->getTest('123-1.html', 'checkboxLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('123-2.html', 'checkboxLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + } + + //124 + function test124_fileLabelIsNearby() { + $results = $this->getTest('124-1.html', 'fileLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('124-2.html', 'fileLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + } + + //125 + function test125_radioIsNearby() { + $results = $this->getTest('125-1.html', 'radioLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('125-2.html', 'radioLabelIsNearby'); + $this->assertTrue($results[0]->element->tagName == 'input'); + } + + //126 + function test126_inputTextValueNotEmpty() { + $results = $this->getTest('126-1.html', 'inputTextValueNotEmpty'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + + $results = $this->getTest('126-2.html', 'inputTextValueNotEmpty'); + $this->assertTrue(count($results) == 0); + } + + //127 && 128 + function test127_objectWithClassIDHasNoText() { + $results = $this->getTest('127-1.html', 'objectWithClassIDHasNoText'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('127-2.html', 'objectWithClassIDHasNoText'); + $this->assertTrue(count($results) == 0); + } + + //129 + function test129_objectUIMustBeAccessible() { + $results = $this->getTest('128-1.html', 'objectUIMustBeAccessible'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + + $results = $this->getTest('128-2.html', 'objectUIMustBeAccessible'); + $this->assertTrue($results[0]->element->tagName == 'object'); + } + + //131 + function test131_blockquoteUseForQuotations() { + $results = $this->getTest('131-1.html', 'blockquoteUseForQuotations'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + + $results = $this->getTest('131-2.html', 'blockquoteUseForQuotations'); + $this->assertTrue(count($results) == 0); + } + + //132 + function test132_imageMapServerSide() { + $results = $this->getTest('132-1.html', 'imageMapServerSide'); + $this->assertTrue($results[0]->element->tagName == 'img'); + + + $results = $this->getTest('132-2.html', 'imageMapServerSide'); + $this->assertTrue($results[0]->element->tagName == 'img'); + } + + //133 + function test133_tableLayoutMakesSenseLinearized() { + $results = $this->getTest('133-1.html', 'tableLayoutMakesSenseLinearized'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + + $results = $this->getTest('133-2.html', 'tableLayoutMakesSenseLinearized'); + $this->assertTrue($results[0]->element->tagName == 'table'); + } + + //134 + function test134_aLinksAreSeperatedByPrintableCharacters() { + $results = $this->getTest('134-1.html', 'aLinksAreSeperatedByPrintableCharacters'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('134-2.html', 'aLinksAreSeperatedByPrintableCharacters'); + $this->assertTrue(count($results) == 0); + } + + //135 + function test135_imgWithMathShouldHaveMathEquivalent() { + $results = $this->getTest('135-1.html', 'imgWithMathShouldHaveMathEquivalent'); + $this->assertTrue($results[0]->element->tagName == 'img'); + + $results = $this->getTest('135-2.html', 'imgWithMathShouldHaveMathEquivalent'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('135-2.xhtml', 'imgWithMathShouldHaveMathEquivalent'); + $this->assertTrue(count($results) == 0); + } + + //136 + function test136_tableDataShouldHaveTh() { + $results = $this->getTest('136-1.html', 'tableDataShouldHaveTh'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('136-2.html', 'tableDataShouldHaveTh'); + $this->assertTrue(count($results) == 0); + } + +//137 + function test137_tableLayoutDataShouldNotHaveTh() { + $results = $this->getTest('137-1.html', 'tableLayoutDataShouldNotHaveTh'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('137-2.html', 'tableLayoutDataShouldNotHaveTh'); + $this->assertTrue(count($results) == 0); + } + +//138 + function test138_inputTextHasTabIndex() { + $results = $this->getTest('138-1.html', 'inputTextHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('138-2.html', 'inputTextHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('138-3.html', 'inputTextHasTabIndex'); + $this->assertTrue(count($results) == 0); + } + +//139 + function test139_inputRadioHasTabIndex() { + $results = $this->getTest('139-1.html', 'inputRadioHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('139-2.html', 'inputRadioHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('139-3.html', 'inputRadioHasTabIndex'); + $this->assertTrue(count($results) == 0); + } + +//140 + function test140_inputPasswordHasTabIndex() { + $results = $this->getTest('140-1.html', 'inputPasswordHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('140-2.html', 'inputPasswordHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('140-3.html', 'inputPasswordHasTabIndex'); + $this->assertTrue(count($results) == 0); + } + +//141 + function test141_inputCheckboxHasTabIndex() { + $results = $this->getTest('141-1.html', 'inputCheckboxHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('141-2.html', 'inputCheckboxHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('141-3.html', 'inputCheckboxHasTabIndex'); + $this->assertTrue(count($results) == 0); + } + +//142 + function test142_inputFileHasTabIndex() { + $results = $this->getTest('142-1.html', 'inputFileHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('142-2.html', 'inputFileHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('142-3.html', 'inputFileHasTabIndex'); + $this->assertTrue(count($results) == 0); + } + +//143 + function test143_addressForAuthor() { + $results = $this->getTest('143-1.html', 'addressForAuthor'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('143-2.html', 'addressForAuthor'); + $this->assertTrue(count($results) == 0); + } + +//144 + function test144_addressForAuthorMustBeValid() { + $results = $this->getTest('144-1.html', 'addressForAuthorMustBeValid'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('144-2.html', 'addressForAuthorMustBeValid'); + $this->assertTrue(count($results) == 0); + } + + //skipped 145-146 - redundant + + //147 + function test147_linkUsedToDescribeNavigation() { + $results = $this->getTest('147-1.html', 'linkUsedToDescribeNavigation'); + //$this->assertTrue($results[0]->pass === false); + $results = $this->getTest('147-2.html', 'linkUsedToDescribeNavigation'); + $this->assertTrue(count($results) == 0); + } + + //148 + function test148_linkUsedForAlternateContent() { + $results = $this->getTest('148-1.html', 'linkUsedForAlternateContent'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('148-2.html', 'linkUsedForAlternateContent'); + $this->assertTrue(count($results) == 0); + } + + //149 - SKIPPED + + //150 + function test150_liDontUseImageForBullet() { + $results = $this->getTest('150-1.html', 'liDontUseImageForBullet'); + $this->assertTrue($results[0]->element->tagName == 'li'); + + $results = $this->getTest('150-2.html', 'liDontUseImageForBullet'); + $this->assertTrue(count($results) == 0); + } + + //151 + function test151_tableUsesCaption() { + $results = $this->getTest('151-1.html', 'tableUsesCaption'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('151-2.html', 'tableUsesCaption'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('151-3.html', 'tableUsesCaption'); + $this->assertTrue($results[0]->element->tagName == 'table'); + } + //152 + function test152_tableUsesAbbreviationForHeader() { + $results = $this->getTest('152-1.html', 'tableUsesAbbreviationForHeader'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('152-2.html', 'tableUsesAbbreviationForHeader'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('152-3.html', 'tableUsesAbbreviationForHeader'); + $this->assertTrue(count($results) == 0); + } + + //153 + function test153_tableHeaderLabelMustBeTerse() { + $results = $this->getTest('153-1.html', 'tableHeaderLabelMustBeTerse'); + $this->assertTrue($results[0]->element->tagName == 'th'); + + $results = $this->getTest('153-2.html', 'tableHeaderLabelMustBeTerse'); + $this->assertTrue(count($results) == 0); + } + + //154 + function test154_preShouldNotBeUsedForTabularLayout() { + $results = $this->getTest('154-1.html', 'preShouldNotBeUsedForTabularLayout'); + $this->assertTrue($results[0]->element->tagName == 'pre'); + + $results = $this->getTest('154-2.html', 'preShouldNotBeUsedForTabularLayout'); + $this->assertTrue(count($results) == 0); + } + + //155-158 skipped + + //159 + function test159_imgShouldNotHaveTitle() { + $results = $this->getTest('159-1.html', 'imgShouldNotHaveTitle'); + $this->assertTrue($results[0]->element->tagName == 'img'); + + $results = $this->getTest('159-2.html', 'imgShouldNotHaveTitle'); + $this->assertTrue(count($results) == 0); + } + + //160 + function test160_objectShouldHaveLongDescription() { + $results = $this->getTest('160-1.html', 'objectShouldHaveLongDescription'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + $results = $this->getTest('160-2.html', 'objectShouldHaveLongDescription'); + $this->assertTrue(count($results) == 0); + } + + //161 + function test161_emoticonsExcessiveUse() { + $results = $this->getTest('161-1.html', 'emoticonsExcessiveUse'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('161-2.html', 'emoticonsExcessiveUse'); + $this->assertTrue(count($results) == 0); + } + + //162 + function test162_emoticonsMissingAbbr() { + $results = $this->getTest('161-1.html', 'emoticonsMissingAbbr'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('161-2.html', 'emoticonsMissingAbbr'); + $this->assertTrue(count($results) == 0); + } + + //163 + function test163_embedHasAssociatedNoEmbed() { + $results = $this->getTest('163-1.html', 'embedHasAssociatedNoEmbed'); + $this->assertTrue($results[0]->element->tagName == 'embed'); + + $results = $this->getTest('163-2.html', 'embedHasAssociatedNoEmbed'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('163-3.html', 'embedHasAssociatedNoEmbed'); + $this->assertTrue(count($results) == 0); + } + + //164 + function test164_noembedHasEquivalentContent() { + $results = $this->getTest('164-1.html', 'noembedHasEquivalentContent'); + $this->assertTrue($results[0]->element->tagName == 'noembed'); + + $results = $this->getTest('164-2.html', 'noembedHasEquivalentContent'); + $this->assertTrue(count($results) == 0); + } + + //165 + function test165_embedMustHaveAltAttribute() { + $results = $this->getTest('165-1.html', 'embedMustHaveAltAttribute'); + $this->assertTrue($results[0]->element->tagName == 'embed'); + + $results = $this->getTest('165-2.html', 'embedMustHaveAltAttribute'); + $this->assertTrue(count($results) == 0); + } + + //166 + function test166_embedMustNotHaveEmptyAlt() { + $results = $this->getTest('166-1.html', 'embedMustNotHaveEmptyAlt'); + $this->assertTrue($results[0]->element->tagName == 'embed'); + + $results = $this->getTest('166-2.html', 'embedMustNotHaveEmptyAlt'); + $this->assertTrue(count($results) == 0); + } + + //167 + function test167_iframeMustNotHaveLongdesc() { + $results = $this->getTest('167-1.html', 'iframeMustNotHaveLongdesc'); + $this->assertTrue($results[0]->element->tagName == 'iframe'); + + $results = $this->getTest('167-2.html', 'iframeMustNotHaveLongdesc'); + $this->assertTrue(count($results) == 0); + } + + //168 + function test168_radioMarkedWithFieldgroupAndLegend() { + $results = $this->getTest('168-1.html', 'radioMarkedWithFieldgroupAndLegend'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('168-2.html', 'radioMarkedWithFieldgroupAndLegend'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('168-3.html', 'radioMarkedWithFieldgroupAndLegend'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('168-4.html', 'radioMarkedWithFieldgroupAndLegend'); + $this->assertTrue(count($results) == 0); + } + + //169 + function test169_selectWithOptionsHasOptgroup() { + $results = $this->getTest('169-1.html', 'selectWithOptionsHasOptgroup'); + $this->assertTrue($results[0]->element->tagName == 'select'); + + $results = $this->getTest('169-2.html', 'selectWithOptionsHasOptgroup'); + $this->assertTrue(count($results) == 0); + } + + //173 + function test173_aSuspiciousLinkText() { + $results = $this->getTest('173-1.html', 'aSuspiciousLinkText'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('173-2.html', 'aSuspiciousLinkText'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('173-3.html', 'aSuspiciousLinkText'); + $this->assertTrue($results[0]->element->tagName == 'a'); + } + + //174 + function test174_aMustContainText() { + $results = $this->getTest('174-1.html', 'aMustContainText'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('174-2.html', 'aMustContainText'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('174-3.html', 'aMustContainText'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('174-4.html', 'aMustContainText'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('174-5.html', 'aMustContainText'); + $this->assertTrue(count($results) == 0); + + } + + + //175 + function test175_aImgAltNotRepetative() { + $results = $this->getTest('175-1.html', 'aImgAltNotRepetative'); + $this->assertTrue($results[0]->element->tagName == 'img'); + + $results = $this->getTest('175-2.html', 'aImgAltNotRepetative'); + $this->assertTrue(count($results) == 0); + } + + //176 + function test176_basefontIsNotUsed() { + $results = $this->getTest('176-1.html', 'basefontIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'basefont'); + + $results = $this->getTest('176-2.html', 'basefontIsNotUsed'); + $this->assertTrue(count($results) == 0); + } + + //177 + function test177_fontIsNotUsed() { + $results = $this->getTest('177-1.html', 'fontIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'font'); + + $results = $this->getTest('177-2.html', 'fontIsNotUsed'); + $this->assertTrue(count($results) == 0); + } + + //Skipped 178-179 + + //180 + function test180_aAdjacentWithSameResourceShouldBeCombined() { + $results = $this->getTest('180-1.html', 'aAdjacentWithSameResourceShouldBeCombined'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('180-2.html', 'aAdjacentWithSameResourceShouldBeCombined'); + $this->assertTrue(count($results) == 0); + } + + //181 + function test181_aMustNotHaveJavascriptHref() { + $results = $this->getTest('181-1.html', 'aMustNotHaveJavascriptHref'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('181-2.html', 'aMustNotHaveJavascriptHref'); + $this->assertTrue(count($results) == 0); + } + + //182 + function test182_bodyMustNotHaveBackground() { + $results = $this->getTest('182-1.html', 'bodyMustNotHaveBackground'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('182-2.html', 'bodyMustNotHaveBackground'); + $this->assertTrue(count($results) == 0); + } + + //183 + function test183_objectMustHaveEmbed() { + $results = $this->getTest('183-1.html', 'objectMustHaveEmbed'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + $results = $this->getTest('183-2.html', 'objectMustHaveEmbed'); + $this->assertTrue(count($results) == 0); + } + + //184 + function test184_siteMap() { + $results = $this->getTest('184-1.html', 'siteMap'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('184-2.html', 'siteMap'); + $this->assertTrue(count($results) == 0); + } + + //185 + function test185_documentIDsMustBeUnique() { + $results = $this->getTest('185-1.html', 'documentIDsMustBeUnique'); + $this->assertTrue($results[0]->element->tagName == 'th'); + + $results = $this->getTest('185-2.html', 'documentIDsMustBeUnique'); + $this->assertTrue(count($results) == 0); + } + + //186 + function test186_labelDoesNotContainInput() { + $results = $this->getTest('186-1.html', 'labelDoesNotContainInput'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('186-2.html', 'labelDoesNotContainInput'); + $this->assertTrue(count($results) == 0); + } + + //187 + function test187_labelMustBeUnique() { + $results = $this->getTest('187-1.html', 'labelMustBeUnique'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('187-2.html', 'labelMustBeUnique'); + $this->assertTrue(count($results) == 0); + } + + //188 + function test188_labelMustNotBeEmpty() { + $results = $this->getTest('188-1.html', 'labelMustNotBeEmpty'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('188-2.html', 'labelMustNotBeEmpty'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('188-3.html', 'labelMustNotBeEmpty'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('188-3.html', 'labelMustNotBeEmpty'); + $this->assertTrue($results[0]->element->tagName == 'label'); + } + + //190 + function test190_aMustHaveTitle() { + $results = $this->getTest('190-1.html', 'aMustHaveTitle'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('190-2.html', 'aMustHaveTitle'); + $this->assertTrue(count($results) == 0); + } + + //191 + function test191_aTitleDescribesDestination() { + $results = $this->getTest('191-1.html', 'aTitleDescribesDestination'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('191-2.html', 'aTitleDescribesDestination'); + $this->assertTrue($results[0]->element->tagName == 'a'); + } + + //192 + function test192_inputImageAltNotRedundant() { + $results = $this->getTest('192-1.html', 'inputImageAltNotRedundant'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('192-2.html', 'inputImageAltNotRedundant'); + $this->assertTrue(count($results) == 0); + } + + //193 + function test193_inputImageNotDecorative() { + $results = $this->getTest('193-1.html', 'inputImageNotDecorative'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('193-2.html', 'inputImageNotDecorative'); + $this->assertTrue($results[0]->element->tagName == 'input'); + } + + //194 + function test194_areaAltRefersToText() { + $results = $this->getTest('194-1.html', 'areaAltRefersToText'); + $this->assertTrue($results[0]->element->tagName == 'area'); + + $results = $this->getTest('194-2.html', 'areaAltRefersToText'); + $this->assertTrue($results[0]->element->tagName == 'area'); + } + + //195 + function test195_aLinkTextDoesNotBeginWithRedundantWord() { + $results = $this->getTest('195-1.html', 'aLinkTextDoesNotBeginWithRedundantWord'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('195-2.html', 'aLinkTextDoesNotBeginWithRedundantWord'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('195-3.html', 'aLinkTextDoesNotBeginWithRedundantWord'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('195-4.html', 'aLinkTextDoesNotBeginWithRedundantWord'); + $this->assertTrue(count($results) == 0); + } + + //196 + function test196_imgServerSideMapNotUsed() { + $results = $this->getTest('196-1.html', 'imgServerSideMapNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'img'); + + $results = $this->getTest('196-2.html', 'imgServerSideMapNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'img'); + } + + //Skipped 197 + //198 + function test198_legendDescribesListOfChoices() { + $results = $this->getTest('198-1.html', 'legendDescribesListOfChoices'); + $this->assertTrue($results[0]->element->tagName == 'legend'); + + $results = $this->getTest('198-2.html', 'legendDescribesListOfChoices'); + $this->assertTrue($results[0]->element->tagName == 'legend'); + } + + //199 + function test199_legendTextNotEmpty() { + $results = $this->getTest('199-1.html', 'legendTextNotEmpty'); + $this->assertTrue($results[0]->element->tagName == 'legend'); + + $results = $this->getTest('199-2.html', 'legendTextNotEmpty'); + $this->assertTrue(count($results) == 0); + } + + //200 + function test200_legendTextNotPlaceholder() { + $results = $this->getTest('200-1.html', 'legendTextNotPlaceholder'); + $this->assertTrue($results[0]->element->tagName == 'legend'); + + $results = $this->getTest('200-2.html', 'legendTextNotPlaceholder'); + $this->assertTrue(count($results) == 0); + } + + //201 + function test201_frameTitlesNotEmpty() { + $results = $this->getTest('201-1.html', 'frameTitlesNotEmpty'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('201-2.html', 'frameTitlesNotEmpty'); + $this->assertTrue(count($results) == 0); + } + + //202 + function test202_frameTitlesNotPlaceholder() { + $results = $this->getTest('202-1.html', 'frameTitlesNotPlaceholder'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('202-2.html', 'frameTitlesNotPlaceholder'); + $this->assertTrue(count($results) == 0); + } + + //203 + function test203_tableSummaryDescribesTable() { + $results = $this->getTest('203-1.html', 'tableSummaryDescribesTable'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('203-2.html', 'tableSummaryDescribesTable'); + $this->assertTrue($results[0]->element->tagName == 'table'); + } + + //204-220 skipped - already covered in previous tests + //221 + function test221_bodyColorContrast() { + $results = $this->getTest('221-1.html', 'bodyColorContrast'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('221-2.html', 'bodyColorContrast'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('221-3.html', 'bodyColorContrast'); + $this->assertTrue(count($results) == 0); + } + + //222 + function test222_bodyLinkColorContrast() { + $results = $this->getTest('222-1.html', 'bodyLinkColorContrast'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('222-2.html', 'bodyLinkColorContrast'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('222-3.html', 'bodyLinkColorContrast'); + $this->assertTrue(count($results) == 0); + } + + //223 + function test223_bodyActiveLinkColorContrast() { + $results = $this->getTest('223-1.html', 'bodyActiveLinkColorContrast'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('223-2.html', 'bodyActiveLinkColorContrast'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('223-3.html', 'bodyActiveLinkColorContrast'); + $this->assertTrue(count($results) == 0); + } + + //224 + function test224_bodyVisitedLinkColorContrast() { + $results = $this->getTest('224-1.html', 'bodyVisitedLinkColorContrast'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('224-2.html', 'bodyVisitedLinkColorContrast'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('224-3.html', 'bodyVisitedLinkColorContrast'); + $this->assertTrue(count($results) == 0); + } + + //225 + function test225_documentStrictDocType() { + + $results = $this->getTest('225-1.html', 'documentStrictDocType'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('225-2.html', 'documentStrictDocType'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('225-3.html', 'documentStrictDocType'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('225-4.html', 'documentStrictDocType'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('225-5.html', 'documentStrictDocType'); + $this->assertTrue($results[0]->pass === false); + } + + //226 + function test226_documentColorWaiAlgorithim() { + + $results = $this->getTest('226-1.html', 'documentColorWaiAlgorithim'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('226-2.html', 'documentColorWaiAlgorithim'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('226-3.html', 'documentColorWaiAlgorithim'); + $this->assertTrue(count($results) == 0); + } + + //227 + function test227_documentColorWaiLinkAlgorithim() { + + $results = $this->getTest('227-1.html', 'documentColorWaiLinkAlgorithim'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('227-2.html', 'documentColorWaiLinkAlgorithim'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('227-3.html', 'documentColorWaiLinkAlgorithim'); + $this->assertTrue(count($results) == 0); + } + + //228 + function test228_documentColorWaiActiveLinkAlgorithim() { + + $results = $this->getTest('228-1.html', 'documentColorWaiActiveLinkAlgorithim'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('228-2.html', 'documentColorWaiActiveLinkAlgorithim'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('228-3.html', 'documentColorWaiActiveLinkAlgorithim'); + $this->assertTrue(count($results) == 0); + } + + //229 + function test229_documentColorWaiVisitedLinkAlgorithim() { + + $results = $this->getTest('229-1.html', 'documentColorWaiVisitedLinkAlgorithim'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('229-2.html', 'documentColorWaiVisitedLinkAlgorithim'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('229-3.html', 'documentColorWaiVisitedLinkAlgorithim'); + $this->assertTrue(count($results) == 0); + } + + //230 + function test230_tableIsGrouped() { + + $results = $this->getTest('230-1.html', 'tableIsGrouped'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('230-2.html', 'tableIsGrouped'); + $this->assertTrue(count($results) == 0); + } + + //231 + function test231_tableUseColGroup() { + + $results = $this->getTest('231-1.html', 'tableUseColGroup'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('231-2.html', 'tableUseColGroup'); + $this->assertTrue(count($results) == 0); + } + + //232 + function test232_documentValidatesToDocType() { + + $results = $this->getTest('232-1.html', 'documentValidatesToDocType'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('232-2.html', 'documentValidatesToDocType'); + $this->assertTrue($results[0]->pass === false); + } + + //233 + function test233_framesetIsNotUsed() { + + $results = $this->getTest('233-1.html', 'framesetIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'frameset'); + + $results = $this->getTest('232-2.html', 'framesetIsNotUsed'); + $this->assertTrue(count($results) == 0); + } + + //234 + function test234_frameIsNotUsed() { + + $results = $this->getTest('234-1.html', 'frameIsNotUsed'); + $this->assertTrue($results[0]->element->tagName == 'frame'); + + $results = $this->getTest('234-2.html', 'frameIsNotUsed'); + $this->assertTrue(count($results) == 0); + } + + //235 + function test235_documentReadingDirection() { + + $results = $this->getTest('235-1.html', 'documentReadingDirection'); + $this->assertTrue($results[0]->element->tagName == 'blockquote'); + + $results = $this->getTest('235-2.html', 'documentReadingDirection'); + $this->assertTrue(count($results) == 0); + } + + //236 + function test236_aAdjacentDontPointToSameResource() { + + $results = $this->getTest('236-1.html', 'aAdjacentWithSameResourceShouldBeCombined'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('236-2.html', 'aAdjacentWithSameResourceShouldBeCombined'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('236-1.html', 'aAdjacentWithSameResourceShouldBeCombined'); + $this->assertTrue($results[0]->element->tagName == 'a'); + } + + //skipped 237 + + //238 + function test238_inputElementsDontHaveAlt() { + + $results = $this->getTest('238-1.html', 'inputElementsDontHaveAlt'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('238-2.html', 'inputElementsDontHaveAlt'); + $this->assertTrue(count($results) == 0); + } + + //skipped 239 & 240 + + + //241 + function test241_tabularDataIsInTable() { + + $results = $this->getTest('241-1.html', 'tabularDataIsInTable'); + $this->assertTrue($results[0]->element->tagName == 'pre'); + + $results = $this->getTest('241-2.html', 'tabularDataIsInTable'); + $this->assertTrue(count($results) == 0); + } + + //242 + function test242_tableCaptionIdentifiesTable() { + + $results = $this->getTest('242-1.html', 'tableCaptionIdentifiesTable'); + $this->assertTrue($results[0]->element->tagName == 'caption'); + + $results = $this->getTest('242-2.html', 'tableCaptionIdentifiesTable'); + $this->assertTrue($results[0]->element->tagName == 'caption'); + } + + //243 + function test243_tableSummaryDoesNotDuplicateCaption() { + + $results = $this->getTest('243-1.html', 'tableSummaryDoesNotDuplicateCaption'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('243-2.html', 'tableSummaryDoesNotDuplicateCaption'); + $this->assertTrue(count($results) == 0); + } + + //244 + function test244_tableWithBothHeadersUseScope() { + + $results = $this->getTest('244-1.html', 'tableWithBothHeadersUseScope'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('244-2.html', 'tableWithBothHeadersUseScope'); + $this->assertTrue(count($results) == 0); + } + + //245 + function test245_tableWithMoreHeadersUseID() { + + $results = $this->getTest('245-1.html', 'tableWithMoreHeadersUseID'); + $this->assertTrue($results[0]->element->tagName == 'table'); + + $results = $this->getTest('245-2.html', 'tableWithMoreHeadersUseID'); + $this->assertTrue(count($results) == 0); + } + + //246 + function test246_formWithRequiredLabel() { + + $results = $this->getTest('246-1.html', 'formWithRequiredLabel'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('246-2.html', 'formWithRequiredLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('246-3.html', 'formWithRequiredLabel'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('246-4.html', 'formWithRequiredLabel'); + $this->assertTrue($results[0]->element->tagName == 'form'); + + $results = $this->getTest('246-5.html', 'formWithRequiredLabel'); + $this->assertTrue($results[0]->element->tagName == 'form'); + } + + //247 + function test247_inputCheckboxRequiresFieldset() { + + $results = $this->getTest('247-1.html', 'inputCheckboxRequiresFieldset'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('247-2.html', 'inputCheckboxRequiresFieldset'); + $this->assertTrue(count($results) == 0); + } + + //248 + function test248_documentVisualListsAreMarkedUp() { + + $results = $this->getTest('248-1.html', 'documentVisualListsAreMarkedUp'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('248-2.html', 'documentVisualListsAreMarkedUp'); + $this->assertTrue(count($results) == 0); + } + + //skipped 249 - 250 - 251 + + //252 + function test252_documentAllColorsAreSet() { + + $results = $this->getTest('252-1.html', 'documentAllColorsAreSet'); + $this->assertTrue($results[0]->pass === false); + + $results = $this->getTest('252-2.html', 'documentAllColorsAreSet'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('252-3.html', 'documentAllColorsAreSet'); + $this->assertTrue(count($results) == 0); + } + + //258 + function test258_appletProvidesMechanismToReturnToParent() { + + $results = $this->getTest('258-1.html', 'appletProvidesMechanismToReturnToParent'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + + $results = $this->getTest('258-2.html', 'appletProvidesMechanismToReturnToParent'); + $this->assertTrue($results[0]->element->tagName == 'applet'); + } + + //259 + function test259_objectProvidesMechanismToReturnToParent() { + + $results = $this->getTest('259-1.html', 'objectProvidesMechanismToReturnToParent'); + $this->assertTrue($results[0]->element->tagName == 'object'); + + $results = $this->getTest('259-2.html', 'objectProvidesMechanismToReturnToParent'); + $this->assertTrue($results[0]->element->tagName == 'object'); + } + + //260 + function test260_embedProvidesMechanismToReturnToParent() { + + $results = $this->getTest('260-1.html', 'embedProvidesMechanismToReturnToParent'); + $this->assertTrue($results[0]->element->tagName == 'embed'); + + $results = $this->getTest('260-2.html', 'embedProvidesMechanismToReturnToParent'); + $this->assertTrue($results[0]->element->tagName == 'embed'); + } + + + + //261 + function test261_headersUseToMarkSections() { + + $results = $this->getTest('261-1.html', 'headersUseToMarkSections'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('261-2.html', 'headersUseToMarkSections'); + $this->assertTrue(count($results) == 0 ); + + $results = $this->getTest('261-3.html', 'headersUseToMarkSections'); + $this->assertTrue(count($results) == 0 ); + } + //skipped 262-263 + + //264 + function test264_inputSubmitHasTabIndex() { + + $results = $this->getTest('264-1.html', 'inputSubmitHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('264-2.html', 'inputSubmitHasTabIndex'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('264-3.html', 'inputSubmitHasTabIndex'); + $this->assertTrue(count($results) == 0 ); + } + + //265 + function test264_tabIndexFollowsLogicalOrder() { + + $results = $this->getTest('265-1.html', 'tabIndexFollowsLogicalOrder'); + $this->assertTrue($results[0]->element->tagName == 'input'); + + $results = $this->getTest('265-2.html', 'tabIndexFollowsLogicalOrder'); + $this->assertTrue(count($results) == 0 ); + } + + //267 + + //268 + function test268_formHasGoodErrorMessage() { + + $results = $this->getTest('268-1.html', 'formHasGoodErrorMessage'); + $this->assertTrue($results[0]->element->tagName == 'form'); + + $results = $this->getTest('268-2.html', 'formHasGoodErrorMessage'); + $this->assertTrue($results[0]->element->tagName == 'form'); + } + + //269 + function test269_formErrorMessageHelpsUser() { + + $results = $this->getTest('269-1.html', 'formErrorMessageHelpsUser'); + $this->assertTrue($results[0]->element->tagName == 'form'); + + $results = $this->getTest('269-2.html', 'formErrorMessageHelpsUser'); + $this->assertTrue($results[0]->element->tagName == 'form'); + } + + //270 + function test270_formAllowsCheckIfIrreversable() { + + $results = $this->getTest('269-1.html', 'formAllowsCheckIfIrreversable'); + $this->assertTrue($results[0]->element->tagName == 'form'); + + $results = $this->getTest('269-2.html', 'formAllowsCheckIfIrreversable'); + $this->assertTrue($results[0]->element->tagName == 'form'); + } + + //skipped 271 + + //271 + function test271_documentReadingDirection() { + + $results = $this->getTest('271-1.html', 'documentReadingDirection'); + $this->assertTrue($results[0]->element->tagName == 'span'); + + $results = $this->getTest('271-2.html', 'documentReadingDirection'); + $this->assertTrue(count($results) == 0); + } + + //272 + function test272_formDeleteIsReversable() { + + $results = $this->getTest('272-1.html', 'formDeleteIsReversable'); + $this->assertTrue($results[0]->element->tagName == 'form'); + + $results = $this->getTest('272-2.html', 'formDeleteIsReversable'); + $this->assertTrue($results[0]->element->tagName == 'form'); + } + + //273 - 276 skipped +} + +$tests = &new TestOfTests(); +$tests->run(new HtmlReporter()); + + diff --git a/tests/quailTests.php b/tests/quailTests.php new file mode 100644 index 0000000..910bff4 --- /dev/null +++ b/tests/quailTests.php @@ -0,0 +1,134 @@ +runCheck(); + + return $quail->getTest($test); + } + + function test_svgContainsTitle() { + $results = $this->getTest('svgContainsTitle-fail.html', 'svgContainsTitle'); + $this->assertTrue($results[0]->element->tagName == 'svg'); + $results = $this->getTest('svgContainsTitle-pass.html', 'svgContainsTitle'); + $this->assertTrue(count($results) == 0); + } + function test_cssTextHasContrast() { + $results = $this->getTest('cssContrast.html', 'cssTextHasContrast'); + $this->assertTrue($results[0]->element->tagName == 'p'); + } + + function test_complexCssTextHasContrast() { + $results = $this->getTest('cssContrast2.html', 'cssTextHasContrast'); + $this->assertTrue($results[0]->element->tagName == 'p'); + } + + function test_cssTextContrastWithColorConversion() { + $results = $this->getTest('cssContrast3.html', 'cssTextHasContrast'); + $this->assertTrue($results[0]->element->tagName == 'div'); + + } + + function test_cssTextContrastWithComplexBackground() { + $results = $this->getTest('cssContrast4.html', 'cssTextHasContrast'); + $this->assertTrue($results[0]->element->tagName == 'pre'); + + } + function test_cssTextContrastWithInlineAndIncludedFiles() { + $results = $this->getTest('cssContrast5.html', 'cssTextHasContrast'); + $this->assertTrue($results[0]->element->tagName == 'pre'); + + } + function test_videoProvidesCaptions() { + $results = $this->getTest('videoTestFail.html', 'videoProvidesCaptions'); + $this->assertTrue($results[0]->element->tagName == 'video'); + + } + + function test_videosEmbeddedOrLinkedNeedCaptions() { + $results = $this->getTest('videosEmbeddedOrLinkedNeedCaptions-fail.html', + 'videosEmbeddedOrLinkedNeedCaptions'); + $this->assertTrue($results[0]->element->tagName == 'a'); + + $results = $this->getTest('videosEmbeddedOrLinkedNeedCaptions-pass.html', + 'videosEmbeddedOrLinkedNeedCaptions'); + $this->assertTrue(count($results) == 0); + + } + + function test_documentIsWrittenClearly() { + $results = $this->getTest('documentIsWrittenClearly-fail.html', 'documentIsWrittenClearly'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('documentIsWrittenClearly-pass.html', 'documentIsWrittenClearly'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('documentIsWrittenClearly-pass-2.html', 'documentIsWrittenClearly'); + $this->assertTrue(count($results) == 0); + + } + + function test_headersHaveText() { + $results = $this->getTest('headersHaveText-fail.html', 'headersHaveText'); + $this->assertTrue($results[0]->element->tagName == 'h2'); + + $results = $this->getTest('headersHaveText-fail2.html', 'headersHaveText'); + $this->assertTrue($results[0]->element->tagName == 'h2'); + + $results = $this->getTest('headersHaveText-pass.html', 'headersHaveText'); + $this->assertTrue(count($results) == 0); + + } + + function test_labelsAreAssignedToAnInput() { + $results = $this->getTest('labelsAreAssignedToAnInput-fail.html', 'labelsAreAssignedToAnInput'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('labelsAreAssignedToAnInput-fail2.html', 'labelsAreAssignedToAnInput'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('labelsAreAssignedToAnInput-fail3.html', 'labelsAreAssignedToAnInput'); + $this->assertTrue($results[0]->element->tagName == 'label'); + + $results = $this->getTest('labelsAreAssignedToAnInput-pass.html', 'labelsAreAssignedToAnInput'); + $this->assertTrue(count($results) == 0); + + } + + function test_imgAltTextNotRedundant() { + $results = $this->getTest('imgAltTextNotRedundant-fail.html', 'imgAltTextNotRedundant'); + $this->assertTrue($results[0]->element->tagName == 'img'); + + $results = $this->getTest('imgAltTextNotRedundant-pass.html', 'imgAltTextNotRedundant'); + $this->assertTrue(count($results) == 0); + + } + + function test_selectJumpMenus() { + $results = $this->getTest('selectJumpMenus-fail.html', 'selectJumpMenus'); + $this->assertTrue($results[0]->element->tagName == 'select'); + + $results = $this->getTest('selectJumpMenus-pass.html', 'selectJumpMenus'); + $this->assertTrue(count($results) == 0); + + } + + function test_textIsNotSmall() { + $results = $this->getTest('textIsNotSmall-fail.html', 'textIsNotSmall'); + $this->assertTrue($results[0]->element->tagName == 'p'); + + $results = $this->getTest('textIsNotSmall-pass.html', 'textIsNotSmall'); + $this->assertTrue(count($results) == 0); + + $results = $this->getTest('textIsNotSmall-fail2.html', 'textIsNotSmall'); + $this->assertTrue($results[0]->element->tagName == 'p'); + } +} + +$tests = &new TestOfQuailTests(); +$tests->run(new HtmlReporter()); \ No newline at end of file diff --git a/tests/testfiles/.svn/all-wcprops b/tests/testfiles/.svn/all-wcprops new file mode 100644 index 0000000..6e63d4b --- /dev/null +++ b/tests/testfiles/.svn/all-wcprops @@ -0,0 +1,5 @@ +K 25 +svn:wc:ra_dav:version-url +V 44 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles +END diff --git a/tests/testfiles/.svn/entries b/tests/testfiles/.svn/entries new file mode 100644 index 0000000..350fc44 --- /dev/null +++ b/tests/testfiles/.svn/entries @@ -0,0 +1,37 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/tests/testfiles +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-09-04T21:59:16.426567Z +230 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +oac +dir + +css +dir + +quail +dir + diff --git a/tests/testfiles/css/.svn/all-wcprops b/tests/testfiles/css/.svn/all-wcprops new file mode 100644 index 0000000..a915eb1 --- /dev/null +++ b/tests/testfiles/css/.svn/all-wcprops @@ -0,0 +1,71 @@ +K 25 +svn:wc:ra_dav:version-url +V 48 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/css +END +cssContrast2.css +K 25 +svn:wc:ra_dav:version-url +V 65 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/css/cssContrast2.css +END +cssContrast3.css +K 25 +svn:wc:ra_dav:version-url +V 65 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/css/cssContrast3.css +END +cssContrast4.css +K 25 +svn:wc:ra_dav:version-url +V 65 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/css/cssContrast4.css +END +cssComplexTest1.html +K 25 +svn:wc:ra_dav:version-url +V 69 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/css/cssComplexTest1.html +END +cssComplexTest1.css +K 25 +svn:wc:ra_dav:version-url +V 68 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/css/cssComplexTest1.css +END +cssContrast.html +K 25 +svn:wc:ra_dav:version-url +V 65 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/css/cssContrast.html +END +cssContrast2.html +K 25 +svn:wc:ra_dav:version-url +V 66 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/css/cssContrast2.html +END +cssContrast3.html +K 25 +svn:wc:ra_dav:version-url +V 66 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/css/cssContrast3.html +END +cssContrast4.html +K 25 +svn:wc:ra_dav:version-url +V 66 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/css/cssContrast4.html +END +cssContrast.css +K 25 +svn:wc:ra_dav:version-url +V 64 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/css/cssContrast.css +END +cssContrast5.html +K 25 +svn:wc:ra_dav:version-url +V 66 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/css/cssContrast5.html +END diff --git a/tests/testfiles/css/.svn/entries b/tests/testfiles/css/.svn/entries new file mode 100644 index 0000000..e65ea99 --- /dev/null +++ b/tests/testfiles/css/.svn/entries @@ -0,0 +1,402 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/tests/testfiles/css +https://keveemiller@quail-lib.googlecode.com/svn + + + +2009-11-11T01:49:44.031402Z +78 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +cssContrast2.css +file + + + + +2010-12-08T21:44:03.000000Z +45523886afdf6d80793f5441159f3831 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +147 + +cssContrast3.css +file + + + + +2010-12-08T21:44:03.000000Z +86bac4bb51f57fbd1f9f11f21289e417 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +153 + +cssContrast4.css +file + + + + +2010-12-08T21:44:03.000000Z +f6741d1d70ad090c5267c3c2f58caad8 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +181 + +cssComplexTest1.html +file + + + + +2010-12-08T21:44:03.000000Z +4ca1c036d1acf67d7db11c67d3a93c44 +2009-11-11T01:49:44.031402Z +78 +keveemiller + + + + + + + + + + + + + + + + + + + + + +488 + +cssComplexTest1.css +file + + + + +2010-12-08T21:44:03.000000Z +eb9363fd77508a13ed6f7d452bfac928 +2009-11-11T01:49:44.031402Z +78 +keveemiller + + + + + + + + + + + + + + + + + + + + + +138 + +cssContrast.html +file + + + + +2010-12-08T21:44:03.000000Z +ba0f006bb8329ad4ea6f6a370a589540 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +314 + +cssContrast2.html +file + + + + +2010-12-08T21:44:03.000000Z +a2b7f567febbb0786054314a71dea2a4 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +415 + +cssContrast3.html +file + + + + +2010-12-08T21:44:03.000000Z +84329e872adb1802e59b1ee4000300b1 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +419 + +cssContrast4.html +file + + + + +2010-12-08T21:44:03.000000Z +ad0758bc0dc3f6e0c9d880a9038520dd +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +394 + +cssContrast.css +file + + + + +2010-12-08T21:44:03.000000Z +43a3ca84ac033c98bcf20102e9f8209b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +58 + +cssContrast5.html +file + + + + +2010-12-08T21:44:03.000000Z +89ebeafb6aa97658a05096d325244494 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +429 + diff --git a/tests/testfiles/css/.svn/text-base/cssComplexTest1.css.svn-base b/tests/testfiles/css/.svn/text-base/cssComplexTest1.css.svn-base new file mode 100644 index 0000000..0f8fd86 --- /dev/null +++ b/tests/testfiles/css/.svn/text-base/cssComplexTest1.css.svn-base @@ -0,0 +1,13 @@ +div { + background-color: red; +} + +.testdiv { + color: yellow; + background-color: blue; +} + +body { + color: black; + background-color: green; +} diff --git a/tests/testfiles/css/.svn/text-base/cssComplexTest1.html.svn-base b/tests/testfiles/css/.svn/text-base/cssComplexTest1.html.svn-base new file mode 100644 index 0000000..946f742 --- /dev/null +++ b/tests/testfiles/css/.svn/text-base/cssComplexTest1.html.svn-base @@ -0,0 +1,20 @@ + + + CSS Complex Test 1 + + + +

This is a header

+
+
+

This is nested

+
+
+
    +
  • THis is a list
  • +
  • This is also a list
  • +
+
+
+ + diff --git a/tests/testfiles/css/.svn/text-base/cssContrast.css.svn-base b/tests/testfiles/css/.svn/text-base/cssContrast.css.svn-base new file mode 100644 index 0000000..b6d30b7 --- /dev/null +++ b/tests/testfiles/css/.svn/text-base/cssContrast.css.svn-base @@ -0,0 +1,7 @@ +body { + background: #000000; +} + +p { + color: #333333; +} \ No newline at end of file diff --git a/tests/testfiles/css/.svn/text-base/cssContrast.html.svn-base b/tests/testfiles/css/.svn/text-base/cssContrast.html.svn-base new file mode 100644 index 0000000..322a490 --- /dev/null +++ b/tests/testfiles/css/.svn/text-base/cssContrast.html.svn-base @@ -0,0 +1,12 @@ + + + +OAC Testfile - Check #6 - Positive + + + + +

This is not contrasty enough.

+ + + diff --git a/tests/testfiles/css/.svn/text-base/cssContrast2.css.svn-base b/tests/testfiles/css/.svn/text-base/cssContrast2.css.svn-base new file mode 100644 index 0000000..412923f --- /dev/null +++ b/tests/testfiles/css/.svn/text-base/cssContrast2.css.svn-base @@ -0,0 +1,15 @@ +body { + background: #ff0b00; +} + +div#test { + background: #212121; +} + +div#test .lowcontrast { + color: #6a6a6a; +} + +.highcontrast { + color: #000000; +} diff --git a/tests/testfiles/css/.svn/text-base/cssContrast2.html.svn-base b/tests/testfiles/css/.svn/text-base/cssContrast2.html.svn-base new file mode 100644 index 0000000..38b6496 --- /dev/null +++ b/tests/testfiles/css/.svn/text-base/cssContrast2.html.svn-base @@ -0,0 +1,16 @@ + + + +OAC Testfile - Check #6 - Positive + + + + +
+

This is not contrasty enough.

+

This is pretty contrasty.

+
+ + + + diff --git a/tests/testfiles/css/.svn/text-base/cssContrast3.css.svn-base b/tests/testfiles/css/.svn/text-base/cssContrast3.css.svn-base new file mode 100644 index 0000000..0ca2b1f --- /dev/null +++ b/tests/testfiles/css/.svn/text-base/cssContrast3.css.svn-base @@ -0,0 +1,15 @@ +body { + background: #ff0b00; +} + +div#test { + background: #212121; +} + +div#test .lowcontrast { + color: rgb(14, 14, 14); +} + +.highcontrast { + color: white; +} diff --git a/tests/testfiles/css/.svn/text-base/cssContrast3.html.svn-base b/tests/testfiles/css/.svn/text-base/cssContrast3.html.svn-base new file mode 100644 index 0000000..415743d --- /dev/null +++ b/tests/testfiles/css/.svn/text-base/cssContrast3.html.svn-base @@ -0,0 +1,16 @@ + + + +OAC Testfile - Check #6 - Positive + + + + +
+
This is not contrasty enough.
+

This is pretty contrasty.

+
+ + + + diff --git a/tests/testfiles/css/.svn/text-base/cssContrast4.css.svn-base b/tests/testfiles/css/.svn/text-base/cssContrast4.css.svn-base new file mode 100644 index 0000000..0c10ba0 --- /dev/null +++ b/tests/testfiles/css/.svn/text-base/cssContrast4.css.svn-base @@ -0,0 +1,15 @@ +body { + background: #ff0b00; +} + +div#test { + background: top left no-repeat url(nothing.png) #212121; +} + +div#test .low { + color: rgb(14, 14, 14); +} + +.highcontrast { + color: white; +} diff --git a/tests/testfiles/css/.svn/text-base/cssContrast4.html.svn-base b/tests/testfiles/css/.svn/text-base/cssContrast4.html.svn-base new file mode 100644 index 0000000..1dac70a --- /dev/null +++ b/tests/testfiles/css/.svn/text-base/cssContrast4.html.svn-base @@ -0,0 +1,16 @@ + + + +CSS Complex Background + + + + +
+
This is pretty contrasty enough.
+
This aint so contrasty.

+
+ + + + diff --git a/tests/testfiles/css/.svn/text-base/cssContrast5.html.svn-base b/tests/testfiles/css/.svn/text-base/cssContrast5.html.svn-base new file mode 100644 index 0000000..3b1e5c4 --- /dev/null +++ b/tests/testfiles/css/.svn/text-base/cssContrast5.html.svn-base @@ -0,0 +1,23 @@ + + + +CSS Complex Background + + + + +
+
This is pretty contrasty enough.
+
This aint so contrasty.

+
+ + + + diff --git a/tests/testfiles/css/cssComplexTest1.css b/tests/testfiles/css/cssComplexTest1.css new file mode 100644 index 0000000..0f8fd86 --- /dev/null +++ b/tests/testfiles/css/cssComplexTest1.css @@ -0,0 +1,13 @@ +div { + background-color: red; +} + +.testdiv { + color: yellow; + background-color: blue; +} + +body { + color: black; + background-color: green; +} diff --git a/tests/testfiles/css/cssComplexTest1.html b/tests/testfiles/css/cssComplexTest1.html new file mode 100644 index 0000000..946f742 --- /dev/null +++ b/tests/testfiles/css/cssComplexTest1.html @@ -0,0 +1,20 @@ + + + CSS Complex Test 1 + + + +

This is a header

+
+
+

This is nested

+
+
+
    +
  • THis is a list
  • +
  • This is also a list
  • +
+
+
+ + diff --git a/tests/testfiles/css/cssContrast.css b/tests/testfiles/css/cssContrast.css new file mode 100644 index 0000000..b6d30b7 --- /dev/null +++ b/tests/testfiles/css/cssContrast.css @@ -0,0 +1,7 @@ +body { + background: #000000; +} + +p { + color: #333333; +} \ No newline at end of file diff --git a/tests/testfiles/css/cssContrast.html b/tests/testfiles/css/cssContrast.html new file mode 100644 index 0000000..322a490 --- /dev/null +++ b/tests/testfiles/css/cssContrast.html @@ -0,0 +1,12 @@ + + + +OAC Testfile - Check #6 - Positive + + + + +

This is not contrasty enough.

+ + + diff --git a/tests/testfiles/css/cssContrast2.css b/tests/testfiles/css/cssContrast2.css new file mode 100644 index 0000000..412923f --- /dev/null +++ b/tests/testfiles/css/cssContrast2.css @@ -0,0 +1,15 @@ +body { + background: #ff0b00; +} + +div#test { + background: #212121; +} + +div#test .lowcontrast { + color: #6a6a6a; +} + +.highcontrast { + color: #000000; +} diff --git a/tests/testfiles/css/cssContrast2.html b/tests/testfiles/css/cssContrast2.html new file mode 100644 index 0000000..38b6496 --- /dev/null +++ b/tests/testfiles/css/cssContrast2.html @@ -0,0 +1,16 @@ + + + +OAC Testfile - Check #6 - Positive + + + + +
+

This is not contrasty enough.

+

This is pretty contrasty.

+
+ + + + diff --git a/tests/testfiles/css/cssContrast3.css b/tests/testfiles/css/cssContrast3.css new file mode 100644 index 0000000..0ca2b1f --- /dev/null +++ b/tests/testfiles/css/cssContrast3.css @@ -0,0 +1,15 @@ +body { + background: #ff0b00; +} + +div#test { + background: #212121; +} + +div#test .lowcontrast { + color: rgb(14, 14, 14); +} + +.highcontrast { + color: white; +} diff --git a/tests/testfiles/css/cssContrast3.html b/tests/testfiles/css/cssContrast3.html new file mode 100644 index 0000000..415743d --- /dev/null +++ b/tests/testfiles/css/cssContrast3.html @@ -0,0 +1,16 @@ + + + +OAC Testfile - Check #6 - Positive + + + + +
+
This is not contrasty enough.
+

This is pretty contrasty.

+
+ + + + diff --git a/tests/testfiles/css/cssContrast4.css b/tests/testfiles/css/cssContrast4.css new file mode 100644 index 0000000..0c10ba0 --- /dev/null +++ b/tests/testfiles/css/cssContrast4.css @@ -0,0 +1,15 @@ +body { + background: #ff0b00; +} + +div#test { + background: top left no-repeat url(nothing.png) #212121; +} + +div#test .low { + color: rgb(14, 14, 14); +} + +.highcontrast { + color: white; +} diff --git a/tests/testfiles/css/cssContrast4.html b/tests/testfiles/css/cssContrast4.html new file mode 100644 index 0000000..1dac70a --- /dev/null +++ b/tests/testfiles/css/cssContrast4.html @@ -0,0 +1,16 @@ + + + +CSS Complex Background + + + + +
+
This is pretty contrasty enough.
+
This aint so contrasty.

+
+ + + + diff --git a/tests/testfiles/css/cssContrast5.html b/tests/testfiles/css/cssContrast5.html new file mode 100644 index 0000000..3b1e5c4 --- /dev/null +++ b/tests/testfiles/css/cssContrast5.html @@ -0,0 +1,23 @@ + + + +CSS Complex Background + + + + +
+
This is pretty contrasty enough.
+
This aint so contrasty.

+
+ + + + diff --git a/tests/testfiles/oac/.svn/all-wcprops b/tests/testfiles/oac/.svn/all-wcprops new file mode 100644 index 0000000..d10b6cc --- /dev/null +++ b/tests/testfiles/oac/.svn/all-wcprops @@ -0,0 +1,4529 @@ +K 25 +svn:wc:ra_dav:version-url +V 48 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac +END +188-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/188-1.html +END +269-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/269-1.html +END +42-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/42-2.html +END +25-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/25-1.html +END +82-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/82-2.html +END +65-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/65-1.html +END +66-6.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/66-6.html +END +3-1.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/3-1.html +END +220-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/220-1.html +END +111-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/111-3.html +END +260-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/260-1.html +END +117-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/117-1.html +END +151-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/151-3.html +END +134-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/134-2.html +END +221-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/221-6.html +END +204-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/204-5.html +END +238-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/238-1.html +END +255-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/255-2.html +END +174-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/174-2.html +END +197-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/197-1.html +END +11-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/11-2.html +END +34-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/34-1.html +END +51-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/51-2.html +END +74-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/74-1.html +END +91-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/91-2.html +END +29-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/29-2.html +END +69-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/69-2.html +END +alternative2.html +K 25 +svn:wc:ra_dav:version-url +V 66 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/alternative2.html +END +103-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/103-2.html +END +120-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/120-3.html +END +7-2.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/7-2.html +END +207-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/207-1.html +END +143-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/143-2.html +END +126-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/126-1.html +END +224-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/224-2.html +END +213-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/213-5.html +END +264-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/264-2.html +END +183-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/183-2.html +END +247-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/247-1.html +END +166-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/166-1.html +END +138-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/138-3.html +END +219-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/219-3.html +END +208-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/208-6.html +END +178-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/178-3.html +END +195-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/195-4.html +END +20-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/20-2.html +END +60-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/60-2.html +END +43-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/43-1.html +END +38-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/38-2.html +END +33-9.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/33-9.html +END +78-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/78-2.html +END +95-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/95-3.html +END +112-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/112-2.html +END +17-11.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/17-11.html +END +233-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/233-2.html +END +135-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/135-1.html +END +216-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/216-1.html +END +152-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/152-2.html +END +205-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/205-4.html +END +66-10.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/66-10.html +END +273-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/273-2.html +END +256-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/256-1.html +END +175-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/175-1.html +END +192-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/192-2.html +END +147-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/147-3.html +END +228-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/228-3.html +END +217-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/217-6.html +END +contrast1.gif +K 25 +svn:wc:ra_dav:version-url +V 62 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/contrast1.gif +END +12-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/12-1.html +END +274-7.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/274-7.html +END +52-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/52-1.html +END +92-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/92-1.html +END +47-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/47-2.html +END +87-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/87-2.html +END +82-9.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/82-9.html +END +104-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/104-1.html +END +121-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/121-2.html +END +202-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/202-2.html +END +8-1.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/8-1.html +END +144-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/144-1.html +END +225-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/225-1.html +END +242-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/242-2.html +END +161-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/161-2.html +END +214-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/214-4.html +END +265-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/265-1.html +END +star.gif +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/star.gif +END +184-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/184-1.html +END +139-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/139-2.html +END +145-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/145-6.html +END +21-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/21-1.html +END +61-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/61-1.html +END +16-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/16-2.html +END +33-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/33-3.html +END +56-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/56-2.html +END +39-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/39-1.html +END +17-7.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/17-7.html +END +96-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/96-2.html +END +79-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/79-1.html +END +68-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/68-4.html +END +113-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/113-1.html +END +211-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/211-2.html +END +153-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/153-1.html +END +6-4.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/6-4.html +END +234-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/234-1.html +END +251-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/251-2.html +END +206-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/206-3.html +END +108-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/108-2.html +END +274-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/274-1.html +END +193-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/193-1.html +END +148-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/148-2.html +END +229-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/229-2.html +END +246-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/246-3.html +END +218-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/218-5.html +END +spacer.gif +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/spacer.gif +END +188-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/188-2.html +END +269-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/269-2.html +END +30-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/30-1.html +END +avlab.mp3 +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/avlab.mp3 +END +70-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/70-1.html +END +25-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/25-2.html +END +65-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/65-2.html +END +82-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/82-3.html +END +48-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/48-1.html +END +88-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/88-1.html +END +finddogs.gif +K 25 +svn:wc:ra_dav:version-url +V 61 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/finddogs.gif +END +66-7.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/66-7.html +END +3-2.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/3-2.html +END +220-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/220-2.html +END +122-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/122-1.html +END +203-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/203-1.html +END +243-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/243-1.html +END +162-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/162-1.html +END +260-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/260-2.html +END +117-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/117-2.html +END +204-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/204-6.html +END +255-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/255-3.html +END +174-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/174-3.html +END +238-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/238-2.html +END +197-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/197-2.html +END +51-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/51-3.html +END +34-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/34-2.html +END +17-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/17-1.html +END +74-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/74-2.html +END +91-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/91-3.html +END +57-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/57-1.html +END +97-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/97-1.html +END +212-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/212-1.html +END +131-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/131-1.html +END +120-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/120-4.html +END +252-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/252-1.html +END +126-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/126-2.html +END +207-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/207-2.html +END +109-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/109-1.html +END +224-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/224-3.html +END +213-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/213-6.html +END +264-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/264-3.html +END +166-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/166-2.html +END +247-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/247-2.html +END +219-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/219-4.html +END +208-7.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/208-7.html +END +189-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/189-1.html +END +contrast2.gif +K 25 +svn:wc:ra_dav:version-url +V 62 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/contrast2.gif +END +eatatjoes.gif +K 25 +svn:wc:ra_dav:version-url +V 62 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/eatatjoes.gif +END +20-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/20-3.html +END +26-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/26-1.html +END +43-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/43-2.html +END +66-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/66-1.html +END +100-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/100-1.html +END +95-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/95-4.html +END +4-1.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/4-1.html +END +221-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/221-1.html +END +140-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/140-1.html +END +261-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/261-1.html +END +180-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/180-1.html +END +118-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/118-1.html +END +135-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/135-2.html +END +17-12.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/17-12.html +END +152-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/152-3.html +END +216-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/216-2.html +END +205-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/205-5.html +END +66-11.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/66-11.html +END +175-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/175-2.html +END +239-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/239-1.html +END +256-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/256-2.html +END +273-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/273-3.html +END +147-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/147-4.html +END +198-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/198-1.html +END +12-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/12-2.html +END +52-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/52-2.html +END +35-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/35-1.html +END +75-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/75-1.html +END +92-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/92-2.html +END +230-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/230-1.html +END +104-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/104-2.html +END +121-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/121-3.html +END +270-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/270-1.html +END +8-2.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/8-2.html +END +208-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/208-1.html +END +144-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/144-2.html +END +127-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/127-1.html +END +225-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/225-2.html +END +214-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/214-5.html +END +rex.jpg +K 25 +svn:wc:ra_dav:version-url +V 56 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/rex.jpg +END +184-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/184-2.html +END +167-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/167-1.html +END +248-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/248-1.html +END +265-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/265-2.html +END +139-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/139-3.html +END +21-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/21-2.html +END +44-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/44-1.html +END +61-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/61-2.html +END +33-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/33-4.html +END +16-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/16-3.html +END +56-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/56-3.html +END +39-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/39-2.html +END +17-8.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/17-8.html +END +79-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/79-2.html +END +113-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/113-2.html +END +153-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/153-2.html +END +6-5.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/6-5.html +END +217-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/217-1.html +END +136-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/136-1.html +END +234-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/234-2.html +END +206-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/206-4.html +END +193-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/193-2.html +END +274-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/274-2.html +END +176-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/176-1.html +END +257-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/257-1.html +END +246-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/246-4.html +END +229-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/229-3.html +END +218-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/218-6.html +END +188-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/188-3.html +END +13-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/13-1.html +END +30-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/30-2.html +END +70-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/70-2.html +END +53-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/53-1.html +END +65-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/65-3.html +END +48-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/48-2.html +END +82-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/82-4.html +END +88-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/88-2.html +END +66-8.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/66-8.html +END +220-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/220-3.html +END +203-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/203-2.html +END +122-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/122-2.html +END +105-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/105-1.html +END +9-1.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/9-1.html +END +226-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/226-1.html +END +162-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/162-2.html +END +145-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/145-1.html +END +243-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/243-2.html +END +fish1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/fish1.html +END +266-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/266-1.html +END +185-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/185-1.html +END +174-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/174-4.html +END +238-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/238-3.html +END +197-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/197-3.html +END +22-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/22-1.html +END +62-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/62-1.html +END +17-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/17-2.html +END +91-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/91-4.html +END +57-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/57-2.html +END +97-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/97-2.html +END +114-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/114-1.html +END +212-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/212-2.html +END +131-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/131-2.html +END +252-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/252-2.html +END +154-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/154-1.html +END +235-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/235-1.html +END +109-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/109-2.html +END +207-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/207-3.html +END +213-7.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/213-7.html +END +275-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/275-1.html +END +194-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/194-1.html +END +219-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/219-5.html +END +208-8.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/208-8.html +END +189-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/189-2.html +END +31-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/31-1.html +END +20-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/20-4.html +END +71-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/71-1.html +END +26-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/26-2.html +END +66-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/66-2.html +END +49-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/49-1.html +END +89-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/89-1.html +END +100-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/100-2.html +END +4-2.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/4-2.html +END +140-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/140-2.html +END +204-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/204-1.html +END +123-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/123-1.html +END +221-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/221-2.html +END +submit.gif +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/submit.gif +END +244-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/244-1.html +END +180-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/180-2.html +END +163-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/163-1.html +END +261-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/261-2.html +END +118-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/118-2.html +END +216-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/216-3.html +END +205-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/205-6.html +END +66-12.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/66-12.html +END +273-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/273-4.html +END +256-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/256-3.html +END +239-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/239-2.html +END +198-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/198-2.html +END +40-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/40-1.html +END +80-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/80-1.html +END +18-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/18-1.html +END +35-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/35-2.html +END +75-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/75-2.html +END +92-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/92-3.html +END +58-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/58-1.html +END +98-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/98-1.html +END +230-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/230-2.html +END +213-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/213-1.html +END +132-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/132-1.html +END +121-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/121-4.html +END +8-3.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/8-3.html +END +253-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/253-1.html +END +270-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/270-2.html +END +208-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/208-2.html +END +127-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/127-2.html +END +225-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/225-3.html +END +214-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/214-6.html +END +248-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/248-2.html +END +167-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/167-2.html +END +27-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/27-1.html +END +44-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/44-2.html +END +33-5.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/33-5.html +END +16-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/16-4.html +END +56-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/56-4.html +END +17-9.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/17-9.html +END +79-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/79-3.html +END +5-1.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/5-1.html +END +222-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/222-1.html +END +141-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/141-1.html +END +181-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/181-1.html +END +262-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/262-1.html +END +217-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/217-2.html +END +119-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/119-1.html +END +136-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/136-2.html +END +6-6.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/6-6.html +END +206-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/206-5.html +END +274-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/274-3.html +END +176-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/176-2.html +END +257-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/257-2.html +END +159-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/159-1.html +END +246-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/246-5.html +END +199-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/199-1.html +END +188-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/188-4.html +END +13-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/13-2.html +END +53-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/53-2.html +END +36-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/36-1.html +END +76-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/76-1.html +END +82-5.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/82-5.html +END +110-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/110-1.html +END +66-9.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/66-9.html +END +231-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/231-1.html +END +33-10.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/33-10.html +END +150-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/150-1.html +END +105-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/105-2.html +END +220-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/220-4.html +END +9-2.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/9-2.html +END +271-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/271-1.html +END +190-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/190-1.html +END +145-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/145-2.html +END +209-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/209-1.html +END +128-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/128-1.html +END +226-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/226-2.html +END +fish2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/fish2.html +END +249-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/249-1.html +END +266-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/266-2.html +END +185-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/185-2.html +END +168-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/168-1.html +END +174-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/174-5.html +END +197-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/197-4.html +END +22-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/22-2.html +END +45-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/45-1.html +END +62-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/62-2.html +END +17-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/17-3.html +END +57-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/57-3.html +END +200-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/200-1.html +END +240-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/240-1.html +END +114-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/114-2.html +END +212-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/212-3.html +END +218-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/218-1.html +END +154-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/154-2.html +END +137-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/137-1.html +END +252-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/252-3.html +END +235-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/235-2.html +END +207-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/207-4.html +END +275-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/275-2.html +END +258-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/258-1.html +END +194-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/194-2.html +END +177-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/177-1.html +END +219-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/219-6.html +END +208-9.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/208-9.html +END +14-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/14-1.html +END +31-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/31-2.html +END +20-5.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/20-5.html +END +71-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/71-2.html +END +54-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/54-1.html +END +94-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/94-1.html +END +49-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/49-2.html +END +66-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/66-3.html +END +89-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/89-2.html +END +135-2.xhtml +K 25 +svn:wc:ra_dav:version-url +V 60 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/135-2.xhtml +END +106-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/106-1.html +END +123-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/123-2.html +END +204-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/204-2.html +END +221-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/221-3.html +END +140-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/140-3.html +END +go.gif +K 25 +svn:wc:ra_dav:version-url +V 55 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/go.gif +END +227-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/227-1.html +END +244-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/244-2.html +END +261-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/261-3.html +END +163-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/163-2.html +END +146-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/146-1.html +END +118-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/118-3.html +END +216-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/216-4.html +END +186-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/186-1.html +END +267-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/267-1.html +END +239-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/239-3.html +END +40-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/40-2.html +END +23-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/23-1.html +END +80-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/80-2.html +END +63-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/63-1.html +END +18-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/18-2.html +END +58-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/58-2.html +END +1-1.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/1-1.html +END +rex.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/rex.html +END +98-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/98-2.html +END +213-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/213-2.html +END +132-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/132-2.html +END +115-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/115-1.html +END +253-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/253-2.html +END +8-4.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/8-4.html +END +236-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/236-1.html +END +208-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/208-3.html +END +225-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/225-4.html +END +276-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/276-1.html +END +195-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/195-1.html +END +248-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/248-3.html +END +32-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/32-1.html +END +72-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/72-1.html +END +27-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/27-2.html +END +33-6.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/33-6.html +END +5-2.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/5-2.html +END +205-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/205-1.html +END +141-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/141-2.html +END +124-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/124-1.html +END +222-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/222-2.html +END +245-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/245-1.html +END +164-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/164-1.html +END +262-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/262-2.html +END +181-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/181-2.html +END +6-7.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/6-7.html +END +119-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/119-2.html +END +217-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/217-3.html +END +206-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/206-6.html +END +159-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/159-2.html +END +274-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/274-4.html +END +257-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/257-3.html +END +199-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/199-2.html +END +188-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/188-5.html +END +41-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/41-1.html +END +13-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/13-3.html +END +81-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/81-1.html +END +53-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/53-3.html +END +36-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/36-2.html +END +19-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/19-1.html +END +76-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/76-2.html +END +59-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/59-1.html +END +82-6.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/82-6.html +END +99-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/99-1.html +END +110-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/110-2.html +END +133-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/133-1.html +END +150-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/150-2.html +END +231-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/231-2.html +END +214-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/214-1.html +END +220-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/220-5.html +END +271-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/271-2.html +END +254-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/254-1.html +END +173-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/173-1.html +END +190-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/190-2.html +END +226-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/226-3.html +END +145-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/145-3.html +END +209-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/209-2.html +END +128-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/128-2.html +END +168-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/168-2.html +END +249-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/249-2.html +END +10-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/10-1.html +END +50-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/50-1.html +END +197-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/197-5.html +END +90-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/90-1.html +END +28-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/28-1.html +END +45-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/45-2.html +END +62-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/62-3.html +END +17-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/17-4.html +END +68-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/68-1.html +END +57-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/57-4.html +END +200-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/200-2.html +END +102-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/102-1.html +END +6-1.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/6-1.html +END +142-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/142-1.html +END +240-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/240-2.html +END +223-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/223-1.html +END +114-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/114-3.html +END +212-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/212-4.html +END +263-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/263-1.html +END +182-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/182-1.html +END +137-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/137-2.html +END +218-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/218-2.html +END +207-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/207-5.html +END +177-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/177-2.html +END +258-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/258-2.html +END +14-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/14-2.html +END +20-6.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/20-6.html +END +54-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/54-2.html +END +37-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/37-1.html +END +94-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/94-2.html +END +77-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/77-1.html +END +66-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/66-4.html +END +111-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/111-1.html +END +151-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/151-1.html +END +232-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/232-1.html +END +204-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/204-3.html +END +221-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/221-4.html +END +106-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/106-2.html +END +272-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/272-1.html +END +191-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/191-1.html +END +129-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/129-1.html +END +146-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/146-2.html +END +227-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/227-2.html +END +163-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/163-3.html +END +118-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/118-4.html +END +216-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/216-5.html +END +186-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/186-2.html +END +169-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/169-1.html +END +267-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/267-2.html +END +23-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/23-2.html +END +63-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/63-2.html +END +46-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/46-1.html +END +80-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/80-3.html +END +18-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/18-3.html +END +86-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/86-1.html +END +1-2.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/1-2.html +END +201-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/201-1.html +END +120-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/120-1.html +END +98-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/98-3.html +END +160-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/160-1.html +END +241-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/241-1.html +END +213-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/213-3.html +END +115-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/115-2.html +END +236-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/236-2.html +END +219-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/219-1.html +END +8-5.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/8-5.html +END +138-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/138-1.html +END +208-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/208-4.html +END +225-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/225-5.html +END +195-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/195-2.html +END +276-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/276-2.html +END +259-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/259-1.html +END +178-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/178-1.html +END +15-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/15-1.html +END +32-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/32-2.html +END +55-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/55-1.html +END +72-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/72-2.html +END +33-7.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/33-7.html +END +fish.gif +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/fish.gif +END +95-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/95-1.html +END +5-3.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/5-3.html +END +250-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/250-1.html +END +107-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/107-1.html +END +222-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/222-3.html +END +205-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/205-2.html +END +141-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/141-3.html +END +124-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/124-2.html +END +245-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/245-2.html +END +228-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/228-1.html +END +147-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/147-1.html +END +164-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/164-2.html +END +119-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/119-3.html +END +217-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/217-4.html +END +187-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/187-1.html +END +268-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/268-1.html +END +274-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/274-5.html +END +renew.gif +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/renew.gif +END +24-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/24-1.html +END +41-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/41-2.html +END +81-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/81-2.html +END +64-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/64-1.html +END +53-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/53-4.html +END +19-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/19-2.html +END +59-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/59-2.html +END +82-7.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/82-7.html +END +2-1.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/2-1.html +END +99-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/99-2.html +END +133-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/133-2.html +END +214-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/214-2.html +END +116-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/116-1.html +END +220-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/220-6.html +END +173-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/173-2.html +END +237-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/237-1.html +END +254-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/254-2.html +END +145-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/145-4.html +END +196-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/196-1.html +END +168-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/168-3.html +END +10-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/10-2.html +END +33-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/33-1.html +END +50-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/50-2.html +END +73-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/73-1.html +END +90-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/90-2.html +END +62-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/62-4.html +END +28-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/28-2.html +END +17-5.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/17-5.html +END +68-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/68-2.html +END +welcome.gif +K 25 +svn:wc:ra_dav:version-url +V 60 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/welcome.gif +END +102-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/102-2.html +END +6-2.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/6-2.html +END +142-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/142-2.html +END +206-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/206-1.html +END +125-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/125-1.html +END +223-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/223-2.html +END +212-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/212-5.html +END +165-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/165-1.html +END +263-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/263-2.html +END +246-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/246-1.html +END +182-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/182-2.html +END +218-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/218-3.html +END +207-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/207-6.html +END +42-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/42-1.html +END +14-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/14-3.html +END +82-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/82-1.html +END +37-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/37-2.html +END +77-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/77-2.html +END +66-5.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/66-5.html +END +rex.gif +K 25 +svn:wc:ra_dav:version-url +V 56 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/rex.gif +END +111-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/111-2.html +END +134-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/134-1.html +END +151-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/151-2.html +END +232-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/232-2.html +END +221-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/221-5.html +END +204-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/204-4.html +END +174-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/174-1.html +END +272-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/272-2.html +END +255-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/255-1.html +END +191-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/191-2.html +END +129-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/129-2.html +END +227-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/227-3.html +END +216-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/216-6.html +END +169-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/169-2.html +END +11-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/11-1.html +END +51-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/51-1.html +END +image.gif +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/image.gif +END +23-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/23-3.html +END +91-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/91-1.html +END +46-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/46-2.html +END +80-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/80-4.html +END +29-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/29-1.html +END +18-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/18-4.html +END +86-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/86-2.html +END +69-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/69-1.html +END +alternative1.html +K 25 +svn:wc:ra_dav:version-url +V 66 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/alternative1.html +END +98-4.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/98-4.html +END +120-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/120-2.html +END +201-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/201-2.html +END +103-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/103-1.html +END +chart.gif +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/chart.gif +END +7-1.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/7-1.html +END +160-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/160-2.html +END +241-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/241-2.html +END +143-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/143-1.html +END +224-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/224-1.html +END +213-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/213-4.html +END +183-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/183-1.html +END +264-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/264-1.html +END +138-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/138-2.html +END +236-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/236-3.html +END +219-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/219-2.html +END +208-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/208-5.html +END +178-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/178-2.html +END +195-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/195-3.html +END +259-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/259-2.html +END +276-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/276-3.html +END +20-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/20-1.html +END +60-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/60-1.html +END +32-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/32-3.html +END +15-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/15-2.html +END +72-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/72-3.html +END +38-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/38-1.html +END +55-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/55-2.html +END +33-8.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/33-8.html +END +95-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/95-2.html +END +78-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/78-1.html +END +avlab.txt +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/avlab.txt +END +112-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/112-1.html +END +250-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/250-2.html +END +17-10.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/17-10.html +END +152-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/152-1.html +END +233-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/233-1.html +END +205-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/205-3.html +END +107-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/107-2.html +END +273-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/273-1.html +END +192-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/192-1.html +END +147-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/147-2.html +END +228-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/228-2.html +END +119-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/119-4.html +END +217-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/217-5.html +END +268-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/268-2.html +END +187-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/187-2.html +END +274-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/274-6.html +END +24-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/24-2.html +END +64-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/64-2.html +END +47-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/47-1.html +END +53-5.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/53-5.html +END +19-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/19-3.html +END +fishswim.gif +K 25 +svn:wc:ra_dav:version-url +V 61 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/fishswim.gif +END +87-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/87-1.html +END +82-8.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/82-8.html +END +2-2.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/2-2.html +END +121-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/121-1.html +END +202-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/202-1.html +END +242-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/242-1.html +END +161-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/161-1.html +END +library.gif +K 25 +svn:wc:ra_dav:version-url +V 60 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/library.gif +END +214-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/214-3.html +END +116-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/116-2.html +END +254-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/254-3.html +END +139-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/139-1.html +END +237-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/237-2.html +END +173-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/173-3.html +END +145-5.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/145-5.html +END +196-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/196-2.html +END +168-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/168-4.html +END +16-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/16-1.html +END +33-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/33-2.html +END +73-2.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/73-2.html +END +56-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/56-1.html +END +17-6.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/17-6.html +END +big-fail.png +K 25 +svn:wc:ra_dav:version-url +V 61 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/big-fail.png +END +96-1.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/96-1.html +END +68-3.html +K 25 +svn:wc:ra_dav:version-url +V 58 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/68-3.html +END +211-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/211-1.html +END +6-3.html +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/6-3.html +END +251-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/251-1.html +END +142-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/142-3.html +END +223-3.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/223-3.html +END +206-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/206-2.html +END +108-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/108-1.html +END +125-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/125-2.html +END +212-6.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/212-6.html +END +148-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/148-1.html +END +165-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/165-2.html +END +246-2.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/246-2.html +END +229-1.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/229-1.html +END +218-4.html +K 25 +svn:wc:ra_dav:version-url +V 59 +/svn/!svn/ver/232/tags/0.4.1/tests/testfiles/oac/218-4.html +END diff --git a/tests/testfiles/oac/.svn/entries b/tests/testfiles/oac/.svn/entries new file mode 100644 index 0000000..644e95e --- /dev/null +++ b/tests/testfiles/oac/.svn/entries @@ -0,0 +1,25664 @@ +10 + +dir +232 +https://keveemiller@quail-lib.googlecode.com/svn/tags/0.4.1/tests/testfiles/oac +https://keveemiller@quail-lib.googlecode.com/svn + + + +2010-09-04T21:59:16.426567Z +230 +keveemiller + + + + + + + + + + + + + + +0cbe4d32-2880-11de-b161-0f7b0ef88f65 + +188-1.html +file + + + + +2010-12-08T21:43:36.000000Z +c88a283fc7b0b0553de830b2eeb83390 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +524 + +269-1.html +file + + + + +2010-12-08T21:43:36.000000Z +b79ea06f068d8488858e950060588e99 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1111 + +42-2.html +file + + + + +2010-12-08T21:43:36.000000Z +1f374638ee35dfe32558005071802bd2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +464 + +25-1.html +file + + + + +2010-12-08T21:43:36.000000Z +85c83c768e1eb191fbd4a825124185b3 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +175 + +82-2.html +file + + + + +2010-12-08T21:43:36.000000Z +c0e0a7600e928105348c407eb7e34985 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +398 + +65-1.html +file + + + + +2010-12-08T21:43:36.000000Z +d7b5eab760aedb6746f8479fab682dfa +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +514 + +66-6.html +file + + + + +2010-12-08T21:43:36.000000Z +b834dd92166309d599d63fdc6627b74c +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +304 + +3-1.html +file + + + + +2010-12-08T21:43:36.000000Z +c7487f397756b5d3438fb216b0e00964 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +596 + +220-1.html +file + + + + +2010-12-08T21:43:36.000000Z +80fc8046a40de350355661c72bd4742f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +580 + +111-3.html +file + + + + +2010-12-08T21:43:36.000000Z +4dec36b4f35f584821ad82518ad900f0 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +686 + +260-1.html +file + + + + +2010-12-08T21:43:36.000000Z +f080d25c17ba93a6269b2effcb224c68 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +364 + +117-1.html +file + + + + +2010-12-08T21:43:36.000000Z +b19443ba83c36d3028fb6ebcd4727931 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +453 + +151-3.html +file + + + + +2010-12-08T21:43:36.000000Z +89f479685b8d1d178f350134a4fbbef3 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +953 + +134-2.html +file + + + + +2010-12-08T21:43:36.000000Z +f3e92bbc24882e58f430789da613295b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +307 + +204-5.html +file + + + + +2010-12-08T21:43:36.000000Z +46b317127d52c88fa3f4e939c099799d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +507 + +221-6.html +file + + + + +2010-12-08T21:43:36.000000Z +d2e3a8086808031e8301d9e34680e1a1 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +516 + +238-1.html +file + + + + +2010-12-08T21:43:36.000000Z +dbbcc3160b94ca3a4adcc8c8c2e17c62 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +491 + +255-2.html +file + + + + +2010-12-08T21:43:36.000000Z +95a06bb3f774c8437429e9dc56969e61 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +356 + +174-2.html +file + + + + +2010-12-08T21:43:36.000000Z +5dac4934cd067cafdaf088929b1ec09e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +442 + +197-1.html +file + + + + +2010-12-08T21:43:36.000000Z +63cdbae62caa0997679ab048442ad47e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +369 + +11-2.html +file + + + + +2010-12-08T21:43:36.000000Z +b98de3c699fe353aecbae7660605d1a3 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +457 + +34-1.html +file + + + + +2010-12-08T21:43:36.000000Z +46a2c09b33437e4445dafbcd6f599deb +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +267 + +51-2.html +file + + + + +2010-12-08T21:43:36.000000Z +7cf655971279b61ff1c7567a22267d64 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +363 + +74-1.html +file + + + + +2010-12-08T21:43:36.000000Z +c228af1156fec4cec785d766697bd364 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +225 + +91-2.html +file + + + + +2010-12-08T21:43:36.000000Z +125b22932b56dda01fa87704977c3c86 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +616 + +29-2.html +file + + + + +2010-12-08T21:43:36.000000Z +24db69f5ead6007adb9c1072eb4ea916 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +363 + +69-2.html +file + + + + +2010-12-08T21:43:36.000000Z +ff19086b413f07dbdb87e35703ce2258 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +413 + +alternative2.html +file + + + + +2010-12-08T21:43:36.000000Z +9883773f10ee763d05e2f6b726bd196f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +933 + +103-2.html +file + + + + +2010-12-08T21:43:36.000000Z +01363c63be6a84f7e84b8ed419f7746d +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +230 + +120-3.html +file + + + + +2010-12-08T21:43:36.000000Z +349f0ac622613d09f3b310a268546e2b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +509 + +7-2.html +file + + + + +2010-12-08T21:43:36.000000Z +66c9d4f0a3c669ac5e8e373fdad8f720 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +374 + +207-1.html +file + + + + +2010-12-08T21:43:36.000000Z +35dd38a5cc8f52f6e5079340671ad465 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +559 + +143-2.html +file + + + + +2010-12-08T21:43:36.000000Z +78e957b6369c0305793b4be4a3074ff7 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +266 + +126-1.html +file + + + + +2010-12-08T21:43:36.000000Z +03e832c3007299749faf314ddbdf78e4 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +287 + +224-2.html +file + + + + +2010-12-08T21:43:36.000000Z +b20c091bcb93072d66d1d2608cb95aea +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +357 + +213-5.html +file + + + + +2010-12-08T21:43:36.000000Z +ed88b755c29c9947320ab114f7497d00 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +511 + +264-2.html +file + + + + +2010-12-08T21:43:36.000000Z +483b441c9b76b3a7ec79dfecba05a03e +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +502 + +183-2.html +file + + + + +2010-12-08T21:43:36.000000Z +61cdccb97b7d9ac8fbfde7ac402ae97b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +632 + +247-1.html +file + + + + +2010-12-08T21:43:36.000000Z +a10275213dd5e9173d1b29adcad5aac1 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +833 + +166-1.html +file + + + + +2010-12-08T21:43:36.000000Z +6f3ed429b4c4e46a3239aa4abefe2418 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +290 + +138-3.html +file + + + + +2010-12-08T21:43:36.000000Z +8c6495689a8b44c34625436d588bba25 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +562 + +219-3.html +file + + + + +2010-12-08T21:43:36.000000Z +606f9b3192ed250df6c237ff69cab129 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +552 + +208-6.html +file + + + + +2010-12-08T21:43:36.000000Z +3fbf164aa9d5e7b6d5a4d2fcb2bebfd6 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +595 + +178-3.html +file + + + + +2010-12-08T21:43:36.000000Z +f87ea195ffa20b9baf478cd07d9909f5 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +369 + +195-4.html +file + + + + +2010-12-08T21:43:36.000000Z +82f867ce1fb0610dd648782b5ef3b3ef +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +362 + +20-2.html +file + + + + +2010-12-08T21:43:36.000000Z +b20b16687f540863ceaa2d3b7959dc40 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +206 + +60-2.html +file + + + + +2010-12-08T21:43:36.000000Z +e9a7c1ea8044dd193bc05dc0369f361d +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +419 + +43-1.html +file + + + + +2010-12-08T21:43:36.000000Z +1e29f5d66a4604f246ee3ab6d06f3624 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +435 + +38-2.html +file + + + + +2010-12-08T21:43:36.000000Z +8d2096d48e3f6d824c5dcc1542d8439c +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +487 + +33-9.html +file + + + + +2010-12-08T21:43:36.000000Z +432c544528a97ca490bf8b8c00b2f6d3 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +349 + +78-2.html +file + + + + +2010-12-08T21:43:36.000000Z +cd49a4b6e8c6b71b8395b9552a975233 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +341 + +95-3.html +file + + + + +2010-12-08T21:43:36.000000Z +6ced38f41f82d72cd4de018aa8e930d7 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +523 + +112-2.html +file + + + + +2010-12-08T21:43:36.000000Z +10a35ae637437cd58d5f351889c4480f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1025 + +17-11.html +file + + + + +2010-12-08T21:43:36.000000Z +4cfd6c8b5082312a451d8b85adf4361b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +274 + +233-2.html +file + + + + +2010-12-08T21:43:36.000000Z +e027075ee07a10e49b0c1c80b2e8bfea +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +442 + +135-1.html +file + + + + +2010-12-08T21:43:36.000000Z +514ab575e9dc51c689102fa84176468b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +511 + +216-1.html +file + + + + +2010-12-08T21:43:36.000000Z +e7f0e27354fc1dd1f77e9f85e8fed139 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +548 + +152-2.html +file + + + + +2010-12-08T21:43:36.000000Z +bd1d4afa54ffb7b6a7c20dd25b646fe1 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +483 + +205-4.html +file + + + + +2010-12-08T21:43:36.000000Z +75648c0f40e1b3ad1d95754d3c2003fa +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +530 + +66-10.html +file + + + + +2010-12-08T21:43:36.000000Z +04d78394563e21bff68384b75b8a1e32 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +304 + +192-2.html +file + + + + +2010-12-08T21:43:36.000000Z +11106be8fc199a646e02804ca0bc5166 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +436 + +273-2.html +file + + + + +2010-12-08T21:43:36.000000Z +4f737ddf01dcd6232a13961fb60e68df +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +391 + +256-1.html +file + + + + +2010-12-08T21:43:36.000000Z +15cc2760461ef4bff5ba29ceff0fc310 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +357 + +175-1.html +file + + + + +2010-12-08T21:43:36.000000Z +eae9ad84c680852a34528818094341df +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +368 + +147-3.html +file + + + + +2010-12-08T21:43:36.000000Z +49aba63d4c061dd6c3cce5ab84c58a0e +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +429 + +228-3.html +file + + + + +2010-12-08T21:43:36.000000Z +357de8814b79f50d44213baa7b5df54b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +415 + +217-6.html +file + + + + +2010-12-08T21:43:36.000000Z +4b306a62c94f2c372e1bd9cfbd89ae38 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +538 + +contrast1.gif +file + + + + +2010-12-08T21:43:36.000000Z +bb6e93459a8d0e41a7bd0ec7661dc0b2 +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +381 + +12-1.html +file + + + + +2010-12-08T21:43:36.000000Z +91b371dd7484094b93ba22907026cbca +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +424 + +274-7.html +file + + + + +2010-12-08T21:43:36.000000Z +85613717bcf16efd22ff18ad5acddc29 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1432 + +52-1.html +file + + + + +2010-12-08T21:43:36.000000Z +5dd12f78b72d050155a5fceb9f0302c9 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +364 + +92-1.html +file + + + + +2010-12-08T21:43:37.000000Z +3ed3399838a07c21e4527c25ecec8ce8 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +646 + +47-2.html +file + + + + +2010-12-08T21:43:37.000000Z +190e8e80416dc90de32eee98d336c61e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +436 + +87-2.html +file + + + + +2010-12-08T21:43:37.000000Z +097bebe541608f7cfd96f05339ff1e18 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +82-9.html +file + + + + +2010-12-08T21:43:37.000000Z +423f6c0edc25240d97eedf95e823d1a1 +2010-05-23T23:17:19.912117Z +176 +keveemiller + + + + + + + + + + + + + + + + + + + + + +574 + +104-1.html +file + + + + +2010-12-08T21:43:37.000000Z +24b412e6855324ebab4012ebd56da1ee +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +252 + +121-2.html +file + + + + +2010-12-08T21:43:37.000000Z +e5798ea5b3736eaff97b913d81b01d63 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +546 + +202-2.html +file + + + + +2010-12-08T21:43:37.000000Z +c581291900fcade8353fc8e55f0a8c47 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +430 + +8-1.html +file + + + + +2010-12-08T21:43:37.000000Z +4e57e474e44363445f8c1369fdc9fb4e +2010-08-01T02:50:07.365909Z +213 +keveemiller + + + + + + + + + + + + + + + + + + + + + +452 + +144-1.html +file + + + + +2010-12-08T21:43:37.000000Z +25b7c9cdf4b6ca44681c7d39dbcaae69 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +263 + +225-1.html +file + + + + +2010-12-08T21:43:37.000000Z +47387abcb831b8a4496116ed5b4fa3e4 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +173 + +242-2.html +file + + + + +2010-12-08T21:43:37.000000Z +ae4d36cff7fceb091878ae5fd7fcf585 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +929 + +161-2.html +file + + + + +2010-12-08T21:43:37.000000Z +e370ee4a7d8b8d1f425e45be6cba3f23 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +232 + +214-4.html +file + + + + +2010-12-08T21:43:37.000000Z +dfe9dcc7280481cbb3d1bbafe3018cc6 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +524 + +265-1.html +file + + + + +2010-12-08T21:43:37.000000Z +c2782c99b8ebc487fd34fff409b26909 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1181 + +star.gif +file + + + + +2010-12-08T21:43:37.000000Z +09c4d8dd75b6ef1cc75f8ae412be8140 +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +910 + +184-1.html +file + + + + +2010-12-08T21:43:37.000000Z +43b9f233587e4dfd644523ebbb29a78b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +292 + +139-2.html +file + + + + +2010-12-08T21:43:37.000000Z +af850e575d7184e5f4fbacc7ada59f38 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +562 + +145-6.html +file + + + + +2010-12-08T21:43:37.000000Z +c559cab5cb0f57274aa9e53d11a99b75 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +428 + +21-1.html +file + + + + +2010-12-08T21:43:37.000000Z +9994bc89640ed5df1663cac7b805f42a +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +391 + +61-1.html +file + + + + +2010-12-08T21:43:37.000000Z +5a0c5bb4b90365379d4c492a5c4cef1a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +328 + +16-2.html +file + + + + +2010-12-08T21:43:37.000000Z +b2fa5411a6585dd698b15f6ce69786ac +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +385 + +33-3.html +file + + + + +2010-12-08T21:43:37.000000Z +4bf6639d0964387e3e249771b37b1158 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +349 + +56-2.html +file + + + + +2010-12-08T21:43:37.000000Z +8320868c5e072d1b4fc5bd3db0175638 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +299 + +39-1.html +file + + + + +2010-12-08T21:43:37.000000Z +576b88d8fa58dd82475b4881618d5cdd +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +484 + +17-7.html +file + + + + +2010-12-08T21:43:37.000000Z +5d6fc969c7778adefe9afb531463b776 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +274 + +96-2.html +file + + + + +2010-12-08T21:43:37.000000Z +8b3339c57e7e1e3cac2949dbd1640368 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +732 + +79-1.html +file + + + + +2010-12-08T21:43:37.000000Z +1b7a67b8e871543947e2d26492ac9bcd +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +327 + +68-4.html +file + + + + +2010-12-08T21:43:37.000000Z +6ca3c38d94f61da3ed75d306ac0337e7 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +337 + +113-1.html +file + + + + +2010-12-08T21:43:37.000000Z +5ed7e6a3eef5ccf0dd78a226d4646f0a +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +891 + +211-2.html +file + + + + +2010-12-08T21:43:37.000000Z +aa37720cd33cf1d1ac4227e3e1e279d5 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +706 + +153-1.html +file + + + + +2010-12-08T21:43:37.000000Z +9f29fb2226fde8012193ec6bf1ea5587 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +610 + +6-4.html +file + + + + +2010-12-08T21:43:37.000000Z +d401412def7f37e96c623dfef53eb0fe +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +259 + +234-1.html +file + + + + +2010-12-08T21:43:37.000000Z +6e8e4d1f3fed4e3c106cb43947500f43 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +408 + +251-2.html +file + + + + +2010-12-08T21:43:37.000000Z +14ba73586c7eef463abe98ecb1a0a882 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +426 + +206-3.html +file + + + + +2010-12-08T21:43:37.000000Z +6dfe2cf61107fddff7cc6c32106197fc +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +522 + +108-2.html +file + + + + +2010-12-08T21:43:37.000000Z +25dc35c65ca8829a249eef85eef22d8c +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +260 + +274-1.html +file + + + + +2010-12-08T21:43:37.000000Z +a9a816c4b3619d33afe3a64d4c2153c9 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +651 + +193-1.html +file + + + + +2010-12-08T21:43:37.000000Z +65733b4c66c826c83c098a59692b142b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +441 + +148-2.html +file + + + + +2010-12-08T21:43:37.000000Z +2daa1c8d423727f7c39feadd3708ead8 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +259 + +229-2.html +file + + + + +2010-12-08T21:43:37.000000Z +718638d68173b7d4413eb8b8f4b4ab7d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +449 + +246-3.html +file + + + + +2010-12-08T21:43:37.000000Z +365f075d783047a5acc0667c4aae4e4f +2010-05-30T23:57:09.912425Z +183 +keveemiller + + + + + + + + + + + + + + + + + + + + + +749 + +218-5.html +file + + + + +2010-12-08T21:43:37.000000Z +aec7403d1ffec5267ae999ac7f39b206 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +519 + +spacer.gif +file + + + + +2010-12-08T21:43:37.000000Z +df65e74c4428344438eee1e32ea15adb +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +40 + +188-2.html +file + + + + +2010-12-08T21:43:37.000000Z +4ef9ee3ccd6cd3d155c698fbad4211e7 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +536 + +269-2.html +file + + + + +2010-12-08T21:43:37.000000Z +3da25466d5fe7ba9d776308b4ac7b15a +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +2032 + +30-1.html +file + + + + +2010-12-08T21:43:37.000000Z +e4ff16e51d6bcaa32864b22cb0c553f4 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +463 + +avlab.mp3 +file + + + + +2010-12-08T21:43:37.000000Z +245da183a994e4bddc7afe6cde68b32a +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +98454 + +70-1.html +file + + + + +2010-12-08T21:43:37.000000Z +f6fb2bb4e0be10c15490f6256b5ff628 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +233 + +25-2.html +file + + + + +2010-12-08T21:43:37.000000Z +9f4bd9e9ffdbc646641ea0a91d0fdb6f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +235 + +65-2.html +file + + + + +2010-12-08T21:43:37.000000Z +5345c6b1ee0e0ce9be6f73ad5133103d +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +509 + +82-3.html +file + + + + +2010-12-08T21:43:37.000000Z +40b9d565b9380b81feef76478a361621 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +397 + +48-1.html +file + + + + +2010-12-08T21:43:37.000000Z +5962175a8c01b74a21d4f8b3ddbba93a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +378 + +88-1.html +file + + + + +2010-12-08T21:43:37.000000Z +48a31f553ba079fe67b3f3db41add2a3 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +258 + +finddogs.gif +file + + + + +2010-12-08T21:43:37.000000Z +f523dcd41a54a047a79799b1d896091c +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +648 + +66-7.html +file + + + + +2010-12-08T21:43:37.000000Z +3f4aa589a17e88cf898acd1f5d1645bd +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +304 + +3-2.html +file + + + + +2010-12-08T21:43:37.000000Z +08a02fceb3587c927277e6bd1aa7544e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +417 + +220-2.html +file + + + + +2010-12-08T21:43:37.000000Z +433db290176a04c65c6f98b68e12f8d0 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +555 + +122-1.html +file + + + + +2010-12-08T21:43:37.000000Z +ddf7f807f5f439ca8930e4dddd582aac +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +653 + +203-1.html +file + + + + +2010-12-08T21:43:37.000000Z +845c0800aff27b3639381c8fb37c5fe7 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +795 + +243-1.html +file + + + + +2010-12-08T21:43:37.000000Z +e771c99e2f4ee30be5a7d3650126cd86 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +979 + +162-1.html +file + + + + +2010-12-08T21:43:37.000000Z +e16022aff36926731a9804c5d7b02308 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +249 + +260-2.html +file + + + + +2010-12-08T21:43:37.000000Z +4fa7077f351d6fabb8e116f83acb4f31 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +364 + +117-2.html +file + + + + +2010-12-08T21:43:37.000000Z +cc257277de0c2930f09afa8e6725f8ce +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +465 + +204-6.html +file + + + + +2010-12-08T21:43:37.000000Z +4bf2f6810e2f4e29f9865b1dabd16fc3 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +512 + +255-3.html +file + + + + +2010-12-08T21:43:37.000000Z +84779ebe3251dc302ac631ee54644007 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +323 + +174-3.html +file + + + + +2010-12-08T21:43:37.000000Z +737318d72a0aab85f2700e159365ef55 +2010-08-04T04:27:02.899467Z +215 +keveemiller + + + + + + + + + + + + + + + + + + + + + +479 + +238-2.html +file + + + + +2010-12-08T21:43:37.000000Z +8e5642a1a366ed1380d89bcca43a8904 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +469 + +197-2.html +file + + + + +2010-12-08T21:43:37.000000Z +953bcab06ecbd499cbbb31ac4098ee62 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +366 + +51-3.html +file + + + + +2010-12-08T21:43:37.000000Z +d18f0b9ab083aa211800a84861922e36 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +347 + +34-2.html +file + + + + +2010-12-08T21:43:37.000000Z +c56f818d48cfbcbfb0bc49ac55c88041 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +295 + +17-1.html +file + + + + +2010-12-08T21:43:37.000000Z +bbd3d0909139f6b1be744dc69f983b43 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +274 + +74-2.html +file + + + + +2010-12-08T21:43:37.000000Z +9113bd8f83740ecee4f7ca7abf7c7ef4 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +91-3.html +file + + + + +2010-12-08T21:43:37.000000Z +bde5c46c419014cf0ab1d69ef558ea43 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +595 + +57-1.html +file + + + + +2010-12-08T21:43:37.000000Z +7ee544a79f0c0ddc71541dcb9f7a7d63 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +523 + +97-1.html +file + + + + +2010-12-08T21:43:37.000000Z +dd5cb21b2614275e124643ffb4ff23f8 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +234 + +212-1.html +file + + + + +2010-12-08T21:43:37.000000Z +d7850b3634c0450b56d01c5e6ed39797 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +547 + +131-1.html +file + + + + +2010-12-08T21:43:37.000000Z +c5dc34ef434851498e6b451f808cc9a5 +2010-05-23T22:35:45.233268Z +175 +keveemiller + + + + + + + + + + + + + + + + + + + + + +352 + +120-4.html +file + + + + +2010-12-08T21:43:37.000000Z +b384feb7fa5e1658c4955155fedc58aa +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +504 + +252-1.html +file + + + + +2010-12-08T21:43:37.000000Z +a54ce5b69c0b0611ff8345331ec30071 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +319 + +126-2.html +file + + + + +2010-12-08T21:43:37.000000Z +5e8b9d23854968100f8a4e1833471978 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +298 + +207-2.html +file + + + + +2010-12-08T21:43:37.000000Z +1225ba015fa4b6634befd8250550f9dc +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +568 + +109-1.html +file + + + + +2010-12-08T21:43:37.000000Z +48e4e5193b169a85791809d5da1c9d51 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +308 + +224-3.html +file + + + + +2010-12-08T21:43:37.000000Z +15e721642c7628cbdd668199a9004350 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +323 + +213-6.html +file + + + + +2010-12-08T21:43:37.000000Z +22751cfd485533bb71175f34a4f1c916 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +516 + +264-3.html +file + + + + +2010-12-08T21:43:37.000000Z +36e5c8275e1673c3c168e9308c53f48b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +503 + +166-2.html +file + + + + +2010-12-08T21:43:37.000000Z +abcdf0ce7a8b957bfa268bcd79c3d8ca +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +313 + +247-2.html +file + + + + +2010-12-08T21:43:37.000000Z +ec4223a5cc36460b37ed42d55b239f69 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +989 + +219-4.html +file + + + + +2010-12-08T21:43:37.000000Z +53a5ae9bf4e4373ea9e85bf323b588c8 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +527 + +208-7.html +file + + + + +2010-12-08T21:43:37.000000Z +418772ebeac2536dc2cf88154102e972 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +598 + +189-1.html +file + + + + +2010-12-08T21:43:37.000000Z +9f7c08daea6943830d903523a958ec18 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +534 + +contrast2.gif +file + + + + +2010-12-08T21:43:37.000000Z +b2571a3b83c281ee5cc97252cc3c0c48 +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +304 + +eatatjoes.gif +file + + + + +2010-12-08T21:43:37.000000Z +3d4bd6be16c57ac30b2c1c1ffe194908 +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +4738 + +20-3.html +file + + + + +2010-12-08T21:43:37.000000Z +92977f1acc7b15d87a72504c495434f8 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +246 + +26-1.html +file + + + + +2010-12-08T21:43:37.000000Z +284a7451ab731173099c5f2ec3c6d1ac +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +208 + +43-2.html +file + + + + +2010-12-08T21:43:37.000000Z +5808a10edfd852fda47e6ee2f181f737 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +436 + +66-1.html +file + + + + +2010-12-08T21:43:37.000000Z +616c8a9a25de2d988f6d376c8d4aec88 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +657 + +100-1.html +file + + + + +2010-12-08T21:43:37.000000Z +f84c754facd1d6c53af90c8db90c2529 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +287 + +95-4.html +file + + + + +2010-12-08T21:43:37.000000Z +18a99d49a437211dc65e1f384a3fb99a +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +521 + +4-1.html +file + + + + +2010-12-08T21:43:37.000000Z +79380e2cc75a05834d292fc469a8bfab +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +361 + +221-1.html +file + + + + +2010-12-08T21:43:37.000000Z +67677a9d22410686e08623e5b6e44443 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +319 + +140-1.html +file + + + + +2010-12-08T21:43:37.000000Z +bfc28057596c1fdc7f3c77779629047c +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +554 + +261-1.html +file + + + + +2010-12-08T21:43:37.000000Z +262a416d65d566ea555f62b5463940c7 +2010-07-10T23:32:25.522660Z +202 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1455 + +180-1.html +file + + + + +2010-12-08T21:43:37.000000Z +a6868ee6f02c4b84fe1ef1b9cfef2d25 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +330 + +118-1.html +file + + + + +2010-12-08T21:43:37.000000Z +07544be7f7a2b54996e5013c0bc8f617 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +531 + +135-2.html +file + + + + +2010-12-08T21:43:37.000000Z +15559c07d4cb3cec4dbdaf6bc44baadc +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +199 + +17-12.html +file + + + + +2010-12-08T21:43:37.000000Z +24544eb8edd5631b519e713611082335 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +274 + +152-3.html +file + + + + +2010-12-08T21:43:37.000000Z +7121b49b8aa0141d80c67811ed6ae4e7 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +584 + +216-2.html +file + + + + +2010-12-08T21:43:37.000000Z +7bd81481f686bd5382d3ab44ec6e5c6b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +554 + +205-5.html +file + + + + +2010-12-08T21:43:37.000000Z +31e368db0f2b6cea12ab56e544a0355d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +553 + +66-11.html +file + + + + +2010-12-08T21:43:37.000000Z +d928e81bd965139f9131fb9a2e8921af +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +304 + +175-2.html +file + + + + +2010-12-08T21:43:37.000000Z +fad02b44226e76d55da392fdfa8f0ac6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +363 + +239-1.html +file + + + + +2010-12-08T21:43:37.000000Z +79616f558842edb7f9911f6a9d26ebe9 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +415 + +256-2.html +file + + + + +2010-12-08T21:43:37.000000Z +a39d796c962706e4d9b20bc29439ef58 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +357 + +273-3.html +file + + + + +2010-12-08T21:43:37.000000Z +7b3a038287c40e2d44d372fc5439cab6 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +416 + +147-4.html +file + + + + +2010-12-08T21:43:37.000000Z +d2db2a387a507875bdea873d3dd6b1f8 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +428 + +198-1.html +file + + + + +2010-12-08T21:43:37.000000Z +50b937957c4912cb56e6d43b818235e2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +870 + +12-2.html +file + + + + +2010-12-08T21:43:37.000000Z +375c3e16f3ffad173cc8011e4c7f67dc +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +438 + +52-2.html +file + + + + +2010-12-08T21:43:37.000000Z +c5d7200a8dc6c78022ac5b0da7e0e259 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +35-1.html +file + + + + +2010-12-08T21:43:37.000000Z +1163633274e381723ef021e347a7d8e3 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +279 + +75-1.html +file + + + + +2010-12-08T21:43:37.000000Z +717513d3858d21d451e2eb22a4a1a3d3 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +225 + +92-2.html +file + + + + +2010-12-08T21:43:37.000000Z +1df49614c51dda0738b0053b56c0968e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +671 + +230-1.html +file + + + + +2010-12-08T21:43:37.000000Z +0e7d6c71d139f20470a9402bb273c219 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +914 + +104-2.html +file + + + + +2010-12-08T21:43:37.000000Z +ed60b27ebe35ca4256a32e9ff473ad78 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +267 + +121-3.html +file + + + + +2010-12-08T21:43:37.000000Z +8a6f2de036784ab6810d95da7ea34daf +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +508 + +270-1.html +file + + + + +2010-12-08T21:43:37.000000Z +e4c63dc0408988d5cfa55b3724250339 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +452 + +8-2.html +file + + + + +2010-12-08T21:43:37.000000Z +cdb0d892905414c87bcd8908950fe63a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +535 + +208-1.html +file + + + + +2010-12-08T21:43:37.000000Z +87b6b4b4c51ddee174fd92dbd5c3f104 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +611 + +144-2.html +file + + + + +2010-12-08T21:43:37.000000Z +4050cda0e10074852a6d0da5ebc70452 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +266 + +127-1.html +file + + + + +2010-12-08T21:43:37.000000Z +9dda750c9e2f9b63560aa5b18f90d7d7 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +252 + +225-2.html +file + + + + +2010-12-08T21:43:37.000000Z +2b21fd87a72238ff7538ba06eb3a4e47 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +335 + +214-5.html +file + + + + +2010-12-08T21:43:37.000000Z +0576a25fa3ae2ba1e9c3850a772d7892 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +541 + +rex.jpg +file + + + + +2010-12-08T21:43:37.000000Z +554e670dea84f3aef7ce1a88e940abb8 +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +5451 + +184-2.html +file + + + + +2010-12-08T21:43:37.000000Z +82a176f829b7ad752dd287a23bad518b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +329 + +167-1.html +file + + + + +2010-12-08T21:43:37.000000Z +71797b0428890f4800649356342ef4e2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +230 + +248-1.html +file + + + + +2010-12-08T21:43:37.000000Z +369e44c5370221f67440daf9031dd0d7 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +452 + +265-2.html +file + + + + +2010-12-08T21:43:37.000000Z +f41f023efa5715788280a4690da18972 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1181 + +139-3.html +file + + + + +2010-12-08T21:43:37.000000Z +4f43f15a535dc017ed624163bb0aef0a +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +564 + +21-2.html +file + + + + +2010-12-08T21:43:37.000000Z +15597d14f7f3bb5c89ff21d615c54aa6 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +381 + +44-1.html +file + + + + +2010-12-08T21:43:37.000000Z +604178b78e2c8c5205e12b02102a403a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +435 + +61-2.html +file + + + + +2010-12-08T21:43:37.000000Z +4ee18a6df4bd23b0d531fe04518966f1 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +331 + +33-4.html +file + + + + +2010-12-08T21:43:38.000000Z +1c815544d0c3196450fc35b1719ded66 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +350 + +16-3.html +file + + + + +2010-12-08T21:43:38.000000Z +ddb23ef812fc737f38c5bdd17b9f0304 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +347 + +56-3.html +file + + + + +2010-12-08T21:43:38.000000Z +e2c2277efaed760e6ecaf38b59f8de66 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +295 + +39-2.html +file + + + + +2010-12-08T21:43:38.000000Z +a21c41ba4cc7c44839c684eb02b6f8ef +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +487 + +17-8.html +file + + + + +2010-12-08T21:43:38.000000Z +70c3a0fec3a1310185be74aa8502d45b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +274 + +79-2.html +file + + + + +2010-12-08T21:43:38.000000Z +883245327acec4d0929ace7798ef9fcc +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +341 + +113-2.html +file + + + + +2010-12-08T21:43:38.000000Z +a5ac17a4a081b0a42ac97004bad92e93 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1025 + +153-2.html +file + + + + +2010-12-08T21:43:38.000000Z +787469f10ca1556e14813240dae15d89 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +592 + +6-5.html +file + + + + +2010-12-08T21:43:38.000000Z +a24bc10901b276281cb496566148c3a6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +426 + +217-1.html +file + + + + +2010-12-08T21:43:38.000000Z +7efec42cbd0b1dfc8dda1619fdeec5cd +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +568 + +136-1.html +file + + + + +2010-12-08T21:43:38.000000Z +ab806d7a2c6103bc05211a0ddcac5177 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +872 + +234-2.html +file + + + + +2010-12-08T21:43:38.000000Z +c81ce0652a2cdd71582713ac3910396f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +442 + +206-4.html +file + + + + +2010-12-08T21:43:38.000000Z +37bdb3e94755c2fc811aedfa74d69de4 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +527 + +193-2.html +file + + + + +2010-12-08T21:43:38.000000Z +9c28e8eb005fd14ad702ea0b02b4aad3 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +444 + +274-2.html +file + + + + +2010-12-08T21:43:38.000000Z +759fabe52ca3c4581da11a308fc3154f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +672 + +176-1.html +file + + + + +2010-12-08T21:43:38.000000Z +3fdfa754b1f865904e80cb96fd6f9c70 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +233 + +257-1.html +file + + + + +2010-12-08T21:43:38.000000Z +19d0013915a9d557a3007d915240012b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +357 + +246-4.html +file + + + + +2010-12-08T21:43:38.000000Z +83217b4b13bceb8ade91d1ac2dc3e0bb +2010-05-31T17:04:04.429259Z +184 +keveemiller + + + + + + + + + + + + + + + + + + + + + +803 + +229-3.html +file + + + + +2010-12-08T21:43:38.000000Z +588b057a7ec5abc85387d9af53a0f1e5 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +415 + +218-6.html +file + + + + +2010-12-08T21:43:38.000000Z +a137e5c4e0959ec1da7a694128fecec3 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +516 + +188-3.html +file + + + + +2010-12-08T21:43:38.000000Z +93bfa3fb65234a5ed401bec8c181aedd +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +529 + +13-1.html +file + + + + +2010-12-08T21:43:38.000000Z +a8c116a24393634021409022389ec124 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +714 + +30-2.html +file + + + + +2010-12-08T21:43:38.000000Z +ac79ea8ebb1da5bf3a90aba4f2407708 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +471 + +70-2.html +file + + + + +2010-12-08T21:43:38.000000Z +1b6fa249398d4bf1e4418910b871f7e3 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +53-1.html +file + + + + +2010-12-08T21:43:38.000000Z +3ceb709daaca57cc493c0c646f0a6b03 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +348 + +65-3.html +file + + + + +2010-12-08T21:43:38.000000Z +11177ce13273c5d1bdf2741db94c662a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +473 + +48-2.html +file + + + + +2010-12-08T21:43:38.000000Z +bd42c21359967b3929d410c6593f6061 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +363 + +82-4.html +file + + + + +2010-12-08T21:43:38.000000Z +545af41e636b3e299b25374253777aa4 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +397 + +88-2.html +file + + + + +2010-12-08T21:43:38.000000Z +cc4534657dca7602c151cdfb35c167e8 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +66-8.html +file + + + + +2010-12-08T21:43:38.000000Z +c2244ad0861dd8812116e9361694a080 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +304 + +220-3.html +file + + + + +2010-12-08T21:43:38.000000Z +7e36f36a6a13b1e68e6970ae2f5bfda9 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +549 + +203-2.html +file + + + + +2010-12-08T21:43:38.000000Z +f8e501c5ca0b4072c55bb9e9349bd8fa +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1063 + +122-2.html +file + + + + +2010-12-08T21:43:38.000000Z +ed69d61ed213fbc8d3b0628acff8f412 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +626 + +105-1.html +file + + + + +2010-12-08T21:43:38.000000Z +bdaa0cac14fcfe1a0d70fc4fb6825e10 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +248 + +9-1.html +file + + + + +2010-12-08T21:43:38.000000Z +10647d13ddef9f546c2ff61cdce8a9f1 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +473 + +226-1.html +file + + + + +2010-12-08T21:43:38.000000Z +ed34b927f9cd6bf98b268cf20c2cec09 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +448 + +162-2.html +file + + + + +2010-12-08T21:43:38.000000Z +863cd8e9e8b420da1f4f1e8a795d5a36 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +279 + +145-1.html +file + + + + +2010-12-08T21:43:38.000000Z +28501e818ae041e731ea4e9ad3b9ef3c +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +428 + +243-2.html +file + + + + +2010-12-08T21:43:38.000000Z +2616e09013ccd61fb3103b9ca04eb852 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1080 + +fish1.html +file + + + + +2010-12-08T21:43:38.000000Z +57339f057a8bb4b3c51d6954cf3dbb5f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +231 + +266-1.html +file + + + + +2010-12-08T21:43:38.000000Z +fdc4bec9944f82b62e21ccade8d5e7a1 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +459 + +185-1.html +file + + + + +2010-12-08T21:43:38.000000Z +4aba53d47bd7bb3deee3265d11a50e26 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +795 + +174-4.html +file + + + + +2010-12-08T21:43:38.000000Z +7fab15f35f2eb224b80ea7990219b122 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +496 + +238-3.html +file + + + + +2010-12-08T21:43:38.000000Z +24e89085cbaf6f0966648d9ad0333d83 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +504 + +197-3.html +file + + + + +2010-12-08T21:43:38.000000Z +1a4746bc43683157463fe35372ee0209 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +549 + +22-1.html +file + + + + +2010-12-08T21:43:38.000000Z +88ed5e06d5f39796f93e8b2e5663cff0 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +492 + +62-1.html +file + + + + +2010-12-08T21:43:38.000000Z +350e9351c4b62f188d6e00fd72565347 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +325 + +17-2.html +file + + + + +2010-12-08T21:43:38.000000Z +90e9aed3fdce1c07d3854e27a8ecab7e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +294 + +91-4.html +file + + + + +2010-12-08T21:43:38.000000Z +5d8597aeecb750275e9d06390ddf4ca7 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +603 + +57-2.html +file + + + + +2010-12-08T21:43:38.000000Z +78d78839128d5f7450e4899ce719fec6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +554 + +97-2.html +file + + + + +2010-12-08T21:43:38.000000Z +3126d1835059c1e465e6645847fda32d +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +227 + +114-1.html +file + + + + +2010-12-08T21:43:38.000000Z +1d4f94ec05bde18e094ac28add4afe3b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1932 + +212-2.html +file + + + + +2010-12-08T21:43:38.000000Z +001a885a847f9626adce86691fc97f4f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +556 + +131-2.html +file + + + + +2010-12-08T21:43:38.000000Z +a930b03675dfa6d2baf3ee4c9ef797cb +2010-05-23T22:35:45.233268Z +175 +keveemiller + + + + + + + + + + + + + + + + + + + + + +315 + +252-2.html +file + + + + +2010-12-08T21:43:38.000000Z +afffef67be1b37bbf9f3ac434a6c5246 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +366 + +154-1.html +file + + + + +2010-12-08T21:43:38.000000Z +9feae25bd33748d2b93f4b1248ae3dc6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +258 + +235-1.html +file + + + + +2010-12-08T21:43:38.000000Z +eb0b9b2661e7bf67daeff11aa3ee5e04 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +481 + +109-2.html +file + + + + +2010-12-08T21:43:38.000000Z +4c23ddfc873db1af4fe35b1048db39c9 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +215 + +207-3.html +file + + + + +2010-12-08T21:43:38.000000Z +295ddf44ffb826d656fe6a81cdbc450d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +530 + +213-7.html +file + + + + +2010-12-08T21:43:38.000000Z +eba98221364fcd90a3d48bf6c4f3c7ae +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +612 + +275-1.html +file + + + + +2010-12-08T21:43:38.000000Z +4d3a5a21423a557e5bdb08bb388b7fd0 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +617 + +194-1.html +file + + + + +2010-12-08T21:43:38.000000Z +ef001ae2f4f94a4a727dc7a4fb5056ff +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +575 + +219-5.html +file + + + + +2010-12-08T21:43:38.000000Z +bea7e7a4a4483fb27d8ac51ba4e70eb2 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +545 + +208-8.html +file + + + + +2010-12-08T21:43:38.000000Z +752d245877846995ffaeec11c90343a6 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +605 + +189-2.html +file + + + + +2010-12-08T21:43:38.000000Z +5208d012e901c1616d60dc9fd4b42180 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +537 + +31-1.html +file + + + + +2010-12-08T21:43:38.000000Z +834c9d35396c13f8fd739207af026401 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +423 + +20-4.html +file + + + + +2010-12-08T21:43:38.000000Z +605931a11e8f552f54480c0fdc55a74a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +246 + +71-1.html +file + + + + +2010-12-08T21:43:38.000000Z +8a23941ce794b8c65886f25ba954b51c +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +267 + +26-2.html +file + + + + +2010-12-08T21:43:38.000000Z +bbaab0e70b895d829deab7165d3b91c9 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +66-2.html +file + + + + +2010-12-08T21:43:38.000000Z +2d330b11e49fa6765fb77a381ec836b5 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +721 + +49-1.html +file + + + + +2010-12-08T21:43:38.000000Z +d1e944741c74ef257864439941774fea +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +375 + +89-1.html +file + + + + +2010-12-08T21:43:38.000000Z +32dc18a79896f67868580dae994dcbfc +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +258 + +100-2.html +file + + + + +2010-12-08T21:43:38.000000Z +f5124df8471467c6c19087b835871cf4 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +325 + +4-2.html +file + + + + +2010-12-08T21:43:38.000000Z +6f34eb05b3be590e31fabe8fa1bc0d98 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +396 + +140-2.html +file + + + + +2010-12-08T21:43:38.000000Z +3a396d6ba7811846dc720d028e6d13ef +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +565 + +204-1.html +file + + + + +2010-12-08T21:43:38.000000Z +16c1c98039ed3d25b4a59cf31d2b9abb +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +547 + +123-1.html +file + + + + +2010-12-08T21:43:38.000000Z +0f0c6944e3637918a32b85d537c27fa2 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +802 + +221-2.html +file + + + + +2010-12-08T21:43:38.000000Z +51a81cf04d2f47a14bf39f60e2347f07 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +319 + +submit.gif +file + + + + +2010-12-08T21:43:38.000000Z +908ae2005645166e0ee6cb92fa1ba96e +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +1241 + +244-1.html +file + + + + +2010-12-08T21:43:38.000000Z +ad543e673fd532a29eac84bbc57a96ba +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +758 + +180-2.html +file + + + + +2010-12-08T21:43:38.000000Z +e8f231541c453439a1e63e514301c9d2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +330 + +163-1.html +file + + + + +2010-12-08T21:43:38.000000Z +690601e9aebc5385cd5714ffbd850209 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +206 + +261-2.html +file + + + + +2010-12-08T21:43:38.000000Z +86e55e91b47ea22e13c008c5750b7b78 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1483 + +118-2.html +file + + + + +2010-12-08T21:43:38.000000Z +d6becdfac1169318db996219679d908e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +552 + +216-3.html +file + + + + +2010-12-08T21:43:38.000000Z +8ada8c00fac96c4c70f54158006e3a7f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +518 + +205-6.html +file + + + + +2010-12-08T21:43:38.000000Z +0f11e0722a512c96428a44cd4b1542ed +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +536 + +66-12.html +file + + + + +2010-12-08T21:43:38.000000Z +b99f2792ddfef78ae9998aaec34efd5d +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +304 + +273-4.html +file + + + + +2010-12-08T21:43:38.000000Z +7f55f2355c08d8cf52008445013f8fc3 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +426 + +256-3.html +file + + + + +2010-12-08T21:43:38.000000Z +d658b1b9997b15f4a9920d92ab3478dd +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +323 + +239-2.html +file + + + + +2010-12-08T21:43:38.000000Z +1c1b7cfc594103c4261af4a5ea1d5301 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +406 + +198-2.html +file + + + + +2010-12-08T21:43:38.000000Z +7847e870978d74f13d69a15718f897f5 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +876 + +40-1.html +file + + + + +2010-12-08T21:43:38.000000Z +bd4131874ffcec7ce5402ec8917c8d8f +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +484 + +80-1.html +file + + + + +2010-12-08T21:43:38.000000Z +85c8da645d2c4e8690ce2c579fcb626a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +290 + +18-1.html +file + + + + +2010-12-08T21:43:38.000000Z +8afc737bc1dfe2db35ea1a222bb80593 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +252 + +35-2.html +file + + + + +2010-12-08T21:43:38.000000Z +2a5c5f5474f7e026d6d70430dd0a170d +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +324 + +75-2.html +file + + + + +2010-12-08T21:43:38.000000Z +28d6a07c4788839577c2160007253ef7 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +92-3.html +file + + + + +2010-12-08T21:43:38.000000Z +6ffbabbfde7254961caf48b3cd02b868 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +2165 + +58-1.html +file + + + + +2010-12-08T21:43:38.000000Z +52da77cc36dcd1eb0c3bda6d25d9cae2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +427 + +98-1.html +file + + + + +2010-12-08T21:43:38.000000Z +f1df07696aa500710076b29e7e18dd84 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +226 + +230-2.html +file + + + + +2010-12-08T21:43:38.000000Z +7d000c94206256fc943d330db1f44d8f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +948 + +213-1.html +file + + + + +2010-12-08T21:43:38.000000Z +8a2e834869b063dfb579cd5fd59fbf21 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +548 + +132-1.html +file + + + + +2010-12-08T21:43:38.000000Z +a86a8b1e264442979c8a52fd193c1053 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +423 + +121-4.html +file + + + + +2010-12-08T21:43:38.000000Z +770b247fce5986e11b2f6277d4a7eab8 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +516 + +8-3.html +file + + + + +2010-12-08T21:43:38.000000Z +579d0debf826a737581b814c9dd524be +2010-08-01T02:50:07.365909Z +213 +keveemiller + + + + + + + + + + + + + + + + + + + + + +495 + +253-1.html +file + + + + +2010-12-08T21:43:38.000000Z +4ebf7807a14fd9653a356846cfbb376d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +426 + +270-2.html +file + + + + +2010-12-08T21:43:38.000000Z +3663aa1434e3640ab30155687c4ddea0 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +463 + +208-2.html +file + + + + +2010-12-08T21:43:38.000000Z +3879273788e42b37bc7800de9be4a2b4 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +618 + +127-2.html +file + + + + +2010-12-08T21:43:38.000000Z +6dc5f6b6b5aa55e0b0a80a6468d1eb6c +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +223 + +225-3.html +file + + + + +2010-12-08T21:43:38.000000Z +410439eec002dec8c9ad43325876d7b4 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +444 + +214-6.html +file + + + + +2010-12-08T21:43:38.000000Z +52ae669dd2645f8f96b6ac307e46c38f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +520 + +248-2.html +file + + + + +2010-12-08T21:43:39.000000Z +bc2cf2e8d487ae41a12f90dcbb8d7071 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +462 + +167-2.html +file + + + + +2010-12-08T21:43:38.000000Z +dc5165f6216b21cd242aa3cfca8960c6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +209 + +27-1.html +file + + + + +2010-12-08T21:43:39.000000Z +cc843854c9e939cab434c79f3e7d68b1 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +403 + +44-2.html +file + + + + +2010-12-08T21:43:39.000000Z +c0bcc3dfd20d8871a924d6dd9a0dcee1 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +436 + +33-5.html +file + + + + +2010-12-08T21:43:39.000000Z +1b7583b39202739a003fb35456331e2c +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +351 + +16-4.html +file + + + + +2010-12-08T21:43:39.000000Z +c202f1829c05f8f9787fd3db23455876 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +339 + +56-4.html +file + + + + +2010-12-08T21:43:39.000000Z +644c468196816e616f1d94fa9905be70 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +331 + +17-9.html +file + + + + +2010-12-08T21:43:39.000000Z +ef32417a66a402e04e365fe70ca794e0 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +274 + +79-3.html +file + + + + +2010-12-08T21:43:39.000000Z +2a3d5ca4d0684ef49a1b66592821a898 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +329 + +5-1.html +file + + + + +2010-12-08T21:43:39.000000Z +39d2f8c9d61eabe5af55f3005c7c1c32 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +252 + +222-1.html +file + + + + +2010-12-08T21:43:39.000000Z +4abcae0ee423ef12a483a6f2d4a470aa +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +356 + +141-1.html +file + + + + +2010-12-08T21:43:39.000000Z +d4822dcd22d3fba8cc9cfae0dec80d7a +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +532 + +181-1.html +file + + + + +2010-12-08T21:43:39.000000Z +ed3abe53f67c3c244f2a62356a857945 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +270 + +262-1.html +file + + + + +2010-12-08T21:43:39.000000Z +84a8a208dafecfba1a14538ecbb6ddc2 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +927 + +217-2.html +file + + + + +2010-12-08T21:43:39.000000Z +1e61a8ce7141f94d1adc3d9f832a408a +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +568 + +119-1.html +file + + + + +2010-12-08T21:43:39.000000Z +1ec1ebb5000f6db5b5ea8095d945b048 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +516 + +136-2.html +file + + + + +2010-12-08T21:43:39.000000Z +cca5548df52ba28367527bf978d4a33c +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +872 + +6-6.html +file + + + + +2010-12-08T21:43:39.000000Z +1844e2883722e774d312d994e72753ad +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +426 + +206-5.html +file + + + + +2010-12-08T21:43:39.000000Z +987e8a59c624586c5b2182b6fefb3b26 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +515 + +274-3.html +file + + + + +2010-12-08T21:43:39.000000Z +ba466fb6baaf0104ed9e11be01b1764e +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +671 + +176-2.html +file + + + + +2010-12-08T21:43:39.000000Z +fa095a14b765ecce49d326b69939f8ec +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +199 + +257-2.html +file + + + + +2010-12-08T21:43:39.000000Z +eaa4a2d809774f3ee734ad7f18979336 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +357 + +159-1.html +file + + + + +2010-12-08T21:43:39.000000Z +bc6088a70c11406983f352d69e2ac979 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +280 + +246-5.html +file + + + + +2010-12-08T21:43:39.000000Z +910302eb08492ed2f3a3375cce02f4c6 +2010-05-31T17:04:04.429259Z +184 +keveemiller + + + + + + + + + + + + + + + + + + + + + +803 + +199-1.html +file + + + + +2010-12-08T21:43:39.000000Z +e040a3fbb0bd0b0ae4c25d9e1b45aa3a +2010-05-30T23:57:09.912425Z +183 +keveemiller + + + + + + + + + + + + + + + + + + + + + +868 + +188-4.html +file + + + + +2010-12-08T21:43:39.000000Z +e2cfb76b27cf941079c6879612badb90 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +552 + +13-2.html +file + + + + +2010-12-08T21:43:39.000000Z +98ac84d38b53325a41e2578cb56a6a8e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +818 + +53-2.html +file + + + + +2010-12-08T21:43:39.000000Z +c45e059031a1c0dc0e97c1deb4f96dfc +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +363 + +36-1.html +file + + + + +2010-12-08T21:43:39.000000Z +2a5c5f5474f7e026d6d70430dd0a170d +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +324 + +76-1.html +file + + + + +2010-12-08T21:43:39.000000Z +4a5f35c0bbdd2c1095a47cc77166fbca +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +225 + +82-5.html +file + + + + +2010-12-08T21:43:39.000000Z +61d3dfd703765912e64fa0e412a46ee5 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +397 + +110-1.html +file + + + + +2010-12-08T21:43:39.000000Z +48d3df1db82e6f3470a3b8f54bdf961d +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +293 + +66-9.html +file + + + + +2010-12-08T21:43:39.000000Z +34f7995b8a645f9e75e20b280f090215 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +304 + +231-1.html +file + + + + +2010-12-08T21:43:39.000000Z +95ea15c5f4a970405f9663e5e13e20f5 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1086 + +33-10.html +file + + + + +2010-12-08T21:43:39.000000Z +a27986d401abf536a79564e684719916 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +349 + +150-1.html +file + + + + +2010-12-08T21:43:39.000000Z +dee3b06a2a0b889d78364b41b47a2c3c +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +333 + +105-2.html +file + + + + +2010-12-08T21:43:39.000000Z +70e5a14a4a4aa90630b03292bd3a8f9d +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +230 + +220-4.html +file + + + + +2010-12-08T21:43:39.000000Z +360369da0463a7a76d455f3939b4caf5 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +524 + +9-2.html +file + + + + +2010-12-08T21:43:39.000000Z +4b6c40f9970d1f9db43448f507e2bed7 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +501 + +271-1.html +file + + + + +2010-12-08T21:43:39.000000Z +5c4b4725a001835e7f42b97ad29e203b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +476 + +190-1.html +file + + + + +2010-12-08T21:43:39.000000Z +8bff1291cf8c9f449f3cad9f3e8b21c3 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +455 + +145-2.html +file + + + + +2010-12-08T21:43:39.000000Z +a0509b752a510d0254f97d329a54322f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +478 + +209-1.html +file + + + + +2010-12-08T21:43:39.000000Z +651a65ba0cad8182edb041365b94acaa +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +682 + +128-1.html +file + + + + +2010-12-08T21:43:39.000000Z +f5836efb3fc4772d8874a75e4690dbc1 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +252 + +226-2.html +file + + + + +2010-12-08T21:43:39.000000Z +5fb9c4b39e0cad50847f46cc3fde2e2c +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +448 + +fish2.html +file + + + + +2010-12-08T21:43:39.000000Z +d8981d3166d16bb92aefc7e559f93783 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +223 + +249-1.html +file + + + + +2010-12-08T21:43:39.000000Z +e57cf515fe52f89563e91ae650d48a0d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1003 + +266-2.html +file + + + + +2010-12-08T21:43:39.000000Z +e73bbee9585ae861b8ddf461dd02e19a +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +584 + +185-2.html +file + + + + +2010-12-08T21:43:39.000000Z +80fa6c8b7ec0939d53cd31ed9af3a14d +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +799 + +168-1.html +file + + + + +2010-12-08T21:43:39.000000Z +6f40d03565f19abeb3bc9315b4ea7da6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +823 + +174-5.html +file + + + + +2010-12-08T21:43:39.000000Z +ad26992f433f1b2f9899502b6c261724 +2010-07-10T23:33:26.900813Z +203 +keveemiller + + + + + + + + + + + + + + + + + + + + + +425 + +197-4.html +file + + + + +2010-12-08T21:43:39.000000Z +2e0c3d083e09ce4d2569f52a6ebd7577 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +450 + +22-2.html +file + + + + +2010-12-08T21:43:39.000000Z +61bb91d2e399fc49a4c99ce80a7a5284 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +501 + +45-1.html +file + + + + +2010-12-08T21:43:39.000000Z +8d37dcce403214f334fb0391b298509b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +435 + +62-2.html +file + + + + +2010-12-08T21:43:39.000000Z +741c464c3a1a7246423739be2e84a837 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +331 + +17-3.html +file + + + + +2010-12-08T21:43:39.000000Z +259d5b85e369882e6462cda7bae36940 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +274 + +57-3.html +file + + + + +2010-12-08T21:43:40.000000Z +412d1608978d62dbb5c39198ab295c29 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +514 + +200-1.html +file + + + + +2010-12-08T21:43:40.000000Z +242253c0ce5d887fad974c47847cdc99 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +872 + +240-1.html +file + + + + +2010-12-08T21:43:40.000000Z +6c6f5043a04828c64ef477d2cd6f3f61 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +582 + +114-2.html +file + + + + +2010-12-08T21:43:40.000000Z +217a81f25b9a5ee2556cb12d94a24147 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1886 + +212-3.html +file + + + + +2010-12-08T21:43:40.000000Z +6acb0b823a99a383d9d1ccae847ca5b1 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +527 + +218-1.html +file + + + + +2010-12-08T21:43:40.000000Z +2661db94a646aa1c7144379e0010a06c +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +557 + +154-2.html +file + + + + +2010-12-08T21:43:40.000000Z +9c8b6e2b95a696dcf67ea889445d45fa +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +199 + +137-1.html +file + + + + +2010-12-08T21:43:40.000000Z +7e7b09e0098ec5d3c37a5a603b9973fe +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +2013 + +252-3.html +file + + + + +2010-12-08T21:43:40.000000Z +4a8bce4bb318c979f2d14b52940a27b9 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +286 + +235-2.html +file + + + + +2010-12-08T21:43:40.000000Z +3f7476515316f29aa7d04fcd51e69f6f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +495 + +207-4.html +file + + + + +2010-12-08T21:43:40.000000Z +156897c719014e6fc6d92d7138f80c92 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +544 + +275-2.html +file + + + + +2010-12-08T21:43:40.000000Z +83f23b750a6758065f29a0982a9b314d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +434 + +258-1.html +file + + + + +2010-12-08T21:43:40.000000Z +7d76838cddb23b4a3163d63d55123bf9 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +388 + +194-2.html +file + + + + +2010-12-08T21:43:40.000000Z +ffc59a77f8bfe4e49892d12a0e0f87b1 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +588 + +177-1.html +file + + + + +2010-12-08T21:43:40.000000Z +d3206746c6ef9578a5fbabba3563279c +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +216 + +219-6.html +file + + + + +2010-12-08T21:43:40.000000Z +2f1ab8a1f891405532fd3fe5055e2fd5 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +520 + +208-9.html +file + + + + +2010-12-08T21:43:40.000000Z +8f9797d8001e3bbf71a927d78d771290 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +603 + +14-1.html +file + + + + +2010-12-08T21:43:40.000000Z +a6c5c4d0c4a1877645531129925defd6 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +562 + +31-2.html +file + + + + +2010-12-08T21:43:40.000000Z +02b54e8017c94468198f1cbe72690d82 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +445 + +20-5.html +file + + + + +2010-12-08T21:43:40.000000Z +1e1c7ee561bd1f0ab8b9d883e8e157b7 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +246 + +71-2.html +file + + + + +2010-12-08T21:43:40.000000Z +9b110563dcac8197f5f4376388e32038 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +54-1.html +file + + + + +2010-12-08T21:43:40.000000Z +e19fbb611ee2369c12b293c7f0c19655 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +503 + +94-1.html +file + + + + +2010-12-08T21:43:41.000000Z +32d14c66d9bd11af3a02402adaedffbf +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +258 + +49-2.html +file + + + + +2010-12-08T21:43:41.000000Z +427188f5cf32b4d659fc71a28c1cf1e1 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +363 + +66-3.html +file + + + + +2010-12-08T21:43:41.000000Z +55f8876260a6aefb6a672bb781163d81 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +304 + +89-2.html +file + + + + +2010-12-08T21:43:41.000000Z +cc4534657dca7602c151cdfb35c167e8 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +135-2.xhtml +file + + + + +2010-12-08T21:43:41.000000Z +ae636636e08c6164141e8e952e04498f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1158 + +106-1.html +file + + + + +2010-12-08T21:43:42.000000Z +e97c1235351d5cc755da9769b4f9476e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +247 + +123-2.html +file + + + + +2010-12-08T21:43:41.000000Z +3407394a0b93a3ab67840f244383d29d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +747 + +204-2.html +file + + + + +2010-12-08T21:43:41.000000Z +15242777aa1105f1419d421e8d1a06b1 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +552 + +221-3.html +file + + + + +2010-12-08T21:43:41.000000Z +af815e24085823a62ce4aa7c4594cf0a +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +286 + +140-3.html +file + + + + +2010-12-08T21:43:41.000000Z +e09393a7f620a21f9287f0c843ac2c2f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +566 + +go.gif +file + + + + +2010-12-08T21:43:42.000000Z +8c8101a81ec079d0f44430926a7c4985 +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +2194 + +227-1.html +file + + + + +2010-12-08T21:43:43.000000Z +676a258347c2404ce8007bbbf46dd9e6 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +448 + +244-2.html +file + + + + +2010-12-08T21:43:43.000000Z +936a54759e8c821ce723605b69f771aa +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +844 + +261-3.html +file + + + + +2010-12-08T21:43:43.000000Z +b5e78a07456bff9695e3afbc35960c90 +2010-07-10T23:32:25.522660Z +202 +keveemiller + + + + + + + + + + + + + + + + + + + + + +541 + +163-2.html +file + + + + +2010-12-08T21:43:43.000000Z +05e1dec6eaaba727ede92f7e1fa75a8e +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +324 + +146-1.html +file + + + + +2010-12-08T21:43:42.000000Z +b8689f8f17a5094543cbc4d3876441a8 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +222 + +118-3.html +file + + + + +2010-12-08T21:43:43.000000Z +b4732ad761a98c500f4e2a3f08d856d2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +528 + +216-4.html +file + + + + +2010-12-08T21:43:43.000000Z +a4843824189e855369d9a2967812cb98 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +522 + +186-1.html +file + + + + +2010-12-08T21:43:43.000000Z +0af6b7d221c3a39a3029512c507b5ba2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +320 + +267-1.html +file + + + + +2010-12-08T21:43:43.000000Z +c4590cbc8285a9a174f92bc6d9abcba0 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +916 + +239-3.html +file + + + + +2010-12-08T21:43:43.000000Z +4600e7cdfcbd8bf4e514047b2c8d3e81 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +397 + +40-2.html +file + + + + +2010-12-08T21:43:43.000000Z +f6420a2f97d4bc65039f37a4a4671470 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +487 + +23-1.html +file + + + + +2010-12-08T21:43:43.000000Z +fce6daa562030b87fcad76767c3ecc31 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +215 + +80-2.html +file + + + + +2010-12-08T21:43:43.000000Z +50335b5bb2a74677885c628f1e5cf3c6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +353 + +63-1.html +file + + + + +2010-12-08T21:43:43.000000Z +5ce327a14c8b70fecc841e1527c6d6af +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +385 + +18-2.html +file + + + + +2010-12-08T21:43:43.000000Z +c3e6be20f69f2ab6efc50dd60d847400 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +254 + +58-2.html +file + + + + +2010-12-08T21:43:43.000000Z +80f8b1a75a529a2ff64fb34909e810fe +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +443 + +1-1.html +file + + + + +2010-12-08T21:43:44.000000Z +cecc9c82f42ea89dd67a477c62468e0e +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +400 + +rex.html +file + + + + +2010-12-08T21:43:43.000000Z +7d7ea40f135d0836c5314b6eeb8e3e99 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +433 + +98-2.html +file + + + + +2010-12-08T21:43:44.000000Z +58ae3e391db1ddd0bf0f10c00d95a2c2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +211 + +213-2.html +file + + + + +2010-12-08T21:43:44.000000Z +52213470dc25c56dd7336b4192051cd2 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +554 + +132-2.html +file + + + + +2010-12-08T21:43:44.000000Z +2a714a43f92e49f244d6dd8b78a91769 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +549 + +115-1.html +file + + + + +2010-12-08T21:43:44.000000Z +73452d2d0d3e07797cb0bc9195a35c03 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1916 + +253-2.html +file + + + + +2010-12-08T21:43:44.000000Z +17cb676d656f5afabaeb2bda53f2acb1 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +426 + +8-4.html +file + + + + +2010-12-08T21:43:44.000000Z +26e68776a34074b13e08276aab619fea +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +465 + +236-1.html +file + + + + +2010-12-08T21:43:44.000000Z +5ca2f8cc630b77c74fd9d41c6f9fd24f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +497 + +208-3.html +file + + + + +2010-12-08T21:43:45.000000Z +beee5fd6fa2697c5a1c994a5253221fe +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +615 + +225-4.html +file + + + + +2010-12-08T21:43:45.000000Z +170fb5c8596bacdcc1070f342a1c6f37 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +276 + +276-1.html +file + + + + +2010-12-08T21:43:45.000000Z +c88a31080bda973ec301a88b202dae43 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +587 + +195-1.html +file + + + + +2010-12-08T21:43:45.000000Z +22704e4164d71b231e25397ba8519268 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +342 + +248-3.html +file + + + + +2010-12-08T21:43:45.000000Z +6dea24f3852dbcfd4ec96c719fd11b09 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +461 + +32-1.html +file + + + + +2010-12-08T21:43:45.000000Z +7ca94fc325f274c5b3f310db08e951b8 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +395 + +72-1.html +file + + + + +2010-12-08T21:43:45.000000Z +089273e7970806c635dac0dac4e8d33d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +446 + +27-2.html +file + + + + +2010-12-08T21:43:45.000000Z +e0407a20b5724907dbb404c295ccac47 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +381 + +33-6.html +file + + + + +2010-12-08T21:43:45.000000Z +2de951290bf5f3db499b0473db9994c5 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +349 + +5-2.html +file + + + + +2010-12-08T21:43:45.000000Z +55cd56fddccec3744c336c36069789f5 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +251 + +205-1.html +file + + + + +2010-12-08T21:43:45.000000Z +6d90b7a9101d0b0700b8a145065149fc +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +569 + +141-2.html +file + + + + +2010-12-08T21:43:45.000000Z +7b31501b36becf336c3f39fc238af1d8 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +543 + +124-1.html +file + + + + +2010-12-08T21:43:45.000000Z +e1afef77aad39aab42302670a5dd17f1 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +657 + +222-2.html +file + + + + +2010-12-08T21:43:45.000000Z +3b70a19232b1da0108b5342a59018c35 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +356 + +245-1.html +file + + + + +2010-12-08T21:43:46.000000Z +bc3c669851e4d49d6a6d6c61e6d9bfde +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +832 + +164-1.html +file + + + + +2010-12-08T21:43:46.000000Z +d6c914a08d3501329335cbb26aa8ae63 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +282 + +262-2.html +file + + + + +2010-12-08T21:43:45.000000Z +041fcb98e9e87487c08f539147c91c72 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1155 + +181-2.html +file + + + + +2010-12-08T21:43:45.000000Z +286e74aa75866426988bf50c02740ef8 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +312 + +6-7.html +file + + + + +2010-12-08T21:43:46.000000Z +78ae6b8a69ecfeb5b31a9a16e398f6ff +2010-07-17T18:49:14.548332Z +204 +keveemiller + + + + + + + + + + + + + + + + + + + + + +395 + +119-2.html +file + + + + +2010-12-08T21:43:46.000000Z +d9be5c59b0225a03928702c74f60064e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +540 + +217-3.html +file + + + + +2010-12-08T21:43:46.000000Z +d463689222576ef4665136783609edc5 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +539 + +206-6.html +file + + + + +2010-12-08T21:43:46.000000Z +4bc074d71eaa4484f35ff1611311d92a +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +520 + +159-2.html +file + + + + +2010-12-08T21:43:46.000000Z +425a8bde86afe0182ce6570a20b40d14 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +256 + +274-4.html +file + + + + +2010-12-08T21:43:46.000000Z +061bbc71b2b0a2a2d6360faa5d4dc7fd +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +705 + +257-3.html +file + + + + +2010-12-08T21:43:46.000000Z +5fb948410632eba669f9ba27e271c343 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +323 + +199-2.html +file + + + + +2010-12-08T21:43:47.000000Z +47d936a258dd0e6f81b5e53d4939ca39 +2010-05-30T23:57:09.912425Z +183 +keveemiller + + + + + + + + + + + + + + + + + + + + + +887 + +188-5.html +file + + + + +2010-12-08T21:43:47.000000Z +e03ff3150affbc30949a2ae36dacfabf +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +561 + +41-1.html +file + + + + +2010-12-08T21:43:47.000000Z +2a5bbbf2c4a357287e1b93e1de906cb2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +256 + +13-3.html +file + + + + +2010-12-08T21:43:47.000000Z +31012f04d088e96c4a6168827dc9a902 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +786 + +81-1.html +file + + + + +2010-12-08T21:43:47.000000Z +a2828b738a0820e290187ede9d8ac23b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +230 + +53-3.html +file + + + + +2010-12-08T21:43:47.000000Z +dbbfd79d074a93a669b7e08af84f1b10 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +352 + +36-2.html +file + + + + +2010-12-08T21:43:47.000000Z +1163633274e381723ef021e347a7d8e3 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +279 + +19-1.html +file + + + + +2010-12-08T21:43:47.000000Z +640098bf08950ecc7bf117e3fd63ba4a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +360 + +76-2.html +file + + + + +2010-12-08T21:43:47.000000Z +f3f0524adbae86e72831a3728ab7e8b0 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +59-1.html +file + + + + +2010-12-08T21:43:47.000000Z +8edebf921b3dde5a5ee66621b4497b24 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +462 + +82-6.html +file + + + + +2010-12-08T21:43:47.000000Z +9a68e0e05de56b1f9620a804bda11ad4 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +403 + +99-1.html +file + + + + +2010-12-08T21:43:47.000000Z +f317ce14b0328932ac46b4d0fcf3f3c9 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +226 + +110-2.html +file + + + + +2010-12-08T21:43:47.000000Z +861f098aaeb803910e991d5ea5896219 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +316 + +133-1.html +file + + + + +2010-12-08T21:43:48.000000Z +761398a6d7c31c4178f5ff203e825b59 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +540 + +150-2.html +file + + + + +2010-12-08T21:43:47.000000Z +c7da30533d461426cf15c9c27b7266d6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +275 + +231-2.html +file + + + + +2010-12-08T21:43:47.000000Z +b88ef3a3dfea38b58421e1d042b8a345 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +508 + +214-1.html +file + + + + +2010-12-08T21:43:47.000000Z +d97d3e900e6da69b572a093420e080ba +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +565 + +220-5.html +file + + + + +2010-12-08T21:43:48.000000Z +ef383c091fec6d2b164464bfd5d23313 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +542 + +271-2.html +file + + + + +2010-12-08T21:43:49.000000Z +918b58fdd5214d2a2728c94502b1428c +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +486 + +254-1.html +file + + + + +2010-12-08T21:43:48.000000Z +f30e725b35f87503649a8c4abda5c1d0 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +319 + +173-1.html +file + + + + +2010-12-08T21:43:48.000000Z +333ff9a021a93f86796d60f53e9592e0 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +265 + +190-2.html +file + + + + +2010-12-08T21:43:48.000000Z +076e1114238ebe65adb1bea0789aca66 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +475 + +226-3.html +file + + + + +2010-12-08T21:43:50.000000Z +b39474b4765fd00f3a08ac209c87a0ae +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +415 + +145-3.html +file + + + + +2010-12-08T21:43:50.000000Z +a4c1223ba237317db9800b90ec6864de +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +428 + +209-2.html +file + + + + +2010-12-08T21:43:50.000000Z +97cc1ee72c0823c5f9395d2220665fb4 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +617 + +128-2.html +file + + + + +2010-12-08T21:43:49.000000Z +5e5ab408d45b0fcc5dde4436bfef28e5 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +223 + +168-2.html +file + + + + +2010-12-08T21:43:51.000000Z +d9c9cfbae0373a0aa57ef8bfa6e53918 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +876 + +249-2.html +file + + + + +2010-12-08T21:43:50.000000Z +3ff8d140d88c5a3fe8edc2c68fe3b09b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1083 + +10-1.html +file + + + + +2010-12-08T21:43:51.000000Z +8fea23cc8699f2bdc0f8cc07934f9ab7 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +283 + +50-1.html +file + + + + +2010-12-08T21:43:51.000000Z +8bf72237886a07d46a6f0d7cce1903c5 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +327 + +197-5.html +file + + + + +2010-12-08T21:43:51.000000Z +c01e8ec8b11bc64012abb94fadbe1747 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +535 + +90-1.html +file + + + + +2010-12-08T21:43:51.000000Z +edf65af846cec89be8079257c5ca2ac4 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +208 + +28-1.html +file + + + + +2010-12-08T21:43:52.000000Z +cc7d5d8b11f63b8cf637896bb89cf459 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +752 + +45-2.html +file + + + + +2010-12-08T21:43:52.000000Z +6c1ebfe4cc0c13015b9fe3fb22f9a18b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +436 + +62-3.html +file + + + + +2010-12-08T21:43:51.000000Z +cdcbb8c5b85e7722fc87d336debf47de +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +325 + +17-4.html +file + + + + +2010-12-08T21:43:52.000000Z +628545dcc9f227c6ae7a202f6ac62f68 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +274 + +68-1.html +file + + + + +2010-12-08T21:43:52.000000Z +24e649ed41b381c2a0ae12da2ef5f898 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +328 + +57-4.html +file + + + + +2010-12-08T21:43:52.000000Z +9e742be9ea16e44f3eedba03f9df51e2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +509 + +200-2.html +file + + + + +2010-12-08T21:43:52.000000Z +91e762e3a0ae109fca2ed66497aa6011 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +876 + +102-1.html +file + + + + +2010-12-08T21:43:52.000000Z +9b43de112b87e179f11930b784547e94 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +246 + +6-1.html +file + + + + +2010-12-08T21:43:52.000000Z +afa65e95fdcd1bf446850a449956283b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +270 + +142-1.html +file + + + + +2010-12-08T21:43:53.000000Z +f18df79aeb58876251d7af2f8cf1a6c4 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +528 + +240-2.html +file + + + + +2010-12-08T21:43:53.000000Z +38958322004bc960c6bfa62eff9255b8 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1105 + +223-1.html +file + + + + +2010-12-08T21:43:52.000000Z +bb392821d2a74218957d11333faf2a06 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +357 + +114-3.html +file + + + + +2010-12-08T21:43:53.000000Z +9f3d4d953405069f3c5c17d9b9de4648 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1875 + +212-4.html +file + + + + +2010-12-08T21:43:53.000000Z +cff56a3629895d12824cdb878ecbd05d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +535 + +263-1.html +file + + + + +2010-12-08T21:43:53.000000Z +fb59c0fe545836058e084a2dd33245b3 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +382 + +182-1.html +file + + + + +2010-12-08T21:43:53.000000Z +67d7d694fe88d39be2dd5603993e7cc2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +245 + +137-2.html +file + + + + +2010-12-08T21:43:53.000000Z +379cba1b2aeac4cbfc5885496e7d2b21 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +2013 + +218-2.html +file + + + + +2010-12-08T21:43:53.000000Z +8a5bd406acdbd42132276fe106e62c27 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +554 + +207-5.html +file + + + + +2010-12-08T21:43:53.000000Z +d0fd0c18812159ce067a4ceb816a36d4 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +522 + +177-2.html +file + + + + +2010-12-08T21:43:53.000000Z +c6c6c92f0266971e69ee59cc92fcf0cd +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +199 + +258-2.html +file + + + + +2010-12-08T21:43:53.000000Z +419de705c6514b2794a73566d3b49167 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +387 + +14-2.html +file + + + + +2010-12-08T21:43:53.000000Z +52d59d0e88eb77ffad1b06063c8c0def +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +587 + +20-6.html +file + + + + +2010-12-08T21:43:53.000000Z +64508eeeae3f7670a0d017ff071eaf28 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +246 + +54-2.html +file + + + + +2010-12-08T21:43:54.000000Z +b9017ddb46fa2c5e18027ce484781eb7 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +483 + +37-1.html +file + + + + +2010-12-08T21:43:54.000000Z +1ce859fd123d2755adee17eb053a2474 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +484 + +94-2.html +file + + + + +2010-12-08T21:43:54.000000Z +ba180a2b4f5e359f969c5608aa154f21 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +77-1.html +file + + + + +2010-12-08T21:43:54.000000Z +330834c10b64ec075086af599882e30c +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +221 + +66-4.html +file + + + + +2010-12-08T21:43:54.000000Z +526ce6bdc2dac5d5a8ef0441c85175d6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +304 + +111-1.html +file + + + + +2010-12-08T21:43:54.000000Z +8fb9a6c755f810ce676bf163cafa58eb +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +778 + +151-1.html +file + + + + +2010-12-08T21:43:54.000000Z +cfbfdd033f6d43449eb007fbd1adbd89 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +872 + +232-1.html +file + + + + +2010-12-08T21:43:54.000000Z +e1129ed77895598789831beab93f1755 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +374 + +204-3.html +file + + + + +2010-12-08T21:43:54.000000Z +1993b540ed16c1f27320be14eb009fbe +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +514 + +221-4.html +file + + + + +2010-12-08T21:43:54.000000Z +e939f2c57f2fd51108a08fde67afc0ad +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +522 + +106-2.html +file + + + + +2010-12-08T21:43:55.000000Z +d1c90a7677f64a0a89f24ef58087cfc2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +260 + +272-1.html +file + + + + +2010-12-08T21:43:55.000000Z +f33b527d48be1a30d09e3f74a7b46878 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +643 + +191-1.html +file + + + + +2010-12-08T21:43:55.000000Z +ade211db2e2360fc521a25d555b994b1 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +480 + +129-1.html +file + + + + +2010-12-08T21:43:55.000000Z +888dc8928f987575806c47956b138d16 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +252 + +146-2.html +file + + + + +2010-12-08T21:43:55.000000Z +fffd479fe93620cf8cbbb7b4fafa6d90 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +209 + +227-2.html +file + + + + +2010-12-08T21:43:55.000000Z +f05f5152fd182336c5004b0729f8639e +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +448 + +163-3.html +file + + + + +2010-12-08T21:43:55.000000Z +02644686c537e73fb53ab9995226304f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +320 + +118-4.html +file + + + + +2010-12-08T21:43:55.000000Z +8db2bc417fb6a42da0ee83aac99165a9 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +522 + +216-5.html +file + + + + +2010-12-08T21:43:55.000000Z +85e5bf5108d92b3b41456407c4bd0d8d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +511 + +186-2.html +file + + + + +2010-12-08T21:43:55.000000Z +ccb43bb813c613ed017719c02f87fbd2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +321 + +169-1.html +file + + + + +2010-12-08T21:43:56.000000Z +ceb65faf694ea4689a9db7ed4fccaa45 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +744 + +267-2.html +file + + + + +2010-12-08T21:43:56.000000Z +671716186dc3c25ca64ef93fa3a51485 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +937 + +23-2.html +file + + + + +2010-12-08T21:43:56.000000Z +e303e393189e573d823ea417d6c7253b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +252 + +63-2.html +file + + + + +2010-12-08T21:43:56.000000Z +6c4fb166597c635e0caa45c2e8ff0e3b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +408 + +46-1.html +file + + + + +2010-12-08T21:43:56.000000Z +b0faf1ea521c920fd1ab6ab596e89752 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +435 + +80-3.html +file + + + + +2010-12-08T21:43:56.000000Z +3274886afa722249d4876907b0ea9eff +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +313 + +18-3.html +file + + + + +2010-12-08T21:43:56.000000Z +b6a889f663baa84393ff5a95593d431e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +253 + +86-1.html +file + + + + +2010-12-08T21:43:56.000000Z +3e00be520f52cc7a53fcd20ae9e3a485 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +258 + +1-2.html +file + + + + +2010-12-08T21:43:56.000000Z +57743c049e28b12a67f8f3079dde8859 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +440 + +201-1.html +file + + + + +2010-12-08T21:43:56.000000Z +969785aaf27684acf1fcc046c9f5965b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +418 + +120-1.html +file + + + + +2010-12-08T21:43:56.000000Z +0c7243ea7d7b6b6137f97a9970f09651 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +518 + +98-3.html +file + + + + +2010-12-08T21:43:56.000000Z +56a8f7ebfe662871bc7f4cb59e31e223 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +283 + +160-1.html +file + + + + +2010-12-08T21:43:56.000000Z +16ba5693c9f991ca34d91fe72d482db6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +209 + +241-1.html +file + + + + +2010-12-08T21:43:56.000000Z +984a666e350a7f20d54fb90026696722 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +638 + +213-3.html +file + + + + +2010-12-08T21:43:56.000000Z +d4c933d271d47af28c64575da8e1952b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +518 + +115-2.html +file + + + + +2010-12-08T21:43:56.000000Z +30c07080dc9867d6f6f4062e738991d5 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1875 + +236-2.html +file + + + + +2010-12-08T21:43:56.000000Z +8332b83bda08b1f33863bb8620fe286d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +455 + +219-1.html +file + + + + +2010-12-08T21:43:56.000000Z +4cb438b10930472a342def6723cfc224 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +583 + +8-5.html +file + + + + +2010-12-08T21:43:56.000000Z +da20f94265edd6461d9c6c11b5226c24 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +453 + +138-1.html +file + + + + +2010-12-08T21:43:56.000000Z +885414f077e40c495f0458b7c7898016 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +550 + +208-4.html +file + + + + +2010-12-08T21:43:56.000000Z +085eb0a5492ec39b2c564ee9bfac09af +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +591 + +225-5.html +file + + + + +2010-12-08T21:43:56.000000Z +46fdb93d8f6ee08318e601504bbcef6c +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +275 + +195-2.html +file + + + + +2010-12-08T21:43:56.000000Z +558698003f6fca9b700db7a1b028257a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +334 + +276-2.html +file + + + + +2010-12-08T21:43:56.000000Z +31b6dbcce9e1ae6be88e361fa521f9c4 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +586 + +259-1.html +file + + + + +2010-12-08T21:43:56.000000Z +03798955dab83f9eb0e1b03d06ee6f87 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +390 + +178-1.html +file + + + + +2010-12-08T21:43:56.000000Z +13deb0def6d5ca2f7d185bbcba9475fd +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +365 + +15-1.html +file + + + + +2010-12-08T21:43:56.000000Z +df50d285471e2805032b5cffb0610e37 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +376 + +32-2.html +file + + + + +2010-12-08T21:43:56.000000Z +8bf877cd51541b45f3d7b31d48131818 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +402 + +55-1.html +file + + + + +2010-12-08T21:43:56.000000Z +9cc5362bd5783fd40972a7920c161105 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +286 + +72-2.html +file + + + + +2010-12-08T21:43:56.000000Z +caf7542cf9d2e0af8b60c97c905783d9 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +445 + +33-7.html +file + + + + +2010-12-08T21:43:56.000000Z +a62d35f7ec39789b63912100239c981f +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +350 + +fish.gif +file + + + + +2010-12-08T21:43:57.000000Z +e080c96828d81e605933caf1bb1f1926 +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +1724 + +95-1.html +file + + + + +2010-12-08T21:43:57.000000Z +c8f7fa9da6839cc20c1bd023571e6bcb +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +531 + +5-3.html +file + + + + +2010-12-08T21:43:57.000000Z +6e0f8260da723cd9885df59a4d16320e +2010-05-23T22:11:15.425051Z +174 +keveemiller + + + + + + + + + + + + + + + + + + + + + +230 + +250-1.html +file + + + + +2010-12-08T21:43:57.000000Z +d6f3c4ad9b500205242e7d850aa8ffe8 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +558 + +107-1.html +file + + + + +2010-12-08T21:43:57.000000Z +c2a555e31762fd4974cac4c14842e353 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +248 + +222-3.html +file + + + + +2010-12-08T21:43:57.000000Z +b39918c1e74e1745509c0dd00d9bc31d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +323 + +205-2.html +file + + + + +2010-12-08T21:43:57.000000Z +cd9203ad408bea136e0a03c5c26aac32 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +552 + +141-3.html +file + + + + +2010-12-08T21:43:57.000000Z +6e653abdc8b67f5238ffc415b336f983 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +544 + +124-2.html +file + + + + +2010-12-08T21:43:57.000000Z +6ce7baf392ed6035e2da10dc4871eb2a +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +630 + +245-2.html +file + + + + +2010-12-08T21:43:57.000000Z +67310f960aa9be4994622b55a92c2920 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1460 + +228-1.html +file + + + + +2010-12-08T21:43:57.000000Z +83a0d962ab8a153d3dfb348cd782b433 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +449 + +147-1.html +file + + + + +2010-12-08T21:43:57.000000Z +609338f2df6297817fe59409020d561b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +382 + +164-2.html +file + + + + +2010-12-08T21:43:57.000000Z +4457ead521dd85a1d41e5db1e3eb25e3 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +231 + +119-3.html +file + + + + +2010-12-08T21:43:57.000000Z +36c4e7326a6d79761abe4b7029977501 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +507 + +217-4.html +file + + + + +2010-12-08T21:43:57.000000Z +e8be5ecce52b9130978558ed821abc0b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +544 + +187-1.html +file + + + + +2010-12-08T21:43:57.000000Z +68b34d5602e17752df513b38b1df2f43 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +371 + +268-1.html +file + + + + +2010-12-08T21:43:57.000000Z +003b144ebf1f479617a659fc813214fc +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +711 + +274-5.html +file + + + + +2010-12-08T21:43:57.000000Z +6914562d8dda93b72add2fd76d908af8 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +788 + +renew.gif +file + + + + +2010-12-08T21:43:57.000000Z +3cdbbe222e22f5a7bfb18879e131b5f9 +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +1458 + +24-1.html +file + + + + +2010-12-08T21:43:57.000000Z +dc2ea3c655f683abb654923cd5af2ce5 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +208 + +41-2.html +file + + + + +2010-12-08T21:43:57.000000Z +9c694396947a83422e93c2548b48d93b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +256 + +81-2.html +file + + + + +2010-12-08T21:43:57.000000Z +c6e59072550a0d4f00938919ecd68e42 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +253 + +64-1.html +file + + + + +2010-12-08T21:43:57.000000Z +5518bb92df60c6d71431a0b026dea18f +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +468 + +53-4.html +file + + + + +2010-12-08T21:43:57.000000Z +b848b4b5eaba959ef5fb65ad4a524ea8 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +360 + +19-2.html +file + + + + +2010-12-08T21:43:57.000000Z +5a0636b9d0dbe715c6f57ccf5fe95ceb +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +359 + +59-2.html +file + + + + +2010-12-08T21:43:57.000000Z +bb7d5592ea39255e65ddcc08a3effeeb +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +445 + +82-7.html +file + + + + +2010-12-08T21:43:57.000000Z +1210b6adde96945f2766513989869d12 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +234 + +2-1.html +file + + + + +2010-12-08T21:43:57.000000Z +b99e6ec888f3799ed434be674b860e69 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +232 + +99-2.html +file + + + + +2010-12-08T21:43:57.000000Z +dc6c0b5fe1663a66a59a912782cf9b74 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +208 + +133-2.html +file + + + + +2010-12-08T21:43:57.000000Z +a74e80c76dc3b6c5a5bb8dff14440fec +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +540 + +214-2.html +file + + + + +2010-12-08T21:43:58.000000Z +13f6e7d8feecd6b3d5f868f95083fd4e +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +544 + +116-1.html +file + + + + +2010-12-08T21:43:58.000000Z +f6a76613b2e8c63f235d03de6f81ab61 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +465 + +220-6.html +file + + + + +2010-12-08T21:43:58.000000Z +5b0dbd516bcfa44564267e86bb16cfc8 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +517 + +173-2.html +file + + + + +2010-12-08T21:43:58.000000Z +875c64f45223f2aed4bd5c5e70a7b3bb +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +277 + +237-1.html +file + + + + +2010-12-08T21:43:58.000000Z +af13b5102b10940d4a3e87804e450fbb +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +588 + +254-2.html +file + + + + +2010-12-08T21:43:58.000000Z +76f6522b1ddafd11ef7f2ddcef5a4cf9 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +319 + +145-4.html +file + + + + +2010-12-08T21:43:58.000000Z +080910d1b7bca625db27dce1f5758b29 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +428 + +196-1.html +file + + + + +2010-12-08T21:43:58.000000Z +a468ee03d195696f2bc4239085bbf2ed +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +506 + +168-3.html +file + + + + +2010-12-08T21:43:58.000000Z +141d7c3d20410c34f0b3ae00fdfe0c50 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +495 + +10-2.html +file + + + + +2010-12-08T21:43:58.000000Z +b6556f981dce1369a47aa7a8884c006e +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +273 + +33-1.html +file + + + + +2010-12-08T21:43:58.000000Z +62db45d9bc0f683d4c56ec65ea55e2e8 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +442 + +50-2.html +file + + + + +2010-12-08T21:43:58.000000Z +066b7e9c689e8be273a1ad37443a60ba +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +381 + +73-1.html +file + + + + +2010-12-08T21:43:58.000000Z +a317a950f9f5d792ae7bb66bcf6a0c9a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +208 + +90-2.html +file + + + + +2010-12-08T21:43:58.000000Z +f13d4b5446db90c109cf348f5ef10bbe +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +267 + +62-4.html +file + + + + +2010-12-08T21:43:58.000000Z +3d3abf41c17362d0cdd452fabcd0a75d +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +329 + +28-2.html +file + + + + +2010-12-08T21:43:58.000000Z +90013412ad142cd26b8fdff6ee63307d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +912 + +17-5.html +file + + + + +2010-12-08T21:43:58.000000Z +47ae293f2d1e7c42fbcd46d31e0aa626 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +274 + +68-2.html +file + + + + +2010-12-08T21:43:58.000000Z +3f8f6fd5e1fb97dc66b24eb7476c24e8 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +335 + +welcome.gif +file + + + + +2010-12-08T21:43:58.000000Z +d369e18ace89fca666d4cbaf91e4cc0d +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +987 + +102-2.html +file + + + + +2010-12-08T21:43:58.000000Z +ad9683128ef42617e4e179c88f2af1cb +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +261 + +6-2.html +file + + + + +2010-12-08T21:43:58.000000Z +25225c22253fcfd01bc18a6e6bf0bba7 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +436 + +142-2.html +file + + + + +2010-12-08T21:43:58.000000Z +85596e8a8e1597ec5a112209fbdb6c20 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +539 + +206-1.html +file + + + + +2010-12-08T21:43:59.000000Z +6461b0dcb2484f6dd0d909ad5519def7 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +551 + +125-1.html +file + + + + +2010-12-08T21:43:59.000000Z +1d62321fa8f6756f7250baf9802e133e +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +802 + +223-2.html +file + + + + +2010-12-08T21:43:59.000000Z +15837fb9e34cd209e3fde20b13d6d5c7 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +357 + +212-5.html +file + + + + +2010-12-08T21:43:59.000000Z +4a96f324c24e8f7054eb587f6b88b7d6 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +540 + +165-1.html +file + + + + +2010-12-08T21:43:59.000000Z +0e429cf9b268683b7ce2d21f1c90fbf6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +282 + +263-2.html +file + + + + +2010-12-08T21:43:59.000000Z +c7eec547246083258000f389236e90df +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +382 + +246-1.html +file + + + + +2010-12-08T21:43:59.000000Z +e64f863a772b048fb120ef3e19e1486f +2010-05-30T23:57:09.912425Z +183 +keveemiller + + + + + + + + + + + + + + + + + + + + + +729 + +182-2.html +file + + + + +2010-12-08T21:43:59.000000Z +99968d869808a76bc44a069df076511a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +217 + +218-3.html +file + + + + +2010-12-08T21:43:59.000000Z +c0ad542bc3e7231fba5705047b970189 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +526 + +207-6.html +file + + + + +2010-12-08T21:43:59.000000Z +c0da73784c57b23a4d7dc9332da1d21f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +538 + +42-1.html +file + + + + +2010-12-08T21:43:59.000000Z +f799f451d92bdd52fea7447bd0514407 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +435 + +14-3.html +file + + + + +2010-12-08T21:43:59.000000Z +e9c7c9fe11a43a3947905a46802c8809 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +550 + +82-1.html +file + + + + +2010-12-08T21:43:59.000000Z +3b36357f9eae1a1937d51435b21228dc +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +407 + +37-2.html +file + + + + +2010-12-08T21:43:59.000000Z +f7d7cd3e52ba3a647c10ce870d3303e2 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +487 + +77-2.html +file + + + + +2010-12-08T21:43:59.000000Z +d7b2c3e8cf597515a114b0d82260fe3c +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +66-5.html +file + + + + +2010-12-08T21:43:59.000000Z +e7554799c58f1fb3bd559747ec0f83e0 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +304 + +rex.gif +file + + + + +2010-12-08T21:43:59.000000Z +1716343054ae42a4e4978b19f4a5e165 +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +17464 + +111-2.html +file + + + + +2010-12-08T21:43:59.000000Z +7be7a3c74e659d83c73657b426b2d211 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1063 + +134-1.html +file + + + + +2010-12-08T21:43:59.000000Z +1e3d4a712df5c2066a6164402de24ede +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +301 + +151-2.html +file + + + + +2010-12-08T21:43:59.000000Z +6fbc49cc1140a3b59de9f7956f51bc8c +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +918 + +232-2.html +file + + + + +2010-12-08T21:43:59.000000Z +a2019d64002b18eaa0baf416bf82cf67 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +323 + +221-5.html +file + + + + +2010-12-08T21:43:59.000000Z +35b6268d62e56ef2782ae43203e6a674 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +541 + +204-4.html +file + + + + +2010-12-08T21:43:59.000000Z +70ad8c83f08cf6baff596ac48e559822 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +519 + +174-1.html +file + + + + +2010-12-08T21:43:59.000000Z +a16b0bfec100e37573f21d0f0dfe99f6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +420 + +272-2.html +file + + + + +2010-12-08T21:43:59.000000Z +b5e7a0d4464225c5e522118af021d283 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +792 + +255-1.html +file + + + + +2010-12-08T21:43:59.000000Z +38602f2a73ae51fdcc49b6ee4e26ccfc +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +356 + +191-2.html +file + + + + +2010-12-08T21:43:59.000000Z +ceba7dc196a3d244a59f330bb2fddfa3 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +475 + +129-2.html +file + + + + +2010-12-08T21:43:59.000000Z +9cce7dddab9eb174b874a4a246d73a10 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +223 + +227-3.html +file + + + + +2010-12-08T21:43:59.000000Z +f97a738c2458e313bb637c1e7d9d48e1 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +415 + +216-6.html +file + + + + +2010-12-08T21:43:59.000000Z +4550e243d9e2cf29717a55145b52b352 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +516 + +169-2.html +file + + + + +2010-12-08T21:43:59.000000Z +0fc7eef6d61507418987e75a541c2855 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1114 + +11-1.html +file + + + + +2010-12-08T21:43:59.000000Z +7d773f280276a6fcb68a5e4da34f4a92 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +439 + +51-1.html +file + + + + +2010-12-08T21:43:59.000000Z +c49df72c41110c5e0e3291a8a56f229e +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +343 + +image.gif +file + + + + +2010-12-08T21:43:59.000000Z +3cbceab9d56cc4ac58232bbbb20ce82d +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +591 + +23-3.html +file + + + + +2010-12-08T21:44:00.000000Z +aa3d6872f62cce558d48a8823c8602dd +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +209 + +91-1.html +file + + + + +2010-12-08T21:44:00.000000Z +db9c9d921eabc92f8a75eea83c75e62d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +604 + +46-2.html +file + + + + +2010-12-08T21:44:00.000000Z +61364ef7766b660d8903acf16f0a5dc9 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +436 + +80-4.html +file + + + + +2010-12-08T21:44:00.000000Z +0920c0d5f975b26e7e448c165404fe85 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +351 + +29-1.html +file + + + + +2010-12-08T21:44:00.000000Z +07e1e060316585a9b984735c62444c10 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +253 + +18-4.html +file + + + + +2010-12-08T21:44:00.000000Z +88314bb98a139ec7f7e6ee8fa3f81ddd +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +256 + +86-2.html +file + + + + +2010-12-08T21:44:00.000000Z +d653901504f4c386ff7db35d07cf30af +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +69-1.html +file + + + + +2010-12-08T21:44:00.000000Z +d44544c5e0253aead9b5106226119d04 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +410 + +alternative1.html +file + + + + +2010-12-08T21:44:00.000000Z +a1834577e52c77aef90798fcc846b17d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +419 + +98-4.html +file + + + + +2010-12-08T21:44:00.000000Z +9f95bb2720ad4bb611d1e7e170c23739 +2010-09-04T21:59:16.426567Z +230 +keveemiller + + + + + + + + + + + + + + + + + + + + + +230 + +120-2.html +file + + + + +2010-12-08T21:44:00.000000Z +f67894851f3aaa8bfd54317fa10ac47b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +545 + +201-2.html +file + + + + +2010-12-08T21:44:00.000000Z +3e3b4d3e009841d11e37a6f575e0aeed +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +430 + +103-1.html +file + + + + +2010-12-08T21:44:00.000000Z +cbb0d0335838514288ab5aac0d753893 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +247 + +chart.gif +file + + + + +2010-12-08T21:44:00.000000Z +6841b413b8b4eee1faf5be82daee9c52 +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +5680 + +7-1.html +file + + + + +2010-12-08T21:44:00.000000Z +ac2c59927866581339cc0825bb339dea +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +349 + +160-2.html +file + + + + +2010-12-08T21:44:00.000000Z +8bf78e218e9b2edf978aed2efc099826 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +199 + +241-2.html +file + + + + +2010-12-08T21:44:00.000000Z +988aab77c4c8198dab9edeef6fa59731 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1022 + +143-1.html +file + + + + +2010-12-08T21:44:00.000000Z +d705ec6de47099c5748aa6a4e7a7e4fe +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +199 + +224-1.html +file + + + + +2010-12-08T21:44:00.000000Z +35b27827586ebd1dd8ce1c2adefe6181 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +357 + +213-4.html +file + + + + +2010-12-08T21:44:00.000000Z +5e76945972f478c0942631fcaf3f5913 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +522 + +183-1.html +file + + + + +2010-12-08T21:44:00.000000Z +cc3dbc5f438cacde85bd0cbffb5b442e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +399 + +264-1.html +file + + + + +2010-12-08T21:44:00.000000Z +334249ded5b36eb5ab80f06ae8f88e48 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +490 + +138-2.html +file + + + + +2010-12-08T21:44:00.000000Z +746878e41f4dd8abfb6be3bf3adcbb59 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +561 + +236-3.html +file + + + + +2010-12-08T21:44:00.000000Z +bd31d2ea87a003049a6029c59c4f035c +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +484 + +219-2.html +file + + + + +2010-12-08T21:44:00.000000Z +9e020e800d616fba91119591234ad44c +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +558 + +208-5.html +file + + + + +2010-12-08T21:44:00.000000Z +c9be5e5e456e703fb4f09fb0d2e3ef0e +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +597 + +178-2.html +file + + + + +2010-12-08T21:44:00.000000Z +01b12b3a7a615b89ce10324a3686db5e +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +359 + +195-3.html +file + + + + +2010-12-08T21:44:00.000000Z +d9d545b7622ae78f736479e5f5b85819 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +370 + +259-2.html +file + + + + +2010-12-08T21:44:00.000000Z +f9e69b0c1547928410683e1c90658966 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +390 + +276-3.html +file + + + + +2010-12-08T21:44:00.000000Z +ac98fbf22e75bcbe37b0b1366f28c4cb +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +587 + +20-1.html +file + + + + +2010-12-08T21:44:00.000000Z +739c441db8128a9df4456c070f11408a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +246 + +60-1.html +file + + + + +2010-12-08T21:44:00.000000Z +7c83e830d8975b9fda4269f1fd96fc9b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +579 + +32-3.html +file + + + + +2010-12-08T21:44:00.000000Z +eb270540dd7973ea271e3f9078b92170 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +389 + +15-2.html +file + + + + +2010-12-08T21:44:00.000000Z +69d7047a542385fa3540ce352feac90a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +394 + +72-3.html +file + + + + +2010-12-08T21:44:00.000000Z +4f7124247409413ea09d58d8d0a1a436 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +381 + +38-1.html +file + + + + +2010-12-08T21:44:00.000000Z +5c2be258be991648609c63b80ba4ff38 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +484 + +55-2.html +file + + + + +2010-12-08T21:44:00.000000Z +ce426382d29509db2c89233bc9983394 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +33-8.html +file + + + + +2010-12-08T21:44:00.000000Z +fdbd12e05131e074b44f668060abc1ae +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +348 + +95-2.html +file + + + + +2010-12-08T21:44:00.000000Z +dea934eb597ad69a2da3d96bd0f042de +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +543 + +78-1.html +file + + + + +2010-12-08T21:44:00.000000Z +0f94c6a882a7605d993a76e0c038989b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +318 + +avlab.txt +file + + + + +2010-12-08T21:44:00.000000Z +b24dc74ccd3506f1b9b3113b338ae8ed +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +93 + +112-1.html +file + + + + +2010-12-08T21:44:00.000000Z +aea5d64fc30320ef91969d332945985b +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +885 + +250-2.html +file + + + + +2010-12-08T21:44:00.000000Z +daa566f64eb34086cea5894b004762f0 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +568 + +17-10.html +file + + + + +2010-12-08T21:44:01.000000Z +892407dacddae7bd6fdd0a96014a8e6b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +274 + +152-1.html +file + + + + +2010-12-08T21:44:01.000000Z +79b5b4235d14503a5cf80e017a9647d6 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +550 + +233-1.html +file + + + + +2010-12-08T21:44:01.000000Z +7a3cca86d6a4870f6bf809ce5ffeeab2 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +408 + +205-3.html +file + + + + +2010-12-08T21:44:01.000000Z +9e766e734a646fca854f2cf362a297da +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +547 + +107-2.html +file + + + + +2010-12-08T21:44:01.000000Z +bfbee0cc7a11be8d51c3e0f251fae840 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +262 + +273-1.html +file + + + + +2010-12-08T21:44:01.000000Z +0e0d41f5f2dd74e3c16f374519bc32a2 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +390 + +192-1.html +file + + + + +2010-12-08T21:44:01.000000Z +b7373170950e4c6db3c8bdb46e3811ec +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +433 + +147-2.html +file + + + + +2010-12-08T21:44:01.000000Z +2bb03f4c6342eb6e409ed7bf714bc9aa +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +424 + +228-2.html +file + + + + +2010-12-08T21:44:01.000000Z +d493dbb410ec3865f1ea7b2a6809cec0 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +449 + +119-4.html +file + + + + +2010-12-08T21:44:01.000000Z +bace8c41d25cd40b5a231d6e549d2903 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +502 + +217-5.html +file + + + + +2010-12-08T21:44:01.000000Z +49596d466b71eeb3ae27e97b0c8c12e0 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +532 + +268-2.html +file + + + + +2010-12-08T21:44:01.000000Z +b18f736797dc5aafd58adfae89ae3d4c +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +744 + +187-2.html +file + + + + +2010-12-08T21:44:01.000000Z +609ba095ddfd7abdb4a8ebd4a39237f4 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +322 + +274-6.html +file + + + + +2010-12-08T21:44:01.000000Z +43f5cdf3c6fa8a3cf067bcf3d966c91d +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +1370 + +24-2.html +file + + + + +2010-12-08T21:44:01.000000Z +275f06b2da46b8cba649df5d9b89fffa +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +64-2.html +file + + + + +2010-12-08T21:44:01.000000Z +503d97aff04bf66546872dcd5d8f4489 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +491 + +47-1.html +file + + + + +2010-12-08T21:44:01.000000Z +dc7773951cd154aee233db885da53df7 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +435 + +53-5.html +file + + + + +2010-12-08T21:44:01.000000Z +d5e876f04deded52c5e38e6fd235c48e +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +360 + +19-3.html +file + + + + +2010-12-08T21:44:01.000000Z +dedb048d2ddb582adad81feb8fe61e87 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +268 + +fishswim.gif +file + + + + +2010-12-08T21:44:01.000000Z +fa127f528c010cdfabea9d7cf644628f +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +18161 + +87-1.html +file + + + + +2010-12-08T21:44:01.000000Z +4b48765c31e5ba7a3a46dc936e33fd80 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +258 + +82-8.html +file + + + + +2010-12-08T21:44:01.000000Z +7715ef58d8cd394acdd0cc5c60c26253 +2010-05-23T23:17:19.912117Z +176 +keveemiller + + + + + + + + + + + + + + + + + + + + + +417 + +2-2.html +file + + + + +2010-12-08T21:44:01.000000Z +9cbdb7cc245d817d457beadb524a4bec +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +245 + +121-1.html +file + + + + +2010-12-08T21:44:01.000000Z +ed1e04c8dd5e599c9a6c4c4d63e0366c +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +517 + +202-1.html +file + + + + +2010-12-08T21:44:01.000000Z +5edb3656fa997169f4eda03f126eb8cc +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +429 + +242-1.html +file + + + + +2010-12-08T21:44:01.000000Z +2b524bef92fdd60f5387efe3e5f2c1e2 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +907 + +161-1.html +file + + + + +2010-12-08T21:44:01.000000Z +8fb0dc26bf40d71e1ba9903f4ec32237 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +271 + +library.gif +file + + + + +2010-12-08T21:44:01.000000Z +0514c12bcab6ad29bcbc0c56b4e155fd +2009-09-11T01:42:45.040572Z +47 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +2263 + +214-3.html +file + + + + +2010-12-08T21:44:01.000000Z +f02e42a329e6e3ecb27c9a0329352119 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +546 + +116-2.html +file + + + + +2010-12-08T21:44:01.000000Z +a89e7746429818187e9d62f47e84eac5 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +465 + +254-3.html +file + + + + +2010-12-08T21:44:01.000000Z +a7ebe841cc4f05cdccd341382e7ccc67 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +286 + +139-1.html +file + + + + +2010-12-08T21:44:01.000000Z +974e4de9986a1e436fcbb6c9cfd8b9da +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +552 + +237-2.html +file + + + + +2010-12-08T21:44:01.000000Z +1266ba61bce8d3bdc03145c80c434637 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +602 + +173-3.html +file + + + + +2010-12-08T21:44:01.000000Z +ff39afdbcde07ff297f551f09a88ae88 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +254 + +145-5.html +file + + + + +2010-12-08T21:44:02.000000Z +c7b57dc33bccb8a0a82d326e3158cfb5 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +428 + +196-2.html +file + + + + +2010-12-08T21:44:02.000000Z +2d4fad60bb7fd853574811fb3daae631 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +506 + +168-4.html +file + + + + +2010-12-08T21:44:02.000000Z +f4734ba1949a35baf388944b79670833 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +511 + +16-1.html +file + + + + +2010-12-08T21:44:02.000000Z +46a844742aa91bd3c53587081b5ace30 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +394 + +33-2.html +file + + + + +2010-12-08T21:44:02.000000Z +45a398b131b068a6d340b8aad6f8a5dd +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +939 + +73-2.html +file + + + + +2010-12-08T21:44:02.000000Z +9113bd8f83740ecee4f7ca7abf7c7ef4 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +198 + +56-1.html +file + + + + +2010-12-08T21:44:02.000000Z +49b1ae846d15d7273a77c1f8d423b6f7 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +305 + +17-6.html +file + + + + +2010-12-08T21:44:02.000000Z +166bcabad50fabbb7c90fa583bd7e2ed +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +274 + +big-fail.png +file + + + + +2010-12-08T21:44:02.000000Z +a6aaae7eadfbfb7af12476c1e69246ef +2010-05-23T22:11:15.425051Z +174 +keveemiller +has-props + + + + + + + + + + + + + + + + + + + + +58807 + +96-1.html +file + + + + +2010-12-08T21:44:02.000000Z +9924f1564d95279c3eefb5a1141e010c +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +772 + +68-3.html +file + + + + +2010-12-08T21:44:02.000000Z +237f9e3208d2e4cdbe582a2ec8cb378b +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +338 + +211-1.html +file + + + + +2010-12-08T21:44:02.000000Z +9670b9838d129e0356e42b4e545ce4ec +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +761 + +6-3.html +file + + + + +2010-12-08T21:44:02.000000Z +7db57489600fa8df26b528d85eaf758f +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +255 + +251-1.html +file + + + + +2010-12-08T21:44:02.000000Z +de2d15a212a91aa889cfa55fd1a4cdd6 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +426 + +142-3.html +file + + + + +2010-12-08T21:44:02.000000Z +512bc3257885d9ba2a9a2a5ecc2e8db7 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +540 + +223-3.html +file + + + + +2010-12-08T21:44:02.000000Z +aacdcc517723035cc1936fe0b5bf5a64 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +323 + +206-2.html +file + + + + +2010-12-08T21:44:02.000000Z +b84ccf58e53d58926c5795ee7cadb769 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +556 + +108-1.html +file + + + + +2010-12-08T21:44:02.000000Z +d49414f2d410a5d28dbe2eed0d35b14a +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +246 + +125-2.html +file + + + + +2010-12-08T21:44:02.000000Z +bc3cf60dbe3822d3d38421cde8a80755 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +747 + +212-6.html +file + + + + +2010-12-08T21:44:02.000000Z +744aefdfbd7f1d294d3fe08c9da93f7f +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +531 + +148-1.html +file + + + + +2010-12-08T21:44:02.000000Z +79d08a975aa330e384cbf0a3ee342d19 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +261 + +165-2.html +file + + + + +2010-12-08T21:44:02.000000Z +3384d54214f37fb21913be9513e43a85 +2010-02-27T18:05:37.787423Z +135 +keveemiller + + + + + + + + + + + + + + + + + + + + + +313 + +246-2.html +file + + + + +2010-12-08T21:44:02.000000Z +170b95aa9200e39e0c0272571a08972a +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +749 + +229-1.html +file + + + + +2010-12-08T21:44:02.000000Z +f29147ab025fde9d331a1ccaae8d67a2 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +449 + +218-4.html +file + + + + +2010-12-08T21:44:02.000000Z +53a6dc6e0f1594b3db326b09d7f12081 +2009-09-11T01:42:45.040572Z +47 +keveemiller + + + + + + + + + + + + + + + + + + + + + +522 + diff --git a/tests/testfiles/oac/.svn/prop-base/avlab.mp3.svn-base b/tests/testfiles/oac/.svn/prop-base/avlab.mp3.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/avlab.mp3.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/big-fail.png.svn-base b/tests/testfiles/oac/.svn/prop-base/big-fail.png.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/big-fail.png.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/chart.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/chart.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/chart.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/contrast1.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/contrast1.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/contrast1.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/contrast2.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/contrast2.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/contrast2.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/eatatjoes.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/eatatjoes.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/eatatjoes.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/finddogs.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/finddogs.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/finddogs.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/fish.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/fish.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/fish.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/fishswim.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/fishswim.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/fishswim.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/go.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/go.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/go.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/image.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/image.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/image.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/library.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/library.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/library.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/renew.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/renew.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/renew.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/rex.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/rex.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/rex.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/rex.jpg.svn-base b/tests/testfiles/oac/.svn/prop-base/rex.jpg.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/rex.jpg.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/spacer.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/spacer.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/spacer.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/star.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/star.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/star.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/submit.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/submit.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/submit.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/prop-base/welcome.gif.svn-base b/tests/testfiles/oac/.svn/prop-base/welcome.gif.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/tests/testfiles/oac/.svn/prop-base/welcome.gif.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/tests/testfiles/oac/.svn/text-base/1-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/1-1.html.svn-base new file mode 100644 index 0000000..e1c7a45 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/1-1.html.svn-base @@ -0,0 +1,11 @@ + + + + + +Testfile - Check #1 - Positive + + +

+ + diff --git a/tests/testfiles/oac/.svn/text-base/1-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/1-2.html.svn-base new file mode 100644 index 0000000..2fad1db --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/1-2.html.svn-base @@ -0,0 +1 @@ + Testfile - Check #1 - Negative

A black and brown cat named Rex.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/10-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/10-1.html.svn-base new file mode 100644 index 0000000..52ee6cb --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/10-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #10.1 - Positive eat at Joes \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/10-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/10-2.html.svn-base new file mode 100644 index 0000000..260914f --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/10-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #10.2 - Negative A brown and black cat named Rex. \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/100-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/100-1.html.svn-base new file mode 100644 index 0000000..ec0e27b --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/100-1.html.svn-base @@ -0,0 +1 @@ + Check #100 - Positive
If I have any sins to confess, I will tell them to my priest.
. \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/100-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/100-2.html.svn-base new file mode 100644 index 0000000..7ee082a --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/100-2.html.svn-base @@ -0,0 +1 @@ + Check #100 - Negative
If I have any sins to confess, I will tell them to my priest.
. \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/102-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/102-1.html.svn-base new file mode 100644 index 0000000..3d14534 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/102-1.html.svn-base @@ -0,0 +1 @@ + Check #102 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/102-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/102-2.html.svn-base new file mode 100644 index 0000000..0f0798d --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/102-2.html.svn-base @@ -0,0 +1 @@ + Check #102 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/103-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/103-1.html.svn-base new file mode 100644 index 0000000..9516e6f --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/103-1.html.svn-base @@ -0,0 +1 @@ + Check #103 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/103-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/103-2.html.svn-base new file mode 100644 index 0000000..bdc7d81 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/103-2.html.svn-base @@ -0,0 +1 @@ + Check #103 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/104-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/104-1.html.svn-base new file mode 100644 index 0000000..2010c55 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/104-1.html.svn-base @@ -0,0 +1 @@ + Check #104.1 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/104-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/104-2.html.svn-base new file mode 100644 index 0000000..4490242 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/104-2.html.svn-base @@ -0,0 +1 @@ + Check #104.2 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/105-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/105-1.html.svn-base new file mode 100644 index 0000000..fabefb5 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/105-1.html.svn-base @@ -0,0 +1 @@ + Check #105 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/105-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/105-2.html.svn-base new file mode 100644 index 0000000..20b70ba --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/105-2.html.svn-base @@ -0,0 +1 @@ + Check #105 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/106-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/106-1.html.svn-base new file mode 100644 index 0000000..5d5764d --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/106-1.html.svn-base @@ -0,0 +1 @@ + Check #106 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/106-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/106-2.html.svn-base new file mode 100644 index 0000000..7f9c96f --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/106-2.html.svn-base @@ -0,0 +1 @@ + Check #106 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/107-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/107-1.html.svn-base new file mode 100644 index 0000000..6d3880e --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/107-1.html.svn-base @@ -0,0 +1 @@ + Check #107 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/107-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/107-2.html.svn-base new file mode 100644 index 0000000..7c0387b --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/107-2.html.svn-base @@ -0,0 +1 @@ + Check #107 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/108-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/108-1.html.svn-base new file mode 100644 index 0000000..9e15a51 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/108-1.html.svn-base @@ -0,0 +1 @@ + Check #108 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/108-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/108-2.html.svn-base new file mode 100644 index 0000000..f05f436 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/108-2.html.svn-base @@ -0,0 +1 @@ + Check #108 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/109-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/109-1.html.svn-base new file mode 100644 index 0000000..87a58f1 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/109-1.html.svn-base @@ -0,0 +1 @@ + Check #109 - Positive

Hello.

Bye.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/109-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/109-2.html.svn-base new file mode 100644 index 0000000..23c747c --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/109-2.html.svn-base @@ -0,0 +1 @@ + Check #109 - Negative

Hello.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/11-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/11-1.html.svn-base new file mode 100644 index 0000000..5616053 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/11-1.html.svn-base @@ -0,0 +1 @@ + Check #11 - Positive

logo

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/11-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/11-2.html.svn-base new file mode 100644 index 0000000..beac997 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/11-2.html.svn-base @@ -0,0 +1 @@ + Check #11 - Negative

W3C Working Draft logo

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/110-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/110-1.html.svn-base new file mode 100644 index 0000000..a88f1b6 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/110-1.html.svn-base @@ -0,0 +1 @@ + Check #110 - Positive

And with a certain je ne sais quoi, she entered both the room, and his life, forever.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/110-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/110-2.html.svn-base new file mode 100644 index 0000000..e57a2f0 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/110-2.html.svn-base @@ -0,0 +1 @@ + Check #110 - Positive

And with a certain je ne sais quoi, she entered both the room, and his life, forever.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/111-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/111-1.html.svn-base new file mode 100644 index 0000000..4e90bf7 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/111-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #111.1 - Positive
State & First State & Sixth State & Fifteenth Fifteenth & Morrison
4:00 4:05 4:11 4:19
5:00 5:05 5:11 5:19
6:00 6:05 6:11 6:19
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/111-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/111-2.html.svn-base new file mode 100644 index 0000000..60df20d --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/111-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #111-2 - Negative
State & First State & Sixth State & Fifteenth Fifteenth & Morrison
4:00 4:05 4:11 4:19
5:00 5:05 5:11 5:19
6:00 6:05 6:11 6:19
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/111-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/111-3.html.svn-base new file mode 100644 index 0000000..88c6aa3 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/111-3.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #111.3 - Negative
Manager Work Days
DayManager
MondayErol
TuesdayDavid
WednesdayCarol
ThursdaySusan
FridayPiere
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/112-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/112-1.html.svn-base new file mode 100644 index 0000000..bef4922 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/112-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #112-1 - Positive
namenumber of cupstypewith sugar
Adams, Willie2regularsugar
Bacon, Lise4regularno sugar
Chaput, Maria1decafsugar
Di Nino, Consiglio0not applicablenot applicable
Eggleton, Art6regularno sugar
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/112-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/112-2.html.svn-base new file mode 100644 index 0000000..f7b6d99 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/112-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #112-2 - Negative
namenumber of cupstypewith sugar
Adams, Willie2regularsugar
Bacon, Lise4regularno sugar
Chaput, Maria1decafsugar
Di Nino, Consiglio0not applicablenot applicable
Eggleton, Art6regularno sugar
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/113-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/113-1.html.svn-base new file mode 100644 index 0000000..1299695 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/113-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #113-1 - Positive
namenumber of cupstypewith sugar
Adams, Willie2regularsugar
Bacon, Lise4regularno sugar
Chaput, Maria1decafsugar
Di Nino, Consiglio0not applicablenot applicable
Eggleton, Art6regularno sugar
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/113-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/113-2.html.svn-base new file mode 100644 index 0000000..3590a24 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/113-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #113-2 - Positive
namenumber of cupstypewith sugar
Adams, Willie2regularsugar
Bacon, Lise4regularno sugar
Chaput, Maria1decafsugar
Di Nino, Consiglio0not applicablenot applicable
Eggleton, Art6regularno sugar
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/114-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/114-1.html.svn-base new file mode 100644 index 0000000..1a9c995 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/114-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #114-1 - Positive
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/114-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/114-2.html.svn-base new file mode 100644 index 0000000..9185740 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/114-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #114-2 - Negative
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/114-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/114-3.html.svn-base new file mode 100644 index 0000000..3c7d408 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/114-3.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #114-3 - Negative
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/115-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/115-1.html.svn-base new file mode 100644 index 0000000..e06927e --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/115-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #115-1 - Positive
Latin And English Text
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/115-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/115-2.html.svn-base new file mode 100644 index 0000000..5ebdded --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/115-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #115-2 - Negative
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/116-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/116-1.html.svn-base new file mode 100644 index 0000000..e8a924a --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/116-1.html.svn-base @@ -0,0 +1 @@ + Check #116 - Positive

What she really meant to say was, "This isn't ok, it is excellent!"

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/116-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/116-2.html.svn-base new file mode 100644 index 0000000..be6e838 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/116-2.html.svn-base @@ -0,0 +1 @@ + Check #116 - Negative

What she really meant to say was, "This isn't ok, it is excellent!"

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/117-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/117-1.html.svn-base new file mode 100644 index 0000000..585b02c --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/117-1.html.svn-base @@ -0,0 +1 @@ + Check #117 - Positive

What she really meant to say was, "This isn't ok, it is excellent!"

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/117-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/117-2.html.svn-base new file mode 100644 index 0000000..80c0ec0 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/117-2.html.svn-base @@ -0,0 +1 @@ + Check #117 - Negative

What she really meant to say was, "This isn't ok, it is excellent!"

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/118-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/118-1.html.svn-base new file mode 100644 index 0000000..6575ce4 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/118-1.html.svn-base @@ -0,0 +1 @@ + Check #118 - Positive

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/118-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/118-2.html.svn-base new file mode 100644 index 0000000..4dd3884 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/118-2.html.svn-base @@ -0,0 +1 @@ + Check #118 - Negative

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/118-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/118-3.html.svn-base new file mode 100644 index 0000000..4c93a7e --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/118-3.html.svn-base @@ -0,0 +1 @@ + Check #118 - Negative

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/118-4.html.svn-base b/tests/testfiles/oac/.svn/text-base/118-4.html.svn-base new file mode 100644 index 0000000..4aa59a7 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/118-4.html.svn-base @@ -0,0 +1 @@ + Check #118 - Negative

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/119-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/119-1.html.svn-base new file mode 100644 index 0000000..9df282f --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/119-1.html.svn-base @@ -0,0 +1 @@ + Check #119 - Positive

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/119-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/119-2.html.svn-base new file mode 100644 index 0000000..28219a1 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/119-2.html.svn-base @@ -0,0 +1 @@ + Check #119 - Negative

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/119-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/119-3.html.svn-base new file mode 100644 index 0000000..8eed49b --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/119-3.html.svn-base @@ -0,0 +1 @@ + Check #119 - Negative

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/119-4.html.svn-base b/tests/testfiles/oac/.svn/text-base/119-4.html.svn-base new file mode 100644 index 0000000..72f87a6 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/119-4.html.svn-base @@ -0,0 +1 @@ + Check #57 - Negative

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/12-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/12-1.html.svn-base new file mode 100644 index 0000000..6d3dbfd --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/12-1.html.svn-base @@ -0,0 +1 @@ + Check #12 - Positive

image map

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/12-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/12-2.html.svn-base new file mode 100644 index 0000000..3256fe6 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/12-2.html.svn-base @@ -0,0 +1 @@ + Check #12 - Positive

image map

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/120-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/120-1.html.svn-base new file mode 100644 index 0000000..be865f8 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/120-1.html.svn-base @@ -0,0 +1 @@ + Check #120 - Positive

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/120-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/120-2.html.svn-base new file mode 100644 index 0000000..9c5c50c --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/120-2.html.svn-base @@ -0,0 +1 @@ + Check #120 - Negative

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/120-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/120-3.html.svn-base new file mode 100644 index 0000000..6e680af --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/120-3.html.svn-base @@ -0,0 +1 @@ + Check #120 - Negative

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/120-4.html.svn-base b/tests/testfiles/oac/.svn/text-base/120-4.html.svn-base new file mode 100644 index 0000000..d3b0915 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/120-4.html.svn-base @@ -0,0 +1 @@ + Check #120 - Negative

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/121-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/121-1.html.svn-base new file mode 100644 index 0000000..c7d833a --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/121-1.html.svn-base @@ -0,0 +1 @@ + Check #121 - Positive

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/121-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/121-2.html.svn-base new file mode 100644 index 0000000..2802538 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/121-2.html.svn-base @@ -0,0 +1 @@ + Check #121 - Negative

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/121-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/121-3.html.svn-base new file mode 100644 index 0000000..758fe0b --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/121-3.html.svn-base @@ -0,0 +1 @@ + Check #121 - Negative

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/121-4.html.svn-base b/tests/testfiles/oac/.svn/text-base/121-4.html.svn-base new file mode 100644 index 0000000..45a5959 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/121-4.html.svn-base @@ -0,0 +1 @@ + Check #121 - Negative

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/122-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/122-1.html.svn-base new file mode 100644 index 0000000..8fc83ba --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/122-1.html.svn-base @@ -0,0 +1,18 @@ + + + + + +Testfile - Check #122.1 - Positive + + +

Please enter your password below:

+
+ + + +
password:
+
+ + + \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/122-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/122-2.html.svn-base new file mode 100644 index 0000000..00d058b --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/122-2.html.svn-base @@ -0,0 +1,18 @@ + + + + + +Testfile - Check #122.2 - Negative + + +

Please enter your password below:

+
+ + + +
password:
+
+ + + \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/123-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/123-1.html.svn-base new file mode 100644 index 0000000..7caa446 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/123-1.html.svn-base @@ -0,0 +1,20 @@ + + + + + +Testfile - Check #123.1 - Positive + + +

Select your animals using the form below:

+
+ + + + + +
dog
cat
polar bear
+
+ + + \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/123-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/123-2.html.svn-base new file mode 100644 index 0000000..ed4e9c0 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/123-2.html.svn-base @@ -0,0 +1,20 @@ + + + + + +Testfile - Check #123.2 - Negative + + +

Select your animals using the form below:

+
+ + + + + +
dog
cat
polar bear
+
+ + + \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/124-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/124-1.html.svn-base new file mode 100644 index 0000000..9d72a9a --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/124-1.html.svn-base @@ -0,0 +1,18 @@ + + + + + +Testfile - Check #124.1 - Positive + + +

Please upload your file using the form below:

+
+ + + +
file:
+
+ + + \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/124-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/124-2.html.svn-base new file mode 100644 index 0000000..5c166b9 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/124-2.html.svn-base @@ -0,0 +1,18 @@ + + + + + +Testfile - Check #124.2 - Negative + + +

Please upload your file using the form below:

+
+ + + +
file:
+
+ + + \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/125-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/125-1.html.svn-base new file mode 100644 index 0000000..25f7c43 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/125-1.html.svn-base @@ -0,0 +1,20 @@ + + + + + +Testfile - Check #125.1 - Positive + + +

Select your favourite animal using the form below:

+
+ + + + + +
dog
cat
polar bear
+
+ + + \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/125-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/125-2.html.svn-base new file mode 100644 index 0000000..285681a --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/125-2.html.svn-base @@ -0,0 +1,20 @@ + + + + + +Testfile - Check #125.2 - Negative + + +

Select your favourite animal using the form below:

+
+ + + + + +
dog
cat
polar bear
+
+ + + \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/126-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/126-1.html.svn-base new file mode 100644 index 0000000..f03d874 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/126-1.html.svn-base @@ -0,0 +1 @@ + Check #126 - Positive
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/126-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/126-2.html.svn-base new file mode 100644 index 0000000..bf81f31 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/126-2.html.svn-base @@ -0,0 +1 @@ + Check #126 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/127-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/127-1.html.svn-base new file mode 100644 index 0000000..d7814cc --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/127-1.html.svn-base @@ -0,0 +1 @@ + Check #127 - Positive text equiv for object \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/127-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/127-2.html.svn-base new file mode 100644 index 0000000..ceff367 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/127-2.html.svn-base @@ -0,0 +1 @@ + Check #127 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/128-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/128-1.html.svn-base new file mode 100644 index 0000000..d6ef3b0 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/128-1.html.svn-base @@ -0,0 +1 @@ + Check #128 - Positive text equiv for object \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/128-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/128-2.html.svn-base new file mode 100644 index 0000000..ccb476f --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/128-2.html.svn-base @@ -0,0 +1 @@ + Check #128 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/129-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/129-1.html.svn-base new file mode 100644 index 0000000..c53b164 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/129-1.html.svn-base @@ -0,0 +1 @@ + Check #129 - Positive text equiv for object \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/129-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/129-2.html.svn-base new file mode 100644 index 0000000..0726933 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/129-2.html.svn-base @@ -0,0 +1 @@ + Check #129 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/13-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/13-1.html.svn-base new file mode 100644 index 0000000..c0fb758 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/13-1.html.svn-base @@ -0,0 +1 @@ + Check #13 - Positive

horses dogs birds

navigation

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/13-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/13-2.html.svn-base new file mode 100644 index 0000000..ca32720 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/13-2.html.svn-base @@ -0,0 +1 @@ + Check #13 - Negative

horses dogs birds

navigation

Horses | Dogs | Birds

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/13-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/13-3.html.svn-base new file mode 100644 index 0000000..ed25b3e --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/13-3.html.svn-base @@ -0,0 +1 @@ + Check #13 - Positive

horses dogs birds

navigation

Horses | Dogs

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/131-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/131-1.html.svn-base new file mode 100644 index 0000000..b8e98cf --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/131-1.html.svn-base @@ -0,0 +1 @@ + Check #131 - Positive

This is a paragraph which is not a quote; however, there is one below.

"It was a dark and stormy night."

Wasn't that a scary quote?

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/131-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/131-2.html.svn-base new file mode 100644 index 0000000..46b8054 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/131-2.html.svn-base @@ -0,0 +1 @@ + Check #131 - Negative

This is a paragraph which does not have a quote.

This is also paragraph which does not have a quote.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/132-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/132-1.html.svn-base new file mode 100644 index 0000000..a1814d5 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/132-1.html.svn-base @@ -0,0 +1 @@ + Check #132 - Positive

map of the country

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/132-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/132-2.html.svn-base new file mode 100644 index 0000000..0e44927 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/132-2.html.svn-base @@ -0,0 +1 @@ + Check #132 - Negative

map of the country

East Coast | Central | West Coast

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/133-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/133-1.html.svn-base new file mode 100644 index 0000000..8423b0c --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/133-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #133.1 - Positive
XYZ mountaineering top!
XYZ gets you to the
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/133-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/133-2.html.svn-base new file mode 100644 index 0000000..3648caf --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/133-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #133.2 - Negative
XYZ mountaineering
XYZ gets you to the top!
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/134-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/134-1.html.svn-base new file mode 100644 index 0000000..7d35488 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/134-1.html.svn-base @@ -0,0 +1 @@ + Check #134 - Positive dogs cats birds snakes \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/134-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/134-2.html.svn-base new file mode 100644 index 0000000..fca0f6f --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/134-2.html.svn-base @@ -0,0 +1 @@ + Check #134 - Negative dogs | cats | birds | snakes \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/135-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/135-1.html.svn-base new file mode 100644 index 0000000..1db443b --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/135-1.html.svn-base @@ -0,0 +1,11 @@ + + + + Testfile - Check #135 - Positive + + +

The following image shows the solution to the quadratic equation: begin fraction minus b plus or minus begin square root of b squared minus four a c end square root over 2 a end fraction

+ + solution to the quadratic equation + + diff --git a/tests/testfiles/oac/.svn/text-base/135-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/135-2.html.svn-base new file mode 100644 index 0000000..0641581 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/135-2.html.svn-base @@ -0,0 +1 @@ + Check #135 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/135-2.xhtml.svn-base b/tests/testfiles/oac/.svn/text-base/135-2.xhtml.svn-base new file mode 100644 index 0000000..52fde3d --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/135-2.xhtml.svn-base @@ -0,0 +1,44 @@ + ]> + + + Testfile - Check #135 - Negative + + +

The following image shows the solution to the quadratic equation: begin fraction minus b plus or + minus begin square root of b squared minus four a c end square root over 2 a + end fraction

+ solution to the quadratic equation + + + + + - + b + + ± + + + + b + 2 + + - + + 4 + + a + + c + + + + + + 2 + + a + + + + + diff --git a/tests/testfiles/oac/.svn/text-base/136-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/136-1.html.svn-base new file mode 100644 index 0000000..d4ac3ac --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/136-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #136-1 - Positive
namenumber of cupstypewith sugar
Adams, Willie2regularsugar
Bacon, Lise4regularno sugar
Chaput, Maria1decafsugar
Di Nino, Consiglio0not applicablenot applicable
Eggleton, Art6regularno sugar
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/136-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/136-2.html.svn-base new file mode 100644 index 0000000..bad7bd8 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/136-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #136-2 - Negative
namenumber of cupstypewith sugar
Adams, Willie2regularsugar
Bacon, Lise4regularno sugar
Chaput, Maria1decafsugar
Di Nino, Consiglio0not applicablenot applicable
Eggleton, Art6regularno sugar
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/137-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/137-1.html.svn-base new file mode 100644 index 0000000..7892d9a --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/137-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #114-1 - Positive
Latin is a dead language.The English language thrives.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/137-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/137-2.html.svn-base new file mode 100644 index 0000000..1fef022 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/137-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #114-1 - Positive
Latin is a dead language.The English language thrives.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/138-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/138-1.html.svn-base new file mode 100644 index 0000000..64f1929 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/138-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #138.1 - Positive

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/138-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/138-2.html.svn-base new file mode 100644 index 0000000..f80dd47 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/138-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #138.2 - Positive

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/138-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/138-3.html.svn-base new file mode 100644 index 0000000..42dd289 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/138-3.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #138.3 - Negative

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/139-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/139-1.html.svn-base new file mode 100644 index 0000000..8015622 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/139-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #139.1 - Positive

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/139-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/139-2.html.svn-base new file mode 100644 index 0000000..f5d5a4e --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/139-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #138.2 - Positive

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/139-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/139-3.html.svn-base new file mode 100644 index 0000000..0e03434 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/139-3.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #138.3 - Negative

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/14-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/14-1.html.svn-base new file mode 100644 index 0000000..370db4a --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/14-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #14.1 - Positive

Clayton's Class

This is Clayton's class photo from 2004. Clayton is the one wearing a red coat.

class photo showing 6 children

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/14-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/14-2.html.svn-base new file mode 100644 index 0000000..926ba3e --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/14-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #14.2 - Negative

Clayton's Class

This is Clayton's class photo from 2004. Clayton is third from the left wearing a red coat and no boots.

class photo showing 6 children

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/14-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/14-3.html.svn-base new file mode 100644 index 0000000..95ad3e1 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/14-3.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #14.3 - Positive

Clayton's Class

Clayton is shown below in the class photo from grade 3.

class photo showing Clayton with red coat.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/140-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/140-1.html.svn-base new file mode 100644 index 0000000..a66f40b --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/140-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #140.1 - Positive

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/140-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/140-2.html.svn-base new file mode 100644 index 0000000..3ec2aff --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/140-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #140.2 - Positive

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/140-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/140-3.html.svn-base new file mode 100644 index 0000000..cc83f46 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/140-3.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #138.3 - Negative

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/141-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/141-1.html.svn-base new file mode 100644 index 0000000..d43b4ad --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/141-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #141.1 - Positive

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/141-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/141-2.html.svn-base new file mode 100644 index 0000000..5d1a91f --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/141-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #141.2 - Positive

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/141-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/141-3.html.svn-base new file mode 100644 index 0000000..e665899 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/141-3.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #141.3 - Positive

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/142-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/142-1.html.svn-base new file mode 100644 index 0000000..c26de7f --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/142-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #142.1 - Positive

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/142-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/142-2.html.svn-base new file mode 100644 index 0000000..a3d994f --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/142-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #142.2 - Positive

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/142-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/142-3.html.svn-base new file mode 100644 index 0000000..a5919af --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/142-3.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #142.3 - Negative

:

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/143-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/143-1.html.svn-base new file mode 100644 index 0000000..94e330d --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/143-1.html.svn-base @@ -0,0 +1 @@ + Check #143 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/143-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/143-2.html.svn-base new file mode 100644 index 0000000..d79a3d3 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/143-2.html.svn-base @@ -0,0 +1 @@ + Check #143 - Negative
joe smith
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/144-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/144-1.html.svn-base new file mode 100644 index 0000000..56dc780 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/144-1.html.svn-base @@ -0,0 +1 @@ + Check #144 - Positive
joe smith
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/144-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/144-2.html.svn-base new file mode 100644 index 0000000..248070e --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/144-2.html.svn-base @@ -0,0 +1 @@ + Check #144 - Negative
joe smith
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/145-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/145-1.html.svn-base new file mode 100644 index 0000000..818fe25 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/145-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #145.1 - Positive

View the movie.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/145-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/145-2.html.svn-base new file mode 100644 index 0000000..23dbacf --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/145-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #145.2 - Negative

View the movie (text alternative).

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/145-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/145-3.html.svn-base new file mode 100644 index 0000000..0faba93 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/145-3.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #145.3 - Positive

View the movie.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/145-4.html.svn-base b/tests/testfiles/oac/.svn/text-base/145-4.html.svn-base new file mode 100644 index 0000000..e5aae7a --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/145-4.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #145.4 - Positive

View the movie.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/145-5.html.svn-base b/tests/testfiles/oac/.svn/text-base/145-5.html.svn-base new file mode 100644 index 0000000..f8545e9 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/145-5.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #145.5 - Positive

View the movie.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/145-6.html.svn-base b/tests/testfiles/oac/.svn/text-base/145-6.html.svn-base new file mode 100644 index 0000000..8041c11 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/145-6.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #145.6 - Positive

View the movie.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/146-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/146-1.html.svn-base new file mode 100644 index 0000000..10fc66d --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/146-1.html.svn-base @@ -0,0 +1 @@ + Check #146 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/146-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/146-2.html.svn-base new file mode 100644 index 0000000..11fac3b --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/146-2.html.svn-base @@ -0,0 +1 @@ + Check #146 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/147-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/147-1.html.svn-base new file mode 100644 index 0000000..cac7a87 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/147-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #147.1 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/147-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/147-2.html.svn-base new file mode 100644 index 0000000..c9870c6 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/147-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #147.2 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/147-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/147-3.html.svn-base new file mode 100644 index 0000000..4077a78 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/147-3.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #147.3 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/147-4.html.svn-base b/tests/testfiles/oac/.svn/text-base/147-4.html.svn-base new file mode 100644 index 0000000..3fd54a3 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/147-4.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #147.4 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/148-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/148-1.html.svn-base new file mode 100644 index 0000000..1a628ad --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/148-1.html.svn-base @@ -0,0 +1,9 @@ + + + + Check #148 - Positive + + + + + diff --git a/tests/testfiles/oac/.svn/text-base/148-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/148-2.html.svn-base new file mode 100644 index 0000000..1b39f46 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/148-2.html.svn-base @@ -0,0 +1,9 @@ + + + + Check #148 - Negative + + + + + diff --git a/tests/testfiles/oac/.svn/text-base/15-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/15-1.html.svn-base new file mode 100644 index 0000000..31bb994 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/15-1.html.svn-base @@ -0,0 +1 @@ + Check #15 - Positive

large rock with arrow

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/15-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/15-2.html.svn-base new file mode 100644 index 0000000..f7e5fad --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/15-2.html.svn-base @@ -0,0 +1 @@ + Check #15 - Negative

Current routes at Boulders Climbing Gym

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/150-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/150-1.html.svn-base new file mode 100644 index 0000000..58edff7 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/150-1.html.svn-base @@ -0,0 +1,12 @@ + + + + Check #150 - Positive + + +
    +
  • Item One
  • +
  • Item Two
  • +
+ + diff --git a/tests/testfiles/oac/.svn/text-base/150-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/150-2.html.svn-base new file mode 100644 index 0000000..6634887 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/150-2.html.svn-base @@ -0,0 +1,12 @@ + + + + Check #150 - Positive + + +
    +
  • Item One
  • +
  • Item Two
  • +
+ + diff --git a/tests/testfiles/oac/.svn/text-base/151-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/151-1.html.svn-base new file mode 100644 index 0000000..3e765aa --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/151-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #151.1 - Positive
namenumber of cupstypewith sugar
Adams, Willie2regularsugar
Bacon, Lise4regularno sugar
Chaput, Maria1decafsugar
Di Nino, Consiglio0not applicablenot applicable
Eggleton, Art6regularno sugar
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/151-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/151-2.html.svn-base new file mode 100644 index 0000000..0b5dd15 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/151-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #151.2 - Negative
Coffee Consumed By Senators
namenumber of cupstypewith sugar
Adams, Willie2regularsugar
Bacon, Lise4regularno sugar
Chaput, Maria1decafsugar
Di Nino, Consiglio0not applicablenot applicable
Eggleton, Art6regularno sugar
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/151-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/151-3.html.svn-base new file mode 100644 index 0000000..3208866 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/151-3.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #151.3 - Negative

The table below shows the number of cups of coffee consumed by senators.

namenumber of cupstypewith sugar
Adams, Willie2regularsugar
Bacon, Lise4regularno sugar
Chaput, Maria1decafsugar
Di Nino, Consiglio0not applicablenot applicable
Eggleton, Art6regularno sugar
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/152-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/152-1.html.svn-base new file mode 100644 index 0000000..edc200b --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/152-1.html.svn-base @@ -0,0 +1 @@ + Check #152 - Positive
A Test Table
Col. 1 header really long text Col. 2 header really long text
Row 1 header C1R1 C1R2
Row 2 header C2R1 C2R2
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/152-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/152-2.html.svn-base new file mode 100644 index 0000000..f88dad4 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/152-2.html.svn-base @@ -0,0 +1 @@ + Check #152 - Positive
Col. 1 header Col. 2 header
Row 1 header C1R1 C1R2
Row 2 header C2R1 C2R2
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/152-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/152-3.html.svn-base new file mode 100644 index 0000000..198188f --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/152-3.html.svn-base @@ -0,0 +1 @@ + Check #152 - Positive
A Test Table
Col. 1 header really long text Col. 2 header really long text
Row 1 header C1R1 C1R2
Row 2 header C2R1 C2R2
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/153-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/153-1.html.svn-base new file mode 100644 index 0000000..844285a --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/153-1.html.svn-base @@ -0,0 +1 @@ + Check #153 - Positive
A Test Table
Col. 1 header really long text Col. 2 header really long text
Row 1 header C1R1 C1R2
Row 2 header C2R1 C2R2
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/153-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/153-2.html.svn-base new file mode 100644 index 0000000..497b139 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/153-2.html.svn-base @@ -0,0 +1 @@ + Check #153 - Positive
A Test Table
Col. 1 header really long text Col. 2 header really long text
Row 1 header C1R1 C1R2
Row 2 header C2R1 C2R2
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/154-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/154-1.html.svn-base new file mode 100644 index 0000000..bf993ec --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/154-1.html.svn-base @@ -0,0 +1 @@ + Check #154 - Positive
     dogs  cats
big	  2     4
small 5     7
\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/154-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/154-2.html.svn-base new file mode 100644 index 0000000..68a15e2 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/154-2.html.svn-base @@ -0,0 +1 @@ + Check #154 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/159-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/159-1.html.svn-base new file mode 100644 index 0000000..b33c36c --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/159-1.html.svn-base @@ -0,0 +1 @@ + Check #159 - Positive A brown and black cat named Rex. \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/159-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/159-2.html.svn-base new file mode 100644 index 0000000..3505c9d --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/159-2.html.svn-base @@ -0,0 +1 @@ + Check #159 - Negative A brown and black cat named Rex. \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/16-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/16-1.html.svn-base new file mode 100644 index 0000000..118f116 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/16-1.html.svn-base @@ -0,0 +1 @@ + Check #16 - Positive

My poem requires a big spacebig spacehere.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/16-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/16-2.html.svn-base new file mode 100644 index 0000000..4ce6ab4 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/16-2.html.svn-base @@ -0,0 +1 @@ + Check #16 - Negative

My poem requires a big spacehere.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/16-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/16-3.html.svn-base new file mode 100644 index 0000000..9eb438d --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/16-3.html.svn-base @@ -0,0 +1 @@ + Check #16 - Positive

red stardogs

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/16-4.html.svn-base b/tests/testfiles/oac/.svn/text-base/16-4.html.svn-base new file mode 100644 index 0000000..1b8ad69 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/16-4.html.svn-base @@ -0,0 +1 @@ + Check #16 - Negative

dogs

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/160-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/160-1.html.svn-base new file mode 100644 index 0000000..b08b017 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/160-1.html.svn-base @@ -0,0 +1 @@ + Check #160 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/160-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/160-2.html.svn-base new file mode 100644 index 0000000..ea1e504 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/160-2.html.svn-base @@ -0,0 +1 @@ + Check #160 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/161-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/161-1.html.svn-base new file mode 100644 index 0000000..030996e --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/161-1.html.svn-base @@ -0,0 +1 @@ + Check #161 - Positive

Just a regular paragraph.

I am feeling :) :( B) :/ :P :o

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/161-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/161-2.html.svn-base new file mode 100644 index 0000000..a733a20 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/161-2.html.svn-base @@ -0,0 +1 @@ + Check #161 - Negative

Just a regular paragraph.

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/162-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/162-1.html.svn-base new file mode 100644 index 0000000..98aeb4e --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/162-1.html.svn-base @@ -0,0 +1 @@ + Check #162 - Positive

Just a regular paragraph.

I feel :)

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/162-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/162-2.html.svn-base new file mode 100644 index 0000000..e1195a3 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/162-2.html.svn-base @@ -0,0 +1 @@ + Check #162 - Negative

Just a regular paragraph.

I feel :)

\ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/163-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/163-1.html.svn-base new file mode 100644 index 0000000..a4a28af --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/163-1.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #163.1 - Positive \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/163-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/163-2.html.svn-base new file mode 100644 index 0000000..004bb63 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/163-2.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #163.2 - Negative <a href="../transcripts/transcript_history_rome.htm">Transcript of "The history of Rome"</a> \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/163-3.html.svn-base b/tests/testfiles/oac/.svn/text-base/163-3.html.svn-base new file mode 100644 index 0000000..54d71b0 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/163-3.html.svn-base @@ -0,0 +1 @@ + ATRC Testfile - Check #163.3 - Negative <a href="../transcripts/transcript_history_rome.htm">Transcript of "The history of Rome"</a> \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/164-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/164-1.html.svn-base new file mode 100644 index 0000000..e0e3514 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/164-1.html.svn-base @@ -0,0 +1 @@ + Check #164 - Positive Alternate content for the embed \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/164-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/164-2.html.svn-base new file mode 100644 index 0000000..f8d6fac --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/164-2.html.svn-base @@ -0,0 +1 @@ + Check #164 - Negative \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/165-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/165-1.html.svn-base new file mode 100644 index 0000000..652e54f --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/165-1.html.svn-base @@ -0,0 +1 @@ + Check #165 - Positive Alternate content for the embed \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/165-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/165-2.html.svn-base new file mode 100644 index 0000000..6265a3e --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/165-2.html.svn-base @@ -0,0 +1 @@ + Check #165 - Negative Alternate content for the embed \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/166-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/166-1.html.svn-base new file mode 100644 index 0000000..aa562e2 --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/166-1.html.svn-base @@ -0,0 +1 @@ + Check #166 - Positive Alternate content for the embed \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/166-2.html.svn-base b/tests/testfiles/oac/.svn/text-base/166-2.html.svn-base new file mode 100644 index 0000000..176a61b --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/166-2.html.svn-base @@ -0,0 +1 @@ + Check #166 - Negative Alternate content for the embed \ No newline at end of file diff --git a/tests/testfiles/oac/.svn/text-base/167-1.html.svn-base b/tests/testfiles/oac/.svn/text-base/167-1.html.svn-base new file mode 100644 index 0000000..f601fef --- /dev/null +++ b/tests/testfiles/oac/.svn/text-base/167-1.html.svn-base @@ -0,0 +1 @@ + Check #167 - Positive