rumdl_lib/utils/anchor_styles/
mod.rs1pub mod common;
16pub mod github;
17pub mod kramdown;
18pub mod kramdown_gfm; use serde::{Deserialize, Serialize};
21
22#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
24#[serde(rename_all = "kebab-case")]
25#[derive(Default)]
26pub enum AnchorStyle {
27 #[default]
29 #[serde(rename = "github")]
30 GitHub,
31 #[serde(rename = "kramdown-gfm", alias = "kramdown_gfm", alias = "jekyll")]
34 KramdownGfm,
35 #[serde(rename = "kramdown")]
37 Kramdown,
38}
39
40impl AnchorStyle {
41 pub fn generate_fragment(&self, heading: &str) -> String {
43 match self {
44 AnchorStyle::GitHub => github::heading_to_fragment(heading),
45 AnchorStyle::KramdownGfm => kramdown_gfm::heading_to_fragment(heading),
46 AnchorStyle::Kramdown => kramdown::heading_to_fragment(heading),
47 }
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54
55 #[test]
56 fn test_anchor_style_serde() {
57 assert_eq!(serde_json::to_string(&AnchorStyle::GitHub).unwrap(), "\"github\"");
59 assert_eq!(
60 serde_json::to_string(&AnchorStyle::KramdownGfm).unwrap(),
61 "\"kramdown-gfm\""
62 );
63 assert_eq!(serde_json::to_string(&AnchorStyle::Kramdown).unwrap(), "\"kramdown\"");
64
65 assert_eq!(
67 serde_json::from_str::<AnchorStyle>("\"github\"").unwrap(),
68 AnchorStyle::GitHub
69 );
70 assert_eq!(
71 serde_json::from_str::<AnchorStyle>("\"kramdown-gfm\"").unwrap(),
72 AnchorStyle::KramdownGfm
73 );
74 assert_eq!(
75 serde_json::from_str::<AnchorStyle>("\"kramdown\"").unwrap(),
76 AnchorStyle::Kramdown
77 );
78
79 assert_eq!(
81 serde_json::from_str::<AnchorStyle>("\"kramdown_gfm\"").unwrap(),
82 AnchorStyle::KramdownGfm
83 );
84
85 assert_eq!(
87 serde_json::from_str::<AnchorStyle>("\"jekyll\"").unwrap(),
88 AnchorStyle::KramdownGfm
89 );
90 }
91
92 #[test]
93 fn test_anchor_style_differences() {
94 let test_cases = [
95 "cbrown --> sbrown: --unsafe-paths",
96 "Update login_type",
97 "Test---with---multiple---hyphens",
98 "API::Response > Error--Handling",
99 ];
100
101 for case in test_cases {
102 let github = AnchorStyle::GitHub.generate_fragment(case);
103 let kramdown_gfm = AnchorStyle::KramdownGfm.generate_fragment(case);
104 let kramdown = AnchorStyle::Kramdown.generate_fragment(case);
105
106 assert!(!github.is_empty(), "GitHub style failed for: {case}");
108 assert!(!kramdown_gfm.is_empty(), "KramdownGfm style failed for: {case}");
109 assert!(!kramdown.is_empty(), "Kramdown style failed for: {case}");
110 }
111 }
112}