Repository: lucy-clownfish
Updated Branches:
  refs/heads/master 77c771d02 -> 4c7a29ab7


Move pod2mdtext.pl from Lucy to Clownfish


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/992bdf87
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/992bdf87
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/992bdf87

Branch: refs/heads/master
Commit: 992bdf8784d3adc284484e8297e91b7b6b568cc8
Parents: 77c771d
Author: Nick Wellnhofer <wellnho...@aevum.de>
Authored: Mon Apr 4 15:14:35 2016 +0200
Committer: Nick Wellnhofer <wellnho...@aevum.de>
Committed: Mon Apr 4 15:14:35 2016 +0200

----------------------------------------------------------------------
 devel/bin/pod2mdtext.pl | 168 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 168 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/992bdf87/devel/bin/pod2mdtext.pl
----------------------------------------------------------------------
diff --git a/devel/bin/pod2mdtext.pl b/devel/bin/pod2mdtext.pl
new file mode 100755
index 0000000..bfaf070
--- /dev/null
+++ b/devel/bin/pod2mdtext.pl
@@ -0,0 +1,168 @@
+#!/usr/bin/perl
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+=head1 NAME
+
+pod2mdtext.pl - Convert POD to mdtext for the Apache CMS
+
+=head1 SYNOPSIS
+
+    pod2mdtext.pl --name=PROJECT_NAME [--full-name=FULL_NAME]
+                  --version=X.Y.Z
+
+=head1 DESCRIPTION
+
+This script creates mdtext files from POD. It must be run in the C<perl>
+directory and scans all .pod and .pm files found in C<lib>. The resulting
+mdtext files are stored in a directory named C<mdtext>.
+
+=head1 OPTIONS
+
+=head2 --name
+
+Short name of the project used for the index filename.
+
+=head2 --full-name
+
+Full name of the project used in titles. Defaults to C<--name>.
+
+=head2 --version
+
+Version number.
+
+=cut
+
+use strict;
+use warnings;
+use utf8;
+
+use File::Find;
+use File::Path qw( make_path );
+use File::Slurp;
+use Getopt::Long qw( GetOptions );
+use Pod::Simple::HTML;
+
+my $out_root = 'mdtext';
+
+my $usage = join( ' ',
+    $0,
+    '--name=PROJECT_NAME',
+    '[--full-name=FULL_NAME]',
+    '--version=X.Y.Z',
+) . "\n";
+
+my ( $project_name, $full_name, $version );
+GetOptions(
+    'name=s'      => \$project_name,
+    'full-name=s' => \$full_name,
+    'version=s'   => \$version,
+);
+$project_name or die $usage;
+$version      or die $usage;
+$full_name ||= $project_name;
+
+my @pod_infos;
+
+find( { wanted => \&process_file, no_chdir => 1 }, 'lib' );
+
+write_index();
+
+sub process_file {
+    my $filename = $_;
+    my $dir      = $File::Find::topdir;
+
+    return if -d $filename || $filename !~ /\.(pm|pod)\z/;
+    my $content = read_file( $filename, binmode => ':utf8' );
+    return if $filename =~ /\.pm$/ && $content !~ /^=head1/m;
+    $filename =~ s|^$dir/||;
+
+    if ( $content =~ /^=head1\s*NAME\s+(\S+)\s+-\s+(.*?)\s+^=/ms ) {
+        push(@pod_infos, {
+            class    => $1,
+            desc     => $2,
+            filename => $filename,
+        });
+    }
+    else {
+        print STDERR ("Warning: No valid NAME section found in $filename\n");
+    }
+
+    pod2mdtext( $dir, $filename );
+};
+
+sub pod2mdtext {
+    my ( $base_dir, $filename ) = @_;
+
+    my @path_comps = split('/', $filename);
+    pop(@path_comps);
+
+    my $out_dir = join('/', $out_root, @path_comps);
+    make_path($out_dir);
+
+    my $out_filename = "$out_root/$filename";
+    $out_filename =~ s|(\.[^/.]*)?\z|.mdtext|;
+
+    open( my $out_file, '>', $out_filename )
+        or die("$out_filename: $!");
+
+    my $p = Pod::Simple::HTML->new;
+    my $after_title = " \x{2013} $full_name Documentation\n\n<div>\n";
+    # Pod::Simple expects bytes.
+    utf8::encode($after_title);
+
+    $p->batch_mode(1);
+    $p->batch_mode_current_level( scalar(@path_comps) + 1 );
+    $p->html_header_before_title('Title: ');
+    $p->html_header_after_title($after_title);
+    $p->html_footer("\n</div>\n");
+    $p->html_h_level(2);
+    # Needed to make strip_verbatim_indent work, no idea why.
+    $p->unaccept_codes('VerbatimFormatted');
+    $p->strip_verbatim_indent('    ');
+
+    $p->output_fh($out_file);
+    $p->parse_file("$base_dir/$filename");
+
+    close($out_file);
+}
+
+sub write_index {
+    my $lc_project_name = lc($project_name);
+    my $index_filename  = "$out_root/$lc_project_name-index.mdtext";
+    open( my $index_file, '>:utf8', $index_filename )
+        or die("$index_filename: $!");
+
+    print $index_file (<<EOF);
+Title: Perl API documentation for $full_name $version
+
+## Perl API documentation for $full_name $version
+
+EOF
+
+    for my $pod_info ( sort { $a->{class} cmp $b->{class} } @pod_infos ) {
+        my $class    = $pod_info->{class};
+        my $desc     = $pod_info->{desc};
+        my $filename = $pod_info->{filename};
+
+        $filename =~ s|(\.[^/.]*)?\z|.html|;
+
+        print $index_file ("- [$class]($filename) \x{2013} $desc\n");
+    }
+
+    close($index_filename);
+}
+

Reply via email to