【发布时间】:2016-11-05 01:05:13
【问题描述】:
我真的很难过渡到 Prolog 中的编码。当用户从网页提交数据时,我会尝试根据用户提交的内容返回一个显示查询结果的新页面。这是我到目前为止所拥有的。
编辑:(替换代码截取完整源代码)
:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_error)).
:- use_module(library(http/html_write)).
:- use_module(library(http/http_client)).
:- use_module(library(http/http_parameters)).
:- use_module(library(http/html_head)).
:- use_module(library(http/http_server_files)).
:- use_module(parts, [part/4]).
:- http_handler(root(.), main_query, []).
:- http_handler(root(search), search, []).
:- http_handler(root(search), part_results, []).
http:location(css, root(css), []).
server(Port) :-
http_server(http_dispatch, [port(Port)]).
:- multifile
user:body//2.
user:body(part_style, Body) -->
html(body([
div([id(top)], ['Parts']),
div(id(content), Body)
])).
main_query(Request) :-
reply_html_page(
part_style,
title('Beta Query'),
[\page_content(Request)]).
page_content(_Request) -->
{ http_link_to_id(search, [], Ref) },
html([ \html_requires(css('part-style.css')),
form([id(search), action='/search', method='POST'], [
div([id(search_table)], [
div([class(search_cell)], [
label([for=part], ' '),
select([name=part], \parts)
]),
div([class(search_cell)], [
label([for=major], ' '),
select([name=major], \majors)
]),
div([class(search_cell)], [
label([for=minor], ' '),
select([name=minor], \minors)
]),
p([], [
input([name=submit, class="button", type=submit,
value='Search'], [])
])
])
])
]).
css(URL) -->
html_post(css,
link([ type('text/css'),
rel('stylesheet'),
href(URL)
])).
part_results(Request) :-
reply_html_page(part_style,
[title('Part Results'),
\css('part-style.css'),
\html_receive(css)]).
% \query_part).
% having trouble truing query_part into DCG.
query_part(Request) :-
member(method(post), Request), !,
http_read_data(Request, Data, []),
format('Content-type: text/html~n~n', []),
format('<p>', []),
memberchk(part=Part, Data),
memberchk(major=M, Data),
memberchk(minor=I, Data),
atom_number(M, Major),
atom_number(I, Minor),
findall(p(Part, Major, Minor, Desc),
part(Part, Major, Minor, Desc), Descriptions),
maplist(desc, Descriptions),
format('</p>'),
format('<a href="http://localhost:8000" class="button">Back</a>').
desc(p(P,M,I,D)) :- format("~q ~q:~q - ~q</br>", [P,M,I,D]).
parts -->
{ findall(P, part(P, Major, Minor, Desc), Parts),
sort(Parts, Sorted) },
options(Sorted).
majors -->
{ findall(M, part(Part, M, Minor, Desc), Majors),
sort(Majors, Sorted) },
options(Sorted).
minors -->
{ findall(I, part(Part, Major, I, Desc), Minors),
sort(Minors, Sorted) },
options(Sorted).
options([]) --> [].
options([O|Os]) -->
html(option([value=O], O)),
options(Os).
尝试将此 query_part/1 定义为 DCG 让我很头疼。最初处理程序直接调用part_query/1,但现在有一个调用DCG 的part_results 规则,并且query_part 我们传递了一个Request arg。我一直在尝试阅读 DCG,但仍然不太了解它们,除了它们应该使编写规则更容易,我也不了解如何将 {} 与它们一起使用,我认为我需要这样做。 (但是,DCG 本身超出了这个问题的范围,因为它涵盖了这么多,我可以继续尝试在其他地方理解它)。所以我仍在尝试将带有查询结果的 CSS 放入回复页面。
目前,CSS 显示在 HTML 正文中。
非常感谢任何帮助。
【问题讨论】:
标签: html prolog swi-prolog