50 lines
1.5 KiB
Julia
50 lines
1.5 KiB
Julia
using Unicode
|
|
|
|
mutable struct Classification
|
|
type::Symbol
|
|
name::Symbol
|
|
bio::String
|
|
children::Vector{Classification}
|
|
parent::Classification
|
|
|
|
function Classification(classif::Dict{String, Any})
|
|
children = [Classification(d) for d in get(classif, "children", [])]
|
|
type = Symbol(Unicode.normalize(classif["type"], casefold=true, stripmark=true))
|
|
name = Symbol(Unicode.normalize(classif["name"], casefold=true, stripmark=true))
|
|
classif = new(type, name, get(classif, "bio", ""), children)
|
|
for child in children
|
|
child.parent = classif
|
|
end
|
|
classif
|
|
end
|
|
end
|
|
|
|
function Base.show(io::IO, clf::Classification)
|
|
if length(clf.children) < 2
|
|
childrentext = " with $(length(clf.children)) child"
|
|
else
|
|
childrentext = " with $(length(clf.children)) children"
|
|
end
|
|
biotext = ""
|
|
if clf.bio != ""
|
|
biotext = " ($(clf.bio))"
|
|
end
|
|
print("Classification(", clf.type, " ", clf.name, biotext, childrentext, ")")
|
|
end
|
|
|
|
function getfirstparent(name::Symbol, classification::Classification)
|
|
if classification.name == name
|
|
parent = classification
|
|
while parent.parent.name != :god
|
|
parent = parent.parent
|
|
end
|
|
return parent
|
|
else
|
|
for child in classification.children
|
|
parent = getfirstparent(name, child)
|
|
if !isnothing(parent)
|
|
return parent
|
|
end
|
|
end
|
|
end
|
|
end
|