Rosetta Code/Count examples: Difference between revisions

Content added Content deleted
(add Ruby)
Line 282: Line 282:
=={{header|Ruby}}==
=={{header|Ruby}}==
{{libheader|REXML}}
{{libheader|REXML}}
First, a RosettaCode module, saved as <tt>rosettacode.rb</tt>:
<lang ruby>require 'open-uri'
<lang ruby>require 'open-uri'
require 'rexml/document'
require 'rexml/document'


module RosettaCode
def rc_url(page, query)
"http://www.rosettacode.org/w/" + page + "?" +
URI.escape(query.map {|pair| "%s=%s" % pair}.join("&"))
end


def rc_tasks(category)
def rc_url(page, query)
"http://www.rosettacode.org/w/" + page + "?" +
query = {
URI.escape(query.map {|pair| "%s=%s" % pair}.join("&"))
"action" => "query",
end
"list" => "categorymembers",
"cmtitle" => "Category:#{category}",
"format" => "xml",
"cmlimit" => 500,
}
while true
url = rc_url "api.php", query
doc = REXML::Document.new open(url)


def rc_tasks
REXML::XPath.each(doc, "//cm") do |task|
query = {
yield task.attribute("title").value
"action" => "query",
end
"list" => "categorymembers",
"cmtitle" => "Category:Programming_Tasks",
"format" => "xml",
"cmlimit" => 500,
}
while true
url = rc_url "api.php", query
doc = REXML::Document.new open(url)


continue = REXML::XPath.first(doc, "//query-continue")
REXML::XPath.each(doc, "//cm") do |task|
yield task.attribute("title").value
break if continue.nil?
end
cm = REXML::XPath.first(continue, "categorymembers")

query["cmcontinue"] = cm.attribute("cmcontinue").value
continue = REXML::XPath.first(doc, "//query-continue")
break if continue.nil?
cm = REXML::XPath.first(continue, "categorymembers")
query["cmcontinue"] = cm.attribute("cmcontinue").value
end
end
end

end
end</lang>

Then, we implement the task with:
<lang ruby>require 'rosettacode'
include RosettaCode


total_examples = 0
total_examples = 0


rc_tasks("Programming_Tasks") do |task|
rc_tasks("Programming_Tasks") do |task|
url = rc_url "index.php", {"action" => "raw", "title" => task}
url = rc_url("index.php", {"action" => "raw", "title" => task})
examples = open(url).read.scan("=={{header").length
examples = open(url).read.scan("=={{header").length
puts "#{task}: #{examples}"
puts "#{task}: #{examples} examples"
total_examples += examples
total_examples += examples
end
end


puts
puts
puts "Total: #{total_examples}"</lang>
puts "Total: #{total_examples} examples"</lang>


=={{header|Tcl}}==
=={{header|Tcl}}==