First add of ripnews to cvs
This commit is contained in:
parent
bde9d157e2
commit
05e19814d6
3 changed files with 1750 additions and 0 deletions
305
trunk/ripnews/news/newsrc.rb
Normal file
305
trunk/ripnews/news/newsrc.rb
Normal file
|
|
@ -0,0 +1,305 @@
|
|||
#################################
|
||||
#
|
||||
# newsrc.rb
|
||||
# ported from Perl code by Ward Wouts
|
||||
# this software is released under the terms of
|
||||
# the GNU Library General Public License
|
||||
#
|
||||
# (C) 2001, Ward Wouts
|
||||
#
|
||||
#################################
|
||||
|
||||
require "set/intspan"
|
||||
|
||||
module News
|
||||
|
||||
class Newsrc
|
||||
|
||||
def initialize(file=nil)
|
||||
@newsrc = { "group" => Hash.new, "list" => Array.new }
|
||||
if file
|
||||
unless load(file)
|
||||
print "Can't load #{file}\n"
|
||||
exit
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def load(file=nil)
|
||||
file = "#{ENV['HOME']}/.newsrc" unless file
|
||||
@newsrc["file"] = file
|
||||
@newsrc["group"] = {}
|
||||
@newsrc["list"] = []
|
||||
|
||||
lines = IO.readlines("#{file}")
|
||||
import_rc(lines)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
def import_rc(lines)
|
||||
@newsrc["group"] = {}
|
||||
@newsrc["list"] = []
|
||||
linenumber = 1
|
||||
for line in lines
|
||||
parse(line)
|
||||
end
|
||||
end
|
||||
|
||||
def parse(line)
|
||||
unless line =~ /^([^!:]+)([!:])\s(.*)$/x
|
||||
print "Newsrc.parse: Bad newsrc line: #{line}\n"
|
||||
exit
|
||||
end
|
||||
|
||||
name = $1
|
||||
mark = $2
|
||||
articles = $3
|
||||
|
||||
unless Set::IntSpan.valid(articles)
|
||||
print "Newsrc.parse: Bad article list: #{line}\n"
|
||||
end
|
||||
|
||||
|
||||
group = { "name" => name, "subscribed" => (mark == ":"),
|
||||
"articles" => Set::IntSpan.new(articles)}
|
||||
|
||||
@newsrc["group"][name] = group
|
||||
@newsrc["list"] += [ group ]
|
||||
end
|
||||
|
||||
def save
|
||||
unless @newsrc.has_key?("file")
|
||||
@newsrc["file"] = "#{$ENV['HOME']}/.newsrc"
|
||||
end
|
||||
save_as(@newsrc["file"])
|
||||
end
|
||||
|
||||
def save_as(file)
|
||||
if FileTest.exists?("#{file}")
|
||||
begin
|
||||
File.rename(file, "#{file}.bak")
|
||||
rescue
|
||||
print "Can't rename #{file}, #{file}.bak: #{$!}\n"
|
||||
exit
|
||||
end
|
||||
end
|
||||
begin
|
||||
newsrc = File.new(file, "w")
|
||||
rescue
|
||||
print "Can't open #{file}: #{$!}\n"
|
||||
exit
|
||||
end
|
||||
@newsrc["file"] = file
|
||||
for group in @newsrc["list"]
|
||||
newsrc.print format(group)
|
||||
end
|
||||
end
|
||||
|
||||
def format(group)
|
||||
name = group["name"]
|
||||
sub = group["subscribed"] ? ':' : '!'
|
||||
articles = group["articles"].run_list
|
||||
space = articles ? ' ' : ''
|
||||
return "#{name}#{sub}#{space}#{articles}\n"
|
||||
end
|
||||
|
||||
def export_rc
|
||||
lines = @newsrc["list"].collect{ |group|
|
||||
name = group["name"]
|
||||
sub = group["subscribed"] ? ':' : '!'
|
||||
articles = group["articles"].run_list
|
||||
space = articles ? ' ' : ''
|
||||
"#{name}#{sub}#{space}#{articles}\n" }
|
||||
return lines
|
||||
end
|
||||
|
||||
def add_group(name, options)
|
||||
|
||||
if @newsrc["group"].has_key?(name)
|
||||
options.has_key?("replace") or return false
|
||||
del_group(name)
|
||||
end
|
||||
group = {"name" => name,
|
||||
"subscribed" => 1,
|
||||
"articles" => Set::IntSpan.new }
|
||||
|
||||
@newsrc["group"][name] = group
|
||||
_insert(group, options)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
def move_group(name, options)
|
||||
if @newsrc["group"].has_key?(name)
|
||||
group = @newsrc["group"][name]
|
||||
else
|
||||
return false
|
||||
end
|
||||
|
||||
@newsrc["list"] = @newsrc["list"].delete_if{|x| x["name"] == name}
|
||||
|
||||
_insert(group, options)
|
||||
return true
|
||||
end
|
||||
|
||||
def _insert(group, options)
|
||||
list = @newsrc["list"]
|
||||
|
||||
where = ""
|
||||
arg = ""
|
||||
if options.has_key?("where")
|
||||
where = options["where"]
|
||||
end
|
||||
arg = where.slice!(1) if where.type.to_s == "Array"
|
||||
|
||||
case where.to_s
|
||||
when "first"
|
||||
@newsrc["list"].unshift(group)
|
||||
when "last"
|
||||
@newsrc["list"] += [ group ]
|
||||
when ""
|
||||
@newsrc["list"] += [ group ] # default
|
||||
when "alpha"
|
||||
alpha(group)
|
||||
when "before"
|
||||
print "metsj\n"
|
||||
before(group, arg)
|
||||
when "after"
|
||||
after(group, arg)
|
||||
when "number"
|
||||
number(group, arg)
|
||||
end
|
||||
end
|
||||
|
||||
def alpha (group)
|
||||
name = group["name"]
|
||||
for i in (0...@newsrc["list"].length)
|
||||
print @newsrc["list"][i]["name"],"\n"
|
||||
if ((name <=> @newsrc["list"][i]["name"]) == -1)
|
||||
# splice @$list, $i, 0, $group
|
||||
upper = @newsrc["list"].slice!(i..@newsrc["list"].length)
|
||||
@newsrc["list"] += [ group ]
|
||||
@newsrc["list"] += upper
|
||||
return;
|
||||
end
|
||||
end
|
||||
@newsrc["list"] += [group]
|
||||
end
|
||||
|
||||
def before(group, before)
|
||||
print "before\n"
|
||||
name = group["name"]
|
||||
|
||||
|
||||
for i in (0...@newsrc["list"].length)
|
||||
print @newsrc["list"][i]["name"],"\n"
|
||||
if (@newsrc["list"][i]["name"] == before.to_s)
|
||||
print @newsrc["list"][i]["name"],"\n"
|
||||
upper = @newsrc["list"].slice!(i..@newsrc["list"].length)
|
||||
@newsrc["list"] += [ group ]
|
||||
@newsrc["list"] += upper
|
||||
|
||||
return;
|
||||
end
|
||||
end
|
||||
|
||||
@newsrc["list"] += [group]
|
||||
end
|
||||
|
||||
def after(group, after)
|
||||
name = group["name"]
|
||||
|
||||
for i in (0...@newsrc["list"].length)
|
||||
if (@newsrc["list"][i]["name"] == after.to_s)
|
||||
print @newsrc["list"][i+1]["name"],"\n"
|
||||
upper = @newsrc["list"].slice!((i+1)..@newsrc["list"].length)
|
||||
@newsrc["list"] += [ group ]
|
||||
@newsrc["list"] += upper
|
||||
return;
|
||||
end
|
||||
end
|
||||
|
||||
@newsrc["list"] += [group]
|
||||
end
|
||||
|
||||
def number(group, offset)
|
||||
offset = @newsrc["list"].length if offset[0] > @newsrc["list"].length
|
||||
upper = @newsrc["list"].slice!(offset..@newsrc["list"].length)
|
||||
@newsrc["list"] += [ group ]
|
||||
@newsrc["list"] += upper
|
||||
end
|
||||
|
||||
|
||||
def del_group(name)
|
||||
if @newsrc["group"].has_key?(name)
|
||||
group = @newsrc["group"][name]
|
||||
else
|
||||
return false
|
||||
end
|
||||
|
||||
@newsrc["group"].delete(name)
|
||||
@newsrc["list"] = @newsrc["list"].delete_if{|x| x["name"] == name}
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
def subscribe(name, options = {"where" => ""})
|
||||
unless @newsrc["group"].has_key?(name)
|
||||
add_group(name, options)
|
||||
end
|
||||
@newsrc["group"][name]["subscribed"] = true
|
||||
end
|
||||
|
||||
def unsubscribe(name, options = {"where" => ""})
|
||||
unless @newsrc["group"].has_key?(name)
|
||||
add_group(name, options)
|
||||
end
|
||||
@newsrc["group"][name]["subscribed"] = false
|
||||
end
|
||||
|
||||
end # class
|
||||
|
||||
end # module
|
||||
|
||||
|
||||
# TODO
|
||||
# Do not kill an item until it's tested!
|
||||
|
||||
# [x] new
|
||||
# [x] load
|
||||
# [ ] _scan # Initializes a Newsrc object from a string. Used for testing.
|
||||
# [x] import_rc
|
||||
# [x] parse # parses a single line from a newsrc file
|
||||
# [x] save
|
||||
# [x] save_as
|
||||
# [x] format
|
||||
# [x] export_rc
|
||||
# [ ] _dump # Formats a Newsrc object to a string. Used for testing
|
||||
# [x] add_group
|
||||
# [x] move_group
|
||||
# [x] Splice(\@$$@) # heet nu number en is simpeler
|
||||
# [x] _insert
|
||||
# [x] Alpha
|
||||
# [x] Before
|
||||
# [x] After
|
||||
# [x] del_group
|
||||
# [x] subscribe
|
||||
# [x] unsubscribe
|
||||
# [ ] mark
|
||||
# [ ] mark_list
|
||||
# [ ] mark_range
|
||||
# [ ] unmark
|
||||
# [ ] unmark_list
|
||||
# [ ] unmark_range
|
||||
# [ ] exists
|
||||
# [ ] subscribed
|
||||
# [ ] marked
|
||||
# [ ] num_groups
|
||||
# [ ] groups
|
||||
# [ ] sub_groups
|
||||
# [ ] unsub_groups
|
||||
# [ ] marked_articles
|
||||
# [ ] unmarked_articles
|
||||
# [ ] get_articles
|
||||
# [ ] set_articles
|
||||
Loading…
Add table
Add a link
Reference in a new issue