New: support Obsidian's "Strict line breaks" setting
This change introduces a new `--hard-linebreaks` CLI argument. When used, this converts soft line breaks to hard line breaks, mimicking Obsidian's "Strict line breaks" setting. Implementation detail: I considered naming this flag `--strict-line-breaks` to be consistent with Obsidian itself, however I feel the name is somewhat misleading and ill-chosen.
This commit is contained in:
parent
838881fea0
commit
84308c9f1f
@ -6,6 +6,7 @@ extern crate lazy_static;
|
|||||||
|
|
||||||
mod context;
|
mod context;
|
||||||
mod frontmatter;
|
mod frontmatter;
|
||||||
|
pub mod postprocessors;
|
||||||
mod references;
|
mod references;
|
||||||
mod walker;
|
mod walker;
|
||||||
|
|
||||||
|
12
src/main.rs
12
src/main.rs
@ -1,5 +1,6 @@
|
|||||||
use eyre::{eyre, Result};
|
use eyre::{eyre, Result};
|
||||||
use gumdrop::Options;
|
use gumdrop::Options;
|
||||||
|
use obsidian_export::postprocessors::softbreaks_to_hardbreaks;
|
||||||
use obsidian_export::{ExportError, Exporter, FrontmatterStrategy, WalkOptions};
|
use obsidian_export::{ExportError, Exporter, FrontmatterStrategy, WalkOptions};
|
||||||
use std::{env, path::PathBuf};
|
use std::{env, path::PathBuf};
|
||||||
|
|
||||||
@ -46,6 +47,13 @@ struct Opts {
|
|||||||
|
|
||||||
#[options(no_short, help = "Don't process embeds recursively", default = "false")]
|
#[options(no_short, help = "Don't process embeds recursively", default = "false")]
|
||||||
no_recursive_embeds: bool,
|
no_recursive_embeds: bool,
|
||||||
|
|
||||||
|
#[options(
|
||||||
|
no_short,
|
||||||
|
help = "Convert soft line breaks to hard line breaks. This mimics Obsidian's 'Strict line breaks' setting",
|
||||||
|
default = "false"
|
||||||
|
)]
|
||||||
|
hard_linebreaks: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn frontmatter_strategy_from_str(input: &str) -> Result<FrontmatterStrategy> {
|
fn frontmatter_strategy_from_str(input: &str) -> Result<FrontmatterStrategy> {
|
||||||
@ -82,6 +90,10 @@ fn main() {
|
|||||||
exporter.process_embeds_recursively(!args.no_recursive_embeds);
|
exporter.process_embeds_recursively(!args.no_recursive_embeds);
|
||||||
exporter.walk_options(walk_options);
|
exporter.walk_options(walk_options);
|
||||||
|
|
||||||
|
if args.hard_linebreaks {
|
||||||
|
exporter.add_postprocessor(&softbreaks_to_hardbreaks);
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(path) = args.start_at {
|
if let Some(path) = args.start_at {
|
||||||
exporter.start_at(path);
|
exporter.start_at(path);
|
||||||
}
|
}
|
||||||
|
20
src/postprocessors.rs
Normal file
20
src/postprocessors.rs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
//! A collection of officially maintained [postprocessors][crate::Postprocessor].
|
||||||
|
|
||||||
|
use super::{Context, MarkdownEvents, PostprocessorResult};
|
||||||
|
use pulldown_cmark::Event;
|
||||||
|
|
||||||
|
/// This postprocessor converts all soft line breaks to hard line breaks. Enabling this mimics
|
||||||
|
/// Obsidian's _'Strict line breaks'_ setting.
|
||||||
|
pub fn softbreaks_to_hardbreaks(
|
||||||
|
context: Context,
|
||||||
|
events: MarkdownEvents,
|
||||||
|
) -> (Context, MarkdownEvents, PostprocessorResult) {
|
||||||
|
let events = events
|
||||||
|
.into_iter()
|
||||||
|
.map(|event| match event {
|
||||||
|
Event::SoftBreak => Event::HardBreak,
|
||||||
|
_ => event,
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
(context, events, PostprocessorResult::Continue)
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
|
use obsidian_export::postprocessors::softbreaks_to_hardbreaks;
|
||||||
use obsidian_export::{Context, Exporter, MarkdownEvents, PostprocessorResult};
|
use obsidian_export::{Context, Exporter, MarkdownEvents, PostprocessorResult};
|
||||||
use pretty_assertions::assert_eq;
|
use pretty_assertions::assert_eq;
|
||||||
use pulldown_cmark::{CowStr, Event};
|
use pulldown_cmark::{CowStr, Event};
|
||||||
@ -208,3 +209,25 @@ fn test_embed_postprocessors_context() {
|
|||||||
|
|
||||||
exporter.run().unwrap();
|
exporter.run().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_softbreaks_to_hardbreaks() {
|
||||||
|
let tmp_dir = TempDir::new().expect("failed to make tempdir");
|
||||||
|
let mut exporter = Exporter::new(
|
||||||
|
PathBuf::from("tests/testdata/input/postprocessors"),
|
||||||
|
tmp_dir.path().to_path_buf(),
|
||||||
|
);
|
||||||
|
exporter.add_postprocessor(&softbreaks_to_hardbreaks);
|
||||||
|
exporter.run().unwrap();
|
||||||
|
|
||||||
|
let expected =
|
||||||
|
read_to_string("tests/testdata/expected/postprocessors/hard_linebreaks.md").unwrap();
|
||||||
|
let actual = read_to_string(
|
||||||
|
tmp_dir
|
||||||
|
.path()
|
||||||
|
.clone()
|
||||||
|
.join(PathBuf::from("hard_linebreaks.md")),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
}
|
||||||
|
18
tests/testdata/expected/postprocessors/hard_linebreaks.md
vendored
Normal file
18
tests/testdata/expected/postprocessors/hard_linebreaks.md
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Heading 1
|
||||||
|
|
||||||
|
Here's a random quote from fortune(6):
|
||||||
|
|
||||||
|
"I don't have to take this abuse from you -- I've got hundreds of
|
||||||
|
people waiting to abuse me."
|
||||||
|
-- Bill Murray, "Ghostbusters"
|
||||||
|
|
||||||
|
## Heading 2
|
||||||
|
|
||||||
|
Here's another random quote from fortune(6):
|
||||||
|
|
||||||
|
````
|
||||||
|
Cinemuck, n.:
|
||||||
|
The combination of popcorn, soda, and melted chocolate which
|
||||||
|
covers the floors of movie theaters.
|
||||||
|
-- Rich Hall, "Sniglets"
|
||||||
|
````
|
18
tests/testdata/input/postprocessors/hard_linebreaks.md
vendored
Normal file
18
tests/testdata/input/postprocessors/hard_linebreaks.md
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Heading 1
|
||||||
|
|
||||||
|
Here's a random quote from fortune(6):
|
||||||
|
|
||||||
|
"I don't have to take this abuse from you -- I've got hundreds of
|
||||||
|
people waiting to abuse me."
|
||||||
|
-- Bill Murray, "Ghostbusters"
|
||||||
|
|
||||||
|
## Heading 2
|
||||||
|
|
||||||
|
Here's another random quote from fortune(6):
|
||||||
|
|
||||||
|
```
|
||||||
|
Cinemuck, n.:
|
||||||
|
The combination of popcorn, soda, and melted chocolate which
|
||||||
|
covers the floors of movie theaters.
|
||||||
|
-- Rich Hall, "Sniglets"
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user