diff --git a/util/url.go b/util/url.go new file mode 100644 index 0000000..b7103ce --- /dev/null +++ b/util/url.go @@ -0,0 +1,44 @@ +/* This file implements things defined by Wikilink RFC. See :main/help/wikilink + */ +package util + +import ( + "path" + "regexp" + "strings" +) + +// `name` must be non-empty. +func sections(name string) (mycel, hyphaName string) { + mycelRe := regexp.MustCompile(`^:.*/`) + loc := mycelRe.FindIndex([]byte(name)) + if loc != nil { // if has mycel + mycel = name[:loc[1]] + name = name[loc[1]:] + } + return mycel, name +} + +// Wikilink processes `link` as defined by :main/help/wikilink assuming that `atHypha` is current hypha name. +func Wikilink(link, atHypha string) string { + mycel, hyphaName := sections(atHypha) + urlProtocolRe := regexp.MustCompile(`^[a-zA-Z]+:`) + switch { + case strings.HasPrefix(link, "::"): + return "/" + mycel + link[2:] + case strings.HasPrefix(link, ":"): + return "/" + link + case strings.HasPrefix(link, "../") && strings.Count(hyphaName, "/") > 0: + return "/" + path.Dir(atHypha) + "/" + link[3:] + case strings.HasPrefix(link, "../"): + return "/" + mycel + link[3:] + case strings.HasPrefix(link, "/"): + return "/" + atHypha + link + case strings.HasPrefix(link, "./"): + return "/" + atHypha + link[1:] + case urlProtocolRe.MatchString(link): + return link + default: + return "/" + link + } +} diff --git a/util/util_test.go b/util/util_test.go new file mode 100644 index 0000000..bd2f4c6 --- /dev/null +++ b/util/util_test.go @@ -0,0 +1,22 @@ +package util + +import ( + "testing" +) + +func TestWikilink(t *testing.T) { + atHypha := ":example/test" + results := map[string]string{ + "foo": "/foo", + "::foo": "/:example/foo", + ":bar/foo": "/:bar/foo", + "/baz": "/:example/test/baz", + "./baz": "/:example/test/baz", + "../qux": "/:example/qux", + } + for link, expect := range results { + if res := Wikilink(link, atHypha); expect != res { + t.Errorf("%s → %s; expected %s", link, res, expect) + } + } +} diff --git a/wiki/main/help/1.markdown b/wiki/main/doc/1.markdown similarity index 100% rename from wiki/main/help/1.markdown rename to wiki/main/doc/1.markdown diff --git a/wiki/main/help/meta.json b/wiki/main/doc/meta.json similarity index 100% rename from wiki/main/help/meta.json rename to wiki/main/doc/meta.json diff --git a/wiki/main/help/mycelia/1.markdown b/wiki/main/doc/mycelia/1.markdown similarity index 100% rename from wiki/main/help/mycelia/1.markdown rename to wiki/main/doc/mycelia/1.markdown diff --git a/wiki/main/help/mycelia/meta.json b/wiki/main/doc/mycelia/meta.json similarity index 100% rename from wiki/main/help/mycelia/meta.json rename to wiki/main/doc/mycelia/meta.json diff --git a/wiki/main/help/plugin/1.markdown b/wiki/main/doc/plugin/1.markdown similarity index 100% rename from wiki/main/help/plugin/1.markdown rename to wiki/main/doc/plugin/1.markdown diff --git a/wiki/main/help/plugin/meta.json b/wiki/main/doc/plugin/meta.json similarity index 100% rename from wiki/main/help/plugin/meta.json rename to wiki/main/doc/plugin/meta.json diff --git a/wiki/main/help/wikilink/1.markdown b/wiki/main/doc/wikilink/1.markdown similarity index 95% rename from wiki/main/help/wikilink/1.markdown rename to wiki/main/doc/wikilink/1.markdown index 9ab1c7b..a03e5ee 100644 --- a/wiki/main/help/wikilink/1.markdown +++ b/wiki/main/doc/wikilink/1.markdown @@ -40,7 +40,7 @@ wikilink actual path foo == /foo ::foo == /:example/foo :bar/foo == /:bar/foo -/baz == /:example/baz -./baz == /:example/baz +/baz == /:example/test/baz +./baz == /:example/test/baz ../qux == /:example/qux ``` diff --git a/wiki/main/help/wikilink/meta.json b/wiki/main/doc/wikilink/meta.json similarity index 100% rename from wiki/main/help/wikilink/meta.json rename to wiki/main/doc/wikilink/meta.json