Skip to content

Commit

Permalink
feat(Automattic#104): add config options to markdown struct
Browse files Browse the repository at this point in the history
  • Loading branch information
grantlemons committed Dec 6, 2024
1 parent 72a1596 commit 183f07d
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 12 deletions.
60 changes: 49 additions & 11 deletions harper-core/src/parsers/markdown.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,13 @@ use crate::{Span, Token, TokenKind, TokenStringExt, VecExt};
/// CommonMark files.
///
/// Will ignore code blocks and tables.
pub struct Markdown;
#[derive(Default)]
pub struct Markdown(pub MarkdownOptions);

#[derive(Default, Copy, Clone)]
pub struct MarkdownOptions {
ignore_link_title: bool,
}

impl Markdown {
/// Remove hidden Wikilink target text.
Expand Down Expand Up @@ -202,7 +208,7 @@ impl Parser for Markdown {
});
continue;
}
if matches!(tag, Tag::Link { .. }) {
if self.0.ignore_link_title && matches!(tag, Tag::Link { .. }) {
tokens.push(Token {
span: Span::new_with_len(traversed_chars, text.chars().count()),
kind: TokenKind::Unlintable,
Expand Down Expand Up @@ -265,13 +271,13 @@ impl Parser for Markdown {
mod tests {
use super::super::StrParser;
use super::Markdown;
use crate::{Punctuation, TokenKind, TokenStringExt};
use crate::{parsers::markdown::MarkdownOptions, Punctuation, TokenKind, TokenStringExt};

#[test]
fn survives_emojis() {
let source = r#"🤷."#;

Markdown.parse_str(source);
Markdown::default().parse_str(source);
}

/// Check whether the Markdown parser will emit a breaking newline
Expand All @@ -282,7 +288,7 @@ mod tests {
fn ends_with_newline() {
let source = "This is a test.";

let tokens = Markdown.parse_str(source);
let tokens = Markdown::default().parse_str(source);
assert_ne!(tokens.len(), 0);
assert!(!tokens.last().unwrap().kind.is_newline());
}
Expand All @@ -291,7 +297,7 @@ mod tests {
fn math_becomes_unlintable() {
let source = r#"$\Katex$ $\text{is}$ $\text{great}$."#;

let tokens = Markdown.parse_str(source);
let tokens = Markdown::default().parse_str(source);
assert_eq!(
tokens.iter().map(|t| t.kind).collect::<Vec<_>>(),
vec![
Expand All @@ -309,7 +315,7 @@ mod tests {
fn hidden_wikilink_text() {
let source = r#"[[this is hidden|this is not]]"#;

let tokens = Markdown.parse_str(source);
let tokens = Markdown::default().parse_str(source);

let token_kinds = tokens.iter().map(|t| t.kind).collect::<Vec<_>>();

Expand All @@ -329,7 +335,7 @@ mod tests {
fn improper_wikilink_text() {
let source = r#"this is shown|this is also shown]]"#;

let tokens = Markdown.parse_str(source);
let tokens = Markdown::default().parse_str(source);

let token_kinds = tokens.iter().map(|t| t.kind).collect::<Vec<_>>();

Expand Down Expand Up @@ -360,7 +366,7 @@ mod tests {
#[test]
fn normal_wikilink() {
let source = r#"[[Wikilink]]"#;
let tokens = Markdown.parse_str(source);
let tokens = Markdown::default().parse_str(source);
let token_kinds = tokens.iter().map(|t| t.kind).collect::<Vec<_>>();

dbg!(&token_kinds);
Expand All @@ -371,18 +377,50 @@ mod tests {
#[test]
fn html_is_unlintable() {
let source = r#"The range of inputs from <ctrl-g> to ctrl-z"#;
let tokens = Markdown.parse_str(source);
let tokens = Markdown::default().parse_str(source);
assert_eq!(tokens.iter_unlintables().count(), 1);
}

#[test]
fn link_title_unlintable() {
let mut parser = Markdown(MarkdownOptions {
ignore_link_title: true,
..MarkdownOptions::default()
});
let source = r#"[elijah-potter/harper](https://github.com/elijah-potter/harper)"#;
let tokens = Markdown.parse_str(source);
let tokens = parser.parse_str(source);
let token_kinds = tokens.iter().map(|t| t.kind).collect::<Vec<_>>();

dbg!(&token_kinds);

assert!(matches!(token_kinds.as_slice(), &[TokenKind::Unlintable]))
}

#[test]
fn respects_config() {
let source = r#"[elijah-potter/harper](https://github.com/elijah-potter/harper)"#;
let mut parser = Markdown(MarkdownOptions {
ignore_link_title: true,
..MarkdownOptions::default()
});
let token_kinds = parser
.parse_str(source)
.iter()
.map(|t| t.kind)
.collect::<Vec<_>>();

assert!(matches!(token_kinds.as_slice(), &[TokenKind::Unlintable]));

let mut parser = Markdown(MarkdownOptions {
ignore_link_title: false,
..MarkdownOptions::default()
});
let token_kinds = parser
.parse_str(source)
.iter()
.map(|t| t.kind)
.collect::<Vec<_>>();

assert!(!matches!(token_kinds.as_slice(), &[TokenKind::Unlintable]));
}
}
2 changes: 1 addition & 1 deletion harper-core/src/parsers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ mod plain_english;
use blanket::blanket;
pub use collapse_identifiers::CollapseIdentifiers;
pub use isolate_english::IsolateEnglish;
pub use markdown::Markdown;
pub use markdown::{Markdown, MarkdownOptions};
pub use mask::Mask;
pub use plain_english::PlainEnglish;

Expand Down

0 comments on commit 183f07d

Please sign in to comment.