[Python-checkins] CVS: python/dist/src/Doc/perl python.perl,1.104,1.105

Fred L. Drake fdrake@users.sourceforge.net
Fri, 06 Jul 2001 15:43:04 -0700


Update of /cvsroot/python/python/dist/src/Doc/perl
In directory usw-pr-cvs1:/tmp/cvs-serv29947/perl

Modified Files:
	python.perl 
Log Message:

Add support for \ulink and hyperlink grammars.

do_cmd_verbatiminput():  Write out a text file containing the content of the
    input file with a .txt extension, and add a link to it at the bottom of
    the presentation.  This easier retrieval of example source code for
    copy & paste use.


Index: python.perl
===================================================================
RCS file: /cvsroot/python/python/dist/src/Doc/perl/python.perl,v
retrieving revision 1.104
retrieving revision 1.105
diff -C2 -r1.104 -r1.105
*** python.perl	2001/06/23 03:13:30	1.104
--- python.perl	2001/07/06 22:43:02	1.105
***************
*** 91,94 ****
--- 91,96 ----
  sub do_cmd_infinity{ '∞' . @_[0]; }
  sub do_cmd_plusminus{ '±' . @_[0]; }
+ sub do_cmd_menuselection{ @_[0]; }
+ sub do_cmd_sub{ ' > ' . @_[0]; }
  
  
***************
*** 325,328 ****
--- 327,337 ----
  }
  
+ sub do_cmd_ulink{
+     local($_) = @_;
+     my $text = next_argument();
+     my $url = next_argument();
+     return "<a class=\"ulink\" href=\"$url\"\n  >$text</a>" . $_;
+ }
+ 
  sub do_cmd_citetitle{
      local($_) = @_;
***************
*** 683,686 ****
--- 692,824 ----
  }
  
+ 
+ %TokenToTargetMapping = ();
+ %DefinedGrammars = ();
+ %BackpatchGrammarFiles = ();
+ 
+ sub do_cmd_token{
+     local($_) = @_;
+     my $token = next_argument();
+     my $target = $TokenToTargetMapping{"$CURRENT_GRAMMAR:$token"};
+     if ($token eq $CURRENT_TOKEN || $CURRENT_GRAMMAR eq '*') {
+         # recursive definition or display-only productionlist
+         return "$token";
+     }
+     if ($target eq '') {
+         $target = "<pyGrammarToken><$CURRENT_GRAMMAR><$token>";
+         if (! $BackpatchGrammarFiles{"$CURRENT_FILE"}) {
+             print "Adding '$CURRENT_FILE' to back-patch list.\n";
+         }
+         $BackpatchGrammarFiles{"$CURRENT_FILE"} = 1;
+     }
+     return "<a href=\"$target\">$token</a>" . $_;
+ }
+ 
+ sub do_env_productionlist{
+     local($_) = @_;
+     my $lang = next_optional_argument();
+     my $filename = "grammar-$lang.txt";
+     if ($lang eq '') {
+         $filename = 'grammar.txt';
+     }
+     local($CURRENT_GRAMMAR) = $lang;
+     $DefinedGrammars{$lang} .= $_;
+     return ("<dl><dd class=\"grammar\">\n"
+             . "<div class=\"productions\">\n"
+             . "<table cellpadding=\"2\" valign=\"baseline\">\n"
+             . translate_commands(translate_environments($_))
+             . "</table>\n"
+             . "</div>\n"
+             . (($lang eq '*')
+                ? ''
+                : ("<a class=\"grammar-footer\"\n"
+                   . "  href=\"$filename\" type=\"text/plain\"\n"
+                   . "  >Download entire grammar as text.</a>\n"))
+             . "</dd></dl>");
+ }
+ 
+ sub do_cmd_production{
+     local($_) = @_;
+     my $token = next_argument();
+     my $defn = next_argument();
+     my $lang = $CURRENT_GRAMMAR;
+     local($CURRENT_TOKEN) = $token;
+     if ($lang eq '*') {
+         return ("<tr>\n"
+                 . "    <td><code>$token</code></td>\n"
+                 . "    <td>&nbsp;::=&nbsp;</td>\n"
+                 . "    <td><code>"
+                 . translate_commands($defn)
+                 . "</code></td></tr>"
+                 . $_);
+     }
+     my $target;
+     if ($lang eq '') {
+         $target = "$CURRENT_FILE\#tok-$token";
+     }
+     else {
+         $target = "$CURRENT_FILE\#tok-$lang-$token";
+     }
+     $TokenToTargetMapping{"$CURRENT_GRAMMAR:$token"} = $target;
+     return ("<tr>\n"
+             . "    <td><code><a name=\"tok-$token\">$token</a></code></td>\n"
+             . "    <td>&nbsp;::=&nbsp;</td>\n"
+             . "    <td><code>"
+             . translate_commands($defn)
+             . "</code></td></tr>"
+             . $_);
+ }
+ 
+ sub process_grammar_files{
+     my $lang;
+     my $filename;
+     local($_);
+     print "process_grammar_files()\n";
+     foreach $lang (keys %DefinedGrammars) {
+         $filename = "grammar-$lang.txt";
+         if ($lang eq '*') {
+             next;
+         }
+         if ($lang eq '') {
+             $filename = 'grammar.txt';
+         }
+         open(GRAMMAR, ">$filename") || die "\n$!\n";
+         print GRAMMAR strip_grammar_markup($DefinedGrammars{$lang});
+         close(GRAMMAR);
+         print "Wrote grammar file $filename\n";
+     }
+     my $PATTERN = '<pyGrammarToken><([^>]*)><([^>]*)>';
+     foreach $filename (keys %BackpatchGrammarFiles) {
+         print "\nBack-patching grammar links in $filename\n";
+         my $buffer;
+         open(GRAMMAR, "<$filename") || die "\n$!\n";
+         # read all of the file into the buffer
+         sysread(GRAMMAR, $buffer, 1024*1024);
+         close(GRAMMAR);
+         while ($buffer =~ /$PATTERN/) {
+             my($lang, $token) = ($1, $2);
+             my $target = $TokenToTargetMapping{"$lang:$token"};
+             my $source = "<pyGrammarToken><$lang><$token>";
+             $buffer =~ s/$source/$target/g;
+         }
+         open(GRAMMAR, ">$filename") || die "\n$!\n";
+         print GRAMMAR $buffer;
+         close(GRAMMAR);
+     }
+ }
+ 
+ sub strip_grammar_markup{
+     local($_) = @_;
+     s/\\production(<<\d+>>)(.+)\1/\n\2 ::= /g;
+     s/\\token(<<\d+>>)(.+)\1/\2/g;
+     s/\\e([^a-zA-Z])/\\\1/g;
+     s/<<\d+>>//g;
+     s/;SPMgt;/>/g;
+     s/;SPMlt;/</g;
+     s/;SPMquot;/\"/g;
+     return $_;
+ }
+ 
+ 
  $REFCOUNTS_LOADED = 0;
  
***************
*** 1491,1494 ****
--- 1629,1633 ----
  sub process_python_state{
      process_all_localmoduletables();
+     process_grammar_files();
  }
  
***************
*** 1686,1689 ****
--- 1825,1829 ----
          last if ($found = (-f $file));
      }
+     my $srcname;
      my $text;
      if ($found) {
***************
*** 1691,1694 ****
--- 1831,1840 ----
          read(MYFILE, $text, 1024*1024);
          close(MYFILE);
+         use File::Basename;
+         my $srcdir, $srcext;
+         ($srcname, $srcdir, $srcext) = fileparse($file, '\..*');
+         open(MYFILE, ">$srcname.txt");
+         print MYFILE $text;
+         close(MYFILE);
          #
          # These rewrites convert the raw text to something that will
***************
*** 1716,1722 ****
          $text = '<b>Could not locate requested file <i>$fname</i>!</b>\n';
      }
!     return ($alltt_start
              . $text
!             . $alltt_end
              . $_);
  }
--- 1862,1871 ----
          $text = '<b>Could not locate requested file <i>$fname</i>!</b>\n';
      }
!     return ('<dl><dd><pre class="verbatim">'
              . $text
!             . "</pre>\n<div class=\"verbatiminput-footer\">\n"
!             . "<a href=\"$srcname.txt\" type=\"text/plain\""
!             . ">Download as text.</a>"
!             . "\n</div>\n</dd></dl>"
              . $_);
  }