html-template 0.0.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +4 -0
- data/Manifest.txt +19 -0
- data/README.md +26 -0
- data/Rakefile +28 -0
- data/lib/html/template.rb +160 -0
- data/lib/html/template/version.rb +24 -0
- data/test/helper.rb +21 -0
- data/test/templates/opml.xml +32 -0
- data/test/templates/opml.xml.erb +17 -0
- data/test/templates/opml.xml.tmpl +17 -0
- data/test/templates/planet/README.md +7 -0
- data/test/templates/planet/atom.xml.tmpl +61 -0
- data/test/templates/planet/basic/index.html.tmpl +88 -0
- data/test/templates/planet/fancy/index.html.tmpl +125 -0
- data/test/templates/planet/foafroll.xml.tmpl +31 -0
- data/test/templates/planet/opml.xml.tmpl +15 -0
- data/test/templates/planet/rss10.xml.tmpl +37 -0
- data/test/templates/planet/rss20.xml.tmpl +30 -0
- data/test/test_merge.rb +103 -0
- metadata +97 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d7ee8a92f5791e4ac9a898027d3815cb0f4c3619
|
4
|
+
data.tar.gz: f20c60078147da549da1495b13abb55f7aef81f8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 49601653c67d7e9eb88813fe399e6aa738a8bb232d4048b98aaaa918335e9d22261d24f084243d545c5f6f9ae4849809ac49a30d3b210396e1ca138a47ec8455
|
7
|
+
data.tar.gz: cdbc81e61aabbac50bfd499d3ffa9efa3417d3652fe2610a32c66b39d597a17bc604431b78f1684031a055527f3618de78770e7f0394b84e5f3669972bb73bed
|
data/CHANGELOG.md
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
CHANGELOG.md
|
2
|
+
Manifest.txt
|
3
|
+
README.md
|
4
|
+
Rakefile
|
5
|
+
lib/html/template.rb
|
6
|
+
lib/html/template/version.rb
|
7
|
+
test/helper.rb
|
8
|
+
test/templates/opml.xml
|
9
|
+
test/templates/opml.xml.erb
|
10
|
+
test/templates/opml.xml.tmpl
|
11
|
+
test/templates/planet/README.md
|
12
|
+
test/templates/planet/atom.xml.tmpl
|
13
|
+
test/templates/planet/basic/index.html.tmpl
|
14
|
+
test/templates/planet/fancy/index.html.tmpl
|
15
|
+
test/templates/planet/foafroll.xml.tmpl
|
16
|
+
test/templates/planet/opml.xml.tmpl
|
17
|
+
test/templates/planet/rss10.xml.tmpl
|
18
|
+
test/templates/planet/rss20.xml.tmpl
|
19
|
+
test/test_merge.rb
|
data/README.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# html-template - old-style classic HTML template language / engine like it's 1999 (incl. back-to-the-future ERB converter)
|
2
|
+
|
3
|
+
|
4
|
+
* home :: [github.com/feedreader/pluto](https://github.com/feedreader/pluto)
|
5
|
+
* bugs :: [github.com/feedreader/pluto/issues](https://github.com/feedreader/pluto/issues)
|
6
|
+
* gem :: [rubygems.org/gems/html-template](https://rubygems.org/gems/html-template)
|
7
|
+
* rdoc :: [rubydoc.info/gems/html-template](http://rubydoc.info/gems/html-template)
|
8
|
+
* forum :: [groups.google.com/group/wwwmake](http://groups.google.com/group/wwwmake)
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
|
14
|
+
To be done
|
15
|
+
|
16
|
+
## License
|
17
|
+
|
18
|
+

|
19
|
+
|
20
|
+
The `html-template` scripts are dedicated to the public domain.
|
21
|
+
Use it as you please with no restrictions whatsoever.
|
22
|
+
|
23
|
+
## Questions? Comments?
|
24
|
+
|
25
|
+
Send them along to the [wwwmake Forum/Mailing List](http://groups.google.com/group/wwwmake).
|
26
|
+
Thanks!
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'hoe'
|
2
|
+
require './lib/html/template/version.rb'
|
3
|
+
|
4
|
+
Hoe.spec 'html-template' do
|
5
|
+
|
6
|
+
self.version = HtmlTemplate::VERSION
|
7
|
+
|
8
|
+
self.summary = "html-template - old-style classic HTML template language / engine like it's 1999 (incl. back-to-the-future ERB converter)"
|
9
|
+
self.description = summary
|
10
|
+
|
11
|
+
self.urls = ['https://github.com/feedreader/pluto']
|
12
|
+
|
13
|
+
self.author = 'Gerald Bauer'
|
14
|
+
self.email = 'wwwmake@googlegroups.com'
|
15
|
+
|
16
|
+
# switch extension to .markdown for gihub formatting
|
17
|
+
self.readme_file = 'README.md'
|
18
|
+
self.history_file = 'CHANGELOG.md'
|
19
|
+
|
20
|
+
self.extra_deps = []
|
21
|
+
|
22
|
+
self.licenses = ['Public Domain']
|
23
|
+
|
24
|
+
self.spec_extras = {
|
25
|
+
required_ruby_version: '>= 2.2.2'
|
26
|
+
}
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
require 'pp'
|
2
|
+
require 'date'
|
3
|
+
require 'time'
|
4
|
+
require 'erb'
|
5
|
+
require 'cgi'
|
6
|
+
require 'ostruct'
|
7
|
+
require 'fileutils'
|
8
|
+
|
9
|
+
|
10
|
+
# our own code
|
11
|
+
require 'html/template/version' # note: let version always get first
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
class HtmlTemplate
|
16
|
+
|
17
|
+
attr_reader :text ## returns converted template text (with "breaking" comments!!!)
|
18
|
+
|
19
|
+
def initialize( text )
|
20
|
+
@text = convert( text ) ## note: keep a copy of the converted template text
|
21
|
+
@template = ERB.new( strip_comments( @text ) )
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
VAR_RE = %r{<TMPL_(?<tag>VAR)
|
26
|
+
\s
|
27
|
+
(?<ident>[a-zA-Z_0-9]+)
|
28
|
+
>}x
|
29
|
+
|
30
|
+
IF_OPEN_RE = %r{(?<open><)TMPL_(?<tag>IF)
|
31
|
+
\s
|
32
|
+
(?<ident>[a-zA-Z_0-9]+)
|
33
|
+
>}x
|
34
|
+
|
35
|
+
IF_CLOSE_RE = %r{(?<close></)TMPL_(?<tag>IF)
|
36
|
+
>}x
|
37
|
+
|
38
|
+
LOOP_OPEN_RE = %r{(?<open><)TMPL_(?<tag>LOOP)
|
39
|
+
\s
|
40
|
+
(?<ident>[a-zA-Z_0-9]+)
|
41
|
+
>}x
|
42
|
+
|
43
|
+
LOOP_CLOSE_RE = %r{(?<close></)TMPL_(?<tag>LOOP)
|
44
|
+
>}x
|
45
|
+
|
46
|
+
CATCH_OPEN_RE = %r{(?<open><)TMPL_(?<unknown>[^>]+?)
|
47
|
+
>}x
|
48
|
+
|
49
|
+
|
50
|
+
ALL_RE = Regexp.union( VAR_RE,
|
51
|
+
IF_OPEN_RE,
|
52
|
+
IF_CLOSE_RE,
|
53
|
+
LOOP_OPEN_RE,
|
54
|
+
LOOP_CLOSE_RE,
|
55
|
+
CATCH_OPEN_RE )
|
56
|
+
|
57
|
+
|
58
|
+
def strip_comments( text )
|
59
|
+
## strip/remove comments lines starting with #
|
60
|
+
buf = String.new('') ## note: '' required for getting source encoding AND not ASCII-8BIT!!!
|
61
|
+
text.each_line do |line|
|
62
|
+
next if line.lstrip.start_with?( '#' )
|
63
|
+
buf << line
|
64
|
+
end
|
65
|
+
buf
|
66
|
+
end
|
67
|
+
|
68
|
+
def convert( text )
|
69
|
+
stack = []
|
70
|
+
|
71
|
+
## note: convert line-by-line
|
72
|
+
## allows comments and line no reporting etc.
|
73
|
+
buf = String.new('') ## note: '' required for getting source encoding AND not ASCII-8BIT!!!
|
74
|
+
lineno = 0
|
75
|
+
text.each_line do |line|
|
76
|
+
lineno += 1
|
77
|
+
|
78
|
+
if line.lstrip.start_with?( '#' ) ## or make it tripple ### - why? why not?
|
79
|
+
buf << line ## pass along as is for now!!
|
80
|
+
elsif line.strip.empty?
|
81
|
+
buf << line
|
82
|
+
else
|
83
|
+
buf << line.gsub( ALL_RE ) do |_|
|
84
|
+
m = $~ ## (global) last match object
|
85
|
+
|
86
|
+
tag = m[:tag]
|
87
|
+
tag_open = m[:open]
|
88
|
+
tag_close = m[:close]
|
89
|
+
|
90
|
+
ident = m[:ident]
|
91
|
+
unknown = m[:unknown] # catch all for unknown / unmatched tags
|
92
|
+
|
93
|
+
## todo/fix: rename ctx to scope or __ - why? why not?
|
94
|
+
## note: peek; get top stack item
|
95
|
+
## if top level (stack empty) => nothing
|
96
|
+
## otherwise => channel. or item. etc. (with trailing dot included!)
|
97
|
+
ctx = stack.empty? ? '' : "#{stack[-1]}."
|
98
|
+
|
99
|
+
code = if tag == 'VAR'
|
100
|
+
"<%= #{ctx}#{ident} %>"
|
101
|
+
elsif tag == 'LOOP' && tag_open
|
102
|
+
## assume plural ident e.g. channels
|
103
|
+
## cut-off last char, that is, the plural s channels => channel
|
104
|
+
## note: ALWAYS downcase (auto-generated) loop iterator/pass name
|
105
|
+
it = ident[0..-2].downcase
|
106
|
+
stack.push( it )
|
107
|
+
"<% #{ctx}#{ident}.each do |#{it}| %>"
|
108
|
+
elsif tag == 'LOOP' && tag_close
|
109
|
+
stack.pop
|
110
|
+
"<% end %>"
|
111
|
+
elsif tag == 'IF' && tag_open
|
112
|
+
"<% if #{ctx}#{ident} %>"
|
113
|
+
elsif tag == 'IF' && tag_close
|
114
|
+
"<% end %>"
|
115
|
+
elsif unknown && tag_open
|
116
|
+
puts "!! ERROR"
|
117
|
+
"<%# !!error - unknown open tag: #{unknown} %>"
|
118
|
+
else
|
119
|
+
raise ArgumentError ## unknown tag #{tag}
|
120
|
+
end
|
121
|
+
|
122
|
+
puts " line #{lineno} - match #{m[0]} replacing with: #{code}"
|
123
|
+
code
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end # each_line
|
128
|
+
buf
|
129
|
+
end # method convert
|
130
|
+
|
131
|
+
|
132
|
+
class Context < OpenStruct
|
133
|
+
## use a different name - why? why not?
|
134
|
+
## e.g. to_h, to_hash, vars, locals, assigns, etc.
|
135
|
+
def get_binding() binding; end
|
136
|
+
|
137
|
+
## add builtin helpers / shortcuts
|
138
|
+
def h( text ) CGI.escapeHTML( text ); end
|
139
|
+
end # class Template::Context
|
140
|
+
|
141
|
+
def render( **kwargs )
|
142
|
+
## todo: use locals / assigns or something instead of **kwargs - why? why not?
|
143
|
+
## allow/support (extra) locals / assigns - why? why not?
|
144
|
+
## note: Ruby >= 2.5 has ERB#result_with_hash - use later - why? why not?
|
145
|
+
@template.result( Context.new( **kwargs ).get_binding )
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
|
150
|
+
#####################
|
151
|
+
## add convenience aliases - why? why not?
|
152
|
+
HTMLTemplate = HtmlTemplate
|
153
|
+
module HTML
|
154
|
+
Template = HtmlTemplate
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
# say hello
|
159
|
+
puts HtmlTemplate.banner if $DEBUG || (defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG)
|
160
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# note: HtmlTemplate is a class (NOT a module) for now - change - why? why not?
|
2
|
+
|
3
|
+
|
4
|
+
class HtmlTemplate
|
5
|
+
MAJOR = 0
|
6
|
+
MINOR = 0
|
7
|
+
PATCH = 1
|
8
|
+
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
9
|
+
|
10
|
+
def self.version
|
11
|
+
VERSION
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.banner
|
15
|
+
### todo: add RUBY_PATCHLEVEL or RUBY_PATCH_LEVEL e.g. -p124
|
16
|
+
"html-template/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.root
|
20
|
+
File.expand_path( File.dirname(File.dirname(File.dirname(File.dirname(__FILE__)))) )
|
21
|
+
end
|
22
|
+
|
23
|
+
end # class HtmlTemplate
|
24
|
+
|
data/test/helper.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
## minitest setup
|
2
|
+
require 'minitest/autorun'
|
3
|
+
|
4
|
+
## our own code
|
5
|
+
require 'html/template'
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
########
|
10
|
+
## add some "global" helpers
|
11
|
+
require 'rexml/document'
|
12
|
+
|
13
|
+
def prettify_xml( xml )
|
14
|
+
d = REXML::Document.new( xml )
|
15
|
+
|
16
|
+
formatter = REXML::Formatters::Pretty.new( 2 ) # indent=2
|
17
|
+
formatter.compact = true # This is the magic line that does what you need!
|
18
|
+
pretty_xml = formatter.write( d.root, "" ) # todo/checl: what's 2nd arg used for ??
|
19
|
+
pretty_xml
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<opml version="1.1">
|
3
|
+
<head>
|
4
|
+
<title>OpenStreetMap Blogs</title>
|
5
|
+
<dateModified>Fri, 7 Feb 2020 00:00:00 +0000</dateModified>
|
6
|
+
<ownerName>OpenStreetMap</ownerName>
|
7
|
+
</head>
|
8
|
+
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<outline type="rss"
|
12
|
+
text="Shaun McDonald"
|
13
|
+
xmlUrl="http://blog.shaunmcdonald.me.uk/feed/"
|
14
|
+
htmlUrl="http://blog.shaunmcdonald.me.uk/" />
|
15
|
+
|
16
|
+
<outline type="rss"
|
17
|
+
text="Mapbox"
|
18
|
+
xmlUrl="https://blog.mapbox.com/feed/tagged/openstreetmap/"
|
19
|
+
htmlUrl="https://blog.mapbox.com/" />
|
20
|
+
|
21
|
+
<outline type="rss"
|
22
|
+
text="Mapillary"
|
23
|
+
xmlUrl="https://blog.mapillary.com/rss.xml"
|
24
|
+
htmlUrl="https://blog.mapillary.com" />
|
25
|
+
|
26
|
+
<outline type="rss"
|
27
|
+
text="Richard Fairhurst"
|
28
|
+
xmlUrl="http://blog.systemed.net/rss"
|
29
|
+
htmlUrl="http://blog.systemed.net/" />
|
30
|
+
|
31
|
+
</body>
|
32
|
+
</opml>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<opml version="1.1">
|
3
|
+
<head>
|
4
|
+
<title><%= name %></title>
|
5
|
+
<dateModified><%= date_822 %></dateModified>
|
6
|
+
<ownerName><%= owner_name %></ownerName>
|
7
|
+
</head>
|
8
|
+
|
9
|
+
<body>
|
10
|
+
<% channels.each do |channel| %>
|
11
|
+
<outline type="rss"
|
12
|
+
text="<%= channel.name %>"
|
13
|
+
xmlUrl="<%= channel.url %>"
|
14
|
+
<% if channel.channel_link %> htmlUrl="<%= channel.channel_link %>"<% end %> />
|
15
|
+
<% end %>
|
16
|
+
</body>
|
17
|
+
</opml>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<opml version="1.1">
|
3
|
+
<head>
|
4
|
+
<title><TMPL_VAR name></title>
|
5
|
+
<dateModified><TMPL_VAR date_822></dateModified>
|
6
|
+
<ownerName><TMPL_VAR owner_name></ownerName>
|
7
|
+
</head>
|
8
|
+
|
9
|
+
<body>
|
10
|
+
<TMPL_LOOP channels>
|
11
|
+
<outline type="rss"
|
12
|
+
text="<TMPL_VAR name>"
|
13
|
+
xmlUrl="<TMPL_VAR url>"
|
14
|
+
<TMPL_IF channel_link> htmlUrl="<TMPL_VAR channel_link>"</TMPL_IF> />
|
15
|
+
</TMPL_LOOP>
|
16
|
+
</body>
|
17
|
+
</opml>
|
@@ -0,0 +1,61 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
2
|
+
<feed xmlns="http://www.w3.org/2005/Atom">
|
3
|
+
|
4
|
+
<title><TMPL_VAR name></title>
|
5
|
+
<link rel="self" href="<TMPL_VAR feed ESCAPE="HTML">"/>
|
6
|
+
<link href="<TMPL_VAR link ESCAPE="HTML">"/>
|
7
|
+
<id><TMPL_VAR feed ESCAPE="HTML"></id>
|
8
|
+
<updated><TMPL_VAR date_iso></updated>
|
9
|
+
<generator uri="http://www.planetplanet.org/"><TMPL_VAR generator ESCAPE="HTML"></generator>
|
10
|
+
|
11
|
+
<TMPL_LOOP Items>
|
12
|
+
<entry<TMPL_IF channel_language> xml:lang="<TMPL_VAR channel_language>"</TMPL_IF>>
|
13
|
+
<title type="html"<TMPL_IF title_language> xml:lang="<TMPL_VAR title_language>"</TMPL_IF>><TMPL_VAR title ESCAPE="HTML"></title>
|
14
|
+
<link href="<TMPL_VAR link ESCAPE="HTML">"/>
|
15
|
+
<id><TMPL_VAR id ESCAPE="HTML"></id>
|
16
|
+
<updated><TMPL_VAR date_iso></updated>
|
17
|
+
<content type="html"<TMPL_IF content_language> xml:lang="<TMPL_VAR content_language>"</TMPL_IF>><TMPL_VAR content ESCAPE="HTML"></content>
|
18
|
+
<author>
|
19
|
+
<TMPL_IF author_name>
|
20
|
+
<name><TMPL_VAR author_name ESCAPE="HTML"></name>
|
21
|
+
<TMPL_IF author_email>
|
22
|
+
<email><TMPL_VAR author_email ESCAPE="HTML"></email>
|
23
|
+
</TMPL_IF author_email>
|
24
|
+
<TMPL_ELSE>
|
25
|
+
<TMPL_IF channel_author_name>
|
26
|
+
<name><TMPL_VAR channel_author_name ESCAPE="HTML"></name>
|
27
|
+
<TMPL_IF channel_author_email>
|
28
|
+
<email><TMPL_VAR channel_author_email ESCAPE="HTML"></email>
|
29
|
+
</TMPL_IF channel_author_email>
|
30
|
+
<TMPL_ELSE>
|
31
|
+
<name><TMPL_VAR channel_name ESCAPE="HTML"></name>
|
32
|
+
</TMPL_IF>
|
33
|
+
</TMPL_IF>
|
34
|
+
<uri><TMPL_VAR channel_link ESCAPE="HTML"></uri>
|
35
|
+
</author>
|
36
|
+
<source>
|
37
|
+
<TMPL_IF channel_title>
|
38
|
+
<title type="html"><TMPL_VAR channel_title ESCAPE="HTML"></title>
|
39
|
+
<TMPL_ELSE>
|
40
|
+
<title type="html"><TMPL_VAR channel_name ESCAPE="HTML"></title>
|
41
|
+
</TMPL_IF>
|
42
|
+
<TMPL_IF channel_subtitle>
|
43
|
+
<subtitle type="html"><TMPL_VAR channel_subtitle ESCAPE="HTML"></subtitle>
|
44
|
+
</TMPL_IF>
|
45
|
+
<link rel="self" href="<TMPL_VAR channel_url ESCAPE="HTML">"/>
|
46
|
+
<TMPL_IF channel_id>
|
47
|
+
<id><TMPL_VAR channel_id ESCAPE="HTML"></id>
|
48
|
+
<TMPL_ELSE>
|
49
|
+
<id><TMPL_VAR channel_url ESCAPE="HTML"></id>
|
50
|
+
</TMPL_IF>
|
51
|
+
<TMPL_IF channel_updated_iso>
|
52
|
+
<updated><TMPL_VAR channel_updated_iso></updated>
|
53
|
+
</TMPL_IF>
|
54
|
+
<TMPL_IF channel_rights>
|
55
|
+
<rights type="html"><TMPL_VAR channel_rights ESCAPE="HTML"></rights>
|
56
|
+
</TMPL_IF>
|
57
|
+
</source>
|
58
|
+
</entry>
|
59
|
+
|
60
|
+
</TMPL_LOOP>
|
61
|
+
</feed>
|
@@ -0,0 +1,88 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
2
|
+
<html>
|
3
|
+
|
4
|
+
### Planet HTML template.
|
5
|
+
###
|
6
|
+
### This is intended to demonstrate and document Planet's templating
|
7
|
+
### facilities, and at the same time provide a good base for you to
|
8
|
+
### modify into your own design.
|
9
|
+
###
|
10
|
+
### The output's a bit boring though, if you're after less documentation
|
11
|
+
### and more instant gratification, there's an example with a much
|
12
|
+
### prettier output in the fancy-examples/ directory of the Planet source.
|
13
|
+
|
14
|
+
### Lines like this are comments, and are automatically removed by the
|
15
|
+
### templating engine before processing.
|
16
|
+
|
17
|
+
|
18
|
+
### Planet makes a large number of variables available for your templates.
|
19
|
+
### See INSTALL for the complete list. The raw value can be placed in your
|
20
|
+
### output file using <TMPL_VAR varname>. We'll put the name of our
|
21
|
+
### Planet in the page title and again in an h1.
|
22
|
+
|
23
|
+
<head>
|
24
|
+
<title><TMPL_VAR name></title>
|
25
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
26
|
+
<meta name="generator" content="<TMPL_VAR generator ESCAPE="HTML">">
|
27
|
+
</head>
|
28
|
+
|
29
|
+
<body>
|
30
|
+
<h1><TMPL_VAR name></h1>
|
31
|
+
|
32
|
+
### One of the two loops available is the Channels loop. This allows you
|
33
|
+
### to easily create a list of subscriptions, which is exactly what we'll do
|
34
|
+
### here.
|
35
|
+
|
36
|
+
### Note that we can also expand variables inside HTML tags, but we need
|
37
|
+
### to be cautious and HTML-escape any illegal characters using the form
|
38
|
+
### <TMPL_VAR varname ESCAPE="HTML">
|
39
|
+
|
40
|
+
<div style="float: right">
|
41
|
+
<h2>Subscriptions</h2>
|
42
|
+
<ul>
|
43
|
+
<TMPL_LOOP Channels>
|
44
|
+
<li><a href="<TMPL_VAR link ESCAPE="HTML">" title="<TMPL_VAR title ESCAPE="HTML">"><TMPL_VAR name></a> <a href="<TMPL_VAR url ESCAPE="HTML">">(feed)</a></li>
|
45
|
+
</TMPL_LOOP>
|
46
|
+
</ul>
|
47
|
+
</div>
|
48
|
+
|
49
|
+
### The other loop is the Items loop, which will get iterated for each
|
50
|
+
### news item.
|
51
|
+
|
52
|
+
<TMPL_LOOP Items>
|
53
|
+
|
54
|
+
### Visually distinguish articles from different days by checking for
|
55
|
+
### the new_date flag. This demonstrates the <TMPL_IF varname> ... </TMPL_IF>
|
56
|
+
### check.
|
57
|
+
|
58
|
+
<TMPL_IF new_date>
|
59
|
+
<h2><TMPL_VAR new_date></h2>
|
60
|
+
</TMPL_IF>
|
61
|
+
|
62
|
+
### Group consecutive articles by the same author together by checking
|
63
|
+
### for the new_channel flag.
|
64
|
+
|
65
|
+
<TMPL_IF new_channel>
|
66
|
+
<h3><a href="<TMPL_VAR channel_link ESCAPE="HTML">" title="<TMPL_VAR channel_title ESCAPE="HTML">"><TMPL_VAR channel_name></a></h3>
|
67
|
+
</TMPL_IF>
|
68
|
+
|
69
|
+
|
70
|
+
<TMPL_IF title>
|
71
|
+
<h4><a href="<TMPL_VAR link ESCAPE="HTML">"><TMPL_VAR title></a></h4>
|
72
|
+
</TMPL_IF>
|
73
|
+
<p>
|
74
|
+
<TMPL_VAR content>
|
75
|
+
</p>
|
76
|
+
<p>
|
77
|
+
<em><a href="<TMPL_VAR link ESCAPE="HTML">"><TMPL_IF author>by <TMPL_VAR author> at </TMPL_IF><TMPL_VAR date></a></em>
|
78
|
+
</p>
|
79
|
+
</TMPL_LOOP>
|
80
|
+
|
81
|
+
<hr>
|
82
|
+
<p>
|
83
|
+
<a href="http://www.planetplanet.org/">Powered by Planet!</a><br>
|
84
|
+
<em>Last updated: <TMPL_VAR date></em>
|
85
|
+
</p>
|
86
|
+
</body>
|
87
|
+
|
88
|
+
</html>
|
@@ -0,0 +1,125 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
2
|
+
<html>
|
3
|
+
|
4
|
+
### Fancy Planet HTML template.
|
5
|
+
###
|
6
|
+
### When combined with the stylesheet and images in the output/ directory
|
7
|
+
### of the Planet source, this gives you a much prettier result than the
|
8
|
+
### default examples template and demonstrates how to use the config file
|
9
|
+
### to support things like faces
|
10
|
+
###
|
11
|
+
### For documentation on the more boring template elements, see
|
12
|
+
### examples/config.ini and examples/index.html.tmpl in the Planet source.
|
13
|
+
|
14
|
+
<head>
|
15
|
+
<title><TMPL_VAR name></title>
|
16
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
17
|
+
<meta name="generator" content="<TMPL_VAR generator ESCAPE="HTML">">
|
18
|
+
<link rel="stylesheet" href="planet.css" type="text/css">
|
19
|
+
<TMPL_IF feedtype>
|
20
|
+
<link rel="alternate" href="<TMPL_VAR feed ESCAPE="HTML">" title="<TMPL_VAR channel_title_plain ESCAPE="HTML">" type="application/<TMPL_VAR feedtype>+xml">
|
21
|
+
</TMPL_IF>
|
22
|
+
</head>
|
23
|
+
|
24
|
+
<body>
|
25
|
+
<h1><TMPL_VAR name></h1>
|
26
|
+
|
27
|
+
<TMPL_LOOP Items>
|
28
|
+
<TMPL_IF new_date>
|
29
|
+
<TMPL_UNLESS __FIRST__>
|
30
|
+
### End <div class="channelgroup">
|
31
|
+
</div>
|
32
|
+
### End <div class="daygroup">
|
33
|
+
</div>
|
34
|
+
</TMPL_UNLESS>
|
35
|
+
<div class="daygroup">
|
36
|
+
<h2><TMPL_VAR new_date></h2>
|
37
|
+
</TMPL_IF>
|
38
|
+
|
39
|
+
<TMPL_IF new_channel>
|
40
|
+
<TMPL_UNLESS new_date>
|
41
|
+
### End <div class="channelgroup">
|
42
|
+
</div>
|
43
|
+
</TMPL_UNLESS>
|
44
|
+
<div class="channelgroup">
|
45
|
+
|
46
|
+
### Planet provides template variables for *all* configuration options for
|
47
|
+
### the channel (and defaults), even if it doesn't know about them. We
|
48
|
+
### exploit this here to add hackergotchi faces to our channels. Planet
|
49
|
+
### doesn't know about the "face", "facewidth" and "faceheight" configuration
|
50
|
+
### variables, but makes them available to us anyway.
|
51
|
+
|
52
|
+
<h3><a href="<TMPL_VAR channel_link ESCAPE="HTML">" title="<TMPL_VAR channel_title_plain ESCAPE="HTML">"><TMPL_VAR channel_name></a></h3>
|
53
|
+
<TMPL_IF channel_face>
|
54
|
+
<img class="face" src="images/<TMPL_VAR channel_face ESCAPE="HTML">" width="<TMPL_VAR channel_facewidth ESCAPE="HTML">" height="<TMPL_VAR channel_faceheight ESCAPE="HTML">" alt="">
|
55
|
+
</TMPL_IF>
|
56
|
+
</TMPL_IF>
|
57
|
+
|
58
|
+
|
59
|
+
<div class="entrygroup" id="<TMPL_VAR id>"<TMPL_IF channel_language> lang="<TMPL_VAR channel_language>"</TMPL_IF>>
|
60
|
+
<TMPL_IF title>
|
61
|
+
<h4<TMPL_IF title_language> lang="<TMPL_VAR title_language>"</TMPL_IF>><a href="<TMPL_VAR link ESCAPE="HTML">"><TMPL_VAR title></a></h4>
|
62
|
+
</TMPL_IF>
|
63
|
+
<div class="entry">
|
64
|
+
<div class="content"<TMPL_IF content_language> lang="<TMPL_VAR content_language>"</TMPL_IF>>
|
65
|
+
<TMPL_VAR content>
|
66
|
+
</div>
|
67
|
+
|
68
|
+
### Planet also makes available all of the information from the feed
|
69
|
+
### that it can. Use the 'planet-cache' tool on the cache file for
|
70
|
+
### a particular feed to find out what additional keys it supports.
|
71
|
+
### Comment extra fields are 'author' and 'category' which we
|
72
|
+
### demonstrate below.
|
73
|
+
|
74
|
+
<p class="date">
|
75
|
+
<a href="<TMPL_VAR link ESCAPE="HTML">"><TMPL_IF author>by <TMPL_VAR author> at </TMPL_IF><TMPL_VAR date><TMPL_IF category> under <TMPL_VAR category></TMPL_IF></a>
|
76
|
+
</p>
|
77
|
+
</div>
|
78
|
+
</div>
|
79
|
+
|
80
|
+
<TMPL_IF __LAST__>
|
81
|
+
### End <div class="channelgroup">
|
82
|
+
</div>
|
83
|
+
### End <div class="daygroup">
|
84
|
+
</div>
|
85
|
+
</TMPL_IF>
|
86
|
+
</TMPL_LOOP>
|
87
|
+
|
88
|
+
|
89
|
+
<div class="sidebar">
|
90
|
+
<img src="images/logo.png" width="136" height="136" alt="">
|
91
|
+
|
92
|
+
<h2>Subscriptions</h2>
|
93
|
+
<ul>
|
94
|
+
<TMPL_LOOP Channels>
|
95
|
+
<li>
|
96
|
+
<a href="<TMPL_VAR url ESCAPE="HTML">" title="subscribe"><img src="images/feed-icon-10x10.png" alt="(feed)"></a> <a <TMPL_IF link>href="<TMPL_VAR link ESCAPE="HTML">" </TMPL_IF><TMPL_IF message>class="message" title="<TMPL_VAR message ESCAPE="HTML">"</TMPL_IF><TMPL_UNLESS message>title="<TMPL_VAR title_plain ESCAPE="HTML">"</TMPL_UNLESS>><TMPL_VAR name></a>
|
97
|
+
</li>
|
98
|
+
</TMPL_LOOP>
|
99
|
+
</ul>
|
100
|
+
|
101
|
+
<p>
|
102
|
+
<strong>Last updated:</strong><br>
|
103
|
+
<TMPL_VAR date><br>
|
104
|
+
<em>All times are UTC.</em><br>
|
105
|
+
<br>
|
106
|
+
Powered by:<br>
|
107
|
+
<a href="http://www.planetplanet.org/"><img src="images/planet.png" width="80" height="15" alt="Planet" border="0"></a>
|
108
|
+
</p>
|
109
|
+
|
110
|
+
<p>
|
111
|
+
<h2>Planetarium:</h2>
|
112
|
+
<ul>
|
113
|
+
<li><a href="http://www.planetapache.org/">Planet Apache</a></li>
|
114
|
+
<li><a href="http://planet.debian.net/">Planet Debian</a></li>
|
115
|
+
<li><a href="http://planet.freedesktop.org/">Planet freedesktop.org</a></li>
|
116
|
+
<li><a href="http://planet.gnome.org/">Planet GNOME</a></li>
|
117
|
+
<li><a href="http://planetsun.org/">Planet Sun</a></li>
|
118
|
+
<li><a href="http://fedora.linux.duke.edu/fedorapeople/">Fedora People</a></li>
|
119
|
+
<li><a href="http://www.planetplanet.org/">more...</a></li>
|
120
|
+
</ul>
|
121
|
+
</p>
|
122
|
+
</div>
|
123
|
+
</body>
|
124
|
+
|
125
|
+
</html>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<rdf:RDF
|
3
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
4
|
+
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
|
5
|
+
xmlns:foaf="http://xmlns.com/foaf/0.1/"
|
6
|
+
xmlns:rss="http://purl.org/rss/1.0/"
|
7
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
8
|
+
>
|
9
|
+
<foaf:Group>
|
10
|
+
<foaf:name><TMPL_VAR name ESCAPE="HTML"></foaf:name>
|
11
|
+
<foaf:homepage><TMPL_VAR link ESCAPE="HTML"></foaf:homepage>
|
12
|
+
<rdfs:seeAlso rdf:resource="<TMPL_VAR url ESCAPE="HTML">" />
|
13
|
+
|
14
|
+
<TMPL_LOOP Channels>
|
15
|
+
<foaf:member>
|
16
|
+
<foaf:Agent>
|
17
|
+
<foaf:name><TMPL_VAR name ESCAPE="HTML"></foaf:name>
|
18
|
+
<foaf:weblog>
|
19
|
+
<foaf:Document rdf:about="<TMPL_VAR link ESCAPE="HTML">">
|
20
|
+
<dc:title><TMPL_VAR title_plain ESCAPE="HTML"></dc:title>
|
21
|
+
<rdfs:seeAlso>
|
22
|
+
<rss:channel rdf:about="<TMPL_VAR url ESCAPE="HTML">" />
|
23
|
+
</rdfs:seeAlso>
|
24
|
+
</foaf:Document>
|
25
|
+
</foaf:weblog>
|
26
|
+
</foaf:Agent>
|
27
|
+
</foaf:member>
|
28
|
+
</TMPL_LOOP>
|
29
|
+
|
30
|
+
</foaf:Group>
|
31
|
+
</rdf:RDF>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<opml version="1.1">
|
3
|
+
<head>
|
4
|
+
<title><TMPL_VAR name ESCAPE="HTML"></title>
|
5
|
+
<dateModified><TMPL_VAR date_822></dateModified>
|
6
|
+
<ownerName><TMPL_VAR owner_name></ownerName>
|
7
|
+
<ownerEmail><TMPL_VAR owner_email></ownerEmail>
|
8
|
+
</head>
|
9
|
+
|
10
|
+
<body>
|
11
|
+
<TMPL_LOOP Channels>
|
12
|
+
<outline type="rss" text="<TMPL_VAR name ESCAPE="HTML">" xmlUrl="<TMPL_VAR url ESCAPE="HTML">" title="<TMPL_IF title><TMPL_VAR title ESCAPE="HTML"></TMPL_IF><TMPL_UNLESS title><TMPL_VAR name ESCAPE="HTML"></TMPL_UNLESS>"<TMPL_IF channel_link> htmlUrl="<TMPL_VAR channel_link ESCAPE="HTML">"</TMPL_IF> />
|
13
|
+
</TMPL_LOOP>
|
14
|
+
</body>
|
15
|
+
</opml>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<rdf:RDF
|
3
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
4
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
5
|
+
xmlns:foaf="http://xmlns.com/foaf/0.1/"
|
6
|
+
xmlns:content="http://purl.org/rss/1.0/modules/content/"
|
7
|
+
xmlns="http://purl.org/rss/1.0/"
|
8
|
+
>
|
9
|
+
<channel rdf:about="<TMPL_VAR link ESCAPE="HTML">">
|
10
|
+
<title><TMPL_VAR name ESCAPE="HTML"></title>
|
11
|
+
<link><TMPL_VAR link ESCAPE="HTML"></link>
|
12
|
+
<description><TMPL_VAR name ESCAPE="HTML"> - <TMPL_VAR link ESCAPE="HTML"></description>
|
13
|
+
|
14
|
+
<items>
|
15
|
+
<rdf:Seq>
|
16
|
+
<TMPL_LOOP Items>
|
17
|
+
<rdf:li rdf:resource="<TMPL_VAR id ESCAPE="HTML">" />
|
18
|
+
</TMPL_LOOP>
|
19
|
+
</rdf:Seq>
|
20
|
+
</items>
|
21
|
+
</channel>
|
22
|
+
|
23
|
+
<TMPL_LOOP Items>
|
24
|
+
<item rdf:about="<TMPL_VAR id ESCAPE="HTML">">
|
25
|
+
<title><TMPL_VAR channel_name ESCAPE="HTML"><TMPL_IF title>: <TMPL_VAR title_plain ESCAPE="HTML"></TMPL_IF></title>
|
26
|
+
<link><TMPL_VAR link ESCAPE="HTML"></link>
|
27
|
+
<TMPL_IF content>
|
28
|
+
<content:encoded><TMPL_VAR content ESCAPE="HTML"></content:encoded>
|
29
|
+
</TMPL_IF>
|
30
|
+
<dc:date><TMPL_VAR date_iso></dc:date>
|
31
|
+
<TMPL_IF author_name>
|
32
|
+
<dc:creator><TMPL_VAR author_name></dc:creator>
|
33
|
+
</TMPL_IF>
|
34
|
+
</item>
|
35
|
+
</TMPL_LOOP>
|
36
|
+
|
37
|
+
</rdf:RDF>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<rss version="2.0">
|
3
|
+
|
4
|
+
<channel>
|
5
|
+
<title><TMPL_VAR name></title>
|
6
|
+
<link><TMPL_VAR link ESCAPE="HTML"></link>
|
7
|
+
<language>en</language>
|
8
|
+
<description><TMPL_VAR name ESCAPE="HTML"> - <TMPL_VAR link ESCAPE="HTML"></description>
|
9
|
+
|
10
|
+
<TMPL_LOOP Items>
|
11
|
+
<item>
|
12
|
+
<title><TMPL_VAR channel_name ESCAPE="HTML"><TMPL_IF title>: <TMPL_VAR title_plain ESCAPE="HTML"></TMPL_IF></title>
|
13
|
+
<guid><TMPL_VAR id ESCAPE="HTML"></guid>
|
14
|
+
<link><TMPL_VAR link ESCAPE="HTML"></link>
|
15
|
+
<TMPL_IF content>
|
16
|
+
<description><TMPL_VAR content ESCAPE="HTML"></description>
|
17
|
+
</TMPL_IF>
|
18
|
+
<pubDate><TMPL_VAR date_822></pubDate>
|
19
|
+
<TMPL_IF author_email>
|
20
|
+
<TMPL_IF author_name>
|
21
|
+
<author><TMPL_VAR author_email> (<TMPL_VAR author_name>)</author>
|
22
|
+
<TMPL_ELSE>
|
23
|
+
<author><TMPL_VAR author_email></author>
|
24
|
+
</TMPL_IF>
|
25
|
+
</TMPL_IF>
|
26
|
+
</item>
|
27
|
+
</TMPL_LOOP>
|
28
|
+
|
29
|
+
</channel>
|
30
|
+
</rss>
|
data/test/test_merge.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_merge.rb
|
4
|
+
|
5
|
+
require 'helper'
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
class TestMerge < MiniTest::Test
|
10
|
+
|
11
|
+
Site = Struct.new( :name, :owner_name, :date_822, :channels )
|
12
|
+
Channel = Struct.new( :name, :url, :channel_link )
|
13
|
+
|
14
|
+
def sample1
|
15
|
+
Site.new( 'OpenStreetMap Blogs',
|
16
|
+
'OpenStreetMap',
|
17
|
+
Date.new( 2020, 2, 7 ).rfc2822,
|
18
|
+
[Channel.new( 'Shaun McDonald',
|
19
|
+
'http://blog.shaunmcdonald.me.uk/feed/',
|
20
|
+
'http://blog.shaunmcdonald.me.uk/' ),
|
21
|
+
Channel.new( 'Mapbox',
|
22
|
+
'https://blog.mapbox.com/feed/tagged/openstreetmap/',
|
23
|
+
'https://blog.mapbox.com/' ),
|
24
|
+
Channel.new( 'Mapillary',
|
25
|
+
'https://blog.mapillary.com/rss.xml',
|
26
|
+
'https://blog.mapillary.com' ),
|
27
|
+
Channel.new( 'Richard Fairhurst',
|
28
|
+
'http://blog.systemed.net/rss',
|
29
|
+
'http://blog.systemed.net/' )]
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_merge
|
34
|
+
site = sample1
|
35
|
+
pp site
|
36
|
+
|
37
|
+
xml = File.open( "#{HtmlTemplate.root}/test/templates/opml.xml", "r:utf-8" ).read
|
38
|
+
template = File.open( "#{HtmlTemplate.root}/test/templates/opml.xml.tmpl", "r:utf-8" ).read
|
39
|
+
|
40
|
+
t = HtmlTemplate.new( template )
|
41
|
+
|
42
|
+
assert_equal prettify_xml( xml ),
|
43
|
+
prettify_xml( t.render( name: site.name,
|
44
|
+
owner_name: site.owner_name,
|
45
|
+
date_822: site.date_822,
|
46
|
+
channels: site.channels ))
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def test_convert
|
51
|
+
text = File.open( "#{HtmlTemplate.root}/test/templates/opml.xml.erb", "r:utf-8" ).read
|
52
|
+
template = File.open( "#{HtmlTemplate.root}/test/templates/opml.xml.tmpl", "r:utf-8" ).read
|
53
|
+
|
54
|
+
t = HtmlTemplate.new( template )
|
55
|
+
|
56
|
+
assert_equal text, t.text
|
57
|
+
end
|
58
|
+
|
59
|
+
=begin
|
60
|
+
<!-- students.tmpl -->
|
61
|
+
<TMPL_LOOP NAME=STUDENT>
|
62
|
+
<p>
|
63
|
+
Name: <TMPL_VAR NAME=NAME><br/>
|
64
|
+
GPA: <TMPL_VAR NAME=GPA>
|
65
|
+
</p>
|
66
|
+
</TMPL_LOOP>
|
67
|
+
|
68
|
+
# students.pl
|
69
|
+
my $template = HTML::Template->new(filename => 'students.tmpl');
|
70
|
+
|
71
|
+
$template->param(
|
72
|
+
STUDENT => [
|
73
|
+
{ NAME => 'Bluto Blutarsky', GPA => '0.0' },
|
74
|
+
{ NAME => 'Tracey Flick' , GPA => '4.0' },
|
75
|
+
]
|
76
|
+
);
|
77
|
+
print $template->output;
|
78
|
+
=end
|
79
|
+
|
80
|
+
Student = Struct.new( :name, :gpa )
|
81
|
+
|
82
|
+
def test_students_example
|
83
|
+
|
84
|
+
tmpl =<<TXT
|
85
|
+
<TMPL_LOOP students>
|
86
|
+
<p>
|
87
|
+
Name: <TMPL_VAR name><br/>
|
88
|
+
GPA: <TMPL_VAR gpa>
|
89
|
+
</p>
|
90
|
+
</TMPL_LOOP>
|
91
|
+
TXT
|
92
|
+
|
93
|
+
t = HtmlTemplate.new( tmpl )
|
94
|
+
puts t.text
|
95
|
+
puts "---"
|
96
|
+
puts t.render( students: [ Student.new( 'Bluto Blutarsky', 0.0 ),
|
97
|
+
Student.new( 'Tracey Flick', 4.0 ) ])
|
98
|
+
|
99
|
+
|
100
|
+
assert true # assume it's alright if we get here
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: html-template
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gerald Bauer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-02-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rdoc
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: hoe
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.16'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.16'
|
41
|
+
description: html-template - old-style classic HTML template language / engine like
|
42
|
+
it's 1999 (incl. back-to-the-future ERB converter)
|
43
|
+
email: wwwmake@googlegroups.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files:
|
47
|
+
- CHANGELOG.md
|
48
|
+
- Manifest.txt
|
49
|
+
- README.md
|
50
|
+
files:
|
51
|
+
- CHANGELOG.md
|
52
|
+
- Manifest.txt
|
53
|
+
- README.md
|
54
|
+
- Rakefile
|
55
|
+
- lib/html/template.rb
|
56
|
+
- lib/html/template/version.rb
|
57
|
+
- test/helper.rb
|
58
|
+
- test/templates/opml.xml
|
59
|
+
- test/templates/opml.xml.erb
|
60
|
+
- test/templates/opml.xml.tmpl
|
61
|
+
- test/templates/planet/README.md
|
62
|
+
- test/templates/planet/atom.xml.tmpl
|
63
|
+
- test/templates/planet/basic/index.html.tmpl
|
64
|
+
- test/templates/planet/fancy/index.html.tmpl
|
65
|
+
- test/templates/planet/foafroll.xml.tmpl
|
66
|
+
- test/templates/planet/opml.xml.tmpl
|
67
|
+
- test/templates/planet/rss10.xml.tmpl
|
68
|
+
- test/templates/planet/rss20.xml.tmpl
|
69
|
+
- test/test_merge.rb
|
70
|
+
homepage: https://github.com/feedreader/pluto
|
71
|
+
licenses:
|
72
|
+
- Public Domain
|
73
|
+
metadata: {}
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options:
|
76
|
+
- "--main"
|
77
|
+
- README.md
|
78
|
+
require_paths:
|
79
|
+
- lib
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 2.2.2
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
requirements: []
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 2.5.2
|
93
|
+
signing_key:
|
94
|
+
specification_version: 4
|
95
|
+
summary: html-template - old-style classic HTML template language / engine like it's
|
96
|
+
1999 (incl. back-to-the-future ERB converter)
|
97
|
+
test_files: []
|