harvester 0.8.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
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 -->