@@ -66,7 +66,7 @@ pub fn id_from_content(content: &str) -> String {
66
66
normalize_id ( trimmed)
67
67
}
68
68
69
- fn adjust_links ( event : Event ) -> Event {
69
+ fn adjust_links < ' a > ( event : Event < ' a > , with_base : & str ) -> Event < ' a > {
70
70
lazy_static ! {
71
71
static ref HTTP_LINK : Regex = Regex :: new( "^https?://" ) . unwrap( ) ;
72
72
static ref MD_LINK : Regex = Regex :: new( "(?P<link>.*).md(?P<anchor>#.*)?" ) . unwrap( ) ;
@@ -75,6 +75,12 @@ fn adjust_links(event: Event) -> Event {
75
75
match event {
76
76
Event :: Start ( Tag :: Link ( dest, title) ) => {
77
77
if !HTTP_LINK . is_match ( & dest) {
78
+ let dest = if !with_base. is_empty ( ) {
79
+ format ! ( "{}/{}" , with_base, dest)
80
+ } else {
81
+ dest. clone ( ) . into_owned ( )
82
+ } ;
83
+
78
84
if let Some ( caps) = MD_LINK . captures ( & dest) {
79
85
let mut html_link = [ & caps[ "link" ] , ".html" ] . concat ( ) ;
80
86
@@ -94,6 +100,10 @@ fn adjust_links(event: Event) -> Event {
94
100
95
101
/// Wrapper around the pulldown-cmark parser for rendering markdown to HTML.
96
102
pub fn render_markdown ( text : & str , curly_quotes : bool ) -> String {
103
+ render_markdown_with_base ( text, curly_quotes, "" )
104
+ }
105
+
106
+ pub fn render_markdown_with_base ( text : & str , curly_quotes : bool , base : & str ) -> String {
97
107
let mut s = String :: with_capacity ( text. len ( ) * 3 / 2 ) ;
98
108
99
109
let mut opts = Options :: empty ( ) ;
@@ -104,7 +114,7 @@ pub fn render_markdown(text: &str, curly_quotes: bool) -> String {
104
114
let mut converter = EventQuoteConverter :: new ( curly_quotes) ;
105
115
let events = p
106
116
. map ( clean_codeblock_headers)
107
- . map ( adjust_links)
117
+ . map ( |event| adjust_links ( event , base ) )
108
118
. map ( |event| converter. convert ( event) ) ;
109
119
110
120
html:: push_html ( & mut s, events) ;
0 commit comments