【问题标题】:How to add CSS (w/ query results) into dynamic reply_html_page in Prolog?如何在 Prolog 中将 CSS(带查询结果)添加到动态 reply_html_page 中?
【发布时间】: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


    【解决方案1】:

    我有几个关于这个的问题:

    立即解决

    首先,为您的任务提供一个解决方案:要发布资源,只需在part_results/1 中使用css//1 非终端:

    part_results(请求):- 回复_html_page(part_style, [标题('部分结果'), \css('myfile.css'), \html_receive(css)], \查询部分)。

    这足以获得你想要的。您使用 css//1 的方式与在 HTTP 框架中使用任何其他非终端的方式完全相同,使用 (\)/1 espace 语法。

    不同的解决方案

    获得几乎相同结果不同解决方案是使用html_requires//1

    part_results(请求):- 回复_html_page(part_style, [标题('部分结果'), \html_requires(css('my-style.css'))], \查询部分)。

    这是来自 library(http/html_head) 的库谓词,基本上完成了您目前手动所做的工作。

    请注意,您需要使用library(http/http_server_files) 来定义资源文件所需的位置。对于 CSS 文件,预定义的位置是 root(css),因此您需要将 css 文件放在 css/* 中,这与您手动执行的操作不同。

    为什么只有身体?

    在您的原始示例中,为什么只发出 body?答案:因为你没有发出任何其他东西

    请注意,您可以简单地在当前输出中自己发出整个页面,而不是使用reply_html_page/3。这当然要求你发射你想要的一切,而不仅仅是身体。

    一般建议

    下一次,请发布一个自包含示例,而不仅仅是部分sn-ps,以便其他人更容易尝试您的代码。

    这意味着:

    • 包括所有必要的库
    • 说明如何启动服务器
    • 展示如何访问服务器

    【讨论】:

    • 我用完整的代码编辑了 OP(我猜我之前以为我只做相关的事情,然后发现它不是)。此外,一种解决方案是否优于另一种解决方案(例如,一种更灵活)?目前,CSS 显示在 HTML 的正文中。
    • 您的编辑改变了问题的范围,请不要这样做!请重新编辑您的问题以询问以前的问题,因为答案回答了您最初提出的问题。请针对您的其他问题提出单独的问题。关于不同的方法,这本身也值得提出一个问题。大致的区别是: 输出纯文本很简单,但容易出错;使用 HTML 基础架构需要学习基础架构;使用html_requires//1 很简单,使用post/receive 是最灵活和通用的,因为您可以随时发布。
    • 改变了范围?我在编辑之前重读了一遍,我仍然追求相同的目标,试图获得一个包含 CSS 的回复页面。不太清楚这与 OP 有何不同。我仍在尝试将 CSS 组合到 html 回复中,并且仍然坚持尝试定义 DCG query_part/1。这都是一样的。我所做的大部分工作是按照您的要求添加完整的源代码。
    • 您已添加:“我一直在尝试阅读 DCG,但除了它们应该使编写规则更容易之外,仍然不太了解它们,我也不了解如何使用 {}和他们在一起,我认为我需要这样做。”,这是一个比“如何在 Prolog 中将 CSS 添加到动态回复_html_page?”更普遍的问题,这是您最初提出的问题。请保留问题的原始范围,因为更改它可能会使现有答案不适用。最好针对您的其他问题提出一个新问题!见dcgresources
    • 我不断看到使用 DCG 的解决方案,这就是我提到它们的原因(因为通常查询在 DCG 内),但同样,DCG 不是我的问题。一直都是 CSS 和查询结果进入回复页面。
    猜你喜欢
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2019-12-30
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多