1#!/usr/bin/perl -w
2#
3# exceedingly ugly hack to convert bashprompt themes to zshprompt themes
4#
5# Adam Spiers <adam@spiers.net>
6
7use strict;
8
9my @colours = qw/grey red green yellow blue magenta cyan white/;
10
11my @codes = ();
12my %boldp;
13my $out = '';
14
15print "# Converted to zsh prompt theme by bash2zshprompt, written by <adam\@spiers.net>\n";
16
17my $seen_fn = 0;
18my $seen_fn_end = 0;
19while (<>) {
20  # Ugh
21  if (! $seen_fn) {
22    s/^\s*function (\w+) {\s*$/prompt_$1_setup () {\n/ and $seen_fn = $1;
23  }
24  # UGH
25  elsif (! $seen_fn_end && $seen_fn) {
26    s/^\s*/  /;
27    s/^\s*}\s*$/\n  precmd () { setopt promptsubst }\n  preexec () { }\n}\n/ and $seen_fn_end++;
28  }
29
30  s/\\\[/%{/g;
31  s/\\\]/%}/g;
32
33  s/\\033/\\e/g;
34  s/\\e\[([0-9;]+)m/split_codes($1)/eg;
35  s/\\e\[((\d?)(\d))m/color()/eg;
36
37  s/(?<!\\)\\u/%n/g;
38  s/(?<!\\)\\h/%m/g;
39  s/(?<!\\)\\t/%t/g;
40  s/(?<!\\)\\d/%D{%a %b %d}/g;
41  s/(?<!\\)\\?\$\(date\s+\+([^)]+)\)/%D{$1}/g;
42  s/(?<!\\)\\!/%!/g;
43  s/(?<!\\)\\#/%!/g; # hmmm
44  s/(?<!\\)\\n/\$prompt_newline/g;
45  s/(?<!\\)\\s/\$SHELL/g;
46  s/(?<!\\)\\v/\$ZSH_VERSION[1]/g;
47  s/(?<!\\)\\V/\${ZSH_VERSION%%-*}/g;
48  s/(?<!\\)\\w/%~/g;
49  s/(?<!\\)\\W/%1~/g;
50  s/(?<!\\)\\\$(?!\()/%\#/g;
51
52  s/(?<!\\)\\0?(\d{3})/push @codes, $1; "\$char_$1"/eg;
53
54  s/%}%{//g;
55
56  $out .= $_;
57}
58
59# Must be a better way of doing this
60print <<EOF if @codes;
61
62for code in @codes; do
63  local varname=char_\$code
64  : \${(P)varname=\$(echo -n "\\\\0\$code")}
65done
66
67EOF
68
69print $out;
70
71print qq!\nprompt_${seen_fn}_setup "\$@"\n! if $seen_fn;
72
73exit 0;
74
75sub color {
76  my @p = ($1, $2, $3);
77
78  my $fgbg = (($p[1] eq '3') ? 'fg' :
79              ($p[1] eq '4') ? 'bg' :
80              '???');
81
82  $boldp{$fgbg} ||= '';
83
84  if ($p[0] =~ /^0?0$/) {
85    $boldp{$fgbg} = '';
86    return '$reset_color';
87  }
88
89  if ($p[0] =~ /^0?1$/) {
90    $boldp{$fgbg} = 'bold_';
91    return '$bold_color';
92  }
93
94  return '$' .
95         "${fgbg}$boldp{$fgbg}\[" .
96         $colours[$p[2]] .
97         ']';
98}
99
100sub split_codes {
101  join '', (map { "\\e\[${_}m" } (split m!;!, $_[0]));
102}
103