# WriterOptions
The `WriterOptions` struct controls how the Markdown output is formatted by `CommonMarkWriter`. It provides a way to customize various aspects of the generated CommonMark text.
## Creating Options
The recommended way to create options is using the builder pattern:
```rust
use cmark_writer::options::WriterOptionsBuilder;
let options = WriterOptionsBuilder::new()
.soft_break("\n")
.hard_break(" \n")
.list_marker('*')
.code_fence_char('`')
.build();
```
## Available Options
### Text Formatting
| `soft_break` | String to use for soft line breaks | `"\n"` | `"\n"` |
| `hard_break` | String to use for hard line breaks | `" \n"` | `" \n"` |
| `html_escape` | Whether to escape HTML special characters | `true` | `true` |
### List Formatting
| `list_marker` | Character to use for unordered lists | `'-'` | `'*'`, `'-'`, `'+'` |
| `ordered_list_marker` | Character to use after numbers in ordered lists | `'.'` | `'.'`, `')'` |
### Code Blocks
| `code_fence_char` | Character to use for code fences | ``'`'`` | ``'`'``, `'~'` |
| `code_fence_length` | Number of fence characters | `3` | `3`, `4` |
### Spacing
| `heading_spacing` | Whether to add a space after heading markers | `true` | `# Heading` vs `#Heading` |
| `list_item_spacing` | Whether to add a space after list markers | `true` | `- Item` vs `-Item` |
### Tables (GFM)
These options are available when the `gfm` feature is enabled:
| `table_cell_padding` | Minimum number of spaces for table cell padding | `1` | `| Cell |` vs `|Cell|` |
| `align_table_pipes` | Whether to align table pipes vertically | `true` | Aligned vs non-aligned pipes |
### Advanced Options
| `preserve_reference_definitions` | Whether to preserve reference definitions when writing | `true` | `[ref]: url` |
| `end_with_newline` | Whether to ensure output ends with a newline | `true` | Document with trailing newline |
## Usage Examples
### Customizing List Formatting
```rust
use cmark_writer::{Node, CommonMarkWriter, options::WriterOptionsBuilder};
// Create options with asterisks for unordered lists
let options = WriterOptionsBuilder::new()
.list_marker('*')
.build();
let list = Node::UnorderedList(vec![/* ... */]);
let mut writer = CommonMarkWriter::with_options(options);
writer.write(&list).expect("Failed to write list");
// Result will use asterisks instead of hyphens:
// * Item 1
// * Item 2
```
### Customizing Code Blocks
```rust
use cmark_writer::{Node, CommonMarkWriter, options::WriterOptionsBuilder};
// Create options with tildes for code fences
let options = WriterOptionsBuilder::new()
.code_fence_char('~')
.code_fence_length(4)
.build();
let code_block = Node::code_block(Some("rust".to_string()), "fn main() {}".to_string());
let mut writer = CommonMarkWriter::with_options(options);
writer.write(&code_block).expect("Failed to write code block");
// Result will use tildes instead of backticks:
// ~~~~rust
// fn main() {}
// ~~~~
```
### GFM Table Formatting
When the `gfm` feature is enabled:
```rust
use cmark_writer::{Node, CommonMarkWriter, options::WriterOptionsBuilder};
// Create options for table formatting
let options = WriterOptionsBuilder::new()
.table_cell_padding(2) // More spacing in cells
.align_table_pipes(true)
.build();
let table = /* ... */;
let mut writer = CommonMarkWriter::with_options(options);
writer.write(&table).expect("Failed to write table");
// Result will have additional padding in table cells
// | Data 1 | Data 2 |
```
## Default Options
The default options are designed to produce clean, widely-compatible Markdown:
```rust
use cmark_writer::options::{WriterOptions, WriterOptionsBuilder};
// These are equivalent:
let default1 = WriterOptions::default();
let default2 = WriterOptionsBuilder::new().build();
```