gerbil 1.0.0
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.
- data/LICENSE +23 -0
- data/README +1 -0
- data/Rakefile +48 -0
- data/bin/gerbil +275 -0
- data/doc/HelloWorld.input +37 -0
- data/doc/HelloWorld.spec +66 -0
- data/doc/gerbil.png +0 -0
- data/doc/gerbil.svg +330 -0
- data/doc/guide.erb +677 -0
- data/doc/guide.html +3416 -0
- data/fmt/html.icons/LICENSE +67 -0
- data/fmt/html.icons/README +30 -0
- data/fmt/html.icons/caution.png +0 -0
- data/fmt/html.icons/important.png +0 -0
- data/fmt/html.icons/note.png +0 -0
- data/fmt/html.icons/tip.png +0 -0
- data/fmt/html.icons/warning.png +0 -0
- data/fmt/html.yaml +897 -0
- data/fmt/latex.yaml +2 -0
- data/fmt/man.yaml +2 -0
- data/fmt/text.yaml +2 -0
- data/lib/gerbil.rb +11 -0
- data/lib/gerbil/html.rb +149 -0
- data/lib/gerbil/rdoc.rb +91 -0
- metadata +99 -0
data/fmt/latex.yaml
ADDED
data/fmt/man.yaml
ADDED
data/fmt/text.yaml
ADDED
data/lib/gerbil.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# project information
|
2
|
+
|
3
|
+
Gerbil = {
|
4
|
+
:name => 'Gerbil',
|
5
|
+
:version => '1.0.0',
|
6
|
+
:release => '2008-01-12',
|
7
|
+
:website => 'http://gerbil.rubyforge.org',
|
8
|
+
:home => File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
9
|
+
}
|
10
|
+
Gerbil[:format_home] = File.join(Gerbil[:home], 'fmt')
|
11
|
+
Gerbil[:format_files] = Dir[File.join(Gerbil[:format_home], '*.yaml')]
|
data/lib/gerbil/html.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
# This file defines the String#to_html method, which is
|
2
|
+
# invoked to transform the content of a blog entry into HTML.
|
3
|
+
#
|
4
|
+
# It features the Textile formatting system (RedCloth), syntax coloring
|
5
|
+
# (CodeRay), and smart source code sizing (block versus inline display).
|
6
|
+
#--
|
7
|
+
# Copyright 2006 Suraj N. Kurapati
|
8
|
+
# See the file named LICENSE for details.
|
9
|
+
|
10
|
+
require 'cgi'
|
11
|
+
require 'digest/sha1'
|
12
|
+
|
13
|
+
begin
|
14
|
+
require 'rubygems'
|
15
|
+
rescue LoadError
|
16
|
+
end
|
17
|
+
|
18
|
+
require 'coderay'
|
19
|
+
require 'redcloth'
|
20
|
+
|
21
|
+
class String
|
22
|
+
# The content of these HTML tags will be preserved while
|
23
|
+
# they are being processed by Textile. By doing this, we
|
24
|
+
# avoid unwanted Textile transformations, such as quotation
|
25
|
+
# marks becoming curly ( ), in source code.
|
26
|
+
PROTECTED_TAGS = %w[tt code pre]
|
27
|
+
|
28
|
+
# The content of these HTML tags will
|
29
|
+
# be preserved *verbatim* throughout
|
30
|
+
# the text-to-HTML conversion process.
|
31
|
+
VERBATIM_TAGS = %w[noformat]
|
32
|
+
|
33
|
+
# Transforms this string into HTML.
|
34
|
+
def to_html
|
35
|
+
text = dup
|
36
|
+
protect_tags! text, VERBATIM_TAGS, verbatimStore = {}, true
|
37
|
+
protect_tags! text, PROTECTED_TAGS, protectedStore = {}, false
|
38
|
+
|
39
|
+
html = text.thru_redcloth
|
40
|
+
restore_tags! html, protectedStore
|
41
|
+
|
42
|
+
# collapse redundant <pre> elements -- a side effect of RedCloth
|
43
|
+
html.gsub! %r{(<pre>)\s*<pre>(.*?)</pre>\s*(</pre>)}m, '\1\2\3'
|
44
|
+
|
45
|
+
html = html.thru_coderay
|
46
|
+
restore_tags! html, verbatimStore
|
47
|
+
|
48
|
+
# ensure tables have a border (this GREATLY improves
|
49
|
+
# readability in text-mode web browsers like Lynx and w3m)
|
50
|
+
html.gsub! %r/<table/, '\& border="1"'
|
51
|
+
|
52
|
+
html
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns the result of running this string through RedCloth.
|
56
|
+
def thru_redcloth
|
57
|
+
text = dup
|
58
|
+
|
59
|
+
# redcloth does not correctly convert -- into —
|
60
|
+
text.gsub! %r{\b--\b}, '—'
|
61
|
+
|
62
|
+
html = RedCloth.new(text).to_html
|
63
|
+
|
64
|
+
# redcloth adds <span> tags around acronyms
|
65
|
+
html.gsub! %r{<span class="caps">([[:upper:][:digit:]]+)</span>}, '\1'
|
66
|
+
|
67
|
+
# redcloth wraps indented text within <pre><code> tags
|
68
|
+
html.gsub! %r{(<pre>)\s*<code>(.*?)\s*</code>\s*(</pre>)}m, '\1\2\3'
|
69
|
+
|
70
|
+
# redcloth wraps a single item within paragraph tags, which
|
71
|
+
# prevents the item's HTML from being validly injected within
|
72
|
+
# other block-level elements, such as headings (h1, h2, etc.)
|
73
|
+
html.sub! %r{^<p>(.*)</p>$}m do |match|
|
74
|
+
payload = $1
|
75
|
+
|
76
|
+
if payload =~ /<p>/
|
77
|
+
match
|
78
|
+
else
|
79
|
+
payload
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
html
|
84
|
+
end
|
85
|
+
|
86
|
+
# Adds syntax coloring to <code> elements in the given text. If the
|
87
|
+
# <code> tag has an attribute lang="...", then that is considered the
|
88
|
+
# programming language for which appropriate syntax coloring should be
|
89
|
+
# applied. Otherwise, the programming language is assumed to be ruby.
|
90
|
+
def thru_coderay
|
91
|
+
gsub %r{<(code)(.*?)>(.*?)</\1>}m do
|
92
|
+
atts, code = $2, CGI.unescapeHTML($3)
|
93
|
+
|
94
|
+
lang =
|
95
|
+
if $2 =~ /lang=('|")(.*?)\1/i
|
96
|
+
$2
|
97
|
+
else
|
98
|
+
:ruby
|
99
|
+
end
|
100
|
+
|
101
|
+
tag =
|
102
|
+
if code =~ /\n/
|
103
|
+
:pre
|
104
|
+
else
|
105
|
+
:code
|
106
|
+
end
|
107
|
+
|
108
|
+
html = CodeRay.scan(code, lang).html(:css => :style)
|
109
|
+
|
110
|
+
%{<#{tag} class="code"#{atts}>#{html}</#{tag}>}
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
private
|
115
|
+
|
116
|
+
def protect_tags! aText, aTags, aStore, aVerbatim #:nodoc:
|
117
|
+
aTags.each do |tag|
|
118
|
+
aText.gsub! %r{(<#{tag}.*?>)(.*?)(</#{tag}>)}m do
|
119
|
+
head, body, tail = $1, $2, $3
|
120
|
+
|
121
|
+
# XXX: when we restore protected tags later on, String.gsub! is
|
122
|
+
# removing all single backslashes for some reason... so we
|
123
|
+
# protect against this by doubling all single backslashes first
|
124
|
+
body.gsub! %r/\\/, '\&\&'
|
125
|
+
|
126
|
+
original =
|
127
|
+
if aVerbatim
|
128
|
+
body
|
129
|
+
else
|
130
|
+
head << CGI.escapeHTML(CGI.unescapeHTML(body)) << tail
|
131
|
+
end
|
132
|
+
escape = Digest::SHA1.hexdigest(original)
|
133
|
+
|
134
|
+
aStore[escape] = original
|
135
|
+
escape
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def restore_tags! aText, aStore #:nodoc:
|
141
|
+
until aStore.empty?
|
142
|
+
aStore.each_pair do |escape, original|
|
143
|
+
if aText.gsub! %r{<p>#{escape}</p>|#{escape}}, original
|
144
|
+
aStore.delete escape
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
data/lib/gerbil/rdoc.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
# Workaround for: `rdoc --fmt xml` does not dump information about methods.
|
2
|
+
#--
|
3
|
+
# Copyright 2007 Suraj N. Kurapati
|
4
|
+
# See the file named LICENSE for details.
|
5
|
+
|
6
|
+
require 'rdoc/rdoc'
|
7
|
+
|
8
|
+
module RDoc
|
9
|
+
module DummyMixin
|
10
|
+
def method_missing *args
|
11
|
+
# ignore all messages
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class DummyOptions
|
16
|
+
include DummyMixin
|
17
|
+
|
18
|
+
def quiet # supress '...c..m...' output on STDERR
|
19
|
+
true
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class DummyMarkup
|
24
|
+
require 'rdoc/generators/html_generator'
|
25
|
+
include Generators::MarkUp
|
26
|
+
include DummyMixin
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns an array of RDoc parse trees for the given code.
|
30
|
+
# If the file name (which signifies the origin of the given
|
31
|
+
# code) is given, it MUST have a ".rb" file extension.
|
32
|
+
# Otherwise, RDoc will give you an empty parse tree! :-(
|
33
|
+
def self.gen_parse_trees aCode, aFileName = __FILE__
|
34
|
+
root = TopLevel.new(aFileName)
|
35
|
+
parser = ParserFactory.parser_for(root, aFileName, aCode, DummyOptions.new, Stats.new)
|
36
|
+
info = parser.scan
|
37
|
+
|
38
|
+
info.requires.map do |r|
|
39
|
+
f = r.name
|
40
|
+
f << '.rb' unless File.exist? f
|
41
|
+
gen_parse_tree f if File.exist? f
|
42
|
+
end.flatten.compact << info
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns an array of hashes describing all methods present in the
|
46
|
+
# given parse trees (which are produced by RDoc::gen_parse_trees).
|
47
|
+
def self.gen_method_infos *aParseTrees
|
48
|
+
meths = aParseTrees.map do |i|
|
49
|
+
i.method_list + i.classes.map { |c| c.method_list }
|
50
|
+
end.flatten.uniq
|
51
|
+
|
52
|
+
meths.map do |m|
|
53
|
+
# determine full path to method (Module::Class::...::method)
|
54
|
+
hier = []
|
55
|
+
root = m.parent
|
56
|
+
while root && root.parent
|
57
|
+
hier.unshift root
|
58
|
+
root = root.parent
|
59
|
+
end
|
60
|
+
|
61
|
+
if hier.empty?
|
62
|
+
path = m.name
|
63
|
+
else
|
64
|
+
path = hier.map {|n| n.name}.join('::')
|
65
|
+
path = [path, m.name].join(m.singleton ? '::' : '#')
|
66
|
+
end
|
67
|
+
|
68
|
+
# determine argument string for method
|
69
|
+
args = m.params
|
70
|
+
if m.block_params
|
71
|
+
args.sub! %r/\#.*(?=.$)/, ''
|
72
|
+
args << " { |#{m.block_params}| ... }"
|
73
|
+
end
|
74
|
+
|
75
|
+
{
|
76
|
+
:file => root.file_absolute_name,
|
77
|
+
:name => path,
|
78
|
+
:args => args,
|
79
|
+
:decl => path + args,
|
80
|
+
:docs => m.comment,
|
81
|
+
:docs_html => DummyMarkup.new.markup(m.comment),
|
82
|
+
|
83
|
+
# nodes in the parse tree
|
84
|
+
:node => m,
|
85
|
+
:root => root,
|
86
|
+
# for top level methods, info.parent == root
|
87
|
+
# for class methods, info.singleton == true
|
88
|
+
}
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gerbil
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors: []
|
7
|
+
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-01-12 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: RedCloth
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "0"
|
23
|
+
version:
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: coderay
|
26
|
+
version_requirement:
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: "0"
|
32
|
+
version:
|
33
|
+
description: Extensible document generator based on eRuby.
|
34
|
+
email:
|
35
|
+
executables:
|
36
|
+
- gerbil
|
37
|
+
extensions: []
|
38
|
+
|
39
|
+
extra_rdoc_files: []
|
40
|
+
|
41
|
+
files:
|
42
|
+
- fmt
|
43
|
+
- fmt/html.icons
|
44
|
+
- fmt/html.icons/warning.png
|
45
|
+
- fmt/html.icons/tip.png
|
46
|
+
- fmt/html.icons/caution.png
|
47
|
+
- fmt/html.icons/important.png
|
48
|
+
- fmt/html.icons/note.png
|
49
|
+
- fmt/html.icons/LICENSE
|
50
|
+
- fmt/html.icons/README
|
51
|
+
- fmt/latex.yaml
|
52
|
+
- fmt/html.yaml
|
53
|
+
- fmt/man.yaml
|
54
|
+
- fmt/text.yaml
|
55
|
+
- lib
|
56
|
+
- lib/gerbil
|
57
|
+
- lib/gerbil/html.rb
|
58
|
+
- lib/gerbil/rdoc.rb
|
59
|
+
- lib/gerbil.rb
|
60
|
+
- Rakefile
|
61
|
+
- bin
|
62
|
+
- bin/gerbil
|
63
|
+
- LICENSE
|
64
|
+
- README
|
65
|
+
- doc
|
66
|
+
- doc/gerbil.png
|
67
|
+
- doc/gerbil.svg
|
68
|
+
- doc/HelloWorld.input
|
69
|
+
- doc/guide.html
|
70
|
+
- doc/guide.erb
|
71
|
+
- doc/HelloWorld.spec
|
72
|
+
has_rdoc: false
|
73
|
+
homepage: http://gerbil.rubyforge.org
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: "0"
|
84
|
+
version:
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: "0"
|
90
|
+
version:
|
91
|
+
requirements: []
|
92
|
+
|
93
|
+
rubyforge_project:
|
94
|
+
rubygems_version: 1.0.1
|
95
|
+
signing_key:
|
96
|
+
specification_version: 2
|
97
|
+
summary: Extensible document generator based on eRuby.
|
98
|
+
test_files: []
|
99
|
+
|