#!/usr/local/bin/perl -w
use
vars
qw($TOOL_NAME $YEAR $TOP_FILE $SVNID $SVNNAME $VERSION
$TOOL_ID)
;
main();
BEGIN {
$SVNID
=
'$Id: prest 6245 2010-03-01 20:55:12Z mnodine $ '
;
my
$version
=
$Text::Restructured::PrestConfig::VERSION
;
$version
=~ s/(\d\d\d)(?=\d)/$1./g;
$version
=~ s/(\d+)/$1+0/ge;
$VERSION
=
$version
;
$SVNID
=~ /Id: (\S+?) \S+ (\d+)/;
$TOOL_ID
=
"$1 release $VERSION"
;
$YEAR
= $2;
(
$TOOL_NAME
= $1) =~ s/\..*//;
}
sub
main {
my
%opt
= (
w
=>
'html'
,
d
=>0,
D
=>{},
e
=>
'utf8'
);
Getopt::Long::config(
'no_ignore_case'
);
Usage()
unless
GetOptions \
%opt
,
qw(d+ e:s h w=s D:s% W:s% V)
;
Usage(
'Description'
)
if
$opt
{h};
Usage(
'Id'
)
if
$opt
{V};
Usage()
unless
@ARGV
;
if
((
$opt
{e} ||
''
) =~ /(.+)/) {
binmode
STDOUT,
":encoding($1)"
;
}
my
$writer
= new Text::Restructured::Writer(
$opt
{w}, \
%opt
);
my
$rst_parser
;
foreach
$TOP_FILE
(
@ARGV
) {
open
F,
$TOP_FILE
or
die
"Cannot open $TOP_FILE"
;
if
((
$opt
{e} ||
''
) =~ /(.+)/) {
binmode
F,
":encoding($1)"
;
}
my
$dom
;
my
$doc
=
do
{
local
$/; <F> };
if
(
$doc
=~ /^<document/) {
$dom
= Text::Restructured::DOM::Parse(
$doc
, \
%opt
);
}
else
{
$rst_parser
= new Text::Restructured(\
%opt
,
$TOOL_ID
)
unless
$rst_parser
;
$dom
=
$rst_parser
->Parse(
$doc
,
$TOP_FILE
);
}
eval
{
print
$writer
->ProcessDOM(
$dom
); };
print
STDERR $@
if
$@;
}
$^W = 0;
}
sub
EncodingList {
my
@encodings
;
@encodings
= Encode->encodings(
':all'
);
return
join
(
', '
,
@encodings
);
}
sub
WriterList {
my
(
$dir
,
@writers
);
my
%writer_seen
;
foreach
$dir
(
@INC
) {
push
@writers
,
glob
(
"$dir/Text/Restructured/Writer/*.wrt"
)
}
@writers
=
grep
(!
$writer_seen
{
$_
}++,
grep
(s|.*/([^/]+)\.wrt$|$1|,
@writers
));
return
join
(
', '
,
@writers
);
}
sub
Usage {
my
(
$what
) =
@_
;
$what
=
"Usage"
if
!
$what
;
my
$mark
=
$what
eq
'Description'
?
"($what|Usage)"
:
$what
;
if
(
open
(ME,$0)) {
while
(<ME>) {
if
((/^=begin
$mark
/ .. /^=end
$mark
/) &&
! /^=(begin|end)
$mark
/) {
s/(\$\{[^\}]+\})/
eval
($1)/ge;
print
;
}
}
close
(ME);
if
(
$what
=~ /Description/) {
my
@used
=
qw(Text/Restructured Text/Restructured/Transforms)
;
my
%used
;
@used
{
@used
} = (1) x
@used
;
my
$use
;
foreach
$use
(
@used
) {
my
@rst_dir
=
grep
(-r
"$_/$use.pm"
,
@INC
);
if
(
@rst_dir
) {
my
$newline_done
;
my
$file
=
"$rst_dir[0]/$use.pm"
;
open
(USE,
$file
) or
die
"Cannot open $file"
;
while
(<USE>) {
print
"\n"
unless
$newline_done
++;
if
((/^=begin
$mark
/ .. /^=end
$mark
/) &&
! /^=(begin|end)
$mark
/) {
s/(\$\{[^\}]+\}+)/
eval
$1/ge;
print
;
}
}
close
USE;
}
}
my
(
@directives
,
%directives
);
my
$dir
;
foreach
$dir
(
@INC
) {
grep
(m|([^/]+)$| && (
$directives
{$1} =
$_
),
glob
"$dir/Text/Restructured/Directive/*.pm"
);
}
@directives
=
map
(
$directives
{
$_
},
sort
keys
%directives
);
print
<<
'EOS'
if
@directives
;
Descriptions of Plug-in Directives
==================================
EOS
foreach
my
$directive
(
@directives
) {
$directive
=~ m|([^/]+)\.pm|;
my
$fname
= $1;
next
if
$used
{
$fname
} || ! -r
$directive
;
my
$output
= 0;
open
(DIRECTIVE,
$directive
) or
die
"Cannot open $directive"
;
while
(<DIRECTIVE>) {
if
((/^=begin
$mark
/ .. /^=end
$mark
/) &&
! /^=(begin|end)
$mark
/) {
if
(!
$output
++) {
my
$title
=
"Documentation for plug-in directive '$fname'"
;
print
"\n$title\n"
,(
'-'
x
length
(
$title
)),
"\n"
;
}
s/(\$\{[^\}]+\})/
eval
$1/ge;
print
;
}
}
close
DIRECTIVE;
}
my
@writers
;
foreach
$dir
(
@INC
) {
push
(
@writers
,
glob
(
"$dir/Text/Restructured/Writer/*.wrt"
));
}
my
$writer
;
print
<<
'EOS'
if
@writers
;
Descriptions of Writers
=======================
EOS
;
my
%done_writer
;
foreach
$writer
(
@writers
) {
my
(
$writer_name
) =
$writer
=~ m|([^/]+)\.wrt$|;
next
if
$done_writer
{
$writer_name
}++;
my
$output
= 0;
open
(WRITER,
$writer
) or
die
"Cannot open $writer"
;
while
(<WRITER>) {
if
((/^=begin
$mark
/ .. /^=end
$mark
/) &&
! /^=(begin|end)
$mark
/) {
if
(!
$output
++) {
my
$title
=
"Documentation for writer '$writer_name'"
;
print
"\n$title\n"
,(
'-'
x
length
(
$title
)),
"\n"
;
}
s/(\$\{[^\}]+\})/
eval
$1/ge;
print
;
}
}
close
WRITER;
}
}
}
else
{
print
STDERR
"Usage not available.\n"
;
}
exit
(1);
}