1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2025-01-19 07:02:51 +00:00

Merge pull request #98 from chekoopa/tree-view-fix

Fix ghost siblings and orphaned subhyphae view
This commit is contained in:
Timur Ismagilov 2021-10-01 12:27:27 +03:00 committed by GitHub
commit d2a1c9d151
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 67 additions and 11 deletions

View File

@ -12,11 +12,27 @@ import (
) )
func findSiblingsAndDescendants(hyphaName string) ([]*sibling, map[string]bool) { func findSiblingsAndDescendants(hyphaName string) ([]*sibling, map[string]bool) {
hyphaDir := ""
if hyphaRawDir := path.Dir(hyphaName); hyphaRawDir != "." {
hyphaDir = hyphaRawDir
}
var ( var (
siblings = []*sibling{&sibling{hyphaName, 0, 0}} siblingsMap = make(map[string]bool)
siblingCheck = func(h *hyphae.Hypha) hyphae.CheckResult { siblingCheck = func(h *hyphae.Hypha) hyphae.CheckResult {
if path.Dir(hyphaName) == path.Dir(h.Name) && h.Name != hyphaName { // I don't like this double comparison, but it is only the way to circumvent some flickups
siblings = append(siblings, &sibling{h.Name, 0, 0}) if strings.HasPrefix(h.Name, hyphaDir) && h.Name != hyphaDir && h.Name != hyphaName {
var (
rawSubPath = strings.TrimPrefix(h.Name, hyphaDir)[1:]
slashIdx = strings.IndexRune(rawSubPath, '/')
)
if slashIdx > -1 {
var sibPath = h.Name[:slashIdx+len(hyphaDir)+1]
if _, exists := siblingsMap[sibPath]; !exists {
siblingsMap[sibPath] = false
}
} else { // it is a straight sibling
siblingsMap[h.Name] = true
}
} }
return hyphae.CheckContinue return hyphae.CheckContinue
} }
@ -31,9 +47,18 @@ func findSiblingsAndDescendants(hyphaName string) ([]*sibling, map[string]bool)
i7n = hyphae.NewIteration() i7n = hyphae.NewIteration()
) )
siblingsMap[hyphaName] = true
i7n.AddCheck(siblingCheck) i7n.AddCheck(siblingCheck)
i7n.AddCheck(descendantCheck) i7n.AddCheck(descendantCheck)
i7n.Ignite() i7n.Ignite()
siblings := make([]*sibling, len(siblingsMap))
sibIdx := 0
for sibName, exists := range siblingsMap {
siblings[sibIdx] = &sibling{sibName, 0, 0, exists}
sibIdx++
}
sort.Slice(siblings, func(i, j int) bool { sort.Slice(siblings, func(i, j int) bool {
return siblings[i].name < siblings[j].name return siblings[i].name < siblings[j].name
}) })
@ -79,7 +104,7 @@ func Tree(hyphaName string) (siblingsHTML, childrenHTML, prev, next string) {
wg.Done() wg.Done()
}() }()
go func() { go func() {
children = figureOutChildren(hyphaName, descendantsPool).children children = figureOutChildren(hyphaName, descendantsPool, true).children
wg.Done() wg.Done()
}() }()
wg.Wait() wg.Wait()
@ -103,10 +128,11 @@ func Tree(hyphaName string) (siblingsHTML, childrenHTML, prev, next string) {
type child struct { type child struct {
name string name string
exists bool
children []child children []child
} }
func figureOutChildren(hyphaName string, subhyphaePool map[string]bool) child { func figureOutChildren(hyphaName string, subhyphaePool map[string]bool, exists bool) child {
var ( var (
nestLevel = strings.Count(hyphaName, "/") nestLevel = strings.Count(hyphaName, "/")
adopted = make([]child, 0) adopted = make([]child, 0)
@ -115,16 +141,30 @@ func figureOutChildren(hyphaName string, subhyphaePool map[string]bool) child {
subnestLevel := strings.Count(subhyphaName, "/") subnestLevel := strings.Count(subhyphaName, "/")
if subnestLevel-1 == nestLevel && path.Dir(subhyphaName) == hyphaName { if subnestLevel-1 == nestLevel && path.Dir(subhyphaName) == hyphaName {
delete(subhyphaePool, subhyphaName) delete(subhyphaePool, subhyphaName)
adopted = append(adopted, figureOutChildren(subhyphaName, subhyphaePool)) adopted = append(adopted, figureOutChildren(subhyphaName, subhyphaePool, true))
} }
} }
return child{hyphaName, adopted} for descName, _ := range subhyphaePool {
if strings.HasPrefix(descName, hyphaName) {
var (
rawSubPath = strings.TrimPrefix(descName, hyphaName)[1:]
slashIdx = strings.IndexRune(rawSubPath, '/')
)
if slashIdx > -1 {
var sibPath = descName[:slashIdx+len(hyphaName)+1]
adopted = append(adopted, figureOutChildren(sibPath, subhyphaePool, false))
} // `else` never happens?
}
}
return child{hyphaName, exists, adopted}
} }
type sibling struct { type sibling struct {
name string name string
directSubhyphaeCount int directSubhyphaeCount int
indirectSubhyphaeCount int indirectSubhyphaeCount int
exists bool
} }
func subhyphaeMatrix(children []child) (html string) { func subhyphaeMatrix(children []child) (html string) {

View File

@ -20,7 +20,7 @@ pseudographics:
}) })
%} %}
<li class="subhyphae__entry"> <li class="subhyphae__entry">
<a class="subhyphae__link" href="/hypha/{%s c.name %}"> <a class="subhyphae__link {% if !c.exists %}wikilink_new{% endif %}" href="/hypha/{%s c.name %}">
{%s util.BeautifulName(path.Base(c.name)) %} {%s util.BeautifulName(path.Base(c.name)) %}
</a> </a>
{% if len(c.children) > 0 %} {% if len(c.children) > 0 %}
@ -36,7 +36,7 @@ pseudographics:
{% func siblingHTML(s *sibling) %} {% func siblingHTML(s *sibling) %}
<li class="sibling-hyphae__entry"> <li class="sibling-hyphae__entry">
<a class="sibling-hyphae__link" href="/hypha/{%s s.name %}"> <a class="sibling-hyphae__link {% if !s.exists %}wikilink_new{% endif %}" href="/hypha/{%s s.name %}">
{%s util.BeautifulName(path.Base(s.name)) %} {%s util.BeautifulName(path.Base(s.name)) %}
<span class="sibling-hyphae__count"> <span class="sibling-hyphae__count">
{% if s.directSubhyphaeCount > 0 %} {% if s.directSubhyphaeCount > 0 %}

View File

@ -82,7 +82,15 @@ func streamchildHTML(qw422016 *qt422016.Writer, c *child) {
//line tree/view.qtpl:21 //line tree/view.qtpl:21
qw422016.N().S(` qw422016.N().S(`
<li class="subhyphae__entry"> <li class="subhyphae__entry">
<a class="subhyphae__link" href="/hypha/`) <a class="subhyphae__link `)
//line tree/view.qtpl:23
if !c.exists {
//line tree/view.qtpl:23
qw422016.N().S(`wikilink_new`)
//line tree/view.qtpl:23
}
//line tree/view.qtpl:23
qw422016.N().S(`" href="/hypha/`)
//line tree/view.qtpl:23 //line tree/view.qtpl:23
qw422016.E().S(c.name) qw422016.E().S(c.name)
//line tree/view.qtpl:23 //line tree/view.qtpl:23
@ -156,7 +164,15 @@ func streamsiblingHTML(qw422016 *qt422016.Writer, s *sibling) {
//line tree/view.qtpl:37 //line tree/view.qtpl:37
qw422016.N().S(` qw422016.N().S(`
<li class="sibling-hyphae__entry"> <li class="sibling-hyphae__entry">
<a class="sibling-hyphae__link" href="/hypha/`) <a class="sibling-hyphae__link `)
//line tree/view.qtpl:39
if !s.exists {
//line tree/view.qtpl:39
qw422016.N().S(`wikilink_new`)
//line tree/view.qtpl:39
}
//line tree/view.qtpl:39
qw422016.N().S(`" href="/hypha/`)
//line tree/view.qtpl:39 //line tree/view.qtpl:39
qw422016.E().S(s.name) qw422016.E().S(s.name)
//line tree/view.qtpl:39 //line tree/view.qtpl:39