swigra2_httpd.pl 7.54 KB
% -*- prolog -*-

% To ze wzgledu na Windows, gdzie UTF-8 nie wydaje sie byc domyslny:
:-encoding(utf8).
:-set_prolog_flag(encoding,utf8).


%:-use_module(library(http/xpce_httpd)).
:-use_module(library(http/thread_httpd)).
:-use_module(library(http/http_dispatch)).
:-use_module(library(http/http_parameters)).
:-use_module(library(http/html_write)).

:-html_set_options([dialect(xhtml)]).

% Potrzebne moduły Birnama i Świgry:
:-[
   birnam_run,
   birnam_dumpedges,
   forest2xml,
   gfjp_morfologia,
   gfjp_slowskr,
   gfjp_slowpart,
   slowczas, slowrzecz, slowprzym, slowwykrz,
   gfjp_analiza,
   gfjp2_wymagania,
   birnam_sequences,
   gfjp2_warunki,
   gfjp2,
   gfjp2_arnoscint,
   gfjp_swidzinskify
].

% moduł dumpedges pisze do pliku, potrzebujemy to zmienić, żeby od
% razu poddać wynik transformacji do XML-a:

:-abolish(dumpterm/1).
dumpterm(porazka) :- !.
dumpterm(T) :-
	assertz(T).

parsuj(T) :-
	analiza(T),
	statprint(sent_id,no_id), % forest2xml wymaga identyfikatora zdania
	open('./httpd/forest.xml',write,XMLStream,[encoding(utf8)]),
	forest2xml(XMLStream),
	close(XMLStream),
	retractall(known_identifier(_,_,_,_)),
	abolish(edge/6),
	abolish(info/2).

%with_output_to(string(A),(set_stream(current_output,encoding(utf8)),f2x)).

% zaszłość ze Świgry 1, której już nie potrzebujemy:
:-abolish(dodajprzec/3).
dodajprzec(_Od, _Do, _Add).


% Predykat odpowiadający na przychodzące do serwera żądanie /swigra :
run_świgra(Request) :-
	http_parameters(Request,
	[q(Text, [default('Czytali.'), length =< 200])]
        ),
%	świgruj(Text),
	catch(świgruj(Text),morf(nieznane,Ign), generuj_przeprosiny_morf(Text,Ign)),
	retractall(known_identifier(_,_,_,_)),
	abolish(edge/6),
	abolish(info/2).

świgruj(Text) :-
    analiza(Text),
    statprint(sent_id,no_id), % forest2xml wymaga identyfikatora zdania
    open('./httpd/forest.xml',write,XMLStream,[encoding(utf8)]),
    forest2xml(XMLStream),
    close(XMLStream),
    shell('cd ../disambiguator-pcfg; python disamb-tree.py ../parser/httpd/forest.xml'),
    generate_the_page(Text).

generuj_przeprosiny_morf(Text,Ign) :-
    length(Ign, Ilu),
    (Ilu > 1 *->
	     format(atom(Przepro), 'Niestety nie znam ~p słów: ~p.', [Ilu, Ign])
     ;
	     format(atom(Przepro), 'Niestety nie znam słowa „~p”.', Ign)
    ),
    reply_html_page(
	    [title('Świgra: ~p' - [Text]),
	     link([ href('swigra.css'), rel(stylesheet), type('text/css')], [])
	    ],
        body([],
	     [ center(table([width('98%'), border(0 ),
		      cellpadding(0 ), cellspacing(2 )],
		     [tr(td([bgcolor('#26264f'),height(14)],
			    [])),
		      tr(td([bgcolor('#c3d0e4'),height(24)],
			    [p(class(tytul),
			       ['Analizator składniowy ', em('Świgra 2')])])),
		      tr(td([bgcolor('#26264f'),height(7)], [])),
		      tr(td([ 
%% p('W poniższym polu prosimy wpisać kompletne zdanie do analizy (z uwzględnieniem znaków interpunkcyjnych).'),
			      \generate_query_form(Text)
			      ])),
		      tr(td([bgcolor('#26264f'),height(5)],
			    [])),
		      p([],Przepro),
		      p([],'W sumie mógłbym zgadywać, ale wyniki będą pewnie lepsze, jeśli użyjesz innego słowa o tej samej charakterystyce.'),
		      tr(td([bgcolor('#778899'),height(24),align(right)],
		      'Copyright © 2007–2016 by Instytut Podstaw Informatyki PAN')),
		      tr(td([bgcolor('#26264f'),height(7)],
			    []))
		     ]))
    ])).    


% Generowanie szkieletu strony WWW:

generate_the_page(Text) :-
	reply_html_page(
	[title('Świgra: ~p' - [Text]),
	 link([ href('swigra.css'), rel(stylesheet), type('text/css')], []),
	 script([ type('application/javascript'), src('viewer.js') ],[]),
	 script([ type('application/javascript'), src('viewer_helpers.js') ],[]),
	 script([ type('application/javascript')], \ ['<![CDATA[
function init() {
','
	var viewer = new forestviewer(document.getElementById("viewer"));
','
	viewer.helper = tree_helpers;
	viewer.style = "simple";
	viewer.variablewidth = true;
	viewer.nativescroll = true;
','
	viewer.location = "forest-disamb.xml";
	viewer.display.height=500;
        viewer.display.style.position = "relative";
}]]>']),
	 link([ href('viewer.css'), rel(stylesheet), 
	        type('text/css')], [])
        ],
        body([onload('init()')],
	     [ center(table([width('98%'), border(0 ),
		      cellpadding(0 ), cellspacing(2 )],
		     [tr(td([bgcolor('#26264f'),height(14)],
			    [])),
		      tr(td([bgcolor('#c3d0e4'),height(24)],
			    [p(class(tytul),
			       ['Analizator składniowy ', em('Świgra 2')])])),
		      tr(td([bgcolor('#26264f'),height(7)], [])),
		      tr(td([ 
%% p('W poniższym polu prosimy wpisać kompletne zdanie do analizy (z uwzględnieniem znaków interpunkcyjnych).'),
			      \generate_query_form(Text)
			      ])),
		      tr(td([bgcolor('#26264f'),height(5)],
			    [])),
		      div([id(viewer)],[]),
		      div([id(generalinfo)],[]),
		      \generate_statistics,
		      tr(td([bgcolor('#778899'),height(24),align(right)],
		      'Copyright © 2007–2016 by Instytut Podstaw Informatyki PAN')),
		      tr(td([bgcolor('#26264f'),height(7)],
			    []))
		     ]))
    ])).

%% To jest za nowe (można kiedyś spróbować przywrócić, wtedy będzie
%% można użyć normalnego reply_html_page powyżej):
%% (Ale właściwie nie ma powodu, bo okazało się, że atrybut da się dodać. Zob.wyż.)
%% :- multifile
%%         user:body//2.
%%
%% user:body(_, Body) -->
%%         html(body([onload('init()')], div(Body))).


% Formularz pozwalający wpisać zdanie:

generate_query_form(Text) -->
	html( form( ['accept-charset'('UTF-8'),
		     action('swigra'), method('get')],
		    [p([ input( [size( 80 ),
				 name(q),
				 value(Text)],
				[]),
			 ' ',
			 input( [type(submit),
				 value('Analizuj')],
				[])
			])
		     ])
	      ).

% Część statystyczna strony:

generate_statistics -->
	{ info(parse_inferences, Infer),
	info(parse_cputime, CPU),
	info(trees, Trees),
	info(edges,Edges),
	(info(useful_edges,Useful)-> true; Useful=0) },
	html(table([tr([td('Drzew:'),td(Trees)]),
  	      tr([td('Czas analizy (s):'),td(CPU)]),
  	      tr([td('Krawędzi:'),td(Edges)]),
  	      tr([td('Użytecznych krawędzi:'),td(Useful)]),
	      tr([td('Kroków wywodu:'),td(Infer)])
	  ])
      ).

:- http_handler('/', run_świgra, []).
:- http_handler('/index.html', run_świgra, []).
:- http_handler('/swigra', run_świgra, [prefix]).

:- http_handler('/swigra.css', http_reply_file('httpd/swigra.css',[]), []).

:- http_handler('/forest.xml', http_reply_file('httpd/forest.xml',[]), []).
:- http_handler('/forest-disamb.xml', http_reply_file('httpd/forest-disamb.xml',[]), []).
:- http_handler('/viewer.xhtml', http_reply_file('httpd/viewer.xhtml',[]),[]).
:- http_handler('/viewer.css', http_reply_file('httpd/viewer.css',[]), []).
:- http_handler('/viewer.js', http_reply_file('httpd/viewer.js',[]), []).
:- http_handler('/viewer_helpers.js',
	http_reply_file('httpd/viewer_helpers.js',[]), []).
:- http_handler('/img/gtk-right.png',
	http_reply_file('httpd/gtk-right.png',[]), []).
:- http_handler('/img/gtk-left.png',
	http_reply_file('httpd/gtk-left.png',[]), []).
:- http_handler('/img/pinned.png',
	http_reply_file('httpd/pinned.png',[]), []).
:- http_handler('/img/unpinned.png',
	http_reply_file('httpd/unpinned.png',[]), []).

:- Port = 3333,
	http_server(http_dispatch, [ port(Port) ]),
	format(
"~N************************************************************************

                 Świgra 2 gotowa do pracy pod adresem:

	                  http://localhost:~a/swigra

		      Skieruj tam swojego Firefoksa.", [Port]),
	format("

************************************************************************
").