Update a configuration file: Difference between revisions
Content added Content deleted
mNo edit summary |
(add Ruby) |
||
Line 305: | Line 305: | ||
(for L Data |
(for L Data |
||
(prinl (glue " " (if (car L) L (cdr L)))) ) ) )</lang> |
(prinl (glue " " (if (car L) L (cdr L)))) ) ) )</lang> |
||
=={{header|Ruby}}== |
|||
<lang ruby>require 'stringio' |
|||
class ConfigFile |
|||
# create a ConfigFile object from a file |
|||
def self.file(filename) |
|||
fh = File.open(filename) |
|||
obj = self.new(fh) |
|||
obj.filename = filename |
|||
fh.close |
|||
obj |
|||
end |
|||
# create a ConfigFile object from a string |
|||
def self.data(string) |
|||
fh = StringIO.new(string) |
|||
obj = self.new(fh) |
|||
fh.close |
|||
obj |
|||
end |
|||
def initialize(filehandle) |
|||
@lines = filehandle.readlines |
|||
@filename = nil |
|||
tidy_file |
|||
end |
|||
attr :filename |
|||
def save() |
|||
if @filename |
|||
File.open(@filename, "w") {|f| f.write(self)} |
|||
end |
|||
end |
|||
def tidy_file() |
|||
@lines.map! do |line| |
|||
# remove leading whitespace |
|||
line.lstrip! |
|||
if line.match(/^#/) |
|||
# Lines beginning with hash symbols should not be manipulated and left |
|||
# unchanged in the revised file. |
|||
line |
|||
else |
|||
# replace double semicolon prefixes with just a single semicolon |
|||
line.sub!(/^;+\s+/, "; ") |
|||
if line.match(/^; \s*$/) |
|||
# Any lines beginning with a semicolon or groups of semicolons, but no |
|||
# following option should be removed |
|||
line = "" |
|||
else |
|||
# remove ... any trailing whitespace on the lines |
|||
line = line.rstrip + "\n" |
|||
# Whitespace between the option and paramters should consist only of a |
|||
# single space |
|||
if m = line.match(/^(; )?([[:upper:]]+)\s+(.*)/) |
|||
line = (m[1].nil? ? "" : m[1]) + format_line(m[2], m[3]) |
|||
end |
|||
end |
|||
line |
|||
end |
|||
end |
|||
end |
|||
def format_line(option, value) |
|||
"%s%s\n" % [option.upcase.strip, value.nil? ? "" : " " + value.to_s.strip] |
|||
end |
|||
# returns the index of the option, or nil if not found |
|||
def find_option(option) |
|||
@lines.find_index {|line| line.match(/^#{option.upcase.strip}\b/)} |
|||
end |
|||
# uncomments a disabled option |
|||
def enable_option(option) |
|||
if idx = find_option("; " + option) |
|||
@lines[idx][/^; /] = "" |
|||
end |
|||
end |
|||
# comment a line with a semi-colon |
|||
def disable_option(option) |
|||
if idx = find_option(option) |
|||
@lines[idx][/^/] = "; " |
|||
end |
|||
end |
|||
# add an option, or change the value of an existing option. |
|||
# use nil for the value to set a boolean option |
|||
def set_value(option, value) |
|||
if idx = find_option(option) |
|||
@lines[idx] = format_line(option, value) |
|||
else |
|||
@lines << format_line(option, value) |
|||
end |
|||
end |
|||
def to_s |
|||
@lines.join('') |
|||
end |
|||
end |
|||
config = ConfigFile.data(DATA.read) |
|||
config.disable_option('needspeeling') |
|||
config.enable_option('seedsremoved') |
|||
config.set_value('numberofbananas', 1024) |
|||
config.set_value('numberofstrawberries', 62000) |
|||
puts config |
|||
__END__ |
|||
# This is a configuration file in standard configuration file format |
|||
# |
|||
# Lines begininning with a hash or a semicolon are ignored by the application |
|||
# program. Blank lines are also ignored by the application program. |
|||
# The first word on each non comment line is the configuration option. |
|||
# Remaining words or numbers on the line are configuration parameter |
|||
# data fields. |
|||
# Note that configuration option names are not case sensitive. However, |
|||
# configuration parameter data is case sensitive and the lettercase must |
|||
# be preserved. |
|||
# This is a favourite fruit |
|||
FAVOURITEFRUIT banana |
|||
# This is a boolean that should be set |
|||
NEEDSPEELING |
|||
# This boolean is commented out |
|||
;;; SEEDSREMOVED |
|||
;;; |
|||
# How many bananas we have |
|||
NUMBEROFBANANAS 48</lang> |
|||
outputs |
|||
<pre># This is a configuration file in standard configuration file format |
|||
# |
|||
# Lines begininning with a hash or a semicolon are ignored by the application |
|||
# program. Blank lines are also ignored by the application program. |
|||
# The first word on each non comment line is the configuration option. |
|||
# Remaining words or numbers on the line are configuration parameter |
|||
# data fields. |
|||
# Note that configuration option names are not case sensitive. However, |
|||
# configuration parameter data is case sensitive and the lettercase must |
|||
# be preserved. |
|||
# This is a favourite fruit |
|||
FAVOURITEFRUIT banana |
|||
# This is a boolean that should be set |
|||
; NEEDSPEELING |
|||
# This boolean is commented out |
|||
SEEDSREMOVED |
|||
# How many bananas we have |
|||
NUMBEROFBANANAS 1024 |
|||
NUMBEROFSTRAWBERRIES 62000</pre> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |