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 `&lt;li&gt;&lt;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;">`&lt;/div&gt;`</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;">`&lt;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;">`&lt;/div&gt;`</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;">`&lt;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;">`&lt;h2&gt;`</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;">`&lt;/div&gt;&lt;div class="printfooter"&gt;`</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;">"&lt;b&gt;"</span><span style="color: #0000FF;">&</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">&</span><span style="color: #008000;">"&lt;/b&gt;"</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;">"&lt;h3&gt;%s&lt;/h3&gt;%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)
&lt;!DOCTYPE html&gt;
{} = wait_key()
&lt;html lang="en"&gt;
abort(0)
&lt;head&gt;
end if
&lt;meta charset="utf-8" /&gt;
close(fn)
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
refresh_cache += timedelta(days:=1) -- did I mention it is slow?
&lt;title&gt;Rosettacode Tasks without examples&lt;/title&gt;
end if
&lt;/head&gt;
return get_text(filename)
&lt;body&gt;
end function
&lt;h2&gt;Rosettacode Tasks without examples&lt;/h2&gt;

Generated %s, %d entries&lt;br&gt;
function open_category(string filename)
&lt;br&gt;
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;">"""

&lt;/body&gt;
function dewiki(string s)
&lt;/html&gt;
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&lt;br&gt;\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:"&notlang
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}}==