[tracker/wip/carlosg/domain-ontologies: 58/93] docs: Unify ontology documentation tools
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/domain-ontologies: 58/93] docs: Unify ontology documentation tools
- Date: Mon, 19 Jun 2017 23:05:05 +0000 (UTC)
commit e61749f98d8832acd43f5b48588fbd17f25e86d8
Author: Carlos Garnacho <carlosg gnome org>
Date: Thu Jun 15 17:46:34 2017 +0200
docs: Unify ontology documentation tools
Now we have a single tool for the general ontology documentation
and the per-class/property one.
docs/reference/ontology/Makefile.am | 2 +-
docs/reference/ontology/ontology-docs.sgml | 2 +-
docs/tools/Makefile.am | 9 +-
docs/tools/gen-doc.sh | 49 ----------
docs/tools/ttl2sgml.c | 122 +++++++++++++++++++------
docs/tools/ttl_loader.c | 137 +++++----------------------
docs/tools/ttl_loader.h | 13 ++-
docs/tools/ttl_sgml.c | 14 ++-
docs/tools/ttl_sgml.h | 4 +-
docs/tools/ttlresource2sgml.c | 95 +++++++------------
docs/tools/ttlresource2sgml.h | 35 +++++++
11 files changed, 215 insertions(+), 267 deletions(-)
---
diff --git a/docs/reference/ontology/Makefile.am b/docs/reference/ontology/Makefile.am
index 6414e51..42fe722 100644
--- a/docs/reference/ontology/Makefile.am
+++ b/docs/reference/ontology/Makefile.am
@@ -13,7 +13,7 @@ ONTOLOGY_INTRODUCTIONS = \
# Generation of the ontology XML files.
gen-doc.stamp: $(ONTOLOGY_INTRODUCTIONS)
$(MKDIR_P) xml
- $(top_srcdir)/docs/tools/gen-doc.sh $(top_builddir)/docs/tools/ttl2sgml
$(top_builddir)/docs/tools/ttlresource2sgml $(top_srcdir)/src/ontologies/nepomuk xml/
+ $(top_builddir)/docs/tools/ttl2sgml -d $(top_srcdir)/src/ontologies/nepomuk -o xml/
$(AM_V_GEN) touch $@
version.xml: gen-doc.stamp
diff --git a/docs/reference/ontology/ontology-docs.sgml b/docs/reference/ontology/ontology-docs.sgml
index 440e65c..b878f2f 100644
--- a/docs/reference/ontology/ontology-docs.sgml
+++ b/docs/reference/ontology/ontology-docs.sgml
@@ -53,6 +53,6 @@
<xi:include href="xml/slo-ontology.xml" />
<xi:include href="xml/tracker-ontology.xml" />
<xi:include href="xml/maemo-ontology.xml" />
- <xi:include href="xml/libosinfo-ontology.xml" />
+ <xi:include href="xml/osinfo-ontology.xml" />
</part>
</book>
diff --git a/docs/tools/Makefile.am b/docs/tools/Makefile.am
index b067d2f..3f77f17 100644
--- a/docs/tools/Makefile.am
+++ b/docs/tools/Makefile.am
@@ -1,4 +1,4 @@
-noinst_PROGRAMS = ttl2sgml ttlresource2sgml
+noinst_PROGRAMS = ttl2sgml
AM_CPPFLAGS = \
$(BUILD_CFLAGS) \
@@ -24,12 +24,9 @@ TTL_LOADER_FILES = \
ttl2sgml_SOURCES = \
$(TTL_LOADER_FILES) \
+ ttlresource2sgml.c \
+ ttlresource2sgml.h \
ttl2sgml.c
-ttlresource2sgml_SOURCES = \
- $(TTL_LOADER_FILES) \
- ttlresource2sgml.c
-
EXTRA_DIST = \
- gen-doc.sh \
meson.build
diff --git a/docs/tools/ttl2sgml.c b/docs/tools/ttl2sgml.c
index 065d445..f3b46bc 100644
--- a/docs/tools/ttl2sgml.c
+++ b/docs/tools/ttl2sgml.c
@@ -24,31 +24,85 @@
#include "ttl_loader.h"
#include "ttl_model.h"
#include "ttl_sgml.h"
+#include "ttlresource2sgml.h"
-static gchar *desc_file = NULL;
-static gchar *output_file = NULL;
+static gchar *ontology_dir = NULL;
+static gchar *output_dir = NULL;
static GOptionEntry entries[] = {
- { "desc", 'd', 0, G_OPTION_ARG_FILENAME, &desc_file,
- "TTL file with the ontology description and documentation",
+ { "ontology-dir", 'd', 0, G_OPTION_ARG_FILENAME, &ontology_dir,
+ "Ontology directory",
NULL
},
- { "output", 'o', 0, G_OPTION_ARG_FILENAME, &output_file,
+ { "output-dir", 'o', 0, G_OPTION_ARG_FILENAME, &output_dir,
"File to write the output (default stdout)",
NULL
},
{ NULL }
};
+static gint
+compare_files (gconstpointer a,
+ gconstpointer b)
+{
+ const GFile *file_a = a, *file_b = b;
+ gchar *basename_a, *basename_b;
+ gint res;
+
+ basename_a = g_file_get_basename ((GFile*) file_a);
+ basename_b = g_file_get_basename ((GFile*) file_b);
+ res = strcmp (basename_a, basename_b);
+
+ g_free (basename_a);
+ g_free (basename_b);
+
+ return res;
+}
+
+static GList *
+get_description_files (GFile *dir)
+{
+ GFileEnumerator *enumerator;
+ GFileInfo *info;
+ GFile *desc_file;
+ GList *files;
+ const gchar *name;
+
+ enumerator = g_file_enumerate_children (dir,
+ G_FILE_ATTRIBUTE_STANDARD_NAME,
+ G_FILE_QUERY_INFO_NONE,
+ NULL, NULL);
+
+ if (!enumerator) {
+ return NULL;
+ }
+
+ files = NULL;
+
+ while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) {
+ name = g_file_info_get_name (info);
+
+ if (g_str_has_suffix (name, ".description")) {
+ desc_file = g_file_enumerator_get_child (enumerator, info);
+ files = g_list_insert_sorted (files, desc_file, compare_files);
+ }
+
+ g_object_unref (info);
+ }
+
+ g_object_unref (enumerator);
+
+ return files;
+}
+
gint
main (gint argc, gchar **argv)
{
GOptionContext *context;
Ontology *ontology = NULL;
OntologyDescription *description = NULL;
- gchar *ttl_file = NULL;
- gchar *dirname = NULL;
- FILE *f = NULL;
+ GList *description_files, *l;
+ GFile *ontology_file, *output_file;
/* Translators: this messagge will apper immediately after the */
/* usage string - Usage: COMMAND [OPTION]... <THIS_MESSAGE> */
@@ -59,11 +113,11 @@ main (gint argc, gchar **argv)
g_option_context_add_main_entries (context, entries, NULL);
g_option_context_parse (context, &argc, &argv, NULL);
- if (!desc_file) {
+ if (!ontology_dir || !output_dir) {
gchar *help;
g_printerr ("%s\n\n",
- "Description file is mandatory");
+ "Ontology and output dirs are mandatory");
help = g_option_context_get_help (context, TRUE, NULL);
g_option_context_free (context);
@@ -73,32 +127,44 @@ main (gint argc, gchar **argv)
return -1;
}
- if (output_file) {
- f = fopen (output_file, "w");
- } else {
- f = stdout;
+ ontology_file = g_file_new_for_path (ontology_dir);
+ output_file = g_file_new_for_path (output_dir);
+ description_files = get_description_files (ontology_file);
+
+ if (!description_files) {
+ g_printerr ("Ontology description files not found in dir\n");
+ return -1;
}
- g_assert (f != NULL);
- description = ttl_loader_load_description (desc_file);
+ ontology = ttl_loader_new_ontology ();
- dirname = g_path_get_dirname (desc_file);
- ttl_file = g_build_filename (dirname,
- description->relativePath,
- NULL);
+ for (l = description_files; l; l = l->next) {
+ Ontology *file_ontology = NULL;
+ GFile *ttl_file, *ttl_output_file;
+ gchar *filename;
- ontology = ttl_loader_load_ontology (ttl_file);
- g_free (ttl_file);
- g_free (dirname);
+ description = ttl_loader_load_description (l->data);
+ ttl_file = g_file_get_child (ontology_file, description->relativePath);
- ttl_sgml_print (description, ontology, f);
+ filename = g_strdup_printf ("%s-ontology.xml", description->localPrefix);
+ ttl_output_file = g_file_get_child (output_file, filename);
+ g_free (filename);
- ttl_loader_free_ontology (ontology);
- ttl_loader_free_description (description);
+ file_ontology = ttl_loader_new_ontology ();
- g_option_context_free (context);
+ ttl_loader_load_ontology (ontology, ttl_file);
+ ttl_loader_load_ontology (file_ontology, ttl_file);
+ ttl_loader_load_prefix_from_description (ontology, description);
+
+ ttl_sgml_print (description, file_ontology, ttl_output_file);
+
+ ttl_loader_free_ontology (file_ontology);
+ ttl_loader_free_description (description);
+ }
+
+ generate_ontology_class_docs (ontology, output_file);
- fclose (f);
+ g_option_context_free (context);
return 0;
}
diff --git a/docs/tools/ttl_loader.c b/docs/tools/ttl_loader.c
index 92a518b..4f882d0 100644
--- a/docs/tools/ttl_loader.c
+++ b/docs/tools/ttl_loader.c
@@ -336,13 +336,11 @@ load_description (OntologyDescription *desc,
}
}
-
Ontology *
-ttl_loader_load_ontology (const gchar *ttl_file)
+ttl_loader_new_ontology (void)
{
Ontology *ontology;
- g_debug ("Loading ontology... %s\n", ttl_file);
ontology = g_new0 (Ontology, 1);
ontology->classes = g_hash_table_new_full (g_str_hash,
g_str_equal,
@@ -356,138 +354,55 @@ ttl_loader_load_ontology (const gchar *ttl_file)
ontology->prefixes = g_hash_table_new_full (g_str_hash,
g_str_equal,
g_free, g_free);
-
- if (ttl_file) {
- TrackerTurtleReader *reader;
- GError *error = NULL;
- GFile *file = g_file_new_for_path (ttl_file);
-
- reader = tracker_turtle_reader_new (file, NULL);
- g_object_unref (file);
-
- while (error == NULL && tracker_turtle_reader_next (reader, &error)) {
- load_in_memory (ontology,
- tracker_turtle_reader_get_subject (reader),
- tracker_turtle_reader_get_predicate (reader),
- tracker_turtle_reader_get_object (reader));
- }
-
- g_object_unref (reader);
-
- if (error) {
- g_message ("Turtle parse error: %s", error->message);
- g_error_free (error);
- }
- } else {
- g_warning ("Unable to open '%s'", ttl_file);
- }
-
return ontology;
}
-static GList *
-get_ontology_files (GFile *dir)
+void
+ttl_loader_load_ontology (Ontology *ontology,
+ GFile *ttl_file)
{
- GFileEnumerator *enumerator;
- GFileInfo *info;
- GList *files;
- const gchar *name;
-
- enumerator = g_file_enumerate_children (dir,
- G_FILE_ATTRIBUTE_STANDARD_NAME,
- G_FILE_QUERY_INFO_NONE,
- NULL, NULL);
-
- if (!enumerator) {
- return NULL;
- }
-
- files = NULL;
+ TrackerTurtleReader *reader;
+ GError *error = NULL;
- while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) {
- name = g_file_info_get_name (info);
+ g_return_if_fail (G_IS_FILE (ttl_file));
- if (g_str_has_suffix (name, ".ontology")) {
- files = g_list_insert_sorted (files, g_strdup (name),
- (GCompareFunc) g_strcmp0);
- }
+ reader = tracker_turtle_reader_new (ttl_file, NULL);
- g_object_unref (info);
+ while (error == NULL && tracker_turtle_reader_next (reader, &error)) {
+ load_in_memory (ontology,
+ tracker_turtle_reader_get_subject (reader),
+ tracker_turtle_reader_get_predicate (reader),
+ tracker_turtle_reader_get_object (reader));
}
- g_object_unref (enumerator);
+ g_object_unref (reader);
- return files;
+ if (error) {
+ g_message ("Turtle parse error: %s", error->message);
+ g_error_free (error);
+ }
}
-Ontology *
-ttl_loader_load_ontology_dir (const gchar *ttl_dir)
+void
+ttl_loader_load_prefix_from_description (Ontology *ontology,
+ OntologyDescription *description)
{
- GFile *dir = g_file_new_for_path (ttl_dir);
- Ontology *ontology;
- GList *files, *f;
-
- ontology = g_new0 (Ontology, 1);
- ontology->classes = g_hash_table_new_full (g_str_hash,
- g_str_equal,
- g_free,
- (GDestroyNotify)ttl_model_class_free);
-
- ontology->properties = g_hash_table_new_full (g_str_hash,
- g_str_equal,
- g_free,
- (GDestroyNotify)ttl_model_property_free);
- ontology->prefixes = g_hash_table_new_full (g_str_hash,
- g_str_equal,
- g_free, g_free);
-
- files = get_ontology_files (dir);
- g_object_unref (dir);
-
- for (f = files; f; f = f->next) {
- TrackerTurtleReader *reader;
- GError *error = NULL;
- gchar *ttl_file;
- GFile *file;
-
- ttl_file = g_build_filename (ttl_dir, f->data, NULL);
- file = g_file_new_for_path (ttl_file);
- reader = tracker_turtle_reader_new (file, NULL);
- g_object_unref (file);
- g_free (ttl_file);
-
- while (error == NULL && tracker_turtle_reader_next (reader, &error)) {
- load_in_memory (ontology,
- tracker_turtle_reader_get_subject (reader),
- tracker_turtle_reader_get_predicate (reader),
- tracker_turtle_reader_get_object (reader));
- }
-
- g_object_unref (reader);
-
- if (error) {
- g_message ("Turtle parser error: %s", error->message);
- g_error_free (error);
- break;
- }
+ if (!g_hash_table_lookup (ontology->prefixes, description->baseUrl)) {
+ g_hash_table_insert (ontology->prefixes,
+ g_strdup (description->baseUrl),
+ g_strdup (description->localPrefix));
}
-
- return ontology;
}
OntologyDescription *
-ttl_loader_load_description (const gchar *filename)
+ttl_loader_load_description (GFile *file)
{
OntologyDescription *desc;
TrackerTurtleReader *reader;
GError *error = NULL;
- GFile *file;
desc = ttl_model_description_new ();
-
- file = g_file_new_for_path (filename);
reader = tracker_turtle_reader_new (file, NULL);
- g_object_unref (file);
while (error == NULL && tracker_turtle_reader_next (reader, &error)) {
load_description (desc,
diff --git a/docs/tools/ttl_loader.h b/docs/tools/ttl_loader.h
index 0edeb02..1f4fc50 100644
--- a/docs/tools/ttl_loader.h
+++ b/docs/tools/ttl_loader.h
@@ -21,16 +21,19 @@
#define __TTL_LOADER_H__
#include <glib.h>
+#include <gio/gio.h>
#include "ttl_model.h"
G_BEGIN_DECLS
-void ttl_loader_init (void);
-void ttl_loader_shutdown (void);
+Ontology * ttl_loader_new_ontology (void);
-Ontology * ttl_loader_load_ontology (const gchar *filename);
-Ontology * ttl_loader_load_ontology_dir(const gchar *dir);
-OntologyDescription * ttl_loader_load_description (const gchar *filename);
+void ttl_loader_load_ontology (Ontology *ontology,
+ GFile *filename);
+OntologyDescription * ttl_loader_load_description (GFile *filename);
+
+void ttl_loader_load_prefix_from_description (Ontology *ontology,
+ OntologyDescription *description);
void ttl_loader_free_ontology (Ontology *ontology);
void ttl_loader_free_description (OntologyDescription *desc);
diff --git a/docs/tools/ttl_sgml.c b/docs/tools/ttl_sgml.c
index b041def..3526e9d 100644
--- a/docs/tools/ttl_sgml.c
+++ b/docs/tools/ttl_sgml.c
@@ -196,12 +196,17 @@ print_ontology_class (Ontology *ontology,
void
ttl_sgml_print (OntologyDescription *description,
- Ontology *ontology,
- FILE *f)
+ Ontology *ontology,
+ GFile *file)
{
GHashTableIter iter;
- gchar *upper_name;
+ gchar *upper_name, *path;
OntologyClass *def;
+ FILE *f;
+
+ path = g_file_get_path (file);
+ f = fopen (path, "w");
+ g_assert (f != NULL);
upper_name = g_ascii_strup (description->localPrefix, -1);
print_sgml_header (f, description);
@@ -220,5 +225,6 @@ ttl_sgml_print (OntologyDescription *description,
g_fprintf (f, "</section>\n");
print_sgml_footer (f);
- g_free (upper_name);
+ g_free (upper_name);
+ fclose (f);
}
diff --git a/docs/tools/ttl_sgml.h b/docs/tools/ttl_sgml.h
index b2d9f23..ece602e 100644
--- a/docs/tools/ttl_sgml.h
+++ b/docs/tools/ttl_sgml.h
@@ -27,8 +27,8 @@
G_BEGIN_DECLS
void ttl_sgml_print (OntologyDescription *description,
- Ontology *ontology,
- FILE *output);
+ Ontology *ontology,
+ GFile *file);
G_END_DECLS
diff --git a/docs/tools/ttlresource2sgml.c b/docs/tools/ttlresource2sgml.c
index 9a24b57..1ab85c2 100644
--- a/docs/tools/ttlresource2sgml.c
+++ b/docs/tools/ttlresource2sgml.c
@@ -26,24 +26,10 @@
#include "ttl_loader.h"
#include "ttl_model.h"
#include "ttl_sgml.h"
-
-static gchar *ontology_dir = NULL;
-static gchar *output_dir = NULL;
+#include "ttlresource2sgml.h"
#define TRACKER_ONTOLOGY_CLASS "http://www.tracker-project.org/ontologies/tracker#Ontology"
-static GOptionEntry entries[] = {
- { "ontology-dir", 'd', 0, G_OPTION_ARG_FILENAME, &ontology_dir,
- "Ontology directory",
- NULL
- },
- { "output-dir", 'o', 0, G_OPTION_ARG_FILENAME, &output_dir,
- "File to write the output (default stdout)",
- NULL
- },
- { NULL }
-};
-
static gchar *
name_get_prefix (Ontology *ontology,
const gchar *name)
@@ -94,20 +80,25 @@ name_to_shortname (Ontology *ontology,
static void
class_get_parent_hierarchy (Ontology *ontology,
- OntologyClass *klass,
+ const gchar *class_name,
GList **list)
{
+ OntologyClass *klass;
GList *l;
/* Ensure we only got the same class there once */
- *list = g_list_remove (*list, klass->classname);
- *list = g_list_prepend (*list, klass->classname);
+ *list = g_list_remove (*list, (gpointer) class_name);
+ *list = g_list_prepend (*list, (gpointer) class_name);
- for (l = klass->superclasses; l; l = l->next) {
- OntologyClass *parent_class;
+ klass = g_hash_table_lookup (ontology->classes, class_name);
+ if (!klass) {
+ klass = ttl_model_class_new (class_name);
+ g_hash_table_insert (ontology->classes, klass->classname, klass);
+ return;
+ }
- parent_class = g_hash_table_lookup (ontology->classes, l->data);
- class_get_parent_hierarchy (ontology, parent_class, list);
+ for (l = klass->superclasses; l; l = l->next) {
+ class_get_parent_hierarchy (ontology, l->data, list);
}
}
@@ -126,7 +117,7 @@ class_get_hierarchy (Ontology *ontology,
hierarchy = g_list_prepend (hierarchy, l->data);
}
- class_get_parent_hierarchy (ontology, klass, &hierarchy);
+ class_get_parent_hierarchy (ontology, klass->classname, &hierarchy);
return hierarchy;
}
@@ -676,6 +667,15 @@ print_properties (FILE *f,
OntologyClass *cl;
superprop = g_hash_table_lookup (ontology->properties, l->data);
+
+ if (!superprop) {
+ superprop = ttl_model_property_new (l->data);
+ g_hash_table_insert (ontology->properties, superprop->propertyname,
superprop);
+ }
+
+ if (!superprop->domain)
+ continue;
+
cl = g_hash_table_lookup (ontology->classes, superprop->domain->data);
shortname = name_to_shortname (ontology, superprop->propertyname, NULL);
@@ -763,22 +763,26 @@ generate_class_docs (OntologyClass *klass,
print_sgml_footer (f);
}
-static void
-generate_ontology_class_docs (Ontology *ontology,
- const gchar *output_dir)
+void
+generate_ontology_class_docs (Ontology *ontology,
+ GFile *output_dir)
{
- GHashTableIter iter;
OntologyClass *klass;
+ GList *classes, *l;
FILE *f;
- g_hash_table_iter_init (&iter, ontology->classes);
+ classes = g_hash_table_get_values (ontology->classes);
- while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &klass)) {
+ for (l = classes; l; l = l->next) {
gchar *shortname, *class_filename, *output_file;
+ GFile *child;
+ klass = l->data;
shortname = name_to_shortname (ontology, klass->classname, "-");
class_filename = g_strdup_printf ("%s.xml", shortname);
- output_file = g_build_filename (output_dir, class_filename, NULL);
+ child = g_file_get_child (output_dir, class_filename);
+
+ output_file = g_file_get_path (child);
f = fopen (output_file, "w");
@@ -793,35 +797,6 @@ generate_ontology_class_docs (Ontology *ontology,
generate_class_docs (klass, ontology, f);
fclose (f);
}
-}
-
-int
-main (int argc, char *argv[])
-{
- GOptionContext *context;
- Ontology *ontology;
-
- context = g_option_context_new ("- Generates ontology docs");
-
- g_option_context_add_main_entries (context, entries, NULL);
- g_option_context_parse (context, &argc, &argv, NULL);
-
- if (!ontology_dir || !output_dir) {
- gchar *help;
-
- g_printerr ("%s\n\n",
- "Ontology and output dirs are mandatory");
-
- help = g_option_context_get_help (context, TRUE, NULL);
- g_option_context_free (context);
- g_printerr ("%s", help);
- g_free (help);
-
- return -1;
- }
-
- ontology = ttl_loader_load_ontology_dir (ontology_dir);
- generate_ontology_class_docs (ontology, output_dir);
- return 0;
+ g_list_free (classes);
}
diff --git a/docs/tools/ttlresource2sgml.h b/docs/tools/ttlresource2sgml.h
new file mode 100644
index 0000000..2a7dfc5
--- /dev/null
+++ b/docs/tools/ttlresource2sgml.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017, Red Hat, Inc
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ * Author: Carlos Garnacho <carlosg gnome org>
+ */
+
+#ifndef __TTLRESOURCE2SGML_H__
+#define __TTLRESOURCE2SGML_H__
+
+#include <glib.h>
+#include "ttl_model.h"
+
+G_BEGIN_DECLS
+
+void generate_ontology_class_docs (Ontology *ontology,
+ GFile *output_dir);
+
+G_END_DECLS
+
+#endif /* __TTLRESOURCE2SGML__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]