swish/commit
ADDED: Extended RDF renderer to render lists of RDF terms.
author | Jan Wielemaker |
---|---|
Fri Sep 16 11:27:18 2016 +0200 | |
committer | Jan Wielemaker |
Fri Sep 16 11:27:18 2016 +0200 | |
commit | b9a74549fb5392136b594c6aea65fb8d5c5628ae |
tree | 9b581f50f061aafd00abbd58fecdfc22d3ad4225 |
parent | d6dd11df2717ae9e481b06b2397dd527353c7d16 |
Diff style: patch stat
diff --git a/lib/swish/render/rdf.pl b/lib/swish/render/rdf.pl index 5e3dc66..74e9fc5 100644 --- a/lib/swish/render/rdf.pl +++ b/lib/swish/render/rdf.pl @@ -3,7 +3,7 @@ Author: Jan Wielemaker E-mail: J.Wielemaker@cs.vu.nl WWW: http://www.swi-prolog.org - Copyright (C): 2014, VU University Amsterdam + Copyright (C): 2016, VU University Amsterdam This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -31,33 +31,81 @@ [ term_rendering//3 % +Term, +Vars, +Options ]). :- use_module(library(semweb/rdf_db)). +:- use_module(library(http/html_write)). :- use_module(components(label)). :- use_module(library(uri)). +:- use_module(library(lists)). +:- use_module(library(apply)). :- use_module(library(swish/render)). :- register_renderer(rdf, "Render RDF terms"). /** <module> SWISH RDF renderer -Render RDF data. +Render RDF data. This turns URIs into links to the ClioPatria localview +and prints literal values using Turtle syntax. Lists of RDF terms are +rendered as an inline block with one element per line. Long lists are +truncated to the `max_depth` option of the `answer_write_options` flag. +This can be overruled using e.g., + + :- use_rendering(rdf, [max_length(100)]). */ %% term_rendering(+Term, +Vars, +Options)// % -% Renders Term as a uri. Furt +% Renders Term as a uri or Turtle syntax literal. List are +% rendered as a list of these. +term_rendering(List, _Vars, Options) --> + { is_list(List), List \== [], + maplist(is_rdf, List), + truncate(List, Truncated, Options) + }, + html(span([class('rdf-list'), style('display:inline-block')], + \rdf_list(Truncated, Options))). term_rendering(Term, _Vars, Options) --> - { ground(Term), - is_rdf(Term) - }, !, + { is_rdf(Term) }, !, rdf_link(Term, [target('cliopatria-localview')|Options]). +rdf_list([], _) --> []. +rdf_list([H|T], Options) --> + html(div(class('rdf-list-element'), + \rdf_list_elem(H, Options))), + rdf_list(T, Options). + + +rdf_list_elem(skipped(Skipped), _) --> !, + html(span(class('rdf-list-skipped'), + '... skipped ~D ...'-[Skipped])). +rdf_list_elem(Elem, Options) --> + rdf_link(Elem, [target('cliopatria-localview')|Options]). + +truncate(List, Truncated, Options) :- + ( option(max_length(Max), Options) + -> true + ; current_prolog_flag(answer_write_options, WrOptions), + option(max_depth(Max), WrOptions) + ), + length(List, Len), + Len + 1 > Max, + Start is Max - 1, + Skipped is Len-Max, + length(Prefix, Start), + append(Prefix, _, List), + last(List, Last), + append(Prefix, [skipped(Skipped), Last], Truncated). +truncate(List, List, _). + +%% is_rdf(@Term) +% +% True if Term is an RDF term. + is_rdf(Term) :- is_uri(Term), !. is_rdf(literal(Value)) :- is_literal(Value). -is_rdf(^^(_,Type)) :- atom(Type). -is_rdf(@(_,Lang)) :- atom(Lang). +is_rdf(^^(Value,Type)) :- atom(Type), ground(Value). +is_rdf(@(Text,Lang)) :- atom(Lang), is_text(Text). is_uri(Term) :- atom(Term), @@ -68,7 +116,10 @@ is_uri(Term) :- is_literal(Atomic) :- is_plain_literal(Atomic). is_literal(type(Type, Literal)) :- is_uri(Type), is_plain_literal(Literal). -is_literal(lang(Lang, Literal)) :- atom(Lang), is_plain_literal(Literal). +is_literal(lang(Lang, Literal)) :- atom(Lang), is_text(Literal). is_plain_literal(Value) :- atomic(Value). + +is_text(Value) :- atom(Value), !. +is_text(Value) :- string(Value).