diff --git a/ShacShifter/JekyllRDFSerializer.py b/ShacShifter/JekyllRDFSerializer.py new file mode 100644 index 0000000..73e80f3 --- /dev/null +++ b/ShacShifter/JekyllRDFSerializer.py @@ -0,0 +1,149 @@ +import logging +import uuid + + +# example class for Jekyll-RDF +class JekyllRDFSerializer: + """A Serializer that writes Template for JekyllRDF""" + + logger = logging.getLogger('ShacShifter.JekyllRDFSerializer') + content = [] + outputfile = '' + + def __init__(self, nodeShapes, outputfile): + try: + fp = open(outputfile, 'w') + self.outputfile = outputfile + fp.close + except Exception: + raise Exception('Can''t write to file {}'.format(outputfile)) + + self.content.append(''' + +\n''') + self.logger.debug(nodeShapes) + self.content.append('
\n') + self.content.append("

{{ page.rdf.iri }}

\n") + self.content.append(""" +{% assign type = page.rdf | rdf_property: "" %}\n +""") + + for nodeShape in nodeShapes: + self.nodeShapeEvaluation(nodeShapes[nodeShape], fp) + self.content.append("""
+
+ Footer
+ The data ist taken from: diggr.project +
""") + self.content.append('') + self.saveToFile() + + def saveToFile(self): + fp = open(self.outputfile, 'w') + fp.write(''.join(self.content)) + fp.close + + def nodeShapeEvaluation(self, nodeShape, fp): + """Evaluate a nodeShape. + + args: nodeShape a nodeShape object + fp + """ + + if len(nodeShape.targetClass) > 1: + self.content.append("Uebersicht") + + for tClass in nodeShape.targetClass: + self.content.append( + '

{type}


{short}


'.format( + type=tClass, short=tClass.rsplit('/', 1)[-1])) + + elif len(nodeShape.targetClass) == 1: + self.content.append('{{% if type.iri == "{type}" %}}\n\n'.format( + type=nodeShape.targetClass[0].lower())) + self.content.append("Ressource: {res} ({type})

\n\n".format( + res=nodeShape.targetClass[0].rsplit('/', 1)[-1], type=nodeShape.targetClass[0])) + + for nodes in nodeShape.targetNode: + self.logger.debug(nodes) + self.logger.debug( + 'The following ressources need to be Objects of those predicates' + ) + + for nodes in nodeShape.targetObjectsOf: + self.logger.debug(nodes) + + for nodes in nodeShape.targetSubjectsOf: + self.logger.debug(nodes) + + for property in nodeShape.properties: + if len(nodeShape.targetClass) > 0: + shapeName = nodeShape.targetClass[0].rsplit('/', 1)[-1] + else: + shapeName = "Temporary Shapename" + content = self.propertyShapeEvaluation(property, fp, shapeName) + + self.content.append(content) + + if len(nodeShape.targetClass) > 0: + resource_hack = nodeShape.targetClass[0].rsplit('/', 1)[-1] + self.content.append( + '{{% assign {resource} = page.rdf | rdf_property: '.format( + resource=resource_hack.lower())) + self.content.append( + '"<{type}/{resource}>", nil, true %}}
\n'.format( + type=nodeShape.targetClass[0].rsplit('/', 1)[-2], + resource=resource_hack.lower())) + self.content.append( + '\n{{% for {instance}_instance in {resource} '.format( + instance=nodeShape.targetClass[0].rsplit('/', 1)[-1].lower(), + resource=resource_hack.lower())) + self.content.append( + '%}}\n

{{{{ {instance}_instance.iri }}}}

\n'.format( + instance=nodeShape.targetClass[0].rsplit('/', 1)[-1].lower())) + + if len(nodeShape.targetClass) == 1: + self.content.append("\n{% endfor %}\n{% endif %}\n
") + + def propertyShapeEvaluation(self, propertyShape, fp, shapeName): + """Evaluate propertyShape and return HTML. + args: propertyShape a propertyShape object + fp + return: html string + """ + html = '' + + if isinstance(propertyShape.path, dict): + # TODO handle complex paths (inverse, oneOrMorePath ...) + self.logger.info('Complex path not supported, yet') + elif isinstance(propertyShape.path, list): + # TODO handle sequence paths + self.logger.info('Sequence path not supported, yet') + else: + uri = propertyShape.path + lowercase_str = uuid.uuid4().hex[:4] + label_jekyll = propertyShape.name['default'].lower() \ + if propertyShape.isSet['name'] and 'default' in propertyShape.name \ + else propertyShape.path.lower().rsplit('/', 1)[-1] + label_jekyll += "_" + lowercase_str + label = propertyShape.name.lower() \ + if propertyShape.isSet['name'] and 'default' in propertyShape.name \ + else propertyShape.path.lower().rsplit('/', 1)[-1] + + html += """{{% assign {label} = page.rdf | """.format(label=label_jekyll) + html += """rdf_property: "<{uri}>", nil, true %}}\n""".format(uri=uri) + + html += """{{% if {label} %}}\n""".format(label=label_jekyll) + + html += """
""" + html += """
{label}
""".format(label=label) + html += """{{% for each_{label} in {label} %}}\n""".format(label=label_jekyll) + html += """{{% if each_{label}.iri %}}\n""".format(label=label_jekyll) + html += """
Link: {{{{each_{label}}}}}
+{{% else %}}\n""".format(label=label_jekyll) + html += """
{{{{each_{label} }}}}
\n{{% endif %}}\n""".format(label=label_jekyll) + + html += """\n{% endfor %}\n
\n{% endif %}\n""" + + return html diff --git a/ShacShifter/ShacShifter.py b/ShacShifter/ShacShifter.py index f84d6cf..3920473 100644 --- a/ShacShifter/ShacShifter.py +++ b/ShacShifter/ShacShifter.py @@ -6,6 +6,7 @@ sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..'))) from ShacShifter.HTMLSerializer import HTMLSerializer +from ShacShifter.JekyllRDFSerializer import JekyllRDFSerializer from ShacShifter.RDFormsSerializer import RDFormsSerializer from ShacShifter.ShapeParser import ShapeParser import logging @@ -26,6 +27,8 @@ def shift(self, input, output, format, endpoint, ressourceIRI, namedGraph): if (format == "html"): writer = HTMLSerializer(parseResult, output, endpoint, ressourceIRI, namedGraph) writer.write() + if (format == "jekyll-rdf"): + writer = JekyllRDFSerializer(parseResult, output) elif (format == "rdforms"): writer = RDFormsSerializer(parseResult, output) writer.write() diff --git a/ShacShifter/__init__.py b/ShacShifter/__init__.py index a417ce5..49b266b 100644 --- a/ShacShifter/__init__.py +++ b/ShacShifter/__init__.py @@ -20,6 +20,7 @@ def main(args=None): parser.add_argument('-o', '--output', type=str, help="The output file") parser.add_argument('-f', '--format', type=str, choices=[ 'rdforms', + 'jekyll-rdf', 'wisski', 'html' ], help="The output format")