mutt stable branch with some hacks
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/&/&/;
27 # for <key>, try CamelCasing into <Key>
28 $binding =~ s/<(.)(.+)>/<\U$1\E$2>/;
29 $binding =~ s/</</;
30 $binding =~ s/>/>/;
31 $binding =~ s/ /<Space>/;
32 $binding =~ s/^\\033/Esc /;
33 $binding =~ s/^\\010/<Backspace>/;
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/<Tab>/;
37 $binding =~ s/M_ENTER_S/<Return>/;
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><$function></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 $maptitle = $1;
53 $maptitle =~ s/^(.)/\U$1\E/;
54 unless ($MAP{$map}) {
55 warn "map $map undefined";
56 next;
57 }
58 my $title = $map;
59 $title =~ s/(.)(.+)/\U$1\E$2/;
60 print <<EOT;
61<sect2 id="${map}-map">
62<title>$maptitle Menu</title>
63$DOC{$map}
64
65<table id="tab-${map}-bindings">
66<title>Default $title 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;