diff --git a/interwiki/interwiki.go b/interwiki/interwiki.go index 05ade08..80b5680 100644 --- a/interwiki/interwiki.go +++ b/interwiki/interwiki.go @@ -20,7 +20,7 @@ func Init() { theMap.list = append(theMap.list, &wiki) for _, prefix := range wiki.Names { if _, found := theMap.byName[prefix]; found { - log.Fatalf("There are multiple interwiki map entries having the same prefix ‘%s’\n", prefix) + log.Fatalf("There are multiple uses of the same prefix ‘%s’\n", prefix) } else { theMap.byName[prefix] = &wiki } diff --git a/interwiki/wiki.go b/interwiki/wiki.go index 49504f7..9ffad01 100644 --- a/interwiki/wiki.go +++ b/interwiki/wiki.go @@ -1,11 +1,21 @@ package interwiki +import ( + "fmt" + "github.com/bouncepaw/mycorrhiza/util" + "log" +) + // WikiEngine is an enumeration of supported interwiki targets. type WikiEngine int const ( - // Mycorrhiza is a Mycorrhiza wiki. This is the default value. Mycorrhiza WikiEngine = iota + OddMuse + MediaWiki + MoinMoin1 + MoinMoin2 + DokuWiki // Generic is any website. Generic ) @@ -22,7 +32,7 @@ type Wiki struct { // http://wiki.example.org/view/%s // where %s is where text will be inserted. No other % instructions are supported yet. They will be added once we learn of their use cases. // - // This field is optional. For Generic wikis, it is automatically set to /%s; for Mycorrhiza wikis, it is automatically set to /hypha/%s. + // This field is optional. For other wikis, it is automatically set to /%s; for Mycorrhiza wikis, it is automatically set to /hypha/%s. LinkFormat string `json:"link_format"` // Description is a plain-text description of the wiki. @@ -31,13 +41,46 @@ type Wiki struct { // Engine is the engine of the wiki. This field is not set in JSON. Engine WikiEngine `json:"-"` - // EngineString is a string name of the engine. It is then converted to Engine. Supported values are: - // * mycorrhiza -> Mycorrhiza - // * generic -> Generic - // All other values will result in an error. + // EngineString is a string name of the engine. It is then converted to Engine. See the code to learn the supported values. All other values will result in an error. EngineString string `json:"engine"` } -func (w *Wiki) canonize() { - +var wikiEnginesLookup = map[string]WikiEngine{ + "mycorrhiza": Mycorrhiza, + "oddmuse": OddMuse, + "mediawiki": MediaWiki, + "moin1": MoinMoin1, + "moin2": MoinMoin2, + "dokuwiki": DokuWiki, + "generic": Generic, +} + +func (w *Wiki) canonize() { + if engine, ok := wikiEnginesLookup[w.EngineString]; ok { + w.Engine = engine + w.EngineString = "" // Ain't gonna need it anymore + } else { + log.Fatalf("Unknown engine ‘%s’\n", w.EngineString) + } + + if len(w.Names) == 0 { + log.Fatalln("Cannot have a wiki in the interwiki map with no name") + } + + if w.URL == "" { + log.Fatalf("Wiki ‘%s’ has no URL\n", w.Names[0]) + } + + for i, prefix := range w.Names { + w.Names[i] = util.CanonicalName(prefix) + } + + if w.LinkFormat == "" { + switch w.Engine { + case Mycorrhiza: + w.LinkFormat = fmt.Sprintf("%s/hypha/%%s", w.URL) + default: + w.LinkFormat = fmt.Sprintf("%s/%%s", w.URL) + } + } }