Skip to content

Commit 324abbe

Browse files
authored
Merge pull request #221 from elevont/subjectSorting
Implements subject sorting in output with --sort
2 parents 681a5cb + 9799d77 commit 324abbe

File tree

5 files changed

+34
-6
lines changed

5 files changed

+34
-6
lines changed

pylode/cli.py

+11-3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@
3434
default="true",
3535
)
3636

37+
parser.add_argument(
38+
"-s",
39+
"--sort",
40+
help="Enables sorting of the subjects in the ontology in the output",
41+
action='store_true',
42+
)
43+
3744
parser.add_argument(
3845
"-p",
3946
"--profile",
@@ -50,12 +57,13 @@ def main():
5057
args = parser.parse_args()
5158

5259
try:
60+
sort_subjects = args.sort
5361
if args.profile == "ontpub":
54-
html = OntPub(args.input)
62+
html = OntPub(args.input, sort_subjects = sort_subjects)
5563
elif args.profile == "vocpub":
56-
html = VocPub(args.input)
64+
html = VocPub(args.input, sort_subjects = sort_subjects)
5765
elif args.profile == "supermodel":
58-
html = Supermodel(args.input)
66+
html = Supermodel(args.input, sort_subjects = sort_subjects)
5967
else:
6068
raise ValueError(f"Unexpected profile type '{args.profile}'")
6169
except PylodeError as e:

pylode/profiles/ontpub.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
get_ns,
5757
prop_obj_pair_html,
5858
section_html,
59+
sort_ontology,
5960
make_pylode_logo,
6061
)
6162

@@ -71,6 +72,7 @@
7172
get_ns,
7273
prop_obj_pair_html,
7374
section_html,
75+
sort_ontology,
7476
make_pylode_logo,
7577
)
7678

@@ -102,8 +104,10 @@ class OntPub:
102104
od.make_html(destination="some-resulting-html-file.html")
103105
"""
104106

105-
def __init__(self, ontology: Union[Graph, Path, str]):
107+
def __init__(self, ontology: Union[Graph, Path, str], sort_subjects: bool = False):
106108
self.ont = load_ontology(ontology)
109+
if sort_subjects:
110+
self.ont = sort_ontology(self.ont)
107111
self._ontdoc_inference(self.ont)
108112
self.back_onts = load_background_onts()
109113
self.back_onts_titles = load_background_onts_titles(self.back_onts)

pylode/profiles/supermodel/html.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
from pylode.utils import (
3939
PylodeError,
4040
load_ontology,
41+
sort_ontology,
4142
)
4243
from pylode.profiles.supermodel.query import Query
4344
from pylode.profiles.supermodel.model import (
@@ -93,9 +94,12 @@ def get_headings(doc: dominate.document) -> list:
9394

9495
class Supermodel:
9596
def __init__(
96-
self, ontology: Graph | Path | str, QueryClass: Type[Query] = Query
97+
self, ontology: Graph | Path | str, QueryClass: Type[Query] = Query,
98+
sort_subjects: bool = False
9799
) -> None:
98100
self.ont = load_ontology(ontology)
101+
if sort_subjects:
102+
self.ont = sort_ontology(self.ont)
99103
self.query = QueryClass(self.ont)
100104

101105
self.toc: dict[str, str] = {}

pylode/profiles/vocpub.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
get_ns,
5656
prop_obj_pair_html,
5757
section_html,
58+
sort_ontology,
5859
make_pylode_logo,
5960
)
6061

@@ -70,6 +71,7 @@
7071
get_ns,
7172
prop_obj_pair_html,
7273
section_html,
74+
sort_ontology,
7375
make_pylode_logo,
7476
)
7577

@@ -105,8 +107,10 @@ class VocPub:
105107
od.make_html(destination="some-resulting-html-file.html")
106108
"""
107109

108-
def __init__(self, ontology: Union[Graph, Path, str]):
110+
def __init__(self, ontology: Union[Graph, Path, str], sort_subjects: bool = False):
109111
self.ont = load_ontology(ontology)
112+
if sort_subjects:
113+
self.ont = sort_ontology(self.ont)
110114
self._ontdoc_inference(self.ont)
111115
self.back_onts = load_background_onts()
112116
self.back_onts_titles = load_background_onts_titles(self.back_onts)

pylode/utils.py

+8
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,14 @@ def load_ontology(ontology: Union[Graph, Path, str]) -> Graph:
288288
print(f"{type(e).__name__} Error {e}")
289289
exit()
290290

291+
def sort_ontology(ont_orig: Graph) -> Graph:
292+
"""Creates a copy of the supplied ontology, sorted by subjects"""
293+
trpls = ont_orig.triples((None, None, None))
294+
trpls_srt = sorted(trpls)
295+
ont_sorted = Graph()
296+
for trpl in trpls_srt:
297+
ont_sorted.add(trpl)
298+
return ont_sorted
291299

292300
def load_background_onts():
293301
"""Loads background ontology files into an RDFLib graph from either

0 commit comments

Comments
 (0)