commit e00eb753c348be5092b41a2f249266be57dc0ce4
parent fc08b7ba49b068721acf12a87f99836e8d4dc052
Author: Alex Suraci <suraci.alex@gmail.com>
Date: Tue, 28 Apr 2015 14:07:13 -0700
markdown hyperlinks can now contain other content
e.g. [**foo** `bar` _baz_](http://example.com)
Diffstat:
3 files changed, 30 insertions(+), 15 deletions(-)
diff --git 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
@@ -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
@@ -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_.