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