ccls-html_test 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,142 @@
1
+ = Html Test
2
+ A plugin for HTML validation and link checking in Rails
3
+ functional and integration tests. In addition you can run
4
+ the HTML and link tests against a production or staging server over HTTP.
5
+
6
+ == Installation
7
+ ruby script/plugin install git://github.com/peter/html_test.git
8
+
9
+ == Usage
10
+ - Add validation to your controller or integration tests:
11
+
12
+ get :some_action
13
+ assert_response :success
14
+ # The following validates using all three validators: tidy, w3c, xmllint
15
+ # To use a specific validator, use one of assert_tidy, assert_w3c, and
16
+ # assert_xmllint.
17
+ assert_validates
18
+
19
+ - Validate all requests in your controller and integration tests by
20
+ adding these lines to your RAILS_ROOT/test/test_helper.rb file:
21
+
22
+ ApplicationController.validate_all = true
23
+ ApplicationController.validators = [:tidy, :w3c]
24
+
25
+ - Check for broken URLs (URLs that don't resolve to a route, a controller, and an action)
26
+ in your links, images, forms, and redirects. Works both in your controller and integration
27
+ tests. Add these lines to your RAILS_ROOT/test/test_helper.rb file:
28
+
29
+ ApplicationController.check_urls = true
30
+ ApplicationController.check_redirects = true
31
+
32
+ - Follow links in your controller or integration tests:
33
+
34
+ include Html::Test::UrlSelector
35
+
36
+ def clicks_around
37
+ page_url = request.request_uri
38
+ anchor_urls.reject { |url| external_http?(url) || skip_url?(url) || url == page_url }.
39
+ reject { |url| url =~ /(logout|signout)/ }.uniq.each do |url|
40
+
41
+ get url
42
+ assert(@response.redirect? || @response.success?,
43
+ "Invalid response code #{@response.response_code} for url #{url}")
44
+ end
45
+ end
46
+
47
+ - Use the link validator to validate your staging or production server over HTTP:
48
+
49
+ ./vendor/plugins/html_test/script/validate http://my.blog.com --validators tidy,xmllint
50
+
51
+ - Configuration options for your tests
52
+
53
+ Here is a list of configuration options to use in test/test_helper.rb:
54
+
55
+ # # Validates all controller and integration test requests if set to true:
56
+ # ApplicationController.validate_all = true # Default: false.
57
+ # ApplicationController.validators = [:tidy, :w3c, :xmllint] # Default: [:tidy]. Which validators to use.
58
+ # # A list of regular expressions for Tidy warnings to ignore:
59
+ # Html::Test::Validator.tidy_ignore_list = [/<table> lacks "summary" attribute/] # Default: [].
60
+ # # Set the URL of a locally installed W3C validator here:
61
+ # Html::Test::Validator.w3c_url = "http://localhost/validator/htdocs/check" # Default: "http://validator.w3.org/check"
62
+ # Html::Test::Validator.w3c_show_source = "0" # Default: "1". Whether to list HTML document in the W3C report
63
+ # ApplicationController.check_urls = true # Default: false. Whether to check URLs in all links
64
+ # ApplicationController.check_redirects = true # Default: false. Whether to check URLs in all redirects
65
+
66
+ == Validators and Dependencies
67
+ To use Tidy for HTML validation you need the rails_tidy plugin.
68
+ The xmllint validation option requires xmllint to
69
+ be available on the command line. The xmllint validator is part of
70
+ libxml2. The W3C validator has no dependencies since we access it via
71
+ the web. To install the W3C validator locally (highly recommended), see
72
+ those instructions:
73
+
74
+ http://validator.w3.org/docs/install.html
75
+
76
+ On Mac OSX I currently use the following easy to install W3C validator:
77
+
78
+ http://habilis.net/validator-sac
79
+
80
+ I recommend using both the tidy and W3C validators (or xmllint if for some reason you can't use
81
+ the W3C validator). Tidy gives useful warnings for example about empty tags,
82
+ but it misses obvious validation failures such as lack of HTML
83
+ quoting or unclosed tags. The W3C validator offers much better reports for debugging than
84
+ xmllint. The W3C HTML reports are written to disk so you can bring it up in your browser for debugging.
85
+
86
+ The xmllint validator will use the XHTML 1.0 strict DTD by default. To specify a different DTD,
87
+ have the Html::Test::Validator.dtd(document) method return the path to your DTD file. If you
88
+ prefer to use the DTD referenced in the DOCTYPE declaration (can be very slow) then have the dtd
89
+ method return the string "doctype".
90
+
91
+ If you are using a catch-all route for 404:s, then you need to implement the method
92
+ Html::Test::UrlChecker#check_not_404(url, params) and throw an exception if that route is invoked.
93
+
94
+ There are methods such as skip_url?(url) and should_validate? that you can override to control
95
+ which pages get validated and which URLs get checked.
96
+
97
+ == Tests
98
+ If you make changes to this plugin, remember to run the tests with rake. The tests
99
+ require the rails_tidy and mocha plugins as well as xmllint.
100
+
101
+ == Author
102
+ Peter Marklund (http://marklunds.com)
103
+
104
+ == License
105
+ Licensed under the same terms as Ruby on Rails.
106
+
107
+
108
+
109
+
110
+
111
+
112
+ == Gemified with Jeweler
113
+
114
+ vi Rakefile
115
+ rake version:write
116
+
117
+ rake version:bump:patch
118
+ rake version:bump:minor
119
+ rake version:bump:major
120
+
121
+ rake gemspec
122
+
123
+ rake install
124
+ rake release
125
+
126
+ == Testing
127
+
128
+ Since upgrading some apps to rails 3, I found that this gem has some issues.
129
+ So, I'm wrapping the repo code in a rails 3 app solely for testing.
130
+ During gem creation/installation only the necessary code will be included.
131
+
132
+ Features untested in rails 3 due to me not using them ...
133
+
134
+ * the tidy validator
135
+ * the check_urls option
136
+ * ActionController::Routing::Routes doesn't exist in Rails 3
137
+ * also note, Test::Unit::AssertionFailedError doesn't exist in Ruby 1.9
138
+ * replaced all with "MiniTest::Assertion"
139
+ * these assert_raises are wrapped around assertion that don't have a negative
140
+ * also, the gem now adds the Gemfile dependencies to it which isn't really true
141
+
142
+
data/Rakefile ADDED
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env rake
2
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
3
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4
+
5
+ require File.expand_path('../config/application', __FILE__)
6
+
7
+ HtmlTest::Application.load_tasks
8
+
9
+ require 'rake'
10
+ require 'rake/testtask'
11
+ #require 'rake/rdoctask'
12
+ require 'rdoc/task'
13
+
14
+ desc 'Default: run unit tests.'
15
+ task :default => :test
16
+
17
+ desc 'Test the html_test plugin.'
18
+ Rake::TestTask.new(:test) do |t|
19
+ t.libs << 'test'
20
+ t.libs << 'lib'
21
+ t.pattern = 'test/**/*_test.rb'
22
+ t.verbose = true
23
+ end
24
+
25
+ desc 'Generate documentation for the html_test plugin.'
26
+ Rake::RDocTask.new(:rdoc) do |rdoc|
27
+ rdoc.rdoc_dir = 'rdoc'
28
+ rdoc.title = 'HtmlTest'
29
+ rdoc.options << '--line-numbers' << '--inline-source'
30
+ rdoc.rdoc_files.include('README')
31
+ rdoc.rdoc_files.include('lib/**/*.rb')
32
+ end
33
+
34
+ begin
35
+ require 'jeweler'
36
+ Jeweler::Tasks.new do |gem|
37
+ gem.name = "ccls-html_test"
38
+ gem.summary = %Q{Ruby on Rails plugin for HTML validation and link checking}
39
+ gem.description = %Q{Ruby on Rails plugin for HTML validation and link checking}
40
+ gem.email = "github@jakewendt.com"
41
+ gem.homepage = "http://github.com/ccls/html_test"
42
+ gem.authors = ["Peter Marklund", "George 'Jake' Wendt"]
43
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
44
+
45
+ gem.files = FileList['**/*']
46
+ gem.files -= FileList['app/**/*']
47
+ gem.files -= FileList['config/**/*']
48
+ gem.files -= FileList['test/**/*']
49
+ gem.files -= FileList['log/**/*']
50
+ gem.files -= FileList['pkg/**/*']
51
+ gem.files -= FileList['**/versions/**/*']
52
+ gem.files -= FileList['*Gemfile*']
53
+ end
54
+ Jeweler::GemcutterTasks.new
55
+ rescue LoadError
56
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
57
+ end
58
+
59
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.3.5
@@ -0,0 +1,57 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "ccls-html_test"
8
+ s.version = "0.3.5"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Peter Marklund", "George 'Jake' Wendt"]
12
+ s.date = "2012-08-06"
13
+ s.description = "Ruby on Rails plugin for HTML validation and link checking"
14
+ s.email = "github@jakewendt.com"
15
+ s.extra_rdoc_files = [
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ "README.rdoc",
20
+ "Rakefile",
21
+ "VERSION",
22
+ "ccls-html_test.gemspec",
23
+ "lib/DTD/xhtml-lat1.ent",
24
+ "lib/DTD/xhtml-special.ent",
25
+ "lib/DTD/xhtml-symbol.ent",
26
+ "lib/DTD/xhtml.soc",
27
+ "lib/DTD/xhtml1-frameset.dtd",
28
+ "lib/DTD/xhtml1-strict.dtd",
29
+ "lib/DTD/xhtml1-transitional.dtd",
30
+ "lib/DTD/xhtml1.dcl",
31
+ "lib/assertions.rb",
32
+ "lib/ccls-html_test.rb",
33
+ "lib/html_test.rb",
34
+ "lib/link_validator.rb",
35
+ "lib/url_checker.rb",
36
+ "lib/url_selector.rb",
37
+ "lib/validate_filter.rb",
38
+ "lib/validator.rb",
39
+ "rails/init.rb",
40
+ "script/rails",
41
+ "script/validate"
42
+ ]
43
+ s.homepage = "http://github.com/ccls/html_test"
44
+ s.require_paths = ["lib"]
45
+ s.rubygems_version = "1.8.24"
46
+ s.summary = "Ruby on Rails plugin for HTML validation and link checking"
47
+
48
+ if s.respond_to? :specification_version then
49
+ s.specification_version = 3
50
+
51
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
52
+ else
53
+ end
54
+ else
55
+ end
56
+ end
57
+
@@ -0,0 +1,196 @@
1
+ <!-- Portions (C) International Organization for Standardization 1986
2
+ Permission to copy in any form is granted for use with
3
+ conforming SGML systems and applications as defined in
4
+ ISO 8879, provided this notice is included in all copies.
5
+ -->
6
+ <!-- Character entity set. Typical invocation:
7
+ <!ENTITY % HTMLlat1 PUBLIC
8
+ "-//W3C//ENTITIES Latin 1 for XHTML//EN"
9
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
10
+ %HTMLlat1;
11
+ -->
12
+
13
+ <!ENTITY nbsp "&#160;"> <!-- no-break space = non-breaking space,
14
+ U+00A0 ISOnum -->
15
+ <!ENTITY iexcl "&#161;"> <!-- inverted exclamation mark, U+00A1 ISOnum -->
16
+ <!ENTITY cent "&#162;"> <!-- cent sign, U+00A2 ISOnum -->
17
+ <!ENTITY pound "&#163;"> <!-- pound sign, U+00A3 ISOnum -->
18
+ <!ENTITY curren "&#164;"> <!-- currency sign, U+00A4 ISOnum -->
19
+ <!ENTITY yen "&#165;"> <!-- yen sign = yuan sign, U+00A5 ISOnum -->
20
+ <!ENTITY brvbar "&#166;"> <!-- broken bar = broken vertical bar,
21
+ U+00A6 ISOnum -->
22
+ <!ENTITY sect "&#167;"> <!-- section sign, U+00A7 ISOnum -->
23
+ <!ENTITY uml "&#168;"> <!-- diaeresis = spacing diaeresis,
24
+ U+00A8 ISOdia -->
25
+ <!ENTITY copy "&#169;"> <!-- copyright sign, U+00A9 ISOnum -->
26
+ <!ENTITY ordf "&#170;"> <!-- feminine ordinal indicator, U+00AA ISOnum -->
27
+ <!ENTITY laquo "&#171;"> <!-- left-pointing double angle quotation mark
28
+ = left pointing guillemet, U+00AB ISOnum -->
29
+ <!ENTITY not "&#172;"> <!-- not sign = angled dash,
30
+ U+00AC ISOnum -->
31
+ <!ENTITY shy "&#173;"> <!-- soft hyphen = discretionary hyphen,
32
+ U+00AD ISOnum -->
33
+ <!ENTITY reg "&#174;"> <!-- registered sign = registered trade mark sign,
34
+ U+00AE ISOnum -->
35
+ <!ENTITY macr "&#175;"> <!-- macron = spacing macron = overline
36
+ = APL overbar, U+00AF ISOdia -->
37
+ <!ENTITY deg "&#176;"> <!-- degree sign, U+00B0 ISOnum -->
38
+ <!ENTITY plusmn "&#177;"> <!-- plus-minus sign = plus-or-minus sign,
39
+ U+00B1 ISOnum -->
40
+ <!ENTITY sup2 "&#178;"> <!-- superscript two = superscript digit two
41
+ = squared, U+00B2 ISOnum -->
42
+ <!ENTITY sup3 "&#179;"> <!-- superscript three = superscript digit three
43
+ = cubed, U+00B3 ISOnum -->
44
+ <!ENTITY acute "&#180;"> <!-- acute accent = spacing acute,
45
+ U+00B4 ISOdia -->
46
+ <!ENTITY micro "&#181;"> <!-- micro sign, U+00B5 ISOnum -->
47
+ <!ENTITY para "&#182;"> <!-- pilcrow sign = paragraph sign,
48
+ U+00B6 ISOnum -->
49
+ <!ENTITY middot "&#183;"> <!-- middle dot = Georgian comma
50
+ = Greek middle dot, U+00B7 ISOnum -->
51
+ <!ENTITY cedil "&#184;"> <!-- cedilla = spacing cedilla, U+00B8 ISOdia -->
52
+ <!ENTITY sup1 "&#185;"> <!-- superscript one = superscript digit one,
53
+ U+00B9 ISOnum -->
54
+ <!ENTITY ordm "&#186;"> <!-- masculine ordinal indicator,
55
+ U+00BA ISOnum -->
56
+ <!ENTITY raquo "&#187;"> <!-- right-pointing double angle quotation mark
57
+ = right pointing guillemet, U+00BB ISOnum -->
58
+ <!ENTITY frac14 "&#188;"> <!-- vulgar fraction one quarter
59
+ = fraction one quarter, U+00BC ISOnum -->
60
+ <!ENTITY frac12 "&#189;"> <!-- vulgar fraction one half
61
+ = fraction one half, U+00BD ISOnum -->
62
+ <!ENTITY frac34 "&#190;"> <!-- vulgar fraction three quarters
63
+ = fraction three quarters, U+00BE ISOnum -->
64
+ <!ENTITY iquest "&#191;"> <!-- inverted question mark
65
+ = turned question mark, U+00BF ISOnum -->
66
+ <!ENTITY Agrave "&#192;"> <!-- latin capital letter A with grave
67
+ = latin capital letter A grave,
68
+ U+00C0 ISOlat1 -->
69
+ <!ENTITY Aacute "&#193;"> <!-- latin capital letter A with acute,
70
+ U+00C1 ISOlat1 -->
71
+ <!ENTITY Acirc "&#194;"> <!-- latin capital letter A with circumflex,
72
+ U+00C2 ISOlat1 -->
73
+ <!ENTITY Atilde "&#195;"> <!-- latin capital letter A with tilde,
74
+ U+00C3 ISOlat1 -->
75
+ <!ENTITY Auml "&#196;"> <!-- latin capital letter A with diaeresis,
76
+ U+00C4 ISOlat1 -->
77
+ <!ENTITY Aring "&#197;"> <!-- latin capital letter A with ring above
78
+ = latin capital letter A ring,
79
+ U+00C5 ISOlat1 -->
80
+ <!ENTITY AElig "&#198;"> <!-- latin capital letter AE
81
+ = latin capital ligature AE,
82
+ U+00C6 ISOlat1 -->
83
+ <!ENTITY Ccedil "&#199;"> <!-- latin capital letter C with cedilla,
84
+ U+00C7 ISOlat1 -->
85
+ <!ENTITY Egrave "&#200;"> <!-- latin capital letter E with grave,
86
+ U+00C8 ISOlat1 -->
87
+ <!ENTITY Eacute "&#201;"> <!-- latin capital letter E with acute,
88
+ U+00C9 ISOlat1 -->
89
+ <!ENTITY Ecirc "&#202;"> <!-- latin capital letter E with circumflex,
90
+ U+00CA ISOlat1 -->
91
+ <!ENTITY Euml "&#203;"> <!-- latin capital letter E with diaeresis,
92
+ U+00CB ISOlat1 -->
93
+ <!ENTITY Igrave "&#204;"> <!-- latin capital letter I with grave,
94
+ U+00CC ISOlat1 -->
95
+ <!ENTITY Iacute "&#205;"> <!-- latin capital letter I with acute,
96
+ U+00CD ISOlat1 -->
97
+ <!ENTITY Icirc "&#206;"> <!-- latin capital letter I with circumflex,
98
+ U+00CE ISOlat1 -->
99
+ <!ENTITY Iuml "&#207;"> <!-- latin capital letter I with diaeresis,
100
+ U+00CF ISOlat1 -->
101
+ <!ENTITY ETH "&#208;"> <!-- latin capital letter ETH, U+00D0 ISOlat1 -->
102
+ <!ENTITY Ntilde "&#209;"> <!-- latin capital letter N with tilde,
103
+ U+00D1 ISOlat1 -->
104
+ <!ENTITY Ograve "&#210;"> <!-- latin capital letter O with grave,
105
+ U+00D2 ISOlat1 -->
106
+ <!ENTITY Oacute "&#211;"> <!-- latin capital letter O with acute,
107
+ U+00D3 ISOlat1 -->
108
+ <!ENTITY Ocirc "&#212;"> <!-- latin capital letter O with circumflex,
109
+ U+00D4 ISOlat1 -->
110
+ <!ENTITY Otilde "&#213;"> <!-- latin capital letter O with tilde,
111
+ U+00D5 ISOlat1 -->
112
+ <!ENTITY Ouml "&#214;"> <!-- latin capital letter O with diaeresis,
113
+ U+00D6 ISOlat1 -->
114
+ <!ENTITY times "&#215;"> <!-- multiplication sign, U+00D7 ISOnum -->
115
+ <!ENTITY Oslash "&#216;"> <!-- latin capital letter O with stroke
116
+ = latin capital letter O slash,
117
+ U+00D8 ISOlat1 -->
118
+ <!ENTITY Ugrave "&#217;"> <!-- latin capital letter U with grave,
119
+ U+00D9 ISOlat1 -->
120
+ <!ENTITY Uacute "&#218;"> <!-- latin capital letter U with acute,
121
+ U+00DA ISOlat1 -->
122
+ <!ENTITY Ucirc "&#219;"> <!-- latin capital letter U with circumflex,
123
+ U+00DB ISOlat1 -->
124
+ <!ENTITY Uuml "&#220;"> <!-- latin capital letter U with diaeresis,
125
+ U+00DC ISOlat1 -->
126
+ <!ENTITY Yacute "&#221;"> <!-- latin capital letter Y with acute,
127
+ U+00DD ISOlat1 -->
128
+ <!ENTITY THORN "&#222;"> <!-- latin capital letter THORN,
129
+ U+00DE ISOlat1 -->
130
+ <!ENTITY szlig "&#223;"> <!-- latin small letter sharp s = ess-zed,
131
+ U+00DF ISOlat1 -->
132
+ <!ENTITY agrave "&#224;"> <!-- latin small letter a with grave
133
+ = latin small letter a grave,
134
+ U+00E0 ISOlat1 -->
135
+ <!ENTITY aacute "&#225;"> <!-- latin small letter a with acute,
136
+ U+00E1 ISOlat1 -->
137
+ <!ENTITY acirc "&#226;"> <!-- latin small letter a with circumflex,
138
+ U+00E2 ISOlat1 -->
139
+ <!ENTITY atilde "&#227;"> <!-- latin small letter a with tilde,
140
+ U+00E3 ISOlat1 -->
141
+ <!ENTITY auml "&#228;"> <!-- latin small letter a with diaeresis,
142
+ U+00E4 ISOlat1 -->
143
+ <!ENTITY aring "&#229;"> <!-- latin small letter a with ring above
144
+ = latin small letter a ring,
145
+ U+00E5 ISOlat1 -->
146
+ <!ENTITY aelig "&#230;"> <!-- latin small letter ae
147
+ = latin small ligature ae, U+00E6 ISOlat1 -->
148
+ <!ENTITY ccedil "&#231;"> <!-- latin small letter c with cedilla,
149
+ U+00E7 ISOlat1 -->
150
+ <!ENTITY egrave "&#232;"> <!-- latin small letter e with grave,
151
+ U+00E8 ISOlat1 -->
152
+ <!ENTITY eacute "&#233;"> <!-- latin small letter e with acute,
153
+ U+00E9 ISOlat1 -->
154
+ <!ENTITY ecirc "&#234;"> <!-- latin small letter e with circumflex,
155
+ U+00EA ISOlat1 -->
156
+ <!ENTITY euml "&#235;"> <!-- latin small letter e with diaeresis,
157
+ U+00EB ISOlat1 -->
158
+ <!ENTITY igrave "&#236;"> <!-- latin small letter i with grave,
159
+ U+00EC ISOlat1 -->
160
+ <!ENTITY iacute "&#237;"> <!-- latin small letter i with acute,
161
+ U+00ED ISOlat1 -->
162
+ <!ENTITY icirc "&#238;"> <!-- latin small letter i with circumflex,
163
+ U+00EE ISOlat1 -->
164
+ <!ENTITY iuml "&#239;"> <!-- latin small letter i with diaeresis,
165
+ U+00EF ISOlat1 -->
166
+ <!ENTITY eth "&#240;"> <!-- latin small letter eth, U+00F0 ISOlat1 -->
167
+ <!ENTITY ntilde "&#241;"> <!-- latin small letter n with tilde,
168
+ U+00F1 ISOlat1 -->
169
+ <!ENTITY ograve "&#242;"> <!-- latin small letter o with grave,
170
+ U+00F2 ISOlat1 -->
171
+ <!ENTITY oacute "&#243;"> <!-- latin small letter o with acute,
172
+ U+00F3 ISOlat1 -->
173
+ <!ENTITY ocirc "&#244;"> <!-- latin small letter o with circumflex,
174
+ U+00F4 ISOlat1 -->
175
+ <!ENTITY otilde "&#245;"> <!-- latin small letter o with tilde,
176
+ U+00F5 ISOlat1 -->
177
+ <!ENTITY ouml "&#246;"> <!-- latin small letter o with diaeresis,
178
+ U+00F6 ISOlat1 -->
179
+ <!ENTITY divide "&#247;"> <!-- division sign, U+00F7 ISOnum -->
180
+ <!ENTITY oslash "&#248;"> <!-- latin small letter o with stroke,
181
+ = latin small letter o slash,
182
+ U+00F8 ISOlat1 -->
183
+ <!ENTITY ugrave "&#249;"> <!-- latin small letter u with grave,
184
+ U+00F9 ISOlat1 -->
185
+ <!ENTITY uacute "&#250;"> <!-- latin small letter u with acute,
186
+ U+00FA ISOlat1 -->
187
+ <!ENTITY ucirc "&#251;"> <!-- latin small letter u with circumflex,
188
+ U+00FB ISOlat1 -->
189
+ <!ENTITY uuml "&#252;"> <!-- latin small letter u with diaeresis,
190
+ U+00FC ISOlat1 -->
191
+ <!ENTITY yacute "&#253;"> <!-- latin small letter y with acute,
192
+ U+00FD ISOlat1 -->
193
+ <!ENTITY thorn "&#254;"> <!-- latin small letter thorn,
194
+ U+00FE ISOlat1 -->
195
+ <!ENTITY yuml "&#255;"> <!-- latin small letter y with diaeresis,
196
+ U+00FF ISOlat1 -->