mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	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.
			
			
This commit is contained in:
		
							parent
							
								
									bde8d1c8af
								
							
						
					
					
						commit
						77602f2e32
					
				
					 1 changed files with 151 additions and 2 deletions
				
			
		|  | @ -90,6 +90,8 @@ sub do_cmd_textasciicircum{ '^' . @_[0]; } | ||||||
| sub do_cmd_textbar{ '|' . @_[0]; } | sub do_cmd_textbar{ '|' . @_[0]; } | ||||||
| sub do_cmd_infinity{ '∞' . @_[0]; } | sub do_cmd_infinity{ '∞' . @_[0]; } | ||||||
| sub do_cmd_plusminus{ '±' . @_[0]; } | sub do_cmd_plusminus{ '±' . @_[0]; } | ||||||
|  | sub do_cmd_menuselection{ @_[0]; } | ||||||
|  | sub do_cmd_sub{ ' > ' . @_[0]; } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # words typeset in a special way (not in HTML though) | # words typeset in a special way (not in HTML though) | ||||||
|  | @ -324,6 +326,13 @@ sub do_cmd_rfc{ | ||||||
|             . "$icon</a>" . $_); |             . "$icon</a>" . $_); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 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{ | sub do_cmd_citetitle{ | ||||||
|     local($_) = @_; |     local($_) = @_; | ||||||
|     my $url = next_optional_argument(); |     my $url = next_optional_argument(); | ||||||
|  | @ -682,6 +691,135 @@ sub make_str_index_entry{ | ||||||
|     return "$aname$str</a>"; |     return "$aname$str</a>"; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | %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> ::= </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> ::= </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; | $REFCOUNTS_LOADED = 0; | ||||||
| 
 | 
 | ||||||
| sub load_refcounts{ | sub load_refcounts{ | ||||||
|  | @ -1490,6 +1628,7 @@ sub process_localmoduletables_in_file{ | ||||||
| } | } | ||||||
| sub process_python_state{ | sub process_python_state{ | ||||||
|     process_all_localmoduletables(); |     process_all_localmoduletables(); | ||||||
|  |     process_grammar_files(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -1685,11 +1824,18 @@ sub do_cmd_verbatiminput{ | ||||||
|         $file = "$texpath$dd$fname"; |         $file = "$texpath$dd$fname"; | ||||||
|         last if ($found = (-f $file)); |         last if ($found = (-f $file)); | ||||||
|     } |     } | ||||||
|  |     my $srcname; | ||||||
|     my $text; |     my $text; | ||||||
|     if ($found) { |     if ($found) { | ||||||
|         open(MYFILE, "<$file") || die "\n$!\n"; |         open(MYFILE, "<$file") || die "\n$!\n"; | ||||||
|         read(MYFILE, $text, 1024*1024); |         read(MYFILE, $text, 1024*1024); | ||||||
|         close(MYFILE); |         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 |         # These rewrites convert the raw text to something that will | ||||||
|         # be properly visible as HTML and also will pass through the |         # be properly visible as HTML and also will pass through the | ||||||
|  | @ -1715,9 +1861,12 @@ sub do_cmd_verbatiminput{ | ||||||
|     else { |     else { | ||||||
|         $text = '<b>Could not locate requested file <i>$fname</i>!</b>\n'; |         $text = '<b>Could not locate requested file <i>$fname</i>!</b>\n'; | ||||||
|     } |     } | ||||||
|     return ($alltt_start |     return ('<dl><dd><pre class="verbatim">' | ||||||
|             . $text |             . $text | ||||||
|             . $alltt_end |             . "</pre>\n<div class=\"verbatiminput-footer\">\n" | ||||||
|  |             . "<a href=\"$srcname.txt\" type=\"text/plain\"" | ||||||
|  |             . ">Download as text.</a>" | ||||||
|  |             . "\n</div>\n</dd></dl>" | ||||||
|             . $_); |             . $_); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Fred Drake
						Fred Drake