2022-05-22 09:25:22 +00:00
package interwiki
2022-05-24 15:59:18 +00:00
import (
"fmt"
"github.com/bouncepaw/mycorrhiza/util"
"log"
)
2022-05-22 09:25:22 +00:00
// WikiEngine is an enumeration of supported interwiki targets.
type WikiEngine int
const (
Mycorrhiza WikiEngine = iota
2022-05-24 15:59:18 +00:00
OddMuse
MediaWiki
MoinMoin1
MoinMoin2
DokuWiki
2022-05-22 09:25:22 +00:00
// Generic is any website.
Generic
)
2022-05-27 13:43:40 +00:00
// EmojiWithName returns a Unicode emoji that kinda represents the engine and the engine name. One day we might move to actual images. OK for now.
func ( we WikiEngine ) EmojiWithName ( ) string {
switch we {
case Mycorrhiza :
return "🍄 Mycorrhiza"
case OddMuse :
return "🐫 OddMuse"
case MediaWiki :
return "🌻 MediaWiki"
case MoinMoin1 :
return "Ⓜ️ MoinMoin 1.9"
case MoinMoin2 :
return "Ⓜ️ MoinMoin 2.*"
case DokuWiki :
return "📝 DokuWiki"
default :
return "🌐 Generic"
}
}
2022-05-22 09:25:22 +00:00
// Wiki is an entry in the interwiki map.
type Wiki struct {
// Names is a slice of link prefices that correspond to this wiki.
Names [ ] string ` json:"names" `
// URL is the address of the wiki.
URL string ` json:"url" `
2022-05-28 17:19:40 +00:00
// LinkHrefFormat is a format string for interwiki links. See Mycomarkup internal docs hidden deep inside for more information.
2022-05-22 09:25:22 +00:00
//
2022-05-28 17:19:40 +00:00
// This field is optional. For other wikis, it is automatically set to <URL>/{NAME}; for Mycorrhiza wikis, it is automatically set to <URL>/hypha/{NAME}}.
LinkHrefFormat string ` json:"link_href_format" `
ImgSrcFormat string ` json:"img_src_format" `
2022-05-22 09:25:22 +00:00
// Description is a plain-text description of the wiki.
Description string ` json:"description" `
// Engine is the engine of the wiki. This field is not set in JSON.
Engine WikiEngine ` json:"-" `
2022-05-24 15:59:18 +00:00
// 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.
2022-05-22 09:25:22 +00:00
EngineString string ` json:"engine" `
}
2022-05-24 15:59:18 +00:00
var wikiEnginesLookup = map [ string ] WikiEngine {
"mycorrhiza" : Mycorrhiza ,
"oddmuse" : OddMuse ,
"mediawiki" : MediaWiki ,
"moin1" : MoinMoin1 ,
"moin2" : MoinMoin2 ,
"dokuwiki" : DokuWiki ,
"generic" : Generic ,
}
2022-05-22 09:25:22 +00:00
func ( w * Wiki ) canonize ( ) {
2022-05-24 15:59:18 +00:00
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 )
}
2022-05-22 09:25:22 +00:00
2022-05-28 17:19:40 +00:00
if w . LinkHrefFormat == "" {
switch w . Engine {
case Mycorrhiza :
w . LinkHrefFormat = fmt . Sprintf ( "%s/hypha/{NAME}" , w . URL )
default :
w . LinkHrefFormat = fmt . Sprintf ( "%s/{NAME}" , w . URL )
}
}
if w . ImgSrcFormat == "" {
2022-05-24 15:59:18 +00:00
switch w . Engine {
case Mycorrhiza :
2022-05-28 17:19:40 +00:00
w . ImgSrcFormat = fmt . Sprintf ( "%s/binary/{NAME}" , w . URL )
2022-05-24 15:59:18 +00:00
default :
2022-05-28 17:19:40 +00:00
w . ImgSrcFormat = fmt . Sprintf ( "%s/{NAME}" , w . URL )
2022-05-24 15:59:18 +00:00
}
}
2022-05-22 09:25:22 +00:00
}