From e00eb753c348be5092b41a2f249266be57dc0ce4 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Tue, 28 Apr 2015 14:07:13 -0700 Subject: [PATCH] markdown hyperlinks can now contain other content e.g. [**foo** `bar` _baz_](http://example.com) --- scribble-lib/scribble/markdown-render.rkt | 36 +++++++++++-------- .../tests/scribble/markdown-docs/example.md | 5 +++ .../scribble/markdown-docs/example.scrbl | 4 +++ 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/scribble-lib/scribble/markdown-render.rkt b/scribble-lib/scribble/markdown-render.rkt index 9a5b058f..13478d41 100644 --- a/scribble-lib/scribble/markdown-render.rkt +++ b/scribble-lib/scribble/markdown-render.rkt @@ -184,6 +184,7 @@ (define in-bold? (make-parameter #f)) (define in-italic? (make-parameter #f)) (define in-code? (make-parameter #f)) + (define in-link? (make-parameter #f)) (define preserving-spaces? (make-parameter #f)) (define (bold? i) @@ -200,6 +201,13 @@ (style-name s) (regexp-match? #rx"^Rkt[A-Z]" (style-name s))))))) + (define (link? i) + (let ([s (content-style i)]) + (and (style? s) (findf target-url? (style-properties s))))) + + (define (link-from i) + (target-url-addr (findf target-url? (style-properties (content-style i))))) + (define (preserve-spaces? i) (and (element? i) (let ([s (element-style i)]) @@ -207,6 +215,9 @@ (and (style? s) (eq? 'hspace (style-name s))))))) + (define (sanitize-parens str) + (regexp-replace #rx"[\\(\\)]" str "\\&")) + (define/override (render-content i part ri) (define (recurse-wrapped str param) (display str) @@ -229,20 +240,15 @@ (parameterize ([preserving-spaces? #t]) (render-content i part ri))] - [else - (define properties (let ([s (content-style i)]) - (if (style? s) (style-properties s) '()))) - (define targ (for/or ([p properties]) - (if (target-url? p) p #f))) - (define url (and targ (target-url-addr targ))) - (cond [url (define new-i - (match (element-content i) - [(list (? string? s)) - (element (element-style i) - (list (format "[~a](~a)" s url)))] - [else i])) - (super render-content new-i part ri)] - [else (super render-content i part ri)])])) + [(and (link? i) (not (in-link?))) + (let ([link (link-from i)]) + (display "[") + (begin0 + (parameterize ([in-link? #t]) + (render-content i part ri)) + (printf "](~a)" (sanitize-parens link))))] + + [else (super render-content i part ri)])) (define/override (render-nested-flow i part ri starting-item?) (define s (nested-flow-style i)) @@ -277,7 +283,7 @@ (let* ([i (if (in-code?) (regexp-replace** i '([#rx"``" . "\U201C"] [#rx"''" . "\U201D"])) - (regexp-replace* #px"([#_*`]{1})" i "\\\\\\1"))] + (regexp-replace* #px"([#_*`\\[\\(\\]\\)]{1})" i "\\\\\\1"))] [i (if (preserving-spaces?) (regexp-replace* #rx" " i "\uA0") i)]) diff --git a/scribble-test/tests/scribble/markdown-docs/example.md b/scribble-test/tests/scribble/markdown-docs/example.md index 4bd54886..30d43c77 100644 --- a/scribble-test/tests/scribble/markdown-docs/example.md +++ b/scribble-test/tests/scribble/markdown-docs/example.md @@ -22,6 +22,11 @@ Here is a hyperlink: [I am a hyperlink to Racket.](http://racket-lang.org/) +[I am a **Bold** hyperlink to Racket.](http://racket-lang.org/) + +[I am a **Bold** hyperlink to Racket with \[wacky characters\]\(blah +blah\).](http://racket-lang.org/) + _Italic_. \_Just underlines\_. **Bold**. \*Just asterisks.\* diff --git a/scribble-test/tests/scribble/markdown-docs/example.scrbl b/scribble-test/tests/scribble/markdown-docs/example.scrbl index 493ad6a9..4f938b52 100644 --- a/scribble-test/tests/scribble/markdown-docs/example.scrbl +++ b/scribble-test/tests/scribble/markdown-docs/example.scrbl @@ -30,6 +30,10 @@ Here is a hyperlink: @hyperlink["http://racket-lang.org/" "I am a hyperlink to Racket."] +@hyperlink["http://racket-lang.org/"]{I am a @bold{Bold} hyperlink to Racket.} + +@hyperlink["http://racket-lang.org/"]{I am a @bold{Bold} hyperlink to Racket with [wacky characters](blah blah).} + @italic{Italic}. _Just underlines_.