harvester 0.8.0.pre.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. data/CHANGELOG.rdoc +45 -0
  2. data/README.rdoc +74 -0
  3. data/Rakefile +28 -0
  4. data/bin/harvester +13 -0
  5. data/bin/harvester-chart +5 -0
  6. data/bin/harvester-clock +35 -0
  7. data/bin/harvester-db +15 -0
  8. data/bin/harvester-fetch +5 -0
  9. data/bin/harvester-generate +5 -0
  10. data/bin/harvester-jabber +6 -0
  11. data/bin/harvester-new +25 -0
  12. data/bin/harvester-post +5 -0
  13. data/bin/harvester-run +14 -0
  14. data/collections.yaml +15 -0
  15. data/config.yaml +13 -0
  16. data/data/ent/HTMLlat1.ent +194 -0
  17. data/data/ent/HTMLspecial.ent +77 -0
  18. data/data/ent/HTMLsymbol.ent +241 -0
  19. data/data/sql/dbd-mysql-isotime.diff +11 -0
  20. data/data/sql/harvester-0.6-mysql.diff +59 -0
  21. data/data/sql/harvester-0.7-mysql.diff +39 -0
  22. data/data/sql/mysql/chart.sql +1 -0
  23. data/data/sql/mysql/create.table.enclosures.sql +9 -0
  24. data/data/sql/mysql/create.table.items.sql +8 -0
  25. data/data/sql/mysql/create.table.jabbersettings.sql +5 -0
  26. data/data/sql/mysql/create.table.jabbersubscriptions.sql +5 -0
  27. data/data/sql/mysql/create.table.sources.sql +9 -0
  28. data/data/sql/mysql/create.view.last48hours.sql +1 -0
  29. data/data/sql/postgresql/chart.sql +1 -0
  30. data/data/sql/postgresql/create.table.enclosures.sql +9 -0
  31. data/data/sql/postgresql/create.table.items.sql +8 -0
  32. data/data/sql/postgresql/create.table.jabbersettings.sql +5 -0
  33. data/data/sql/postgresql/create.table.jabbersubscriptions.sql +5 -0
  34. data/data/sql/postgresql/create.table.sources.sql +9 -0
  35. data/data/sql/postgresql/create.view.last48hours.sql +1 -0
  36. data/data/sql/sqlite3/chart.sql +1 -0
  37. data/data/sql/sqlite3/create.table.enclosures.sql +9 -0
  38. data/data/sql/sqlite3/create.table.items.sql +8 -0
  39. data/data/sql/sqlite3/create.table.jabbersettings.sql +5 -0
  40. data/data/sql/sqlite3/create.table.jabbersubscriptions.sql +5 -0
  41. data/data/sql/sqlite3/create.table.sources.sql +9 -0
  42. data/data/sql/sqlite3/create.view.last48hours.sql +1 -0
  43. data/data/templates/atom-all.xml +88 -0
  44. data/data/templates/atom.xml +88 -0
  45. data/data/templates/index.html +412 -0
  46. data/data/templates/rss-all.rdf +86 -0
  47. data/data/templates/rss.rdf +85 -0
  48. data/data/templates/static/harvester.css +365 -0
  49. data/data/templates/static/harvester.gif +0 -0
  50. data/data/templates/static/harvester_ie7.css +15 -0
  51. data/data/templates/static/harvester_lte_ie6.css +27 -0
  52. data/harvester.gemspec +35 -0
  53. data/lib/harvester.rb +132 -0
  54. data/lib/harvester/chart.rb +72 -0
  55. data/lib/harvester/db.rb +123 -0
  56. data/lib/harvester/fetch.rb +96 -0
  57. data/lib/harvester/generate.rb +152 -0
  58. data/lib/harvester/generator/entity_translator.rb +46 -0
  59. data/lib/harvester/generator/link_absolutizer.rb +39 -0
  60. data/lib/harvester/jabber.rb +443 -0
  61. data/lib/harvester/mrss.rb +355 -0
  62. data/lib/harvester/post.rb +19 -0
  63. metadata +237 -0
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,45 @@
1
+ = Changelog
2
+
3
+ == 0.8
4
+ * ...
5
+
6
+ == 0.7
7
+ * XSLT templates
8
+ * Reworked MRSS
9
+ * HTML entity replacement
10
+ * Transactional database handling
11
+ * Favicon, style, photos
12
+ * Microformats in HTML template
13
+ * Chart timeline
14
+ * Jabberbot fixes
15
+ * HTTPS support optional
16
+
17
+ == 0.6
18
+ * Complete rewrite (excl. MRSS)
19
+ * YAML configuration
20
+ * Database backend (PostgreSQL)
21
+ * Fetcher is not using wget anymore and supports SSL, HTTP authentication and If-Modified-Since
22
+ * Fetcher operates threaded to request feeds parallelized
23
+ * Minor template variables renaming
24
+
25
+ == 0.5
26
+ * Fixed a syntax error ;-)
27
+ * Multiple further fixes
28
+ * The Jabber-bot
29
+ * ATOM support by Neingeist
30
+
31
+ == 0.4
32
+ * Blog variables available in <tmpl:iter-item/>
33
+ * index.html Template readability improvements, CSS now in extra
34
+ file
35
+
36
+ == 0.3.2
37
+ * All template elements are now escaped by default. Use
38
+ escape="false" if you really don't want to escape HTML-Tags and
39
+ such...
40
+ == 0.3.1
41
+ * Fixed bug where incorrect encoded feeds won't be displayed when
42
+ parsed for the first time
43
+
44
+ == 0.3
45
+ * Major overhaul
data/README.rdoc ADDED
@@ -0,0 +1,74 @@
1
+ = Harvester 0.8
2
+ The Harvester is a web-based Feed-Aggregator
3
+
4
+ A running instance can be seen at:
5
+ http://astroblog.spaceboyz.net/harvester/
6
+
7
+ The Harvester eats the feeds you want and produces a static html/feed page that aggregates all those.
8
+
9
+ == Installation
10
+
11
+ Install the harvester with
12
+
13
+ gem install harvester
14
+
15
+ You can now create a new harvester project with
16
+
17
+ harvester new <project_directory>
18
+
19
+ Then you will need to configure <tt>config.yaml</tt>, <tt>collections.yaml</tt> and the templates to suit your needs (see below). You also have to run <tt>harvester db create</tt> (in that directory) to create your initial database structure.
20
+
21
+ == Configuration
22
+
23
+ <tt>config.yaml</tt> contains general configuration, like paths, logs and timeouts. You can also configure your database there. The default database backend is SQLite3, but all the following ones are supported:
24
+ * SQLite3
25
+ * PostgreSQL
26
+ * MySQL
27
+
28
+ The <tt>collections.yaml</tt> file contains the links to your desired feeds.
29
+
30
+ == Todo
31
+ * Still some things broken after update
32
+ * Improve/fix feed parsing
33
+ * Tidy up templates
34
+ * Security issues
35
+ * Optimize performance
36
+ * Fix jabberbot
37
+ * Implement some kind of tag filters
38
+
39
+ == Usage
40
+
41
+ Then run
42
+
43
+ harvester run
44
+
45
+ in the project directory or run
46
+
47
+ harvester run -c path/to/config.yaml
48
+
49
+ This will create the output files. That's it ;).
50
+
51
+ Usually, you want to run this command automatically every x seconds/minutes. You can use a program like <tt>cron</tt> or simply run
52
+
53
+ harvester clock
54
+
55
+ to start a simple scheduler.
56
+
57
+ There some more harvester commands to explore. Run
58
+
59
+ harvester --help
60
+
61
+ to get a command list.
62
+
63
+ == Customizing the templates
64
+
65
+ ...
66
+
67
+ == Credits
68
+
69
+ * {Astro}[https://github.com/astro] (2005-2008)
70
+ * Neingeist
71
+ * Tigion
72
+ * Josef Spillner
73
+ * {J-_-L}[https://github.com/janlelis]
74
+ * Others (MySQL patch)
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ require 'fileutils'
2
+ GEMSPEC = 'harvester.gemspec'
3
+
4
+ def gemspec
5
+ @gemspec ||= eval(File.read( GEMSPEC ), binding, GEMSPEC)
6
+ end
7
+
8
+ desc "Build the gem"
9
+ task :gem => :gemspec do
10
+ sh "gem build #{GEMSPEC}"
11
+ FileUtils.mkdir_p 'pkg'
12
+ FileUtils.mv "#{gemspec.name}-#{gemspec.version}.gem", 'pkg'
13
+ end
14
+
15
+ desc "Install the gem locally (without docs)"
16
+ task :install => :gem do
17
+ sh %{gem install pkg/#{gemspec.name}-#{gemspec.version} --no-rdoc --no-ri}
18
+ end
19
+
20
+ desc "Generate the gemspec"
21
+ task :generate do
22
+ puts gemspec.to_ruby
23
+ end
24
+
25
+ desc "Validate the gemspec"
26
+ task :gemspec do
27
+ gemspec.validate
28
+ end
data/bin/harvester ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ # call sub-command executable
5
+ if ARGV[0] !~ /^-/ && sub_command = ARGV.shift
6
+ exec "#{ File.dirname(__FILE__) }/harvester-#{ sub_command }", *ARGV
7
+ end
8
+
9
+ ARGV << '--help' # if nothing else is set...
10
+
11
+ # check for options like --version or --help
12
+ require_relative '../lib/harvester'
13
+ Harvester.new_from_argv
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require_relative '../lib/harvester/chart'
5
+ Harvester.new_from_argv.chart!
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require_relative '../lib/harvester'
5
+ # see https://github.com/adamwiggins/clockwork/
6
+ # https://github.com/adamwiggins/clockwork/blob/master/bin/clockwork
7
+ require 'clockwork'
8
+ include Clockwork
9
+
10
+ # TODO monkey patch logger instead of puts
11
+
12
+ # # # # #
13
+
14
+ STDERR.sync = STDOUT.sync = true
15
+
16
+ harve = Harvester.new_from_argv
17
+ harve.logger.info 'CLOCK'
18
+
19
+ # get interval
20
+ if ARGV.first
21
+ interval = ARGV.shift.to_i
22
+ else
23
+ interval = harve.settings['interval'] || 2.minutes
24
+ end
25
+
26
+ harve.logger.info "[start] invoke harvester-run every #{ interval } seconds"
27
+
28
+ handler do |job|
29
+ # harve.logger.info '[start] invoke harvester'
30
+ spawn File.dirname(__FILE__) + '/harvester-run'
31
+ end
32
+
33
+ every interval, 'run'
34
+
35
+ run
data/bin/harvester-db ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require_relative '../lib/harvester/db'
5
+ harve = Harvester.new_from_argv
6
+
7
+ case action = ARGV.shift
8
+ when 'create'
9
+ harve.create!
10
+ when 'maintenance'
11
+ harve.maintenance!
12
+ else
13
+ puts '[DB] Do nothing...'
14
+ end
15
+
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require_relative '../lib/harvester/fetch'
5
+ Harvester.new_from_argv.fetch!
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require_relative '../lib/harvester/generate'
5
+ Harvester.new_from_argv.generate!
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ # TODO: pass differnet username as ARGV
5
+ require_relative '../lib/harvester/jabber'
6
+ Harvester.new_from_argv.jabber!
data/bin/harvester-new ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require 'fileutils'
5
+ require 'yaml'
6
+
7
+ if ARGV.empty?
8
+ puts "USAGE: harvester new <project_dir>"
9
+ exit
10
+ end
11
+
12
+ new = File.expand_path ARGV[0]
13
+ source = File.expand_path File.dirname(__FILE__) + '/..'
14
+
15
+ FileUtils.mkdir_p new
16
+ FileUtils.cp_r source + '/data/templates', new + '/templates'
17
+ FileUtils.cp source + '/collections.yaml', new + '/collections.yaml'
18
+ FileUtils.cp source + '/README.rdoc', new + '/README'
19
+
20
+ # edit default options
21
+ c = YAML::load_file source + '/config.yaml'
22
+ c['settings']['templates'] = 'templates'
23
+ File.open(new + '/config.yaml', 'w'){|out| YAML.dump(c, out) }
24
+
25
+ puts 'Created new harvester project at ' + ARGV[0]
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require_relative '../lib/harvester/post'
5
+ Harvester.new_from_argv.post! ARGV.shift
data/bin/harvester-run ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ # run a complete harvester update :)
5
+ require_relative '../lib/harvester/fetch'
6
+ require_relative '../lib/harvester/generate'
7
+ require_relative '../lib/harvester/chart'
8
+ require_relative '../lib/harvester/post'
9
+
10
+ harve = Harvester.new_from_argv
11
+ harve.fetch!
12
+ harve.generate!
13
+ harve.chart! unless harve.settings['no-chart']
14
+ harve.post!
data/collections.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ # this file contains all feed urls
3
+ blogs: # main feeds
4
+ #-
5
+ ticker: # the ticker only shows headlines
6
+ #-
7
+ projects: # e.g. github
8
+ #- http://github.com/feeds/astro/commits/harvester/blog-harvester.de
9
+ links: # e.g. delicious
10
+ #- http://feeds.delicious.com/rss/YYYYYYYYYYYYYY
11
+ photos: # e.g. flickr
12
+ #- "http://api.flickr.com/services/feeds/photos_public.gne?id=XXXXXXXX@N00&format=atom"
13
+ microblogs: # twitter & identi.ca
14
+ #- http://twitter.com/statuses/user_timeline/XXXXXXXX.rss
15
+ #- http://identi.ca/api/statuses/user_timeline/YYYYYYYYYYY.atom
data/config.yaml ADDED
@@ -0,0 +1,13 @@
1
+ ---
2
+ settings:
3
+ collections: collections.yaml
4
+ templates: data/templates
5
+ output: html
6
+ size limit: 202400
7
+ interval: 100
8
+ timeout: 20
9
+ log_file: STDOUT
10
+ log_level: debug
11
+ db:
12
+ driver: SQLite3
13
+ database: harvester.sqlite3
@@ -0,0 +1,194 @@
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//EN//HTML">
9
+ %HTMLlat1;
10
+ -->
11
+
12
+ <!ENTITY nbsp CDATA "&#160;" -- no-break space = non-breaking space,
13
+ U+00A0 ISOnum -->
14
+ <!ENTITY iexcl CDATA "&#161;" -- inverted exclamation mark, U+00A1 ISOnum -->
15
+ <!ENTITY cent CDATA "&#162;" -- cent sign, U+00A2 ISOnum -->
16
+ <!ENTITY pound CDATA "&#163;" -- pound sign, U+00A3 ISOnum -->
17
+ <!ENTITY curren CDATA "&#164;" -- currency sign, U+00A4 ISOnum -->
18
+ <!ENTITY yen CDATA "&#165;" -- yen sign = yuan sign, U+00A5 ISOnum -->
19
+ <!ENTITY brvbar CDATA "&#166;" -- broken bar = broken vertical bar,
20
+ U+00A6 ISOnum -->
21
+ <!ENTITY sect CDATA "&#167;" -- section sign, U+00A7 ISOnum -->
22
+ <!ENTITY uml CDATA "&#168;" -- diaeresis = spacing diaeresis,
23
+ U+00A8 ISOdia -->
24
+ <!ENTITY copy CDATA "&#169;" -- copyright sign, U+00A9 ISOnum -->
25
+ <!ENTITY ordf CDATA "&#170;" -- feminine ordinal indicator, U+00AA ISOnum -->
26
+ <!ENTITY laquo CDATA "&#171;" -- left-pointing double angle quotation mark
27
+ = left pointing guillemet, U+00AB ISOnum -->
28
+ <!ENTITY not CDATA "&#172;" -- not sign, U+00AC ISOnum -->
29
+ <!ENTITY shy CDATA "&#173;" -- soft hyphen = discretionary hyphen,
30
+ U+00AD ISOnum -->
31
+ <!ENTITY reg CDATA "&#174;" -- registered sign = registered trade mark sign,
32
+ U+00AE ISOnum -->
33
+ <!ENTITY macr CDATA "&#175;" -- macron = spacing macron = overline
34
+ = APL overbar, U+00AF ISOdia -->
35
+ <!ENTITY deg CDATA "&#176;" -- degree sign, U+00B0 ISOnum -->
36
+ <!ENTITY plusmn CDATA "&#177;" -- plus-minus sign = plus-or-minus sign,
37
+ U+00B1 ISOnum -->
38
+ <!ENTITY sup2 CDATA "&#178;" -- superscript two = superscript digit two
39
+ = squared, U+00B2 ISOnum -->
40
+ <!ENTITY sup3 CDATA "&#179;" -- superscript three = superscript digit three
41
+ = cubed, U+00B3 ISOnum -->
42
+ <!ENTITY acute CDATA "&#180;" -- acute accent = spacing acute,
43
+ U+00B4 ISOdia -->
44
+ <!ENTITY micro CDATA "&#181;" -- micro sign, U+00B5 ISOnum -->
45
+ <!ENTITY para CDATA "&#182;" -- pilcrow sign = paragraph sign,
46
+ U+00B6 ISOnum -->
47
+ <!ENTITY middot CDATA "&#183;" -- middle dot = Georgian comma
48
+ = Greek middle dot, U+00B7 ISOnum -->
49
+ <!ENTITY cedil CDATA "&#184;" -- cedilla = spacing cedilla, U+00B8 ISOdia -->
50
+ <!ENTITY sup1 CDATA "&#185;" -- superscript one = superscript digit one,
51
+ U+00B9 ISOnum -->
52
+ <!ENTITY ordm CDATA "&#186;" -- masculine ordinal indicator,
53
+ U+00BA ISOnum -->
54
+ <!ENTITY raquo CDATA "&#187;" -- right-pointing double angle quotation mark
55
+ = right pointing guillemet, U+00BB ISOnum -->
56
+ <!ENTITY frac14 CDATA "&#188;" -- vulgar fraction one quarter
57
+ = fraction one quarter, U+00BC ISOnum -->
58
+ <!ENTITY frac12 CDATA "&#189;" -- vulgar fraction one half
59
+ = fraction one half, U+00BD ISOnum -->
60
+ <!ENTITY frac34 CDATA "&#190;" -- vulgar fraction three quarters
61
+ = fraction three quarters, U+00BE ISOnum -->
62
+ <!ENTITY iquest CDATA "&#191;" -- inverted question mark
63
+ = turned question mark, U+00BF ISOnum -->
64
+ <!ENTITY Agrave CDATA "&#192;" -- latin capital letter A with grave
65
+ = latin capital letter A grave,
66
+ U+00C0 ISOlat1 -->
67
+ <!ENTITY Aacute CDATA "&#193;" -- latin capital letter A with acute,
68
+ U+00C1 ISOlat1 -->
69
+ <!ENTITY Acirc CDATA "&#194;" -- latin capital letter A with circumflex,
70
+ U+00C2 ISOlat1 -->
71
+ <!ENTITY Atilde CDATA "&#195;" -- latin capital letter A with tilde,
72
+ U+00C3 ISOlat1 -->
73
+ <!ENTITY Auml CDATA "&#196;" -- latin capital letter A with diaeresis,
74
+ U+00C4 ISOlat1 -->
75
+ <!ENTITY Aring CDATA "&#197;" -- latin capital letter A with ring above
76
+ = latin capital letter A ring,
77
+ U+00C5 ISOlat1 -->
78
+ <!ENTITY AElig CDATA "&#198;" -- latin capital letter AE
79
+ = latin capital ligature AE,
80
+ U+00C6 ISOlat1 -->
81
+ <!ENTITY Ccedil CDATA "&#199;" -- latin capital letter C with cedilla,
82
+ U+00C7 ISOlat1 -->
83
+ <!ENTITY Egrave CDATA "&#200;" -- latin capital letter E with grave,
84
+ U+00C8 ISOlat1 -->
85
+ <!ENTITY Eacute CDATA "&#201;" -- latin capital letter E with acute,
86
+ U+00C9 ISOlat1 -->
87
+ <!ENTITY Ecirc CDATA "&#202;" -- latin capital letter E with circumflex,
88
+ U+00CA ISOlat1 -->
89
+ <!ENTITY Euml CDATA "&#203;" -- latin capital letter E with diaeresis,
90
+ U+00CB ISOlat1 -->
91
+ <!ENTITY Igrave CDATA "&#204;" -- latin capital letter I with grave,
92
+ U+00CC ISOlat1 -->
93
+ <!ENTITY Iacute CDATA "&#205;" -- latin capital letter I with acute,
94
+ U+00CD ISOlat1 -->
95
+ <!ENTITY Icirc CDATA "&#206;" -- latin capital letter I with circumflex,
96
+ U+00CE ISOlat1 -->
97
+ <!ENTITY Iuml CDATA "&#207;" -- latin capital letter I with diaeresis,
98
+ U+00CF ISOlat1 -->
99
+ <!ENTITY ETH CDATA "&#208;" -- latin capital letter ETH, U+00D0 ISOlat1 -->
100
+ <!ENTITY Ntilde CDATA "&#209;" -- latin capital letter N with tilde,
101
+ U+00D1 ISOlat1 -->
102
+ <!ENTITY Ograve CDATA "&#210;" -- latin capital letter O with grave,
103
+ U+00D2 ISOlat1 -->
104
+ <!ENTITY Oacute CDATA "&#211;" -- latin capital letter O with acute,
105
+ U+00D3 ISOlat1 -->
106
+ <!ENTITY Ocirc CDATA "&#212;" -- latin capital letter O with circumflex,
107
+ U+00D4 ISOlat1 -->
108
+ <!ENTITY Otilde CDATA "&#213;" -- latin capital letter O with tilde,
109
+ U+00D5 ISOlat1 -->
110
+ <!ENTITY Ouml CDATA "&#214;" -- latin capital letter O with diaeresis,
111
+ U+00D6 ISOlat1 -->
112
+ <!ENTITY times CDATA "&#215;" -- multiplication sign, U+00D7 ISOnum -->
113
+ <!ENTITY Oslash CDATA "&#216;" -- latin capital letter O with stroke
114
+ = latin capital letter O slash,
115
+ U+00D8 ISOlat1 -->
116
+ <!ENTITY Ugrave CDATA "&#217;" -- latin capital letter U with grave,
117
+ U+00D9 ISOlat1 -->
118
+ <!ENTITY Uacute CDATA "&#218;" -- latin capital letter U with acute,
119
+ U+00DA ISOlat1 -->
120
+ <!ENTITY Ucirc CDATA "&#219;" -- latin capital letter U with circumflex,
121
+ U+00DB ISOlat1 -->
122
+ <!ENTITY Uuml CDATA "&#220;" -- latin capital letter U with diaeresis,
123
+ U+00DC ISOlat1 -->
124
+ <!ENTITY Yacute CDATA "&#221;" -- latin capital letter Y with acute,
125
+ U+00DD ISOlat1 -->
126
+ <!ENTITY THORN CDATA "&#222;" -- latin capital letter THORN,
127
+ U+00DE ISOlat1 -->
128
+ <!ENTITY szlig CDATA "&#223;" -- latin small letter sharp s = ess-zed,
129
+ U+00DF ISOlat1 -->
130
+ <!ENTITY agrave CDATA "&#224;" -- latin small letter a with grave
131
+ = latin small letter a grave,
132
+ U+00E0 ISOlat1 -->
133
+ <!ENTITY aacute CDATA "&#225;" -- latin small letter a with acute,
134
+ U+00E1 ISOlat1 -->
135
+ <!ENTITY acirc CDATA "&#226;" -- latin small letter a with circumflex,
136
+ U+00E2 ISOlat1 -->
137
+ <!ENTITY atilde CDATA "&#227;" -- latin small letter a with tilde,
138
+ U+00E3 ISOlat1 -->
139
+ <!ENTITY auml CDATA "&#228;" -- latin small letter a with diaeresis,
140
+ U+00E4 ISOlat1 -->
141
+ <!ENTITY aring CDATA "&#229;" -- latin small letter a with ring above
142
+ = latin small letter a ring,
143
+ U+00E5 ISOlat1 -->
144
+ <!ENTITY aelig CDATA "&#230;" -- latin small letter ae
145
+ = latin small ligature ae, U+00E6 ISOlat1 -->
146
+ <!ENTITY ccedil CDATA "&#231;" -- latin small letter c with cedilla,
147
+ U+00E7 ISOlat1 -->
148
+ <!ENTITY egrave CDATA "&#232;" -- latin small letter e with grave,
149
+ U+00E8 ISOlat1 -->
150
+ <!ENTITY eacute CDATA "&#233;" -- latin small letter e with acute,
151
+ U+00E9 ISOlat1 -->
152
+ <!ENTITY ecirc CDATA "&#234;" -- latin small letter e with circumflex,
153
+ U+00EA ISOlat1 -->
154
+ <!ENTITY euml CDATA "&#235;" -- latin small letter e with diaeresis,
155
+ U+00EB ISOlat1 -->
156
+ <!ENTITY igrave CDATA "&#236;" -- latin small letter i with grave,
157
+ U+00EC ISOlat1 -->
158
+ <!ENTITY iacute CDATA "&#237;" -- latin small letter i with acute,
159
+ U+00ED ISOlat1 -->
160
+ <!ENTITY icirc CDATA "&#238;" -- latin small letter i with circumflex,
161
+ U+00EE ISOlat1 -->
162
+ <!ENTITY iuml CDATA "&#239;" -- latin small letter i with diaeresis,
163
+ U+00EF ISOlat1 -->
164
+ <!ENTITY eth CDATA "&#240;" -- latin small letter eth, U+00F0 ISOlat1 -->
165
+ <!ENTITY ntilde CDATA "&#241;" -- latin small letter n with tilde,
166
+ U+00F1 ISOlat1 -->
167
+ <!ENTITY ograve CDATA "&#242;" -- latin small letter o with grave,
168
+ U+00F2 ISOlat1 -->
169
+ <!ENTITY oacute CDATA "&#243;" -- latin small letter o with acute,
170
+ U+00F3 ISOlat1 -->
171
+ <!ENTITY ocirc CDATA "&#244;" -- latin small letter o with circumflex,
172
+ U+00F4 ISOlat1 -->
173
+ <!ENTITY otilde CDATA "&#245;" -- latin small letter o with tilde,
174
+ U+00F5 ISOlat1 -->
175
+ <!ENTITY ouml CDATA "&#246;" -- latin small letter o with diaeresis,
176
+ U+00F6 ISOlat1 -->
177
+ <!ENTITY divide CDATA "&#247;" -- division sign, U+00F7 ISOnum -->
178
+ <!ENTITY oslash CDATA "&#248;" -- latin small letter o with stroke,
179
+ = latin small letter o slash,
180
+ U+00F8 ISOlat1 -->
181
+ <!ENTITY ugrave CDATA "&#249;" -- latin small letter u with grave,
182
+ U+00F9 ISOlat1 -->
183
+ <!ENTITY uacute CDATA "&#250;" -- latin small letter u with acute,
184
+ U+00FA ISOlat1 -->
185
+ <!ENTITY ucirc CDATA "&#251;" -- latin small letter u with circumflex,
186
+ U+00FB ISOlat1 -->
187
+ <!ENTITY uuml CDATA "&#252;" -- latin small letter u with diaeresis,
188
+ U+00FC ISOlat1 -->
189
+ <!ENTITY yacute CDATA "&#253;" -- latin small letter y with acute,
190
+ U+00FD ISOlat1 -->
191
+ <!ENTITY thorn CDATA "&#254;" -- latin small letter thorn,
192
+ U+00FE ISOlat1 -->
193
+ <!ENTITY yuml CDATA "&#255;" -- latin small letter y with diaeresis,
194
+ U+00FF ISOlat1 -->