...
This commit is contained in:
parent
f938e8ff6b
commit
60e688810d
235
README.md
235
README.md
@ -1,2 +1,235 @@
|
||||
# doctree
|
||||
# DocTree
|
||||
|
||||
DocTree is a Rust library for managing collections of markdown documents with powerful include functionality. It provides a robust system for organizing, processing, and retrieving document collections with Redis-backed storage.
|
||||
|
||||
## Overview
|
||||
|
||||
DocTree scans directories for `.collection` files, which define document collections. Each collection contains markdown documents and other files (like images). The library provides functionality to:
|
||||
|
||||
- Scan directories recursively to find collections
|
||||
- Process includes between documents (allowing one document to include content from another)
|
||||
- Convert markdown to HTML
|
||||
- Store document metadata in Redis for efficient retrieval
|
||||
- Provide a command-line interface for interacting with collections
|
||||
|
||||
## Key Concepts
|
||||
|
||||
### Collections
|
||||
|
||||
A collection is a group of related documents and files. Collections are defined by a `.collection` file in a directory. The `.collection` file can be empty (in which case the directory name is used as the collection name) or it can contain TOML configuration:
|
||||
|
||||
```toml
|
||||
name = "my_collection"
|
||||
# Other configuration options can be added in the future
|
||||
```
|
||||
|
||||
### DocTree
|
||||
|
||||
A DocTree is a manager for multiple collections. It provides methods for:
|
||||
|
||||
- Adding collections
|
||||
- Retrieving documents from collections
|
||||
- Processing includes between documents
|
||||
- Converting markdown to HTML
|
||||
- Managing collection metadata in Redis
|
||||
|
||||
### Includes
|
||||
|
||||
One of the most powerful features of DocTree is the ability to include content from one document in another. This is done using the `!!include` directive:
|
||||
|
||||
```markdown
|
||||
# My Document
|
||||
|
||||
This is my document.
|
||||
|
||||
!!include another_collection:some_document.md
|
||||
|
||||
More content here...
|
||||
```
|
||||
|
||||
The include directive supports several formats:
|
||||
- `!!include collection_name:page_name` - Include a page from a specific collection
|
||||
- `!!include collection_name:'page name'` - Include a page with spaces from a specific collection
|
||||
- `!!include page_name` - Include a page from the current collection
|
||||
- `!!include name:'page name'` - Include a page with spaces from the current collection
|
||||
|
||||
Includes can be nested, allowing for complex document structures.
|
||||
|
||||
## Storage
|
||||
|
||||
DocTree uses Redis as a backend storage system. Document metadata (like paths and names) is stored in Redis, making it efficient to retrieve documents without scanning the filesystem each time.
|
||||
|
||||
The Redis keys are structured as:
|
||||
- `collections:{collection_name}:{document_name}` - Stores the relative path to a document
|
||||
- `collections:{collection_name}:path` - Stores the absolute path to the collection
|
||||
|
||||
## Command-Line Interface
|
||||
|
||||
DocTree comes with a command-line interface (CLI) that provides access to the library's functionality:
|
||||
|
||||
```
|
||||
DocTree CLI 0.1.0
|
||||
A tool to manage document collections
|
||||
|
||||
USAGE:
|
||||
doctreecmd [SUBCOMMAND]
|
||||
|
||||
FLAGS:
|
||||
-h, --help Prints help information
|
||||
-V, --version Prints version information
|
||||
|
||||
SUBCOMMANDS:
|
||||
delete-collection Delete a collection from Redis
|
||||
get Get page content
|
||||
html Get page content as HTML
|
||||
info Show detailed information about collections
|
||||
list List collections
|
||||
reset Delete all collections from Redis
|
||||
scan Scan a directory for .collection files and create collections
|
||||
```
|
||||
|
||||
### Example Commands
|
||||
|
||||
#### Scanning Collections
|
||||
|
||||
```bash
|
||||
doctreecmd scan /path/to/documents --doctree my_doctree
|
||||
```
|
||||
|
||||
This command scans the specified directory for `.collection` files and creates collections in Redis.
|
||||
|
||||
#### Listing Collections
|
||||
|
||||
```bash
|
||||
doctreecmd list --doctree my_doctree
|
||||
```
|
||||
|
||||
This command lists all collections in the specified doctree.
|
||||
|
||||
#### Getting Document Content
|
||||
|
||||
```bash
|
||||
doctreecmd get -c collection_name -p page_name --doctree my_doctree
|
||||
```
|
||||
|
||||
This command retrieves the content of a document from a collection.
|
||||
|
||||
#### Getting HTML Content
|
||||
|
||||
```bash
|
||||
doctreecmd get -c collection_name -p page_name -f html --doctree my_doctree
|
||||
```
|
||||
|
||||
This command retrieves the HTML content of a document from a collection.
|
||||
|
||||
#### Showing Collection Information
|
||||
|
||||
```bash
|
||||
doctreecmd info collection_name --doctree my_doctree
|
||||
```
|
||||
|
||||
This command shows detailed information about a collection, including its documents and files.
|
||||
|
||||
#### Deleting a Collection
|
||||
|
||||
```bash
|
||||
doctreecmd delete-collection collection_name --doctree my_doctree
|
||||
```
|
||||
|
||||
This command deletes a collection from Redis.
|
||||
|
||||
#### Resetting All Collections
|
||||
|
||||
```bash
|
||||
doctreecmd reset --doctree my_doctree
|
||||
```
|
||||
|
||||
This command deletes all collections from Redis.
|
||||
|
||||
## Implementation Details
|
||||
|
||||
DocTree is implemented in Rust and uses several key dependencies:
|
||||
|
||||
- `walkdir` for recursively walking directories
|
||||
- `pulldown-cmark` for parsing and rendering markdown
|
||||
- `toml` for parsing collection configuration files
|
||||
- `redis` for interacting with Redis
|
||||
- `clap` for the command-line interface
|
||||
|
||||
The library is structured into several modules:
|
||||
|
||||
- `doctree.rs` - Core DocTree functionality
|
||||
- `collection.rs` - Collection management
|
||||
- `include.rs` - Include processing
|
||||
- `storage.rs` - Redis storage backend
|
||||
- `utils.rs` - Utility functions
|
||||
- `error.rs` - Error handling
|
||||
|
||||
## Use Cases
|
||||
|
||||
DocTree is particularly useful for:
|
||||
|
||||
1. **Documentation Systems**: Manage and organize technical documentation with the ability to include common sections across multiple documents.
|
||||
|
||||
2. **Content Management**: Create a flexible content management system where content can be modularized and reused.
|
||||
|
||||
3. **Knowledge Bases**: Build knowledge bases with interconnected documents that can reference each other.
|
||||
|
||||
4. **Static Site Generation**: Generate static websites from markdown documents with the ability to include common elements.
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Rust (latest stable version)
|
||||
- Redis server running on localhost:6379 (or configure a different URL)
|
||||
|
||||
### Building
|
||||
|
||||
```bash
|
||||
cargo build --release
|
||||
```
|
||||
|
||||
### Running the CLI
|
||||
|
||||
```bash
|
||||
cargo run --bin doctreecmd -- [SUBCOMMAND]
|
||||
```
|
||||
|
||||
### Using the Library
|
||||
|
||||
Add doctree to your Cargo.toml:
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
doctree = { path = "path/to/doctree" }
|
||||
```
|
||||
|
||||
Basic usage:
|
||||
|
||||
```rust
|
||||
use doctree::{DocTree, RedisStorage, Result, from_directory};
|
||||
use std::path::Path;
|
||||
|
||||
fn main() -> Result<()> {
|
||||
// Create a DocTree by scanning a directory
|
||||
let doctree = from_directory(Path::new("path/to/documents"), Some("my_doctree"))?;
|
||||
|
||||
// List collections
|
||||
let collections = doctree.list_collections();
|
||||
for collection in collections {
|
||||
println!("Collection: {}", collection);
|
||||
}
|
||||
|
||||
// Get a document with includes processed
|
||||
let content = doctree.page_get(Some("collection_name"), "page_name")?;
|
||||
println!("{}", content);
|
||||
|
||||
// Get a document as HTML
|
||||
let html = doctree.page_get_html(Some("collection_name"), "page_name")?;
|
||||
println!("{}", html);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
```
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user