File: Editor.pm

package info (click to toggle)
debconf 1.5.11etch2
  • links: PTS
  • area: main
  • in suites: etch
  • size: 3,364 kB
  • ctags: 714
  • sloc: perl: 8,347; sh: 286; makefile: 174; python: 117
file content (163 lines) | stat: -rw-r--r-- 3,569 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#!/usr/bin/perl -w

=head1 NAME

Debconf::FrontEnd::Editor - Edit a config file to answer questions

=cut

package Debconf::FrontEnd::Editor;
use strict;
use Debconf::Encoding q(wrap);
use Debconf::TmpFile;
use Debconf::Gettext;
use base qw(Debconf::FrontEnd::ScreenSize);

my $fh;

=head1 DESCRIPTION

This FrontEnd isn't really a frontend. It just generates a series of config
files and runs the users editor on them, then parses the result.

=head1 METHODS

=over 4

=cut

sub init {
	my $this=shift;

	$this->SUPER::init(@_);
	$this->interactive(1);
}

=item comment

Displays a comment, word-wrapped.

=cut

sub comment {
	my $this=shift;
	my $comment=shift;

#	$Text::Wrap::break=q/\s+/;
	print $fh wrap('# ','# ',$comment);
	$this->filecontents(1);
}

=item separator

Displays a divider bar; a line of hashes.

=cut

sub divider {
	my $this=shift;

	print $fh ("\n".('#' x ($this->screenwidth - 1))."\n");
}

=item item

Displays an item. First parameter is the item's name, second is its value.

=cut

sub item {
	my $this=shift;
	my $name=shift;
	my $value=shift;

	print $fh "$name=\"$value\"\n\n";
	$this->filecontents(1);
}

=item go

Items write out data into a temporary file, which is then edited with the
user's editor. Then the file is parsed back in.

=cut

sub go {
	my $this=shift;
	my @elements=@{$this->elements};
	return 1 unless @elements;
	
	# End the filename in .sh because it is basically a shell
	# format file, and this makes some editors do good things.
	$fh = Debconf::TmpFile::open('.sh');

	$this->comment(gettext("You are using the editor-based debconf frontend to configure your system. See the end of this document for detailed instructions."));
	$this->divider;
	print $fh ("\n");

	$this->filecontents('');
	foreach my $element (@elements) {
		$element->show;
	}

	# Only proceed if something interesting was actually written to the
	# file.
	if (! $this->filecontents) {
		Debconf::TmpFile::cleanup();
		return 1;
	}
	
	$this->divider;
	$this->comment(gettext("The editor-based debconf frontend presents you with one or more text files to edit. This is one such text file. If you are familiar with standard unix configuration files, this file will look familiar to you -- it contains comments interspersed with configuration items. Edit the file, changing any items as necessary, and then save it and exit. At that point, debconf will read the edited file, and use the values you entered to configure the system."));
	print $fh ("\n");
	close $fh;
	
	# Launch editor.
	my $editor=$ENV{EDITOR} || $ENV{VISUAL} || '/usr/bin/editor';
	# $editor may possibly contain spaces and options
	system "$editor ".Debconf::TmpFile->filename;

	# Now parse the temporary file, looking for lines that look like
	# items. Figure out which Element corresponds to the item, and
	# pass the text into it to be processed.
	# FIXME: this isn't really very robust. Syntax errors are ignored.
	my %eltname=map { $_->question->name => $_ } @elements;
	open (IN, "<".Debconf::TmpFile::filename());
	while (<IN>) {
		next if /^\s*#/;

		if (/(.*?)="(.*)"/ && $eltname{$1}) {
			# Elements can override the value method to
			# process the input.
			$eltname{$1}->value($2);
		}
	}
	close IN;
	
	Debconf::TmpFile::cleanup();

	return 1;
}

=item screenwidth

This method from my base class is overridden, so after the screen width
changes, $Debconf::Encoding::columns is updated to match.

=cut

sub screenwidth {
	my $this=shift;

	$Debconf::Encoding::columns=$this->SUPER::screenwidth(@_);
}

=back

=head1 AUTHOR

Joey Hess <joeyh@debian.org>

=cut

1