erbook 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +13 -0
- data/README +14 -0
- data/Rakefile +77 -0
- data/bin/erbook +309 -0
- data/doc/HelloWorld.input +37 -0
- data/doc/HelloWorld.spec +62 -0
- data/doc/README +6 -0
- data/doc/api/classes/ERBook.html +164 -0
- data/doc/api/classes/RDoc.html +112 -0
- data/doc/api/classes/RDoc/AnyMethod.html +195 -0
- data/doc/api/classes/RDoc/AnyMethod.src/M000005.html +18 -0
- data/doc/api/classes/RDoc/AnyMethod.src/M000006.html +23 -0
- data/doc/api/classes/RDoc/AnyMethod.src/M000007.html +18 -0
- data/doc/api/classes/RDoc/AnyMethod.src/M000008.html +22 -0
- data/doc/api/classes/RDoc/TopLevel.html +250 -0
- data/doc/api/classes/RDoc/TopLevel.src/M000009.html +18 -0
- data/doc/api/classes/RDoc/TopLevel.src/M000010.html +18 -0
- data/doc/api/classes/RDoc/TopLevel.src/M000011.html +18 -0
- data/doc/api/classes/RDoc/TopLevel.src/M000012.html +29 -0
- data/doc/api/classes/RDoc/TopLevel.src/M000013.html +25 -0
- data/doc/api/classes/RDoc/TopLevel.src/M000014.html +18 -0
- data/doc/api/classes/String.html +261 -0
- data/doc/api/classes/String.src/M000001.html +18 -0
- data/doc/api/classes/String.src/M000002.html +34 -0
- data/doc/api/classes/String.src/M000003.html +20 -0
- data/doc/api/classes/String.src/M000004.html +26 -0
- data/doc/api/created.rid +1 -0
- data/doc/api/files/lib/erbook/html_rb.html +125 -0
- data/doc/api/files/lib/erbook/rdoc_rb.html +116 -0
- data/doc/api/files/lib/erbook_rb.html +107 -0
- data/doc/api/fr_class_index.html +31 -0
- data/doc/api/fr_file_index.html +29 -0
- data/doc/api/fr_method_index.html +40 -0
- data/doc/api/index.html +24 -0
- data/doc/api/rdoc-style.css +208 -0
- data/doc/erbook.png +0 -0
- data/doc/erbook.svg +349 -0
- data/doc/feed-icon-28x28.png +0 -0
- data/doc/index.html +2663 -0
- data/doc/manual.erb +769 -0
- data/fmt/html.icons/LICENSE +67 -0
- data/fmt/html.icons/README +31 -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/quote.png +0 -0
- data/fmt/html.icons/tip.png +0 -0
- data/fmt/html.icons/warning.png +0 -0
- data/fmt/html.yaml +1185 -0
- data/fmt/latex.yaml +2 -0
- data/fmt/man.yaml +2 -0
- data/fmt/text.yaml +2 -0
- data/lib/erbook.rb +13 -0
- data/lib/erbook/html.rb +145 -0
- data/lib/erbook/rdoc.rb +126 -0
- metadata +141 -0
data/fmt/latex.yaml
ADDED
data/fmt/man.yaml
ADDED
data/fmt/text.yaml
ADDED
data/lib/erbook.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Project and release information.
|
2
|
+
module ERBook
|
3
|
+
PROJECT = 'erbook'
|
4
|
+
VERSION = '4.0.0'
|
5
|
+
RELEASE = '2008-11-15'
|
6
|
+
WEBSITE = 'http://snk.tuxfamily.org/lib/erbook'
|
7
|
+
SUMMARY = 'Extensible document processor based on eRuby.'
|
8
|
+
DISPLAY = PROJECT + ' ' + VERSION
|
9
|
+
|
10
|
+
INSTALL_DIR = File.expand_path File.join(File.dirname(__FILE__), '..')
|
11
|
+
FORMATS_DIR = File.join INSTALL_DIR, 'fmt'
|
12
|
+
FORMAT_FILES = Dir[File.join(FORMATS_DIR, '*.yaml')]
|
13
|
+
end
|
data/lib/erbook/html.rb
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
# This file defines the String#to_html and String#to_inline_html
|
2
|
+
# methods, which are invoked to transform plain text into HTML.
|
3
|
+
#
|
4
|
+
# This particular implementation features the Markdown
|
5
|
+
# formatting system via Maruku, syntax coloring via CodeRay,
|
6
|
+
# and smart source code sizing (block versus inline display).
|
7
|
+
|
8
|
+
require 'cgi'
|
9
|
+
|
10
|
+
begin
|
11
|
+
require 'rubygems'
|
12
|
+
gem 'maruku', '~> 0.5'
|
13
|
+
gem 'coderay', '>= 0.7'
|
14
|
+
rescue LoadError
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'coderay'
|
18
|
+
require 'maruku'
|
19
|
+
|
20
|
+
class String
|
21
|
+
# The content of these HTML tags will be preserved while
|
22
|
+
# they are being processed by Textile. By doing this, we
|
23
|
+
# avoid unwanted Textile transformations, such as quotation
|
24
|
+
# marks becoming curly ( ), in source code.
|
25
|
+
PROTECTED_TAGS = %w[tt code pre]
|
26
|
+
|
27
|
+
# The content of these HTML tags will be preserved
|
28
|
+
# *verbatim* throughout the text-to-HTML conversion process.
|
29
|
+
VERBATIM_TAGS = %w[noformat]
|
30
|
+
|
31
|
+
# Transforms this string into an *inline* HTML string (one that
|
32
|
+
# does not contain any block-level HTML elements at the root).
|
33
|
+
def to_inline_html
|
34
|
+
to_html true
|
35
|
+
end
|
36
|
+
|
37
|
+
# XXX: Maruku also defines String#to_html so we have to hack around it :-(
|
38
|
+
alias to_html_maruku to_html
|
39
|
+
|
40
|
+
# Transforms this string into HTML while ensuring that the
|
41
|
+
# result contains one or more block-level elements at the root.
|
42
|
+
#
|
43
|
+
# If aInline is true, then the resulting HTML will be an *inline* string.
|
44
|
+
#
|
45
|
+
def to_html aInline = false
|
46
|
+
# XXX: Maruku also defines String#to_html so we have to hack around it :-(
|
47
|
+
return to_html_maruku if caller.detect {|c| c =~ %r'/lib/maruku/output/' }
|
48
|
+
|
49
|
+
protect(self, VERBATIM_TAGS, true) do |text|
|
50
|
+
html = protect(text, PROTECTED_TAGS, false) {|s| s.thru_maruku aInline }
|
51
|
+
|
52
|
+
# Markdown's "code spans" should really be "pre spans"
|
53
|
+
while html.gsub! %r{(<pre>)<code>(.*?)</code>(</pre>)}m, '\1\2\3'
|
54
|
+
end
|
55
|
+
|
56
|
+
# ensure tables have a border: this *greatly* improves
|
57
|
+
# readability in text-based web browsers like w3m and lynx
|
58
|
+
html.gsub! %r/<table\b/, '\& border="1"'
|
59
|
+
|
60
|
+
# add syntax coloring
|
61
|
+
html.thru_coderay
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Returns the result of running this string through Maruku.
|
66
|
+
#
|
67
|
+
# If aInline is true, then the resulting HTML will
|
68
|
+
# *not* be wrapped in a HTML paragraph element.
|
69
|
+
#
|
70
|
+
def thru_maruku aInline = false
|
71
|
+
html = Maruku.new(self).to_html
|
72
|
+
html.sub! %r{\A<p>(.*)</p>\Z}, '\1' if aInline
|
73
|
+
html
|
74
|
+
end
|
75
|
+
|
76
|
+
# Adds syntax coloring to <code> elements in the given text. If the
|
77
|
+
# <code> tag has an attribute lang="...", then that is considered the
|
78
|
+
# programming language for which appropriate syntax coloring should be
|
79
|
+
# applied. Otherwise, the programming language is assumed to be ruby.
|
80
|
+
def thru_coderay
|
81
|
+
gsub %r{<(code)(.*?)>(.*?)</\1>}m do
|
82
|
+
atts, code = $2, CGI.unescapeHTML($3)
|
83
|
+
lang = atts[/\blang=('|")(.*?)\1/i, 2] || :ruby
|
84
|
+
|
85
|
+
html = CodeRay.scan(code, lang).html(:css => :style)
|
86
|
+
tag = if code =~ /\n/ then :pre else :code end
|
87
|
+
|
88
|
+
%{<#{tag} class="code"#{atts}>#{html}</#{tag}>}
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
# Protects the given tags in the given input, passes
|
95
|
+
# that protected input to the given block, restores the
|
96
|
+
# given tags in the result of the block and returns it.
|
97
|
+
#
|
98
|
+
# If aVerbatim is true, the content of the elments having the given tags will
|
99
|
+
# not be temporarily altered so that process nested elements can be processed.
|
100
|
+
#
|
101
|
+
def protect aInput, aTags, aVerbatim #:yields: aInput
|
102
|
+
raise ArgumentError unless block_given?
|
103
|
+
|
104
|
+
input = aInput.dup
|
105
|
+
escapes = {}
|
106
|
+
|
107
|
+
# protect the given tags by escaping them
|
108
|
+
aTags.each do |tag|
|
109
|
+
input.gsub! %r{(<#{tag}.*?>)(.*?)(</#{tag}>)}m do
|
110
|
+
head, body, tail = $1, $2, $3
|
111
|
+
|
112
|
+
# XXX: when we restore protected tags later on, String.gsub! is
|
113
|
+
# removing all single backslashes for some reason... so we
|
114
|
+
# protect against this by doubling all single backslashes first
|
115
|
+
body.gsub! %r/\\/, '\&\&'
|
116
|
+
|
117
|
+
original =
|
118
|
+
if aVerbatim
|
119
|
+
body
|
120
|
+
else
|
121
|
+
head << CGI.escapeHTML(CGI.unescapeHTML(body)) << tail
|
122
|
+
end
|
123
|
+
|
124
|
+
escaped = original.digest_id
|
125
|
+
escapes[escaped] = original
|
126
|
+
|
127
|
+
escaped
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
# invoke the given block with the protected input
|
132
|
+
output = yield(input)
|
133
|
+
|
134
|
+
# restore the protected tags by unescaping them
|
135
|
+
until escapes.empty?
|
136
|
+
escapes.each_pair do |esc, orig|
|
137
|
+
if output.gsub! esc, orig
|
138
|
+
escapes.delete esc
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
output
|
144
|
+
end
|
145
|
+
end
|
data/lib/erbook/rdoc.rb
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
# Workaround for: `rdoc --fmt xml` does not dump information about methods.
|
2
|
+
|
3
|
+
require 'rdoc/rdoc'
|
4
|
+
|
5
|
+
module RDoc
|
6
|
+
class TopLevel
|
7
|
+
# Returns an array of all classes recorded thus far.
|
8
|
+
def self.all_classes
|
9
|
+
@@all_classes.values
|
10
|
+
end
|
11
|
+
|
12
|
+
# Returns an array of all modules recorded thus far.
|
13
|
+
def self.all_modules
|
14
|
+
@@all_modules.values
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns an array of RDoc::AnyMethod objects
|
18
|
+
# representing all methods recorded thus far.
|
19
|
+
def self.all_methods
|
20
|
+
all_classes_and_modules.map {|c| c.method_list }.flatten
|
21
|
+
end
|
22
|
+
|
23
|
+
# Update the return value of the all_classes_and_modules() method
|
24
|
+
# to *really* include every class and every module seen thus far.
|
25
|
+
def self.refresh_all_classes_and_modules
|
26
|
+
visit = lambda do |node|
|
27
|
+
if node.is_a? NormalClass or node.is_a? SingleClass
|
28
|
+
@@all_classes[node.full_name] = node
|
29
|
+
|
30
|
+
elsif node.is_a? NormalModule
|
31
|
+
@@all_modules[node.full_name] = node
|
32
|
+
end
|
33
|
+
|
34
|
+
(node.classes + node.modules).each {|n| visit[n] }
|
35
|
+
end
|
36
|
+
|
37
|
+
all_classes_and_modules.each {|n| visit[n] }
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns a RDoc::TopLevel object containing information
|
41
|
+
# parsed from the given code string. This information is
|
42
|
+
# also added to the global TopLevel class state, so you can
|
43
|
+
# access it via the class methods of the TopLevel class.
|
44
|
+
#
|
45
|
+
# If the file name (which signifies the origin
|
46
|
+
# of the given code) is given, it MUST have a
|
47
|
+
# ".c" or ".rb" file extension. Otherwise,
|
48
|
+
# RDoc will ignore the given code string! :-(
|
49
|
+
#
|
50
|
+
def self.parse aCodeString, aFileName = __FILE__
|
51
|
+
top = ParserFactory.parser_for(
|
52
|
+
TopLevel.new(aFileName), aFileName,
|
53
|
+
aCodeString, DummyOptions.new, Stats.new
|
54
|
+
).scan
|
55
|
+
|
56
|
+
refresh_all_classes_and_modules
|
57
|
+
|
58
|
+
top
|
59
|
+
end
|
60
|
+
|
61
|
+
# Returns a RDoc::TopLevel object containing information
|
62
|
+
# parsed from the code in the given file. This information
|
63
|
+
# is also added to the global TopLevel class state, so you
|
64
|
+
# can access it via the class methods of the TopLevel class.
|
65
|
+
#
|
66
|
+
# The given file name MUST have a ".c" or ".rb" file
|
67
|
+
# extension. Otherwise, RDoc will ignore the file! :-(
|
68
|
+
#
|
69
|
+
def self.parse_file aFileName
|
70
|
+
parse File.read(aFileName), aFileName
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
class AnyMethod
|
75
|
+
# Returns the fully qualified name of this method.
|
76
|
+
def full_name
|
77
|
+
[parent.full_name, name].join(singleton ? '::' : '#')
|
78
|
+
end
|
79
|
+
|
80
|
+
# Returns a complete method declaration with block parameters and all.
|
81
|
+
def decl
|
82
|
+
a = params.dup
|
83
|
+
if b = block_params
|
84
|
+
a.sub! %r/\s*\#.*(?=.$)/, '' # remove "# :yields: ..." string
|
85
|
+
a << " {|#{b}| ... }"
|
86
|
+
end
|
87
|
+
full_name << a
|
88
|
+
end
|
89
|
+
|
90
|
+
# Returns a HTML version of this method's comment.
|
91
|
+
def comment_html
|
92
|
+
DummyMarkup.new.markup comment
|
93
|
+
end
|
94
|
+
|
95
|
+
# Returns the RDoc::TopLevel object which contains this method.
|
96
|
+
def top_level
|
97
|
+
n = parent
|
98
|
+
while n && n.parent
|
99
|
+
n = n.parent
|
100
|
+
end
|
101
|
+
n
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
module DummyMixin #:nodoc:
|
108
|
+
def method_missing *args
|
109
|
+
# ignore all messages
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
class DummyOptions #:nodoc:
|
114
|
+
include DummyMixin
|
115
|
+
|
116
|
+
def quiet # supress '...c..m...' output on STDERR
|
117
|
+
true
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
class DummyMarkup #:nodoc:
|
122
|
+
require 'rdoc/generators/html_generator'
|
123
|
+
include Generators::MarkUp
|
124
|
+
include DummyMixin
|
125
|
+
end
|
126
|
+
end
|
metadata
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: erbook
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 4.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Suraj N. Kurapati
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-11-15 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: maruku
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ~>
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0.5"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: coderay
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0.7"
|
34
|
+
version:
|
35
|
+
description: Extensible document processor based on eRuby.
|
36
|
+
email: sunaku@gmail.com
|
37
|
+
executables:
|
38
|
+
- erbook
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files: []
|
42
|
+
|
43
|
+
files:
|
44
|
+
- fmt
|
45
|
+
- fmt/html.icons
|
46
|
+
- fmt/html.icons/warning.png
|
47
|
+
- fmt/html.icons/tip.png
|
48
|
+
- fmt/html.icons/caution.png
|
49
|
+
- fmt/html.icons/quote.png
|
50
|
+
- fmt/html.icons/important.png
|
51
|
+
- fmt/html.icons/note.png
|
52
|
+
- fmt/html.icons/LICENSE
|
53
|
+
- fmt/html.icons/README
|
54
|
+
- fmt/latex.yaml
|
55
|
+
- fmt/html.yaml
|
56
|
+
- fmt/man.yaml
|
57
|
+
- fmt/text.yaml
|
58
|
+
- lib
|
59
|
+
- lib/erbook
|
60
|
+
- lib/erbook/html.rb
|
61
|
+
- lib/erbook/rdoc.rb
|
62
|
+
- lib/erbook.rb
|
63
|
+
- Rakefile
|
64
|
+
- bin
|
65
|
+
- bin/erbook
|
66
|
+
- LICENSE
|
67
|
+
- README
|
68
|
+
- doc
|
69
|
+
- doc/manual.erb
|
70
|
+
- doc/erbook.svg
|
71
|
+
- doc/erbook.png
|
72
|
+
- doc/HelloWorld.input
|
73
|
+
- doc/feed-icon-28x28.png
|
74
|
+
- doc/HelloWorld.spec
|
75
|
+
- doc/index.html
|
76
|
+
- doc/api
|
77
|
+
- doc/api/classes
|
78
|
+
- doc/api/classes/RDoc.html
|
79
|
+
- doc/api/classes/String.src
|
80
|
+
- doc/api/classes/String.src/M000001.html
|
81
|
+
- doc/api/classes/String.src/M000004.html
|
82
|
+
- doc/api/classes/String.src/M000003.html
|
83
|
+
- doc/api/classes/String.src/M000002.html
|
84
|
+
- doc/api/classes/String.html
|
85
|
+
- doc/api/classes/ERBook.html
|
86
|
+
- doc/api/classes/RDoc
|
87
|
+
- doc/api/classes/RDoc/TopLevel.src
|
88
|
+
- doc/api/classes/RDoc/TopLevel.src/M000013.html
|
89
|
+
- doc/api/classes/RDoc/TopLevel.src/M000010.html
|
90
|
+
- doc/api/classes/RDoc/TopLevel.src/M000011.html
|
91
|
+
- doc/api/classes/RDoc/TopLevel.src/M000014.html
|
92
|
+
- doc/api/classes/RDoc/TopLevel.src/M000012.html
|
93
|
+
- doc/api/classes/RDoc/TopLevel.src/M000009.html
|
94
|
+
- doc/api/classes/RDoc/TopLevel.html
|
95
|
+
- doc/api/classes/RDoc/AnyMethod.src
|
96
|
+
- doc/api/classes/RDoc/AnyMethod.src/M000005.html
|
97
|
+
- doc/api/classes/RDoc/AnyMethod.src/M000008.html
|
98
|
+
- doc/api/classes/RDoc/AnyMethod.src/M000006.html
|
99
|
+
- doc/api/classes/RDoc/AnyMethod.src/M000007.html
|
100
|
+
- doc/api/classes/RDoc/AnyMethod.html
|
101
|
+
- doc/api/fr_method_index.html
|
102
|
+
- doc/api/rdoc-style.css
|
103
|
+
- doc/api/files
|
104
|
+
- doc/api/files/lib
|
105
|
+
- doc/api/files/lib/erbook_rb.html
|
106
|
+
- doc/api/files/lib/erbook
|
107
|
+
- doc/api/files/lib/erbook/rdoc_rb.html
|
108
|
+
- doc/api/files/lib/erbook/html_rb.html
|
109
|
+
- doc/api/created.rid
|
110
|
+
- doc/api/index.html
|
111
|
+
- doc/api/fr_file_index.html
|
112
|
+
- doc/api/fr_class_index.html
|
113
|
+
- doc/README
|
114
|
+
has_rdoc: true
|
115
|
+
homepage: http://snk.tuxfamily.org/lib/erbook
|
116
|
+
post_install_message:
|
117
|
+
rdoc_options: []
|
118
|
+
|
119
|
+
require_paths:
|
120
|
+
- lib
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: "0"
|
126
|
+
version:
|
127
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: "0"
|
132
|
+
version:
|
133
|
+
requirements: []
|
134
|
+
|
135
|
+
rubyforge_project: sunaku
|
136
|
+
rubygems_version: 1.2.0
|
137
|
+
signing_key:
|
138
|
+
specification_version: 2
|
139
|
+
summary: Extensible document processor based on eRuby.
|
140
|
+
test_files: []
|
141
|
+
|