mirror of
				https://github.com/osmarks/mycorrhiza.git
				synced 2025-10-31 15:43:00 +00:00 
			
		
		
		
	Interwiki: Start implementing
This commit is contained in:
		| @@ -16,6 +16,7 @@ var paths struct { | ||||
| 	tokensJSON          string | ||||
| 	userCredentialsJSON string | ||||
| 	categoriesJSON      string | ||||
| 	interwikiJSON       string | ||||
| } | ||||
|  | ||||
| // HyphaeDir returns the path to hyphae storage. | ||||
| @@ -45,6 +46,8 @@ func CategoriesJSON() string { return paths.categoriesJSON } | ||||
| // FileInRoot returns full path for the given filename if it was placed in the root of the wiki structure. | ||||
| func FileInRoot(filename string) string { return filepath.Join(cfg.WikiDir, filename) } | ||||
|  | ||||
| func InterwikiJSON() string { return paths.interwikiJSON } | ||||
|  | ||||
| // PrepareWikiRoot ensures all needed directories and files exist and have | ||||
| // correct permissions. | ||||
| func PrepareWikiRoot() error { | ||||
| @@ -72,6 +75,7 @@ func PrepareWikiRoot() error { | ||||
|  | ||||
| 	paths.tokensJSON = filepath.Join(paths.cacheDir, "tokens.json") | ||||
| 	paths.categoriesJSON = filepath.Join(cfg.WikiDir, "categories.json") | ||||
| 	paths.interwikiJSON = FileInRoot("interwiki.json") | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
							
								
								
									
										49
									
								
								interwiki/interwiki.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								interwiki/interwiki.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| // Package interwiki provides interwiki capabilities. Most of them, at least. | ||||
| package interwiki | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"github.com/bouncepaw/mycorrhiza/files" | ||||
| 	"log" | ||||
| 	"os" | ||||
| ) | ||||
|  | ||||
| func Init() { | ||||
| 	var ( | ||||
| 		record, err = readInterwiki() | ||||
| 	) | ||||
| 	if err != nil { | ||||
| 		log.Fatalln(err) | ||||
| 	} | ||||
| 	for _, wiki := range record { | ||||
| 		wiki.canonize() | ||||
| 		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) | ||||
| 			} else { | ||||
| 				theMap.byName[prefix] = &wiki | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	log.Printf("Loaded %d interwiki entries\n", len(theMap.list)) | ||||
| } | ||||
|  | ||||
| func readInterwiki() ([]Wiki, error) { | ||||
| 	var ( | ||||
| 		record            []Wiki | ||||
| 		fileContents, err = os.ReadFile(files.InterwikiJSON()) | ||||
| 	) | ||||
| 	if os.IsNotExist(err) { | ||||
| 		return record, nil | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	err = json.Unmarshal(fileContents, &record) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return record, nil | ||||
| } | ||||
							
								
								
									
										14
									
								
								interwiki/map.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								interwiki/map.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| package interwiki | ||||
|  | ||||
| // Map is an interwiki map | ||||
| type Map struct { | ||||
| 	list   []*Wiki | ||||
| 	byName map[string]*Wiki | ||||
| } | ||||
|  | ||||
| var theMap Map | ||||
|  | ||||
| func init() { | ||||
| 	theMap.list = []*Wiki{} | ||||
| 	theMap.byName = map[string]*Wiki{} | ||||
| } | ||||
							
								
								
									
										43
									
								
								interwiki/wiki.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								interwiki/wiki.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| package interwiki | ||||
|  | ||||
| // 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 | ||||
| 	// Generic is any website. | ||||
| 	Generic | ||||
| ) | ||||
|  | ||||
| // 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"` | ||||
|  | ||||
| 	// LinkFormat is a format string for incoming interwiki links. The format strings should look like this: | ||||
| 	//     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 <URL>/%s; for Mycorrhiza wikis, it is automatically set to <URL>/hypha/%s. | ||||
| 	LinkFormat string `json:"link_format"` | ||||
|  | ||||
| 	// 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:"-"` | ||||
|  | ||||
| 	// 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 string `json:"engine"` | ||||
| } | ||||
|  | ||||
| func (w *Wiki) canonize() { | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Timur Ismagilov
					Timur Ismagilov