Я работаю над чем-то связанным, в проекте pqConsole уже есть базовая возможность: отчет пользователю структурированные данные, содержащие активные области (ссылки), которые возвращают текущее состояние Prolog, следовательно, возможность отображать действия и реагировать соответствующим образом (надеюсь).
Он тесно связан с pqConsole::win_write_html, демонстрируя последние возможности Qt SWI-Prolog.
Вот пример фрагмента, создающего только простой отформатированный отчет, сейчас я попытаюсь добавить реактивную часть, чтобы вы могли оценить, находите ли вы выразительной эту базовую систему. Подсказки приветствуются...
/* File: win_html_write_test.pl
Author: Carlo,,,
Created: Aug 27 2013
Purpose: example usage win_html_write/1
*/
:- module(win_html_write_test,
[dir2list/1
]).
:- [library(http/html_write)].
:- [library(dirtree)].
dir2list(Path) :-
dirtree(Path, DirTree),
% sortree(compare_by_attr(name), DirTree, Sorted), !,
DirTree = Sorted,
phrase(html([\css,
\logo,
hr([]),
ul(\dirtree2html(Sorted, [])),
br([])]), Tokens),
with_output_to(atom(X), print_html(Tokens)),
win_html_write(X),
dump_page_to_debug(X).
css --> html(style(type='text/css',
['.size{color:blue;}'
])).
logo --> html(img([src=':/swipl.png'],[])).
dirtree2html(element(dir, A, S), Parents) -->
html(li([\elem2html(A),
ul(\elements2html(S, [A|Parents]))])).
dirtree2html(element(file, A, []), _Parents) -->
html(li(\elem2html(A))).
elem2html(A) -->
{memberchk(name=N, A),
memberchk(size=S, A)
},
html([span([class=name], N), ' : ', span([class=size], S)]).
elements2html([E|Es], Parents) -->
dirtree2html(E, Parents),
elements2html(Es, Parents).
elements2html([], _Parents) --> [].
dump_page_to_debug(X) :-
open('page_to_debug.html', write, S),
format(S, '<html>~n~s~n</html>~n', [X]),
close(S).
Этот фрагмент зависит от dirtree, который должен быть установлен вместе с
?- pack_install(dirtree).
редактировать С 3 модификациями отчет теперь имеет возможность вызывать редактирование файлов:
- вызов для получения путей в структуре
dir2list(Path) :-
dirtree(Path, DirTreeT),
assign_path(DirTreeT, DirTree),
...
- запрашивать специализированный вывод только для файлов
dirtree2html(element(file, A, []), _Parents) -->
html(li(\file2html(A))).
- наконец, «обработчик» — здесь просто поместите запрос на вызов редактора
file2html(A) -->
{memberchk(name=N, A),
memberchk(path=P, A),
memberchk(size=S, A)
},
html([span([class=name],
[a([href='writeln(editing(\'~s\')), edit(\'~s\')'-[N,P]], N)]
), ' : ', span([class=size], S)]).
и теперь имена файлов кликабельны, напишите сообщение и отредактируйте по запросу: картинка
![после расширения отчета ссылками на редактор](https://i.stack.imgur.com/EA5ha.png)
person
CapelliC
schedule
16.10.2013