#!/usr/bin/python3 from jjcli import * import yaml def md2py(c): """ markdown with initial yaml metadata → docs = [ doc ] """ docs=[] for txt in c.slurp(): ex=match(r'\s*---(.*?)---(.*)',txt,flags=re.S) if not ex: warn("### Erro: no formato de", c.filename(),) continue meta,body=(ex[1] , ex[2]) try: doc = yaml.safe_load(meta) except Exception as e: warn("### Erro: nos metadados de", c.filename(),e) continue doc["__file"]=c.filename() doc["__body-type"]="markdown" doc["body"]=body docs.append(doc) return docs def t2iri(s): """ term 2 IRIref """ if isinstance(s ,(dict,list,tuple)): warn("???",s) return f'"""FIXME: {s}"""' if s in {'type','a',} : return f'a' if s in {'inverseOf','Class','Thing','sameAs', 'ObjectProperty', 'DataProperty'} : return f'owl:{s}' if s in {'range','domain','subClassOf'} : return f'rdfs:{s}' if search(r'[!?()"\'\n+,.;/]',str(s)): return f'"""{s.strip()}"""' return ":"+sub(r'\s+|[:]',r'_',str(s)) def t2iri_or_lit(s): """ term 2 IRIref """ if isinstance(s ,(dict,list,tuple)): warn("???",s) return f'"""FIXME: {s}"""' if s in {'type','a',} : return f'a' if s in {'inverseOf','Class','Thing','sameAs', 'ObjectProperty', 'DataProperty'} : return f'owl:{s}' if s in {'range','domain','subClassOf'} : return f'rdfs:{s}' if search(r'[\n,.;/]',str(s)): return f'"""{s.strip()}"""' return ":"+sub(r'\s+|[:]',r'_',str(s)) def docs2ttl(d): """ docs → turtle triples """ if isinstance(d,list): if len(d)==3 and not isinstance(d[0],(list,dict,tuple)) : return docs2ttl_d({d[0]: {d[1]: d[2]}}) elif ( len(d)==2 and not isinstance(d[0],(list,dict,tuple)) and isinstance(d[1],dict) ) : return docs2ttl_d({d[0]: d[1]}) else: return str.join("\n",[docs2ttl(x) for x in d]) if isinstance(d,dict): return docs2ttl_d(d) if isinstance(d,tuple): if len(d)==3: return docs2ttl_d({d[0]: {d[1]: d[2]}}) else: warn("????",d) def docs2ttl_d(d:dict): """ dict doc → turtle triples """ ## { "%id" : "João", "parente" : [ "D", "M"] } r="" rd= d.copy() if "id" in d: s = rd.pop("id") rd= {s:rd} elif "ID" in d: s = rd.pop("ID") rd= {s:rd} elif "@id" in d: s = rd.pop("@id") rd= {s:rd} for s,dd in rd.items(): if match(r'@?ont(ology|ologia)?$',s,flags=re.I): r += docs2ttl(dd) continue if not isinstance(dd,dict): warn("Error: expecting a dictionary, got a ",rd) dd = {"__DEBUG__": dd} for p,o in dd.items(): if p == "ont": r += docs2ttl(o) elif isinstance(o,(list,set)): for oo in o: r += f'{t2iri(s)} {t2iri(p)} {t2iri(oo)} .\n' else: r += f'{t2iri(s)} {t2iri(p)} {t2iri(o)} .\n' return r def tmd2ttl(): c=clfilter(opt="do:") ## option values in c.opt dictionary ds = md2py(c) print(docs2ttl(ds)) tmd2ttl() #print(docs2ttl({ "@id" : "João", "parente" : [ "D", "M"] } )) #print(docs2ttl({ "Manel": { "parente" : [ "D", "M"] }, # "Joana": { "a": "pessoa"} # })) ##print(docs2ttl([ # { "Manel": { "parente" : { "D", "M"} }}, # {"ont": [ (2,3,4),(3,4,{4,5,6})]}, # { "Joaquim": { "avós" : { "D", "M"} }}, # ])) #print(docs2ttl([1,2,3])) #print(docs2ttl([11,22,[33,34]])) #print(docs2ttl([])) #print(docs2ttl([7,{27: {37,55}}])) """ # Examples """