rdoc-perl_pod 1.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.tar.gz.sig +0 -0
- data/History.txt +5 -0
- data/Manifest.txt +7 -0
- data/README.txt +33 -0
- data/Rakefile +22 -0
- data/lib/rdoc/discover.rb +6 -0
- data/lib/rdoc/parser/perl_pod.rb +163 -0
- data/test/test_rdoc_parser_perl.rb +74 -0
- metadata +160 -0
- metadata.gz.sig +0 -0
data.tar.gz.sig
ADDED
Binary file
|
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/README.txt
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
= rdoc-perl_pod
|
2
|
+
|
3
|
+
* https://github.com/rdoc/rdoc-perl_pod
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
A parser for Perl's POD documentation format. Allows Perl and Ruby
|
8
|
+
documentation to be used together.
|
9
|
+
|
10
|
+
== FEATURES/PROBLEMS:
|
11
|
+
|
12
|
+
* No maintainer
|
13
|
+
* Parses .pl and .pm files
|
14
|
+
|
15
|
+
== SYNOPSIS:
|
16
|
+
|
17
|
+
After installing rdoc-perl_pod use RDoc on some .pl or .pm files
|
18
|
+
|
19
|
+
== REQUIREMENTS:
|
20
|
+
|
21
|
+
* RDoc
|
22
|
+
* Perl files
|
23
|
+
|
24
|
+
== INSTALL:
|
25
|
+
|
26
|
+
* gem install rdoc-perl_pod
|
27
|
+
|
28
|
+
== LICENSE:
|
29
|
+
|
30
|
+
Unknown
|
31
|
+
|
32
|
+
Copyright (c) Huge Sasse
|
33
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
|
6
|
+
Hoe.plugin :git
|
7
|
+
Hoe.plugin :isolate
|
8
|
+
Hoe.plugin :minitest
|
9
|
+
Hoe.plugins.delete :rubyforge
|
10
|
+
|
11
|
+
Hoe.spec 'rdoc-perl_pod' do
|
12
|
+
developer 'Eric Hodel', 'drbrain@segment7.net'
|
13
|
+
developer 'Hugh Sasse', 'hgs@dmu.ac.uk'
|
14
|
+
|
15
|
+
extra_deps << ['rdoc', '~> 3']
|
16
|
+
extra_dev_deps << ['isolate', '~> 3']
|
17
|
+
|
18
|
+
self.rubyforge_name = 'rdoc'
|
19
|
+
self.isolate_dir = 'tmp/isolated'
|
20
|
+
end
|
21
|
+
|
22
|
+
# vim: syntax=Ruby
|
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'rdoc'
|
2
|
+
require 'rdoc/parser'
|
3
|
+
|
4
|
+
##
|
5
|
+
# This is an attamept to write a basic parser for Perl's POD (Plain old
|
6
|
+
# Documentation) format. Ruby code must co-exist with Perl, and some tasks
|
7
|
+
# are easier in Perl than Ruby because of existing libraries.
|
8
|
+
#
|
9
|
+
# One difficult is that Perl POD has no means of identifying the classes
|
10
|
+
# (packages) and methods (subs) with which it is associated, it is more like
|
11
|
+
# literate programming in so far as it just happens to be in the same place as
|
12
|
+
# the code, but need not be.
|
13
|
+
#
|
14
|
+
# We would like to support all the markup the POD provides so that it will
|
15
|
+
# convert happily to HTML. At the moment I don't think I can do that: time
|
16
|
+
# constraints.
|
17
|
+
|
18
|
+
class RDoc::Parser::PerlPOD < RDoc::Parser
|
19
|
+
|
20
|
+
VERSION = '1.0'
|
21
|
+
|
22
|
+
parse_files_matching(/.p[lm]$/)
|
23
|
+
|
24
|
+
##
|
25
|
+
# Prepare to parse a perl file
|
26
|
+
|
27
|
+
def initialize(top_level, file_name, content, options, stats)
|
28
|
+
super
|
29
|
+
|
30
|
+
preprocess = RDoc::Markup::PreProcess.new @file_name, @options.rdoc_include
|
31
|
+
|
32
|
+
preprocess.handle @content do |directive, param|
|
33
|
+
warn "Unrecognized directive '#{directive}' in #{@file_name}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Extract the Pod(-like) comments from the code. At its most basic there
|
39
|
+
# will ne no need to distinguish between the different types of header, etc.
|
40
|
+
#
|
41
|
+
# This uses a simple finite state machine, in a very procedural pattern. I
|
42
|
+
# could "replace case with polymorphism" but I think it would obscure the
|
43
|
+
# intent, scatter the code all over tha place. This machine is necessary
|
44
|
+
# because POD requires that directives be preceded by blank lines, so
|
45
|
+
# reading line by line is necessary, and preserving state about what is seen
|
46
|
+
# is necesary.
|
47
|
+
|
48
|
+
def scan
|
49
|
+
@top_level.comment ||= ""
|
50
|
+
state=:code_blank
|
51
|
+
line_number = 0
|
52
|
+
line = nil
|
53
|
+
|
54
|
+
# This started out as a really long nested case statement,
|
55
|
+
# which also led to repetitive code. I'd like to avoid that
|
56
|
+
# so I'm using a "table" instead.
|
57
|
+
|
58
|
+
# Firstly we need some procs to do the transition and processing
|
59
|
+
# work. Because these are procs they are closures, and they can
|
60
|
+
# use variables in the local scope.
|
61
|
+
#
|
62
|
+
# First, the "nothing to see here" stuff.
|
63
|
+
code_noop = lambda do
|
64
|
+
if line =~ /^\s+$/
|
65
|
+
state = :code_blank
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
pod_noop = lambda do
|
70
|
+
if line =~ /^\s+$/
|
71
|
+
state = :pod_blank
|
72
|
+
end
|
73
|
+
@top_level.comment += filter(line)
|
74
|
+
end
|
75
|
+
|
76
|
+
begin_noop = lambda do
|
77
|
+
if line =~ /^\s+$/
|
78
|
+
state = :begin_blank
|
79
|
+
end
|
80
|
+
@top_level.comment += filter(line)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Now for the blocks that process code and comments...
|
84
|
+
|
85
|
+
transit_to_pod = lambda do
|
86
|
+
case line
|
87
|
+
when /^=(?:pod|head\d+)/
|
88
|
+
state = :pod_no_blank
|
89
|
+
@top_level.comment += filter(line)
|
90
|
+
when /^=over/
|
91
|
+
state = :over_no_blank
|
92
|
+
@top_level.comment += filter(line)
|
93
|
+
when /^=(?:begin|for)/
|
94
|
+
state = :begin_no_blank
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
process_pod = lambda do
|
99
|
+
case line
|
100
|
+
when /^\s*$/ then
|
101
|
+
state = :pod_blank
|
102
|
+
@top_level.comment += filter(line)
|
103
|
+
when /^=cut/ then
|
104
|
+
state = :code_no_blank
|
105
|
+
when /^=end/ then
|
106
|
+
$stderr.puts "'=end' unexpected at #{line_number} in #{@file_name}"
|
107
|
+
else
|
108
|
+
@top_level.comment += filter(line)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
process_begin = lambda do
|
113
|
+
case line
|
114
|
+
when /^\s*$/ then
|
115
|
+
state = :begin_blank
|
116
|
+
@top_level.comment += filter(line)
|
117
|
+
when /^=end/ then
|
118
|
+
state = :code_no_blank
|
119
|
+
when /^=cut/
|
120
|
+
$stderr.puts "'=cut' unexpected at #{line_number} in #{@file_name}"
|
121
|
+
else
|
122
|
+
@top_level.comment += filter(line)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
transitions = { :code_no_blank => code_noop,
|
127
|
+
:code_blank => transit_to_pod,
|
128
|
+
:pod_no_blank => pod_noop,
|
129
|
+
:pod_blank => process_pod,
|
130
|
+
:begin_no_blank => begin_noop,
|
131
|
+
:begin_blank => process_begin,
|
132
|
+
}
|
133
|
+
|
134
|
+
@content.each_line do |l|
|
135
|
+
line = l
|
136
|
+
line_number += 1
|
137
|
+
transitions[state].call
|
138
|
+
end
|
139
|
+
|
140
|
+
@top_level
|
141
|
+
end
|
142
|
+
|
143
|
+
##
|
144
|
+
# Filter the perl markup that does the same as the rdoc filtering. Only
|
145
|
+
# basic for now. Will probably need a proper parser to cope with C<<...>>
|
146
|
+
# etc.
|
147
|
+
|
148
|
+
def filter(comment)
|
149
|
+
return '' if comment =~ /^=pod\s*$/
|
150
|
+
comment.gsub!(/^=pod/, '==')
|
151
|
+
|
152
|
+
comment.gsub!(/^=head(\d+)/) do
|
153
|
+
"=" * $1.to_i
|
154
|
+
end
|
155
|
+
comment.gsub!(/=item/, '');
|
156
|
+
comment.gsub!(/C<(.*?)>/, '<tt>\1</tt>');
|
157
|
+
comment.gsub!(/I<(.*?)>/, '<i>\1</i>');
|
158
|
+
comment.gsub!(/B<(.*?)>/, '<b>\1</b>');
|
159
|
+
comment
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
require 'tempfile'
|
3
|
+
require 'rubygems'
|
4
|
+
require 'minitest/autorun'
|
5
|
+
require 'rdoc'
|
6
|
+
require 'rdoc/options'
|
7
|
+
require 'rdoc/parser/perl_pod'
|
8
|
+
|
9
|
+
class TestRdocParserPerlPOD < MiniTest::Unit::TestCase
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@tempfile = Tempfile.new self.class.name
|
13
|
+
filename = @tempfile.path
|
14
|
+
|
15
|
+
@top_level = RDoc::TopLevel.new filename
|
16
|
+
@fn = filename
|
17
|
+
@options = RDoc::Options.new
|
18
|
+
@stats = RDoc::Stats.new 0
|
19
|
+
end
|
20
|
+
|
21
|
+
def teardown
|
22
|
+
@tempfile.close
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_uncommented_perl
|
26
|
+
content = <<-EOF
|
27
|
+
while (<>) {
|
28
|
+
tr/a-z/A-Z;
|
29
|
+
print
|
30
|
+
}
|
31
|
+
EOF
|
32
|
+
|
33
|
+
comment = util_get_comment content
|
34
|
+
assert_equal "", comment
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_perl_without_pod
|
38
|
+
content = <<-EOF
|
39
|
+
#!/usr/local/bin/perl
|
40
|
+
#
|
41
|
+
#This is a pointless perl program because it does -p.
|
42
|
+
#
|
43
|
+
while(<>) {print;}:
|
44
|
+
EOF
|
45
|
+
|
46
|
+
comment = util_get_comment content
|
47
|
+
assert_equal "", comment
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_simple_pod_no_structure
|
51
|
+
content = <<-EOF
|
52
|
+
=begin pod
|
53
|
+
|
54
|
+
This just contains plain old documentation
|
55
|
+
|
56
|
+
=end
|
57
|
+
EOF
|
58
|
+
comment = util_get_comment content
|
59
|
+
assert_equal 'This just contains plain old documentation', comment
|
60
|
+
end
|
61
|
+
|
62
|
+
# Get the comment of the @top_level when it has processed the input.
|
63
|
+
def util_get_comment(content)
|
64
|
+
parser = util_parser content
|
65
|
+
parser.scan.comment
|
66
|
+
end
|
67
|
+
|
68
|
+
# create a new parser with the supplied content.
|
69
|
+
def util_parser(content)
|
70
|
+
RDoc::Parser::PerlPOD.new @top_level, @fn, content, @options, @stats
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
metadata
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rdoc-perl_pod
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 15
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: "1.0"
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Eric Hodel
|
13
|
+
- Hugh Sasse
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain:
|
17
|
+
- |
|
18
|
+
-----BEGIN CERTIFICATE-----
|
19
|
+
MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMRAwDgYDVQQDDAdkcmJy
|
20
|
+
YWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZFgNu
|
21
|
+
ZXQwHhcNMDcxMjIxMDIwNDE0WhcNMDgxMjIwMDIwNDE0WjBBMRAwDgYDVQQDDAdk
|
22
|
+
cmJyYWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZ
|
23
|
+
FgNuZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbbgLrGLGIDE76
|
24
|
+
LV/cvxdEzCuYuS3oG9PrSZnuDweySUfdp/so0cDq+j8bqy6OzZSw07gdjwFMSd6J
|
25
|
+
U5ddZCVywn5nnAQ+Ui7jMW54CYt5/H6f2US6U0hQOjJR6cpfiymgxGdfyTiVcvTm
|
26
|
+
Gj/okWrQl0NjYOYBpDi+9PPmaH2RmLJu0dB/NylsDnW5j6yN1BEI8MfJRR+HRKZY
|
27
|
+
mUtgzBwF1V4KIZQ8EuL6I/nHVu07i6IkrpAgxpXUfdJQJi0oZAqXurAV3yTxkFwd
|
28
|
+
g62YrrW26mDe+pZBzR6bpLE+PmXCzz7UxUq3AE0gPHbiMXie3EFE0oxnsU3lIduh
|
29
|
+
sCANiQ8BAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
30
|
+
BBS5k4Z75VSpdM0AclG2UvzFA/VW5DANBgkqhkiG9w0BAQUFAAOCAQEAHagT4lfX
|
31
|
+
kP/hDaiwGct7XPuVGbrOsKRVD59FF5kETBxEc9UQ1clKWngf8JoVuEoKD774dW19
|
32
|
+
bU0GOVWO+J6FMmT/Cp7nuFJ79egMf/gy4gfUfQMuvfcr6DvZUPIs9P/TlK59iMYF
|
33
|
+
DIOQ3DxdF3rMzztNUCizN4taVscEsjCcgW6WkUJnGdqlu3OHWpQxZBJkBTjPCoc6
|
34
|
+
UW6on70SFPmAy/5Cq0OJNGEWBfgD9q7rrs/X8GGwUWqXb85RXnUVi/P8Up75E0ag
|
35
|
+
14jEc90kN+C7oI/AGCBN0j6JnEtYIEJZibjjDJTSMWlUKKkj30kq7hlUC2CepJ4v
|
36
|
+
x52qPcexcYZR7w==
|
37
|
+
-----END CERTIFICATE-----
|
38
|
+
|
39
|
+
date: 2010-12-23 00:00:00 -08:00
|
40
|
+
default_executable:
|
41
|
+
dependencies:
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: rdoc
|
44
|
+
prerelease: false
|
45
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
46
|
+
none: false
|
47
|
+
requirements:
|
48
|
+
- - ~>
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
hash: 5
|
51
|
+
segments:
|
52
|
+
- 3
|
53
|
+
version: "3"
|
54
|
+
type: :runtime
|
55
|
+
version_requirements: *id001
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: minitest
|
58
|
+
prerelease: false
|
59
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
hash: 15
|
65
|
+
segments:
|
66
|
+
- 2
|
67
|
+
- 0
|
68
|
+
- 0
|
69
|
+
version: 2.0.0
|
70
|
+
type: :development
|
71
|
+
version_requirements: *id002
|
72
|
+
- !ruby/object:Gem::Dependency
|
73
|
+
name: isolate
|
74
|
+
prerelease: false
|
75
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ~>
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
hash: 5
|
81
|
+
segments:
|
82
|
+
- 3
|
83
|
+
version: "3"
|
84
|
+
type: :development
|
85
|
+
version_requirements: *id003
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: hoe
|
88
|
+
prerelease: false
|
89
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
hash: 19
|
95
|
+
segments:
|
96
|
+
- 2
|
97
|
+
- 7
|
98
|
+
- 0
|
99
|
+
version: 2.7.0
|
100
|
+
type: :development
|
101
|
+
version_requirements: *id004
|
102
|
+
description: |-
|
103
|
+
A parser for Perl's POD documentation format. Allows Perl and Ruby
|
104
|
+
documentation to be used together.
|
105
|
+
email:
|
106
|
+
- drbrain@segment7.net
|
107
|
+
- hgs@dmu.ac.uk
|
108
|
+
executables: []
|
109
|
+
|
110
|
+
extensions: []
|
111
|
+
|
112
|
+
extra_rdoc_files:
|
113
|
+
- History.txt
|
114
|
+
- Manifest.txt
|
115
|
+
- README.txt
|
116
|
+
files:
|
117
|
+
- History.txt
|
118
|
+
- Manifest.txt
|
119
|
+
- README.txt
|
120
|
+
- Rakefile
|
121
|
+
- lib/rdoc/discover.rb
|
122
|
+
- lib/rdoc/parser/perl_pod.rb
|
123
|
+
- test/test_rdoc_parser_perl.rb
|
124
|
+
has_rdoc: true
|
125
|
+
homepage: https://github.com/rdoc/rdoc-perl_pod
|
126
|
+
licenses: []
|
127
|
+
|
128
|
+
post_install_message:
|
129
|
+
rdoc_options:
|
130
|
+
- --main
|
131
|
+
- README.txt
|
132
|
+
require_paths:
|
133
|
+
- lib
|
134
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
135
|
+
none: false
|
136
|
+
requirements:
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
hash: 3
|
140
|
+
segments:
|
141
|
+
- 0
|
142
|
+
version: "0"
|
143
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
|
+
none: false
|
145
|
+
requirements:
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
hash: 3
|
149
|
+
segments:
|
150
|
+
- 0
|
151
|
+
version: "0"
|
152
|
+
requirements: []
|
153
|
+
|
154
|
+
rubyforge_project: rdoc
|
155
|
+
rubygems_version: 1.3.7
|
156
|
+
signing_key:
|
157
|
+
specification_version: 3
|
158
|
+
summary: A parser for Perl's POD documentation format
|
159
|
+
test_files:
|
160
|
+
- test/test_rdoc_parser_perl.rb
|
metadata.gz.sig
ADDED
Binary file
|