changes2html.pl
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:9k
源码类别:

网格计算

开发平台:

Java

  1. #!/usr/bin/perl
  2. #
  3. # Transforms Lucene Java's CHANGES.txt into Changes.html
  4. #
  5. # Input is on STDIN, output is to STDOUT
  6. #
  7. #
  8. # Licensed to the Apache Software Foundation (ASF) under one or more
  9. # contributor license agreements.  See the NOTICE file distributed with
  10. # this work for additional information regarding copyright ownership.
  11. # The ASF licenses this file to You under the Apache License, Version 2.0
  12. # (the "License"); you may not use this file except in compliance with
  13. # the License.  You may obtain a copy of the License at
  14. #
  15. #     http://www.apache.org/licenses/LICENSE-2.0
  16. #
  17. # Unless required by applicable law or agreed to in writing, software
  18. # distributed under the License is distributed on an "AS IS" BASIS,
  19. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  20. # See the License for the specific language governing permissions and
  21. # limitations under the License.
  22. #
  23. use strict;
  24. use warnings;
  25. my $jira_url_prefix = 'http://issues.apache.org/jira/browse/';
  26. my $title = undef;
  27. my $release = undef;
  28. my $sections = undef;
  29. my $items = undef;
  30. my $first_relid = undef;
  31. my $second_relid = undef;
  32. my @releases = ();
  33. my @lines = <>;                        # Get all input at once
  34. #
  35. # Parse input and build hierarchical release structure in @releases
  36. #
  37. for (my $line_num = 0 ; $line_num <= $#lines ; ++$line_num) {
  38.   $_ = $lines[$line_num];
  39.   next unless (/S/);                  # Skip blank lines
  40.   unless ($title) {
  41.     if (/S/) {
  42.       s/^s+//;                        # Trim leading whitespace
  43.       s/s+$//;                        # Trim trailing whitespace
  44.     }
  45.     $title = $_;
  46.     next;
  47.   }
  48.   if (/^(Release)|(Trunk)/) {   # Release headings
  49.     $release = $_;
  50.     $sections = [];
  51.     push @releases, [ $release, $sections ];
  52.     ($first_relid = lc($release)) =~ s/s+/_/g   if ($#releases == 0);
  53.     ($second_relid = lc($release)) =~ s/s+/_/g  if ($#releases == 1);
  54.     $items = undef;
  55.     next;
  56.   }
  57.   # Section heading: 2 leading spaces, words all capitalized
  58.   if (/^  ([A-Z]+)s*/) {
  59.     my $heading = $_;
  60.     $items = [];
  61.     push @$sections, [ $heading, $items ];
  62.     next;
  63.   }
  64.   # Handle earlier releases without sections - create a headless section
  65.   unless ($items) {
  66.     $items = [];
  67.     push @$sections, [ undef, $items ];
  68.   }
  69.   my $type;
  70.   if (@$items) { # A list item has been encountered in this section before
  71.     $type = $items->[0];  # 0th position of items array is list type
  72.   } else {
  73.     $type = get_list_type($_);
  74.     push @$items, $type;
  75.   }
  76.   if ($type eq 'numbered') { # The modern items list style
  77.     # List item boundary is another numbered item or an unindented line
  78.     my $line;
  79.     my $item = $_;
  80.     $item =~ s/^(s{0,2}d+.s*)//;       # Trim the leading item number
  81.     my $leading_ws_width = length($1);
  82.     $item =~ s/s+$//;                     # Trim trailing whitespace
  83.     $item .= "n";
  84.     while ($line_num < $#lines
  85.            and ($line = $lines[++$line_num]) !~ /^(?:s{0,2}d+.s*S|S)/) {
  86.       $line =~ s/^s{$leading_ws_width}//; # Trim leading whitespace
  87.       $line =~ s/s+$//;                   # Trim trailing whitespace
  88.       $item .= "$linen";
  89.     }
  90.     $item =~ s/n+Z/n/;                  # Trim trailing blank lines
  91.     push @$items, $item;
  92.     --$line_num unless ($line_num == $#lines);
  93.   } elsif ($type eq 'paragraph') {         # List item boundary is a blank line
  94.     my $line;
  95.     my $item = $_;
  96.     $item =~ s/^(s+)//;
  97.     my $leading_ws_width = defined($1) ? length($1) : 0;
  98.     $item =~ s/s+$//;                     # Trim trailing whitespace
  99.     $item .= "n";
  100.     while ($line_num < $#lines and ($line = $lines[++$line_num]) =~ /S/) {
  101.       $line =~ s/^s{$leading_ws_width}//; # Trim leading whitespace
  102.       $line =~ s/s+$//;                   # Trim trailing whitespace
  103.       $item .= "$linen";
  104.     }
  105.     push @$items, $item;
  106.     --$line_num unless ($line_num == $#lines);
  107.   } else { # $type is one of the bulleted types
  108.     # List item boundary is another bullet or a blank line
  109.     my $line;
  110.     my $item = $_;
  111.     $item =~ s/^(s*$types*)//;           # Trim the leading bullet
  112.     my $leading_ws_width = length($1);
  113.     $item =~ s/s+$//;                     # Trim trailing whitespace
  114.     $item .= "n";
  115.     while ($line_num < $#lines
  116.            and ($line = $lines[++$line_num]) !~ /^s*(?:$type|Z)/) {
  117.       $line =~ s/^s{$leading_ws_width}//; # Trim leading whitespace
  118.       $line =~ s/s+$//;                   # Trim trailing whitespace
  119.       $item .= "$linen";
  120.     }
  121.     push @$items, $item;
  122.     --$line_num unless ($line_num == $#lines);
  123.   }
  124. }
  125. #
  126. # Print HTML-ified version to STDOUT
  127. #
  128. print<<"__HTML_HEADER__";
  129. <!--
  130. **********************************************************
  131. ** WARNING: This file is generated from CHANGES.txt by the 
  132. **          Perl script 'changes2html.pl'.
  133. **          Do *not* edit this file!
  134. **********************************************************
  135.           
  136. ****************************************************************************
  137. * Licensed to the Apache Software Foundation (ASF) under one or more
  138. * contributor license agreements.  See the NOTICE file distributed with
  139. * this work for additional information regarding copyright ownership.
  140. * The ASF licenses this file to You under the Apache License, Version 2.0
  141. * (the "License"); you may not use this file except in compliance with
  142. * the License.  You may obtain a copy of the License at
  143. *
  144. *     http://www.apache.org/licenses/LICENSE-2.0
  145. *
  146. * Unless required by applicable law or agreed to in writing, software
  147. * distributed under the License is distributed on an "AS IS" BASIS,
  148. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  149. * See the License for the specific language governing permissions and
  150. * limitations under the License.
  151. ****************************************************************************
  152. -->
  153. <html>
  154. <head>
  155.   <title>$title</title>
  156.   <link rel="stylesheet" href="ChangesFancyStyle.css" title="Fancy">
  157.   <link rel="alternate stylesheet" href="ChangesSimpleStyle.css" title="Simple">
  158.   <META http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  159.   <SCRIPT>
  160.     function toggleList(e) {
  161.       element = document.getElementById(e).style;
  162.       element.display == 'none' ? element.display = 'block' : element.display='none';
  163.     }
  164.     function collapse() {
  165.       for (var i = 0; i < document.getElementsByTagName("ul").length; i++) {
  166.         var list = document.getElementsByTagName("ul")[i];
  167.         if (list.id != '$first_relid' && list.id != '$second_relid') {
  168.           list.style.display = "none";
  169.         }
  170.       }
  171.       for (var i = 0; i < document.getElementsByTagName("ol").length; i++) {
  172.         document.getElementsByTagName("ol")[i].style.display = "none"; 
  173.       }
  174.     }
  175.     window.onload = collapse;
  176.   </SCRIPT>
  177. </head>
  178. <body>
  179. <a href="http://hadoop.apache.org/core/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Scalable Computing Platform"></a>
  180. <h1>$title</h1>
  181. __HTML_HEADER__
  182. my $heading;
  183. my $relcnt = 0;
  184. my $header = 'h2';
  185. for my $rel (@releases) {
  186.   if (++$relcnt == 3) {
  187.     $header = 'h3';
  188.     print "<h2><a href="javascript:toggleList('older')">";
  189.     print "Older Releases";
  190.     print "</a></h2>n";
  191.     print "<ul id="older">n"
  192.   }
  193.       
  194.   ($release, $sections) = @$rel;
  195.   # The first section heading is undefined for the older sectionless releases
  196.   my $has_release_sections = $sections->[0][0];
  197.   (my $relid = lc($release)) =~ s/s+/_/g;
  198.   print "<$header><a href="javascript:toggleList('$relid')">";
  199.   print "$release";
  200.   print "</a></$header>n";
  201.   print "<ul id="$relid">n"
  202.     if ($has_release_sections);
  203.   for my $section (@$sections) {
  204.     ($heading, $items) = @$section;
  205.     (my $sectid = lc($heading)) =~ s/s+/_/g;
  206.     my $numItemsStr = $#{$items} > 0 ? "($#{$items})" : "(none)";  
  207.     print "  <li><a href="javascript:toggleList('$relid.$sectid')">",
  208.           ($heading || ''), "</a>&nbsp;&nbsp;&nbsp;$numItemsStrn"
  209.       if ($has_release_sections);
  210.     my $list_type = $items->[0] || '';
  211.     my $list = ($has_release_sections || $list_type eq 'numbered' ? 'ol' : 'ul');
  212.     my $listid = $sectid ? "$relid.$sectid" : $relid;
  213.     print "    <$list id="$listid">n";
  214.     for my $itemnum (1..$#{$items}) {
  215.       my $item = $items->[$itemnum];
  216.       $item =~ s:&:&amp;:g;                            # Escape HTML metachars
  217.       $item =~ s:<:&lt;:g; 
  218.       $item =~ s:>:&gt;:g;
  219.       $item =~ s:s*(([^)"]+?))s*$:<br />$1:;       # Separate attribution
  220.       $item =~ s:n{2,}:n<p/>n:g;                    # Keep paragraph breaks
  221.       $item =~ s{(?:${jira_url_prefix})?(HADOOP-d+)}  # Link to JIRA
  222.                 {<a href="${jira_url_prefix}$1">$1</a>}g;
  223.       print "      <li>$item</li>n";
  224.     }
  225.     print "    </$list>n";
  226.     print "  </li>n" if ($has_release_sections);
  227.   }
  228.   print "</ul>n" if ($has_release_sections);
  229. }
  230. print "</ul>n" if ($relcnt > 3);
  231. print "</body>n</html>n";
  232. #
  233. # Subroutine: get_list_type
  234. #
  235. # Takes one parameter:
  236. #
  237. #    - The first line of a sub-section/point
  238. #
  239. # Returns one scalar:
  240. #
  241. #    - The list type: 'numbered'; or one of the bulleted types '-', or '.' or
  242. #      'paragraph'.
  243. #
  244. sub get_list_type {
  245.   my $first_list_item_line = shift;
  246.   my $type = 'paragraph'; # Default to paragraph type
  247.   if ($first_list_item_line =~ /^s{0,2}d+.s+S+/) {
  248.     $type = 'numbered';
  249.   } elsif ($first_list_item_line =~ /^s*([-.])s+S+/) {
  250.     $type = $1;
  251.   }
  252.   return $type;
  253. }
  254. 1;