@@ -139,7 +139,7 @@ def curie_for(self, uri: Any, default_ok: bool = True, pythonform: bool = False)
139
139
present, None is returned
140
140
141
141
@param uri: URI to create the CURIE for
142
- @param default_ok: True means the default prefix is ok. Otherwise we have to have a reql prefix
142
+ @param default_ok: True means the default prefix is ok. Otherwise, we have to have a real prefix
143
143
@param pythonform: True means take the python/rdflib uppercase format
144
144
"""
145
145
if ':' in uri and ':/' not in uri :
@@ -148,28 +148,41 @@ def curie_for(self, uri: Any, default_ok: bool = True, pythonform: bool = False)
148
148
if pythonform :
149
149
default_ok = False
150
150
match : Tuple [str , Optional [Namespace ]] = ('' , None ) # match string / prefix
151
- u = str (uri )
152
-
153
- # Find the longest match
154
- for k , v in self .items ():
155
- vs = str (v )
156
- if u .startswith (vs ):
157
- if len (vs ) > len (match [0 ]) and (default_ok or k not in (Namespaces ._default_key , Namespaces ._base_key )):
158
- match = (vs , k )
151
+ uri_string = str (uri )
152
+
153
+ # Find the longest match for the URI, self.items() is a list of (prefix/namespace, uri base prefix) tuples
154
+ for namespace , uri_base in self .items ():
155
+ uri_base_string = str (uri_base )
156
+ # uri_string is passed into this method as the full URI to be converted to a CURIE
157
+ if uri_string .startswith (uri_base_string ):
158
+ # default key and base key are `@default` `@base` respectively
159
+ # at this point match[0] is '', match[1] is None
160
+ if len (uri_base_string ) > len (match [0 ]) and \
161
+ (default_ok or namespace not in (Namespaces ._default_key , Namespaces ._base_key )):
162
+ match = (uri_base_string , namespace )
163
+
164
+ # check if length of uri_base_string is > 0, now after basically assigning it to be the URI base string
165
+ # that matches the start of the URI coming into the method
159
166
if len (match [0 ]):
160
167
if pythonform :
161
- ns = match [1 ].upper ()
162
- ln = u .replace ((match [0 ]), '' )
163
- if not ln :
164
- return f"URIRef(str({ ns } ))"
165
- elif ln .isidentifier ():
166
- return f"{ ns } .{ ln } "
168
+ # uppercase the namespace
169
+ namespace = match [1 ].upper ()
170
+ # match[0] is the URI base string, so we remove that from the incoming URI
171
+ leftover_uri = uri_string .replace ((match [0 ]), '' )
172
+ if not leftover_uri :
173
+ return f"URIRef(str({ namespace } ))"
174
+ # why?
175
+ # elif leftover_uri.isidentifier():
176
+ # return f"{namespace}.{leftover_uri}"
167
177
else :
168
- return f'{ ns } ["{ ln } "]'
178
+ return f'{ namespace } ["{ leftover_uri } "]'
169
179
else :
170
- return u .replace (match [0 ],
171
- ':' if match [1 ] == Namespaces ._default_key else
172
- '' if match [1 ] == Namespaces ._base_key else match [1 ] + ':' )
180
+ if match [1 ] == Namespaces ._default_key :
181
+ return uri_string .replace (match [0 ], ':' )
182
+ elif match [1 ] == Namespaces ._base_key :
183
+ return uri_string .replace (match [0 ], '' )
184
+ else :
185
+ return uri_string .replace (match [0 ], match [1 ] + ':' )
173
186
return None
174
187
175
188
def prefix_for (self , uri_or_curie : Any , case_shift : bool = True ) -> Optional [str ]:
@@ -213,7 +226,7 @@ def uri_for(self, uri_or_curie: Any) -> URIRef:
213
226
return URIRef (self .join (self [prefix ], local ))
214
227
215
228
def uri_or_curie_for (self , prefix : Union [str , URIRef ], suffix : str ) -> str :
216
- """ Return a CURIE for prefix/suffix in possible, else a URI """
229
+ """ Return a CURIE for prefix/suffix if possible, else a URI """
217
230
if isinstance (prefix , URIRef ) or ':/' in str (prefix ):
218
231
prefix_as_uri = str (prefix )
219
232
for k , v in self .items ():
0 commit comments