Skip to content

Commit 4ed93b8

Browse files
committed
Add support for an external-title style property
1 parent 81d4053 commit 4ed93b8

File tree

4 files changed

+81
-8
lines changed

4 files changed

+81
-8
lines changed

blog/build/render/scribble.rkt

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,18 @@
133133
(define (resolve-tag base-tag ri)
134134
(add-current-tag-prefix (tag-key base-tag ri)))
135135

136+
;; Taken from `scribble/base-render` to match what the base renderer does.
137+
(define (extend-tag-prefix d fresh?)
138+
(cond
139+
[fresh? null]
140+
[(part-tag-prefix d)
141+
(cons (part-tag-prefix d) (current-tag-prefixes))]
142+
[else (current-tag-prefixes)]))
143+
144+
(define (part-render-style d)
145+
(or (findf link-render-style? (style-properties (part-style d)))
146+
(current-link-render-style)))
147+
136148
(define tag->local-redirect-query-string
137149
(let ()
138150
(define racket-renderer (new (scribble:render-mixin render%)
@@ -195,10 +207,25 @@
195207
;; * `render-nested-flow` calls `render-flow` instead of calling `render-block`
196208
;; directly. As a side-effect of this change, `render-nested-flow` returns a
197209
;; flat list (of rendered blocks) rather than a list of lists.
210+
;;
211+
;; Additionally, `base-render%` handles appropriately traversing, collecting,
212+
;; and resolving content in any `external-title` style properties on parts,
213+
;; though it does not use the content for anything.
198214
(define base-render%
199215
(class/hijack render%
200216
#:hijack-methods [render-one]
201-
(inherit collect-part render-flow)
217+
(inherit traverse-content
218+
collect-content collect-part
219+
fresh-tag-resolve-context? resolve-content resolve-flow
220+
render-flow)
221+
222+
(define/override (traverse-part d fp)
223+
(~>> (cond
224+
[(findf external-title? (style-properties (part-style d)))
225+
=> (λ (ext-title)
226+
(traverse-content (external-title-content ext-title) fp))]
227+
[else fp])
228+
(super traverse-part d)))
202229

203230
(define/override (start-collect ds fns ci)
204231
(for-each (lambda (d fn)
@@ -208,6 +235,31 @@
208235
ds
209236
fns))
210237

238+
(define/override (collect-part-tags d ci number)
239+
(super collect-part-tags d ci number)
240+
(cond
241+
[(findf external-title? (style-properties (part-style d)))
242+
=> (λ (ext-title)
243+
(collect-content (external-title-content ext-title) ci))]))
244+
245+
; We unfortunately have to replace this method wholesale, since we need to
246+
; resolve the title content with `current-tag-prefixes` and
247+
; `current-link-render-style` properly adjusted. The implementation is
248+
; otherwise taken from `scribble/base-render` unmodified.
249+
(define/override (resolve-part d ri)
250+
(parameterize ([current-tag-prefixes
251+
(extend-tag-prefix d (fresh-tag-resolve-context? d ri))]
252+
[current-link-render-style (part-render-style d)])
253+
(when (part-title-content d)
254+
(resolve-content (part-title-content d) d ri))
255+
(cond
256+
[(findf external-title? (style-properties (part-style d)))
257+
=> (λ (ext-title)
258+
(resolve-content (external-title-content ext-title) d ri))])
259+
(resolve-flow (part-blocks d) d ri)
260+
(for ([p (part-parts d)])
261+
(resolve-part p ri))))
262+
211263
(define/overment (render-one part ri output-file)
212264
(parameterize ([current-output-file output-file]
213265
[current-top-part part])
@@ -264,11 +316,18 @@
264316
(define/override (collect-part-tags d ci number)
265317
(for ([t (part-tags d)])
266318
(define key (generate-tag t ci))
267-
(define title (or (part-title-content d) "???"))
319+
(define title-content
320+
(cond
321+
[(findf external-title? (style-properties (part-style d)))
322+
=> (λ (ext-title)
323+
(collect-content (external-title-content ext-title) ci)
324+
(external-title-content ext-title))]
325+
[(part-title-content d)]
326+
[else "???"]))
268327
(collect-put! ci key
269328
(if (current-part-whole-page? d)
270-
(blog-page title (get-current-site-path))
271-
(blog-page-anchor title
329+
(blog-page title-content (get-current-site-path))
330+
(blog-page-anchor title-content
272331
(get-current-site-path)
273332
(tag->anchor-name (add-current-tag-prefix key)))))))
274333

blog/lang/base.rkt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
(struct-out post-date)
2424
(struct-out post-tags)
2525
(struct-out table-rows)
26+
(struct-out external-title)
2627
blog-post
2728
deftech
2829
tech

blog/lang/metadata.rkt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
(struct link-target ([tag tag?]))
1818
(struct css-styles ([assoc (listof (cons/c symbol? string?))]))
1919
(struct table-rows ([styles (listof style?)]))
20+
(struct external-title ([content content?]))
2021

2122
[taglet-add-prefix (-> (or/c (or/c string? symbol?)
2223
(listof (or/c string? symbol?)))
@@ -49,6 +50,11 @@
4950
;; apply to the table’s <tr> elements.
5051
(struct table-rows (styles) #:transparent)
5152

53+
;; A style property that can be attached to a `part` to supply alternate
54+
;; `content` to use when the part is linked to instead of the part’s usual
55+
;; title content.
56+
(struct external-title (content) #:transparent)
57+
5258
(define (taglet-add-prefix prefix taglet)
5359
(if (list? prefix)
5460
(foldr taglet-add-prefix taglet prefix)

blog/markdown.rkt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@
3232

3333
(define (parse-title-info in)
3434
(match-define (list _ title-bytes) (regexp-match #px"^ Title: ([^\n]+)\n" in))
35+
(define external-title-str
36+
(match (regexp-try-match #px"^ External title: ([^\n]+)\n" in)
37+
[(list _ external-title-bytes) (bytes->string/utf-8 external-title-bytes)]
38+
[_ #f]))
3539
(match-define (list _ year-bytes month-bytes day-bytes)
3640
(regexp-match #px"^ Date: ([0-9]{4})-([0-9]{2})-([0-9]{2})[^\n]*\n" in))
3741
(match-define (list _ tags-bytes)
@@ -41,10 +45,13 @@
4145
(string->document (bytes->string/utf-8 title-bytes)))
4246
(define tags (string-split (bytes->string/utf-8 tags-bytes) ", " #:trim? #f))
4347

44-
(title #:style (style #f (list (post-date (bytes->number year-bytes)
45-
(bytes->number month-bytes)
46-
(bytes->number day-bytes))
47-
(post-tags tags)))
48+
(define base-props (list (post-date (bytes->number year-bytes)
49+
(bytes->number month-bytes)
50+
(bytes->number day-bytes))
51+
(post-tags tags)))
52+
(title #:style (style #f (if external-title-str
53+
(cons (external-title external-title-str) base-props)
54+
base-props))
4855
(render-inline title-content)))
4956

5057
(define (bytes->number bs)

0 commit comments

Comments
 (0)