erlapi 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +15 -0
- data/Rakefile +56 -0
- data/VERSION +1 -0
- data/bin/erlapi +26 -0
- data/erlapi.gemspec +140 -0
- data/lib/erlapi.rb +38 -0
- data/lib/erlapi/generator.rb +194 -0
- data/lib/erlapi/generator/shtml.rb +353 -0
- data/lib/erlapi/generator/template/direct/_context.rhtml +172 -0
- data/lib/erlapi/generator/template/direct/class.rhtml +40 -0
- data/lib/erlapi/generator/template/direct/file.rhtml +30 -0
- data/lib/erlapi/generator/template/direct/index.rhtml +14 -0
- data/lib/erlapi/generator/template/direct/resources/apple-touch-icon.png +0 -0
- data/lib/erlapi/generator/template/direct/resources/css/main.css +263 -0
- data/lib/erlapi/generator/template/direct/resources/css/panel.css +383 -0
- data/lib/erlapi/generator/template/direct/resources/css/reset.css +53 -0
- data/lib/erlapi/generator/template/direct/resources/favicon.ico +0 -0
- data/lib/erlapi/generator/template/direct/resources/i/arrows.png +0 -0
- data/lib/erlapi/generator/template/direct/resources/i/results_bg.png +0 -0
- data/lib/erlapi/generator/template/direct/resources/i/tree_bg.png +0 -0
- data/lib/erlapi/generator/template/direct/resources/js/jquery-1.3.2.min.js +19 -0
- data/lib/erlapi/generator/template/direct/resources/js/jquery-effect.js +593 -0
- data/lib/erlapi/generator/template/direct/resources/js/main.js +22 -0
- data/lib/erlapi/generator/template/direct/resources/js/searchdoc.js +628 -0
- data/lib/erlapi/generator/template/direct/resources/panel/index.html +71 -0
- data/lib/erlapi/generator/template/merge/index.rhtml +14 -0
- data/lib/erlapi/generator/template/shtml/_context.rhtml +164 -0
- data/lib/erlapi/generator/template/shtml/class.rhtml +46 -0
- data/lib/erlapi/generator/template/shtml/file.rhtml +37 -0
- data/lib/erlapi/generator/template/shtml/index.rhtml +14 -0
- data/lib/erlapi/generator/template/shtml/resources/apple-touch-icon.png +0 -0
- data/lib/erlapi/generator/template/shtml/resources/css/main.css +191 -0
- data/lib/erlapi/generator/template/shtml/resources/css/panel.css +383 -0
- data/lib/erlapi/generator/template/shtml/resources/css/reset.css +53 -0
- data/lib/erlapi/generator/template/shtml/resources/favicon.ico +0 -0
- data/lib/erlapi/generator/template/shtml/resources/i/arrows.png +0 -0
- data/lib/erlapi/generator/template/shtml/resources/i/results_bg.png +0 -0
- data/lib/erlapi/generator/template/shtml/resources/i/tree_bg.png +0 -0
- data/lib/erlapi/generator/template/shtml/resources/js/jquery-1.3.2.min.js +19 -0
- data/lib/erlapi/generator/template/shtml/resources/js/main.js +34 -0
- data/lib/erlapi/generator/template/shtml/resources/js/searchdoc.js +628 -0
- data/lib/erlapi/generator/template/shtml/resources/panel/index.html +71 -0
- data/lib/erlapi/helpers.rb +26 -0
- data/lib/erlapi/merge.rb +217 -0
- data/lib/erlapi/parser.rb +134 -0
- data/lib/erlapi/shtml.rb +351 -0
- data/lib/erlapi/templatable.rb +51 -0
- data/lib/erlapi/templates/html/direct/_context.rhtml +172 -0
- data/lib/erlapi/templates/html/direct/class.rhtml +40 -0
- data/lib/erlapi/templates/html/direct/file.rhtml +30 -0
- data/lib/erlapi/templates/html/direct/index.rhtml +14 -0
- data/lib/erlapi/templates/html/direct/resources/apple-touch-icon.png +0 -0
- data/lib/erlapi/templates/html/direct/resources/css/main.css +263 -0
- data/lib/erlapi/templates/html/direct/resources/css/panel.css +383 -0
- data/lib/erlapi/templates/html/direct/resources/css/reset.css +53 -0
- data/lib/erlapi/templates/html/direct/resources/favicon.ico +0 -0
- data/lib/erlapi/templates/html/direct/resources/i/arrows.png +0 -0
- data/lib/erlapi/templates/html/direct/resources/i/results_bg.png +0 -0
- data/lib/erlapi/templates/html/direct/resources/i/tree_bg.png +0 -0
- data/lib/erlapi/templates/html/direct/resources/js/jquery-1.3.2.min.js +19 -0
- data/lib/erlapi/templates/html/direct/resources/js/jquery-effect.js +593 -0
- data/lib/erlapi/templates/html/direct/resources/js/main.js +22 -0
- data/lib/erlapi/templates/html/direct/resources/js/searchdoc.js +628 -0
- data/lib/erlapi/templates/html/direct/resources/panel/index.html +71 -0
- data/lib/erlapi/templates/html/merge/index.rhtml +14 -0
- data/lib/erlapi/templates/html/shtml/_context.rhtml +68 -0
- data/lib/erlapi/templates/html/shtml/class.rhtml +25 -0
- data/lib/erlapi/templates/html/shtml/file.rhtml +37 -0
- data/lib/erlapi/templates/html/shtml/index.rhtml +14 -0
- data/lib/erlapi/templates/html/shtml/resources copy/apple-touch-icon.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources copy/css/main.css +195 -0
- data/lib/erlapi/templates/html/shtml/resources copy/css/panel.css +383 -0
- data/lib/erlapi/templates/html/shtml/resources copy/css/reset.css +53 -0
- data/lib/erlapi/templates/html/shtml/resources copy/favicon.ico +0 -0
- data/lib/erlapi/templates/html/shtml/resources copy/i/arrows.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources copy/i/results_bg.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources copy/i/tree_bg.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources copy/js/jquery-1.3.2.min.js +19 -0
- data/lib/erlapi/templates/html/shtml/resources copy/js/main.js +34 -0
- data/lib/erlapi/templates/html/shtml/resources copy/js/searchdoc.js +628 -0
- data/lib/erlapi/templates/html/shtml/resources copy/panel/index.html +71 -0
- data/lib/erlapi/templates/html/shtml/resources/apple-touch-icon.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources/css/main.css +263 -0
- data/lib/erlapi/templates/html/shtml/resources/css/panel.css +383 -0
- data/lib/erlapi/templates/html/shtml/resources/css/reset.css +53 -0
- data/lib/erlapi/templates/html/shtml/resources/favicon.ico +0 -0
- data/lib/erlapi/templates/html/shtml/resources/i/arrows.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources/i/results_bg.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources/i/tree_bg.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources/js/jquery-1.3.2.min.js +19 -0
- data/lib/erlapi/templates/html/shtml/resources/js/jquery-effect.js +593 -0
- data/lib/erlapi/templates/html/shtml/resources/js/main.js +22 -0
- data/lib/erlapi/templates/html/shtml/resources/js/searchdoc.js +620 -0
- data/lib/erlapi/templates/html/shtml/resources/panel/index.html +71 -0
- data/test/erlapi_test.rb +7 -0
- data/test/test_helper.rb +10 -0
- metadata +155 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
3
|
+
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
4
|
+
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
6
|
+
<head>
|
7
|
+
<title>layout</title>
|
8
|
+
<link rel="stylesheet" href="../css/reset.css" type="text/css" media="screen" charset="utf-8" />
|
9
|
+
<link rel="stylesheet" href="../css/panel.css" type="text/css" media="screen" charset="utf-8" />
|
10
|
+
<script src="search_index.js" type="text/javascript" charset="utf-8"></script>
|
11
|
+
<script src="tree.js" type="text/javascript" charset="utf-8"></script>
|
12
|
+
<script src="../js/jquery-1.3.2.min.js" type="text/javascript" charset="utf-8"></script>
|
13
|
+
<script src="../js/searchdoc.js" type="text/javascript" charset="utf-8"></script>
|
14
|
+
<script type="text/javascript" charset="utf-8">
|
15
|
+
//<![CDATA[
|
16
|
+
function placeholder() {
|
17
|
+
if (jQuery.browser.safari) return;
|
18
|
+
$('#search-label').click(function() {
|
19
|
+
$('#search').focus();
|
20
|
+
$('#search-label').hide();
|
21
|
+
});
|
22
|
+
|
23
|
+
$('#search').focus(function() {
|
24
|
+
$('#search-label').hide();
|
25
|
+
});
|
26
|
+
$('#search').blur(function() {
|
27
|
+
this.value == '' && $('#search-label').show()
|
28
|
+
});
|
29
|
+
|
30
|
+
$('#search')[0].value == '' && $('#search-label').show();
|
31
|
+
}
|
32
|
+
$(function() {
|
33
|
+
placeholder();
|
34
|
+
var panel = new Searchdoc.Panel($('#panel'), search_data, tree, top.frames[1]);
|
35
|
+
$('#search').focus();
|
36
|
+
|
37
|
+
var s = window.parent.location.search.match(/\?q=([^&]+)/);
|
38
|
+
if (s) {
|
39
|
+
s = decodeURIComponent(s[1]).replace(/\+/g, ' ');
|
40
|
+
if (s.length > 0)
|
41
|
+
{
|
42
|
+
$('#search').val(s);
|
43
|
+
panel.search(s, true);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
})
|
47
|
+
//]]>
|
48
|
+
</script>
|
49
|
+
</head>
|
50
|
+
<body>
|
51
|
+
<div class="panel panel_tree" id="panel">
|
52
|
+
<div class="header">
|
53
|
+
<div>
|
54
|
+
<label for="search" id="search-label" style="display: none">Search</label>
|
55
|
+
<table>
|
56
|
+
<tr><td>
|
57
|
+
<input type="Search" placeholder="Search" autosave="searchdoc" results="10" id="search" autocomplete="off"/>
|
58
|
+
</td></tr>
|
59
|
+
</table></div>
|
60
|
+
</div>
|
61
|
+
<div class="tree">
|
62
|
+
<ul>
|
63
|
+
</ul>
|
64
|
+
</div>
|
65
|
+
<div class="result">
|
66
|
+
<ul>
|
67
|
+
</ul>
|
68
|
+
</div>
|
69
|
+
</div>
|
70
|
+
</body>
|
71
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Erlapi::Helpers
|
2
|
+
def each_letter_group(methods, &block)
|
3
|
+
group = {:name => '', :methods => []}
|
4
|
+
methods.sort{ |a, b| a.name <=> b.name }.each do |method|
|
5
|
+
gname = group_name method.name
|
6
|
+
if gname != group[:name]
|
7
|
+
yield group unless group[:methods].size == 0
|
8
|
+
group = {
|
9
|
+
:name => gname,
|
10
|
+
:methods => []
|
11
|
+
}
|
12
|
+
end
|
13
|
+
group[:methods].push(method)
|
14
|
+
end
|
15
|
+
yield group unless group[:methods].size == 0
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
def group_name name
|
20
|
+
if match = name.match(/^([a-z])/i)
|
21
|
+
match[1].upcase
|
22
|
+
else
|
23
|
+
'#'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/erlapi/merge.rb
ADDED
@@ -0,0 +1,217 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'pathname'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
require 'sdoc/templatable'
|
7
|
+
|
8
|
+
class SDoc::Merge
|
9
|
+
include SDoc::Templatable
|
10
|
+
|
11
|
+
FLAG_FILE = "created.rid"
|
12
|
+
|
13
|
+
def initialize()
|
14
|
+
@names = []
|
15
|
+
@urls = []
|
16
|
+
@op_dir = 'doc'
|
17
|
+
@title = ''
|
18
|
+
@directories = []
|
19
|
+
template_dir = RDoc::Generator::SHtml.template_dir('merge')
|
20
|
+
@template_dir = Pathname.new File.expand_path(template_dir)
|
21
|
+
end
|
22
|
+
|
23
|
+
def merge(options)
|
24
|
+
parse_options options
|
25
|
+
|
26
|
+
@outputdir = Pathname.new( @op_dir )
|
27
|
+
|
28
|
+
check_directories
|
29
|
+
setup_output_dir
|
30
|
+
setup_names
|
31
|
+
copy_files
|
32
|
+
copy_docs if @urls.empty?
|
33
|
+
merge_search_index
|
34
|
+
merge_tree
|
35
|
+
generate_index_file
|
36
|
+
end
|
37
|
+
|
38
|
+
def parse_options(options)
|
39
|
+
opts = OptionParser.new do |opt|
|
40
|
+
opt.banner = "Usage: sdoc-merge [options] directories"
|
41
|
+
|
42
|
+
opt.on("-n", "--names [NAMES]", "Names of merged repositories. Comma separated") do |v|
|
43
|
+
@names = v.split(',').map{|name| name.strip }
|
44
|
+
end
|
45
|
+
|
46
|
+
opt.on("-o", "--op [DIRECTORY]", "Set the output directory") do |v|
|
47
|
+
@op_dir = v
|
48
|
+
end
|
49
|
+
|
50
|
+
opt.on("-t", "--title [TITLE]", "Set the title of merged file") do |v|
|
51
|
+
@title = v
|
52
|
+
end
|
53
|
+
|
54
|
+
opt.on("-u", "--urls [URLS]", "Paths to merged docs. If you \n" +
|
55
|
+
"set this files and classes won't be actualy copied to merged build") do |v|
|
56
|
+
@urls = v.split(' ').map{|name| name.strip }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
opts.parse! options
|
60
|
+
@directories = options.dup
|
61
|
+
end
|
62
|
+
|
63
|
+
def merge_tree
|
64
|
+
tree = []
|
65
|
+
@directories.each_with_index do |dir, i|
|
66
|
+
name = @names[i]
|
67
|
+
url = @urls.empty? ? name : @urls[i]
|
68
|
+
filename = File.join dir, RDoc::Generator::SHtml::TREE_FILE
|
69
|
+
data = open(filename).read.sub(/var tree =\s*/, '')
|
70
|
+
subtree = JSON.parse data, :max_nesting => 35
|
71
|
+
item = [
|
72
|
+
name,
|
73
|
+
url + '/' + extract_index_path(dir),
|
74
|
+
'',
|
75
|
+
append_path(subtree, url)
|
76
|
+
]
|
77
|
+
tree << item
|
78
|
+
end
|
79
|
+
|
80
|
+
dst = File.join @op_dir, RDoc::Generator::SHtml::TREE_FILE
|
81
|
+
FileUtils.mkdir_p File.dirname(dst)
|
82
|
+
File.open(dst, "w", 0644) do |f|
|
83
|
+
f.write('var tree = '); f.write(tree.to_json)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def append_path subtree, path
|
88
|
+
subtree.map do |item|
|
89
|
+
item[1] = path + '/' + item[1] unless item[1].empty?
|
90
|
+
item[3] = append_path item[3], path
|
91
|
+
item
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def merge_search_index
|
96
|
+
items = []
|
97
|
+
@indexes = {}
|
98
|
+
@directories.each_with_index do |dir, i|
|
99
|
+
name = @names[i]
|
100
|
+
url = @urls.empty? ? name : @urls[i]
|
101
|
+
filename = File.join dir, RDoc::Generator::SHtml::SEARCH_INDEX_FILE
|
102
|
+
data = open(filename).read.sub(/var search_data =\s*/, '')
|
103
|
+
subindex = JSON.parse data, :max_nesting => 35
|
104
|
+
@indexes[name] = subindex
|
105
|
+
|
106
|
+
searchIndex = subindex["index"]["searchIndex"]
|
107
|
+
longSearchIndex = subindex["index"]["longSearchIndex"]
|
108
|
+
subindex["index"]["info"].each_with_index do |info, j|
|
109
|
+
info[2] = url + '/' + info[2]
|
110
|
+
info[6] = i
|
111
|
+
items << {
|
112
|
+
:info => info,
|
113
|
+
:searchIndex => searchIndex[j],
|
114
|
+
:longSearchIndex => name + ' ' + longSearchIndex[j]
|
115
|
+
}
|
116
|
+
end
|
117
|
+
end
|
118
|
+
items.sort! do |a, b|
|
119
|
+
# type (class/method/file) or name or doc part or namespace
|
120
|
+
[a[:info][5], a[:info][0], a[:info][6], a[:info][1]] <=> [b[:info][5], b[:info][0], b[:info][6], b[:info][1]]
|
121
|
+
end
|
122
|
+
|
123
|
+
index = {
|
124
|
+
:searchIndex => items.map{|item| item[:searchIndex]},
|
125
|
+
:longSearchIndex => items.map{|item| item[:longSearchIndex]},
|
126
|
+
:info => items.map{|item| item[:info]}
|
127
|
+
}
|
128
|
+
search_data = {
|
129
|
+
:index => index,
|
130
|
+
:badges => @names
|
131
|
+
}
|
132
|
+
|
133
|
+
dst = File.join @op_dir, RDoc::Generator::SHtml::SEARCH_INDEX_FILE
|
134
|
+
FileUtils.mkdir_p File.dirname(dst)
|
135
|
+
File.open(dst, "w", 0644) do |f|
|
136
|
+
f.write('var search_data = '); f.write(search_data.to_json)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def extract_index_path dir
|
141
|
+
filename = File.join dir, 'index.html'
|
142
|
+
content = File.open(filename) { |f| f.read }
|
143
|
+
match = content.match(/<frame\s+src="([^"]+)"\s+name="docwin"/mi)
|
144
|
+
if match
|
145
|
+
match[1]
|
146
|
+
else
|
147
|
+
''
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def generate_index_file
|
152
|
+
templatefile = @template_dir + 'index.rhtml'
|
153
|
+
outfile = @outputdir + 'index.html'
|
154
|
+
url = @urls.empty? ? @names[0] : @urls[0]
|
155
|
+
index_path = url + '/' + extract_index_path(@directories[0])
|
156
|
+
|
157
|
+
render_template templatefile, binding(), outfile
|
158
|
+
end
|
159
|
+
|
160
|
+
def setup_names
|
161
|
+
unless @names.size > 0
|
162
|
+
@directories.each do |dir|
|
163
|
+
name = File.basename dir
|
164
|
+
name = File.basename File.dirname(dir) if name == 'doc'
|
165
|
+
@names << name
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def copy_docs
|
171
|
+
@directories.each_with_index do |dir, i|
|
172
|
+
name = @names[i]
|
173
|
+
index_dir = File.dirname(RDoc::Generator::SHtml::TREE_FILE)
|
174
|
+
FileUtils.mkdir_p(File.join(@op_dir, name))
|
175
|
+
|
176
|
+
Dir.new(dir).each do |item|
|
177
|
+
if File.directory?(File.join(dir, item)) && item != '.' && item != '..' && item != index_dir
|
178
|
+
FileUtils.cp_r File.join(dir, item), File.join(@op_dir, name, item), :preserve => true
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def copy_files
|
185
|
+
dir = @directories.first
|
186
|
+
Dir.new(dir).each do |item|
|
187
|
+
if item != '.' && item != '..' && item != RDoc::Generator::SHtml::FILE_DIR && item != RDoc::Generator::SHtml::CLASS_DIR
|
188
|
+
FileUtils.cp_r File.join(dir, item), @op_dir, :preserve => true
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def setup_output_dir
|
194
|
+
if File.exists? @op_dir
|
195
|
+
error "#{@op_dir} allready exists"
|
196
|
+
end
|
197
|
+
FileUtils.mkdir_p @op_dir
|
198
|
+
end
|
199
|
+
|
200
|
+
def check_directories
|
201
|
+
@directories.each do |dir|
|
202
|
+
unless File.exists?(File.join(dir, FLAG_FILE)) &&
|
203
|
+
File.exists?(File.join(dir, RDoc::Generator::SHtml::TREE_FILE)) &&
|
204
|
+
File.exists?(File.join(dir, RDoc::Generator::SHtml::SEARCH_INDEX_FILE))
|
205
|
+
error "#{dir} does not seem to be an sdoc directory"
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
##
|
211
|
+
# Report an error message and exit
|
212
|
+
|
213
|
+
def error(msg)
|
214
|
+
raise RDoc::Error, msg
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
module Erlapi::Parser
|
4
|
+
class Base
|
5
|
+
attr_accessor :src_dir, :template_dir, :files, :modules, :entities_coder
|
6
|
+
def initialize(src_dir = nil)
|
7
|
+
self.files = []
|
8
|
+
self.modules = {}
|
9
|
+
self.src_dir = Pathname.new(src_dir || File.join(File.dirname(__FILE__), '..', 'src'))
|
10
|
+
self.template_dir = File.join(File.dirname(__FILE__), 'templates')
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse
|
14
|
+
files.each do |file|
|
15
|
+
puts "Parsing #{file}"
|
16
|
+
doc = Nokogiri::XML(File.read(file))
|
17
|
+
|
18
|
+
mod = Erlapi::Parser::Module.new(self, doc)
|
19
|
+
self.modules[mod.title] = mod if mod.valid
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def inner_xml(node)
|
24
|
+
node.is_a?(Nokogiri::XML::NodeSet) ? node.collect{|j| j.children.to_xml}.join('') : node.children.to_xml
|
25
|
+
end
|
26
|
+
|
27
|
+
def special_tags(str)
|
28
|
+
str.gsub!(/<c>(.*?)<\/c>/mi, '<tt>\1</tt>')
|
29
|
+
str.gsub!(/<code.*?>(.*?)<\/code>/mi, '<pre>\1</pre>')
|
30
|
+
str.gsub!(/<v.*?>(.*?)<\/v>/mi, '<b>\1</b><br/>')
|
31
|
+
str.gsub!(/<input.*?>(.*?)<\/input>/mi, '<tt>\1</tt><br/>')
|
32
|
+
str
|
33
|
+
end
|
34
|
+
|
35
|
+
def prepare_string(str)
|
36
|
+
str.gsub(/\\\\/, '\\')
|
37
|
+
end
|
38
|
+
|
39
|
+
def files
|
40
|
+
load_files(src_dir.realpath)
|
41
|
+
@files
|
42
|
+
end
|
43
|
+
|
44
|
+
def load_files(dir_path)
|
45
|
+
dir = Dir.new(dir_path)
|
46
|
+
dir.each do |file_name|
|
47
|
+
full_path = File.join(dir.path, file_name)
|
48
|
+
if file_name != '.' && file_name != '..'
|
49
|
+
if File.directory?(full_path)
|
50
|
+
load_files(full_path)
|
51
|
+
else
|
52
|
+
@files << full_path if File.extname(file_name) == '.xml'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
dir.close
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
class Module
|
62
|
+
attr_accessor :parser, :title, :summary, :desc, :datatypes, :funcs, :sections, :valid, :doc
|
63
|
+
def initialize(parser, doc)
|
64
|
+
self.doc = doc
|
65
|
+
self.parser = parser
|
66
|
+
self.title = doc.css('module').inner_html
|
67
|
+
self.summary = doc.css('modulesummary').inner_html || ''
|
68
|
+
if self.title && self.title != ''
|
69
|
+
self.valid = true
|
70
|
+
else
|
71
|
+
self.valid = false
|
72
|
+
end
|
73
|
+
if valid
|
74
|
+
define_desc
|
75
|
+
define_sections
|
76
|
+
define_funcs
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def define_desc
|
81
|
+
self.desc = self.parser.special_tags(self.parser.inner_xml(doc.css('description')))
|
82
|
+
end
|
83
|
+
|
84
|
+
def define_sections
|
85
|
+
self.sections = []
|
86
|
+
doc.css('section').each do |node|
|
87
|
+
self.sections << Erlapi::Parser::Section.new(self, node)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def define_funcs
|
92
|
+
self.funcs = []
|
93
|
+
doc.css('funcs func').each do |node|
|
94
|
+
func = Erlapi::Parser::Func.new(self, node)
|
95
|
+
self.funcs << func if func.short_name
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
class Func
|
101
|
+
attr_accessor :p_module, :short_name, :names, :summary, :types, :desc, :ref, :short_names
|
102
|
+
|
103
|
+
def initialize(p_module, node)
|
104
|
+
self.p_module = p_module
|
105
|
+
self.names = node.css('name').map {|v| v.inner_html}
|
106
|
+
if self.names
|
107
|
+
self.short_names = self.names.map { |n| n.match(/([\w\d_-]*)\(/) ? $~[1] : nil }.compact.uniq
|
108
|
+
self.short_name = self.short_names.first if self.short_names
|
109
|
+
end
|
110
|
+
self.ref = self.names.first.gsub(/[^\w]/, '')
|
111
|
+
self.summary = parser.inner_xml(node.css('fsummary'))
|
112
|
+
self.types = parser.special_tags(parser.inner_xml(node.css('type')))
|
113
|
+
self.desc = parser.special_tags(parser.inner_xml(node.css('desc')))
|
114
|
+
end
|
115
|
+
|
116
|
+
def parser
|
117
|
+
self.p_module.parser
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
class Section
|
122
|
+
attr_accessor :p_module, :name, :desc
|
123
|
+
|
124
|
+
def initialize(p_module, node)
|
125
|
+
self.p_module = p_module
|
126
|
+
self.name = node.css('title').inner_html
|
127
|
+
self.desc = parser.special_tags(parser.inner_xml(node))
|
128
|
+
end
|
129
|
+
|
130
|
+
def parser
|
131
|
+
self.p_module.parser
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|