@@ -14,6 +14,56 @@ sub url-munge($_) is export {
14
14
return $ _ ;
15
15
}
16
16
17
+ constant badchars = qw [ $ / \ . % ? & = # + " ' : ~ < > ] ;
18
+ my \goodnames = badchars. map : ' $' ~ *. uniname . subst (' ' , ' _' , : g);
19
+ constant length = badchars. elems ;
20
+
21
+ sub escape-filename ($ s is copy ) is export {
22
+ # return $s if $s ~~ m{^ <[a..z]>+ '://'}; # bail on external links
23
+
24
+ loop (my int $ i = 0 ;$ i < length;$ i ++ ) {
25
+ $ s = $ s . subst (badchars[$ i ], goodnames[$ i ], : g)
26
+ }
27
+
28
+ $ s
29
+ }
30
+
31
+ sub rewrite-url ($ s ) is export {
32
+ my Str $ r ;
33
+ given $ s {
34
+ when / ^ [ 'http' | 'https' | 'irc' ] '://' / {
35
+ # external link, we bail
36
+ return $ s ;
37
+ }
38
+
39
+ when / ^ '#' / {
40
+ # on-page link, we bail
41
+ return $ s ;
42
+ }
43
+
44
+ # special case the really nasty ones
45
+ when / ^ '/routine//' $ / { return ' /routine/' ~ escape-filename(' /' ); succeed; }
46
+ when / ^ '/routine///' $ / { return ' /routine/' ~ escape-filename(' //' ); succeed; }
47
+
48
+ when / ^ ([ '/routine/' | '/syntax/' | '/language/' | '/programs/' | '/type/' ]) (<- [ #/ ] >+ ) [ ('#' ) (<- [ /# ] >+ ) ]* $ / {
49
+ $ r = $0 ~ escape-filename($1 ) ~ $2 ~ uri_escape($3 );
50
+ succeed;
51
+ }
52
+
53
+ default {
54
+ my @ parts = $ s . split (' #' );
55
+ $ r = escape-filename(@ parts [0 ]) ~ ' #' ~ uri_escape(@ parts [1 ]) if @ parts [1 ];
56
+ $ r = escape-filename(@ parts [0 ]) unless @ parts [1 ];
57
+ }
58
+ }
59
+
60
+ my $ file-part = $ r . split (' #' )[0 ] ~ ' .html' ;
61
+
62
+ die " $ file-part not found" unless $ file-part . IO : e: f: s;
63
+
64
+ return $ r ;
65
+ }
66
+
17
67
# | Return the footer HTML for each page
18
68
sub footer-html ($ pod-path ) is export {
19
69
my $ footer = slurp ' template/footer.html' ;
0 commit comments