Rosetta Code/Tasks without examples: Difference between revisions
Content added Content deleted
(Added Wren) |
m (→{{header|Phix}}: syntax coloured, use common code) |
||
Line 559: | Line 559: | ||
Output similar to zkl, I assume the first four constants are self-explanatory. |
Output similar to zkl, I assume the first four constants are self-explanatory. |
||
{{libheader|Phix/libcurl}} |
{{libheader|Phix/libcurl}} |
||
<!--<lang Phix>(notonline)--> |
|||
<lang Phix>-- demo\rosetta\Tasks_without_examples.exw |
|||
<span style="color: #000080;font-style:italic;">-- demo\rosetta\Tasks_without_examples.exw</span> |
|||
constant output_html = true, |
|||
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (libcurl, file i/o, peek, progress..)</span> |
|||
include_drafts = true, |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">output_html</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span><span style="color: #0000FF;">,</span> |
|||
summary = false, |
|||
<span style="color: #000000;">include_drafts</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span><span style="color: #0000FF;">,</span> |
|||
notlang = "Phix" -- "" for all |
|||
<span style="color: #000000;">summary</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #000000;">notlang</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Phix"</span> <span style="color: #000080;font-style:italic;">-- or "" (ie a zero length string) for all</span> |
|||
include builtins\timedate.e |
|||
integer refresh_cache = timedelta(days:=30) -- 0 for always |
|||
<span style="color: #008080;">include</span> <span style="color: #000000;">rosettacode_cache</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span> <span style="color: #000080;font-style:italic;">-- see [[Rosetta_Code/Count_examples#Phix]]</span> |
|||
include builtins\libcurl.e |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">extract_tasks</span><span style="color: #0000FF;">()</span> |
|||
atom curl = NULL |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">get_file_type</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"rc_cache"</span><span style="color: #0000FF;">)!=</span><span style="color: #004600;">FILETYPE_DIRECTORY</span> <span style="color: #008080;">then</span> |
|||
atom pErrorBuffer |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">create_directory</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"rc_cache"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"cannot create rc_cache directory"</span><span style="color: #0000FF;">)</span> |
|||
function write_callback(atom pData, integer size, integer nmemb, integer fn) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
integer bytes_written = size * nmemb |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
puts(fn,peek({pData,bytes_written})) |
|||
<span style="color: #000080;font-style:italic;">-- extract tasks from eg `<li><a href="/wiki/100_doors"`</span> |
|||
return bytes_written |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">tasks</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dewiki</span><span style="color: #0000FF;">(</span><span style="color: #000000;">open_category</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Programming_Tasks"</span><span style="color: #0000FF;">))</span> |
|||
end function |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">include_drafts</span> <span style="color: #008080;">then</span> |
|||
constant write_cb = call_back({'+', routine_id("write_callback")}) |
|||
<span style="color: #000000;">tasks</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">dewiki</span><span style="color: #0000FF;">(</span><span style="color: #000000;">open_category</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Draft_Programming_Tasks"</span><span style="color: #0000FF;">))</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
function open_download(string filename, url) |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">notlang</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
bool refetch = true |
|||
<span style="color: #000080;font-style:italic;">-- filter already done in specified language</span> |
|||
if get_file_type("rc_cache")!=FILETYPE_DIRECTORY then |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">langurl</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"http://rosettacode.org/wiki/Category:"</span><span style="color: #0000FF;">&</span><span style="color: #000000;">notlang</span> |
|||
if not create_directory("rc_cache") then |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">done</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dewiki</span><span style="color: #0000FF;">(</span><span style="color: #000000;">open_download</span><span style="color: #0000FF;">(</span><span style="color: #000000;">notlang</span><span style="color: #0000FF;">&</span><span style="color: #008000;">".htm"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">langurl</span><span style="color: #0000FF;">))</span> |
|||
crash("cannot create rc_cache directory") |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
end if |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tasks</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
end if |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tasks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #000000;">done</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
filename = join_path({"rc_cache",filename}) |
|||
<span style="color: #000000;">k</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
if file_exists(filename) then |
|||
<span style="color: #000000;">tasks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tasks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
-- use existing file if <= refresh_cache (30+ days) old |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
sequence last_mod = get_file_date(filename) -- (0.8.1+) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
atom delta = timedate_diff(last_mod,date()) |
|||
<span style="color: #000000;">tasks</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tasks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]</span> |
|||
refetch = (delta>refresh_cache) |
|||
<span style="color: #000000;">done</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span> |
|||
else |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
string directory = get_file_path(filename) |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">summary</span> <span style="color: #008080;">then</span> |
|||
if get_file_type(directory)!=FILETYPE_DIRECTORY then |
|||
<span style="color: #000080;font-style:italic;">-- replace with contents</span> |
|||
if not create_directory(directory,make_parent:=true) then |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tasks</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
crash("cannot create %s directory",{directory}) |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">ti</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tasks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span> |
|||
end if |
|||
<span style="color: #000000;">url</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"http://rosettacode.org/wiki/%s"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">}),</span> |
|||
end if |
|||
<span style="color: #000000;">contents</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">open_download</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">&</span><span style="color: #008000;">".htm"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">url</span><span style="color: #0000FF;">)</span> |
|||
end if |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">start</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">`</div>`</span><span style="color: #0000FF;">,</span><span style="color: #000000;">contents</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">`<div class="infobox"`</span><span style="color: #0000FF;">,</span><span style="color: #000000;">contents</span><span style="color: #0000FF;">))+</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #008000;">`</div>`</span><span style="color: #0000FF;">)</span> |
|||
if refetch then |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">finish</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">`<div id="toc"`</span><span style="color: #0000FF;">,</span><span style="color: #000000;">contents</span><span style="color: #0000FF;">,</span><span style="color: #000000;">start</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span> |
|||
printf(1,"Downloading %s...\n",{filename}) |
|||
<span style="color: #000080;font-style:italic;">-- ... but draft tasks with too few languages have no toc:</span> |
|||
if curl=NULL then |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">finish</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000000;">finish</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">`<h2>`</span><span style="color: #0000FF;">,</span><span style="color: #000000;">contents</span><span style="color: #0000FF;">,</span><span style="color: #000000;">start</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
curl_global_init() |
|||
<span style="color: #000080;font-style:italic;">-- ... and if no languages at all, use the footer:</span> |
|||
curl = curl_easy_init() |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">finish</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000000;">finish</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">`</div><div class="printfooter">`</span><span style="color: #0000FF;">,</span><span style="color: #000000;">contents</span><span style="color: #0000FF;">,</span><span style="color: #000000;">start</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
pErrorBuffer = allocate(CURL_ERROR_SIZE) |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">finish</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, pErrorBuffer) |
|||
<span style="color: #000000;">contents</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">contents</span><span style="color: #0000FF;">[</span><span style="color: #000000;">start</span><span style="color: #0000FF;">..</span><span style="color: #000000;">finish</span><span style="color: #0000FF;">]</span> |
|||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb) |
|||
<span style="color: #000000;">ti</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">substitute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"_"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">)</span> |
|||
end if |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"<b>"</span><span style="color: #0000FF;">&</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">&</span><span style="color: #008000;">"</b>"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">contents</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
url = substitute(url,"%3A",":") |
|||
<span style="color: #000080;font-style:italic;">-- (ps: I refuse to panic over the occasional replicated header...)</span> |
|||
url = substitute(url,"%2A","*") |
|||
<span style="color: #000000;">contents</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"<h3>%s</h3>%s"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">,</span><span style="color: #000000;">contents</span><span style="color: #0000FF;">})</span> |
|||
curl_easy_setopt(curl, CURLOPT_URL, url) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
integer fn = open(filename,"wb") |
|||
<span style="color: #000000;">tasks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">contents</span> |
|||
if fn=-1 then ?9/0 end if |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">get_key</span><span style="color: #0000FF;">()=</span><span style="color: #000000;">#1B</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fn) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
CURLcode res = curl_easy_perform(curl) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
if res!=CURLE_OK then |
|||
<span style="color: #000000;">curl_cleanup</span><span style="color: #0000FF;">()</span> |
|||
string error = sprintf("%d",res) |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">tasks</span> |
|||
if res=CURLE_COULDNT_RESOLVE_HOST then |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
error &= " [CURLE_COULDNT_RESOLVE_HOST]" |
|||
end if |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">html_header</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""" |
|||
printf(1, "Error %s downloading file\n", error) |
|||
<!DOCTYPE html> |
|||
{} = wait_key() |
|||
<html lang="en"> |
|||
abort(0) |
|||
<head> |
|||
end if |
|||
<meta charset="utf-8" /> |
|||
close(fn) |
|||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
|||
refresh_cache += timedelta(days:=1) -- did I mention it is slow? |
|||
<title>Rosettacode Tasks without examples</title> |
|||
end if |
|||
</head> |
|||
return get_text(filename) |
|||
<body> |
|||
end function |
|||
<h2>Rosettacode Tasks without examples</h2> |
|||
Generated %s, %d entries<br> |
|||
function open_category(string filename) |
|||
<br> |
|||
return open_download(filename&".htm","http://rosettacode.org/wiki/Category:"&filename) |
|||
"""</span><span style="color: #0000FF;">,</span> |
|||
end function |
|||
<span style="color: #000000;">html_footer</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""" |
|||
</body> |
|||
function dewiki(string s) |
|||
</html> |
|||
sequence tasks = {} |
|||
"""</span> |
|||
integer start = 1, finish = match(`<div class="printfooter">`,s) |
|||
s = s[1..finish-1] |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">results</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">extract_tasks</span><span style="color: #0000FF;">()</span> |
|||
while true do |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">output_html</span> <span style="color: #008080;">then</span> |
|||
start = match("<li><a href=\"/wiki/",s,start) |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">fn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">open</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Tasks_Without_Examples.html"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"w"</span><span style="color: #0000FF;">)</span> |
|||
if start=0 then exit end if |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">html_header</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">format_timedate</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">date</span><span style="color: #0000FF;">()),</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">results</span><span style="color: #0000FF;">)})</span> |
|||
start += length("<li><a href=\"/wiki/") |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">results</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
finish = find('"',s,start) |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s<br>\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">html_clean</span><span style="color: #0000FF;">(</span><span style="color: #000000;">results</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]))</span> |
|||
string task = s[start..finish-1] |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
task = substitute(task,"*","%2A") |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">html_footer</span><span style="color: #0000FF;">)</span> |
|||
task = substitute(task,":","%3A") |
|||
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span> |
|||
tasks = append(tasks,task) |
|||
<span style="color: #008080;">else</span> |
|||
start = finish+1 |
|||
<span style="color: #7060A8;">progress</span><span style="color: #0000FF;">(</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)</span> |
|||
end while |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">results</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
return tasks |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">html_clean</span><span style="color: #0000FF;">(</span><span style="color: #000000;">results</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]))</span> |
|||
end function |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
function extract_tasks() |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d tasks\n"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">results</span><span style="color: #0000FF;">))</span> |
|||
-- extract tasks from eg `<li><a href="/wiki/100_doors"` |
|||
sequence tasks = dewiki(open_category("Programming_Tasks")) |
|||
<span style="color: #0000FF;">?</span><span style="color: #008000;">"done"</span> |
|||
if include_drafts then |
|||
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">wait_key</span><span style="color: #0000FF;">()</span> |
|||
tasks &= dewiki(open_category("Draft_Programming_Tasks")) |
|||
<!--</lang>--> |
|||
end if |
|||
if length(notlang) then |
|||
-- filter already done in specified language |
|||
string langurl = "http://rosettacode.org/wiki/Category:"¬lang |
|||
sequence done = dewiki(open_download(notlang&".htm",langurl)) |
|||
integer k = 0 |
|||
for i=1 to length(tasks) do |
|||
if not find(tasks[i],done) then |
|||
k += 1 |
|||
tasks[k] = tasks[i] |
|||
end if |
|||
end for |
|||
tasks = tasks[1..k] |
|||
done = {} |
|||
end if |
|||
if not summary then |
|||
-- replace with contents |
|||
for i=1 to length(tasks) do |
|||
string ti = tasks[i], |
|||
url = sprintf("http://rosettacode.org/wiki/%s",{ti}), |
|||
contents = open_download(ti&".htm",url) |
|||
integer start = match(`</div>`,contents,match(`<div class="infobox"`,contents))+length(`</div>`) |
|||
integer finish = match(`<div id="toc"`,contents,start)-1 |
|||
-- ... but draft tasks with too few languages have no toc: |
|||
if finish=-1 then finish = match(`<h2>`,contents,start)-1 end if |
|||
-- ... and if no languages at all, use the footer: |
|||
if finish=-1 then finish = match(`</div><div class="printfooter">`,contents,start)-1 end if |
|||
if finish=-1 then ?9/0 end if |
|||
contents = contents[start..finish] |
|||
ti = substitute(ti,"_"," ") |
|||
if not match("<b>"&ti&"</b>",contents) then |
|||
-- (ps: I refuse to panic over the occasional replicated header...) |
|||
contents = sprintf("<h3>%s</h3>%s",{ti,contents}) |
|||
end if |
|||
tasks[i] = contents |
|||
if get_key()=#1B then exit end if |
|||
end for |
|||
end if |
|||
if curl!=NULL then |
|||
curl_easy_cleanup(curl) |
|||
free(pErrorBuffer) |
|||
curl = NULL |
|||
pErrorBuffer = NULL |
|||
end if |
|||
return tasks |
|||
end function |
|||
function html_clean(string ri) |
|||
ri = substitute(ri,"%3A",":") |
|||
ri = substitute(ri,"%E2%80%93","-") |
|||
ri = substitute(ri,"%E2%80%99","'") |
|||
ri = substitute(ri,"%27","'") |
|||
ri = substitute(ri,"%2B","+") |
|||
ri = substitute(ri,"%C3%A8","e") |
|||
ri = substitute(ri,"%C3%A9","e") |
|||
ri = substitute(ri,"%22","\"") |
|||
ri = substitute(ri,"%2A","*") |
|||
return ri |
|||
end function |
|||
constant html_header = """ |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="utf-8" /> |
|||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
|||
<title>Rosettacode Tasks without examples</title> |
|||
</head> |
|||
<body> |
|||
<h2>Rosettacode Tasks without examples</h2> |
|||
Generated %s, %d entries<br><br> |
|||
""", |
|||
html_footer = """ |
|||
</body> |
|||
</html> |
|||
""" |
|||
sequence results = extract_tasks() |
|||
if output_html then |
|||
integer fn = open("Tasks_Without_Examples.html","w") |
|||
printf(fn,html_header,{format_timedate(date()),length(results)}) |
|||
for i=1 to length(results) do |
|||
printf(fn,"%s<br>",html_clean(results[i])) |
|||
end for |
|||
puts(fn,html_footer) |
|||
close(fn) |
|||
else |
|||
for i=1 to length(results) do |
|||
printf(1,"%s\n",html_clean(results[i])) |
|||
end for |
|||
end if |
|||
?"done" |
|||
{} = wait_key()</lang> |
|||
=={{header|Raku}}== |
=={{header|Raku}}== |