14
14
use Doctrine \RST \Environment ;
15
15
use Doctrine \RST \HTML \Renderers \SpanNodeRenderer as BaseSpanNodeRenderer ;
16
16
use Doctrine \RST \Nodes \SpanNode ;
17
- use Doctrine \RST \Templates \TemplateRenderer ;
17
+ use Doctrine \RST \References \ResolvedReference ;
18
+ use Doctrine \RST \Renderers \SpanNodeRenderer as AbstractSpanNodeRenderer ;
18
19
use SymfonyDocsBuilder \CI \UrlChecker ;
19
20
use function Symfony \Component \String \u ;
20
21
21
- class SpanNodeRenderer extends BaseSpanNodeRenderer
22
+ class SpanNodeRenderer extends AbstractSpanNodeRenderer
22
23
{
23
- /** @var TemplateRenderer */
24
- private $ templateRenderer ;
24
+ /** @var BaseSpanNodeRenderer */
25
+ private $ decoratedSpanNodeRenderer ;
25
26
/** @var UrlChecker|null */
26
27
private $ urlChecker ;
27
28
28
29
public function __construct (
29
30
Environment $ environment ,
30
31
SpanNode $ span ,
31
- TemplateRenderer $ templateRenderer ,
32
+ BaseSpanNodeRenderer $ decoratedSpanNodeRenderer ,
32
33
?UrlChecker $ urlChecker = null
33
34
) {
34
- parent ::__construct ($ environment , $ span, $ templateRenderer );
35
+ parent ::__construct ($ environment , $ span );
35
36
36
- $ this ->templateRenderer = $ templateRenderer ;
37
+ $ this ->decoratedSpanNodeRenderer = $ decoratedSpanNodeRenderer ;
37
38
$ this ->urlChecker = $ urlChecker ;
38
39
}
39
40
40
- /**
41
- * @param mixed[] $attributes
42
- */
41
+ /** @inheritDoc */
43
42
public function link (?string $ url , string $ title , array $ attributes = []): string
44
43
{
45
- $ url = (string ) $ url ;
44
+ $ url = (string )$ url ;
46
45
47
46
if (
48
47
$ this ->urlChecker &&
@@ -53,18 +52,25 @@ public function link(?string $url, string $title, array $attributes = []): strin
53
52
}
54
53
55
54
if (!$ this ->isSafeUrl ($ url )) {
56
- $ attributes ['rel ' ] = 'external noopener noreferrer ' ;
57
- $ attributes ['target ' ] = '_blank ' ;
55
+ $ attributes = $ this ->addAttributesForUnsafeUrl ($ attributes );
58
56
}
59
57
60
- return $ this ->templateRenderer ->render (
61
- 'link.html.twig ' ,
62
- [
63
- 'url ' => $ this ->environment ->generateUrl ($ url ),
64
- 'title ' => $ title ,
65
- 'attributes ' => $ attributes ,
66
- ]
67
- );
58
+ return $ this ->decoratedSpanNodeRenderer ->link ($ url , $ title , $ attributes );
59
+ }
60
+
61
+ public function reference (ResolvedReference $ reference , array $ value ): string
62
+ {
63
+ if (!$ this ->isSafeUrl ($ reference ->getUrl ())) {
64
+ $ reference = new ResolvedReference (
65
+ $ reference ->getFile (),
66
+ $ reference ->getTitle (),
67
+ $ reference ->getUrl (),
68
+ $ reference ->getTitles (),
69
+ $ this ->addAttributesForUnsafeUrl ($ reference ->getAttributes ())
70
+ );
71
+ }
72
+
73
+ return $ this ->decoratedSpanNodeRenderer ->reference ($ reference , $ value );
68
74
}
69
75
70
76
public function literal (string $ text ): string
@@ -78,7 +84,32 @@ public function literal(string $text): string
78
84
$ text = str_replace ('\\' , '<wbr> \\' , $ text );
79
85
}
80
86
81
- return $ this ->templateRenderer ->render ('literal.html.twig ' , ['text ' => $ text ]);
87
+ return $ this ->decoratedSpanNodeRenderer ->literal ($ text );
88
+ }
89
+
90
+ public function emphasis (string $ text ): string
91
+ {
92
+ return $ this ->decoratedSpanNodeRenderer ->emphasis ($ text );
93
+ }
94
+
95
+ public function strongEmphasis (string $ text ): string
96
+ {
97
+ return $ this ->decoratedSpanNodeRenderer ->strongEmphasis ($ text );
98
+ }
99
+
100
+ public function nbsp (): string
101
+ {
102
+ return $ this ->decoratedSpanNodeRenderer ->nbsp ();
103
+ }
104
+
105
+ public function br (): string
106
+ {
107
+ return $ this ->decoratedSpanNodeRenderer ->br ();
108
+ }
109
+
110
+ public function escape (string $ span ): string
111
+ {
112
+ return $ this ->decoratedSpanNodeRenderer ->escape ($ span );
82
113
}
83
114
84
115
private function isExternalUrl ($ url ): bool
@@ -101,4 +132,12 @@ private function isSafeUrl(string $url): bool
101
132
102
133
return $ isSymfonyUrl || $ isRelativeUrl ;
103
134
}
135
+
136
+ private function addAttributesForUnsafeUrl (array $ attributes ): array
137
+ {
138
+ return array_merge (
139
+ $ attributes ,
140
+ ['rel ' => 'external noopener noreferrer ' , 'target ' => '_blank ' ]
141
+ );
142
+ }
104
143
}
0 commit comments