7 use List::Util qw(first max);
10 my $rel_dir = (first { -f "${_}/SL/ClientJS.pm" } qw(. ..)) || die "ClientJS.pm not found";
13 foreach (read_file("${rel_dir}/SL/ClientJS.pm")) {
16 next unless (m/^my \%supported_methods/ .. m/^\);/);
18 push @actions, [ 'action', $1, $2, $3 ] if m/^ \s+ '? ([a-zA-Z_:]+) '? \s*=>\s* (\d+) , (?: \s* \# \s+ (.+))? $/x;
19 push @actions, [ 'comment', $1, $2 ] if m/^ \s+\# \s+ (.+?) (?: \s* pattern: \s+ (.+))? $/x;
22 my $longest = max map { length($_->[1]) } grep { $_->[0] eq 'action' } @actions;
24 my $default_pattern = '$(<TARGET>).<FUNCTION>(<ARGS>)';
25 my $pattern = $default_pattern;
28 foreach my $action (@actions) {
29 if ($action->[0] eq 'comment') {
30 $output .= "\n" unless $first;
31 $output .= " // " . $action->[1] . "\n";
33 $pattern = $action->[2] eq '<DEFAULT>' ? $default_pattern : $action->[2] if $action->[2];
36 my $args = $action->[2] == 1 ? '' : join(', ', map { "action[$_]" } (2..$action->[2]));
38 $output .= sprintf(' %s if (action[0] == \'%s\')%s ',
39 $first ? ' ' : 'else',
41 ' ' x ($longest - length($action->[1])));
43 my $function = $action->[1];
46 my $call = $action->[3] || $pattern;
47 $call =~ s/<TARGET>/'action[1]'/eg;
48 $call =~ s/<FUNCTION>/$function/eg;
49 $call =~ s/<ARGS>/$args/eg;
51 $output .= $call . ";\n";
56 $output .= sprintf "\n else\%sconsole.log('Unknown action: ' + action[0]);\n", ' ' x (4 + 2 + 6 + 3 + 4 + 2 + $longest + 1);
58 my $template = Template->new({ RELATIVE => 1 });
59 $template->process($rel_dir . '/scripts/generate_client_js_actions.tpl', { actions => $output }, $rel_dir . '/js/client_js.js') || die $template->error(), "\n";
60 print "js/client_js.js generated automatically.\n";