How to include an image in an HTML page served dynamically by Prolog?
Asked Answered
O

2

6

If I've bound my Prolog HTTP server to localhost at port 9000, how can I make Prolog generate the right path for my images? For example, if my .pl files and .jpg or .png files are located on the desktop, how do I make the server generate HTML code like this:

<img src="C:\Users\Luka\\Desktop\ImageName.ext"/>

The ext part stands for extension. I've taken a look at the documentation of SWI-Prolog and this tutorial, but I find all that abstract paths very confusing. I've got a lot of experience with web servers, but this is a lot different and I'm having awful problems understanding it.

Here is my try, composed of what I've learnt (or at least I think I have) throughout the SWI-Prolog documentation and the above-mentioned tutorial:

:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_parameters)).
:- use_module(library(http/html_write)).
file_search_path('*', 'C:\\Users\\Luka\\Desktop\\').

server(Port) :-
    http_server(http_dispatch, [port(Port)]).

:- http_handler(root(.), render_base, []).
:- http_handler('/form', process_form, []).

process_form(Request) :-
    http_parameters(Request,
            [name(Name,[atom])]),
            reply_html_page('Posted data: ',['',Name]).

render_base(_Request) :-
    reply_html_page(
        title('Naslov'),
        img([src='/image.png', alt='Incident'])
    ).

Thanks again in advance for your huge patience. :-)

Ochoa answered 18/1, 2013 at 7:34 Comment(0)
V
7

It's true that's not simple to solve your problem. Please read carefully this 'how to' page, section Serving many 'server support' files.

Here is the code I tested:

http:location(images, root(images), []).
user:file_search_path(icons, '/home/carlo/prolog').
:- http_handler(images(.), serve_files_in_directory(icons), [prefix]).

and the HTML that uses that resources

intro -->
    html([p(ol([li('select a path'),
            li('scan resources from it'),
            li('RDF-ize them'),
            li('browse with foldable SVG')
           ])),
          \sep,
          'png before', img(src='images/swipl.png'), 'png after',
          \sep,
          'jpeg before', img(src='/images/swipl.jpeg'), 'jpeg after'
         ]).

I note that both specifications img(src='images/swipl.png') and img(src='/images/swipl.jpeg') work, and this 'feature' contributes to blurry the interface behaviour.

Here the output

enter image description here

HTH

Vladamar answered 18/1, 2013 at 8:30 Comment(0)
L
1

Remember that the prolog server is indeed the SERVER, not a plug-in to apache. That means you need to have prolog serve the image. Of course it's very handy to have your web server send static files, so Carlo's example does indeed both serve the image directory and the html to include it.

Leatherworker answered 19/1, 2013 at 1:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.