mutt stable branch with some hacks
at jcs 87 lines 2.1 kB view raw
1#!/usr/bin/perl -w 2 3use strict; 4 5my (%OPS, %MAP, %DOC, $map); 6 7my $xml = shift @ARGV; 8 9open F, "cat @ARGV |" or die "OPS*: $!"; 10while (<F>) { 11 /(\w+) "(.+)"/ or die "$.: parse error"; 12 $OPS{$1} = $2; 13} 14close F; 15 16while (<STDIN>) { 17 if (/^const struct binding_t Op.*{ \/\* map: (.*) \*\//) { 18 $map = $1; 19 $DOC{$map} = ""; 20 } 21 if ($map and /^\s*\*\*\s*(.*)/) { 22 $DOC{$map} .= "$1\n"; 23 } 24 if ($map and /{\s*"(.+)"\s*,\s*(\w+)\s*,\s*(?:"([^"]+)"|(\w+))\s*}/) { 25 my ($function, $op, $binding) = ($1, $2, $3 || $4); 26 $binding =~ s/&/&amp;/; 27 # for <key>, try CamelCasing into <Key> 28 $binding =~ s/<(.)(.+)>/&lt;\U$1\E$2&gt;/; 29 $binding =~ s/</&lt;/; 30 $binding =~ s/>/&gt;/; 31 $binding =~ s/ /&lt;Space&gt;/; 32 $binding =~ s/^\\033/Esc /; 33 $binding =~ s/^\\010/&lt;Backspace&gt;/; 34 $binding =~ s/^\\(0\d+)$/'^'.chr(64+oct($1))/e; 35 $binding =~ s/^\\(0\d+)(.)/'^'.chr(64+oct($1)) ." $2"/e; 36 $binding =~ s/\\t/&lt;Tab&gt;/; 37 $binding =~ s/M_ENTER_S/&lt;Return&gt;/; 38 $binding =~ s/NULL//; 39 die "unknown key $binding" if $binding =~ /\\[^\\]|<|>/; 40 die "unknown OP $op" unless $OPS{$op}; 41 $MAP{$map} .= "<row><entry><literal>&lt;$function&gt;</literal></entry><entry>$binding</entry><entry>$OPS{$op}</entry></row>\n"; 42 } 43 if ($map and /^}/) { 44 undef $map; 45 } 46} 47 48open XML, $xml or die "$xml: $!"; 49while (<XML>) { 50 if (/__print_map\((.*)\)/) { 51 my $map = $1; 52 my $mapid = $1; 53 my $maptitle = $1; 54 $mapid =~ s/\s+/-/g; 55 $maptitle =~ s/\b(\w)/\u$1/g; 56 unless ($MAP{$map}) { 57 warn "map $map undefined"; 58 next; 59 } 60 print <<EOT; 61<sect2 id="${mapid}-map"> 62<title>$maptitle Menu</title> 63$DOC{$map} 64 65<table id="tab-${mapid}-bindings"> 66<title>Default $maptitle Menu Bindings</title> 67<tgroup cols="3"> 68<thead> 69<row><entry>Function</entry><entry>Default key</entry><entry>Description</entry></row> 70</thead> 71<tbody> 72$MAP{$map} 73</tbody> 74</tgroup> 75</table> 76 77</sect2> 78 79EOT 80 delete $MAP{$map}; 81 } else { 82 print; 83 } 84} 85close XML; 86 87warn "unprinted maps: ". join(" ", keys %MAP) if %MAP;