CN
This is a high-performance MDict (.mdx/.mdd) file parsing library written in Go. It supports querying dictionary content, retrieving dictionary metadata, and provides a file system wrapper compliant with the io/fs.FS interface, making it easy to integrate with other Go ecosystem libraries (such as HTTP servers).
This library was originally based on the terasum/medict project and has undergone extensive bug fixes, performance optimizations, and code refactoring.
- High-Performance Queries: Uses a binary search algorithm for fast O(log n) complexity queries of keywords.
- MDX/MDD Support: Supports both .mdx (text dictionaries) and .mdd (resource files) formats.
- Standard Interface: Implements the io/fs.FSinterface, allowing dictionaries to be easily served as a file system.
- Robust Error Handling: Comprehensive error handling and logging.
- Complete Metadata: Provides an API to access all dictionary metadata (such as title, description, creation date, etc.).
go get github.com/lib-x/mdx(Note: Please replace github.com/lib-x/mdx with the actual repository path)
Here is a simple example of how to load an MDX dictionary and query a word.
package main
import (
	"fmt"
	"log"
	"github.com/lib-x/mdx" // Assuming this is the module path
)
func main() {
	// 1. Create a new Mdict instance
	// Replace "path/to/your/dictionary.mdx" with your MDX file path
	mdict, err := mdx.New("path/to/your/dictionary.mdx")
	if err != nil {
		log.Fatalf("Failed to load dictionary file: %v", err)
	}
	// 2. Build the index (recommended to be done once at program startup)
	err = mdict.BuildIndex()
	if err != nil {
		log.Fatalf("Failed to build dictionary index: %v", err)
	}
	// 3. Print dictionary information
	fmt.Printf("Dictionary Title: %s\n", mdict.Title())
	fmt.Printf("Dictionary Description: %s\n", mdict.Description())
	// 4. Query a word
	word := "hello"
	definition, err := mdict.Lookup(word)
	if err != nil {
		log.Fatalf("Failed to look up word '%s': %v", word, err)
	}
	fmt.Printf("Definition of '%s':\n%s\n", word, string(definition))
	// 5. Query a non-existent word
	word = "nonexistentword"
	_, err = mdict.Lookup(word)
	if err != nil {
		fmt.Printf("As expected, an error occurred when querying a non-existent word '%s': %v\n", word, err)
	}
}MDD files typically contain resources like audio and images. The following example shows how to list all resources in an MDD file.
package main
import (
	"fmt"
	"log"
	"github.com/lib-x/mdx" // Assuming this is the module path
)
func main() {
	// 1. Load the MDD file
	// Replace "path/to/your/resource.mdd" with your MDD file path
	mdd, err := mdx.New("path/to/your/resource.mdd")
	if err != nil {
		log.Fatalf("Failed to load MDD file: %v", err)
	}
	// 2. Build the index
	err = mdd.BuildIndex()
	if err != nil {
		log.Fatalf("Failed to build MDD index: %v", err)
	}
	// 3. Get and print all keyword entries (in MDD, this is usually the file path)
	entries, err := mdd.GetKeyWordEntries()
	if err != nil {
		log.Fatalf("Failed to get keyword entries: %v", err)
	}
	fmt.Printf("Found %d resource files in '%s':\n", len(entries), mdd.Name())
	for i, entry := range entries {
		// Print only the first 10 as an example
		if i >= 10 {
			break
		}
		fmt.Println(entry.KeyWord) // The KeyWord field stores the resource file path
	}
}Issues and Pull Requests are welcome.
This project is licensed under the GNU General Public License v3.0.