Jump to content

Starting a web browser: Difference between revisions

Added Wren
(Added Wren)
Line 1,032:
<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-trait}}
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.
<lang ecmascript>import "./pattern" for Pattern
import "./fmt" for Fmt
import "./trait" 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</lang>
<br>
We now embed this in the following C program, compile and run it.
<lang c>/* gcc starting_web_browser.c -o starting_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) {
fflush(NULL);
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_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;
}</lang>
 
{{out}}
<pre>
Same as Nim.
</pre>
9,485

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.