Starting a web browser: Difference between revisions

m
m (use normal emphasis)
m (→‎{{header|Wren}}: Minor tidy)
 
(30 intermediate revisions by 14 users not shown)
Line 1:
{{Draft task}} [[Category:Web]]
Build and show a web page displaying the data from the task [[Separate_the_house_number_from_the_street_name|separatedseparate the house ornumber from the street streetnubersname]] in a formatted and colored table.
 
;Task:
Write the code which automatically opens a web page in a browser showing the addresses.<em>No static data must be shown, only processed data.</em>
<em>No static data must be shown, only processed data.</em>
 
=={{header|EchoLisp}}==
Since we are already in a browser window, the browser is started. '''print-hatml''' sends an html string to the standard output area. The table is styled with the "htable" css class, which is included in EchoLisp.
<syntaxhighlight lang="scheme">
;; table from "Separate_the_house_number_from_the_street_name"
;;
(print-html (table->html adresses))
</syntaxhighlight>
{{out}}
 
<table class = "htable" style = "border: 1px solid blue;">
<tr>
<td> Plataanstraat</td> <td> 5</td>
</tr>
<tr>
<td> Straat</td> <td> 12</td>
</tr>
<tr>
<td> Straat</td> <td> 12 II</td>
</tr>
<tr>
<td> Straat 1940</td> <td> II</td>
</tr>
<tr>
<td> Dr. J. Straat </td> <td> 40</td>
</tr>
<tr>
<td> Dr. J. Straat</td> <td> 12 a</td>
</tr>
<tr>
<td> Dr. J. Straat</td> <td> 12-14</td>
</tr>
<tr>
<td> Laan 1940 – 1945</td> <td> 37</td>
</tr>
<tr>
<td> Plein 1940</td> <td> 2</td>
</tr>
<tr>
<td> 1213-laan</td> <td> 11</td>
</tr>
<tr>
<td> 16 april</td> <td> 1944 Pad 1</td>
</tr>
<tr>
<td> 1e Kruisweg</td> <td> 36</td>
</tr>
<tr>
<td> Laan 1940-'45</td> <td> 66</td>
</tr>
<tr>
<td> Laan '40-'45</td> <td> ❓❓❓</td>
</tr>
<tr>
<td> Langeloërduinen</td> <td> 3 46</td>
</tr>
<tr>
<td> Marienwaerdt</td> <td> 2e Dreef 2</td>
</tr>
<tr>
<td> Provincialeweg N205</td> <td> 1</td>
</tr>
<tr>
<td> Rivium</td> <td> 2e Straat 59.</td>
</tr>
<tr>
<td> Nieuwe gracht</td> <td> 20rd</td>
</tr>
<tr>
<td> Nieuwe gracht</td> <td> 20rd 2</td>
</tr>
<tr>
<td> Nieuwe gracht</td> <td> 20zw /2</td>
</tr>
<tr>
<td> Nieuwe gracht</td> <td> 20zw/3</td>
</tr>
<tr>
<td> Nieuwe gracht</td> <td> 20 zw/4</td>
</tr>
<tr>
<td> Bahnhofstr.</td> <td> 4</td>
</tr>
<tr>
<td> Wertstr.</td> <td> 10</td>
</tr>
<tr>
<td> Lindenhof</td> <td> 1</td>
</tr>
<tr>
<td> Nordesch</td> <td> 20</td>
</tr>
<tr>
<td> Weilstr.</td> <td> 6</td>
</tr>
<tr>
<td> Harthauer Weg</td> <td> 2</td>
</tr>
<tr>
<td> Mainaustr.</td> <td> 49</td>
</tr>
<tr>
<td> August-Horch-Str.</td> <td> 3</td>
</tr>
<tr>
<td> Marktplatz</td> <td> 31</td>
</tr>
<tr>
<td> Schmidener Weg</td> <td> 3</td>
</tr>
<tr>
<td> Karl-Weysser-Str.</td> <td> 6</td>
</tr>
</table>
 
=={{header|Go}}==
This uses the same format and color scheme for the table as the Raku entry.
<syntaxhighlight lang="go">package main
 
import (
"fmt"
"html/template"
"log"
"os"
"os/exec"
"strings"
"time"
)
 
type row struct {
Address, Street, House, Color string
}
 
func isDigit(b byte) bool {
return '0' <= b && b <= '9'
}
 
func separateHouseNumber(address string) (street string, house string) {
length := len(address)
fields := strings.Fields(address)
size := len(fields)
last := fields[size-1]
penult := fields[size-2]
if isDigit(last[0]) {
isdig := isDigit(penult[0])
if size > 2 && isdig && !strings.HasPrefix(penult, "194") {
house = fmt.Sprintf("%s %s", penult, last)
} else {
house = last
}
} else if size > 2 {
house = fmt.Sprintf("%s %s", penult, last)
}
street = strings.TrimRight(address[:length-len(house)], " ")
return
}
 
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
 
var tmpl = `
<head>
<title>Rosetta Code - Start a Web Browser</title>
<meta charset="UTF-8">
</head>
<body bgcolor="#d8dcd6">
<table border="2">
<p align="center">
<font face="Arial, sans-serif" size="5">Split the house number from the street name</font>
<tr bgcolor="#02ccfe"><th>Address</th><th>Street</th><th>House Number</th></tr>
{{range $row := .}}
<tr bgcolor={{$row.Color}}>
<td>{{$row.Address}}</td>
<td>{{$row.Street}}</td>
<td>{{$row.House}}</td>
</tr>
{{end}}
</p>
</table>
</body>
`
func main() {
addresses := []string{
"Plataanstraat 5",
"Straat 12",
"Straat 12 II",
"Dr. J. Straat 12",
"Dr. J. Straat 12 a",
"Dr. J. Straat 12-14",
"Laan 1940 - 1945 37",
"Plein 1940 2",
"1213-laan 11",
"16 april 1944 Pad 1",
"1e Kruisweg 36",
"Laan 1940-'45 66",
"Laan '40-'45",
"Langeloërduinen 3 46",
"Marienwaerdt 2e Dreef 2",
"Provincialeweg N205 1",
"Rivium 2e Straat 59.",
"Nieuwe gracht 20rd",
"Nieuwe gracht 20rd 2",
"Nieuwe gracht 20zw /2",
"Nieuwe gracht 20zw/3",
"Nieuwe gracht 20 zw/4",
"Bahnhofstr. 4",
"Wertstr. 10",
"Lindenhof 1",
"Nordesch 20",
"Weilstr. 6",
"Harthauer Weg 2",
"Mainaustr. 49",
"August-Horch-Str. 3",
"Marktplatz 31",
"Schmidener Weg 3",
"Karl-Weysser-Str. 6",
}
browser := "firefox" // or whatever
colors := [2]string{"#d7fffe", "#9dbcd4"}
fileName := "addresses_table.html"
ct := template.Must(template.New("").Parse(tmpl))
file, err := os.Create(fileName)
check(err)
rows := make([]row, len(addresses))
for i, address := range addresses {
street, house := separateHouseNumber(address)
if house == "" {
house = "(none)"
}
color := colors[i%2]
rows[i] = row{address, street, house, color}
}
err = ct.Execute(file, rows)
check(err)
cmd := exec.Command(browser, fileName)
err = cmd.Run()
check(err)
file.Close()
time.Sleep(5 * time.Second) // wait for 5 seconds before deleting file
err = os.Remove(fileName)
check(err)
}</syntaxhighlight>
 
{{out}}
<pre>
Similar to the Raku entry.
</pre>
 
=={{header|J}}==
 
Here, we assume that <code>browser</code> refers to a browser in a format which is usable by a command shell, and <code>din5008</code> and <code>sampledata</code> have been defined according to the [[Separate_the_house_number_from_the_street_name#J|J house number street name]] task entry:
 
<syntaxhighlight lang="j"> wrap=: {{'<',m,'>',y,'</',(;{.;:m),'>' }}(L:0)("1)
'table.htm'fwrite~'<style>tr:nth-child(even){color:blue}</style>','table' wrap ,'tr' wrap ;"1 'td' wrap din5008"1 sampledata
1660
launch browser,' table.htm'</syntaxhighlight>
 
(Here, 1660 was the length of the generated file.)
 
=={{header|Julia}}==
<syntaxhighlight lang="julia">using Tables, BrowseTables
 
function testbrowsertable(addresstext)
lines = strip.(split(addresstext, "\n"))
mat = fill("", length(lines), 2)
regex = r"""^ (.*?) \s+
(
\d* (\-|\/)? \d*
| \d{1,3} [a-zI./ ]* \d{0,3}
)
$"""x
for (i, line) in enumerate(lines)
if (matched = match(regex, line)) != nothing
mat[i, 1], mat[i, 2] = matched.captures
end
end
data = Tables.table(mat)
tmp = tempname() * ".html"
write_html_table(tmp, data)
if Sys.isapple()
run(`open $tmp`)
elseif Sys.iswindows()
run(`cmd /c start $tmp`)
else # linux etc.
run(`xdg-open $tmp`)
end
println("Press Enter after you close the browser to exit and remove temp file.")
readline()
rm(tmp)
end
 
const adressen = """
Plataanstraat 5
Straat 12
Straat 12 II
Dr. J. Straat 12
Dr. J. Straat 12 a
Dr. J. Straat 12-14
Laan 1940 – 1945 37
Plein 1940 2
1213-laan 11
16 april 1944 Pad 1
1e Kruisweg 36
Laan 1940-’45 66
Laan ’40-’45
Langeloërduinen 3 46
Marienwaerdt 2e Dreef 2
Provincialeweg N205 1
Rivium 2e Straat 59.
Nieuwe gracht 20rd
Nieuwe gracht 20rd 2
Nieuwe gracht 20zw /2
Nieuwe gracht 20zw/3
Nieuwe gracht 20 zw/4
Bahnhofstr. 4
Wertstr. 10
Lindenhof 1
Nordesch 20
Weilstr. 6
Harthauer Weg 2
Mainaustr. 49
August-Horch-Str. 3
Marktplatz 31
Schmidener Weg 3
Karl-Weysser-Str. 6"""
 
testbrowsertable(adressen)
</syntaxhighlight>
 
=={{header|Nim}}==
Based on Phix solution. Using same colors as Scala program.
 
<syntaxhighlight lang="nim">import os, strutils
 
func separateHouseNumber(address: string): tuple[street, house: string] =
let fields = address.splitWhitespace()
let last = fields[^1]
let penult = fields[^2]
if last[0].isDigit():
let isdig = penult[0].isDigit()
if fields.len > 2 and isdig and not penult.startsWith("194"):
result.house = penult & ' ' & last
else:
result.house = last
elif fields.len > 2:
result.house = penult & ' ' & last
result.street = address[0..address.high-result.house.len].strip(leading = false, trailing = true)
 
const
Addresses = ["Plataanstraat 5",
"Straat 12",
"Straat 12 II",
"Dr. J. Straat 12",
"Dr. J. Straat 12 a",
"Dr. J. Straat 12-14",
"Laan 1940 - 1945 37",
"Plein 1940 2",
"1213-laan 11",
"16 april 1944 Pad 1",
"1e Kruisweg 36",
"Laan 1940-'45 66",
"Laan '40-'45",
"Langeloërduinen 3 46",
"Marienwaerdt 2e Dreef 2",
"Provincialeweg N205 1",
"Rivium 2e Straat 59.",
"Nieuwe gracht 20rd",
"Nieuwe gracht 20rd 2",
"Nieuwe gracht 20zw /2",
"Nieuwe gracht 20zw/3",
"Nieuwe gracht 20 zw/4",
"Bahnhofstr. 4",
"Wertstr. 10",
"Lindenhof 1",
"Nordesch 20",
"Weilstr. 6",
"Harthauer Weg 2",
"Mainaustr. 49",
"August-Horch-Str. 3",
"Marktplatz 31",
"Schmidener Weg 3",
"Karl-Weysser-Str. 6"]
 
HtmlHeader = """
<html>
<head>
<title>Rosetta Code - Start a Web Browser</title>
<meta charset="UTF-8">
</head>
<body bgcolor="#e6e6ff">
<p align="center">
<font face="Arial, sans-serif" size="5">Split the house number from the street name</font>
</p>
<p align="center">
<table border="2"> <tr bgcolor="#9bbb59">
<th>Address</th><th>Street</th><th>House Number</th>
"""
 
HtmlLine = "<tr bgcolor=$#><td>$#</td><td>$#</td><td>$#</td></tr>"
 
HtmlFooter = """
</table>
</p>
</body>
</html>
"""
 
let htmlFile = open("test.html", fmWrite)
htmlFile.write HtmlHeader
for i, address in Addresses:
let color = if (i and 1) == 0: "#ebf1de" else: "#d8e4bc"
let (street, house) = address.separateHouseNumber()
htmlFile.write HtmlLine.format(color, address, street, house)
htmlFile.write HtmlFooter
htmlFile.close()
 
discard execShellCmd("firefox test.html")
os.sleep(5000)
removeFile("test.html")</syntaxhighlight>
 
{{out}}
Same as Phix with Scala colors.
 
=={{header|Perl}}==
Borrowing code from the [[Separate_the_house_number_from_the_street_name|Separate the house number from the street name]] task.
{{trans|Raku}}
<syntaxhighlight lang="perl">use File::Temp qw(tempfile);
 
my @addresses = (
'Plataanstraat 5', 'Straat 12', 'Straat 12 II', 'Dr. J. Straat 12',
'Dr. J. Straat 12 a', 'Dr. J. Straat 12-14', 'Laan 1940 – 1945 37', 'Plein 1940 2',
'1213-laan 11', '16 april 1944 Pad 1', '1e Kruisweg 36', 'Laan 1940-’45 66',
'Laan ’40-’45', 'Langeloërduinen 3 46', 'Marienwaerdt 2e Dreef 2', 'Provincialeweg N205 1',
'Rivium 2e Straat 59.', 'Nieuwe gracht 20rd', 'Nieuwe gracht 20rd 2', 'Nieuwe gracht 20zw /2',
'Nieuwe gracht 20zw/3', 'Nieuwe gracht 20 zw/4', 'Bahnhofstr. 4', 'Wertstr. 10',
'Lindenhof 1', 'Nordesch 20', 'Weilstr. 6', 'Harthauer Weg 2',
'Mainaustr. 49', 'August-Horch-Str. 3', 'Marktplatz 31', 'Schmidener Weg 3',
'Karl-Weysser-Str. 6');
 
 
my @row_color = ('#d7fffe', '#9dbcd4');
 
# build the table
sub genTable {
my $table = '<table border="2"> <tr bgcolor="#02ccfe">' .
qq|<th>Address</th><th>Street</th><th>House Number</th>\n|;
my $i = 0;
for my $addr (@addresses) {
$table .= qq|<tr bgcolor="@{[@row_color[$i++ % 2]]}"><td>$addr</td>|;
 
my($street,$number) = $addr =~
m[^ (.*?) \s+
(
\d* (\-|\/)? \d*
| \d{1,3} [a-zI./ ]* \d{0,3}
) $
]x;
if (!$number) { $street = $addr; $number = '(no match)' }
$table .= qq|<td>$street</td><td>$number</td></tr>\n|;
}
return $table . '</table>';
}
 
my $streets_and_numbers = genTable();
 
# generate the page content
sub content {
return <<END;
<html>
<head>
<title>Rosetta Code - Start a Web Browser</title>
<meta charset="UTF-8">
</head>
<body bgcolor="#d8dcd6">
<p align="center">
<font face="Arial, sans-serif" size="5">Split the house number from the street name</font>
</p>
<p align="center">
$streets_and_numbers
</p>
</body>
</html>
END
}
 
# Use a temporary file name and file handle
my ($fn, $fh) = tempfile :suffix('.html');
 
# dump the content to the file
open my $fh, '>', $fn;
print $fh content();
close $fh;
 
# use appropriate command for X11 (other systems will need different invocation)
my $command = "xdg-open $fn";
 
# start the browser
system "$command";
 
# wait for a bit to give browser time to load before destroying temp file
sleep 5;
</syntaxhighlight>
{{out}}
<table border="2"> <tr bgcolor="#02ccfe"><th>Address</th><th>Street</th><th>House Number</th>
<tr bgcolor="#d7fffe"><td>Plataanstraat 5</td><td>Plataanstraat</td><td>5</td></tr>
<tr bgcolor="#9dbcd4"><td>Straat 12</td><td>Straat</td><td>12</td></tr>
<tr bgcolor="#d7fffe"><td>Straat 12 II</td><td>Straat</td><td>12 II</td></tr>
<tr bgcolor="#9dbcd4"><td>Dr. J. Straat 12</td><td>Dr. J. Straat</td><td>12</td></tr>
<tr bgcolor="#d7fffe"><td>Dr. J. Straat 12 a</td><td>Dr. J. Straat</td><td>12 a</td></tr>
<tr bgcolor="#9dbcd4"><td>Dr. J. Straat 12-14</td><td>Dr. J. Straat</td><td>12-14</td></tr>
<tr bgcolor="#d7fffe"><td>Laan 1940 – 1945 37</td><td>Laan 1940 – 1945</td><td>37</td></tr>
<tr bgcolor="#9dbcd4"><td>Plein 1940 2</td><td>Plein 1940</td><td>2</td></tr>
<tr bgcolor="#d7fffe"><td>1213-laan 11</td><td>1213-laan</td><td>11</td></tr>
<tr bgcolor="#9dbcd4"><td>16 april 1944 Pad 1</td><td>16 april 1944 Pad</td><td>1</td></tr>
<tr bgcolor="#d7fffe"><td>1e Kruisweg 36</td><td>1e Kruisweg</td><td>36</td></tr>
<tr bgcolor="#9dbcd4"><td>Laan 1940-’45 66</td><td>Laan 1940-’45</td><td>66</td></tr>
<tr bgcolor="#d7fffe"><td>Laan ’40-’45</td><td>Laan ’40-’45</td><td>(no match)</td></tr>
<tr bgcolor="#9dbcd4"><td>Langeloërduinen 3 46</td><td>Langeloërduinen</td><td>3 46</td></tr>
<tr bgcolor="#d7fffe"><td>Marienwaerdt 2e Dreef 2</td><td>Marienwaerdt 2e Dreef</td><td>2</td></tr>
<tr bgcolor="#9dbcd4"><td>Provincialeweg N205 1</td><td>Provincialeweg N205</td><td>1</td></tr>
<tr bgcolor="#d7fffe"><td>Rivium 2e Straat 59.</td><td>Rivium 2e Straat</td><td>59.</td></tr>
<tr bgcolor="#9dbcd4"><td>Nieuwe gracht 20rd</td><td>Nieuwe gracht</td><td>20rd</td></tr>
<tr bgcolor="#d7fffe"><td>Nieuwe gracht 20rd 2</td><td>Nieuwe gracht</td><td>20rd 2</td></tr>
<tr bgcolor="#9dbcd4"><td>Nieuwe gracht 20zw /2</td><td>Nieuwe gracht</td><td>20zw /2</td></tr>
<tr bgcolor="#d7fffe"><td>Nieuwe gracht 20zw/3</td><td>Nieuwe gracht</td><td>20zw/3</td></tr>
<tr bgcolor="#9dbcd4"><td>Nieuwe gracht 20 zw/4</td><td>Nieuwe gracht</td><td>20 zw/4</td></tr>
<tr bgcolor="#d7fffe"><td>Bahnhofstr. 4</td><td>Bahnhofstr.</td><td>4</td></tr>
<tr bgcolor="#9dbcd4"><td>Wertstr. 10</td><td>Wertstr.</td><td>10</td></tr>
<tr bgcolor="#d7fffe"><td>Lindenhof 1</td><td>Lindenhof</td><td>1</td></tr>
<tr bgcolor="#9dbcd4"><td>Nordesch 20</td><td>Nordesch</td><td>20</td></tr>
<tr bgcolor="#d7fffe"><td>Weilstr. 6</td><td>Weilstr.</td><td>6</td></tr>
<tr bgcolor="#9dbcd4"><td>Harthauer Weg 2</td><td>Harthauer Weg</td><td>2</td></tr><tr bgcolor="#d7fffe"><td>Mainaustr. 49</td><td>Mainaustr.</td><td>49</td></tr>
<tr bgcolor="#9dbcd4"><td>August-Horch-Str. 3</td><td>August-Horch-Str.</td><td>3</td></tr>
<tr bgcolor="#d7fffe"><td>Marktplatz 31</td><td>Marktplatz</td><td>31</td></tr>
<tr bgcolor="#9dbcd4"><td>Schmidener Weg 3</td><td>Schmidener Weg</td><td>3</td></tr>
<tr bgcolor="#d7fffe"><td>Karl-Weysser-Str. 6</td><td>Karl-Weysser-Str.</td><td>6</td></tr>
</table>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(notonline)-->
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (file i/o, system)</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">addresses</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"Plataanstraat 5"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Straat 12"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Straat 12 II"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Dr. J. Straat 12"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Dr. J. Straat 12 a"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Dr. J. Straat 12-14"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Laan 1940 - 1945 37"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Plein 1940 2"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"1213-laan 11"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"16 april 1944 Pad 1"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"1e Kruisweg 36"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Laan 1940-'45 66"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Laan '40-'45"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Langeloërduinen 3 46"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Marienwaerdt 2e Dreef 2"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Provincialeweg N205 1"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Rivium 2e Straat 59."</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Nieuwe gracht 20rd"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Nieuwe gracht 20rd 2"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Nieuwe gracht 20zw /2"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Nieuwe gracht 20zw/3"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Nieuwe gracht 20 zw/4"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Bahnhofstr. 4"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Wertstr. 10"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Lindenhof 1"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Nordesch 20"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Weilstr. 6"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Harthauer Weg 2"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Mainaustr. 49"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"August-Horch-Str. 3"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Marktplatz 31"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Schmidener Weg 3"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Karl-Weysser-Str. 6"</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">isDigit</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">>=</span><span style="color: #008000;">'0'</span> <span style="color: #008080;">and</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;"><=</span><span style="color: #008000;">'9'</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">separateHouseNumber</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">address</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">addresses</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">parts</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #000000;">address</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">street</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">house</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">h</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">parts</span><span style="color: #0000FF;">)></span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">last</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">parts</span><span style="color: #0000FF;">[$]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">isDigit</span><span style="color: #0000FF;">(</span><span style="color: #000000;">last</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">h</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">penult</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">parts</span><span style="color: #0000FF;">[$-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">parts</span><span style="color: #0000FF;">)></span><span style="color: #000000;">2</span>
<span style="color: #008080;">and</span> <span style="color: #000000;">isDigit</span><span style="color: #0000FF;">(</span><span style="color: #000000;">penult</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])</span>
<span style="color: #008080;">and</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"194"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">penult</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">h</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">elsif</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">parts</span><span style="color: #0000FF;">)></span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">h</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">h</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">street</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">parts</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$-</span><span style="color: #000000;">h</span><span style="color: #0000FF;">])</span>
<span style="color: #000000;">house</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">parts</span><span style="color: #0000FF;">[$-</span><span style="color: #000000;">h</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$])</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">street</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">parts</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">house</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"(none)"</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">colour</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?</span><span style="color: #008000;">"#d7fffe"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"#9dbcd4"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">colour</span><span style="color: #0000FF;">,</span><span style="color: #000000;">address</span><span style="color: #0000FF;">,</span><span style="color: #000000;">street</span><span style="color: #0000FF;">,</span><span style="color: #000000;">house</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">html_hdr</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Rosetta Code - Start a Web Browser&lt;/title&gt;
&lt;meta charset="UTF-8"&gt;
&lt;/head&gt;
&lt;body bgcolor="#d8dcd6"&gt;
&lt;p align="center"&gt;
&lt;font face="Arial, sans-serif" size="5"&gt;Split the house number from the street name&lt;/font&gt;
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;table border="2"&gt; &lt;tr bgcolor="#02ccfe"&gt;
&lt;th&gt;Address&lt;/th&gt;&lt;th&gt;Street&lt;/th&gt;&lt;th&gt;House Number&lt;/th&gt;
"""</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">html_line</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
&lt;tr bgcolor=%s&gt;&lt;td&gt;%s&lt;/td&gt;&lt;td&gt;%s&lt;/td&gt;&lt;td&gt;%s&lt;/td&gt;&lt;/tr&gt;
"""</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">html_ftr</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
&lt;/table&gt;
&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
"""</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<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;">"test.html"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"w"</span><span style="color: #0000FF;">)</span>
<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_hdr</span><span style="color: #0000FF;">)</span>
<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;">addresses</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<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_line</span><span style="color: #0000FF;">,</span><span style="color: #000000;">separateHouseNumber</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<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_ftr</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">system</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"test.html"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
output as perl
 
=={{header|Racket}}==
 
<syntaxhighlight lang="racket">
#lang at-exp racket
 
... same code as "Separate_the_house_number_from_the_street_name" ...
 
(require net/sendurl scribble/html)
 
(define (render-table)
(for/list ([str (in-list (string-split adressen #rx" *\r?\n *"))]
[i (in-naturals)])
(tr bgcolor: (if (even? i) "#fcf" "#cff")
(td str)
(map td (cond [(splits-adressen str) => cdr] [else '(??? ???)])))))
 
@(compose1 send-url/contents xml->string){
@html{@head{@title{Splitting Results}}
@body{@h1{Splitting Results}
@table{@render-table}}}
}
</syntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2017.09}}
Uses the code from the [[Separate_the_house_number_from_the_street_name|Separate the house number from the street name]] task almost verbatim. Included here to make a complete, runnable example.
 
<syntaxhighlight lang="raku" line>use File::Temp;
 
my $addresses = qq :to /END/;
Plataanstraat 5
Straat 12
Straat 12 II
Dr. J. Straat 12
Dr. J. Straat 12 a
Dr. J. Straat 12-14
Laan 1940 – 1945 37
Plein 1940 2
1213-laan 11
16 april 1944 Pad 1
1e Kruisweg 36
Laan 1940-’45 66
Laan ’40-’45
Langeloërduinen 3 46
Marienwaerdt 2e Dreef 2
Provincialeweg N205 1
Rivium 2e Straat 59.
Nieuwe gracht 20rd
Nieuwe gracht 20rd 2
Nieuwe gracht 20zw /2
Nieuwe gracht 20zw/3
Nieuwe gracht 20 zw/4
Bahnhofstr. 4
Wertstr. 10
Lindenhof 1
Nordesch 20
Weilstr. 6
Harthauer Weg 2
Mainaustr. 49
August-Horch-Str. 3
Marktplatz 31
Schmidener Weg 3
Karl-Weysser-Str. 6
END
 
my @row-color = '#d7fffe', '#9dbcd4';
 
# build the table
sub genTable () {
my $table = '<table border="2"> <tr bgcolor="#02ccfe">' ~
qq|<th>Address</th><th>Street</th><th>House Number</th>\n|;
my $i = 0;
for $addresses.lines -> $addr {
$table ~= qq|<tr bgcolor="{@row-color[$i++ % 2]}"><td>{$addr}</td>|;
$addr ~~ m[
( .*? )
[
\s+
(
| \d+ [ \- | \/ ] \d+
| <!before 1940 | 1945> \d+ <[ a..z I . / \x20 ]>* \d*
)
]?
$
];
quietly $table ~= qq|<td>{$0.Str}</td><td>{$1.Str||''}</td></tr>\n|;
}
$table ~ '</table>';
}
 
# generate the page content
sub content {
qq :to /END/;
<html>
<head>
<title>Rosetta Code - Start a Web Browser</title>
<meta charset="UTF-8">
</head>
<body bgcolor="#d8dcd6">
<p align="center">
<font face="Arial, sans-serif" size="5">Split the house number from the street name</font>
</p>
<p align="center">
{ genTable }
</p>
</body>
</html>
END
}
 
# Use a temporary file name and file handle
my ($fn, $fh) = tempfile :suffix('.html');
 
# dump the content to the file
$fh.spurt: content;
 
# use appropriate command for Windows or X11
# other OSs/WMs may need different invocation
my $command = $*DISTRO.is-win ?? "start $fn" !! "xdg-open $fn";
 
# start the browser
shell $command;
 
# wait for a bit to give browser time to load before destroying temp file
sleep 5;
</syntaxhighlight>
{{out}} Will start the default browser (or open a new tab/window in a running one) and display this table.
<table border="2"> <tr bgcolor="#02ccfe"><th>Address</th><th>Street</th><th>House Number</th>
<tr bgcolor="#d7fffe"><td>Plataanstraat 5</td><td>Plataanstraat</td><td>5</td></tr>
<tr bgcolor="#9dbcd4"><td>Straat 12</td><td>Straat</td><td>12</td></tr>
<tr bgcolor="#d7fffe"><td>Straat 12 II</td><td>Straat</td><td>12 II</td></tr>
<tr bgcolor="#9dbcd4"><td>Dr. J. Straat 12</td><td>Dr. J. Straat</td><td>12</td></tr>
<tr bgcolor="#d7fffe"><td>Dr. J. Straat 12 a</td><td>Dr. J. Straat</td><td>12 a</td></tr>
<tr bgcolor="#9dbcd4"><td>Dr. J. Straat 12-14</td><td>Dr. J. Straat</td><td>12-14</td></tr>
<tr bgcolor="#d7fffe"><td>Laan 1940 – 1945 37</td><td>Laan 1940 – 1945</td><td>37</td></tr>
<tr bgcolor="#9dbcd4"><td>Plein 1940 2</td><td>Plein 1940</td><td>2</td></tr>
<tr bgcolor="#d7fffe"><td>1213-laan 11</td><td>1213-laan</td><td>11</td></tr>
<tr bgcolor="#9dbcd4"><td>16 april 1944 Pad 1</td><td>16 april 1944 Pad</td><td>1</td></tr>
<tr bgcolor="#d7fffe"><td>1e Kruisweg 36</td><td>1e Kruisweg</td><td>36</td></tr>
<tr bgcolor="#9dbcd4"><td>Laan 1940-’45 66</td><td>Laan 1940-’45</td><td>66</td></tr>
<tr bgcolor="#d7fffe"><td>Laan ’40-’45</td><td>Laan ’40-’45</td><td></td></tr>
<tr bgcolor="#9dbcd4"><td>Langeloërduinen 3 46</td><td>Langeloërduinen</td><td>3 46</td></tr>
<tr bgcolor="#d7fffe"><td>Marienwaerdt 2e Dreef 2</td><td>Marienwaerdt 2e Dreef</td><td>2</td></tr>
<tr bgcolor="#9dbcd4"><td>Provincialeweg N205 1</td><td>Provincialeweg N205</td><td>1</td></tr>
<tr bgcolor="#d7fffe"><td>Rivium 2e Straat 59.</td><td>Rivium 2e Straat</td><td>59.</td></tr>
<tr bgcolor="#9dbcd4"><td>Nieuwe gracht 20rd</td><td>Nieuwe gracht</td><td>20rd</td></tr>
<tr bgcolor="#d7fffe"><td>Nieuwe gracht 20rd 2</td><td>Nieuwe gracht</td><td>20rd 2</td></tr>
<tr bgcolor="#9dbcd4"><td>Nieuwe gracht 20zw /2</td><td>Nieuwe gracht</td><td>20zw /2</td></tr>
<tr bgcolor="#d7fffe"><td>Nieuwe gracht 20zw/3</td><td>Nieuwe gracht</td><td>20zw/3</td></tr>
<tr bgcolor="#9dbcd4"><td>Nieuwe gracht 20 zw/4</td><td>Nieuwe gracht</td><td>20 zw/4</td></tr>
<tr bgcolor="#d7fffe"><td>Bahnhofstr. 4</td><td>Bahnhofstr.</td><td>4</td></tr>
<tr bgcolor="#9dbcd4"><td>Wertstr. 10</td><td>Wertstr.</td><td>10</td></tr>
<tr bgcolor="#d7fffe"><td>Lindenhof 1</td><td>Lindenhof</td><td>1</td></tr>
<tr bgcolor="#9dbcd4"><td>Nordesch 20</td><td>Nordesch</td><td>20</td></tr>
<tr bgcolor="#d7fffe"><td>Weilstr. 6</td><td>Weilstr.</td><td>6</td></tr>
<tr bgcolor="#9dbcd4"><td>Harthauer Weg 2</td><td>Harthauer Weg</td><td>2</td></tr>
<tr bgcolor="#d7fffe"><td>Mainaustr. 49</td><td>Mainaustr.</td><td>49</td></tr>
<tr bgcolor="#9dbcd4"><td>August-Horch-Str. 3</td><td>August-Horch-Str.</td><td>3</td></tr>
<tr bgcolor="#d7fffe"><td>Marktplatz 31</td><td>Marktplatz</td><td>31</td></tr>
<tr bgcolor="#9dbcd4"><td>Schmidener Weg 3</td><td>Schmidener Weg</td><td>3</td></tr>
<tr bgcolor="#d7fffe"><td>Karl-Weysser-Str. 6</td><td>Karl-Weysser-Str.</td><td>6</td></tr>
</table>
 
=={{header|Scala}}==
<!-- ==={{libheader|Scala}}=== -->
[[Category:Scala Implementations]]
Uses nothing but the Standard Library:
{{libheader|Scala}}
<syntaxhighlight lang="scala">import java.awt.Desktop
===None of its uses other than Standard Library===
<lang scala>import java.awt.Desktop
import java.io.{IOException, PrintWriter}
import java.net.{URI, ServerSocket}
Line 141 ⟶ 956:
do print("Do you want to shutdown this server? <Y(es)/N>: ") while (!scala.io.StdIn.readBoolean)
sys.exit()
}</syntaxhighlight>
}</lang>{{out}}<font face="Arial, sans-serif" size="5">Split the house number from the street name</font>
{{out}}
<font face="Arial, sans-serif" size="5">Split the house number from the street name</font>
<p align="center"><table border="10"><tr bgcolor="#9bbb59"><th></th><th>Given Address</th><th>Street</th><th>House Number</th></tr><tr bgcolor="#d8e4bc"><td>1</td><td>Plataanstraat 5</td><td>Plataanstraat</td><td>5</td></tr><tr bgcolor="#ebf1de"><td>2</td><td>Straat 12</td><td>Straat</td><td>12</td></tr><tr bgcolor="#d8e4bc"><td>3</td><td>Straat 12 II</td><td>Straat</td><td>12 II</td></tr><tr bgcolor="#ebf1de"><td>4</td><td>Straat 1940 II</td><td>Straat 1940 II</td><td></td></tr><tr bgcolor="#d8e4bc"><td>5</td><td>Dr. J. Straat40</td><td>Dr. J. Straat </td><td>40</td></tr><tr bgcolor="#ebf1de"><td>6</td><td>Dr. J. Straat 12 a</td><td>Dr. J. Straat</td><td>12 a</td></tr><tr bgcolor="#d8e4bc"><td>7</td><td>Dr. J. Straat 12-14</td><td>Dr. J. Straat</td><td>12-14</td></tr><tr bgcolor="#ebf1de"><td>8</td><td>Laan 1940 – 1945 37</td><td>Laan 1940 – 1945</td><td>37</td></tr><tr bgcolor="#d8e4bc"><td>9</td><td>Plein 1940 2</td><td>Plein 1940</td><td>2</td></tr><tr bgcolor="#ebf1de"><td>10</td><td>1213-laan 11</td><td>1213-laan</td><td>11</td></tr><tr bgcolor="#d8e4bc"><td>11</td><td>16 april 1944 Pad 1</td><td>16 april 1944 Pad</td><td>1</td></tr><tr bgcolor="#ebf1de"><td>12</td><td>1e Kruisweg 36</td><td>1e Kruisweg</td><td>36</td></tr><tr bgcolor="#d8e4bc"><td>13</td><td>Laan 1940-’45 66</td><td>Laan 1940-’45</td><td>66</td></tr><tr bgcolor="#ebf1de"><td>14</td><td>Laan ’40-’45</td><td>Laan ’40-’45</td><td></td></tr><tr bgcolor="#d8e4bc"><td>15</td><td>Langeloërduinen 3 46</td><td>Langeloërduinen</td><td>3 46</td></tr><tr bgcolor="#ebf1de"><td>16</td><td>Marienwaerdt 2e Dreef 2</td><td>Marienwaerdt 2e Dreef</td><td>2</td></tr><tr bgcolor="#d8e4bc"><td>17</td><td>Provincialeweg N205 1</td><td>Provincialeweg N205</td><td>1</td></tr><tr bgcolor="#ebf1de"><td>18</td><td>Rivium 2e Straat 59.</td><td>Rivium 2e Straat</td><td>59.</td></tr><tr bgcolor="#d8e4bc"><td>19</td><td>Nieuwe gracht 20rd</td><td>Nieuwe gracht</td><td>20rd</td></tr><tr bgcolor="#ebf1de"><td>20</td><td>Nieuwe gracht 20rd 2</td><td>Nieuwe gracht</td><td>20rd 2</td></tr><tr bgcolor="#d8e4bc"><td>21</td><td>Nieuwe gracht 20zw /2</td><td>Nieuwe gracht</td><td>20zw /2</td></tr><tr bgcolor="#ebf1de"><td>22</td><td>Nieuwe gracht 20zw/3</td><td>Nieuwe gracht</td><td>20zw/3</td></tr><tr bgcolor="#d8e4bc"><td>23</td><td>Nieuwe gracht 20 zw/4</td><td>Nieuwe gracht</td><td>20 zw/4</td></tr><tr bgcolor="#ebf1de"><td>24</td><td>Bahnhofstr. 4</td><td>Bahnhofstr.</td><td>4</td></tr><tr bgcolor="#d8e4bc"><td>25</td><td>Wertstr. 10</td><td>Wertstr.</td><td>10</td></tr><tr bgcolor="#ebf1de"><td>26</td><td>Lindenhof 1</td><td>Lindenhof</td><td>1</td></tr><tr bgcolor="#d8e4bc"><td>27</td><td>Nordesch 20</td><td>Nordesch</td><td>20</td></tr><tr bgcolor="#ebf1de"><td>28</td><td>Weilstr. 6</td><td>Weilstr.</td><td>6</td></tr><tr bgcolor="#d8e4bc"><td>29</td><td>Harthauer Weg 2</td><td>Harthauer Weg</td><td>2</td></tr><tr bgcolor="#ebf1de"><td>30</td><td>Mainaustr. 49</td><td>Mainaustr.</td><td>49</td></tr><tr bgcolor="#d8e4bc"><td>31</td><td>August-Horch-Str. 3</td><td>August-Horch-Str.</td><td>3</td></tr><tr bgcolor="#ebf1de"><td>32</td><td>Marktplatz 31</td><td>Marktplatz</td><td>31</td></tr><tr bgcolor="#d8e4bc"><td>33</td><td>Schmidener Weg 3</td><td>Schmidener Weg</td><td>3</td></tr><tr bgcolor="#ebf1de"><td>34</td><td>Karl-Weysser-Str. 6</td><td>Karl-Weysser-Str.</td><td>6</td></tr></table></p>
 
=={{header|Tcl}}==
{{works with|Tcl|8.6}}<!--required for [file tempfile]-->
<syntaxhighlight lang="tcl">package require Tcl 8.6
 
# This is identical to the address task. Skip forward to the next section...
proc split_DE_NL_address {streetAddress} {
set RE {(?x)
^ (.*?) (
(?:\s \d+ [-/] \d+)
|
(?:\s (?!1940|1945)\d+ [a-zI. /]* \d*)
)? $
}
regexp $RE $streetAddress -> str num
return [list [string trim $str] [string trim $num]]
}
 
set data {
Plataanstraat 5
Straat 12
Straat 12 II
Dr. J. Straat 12
Dr. J. Straat 12 a
Dr. J. Straat 12-14
Laan 1940 – 1945 37
Plein 1940 2
1213-laan 11
16 april 1944 Pad 1
1e Kruisweg 36
Laan 1940-’45 66
Laan ’40-’45
Langeloërduinen 3 46
Marienwaerdt 2e Dreef 2
Provincialeweg N205 1
Rivium 2e Straat 59.
Nieuwe gracht 20rd
Nieuwe gracht 20rd 2
Nieuwe gracht 20zw /2
Nieuwe gracht 20zw/3
Nieuwe gracht 20 zw/4
Bahnhofstr. 4
Wertstr. 10
Lindenhof 1
Nordesch 20
Weilstr. 6
Harthauer Weg 2
Mainaustr. 49
August-Horch-Str. 3
Marktplatz 31
Schmidener Weg 3
Karl-Weysser-Str. 6
}
 
# Construct the HTML to show
set html "<html><head><meta charset=\"UTF-8\">
<title>split_DE_NL_address</title></head><body>
<table border><tr><th>Address</th><th>Street</th><th>Number</th></tr>"
foreach streetAddress [split $data "\n"] {
set streetAddress [string trim $streetAddress]
if {$streetAddress eq ""} continue
lassign [split_DE_NL_address $streetAddress] str num
append html "<tr><td>$streetAddress</td><td>$str</td><td>$num</td></tr>"
}
append html "</table>
</body></html>"
# Pick a unique filename with .html extension (important!)
set f [file tempfile filename street.html]
fconfigure $f -encoding utf-8
puts $f $html
close $f
 
##### THE WEB BROWSER LAUNCH CODE MAGIC #####
# Relies on the default registration of browsers for .html files
# This is all very platform specific; Android requires another incantation again
if {$tcl_platform(platform) eq "windows"} {
exec {*}[auto_execok start] "" [file nativename $filename]
} elseif {$tcl_platform(os) eq "Darwin"} {
exec open $filename
} else {
exec xdg_open $filename
}</syntaxhighlight>
{{out}}
<!-- Strictly, this is just the contents of the <body> inside a <div>… --><div style="margin-left: 50px">
<table border><tr><th>Address</th><th>Street</th><th>Number</th></tr><tr><td>Plataanstraat 5</td><td>Plataanstraat</td><td>5</td></tr><tr><td>Straat 12</td><td>Straat</td><td>12</td></tr><tr><td>Straat 12 II</td><td>Straat</td><td>12 II</td></tr><tr><td>Dr. J. Straat 12</td><td>Dr. J. Straat</td><td>12</td></tr><tr><td>Dr. J. Straat 12 a</td><td>Dr. J. Straat</td><td>12 a</td></tr><tr><td>Dr. J. Straat 12-14</td><td>Dr. J. Straat</td><td>12-14</td></tr><tr><td>Laan 1940 – 1945 37</td><td>Laan 1940 – 1945</td><td>37</td></tr><tr><td>Plein 1940 2</td><td>Plein 1940</td><td>2</td></tr><tr><td>1213-laan 11</td><td>1213-laan</td><td>11</td></tr><tr><td>16 april 1944 Pad 1</td><td>16 april 1944 Pad</td><td>1</td></tr><tr><td>1e Kruisweg 36</td><td>1e Kruisweg</td><td>36</td></tr><tr><td>Laan 1940-’45 66</td><td>Laan 1940-’45</td><td>66</td></tr><tr><td>Laan ’40-’45</td><td>Laan ’40-’45</td><td></td></tr><tr><td>Langeloërduinen 3 46</td><td>Langeloërduinen</td><td>3 46</td></tr><tr><td>Marienwaerdt 2e Dreef 2</td><td>Marienwaerdt 2e Dreef</td><td>2</td></tr><tr><td>Provincialeweg N205 1</td><td>Provincialeweg N205</td><td>1</td></tr><tr><td>Rivium 2e Straat 59.</td><td>Rivium 2e Straat</td><td>59.</td></tr><tr><td>Nieuwe gracht 20rd</td><td>Nieuwe gracht</td><td>20rd</td></tr><tr><td>Nieuwe gracht 20rd 2</td><td>Nieuwe gracht</td><td>20rd 2</td></tr><tr><td>Nieuwe gracht 20zw /2</td><td>Nieuwe gracht</td><td>20zw /2</td></tr><tr><td>Nieuwe gracht 20zw/3</td><td>Nieuwe gracht</td><td>20zw/3</td></tr><tr><td>Nieuwe gracht 20 zw/4</td><td>Nieuwe gracht</td><td>20 zw/4</td></tr><tr><td>Bahnhofstr. 4</td><td>Bahnhofstr.</td><td>4</td></tr><tr><td>Wertstr. 10</td><td>Wertstr.</td><td>10</td></tr><tr><td>Lindenhof 1</td><td>Lindenhof</td><td>1</td></tr><tr><td>Nordesch 20</td><td>Nordesch</td><td>20</td></tr><tr><td>Weilstr. 6</td><td>Weilstr.</td><td>6</td></tr><tr><td>Harthauer Weg 2</td><td>Harthauer Weg</td><td>2</td></tr><tr><td>Mainaustr. 49</td><td>Mainaustr.</td><td>49</td></tr><tr><td>August-Horch-Str. 3</td><td>August-Horch-Str.</td><td>3</td></tr><tr><td>Marktplatz 31</td><td>Marktplatz</td><td>31</td></tr><tr><td>Schmidener Weg 3</td><td>Schmidener Weg</td><td>3</td></tr><tr><td>Karl-Weysser-Str. 6</td><td>Karl-Weysser-Str.</td><td>6</td></tr></table>
</div>
 
=={{header|Wren}}==
{{libheader|Wren-pattern}}
{{libheader|Wren-fmt}}
{{libheader|Wren-iterate}}
An embedded program so we can ask the C host to open the browser for us after we've created the html file.
 
The Wren code is based in part on the Nim example and uses the same color scheme.
<syntaxhighlight lang="wren">/* Starting_a_web_browser.wren */
 
import "./pattern" for Pattern
import "./fmt" for Fmt
import "./iterate" for Indexed
 
foreign class File {
foreign static remove(filename)
 
foreign static flushAll()
 
construct open(filename, mode) {}
 
foreign write(s)
 
foreign close()
}
 
class C {
foreign static system(s)
 
foreign static sleep(sec)
}
 
var digits = "0123456789"
var p = Pattern.new("+1/s")
 
var separateHouseNumber = Fn.new { |address|
var len = address.count
var splits = p.splitAll(address)
var size = splits.count
var last = splits[-1]
var penult = splits[-2]
var house
if (digits.contains(last[0])) {
if (size > 2 && digits.contains(penult[0]) && !penult.startsWith("194")) {
house = penult + " " + last
} else {
house = last
}
} else if (size > 2) {
house = penult + " " + last
} else {
house = ""
}
var street = address.take(len - house.count).join().trimEnd()
return [street, house]
}
 
var addresses = [
"Plataanstraat 5",
"Straat 12",
"Straat 12 II",
"Dr. J. Straat 12",
"Dr. J. Straat 12 a",
"Dr. J. Straat 12-14",
"Laan 1940 - 1945 37",
"Plein 1940 2",
"1213-laan 11",
"16 april 1944 Pad 1",
"1e Kruisweg 36",
"Laan 1940-'45 66",
"Laan '40-'45",
"Langeloërduinen 3 46",
"Marienwaerdt 2e Dreef 2",
"Provincialeweg N205 1",
"Rivium 2e Straat 59.",
"Nieuwe gracht 20rd",
"Nieuwe gracht 20rd 2",
"Nieuwe gracht 20zw /2",
"Nieuwe gracht 20zw/3",
"Nieuwe gracht 20 zw/4",
"Bahnhofstr. 4",
"Wertstr. 10",
"Lindenhof 1",
"Nordesch 20",
"Weilstr. 6",
"Harthauer Weg 2",
"Mainaustr. 49",
"August-Horch-Str. 3",
"Marktplatz 31",
"Schmidener Weg 3",
"Karl-Weysser-Str. 6"
]
 
var htmlHeader = """
<html>
<head>
<title>Rosetta Code - Start a Web Browser</title>
<meta charset="UTF-8">
</head>
<body bgcolor="#e6e6ff">
<p align="center">
<font face="Arial, sans-serif" size="5">Split the house number from the street name</font>
</p>
<p align="center">
<table border="2"> <tr bgcolor="#9bbb59">
<th>Address</th><th>Street</th><th>House Number</th>
"""
 
var htmlFooter = """
</table>
</p>
</body>
</html>
"""
 
var htmlFile = File.open("test.html", "w")
htmlFile.write(htmlHeader + "\n")
for (se in Indexed.new(addresses)) {
var color = (se.index & 1 == 0) ? "#ebf1de" : "#d8e4bc"
var address = se.value
var res = separateHouseNumber.call(address)
var street = res[0]
var house = res[1]
if (house == "") house = "(none)"
htmlFile.write("<tr bgcolor=%(color)><td>%(address)</td><td>%(street)</td><td>%(house)</td></tr>\n")
}
htmlFile.write(htmlFooter + "\n")
C.system("firefox test.html") // or whatever browser you use
File.flushAll() // flush all streams
C.sleep(5) // wait five seconds
File.remove("test.html") // remove the file</syntaxhighlight>
<br>
We now embed this in the following C program, compile and run it.
<syntaxhighlight lang="c">/* gcc Starting_a_web_browser.c -o Starting_a_web_browser -lwren -lm */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "wren.h"
 
/* C <=> Wren interface functions */
 
void C_fileAllocate(WrenVM* vm) {
FILE** pfp = (FILE**)wrenSetSlotNewForeign(vm, 0, 0, sizeof(FILE*));
const char *filename = wrenGetSlotString(vm, 1);
const char *mode = wrenGetSlotString(vm, 2);
*pfp = fopen(filename, mode);
}
 
void C_write(WrenVM* vm) {
FILE* fp = *(FILE**)wrenGetSlotForeign(vm, 0);
const char *s = wrenGetSlotString(vm, 1);
fputs(s, fp);
}
 
void C_close(WrenVM* vm) {
FILE* fp = *(FILE**)wrenGetSlotForeign(vm, 0);
fclose(fp);
}
 
void C_remove(WrenVM* vm) {
const char *filename = wrenGetSlotString(vm, 1);
remove(filename);
}
 
void C_flushAll(WrenVM* vm) {
fflush(NULL);
}
 
void C_system(WrenVM* vm) {
const char *s = wrenGetSlotString(vm, 1);
system(s);
}
 
void C_sleep(WrenVM* vm) {
int seconds = (int)wrenGetSlotDouble(vm, 1);
sleep(seconds);
}
 
WrenForeignClassMethods bindForeignClass(WrenVM* vm, const char* module, const char* className) {
WrenForeignClassMethods methods;
methods.allocate = NULL;
methods.finalize = NULL;
if (strcmp(module, "main") == 0) {
if (strcmp(className, "File") == 0) {
methods.allocate = C_fileAllocate;
}
}
return methods;
}
 
WrenForeignMethodFn bindForeignMethod(
WrenVM* vm,
const char* module,
const char* className,
bool isStatic,
const char* signature) {
if (strcmp(module, "main") == 0) {
if (strcmp(className, "File") == 0) {
if (!isStatic && strcmp(signature, "write(_)") == 0) return C_write;
if (!isStatic && strcmp(signature, "close()") == 0) return C_close;
if ( isStatic && strcmp(signature, "remove(_)") == 0) return C_remove;
if ( isStatic && strcmp(signature, "flushAll()") == 0) return C_flushAll;
} else if (strcmp(className, "C") == 0) {
if ( isStatic && strcmp(signature, "system(_)") == 0) return C_system;
if ( isStatic && strcmp(signature, "sleep(_)") == 0) return C_sleep;
}
}
return NULL;
}
 
static void writeFn(WrenVM* vm, const char* text) {
printf("%s", text);
}
 
void errorFn(WrenVM* vm, WrenErrorType errorType, const char* module, const int line, const char* msg) {
switch (errorType) {
case WREN_ERROR_COMPILE:
printf("[%s line %d] [Error] %s\n", module, line, msg);
break;
case WREN_ERROR_STACK_TRACE:
printf("[%s line %d] in %s\n", module, line, msg);
break;
case WREN_ERROR_RUNTIME:
printf("[Runtime Error] %s\n", msg);
break;
}
}
 
char *readFile(const char *fileName) {
FILE *f = fopen(fileName, "r");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
rewind(f);
char *script = malloc(fsize + 1);
fread(script, 1, fsize, f);
fclose(f);
script[fsize] = 0;
return script;
}
 
static void loadModuleComplete(WrenVM* vm, const char* module, WrenLoadModuleResult result) {
if( result.source) free((void*)result.source);
}
 
WrenLoadModuleResult loadModule(WrenVM* vm, const char* name) {
WrenLoadModuleResult result = {0};
if (strcmp(name, "random") != 0 && strcmp(name, "meta") != 0) {
result.onComplete = loadModuleComplete;
char fullName[strlen(name) + 6];
strcpy(fullName, name);
strcat(fullName, ".wren");
result.source = readFile(fullName);
}
return result;
}
 
int main(int argc, char **argv) {
WrenConfiguration config;
wrenInitConfiguration(&config);
config.writeFn = &writeFn;
config.errorFn = &errorFn;
config.bindForeignClassFn = &bindForeignClass;
config.bindForeignMethodFn = &bindForeignMethod;
config.loadModuleFn = &loadModule;
WrenVM* vm = wrenNewVM(&config);
const char* module = "main";
const char* fileName = "Starting_a_web_browser.wren";
char *script = readFile(fileName);
WrenInterpretResult result = wrenInterpret(vm, module, script);
switch (result) {
case WREN_RESULT_COMPILE_ERROR:
printf("Compile Error!\n");
break;
case WREN_RESULT_RUNTIME_ERROR:
printf("Runtime Error!\n");
break;
case WREN_RESULT_SUCCESS:
break;
}
wrenFreeVM(vm);
free(script);
return 0;
}</syntaxhighlight>
 
{{out}}
<pre>
Same as Nim.
</pre>
 
{{omit from|EasyLang}}
9,476

edits