#!/usr/bin/env python3 from rdflib import URIRef, BNode, Literal, Graph, Namespace from rdflib.namespace import RDF, NamespaceManager from urllib.parse import urlparse import sys from itertools import chain, groupby from jinja2 import Environment from formatRefs import first from rdf import RDFWalker if __name__ == '__main__': env = Environment () env.filters['urlparse'] = urlparse template = env.from_string (""" {% macro schemaval(n, name, tag='span') -%} <{{ tag }} property="{{ name }}">{{ n|attr(name) }} {%- endmacro %} {%- for companyname, software in items %} {% set company = companyname._ %}
{{ schemaval(company, 'name', 'h3') }} {% set addr = company.address %}

{% if addr.streetAddress %}{{ schemaval(addr, 'streetAddress') }}
{% elif addr.postOfficeBoxNumber %}PO box {{ schemaval(addr, 'postOfficeBoxNumber') }}
{% endif %} {{ schemaval(addr, 'postalCode') }} {{ schemaval(addr, 'addressLocality') }}

{% set url = company.url %} {% if url %}

{{ url }}

{% endif %}
{%- for s in software|sort(attribute='name') %}

{{ schemaval(s, 'name') }}{% if s.softwareVersion %} ({{ schemaval(s, 'softwareVersion') }}){% endif %}

{% if s.dateCreated %}{{ schemaval(s, 'dateCreated') }} {% if s.datePublished %}/{{ schemaval(s, 'datePublished') }}{% endif %} {% elif s.datePublished %}{{ schemaval(s, 'datePublished') }} {% endif %}

{% if s.description %}{{ schemaval(s, 'description', 'p') }}{% endif %}
    {% for o in s.offers_|sort(attribute='name') %}
  • {% if o.name %}{{ schemaval(o, 'name') }}, {% endif %} {{ schemaval(o.priceSpecification, 'price') }} {{ schemaval(o.priceSpecification, 'priceCurrency') }}, {{ schemaval(o, 'validFrom') }}{% if o.validThrough and o.validFrom != o.validThrough %}–{{ schemaval(o, 'validThrough') }}{% endif %}
  • {% endfor %}
{% endfor -%}
{% endfor %}""") g = Graph() result = g.parse (sys.stdin, format='turtle') s = Namespace ("https://schema.org/") items = [] for n in g.subjects (RDF.type, s.SoftwareApplication): n = RDFWalker (g, s, n) if n.author: items.append (n) items = groupby (sorted (items, key=lambda x: str (x.author.name).lower ()), lambda x: x.author.name) print (template.render(items=items))