Skip to content

Commit d448634

Browse files
committed
Fix Swift dangling span by subclassing JFlexXrefSimple
Also: - Make SwiftXref case-sensitive, converting {File} pattern. - Escape all HTML special characters in SwiftXref. - Fix not to continue STRING after an end-quote, in case a TSTRING is actually starting. - Fix to fine-tune URI link for Swift COMMENT,SDOC. - Fix not to recognize escape sequences in TSTRING. - Fix to eliminate QSTRING which is not valid Swift literal syntax.
1 parent 423d71b commit d448634

File tree

4 files changed

+78
-61
lines changed

4 files changed

+78
-61
lines changed

src/org/opensolaris/opengrok/analysis/swift/SwiftSymbolTokenizer.lex

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
*/
2828

2929
package org.opensolaris.opengrok.analysis.swift;
30-
import org.opensolaris.opengrok.analysis.JFlexTokenizer;
3130

31+
import org.opensolaris.opengrok.analysis.JFlexTokenizer;
3232
%%
3333
%public
3434
%class SwiftSymbolTokenizer
@@ -42,7 +42,7 @@ super(in);
4242
%include CommonTokenizer.lexh
4343
%char
4444

45-
%state STRING COMMENT SCOMMENT QSTRING TSTRING
45+
%state STRING COMMENT SCOMMENT TSTRING
4646

4747
%include Common.lexh
4848
%include Swift.lexh
@@ -59,21 +59,15 @@ super(in);
5959
{Number} {}
6060

6161
\" { yybegin(STRING); }
62-
\' { yybegin(QSTRING); }
6362
\"\"\" { yybegin(TSTRING); }
6463
"/*" { yybegin(COMMENT); }
6564
"//" { yybegin(SCOMMENT); }
6665

6766
}
6867

69-
/* TODO : support raw """ strings */
7068
<STRING> {
69+
\\[\"\\] {}
7170
\" { yybegin(YYINITIAL); }
72-
\\\\ | \\\" {}
73-
}
74-
75-
<QSTRING> {
76-
\' { yybegin(YYINITIAL); }
7771
}
7872

7973
<TSTRING> {
@@ -88,7 +82,7 @@ super(in);
8882
{WhspChar}*{EOL} { yybegin(YYINITIAL);}
8983
}
9084

91-
<YYINITIAL, STRING, COMMENT, SCOMMENT, QSTRING, TSTRING> {
85+
<YYINITIAL, STRING, COMMENT, SCOMMENT, TSTRING> {
9286
{WhiteSpace} |
9387
[^] {}
9488
}

src/org/opensolaris/opengrok/analysis/swift/SwiftXref.lex

Lines changed: 65 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,15 @@
2424

2525
package org.opensolaris.opengrok.analysis.swift;
2626

27-
import org.opensolaris.opengrok.analysis.JFlexXref;
28-
import java.io.IOException;
29-
import java.io.Writer;
30-
import java.io.Reader;
27+
import org.opensolaris.opengrok.analysis.JFlexXrefSimple;
28+
import org.opensolaris.opengrok.util.StringUtils;
29+
import org.opensolaris.opengrok.web.HtmlConsts;
3130
import org.opensolaris.opengrok.web.Util;
32-
3331
%%
3432
%public
3533
%class SwiftXref
36-
%extends JFlexXref
34+
%extends JFlexXrefSimple
3735
%unicode
38-
%ignorecase
3936
%int
4037
%include CommonXref.lexh
4138
%{
@@ -49,7 +46,11 @@ import org.opensolaris.opengrok.web.Util;
4946
protected void setLineNumber(int x) { yyline = x; }
5047
%}
5148

52-
File = [a-zA-Z]{FNameChar}* "." ("java"|"properties"|"props"|"xml"|"conf"|"txt"|"htm"|"html"|"ini"|"jnlp"|"jad"|"diff"|"patch")
49+
File = [a-zA-Z]{FNameChar}* "." ([Jj][Aa][Vv][Aa] |
50+
[Pp][Rr][Oo][Pp][Ee][Rr][Tt][Ii][Ee][Ss] | [Pp][Rr][Oo][Pp][Ss] |
51+
[Xx][Mm][Ll] | [Cc][Oo][Nn][Ff] | [Tt][Xx][Tt] | [Hh][Tt][Mm][Ll]? |
52+
[Ii][Nn][Ii] | [Jj][Nn][Ll][Pp] | [Jj][Aa][Dd] | [Dd][Ii][Ff][Ff] |
53+
[Pp][Aa][Tt][Cc][Hh])
5354

5455
/* TODO support markdown in comments
5556
SdocWithClassArg = "@throws" | "@exception"
@@ -59,7 +60,7 @@ ClassName = "class"{WhiteSpace}({Identifier} ".")* {Identifier}
5960
ParamName = {Identifier} | "<" {Identifier} ">"
6061
*/
6162

62-
%state STRING COMMENT SCOMMENT QSTRING SDOC TSTRING
63+
%state STRING COMMENT SCOMMENT SDOC TSTRING
6364

6465
%include Common.lexh
6566
%include CommonURI.lexh
@@ -92,38 +93,54 @@ ParamName = {Identifier} | "<" {Identifier} ">"
9293
/*{Hier}
9394
{ out.write(Util.breadcrumbPath(urlPrefix+"defs=",yytext(),'.'));}
9495
*/
95-
{Number} { out.write("<span class=\"n\">"); out.write(yytext()); out.write("</span>"); }
96-
97-
\" { yybegin(STRING);out.write("<span class=\"s\">\"");}
98-
\' { yybegin(QSTRING);out.write("<span class=\"s\">\'");}
99-
\"\"\" { yybegin(TSTRING);out.write("<span class=\"s\">\"\"\"");}
100-
"/**" / [^/] { yybegin(SDOC);out.write("<span class=\"c\">/**");}
101-
"/*" { yybegin(COMMENT);out.write("<span class=\"c\">/*");}
102-
"//" { yybegin(SCOMMENT);out.write("<span class=\"c\">//");}
96+
{Number} {
97+
disjointSpan(HtmlConsts.NUMBER_CLASS);
98+
out.write(yytext());
99+
disjointSpan(null);
100+
}
101+
102+
\" {
103+
pushSpan(STRING, HtmlConsts.STRING_CLASS);
104+
out.write(htmlize(yytext()));
105+
}
106+
\"\"\" {
107+
pushSpan(TSTRING, HtmlConsts.STRING_CLASS);
108+
out.write(htmlize(yytext()));
109+
}
110+
"/**" / [^/] {
111+
pushSpan(SDOC, HtmlConsts.COMMENT_CLASS);
112+
out.write(yytext());
113+
}
114+
"/*" {
115+
pushSpan(COMMENT, HtmlConsts.COMMENT_CLASS);
116+
out.write(yytext());
117+
}
118+
"//" {
119+
pushSpan(SCOMMENT, HtmlConsts.COMMENT_CLASS);
120+
out.write(yytext());
121+
}
103122
}
104123

105124
<STRING> {
106-
\" {WhiteSpace} \" { out.write(yytext());}
107-
\" { yybegin(YYINITIAL); out.write("\"</span>"); }
108-
\\\\ { out.write("\\\\"); }
109-
\\\" { out.write("\\\""); }
110-
}
111-
112-
<QSTRING> {
113-
"\\\\" { out.write("\\\\"); }
114-
"\\\'" { out.write("\\\'"); }
115-
\' {WhiteSpace} \' { out.write(yytext()); }
116-
\' { yybegin(YYINITIAL); out.write("'</span>"); }
125+
\\[\"\\] { out.write(htmlize(yytext())); }
126+
\" {
127+
out.write(htmlize(yytext()));
128+
yypop();
129+
}
117130
}
118131

119132
<TSTRING> {
120-
"\\\\" { out.write("\\\\"); }
121-
"\\\"" { out.write("\\\""); }
122-
\"\"\" { yybegin(YYINITIAL); out.write("\"\"\"</span>"); }
133+
\"\"\" {
134+
out.write(htmlize(yytext()));
135+
yypop();
136+
}
123137
}
124138

125139
<COMMENT, SDOC> {
126-
"*/" { yybegin(YYINITIAL); out.write("*/</span>"); }
140+
"*/" {
141+
out.write(yytext());
142+
yypop();
143+
}
127144
}
128145

129146
/* TODO: support markdown in comments
@@ -145,23 +162,21 @@ ParamName = {Identifier} | "<" {Identifier} ">"
145162

146163
<SCOMMENT> {
147164
{WhspChar}*{EOL} {
148-
yybegin(YYINITIAL); out.write("</span>");
165+
yypop();
149166
startNewLine();
150167
}
151168
}
152169

153170

154-
<YYINITIAL, STRING, COMMENT, SCOMMENT, QSTRING, SDOC, TSTRING> {
155-
"&" {out.write( "&amp;");}
156-
"<" {out.write( "&lt;");}
157-
">" {out.write( "&gt;");}
171+
<YYINITIAL, STRING, COMMENT, SCOMMENT, SDOC, TSTRING> {
172+
[&<>\'\"] { out.write(htmlize(yytext())); }
158173
{WhspChar}*{EOL} { startNewLine(); }
159174
{WhiteSpace} { out.write(yytext()); }
160175
[!-~] { out.write(yycharat(0)); }
161176
[^\n] { writeUnicodeChar(yycharat(0)); }
162177
}
163178

164-
<STRING, COMMENT, SCOMMENT, STRING, QSTRING, SDOC, TSTRING> {
179+
<STRING, COMMENT, SCOMMENT, SDOC, TSTRING> {
165180
{FPath}
166181
{ out.write(Util.breadcrumbPath(urlPrefix+"path=",yytext(),'/'));}
167182

@@ -175,12 +190,20 @@ ParamName = {Identifier} | "<" {Identifier} ">"
175190
out.write(path);
176191
out.write("</a>");}
177192

178-
{BrowseableURI} {
179-
appendLink(yytext(), true);
180-
}
181-
182193
{FNameChar}+ "@" {FNameChar}+ "." {FNameChar}+
183194
{
184195
writeEMailAddress(yytext());
185196
}
186197
}
198+
199+
<STRING, SCOMMENT, TSTRING> {
200+
{BrowseableURI} {
201+
appendLink(yytext(), true);
202+
}
203+
}
204+
205+
<COMMENT, SDOC> {
206+
{BrowseableURI} {
207+
appendLink(yytext(), true, StringUtils.END_C_COMMENT);
208+
}
209+
}

test/org/opensolaris/opengrok/analysis/swift/sample_xref.html

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
function get_sym_list(){return [["Variable","xv",[["delegate",37],["formatter",148],["mainColor",84],["private weak var dayView",52],["private weak var bottomView",41],["private weak var dayNextBtn",43],["private weak var dayPrevBtn",44],["private weak var middleView",40],["private weak var monthNextBtn",46],["private weak var monthPrevBtn",47],["private weak var monthView",53],["private weak var topView",39],["private weak var yearNextBtn",49],["private weak var yearPrevBtn",50],["private weak var yearView",54],["selectedDate",57]]],["Class","xc",[["D2PDatePicker",35]]],["Function","xf",[["awakeFromNib",98],["changeDate",165],["didChange",32],["draw",210],["set",142],["setLabel",147]]]];} /* ]]> */</script><a class="l" name="1" href="#1">1</a><span class='fold-space'>&nbsp;</span><span class="c">// Copyright (c) 2017 di2pra &lt;[email protected]&gt;</span>
1010
<a class="l" name="2" href="#2">2</a><span class='fold-space'>&nbsp;</span><span class="c">//</span>
1111
<a class="l" name="3" href="#3">3</a><span class='fold-space'>&nbsp;</span><span class="c">// Permission is hereby granted, free of charge, to any person obtaining a copy</span>
12-
<a class="l" name="4" href="#4">4</a><span class='fold-space'>&nbsp;</span><span class="c">// of this software and associated documentation files (the "Software"), to deal</span>
12+
<a class="l" name="4" href="#4">4</a><span class='fold-space'>&nbsp;</span><span class="c">// of this software and associated documentation files (the &quot;Software&quot;), to deal</span>
1313
<a class="l" name="5" href="#5">5</a><span class='fold-space'>&nbsp;</span><span class="c">// in the Software without restriction, including without limitation the rights</span>
1414
<a class="l" name="6" href="#6">6</a><span class='fold-space'>&nbsp;</span><span class="c">// to use, copy, modify, merge, publish, distribute, sublicense, <a href="/source/s?path=and/">and</a>/<a href="/source/s?path=and/or">or</a> sell</span>
1515
<a class="l" name="7" href="#7">7</a><span class='fold-space'>&nbsp;</span><span class="c">// copies of the Software, and to permit persons to whom the Software is</span>
@@ -18,7 +18,7 @@
1818
<a class="hl" name="10" href="#10">10</a><span class='fold-space'>&nbsp;</span><span class="c">// The above copyright notice and this permission notice shall be included in</span>
1919
<a class="l" name="11" href="#11">11</a><span class='fold-space'>&nbsp;</span><span class="c">// all copies or substantial portions of the Software.</span>
2020
<a class="l" name="12" href="#12">12</a><span class='fold-space'>&nbsp;</span><span class="c">//</span>
21-
<a class="l" name="13" href="#13">13</a><span class='fold-space'>&nbsp;</span><span class="c">// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
21+
<a class="l" name="13" href="#13">13</a><span class='fold-space'>&nbsp;</span><span class="c">// THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
2222
<a class="l" name="14" href="#14">14</a><span class='fold-space'>&nbsp;</span><span class="c">// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
2323
<a class="l" name="15" href="#15">15</a><span class='fold-space'>&nbsp;</span><span class="c">// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
2424
<a class="l" name="16" href="#16">16</a><span class='fold-space'>&nbsp;</span><span class="c">// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
@@ -155,18 +155,18 @@
155155
<a class="l" name="147" href="#147">147</a><span class='fold-space'>&nbsp;</span> <b>private</b> <b>func</b> <a class="xf" name="setLabel"/><a href="/source/s?refs=setLabel" class="xf intelliWindow-symbol" data-definition-place="def">setLabel</a>(<a href="/source/s?defs=toDate" class="intelliWindow-symbol" data-definition-place="undefined-in-file">toDate</a> <a href="/source/s?defs=date" class="intelliWindow-symbol" data-definition-place="undefined-in-file">date</a>: <a href="/source/s?defs=Date" class="intelliWindow-symbol" data-definition-place="undefined-in-file">Date</a>) &#123;
156156
<a class="l" name="148" href="#148">148</a><span class='fold-space'>&nbsp;</span> <b>let</b> <a class="xv" name="formatter"/><a href="/source/s?refs=formatter" class="xv intelliWindow-symbol" data-definition-place="def">formatter</a> = <a href="/source/s?defs=DateFormatter" class="intelliWindow-symbol" data-definition-place="undefined-in-file">DateFormatter</a>()
157157
<a class="l" name="149" href="#149">149</a><span class='fold-space'>&nbsp;</span>
158-
<a class="hl" name="150" href="#150">150</a><span class='fold-space'>&nbsp;</span> <a class="d intelliWindow-symbol" href="#formatter" data-definition-place="defined-in-file">formatter</a>.<a href="/source/s?defs=dateFormat" class="intelliWindow-symbol" data-definition-place="undefined-in-file">dateFormat</a> = <span class="s">"MMM"</span>
158+
<a class="hl" name="150" href="#150">150</a><span class='fold-space'>&nbsp;</span> <a class="d intelliWindow-symbol" href="#formatter" data-definition-place="defined-in-file">formatter</a>.<a href="/source/s?defs=dateFormat" class="intelliWindow-symbol" data-definition-place="undefined-in-file">dateFormat</a> = <span class="s">&quot;MMM&quot;</span>
159159
<a class="l" name="151" href="#151">151</a><span class='fold-space'>&nbsp;</span> <b>self</b>.<a href="/source/s?defs=monthView" class="intelliWindow-symbol" data-definition-place="undefined-in-file">monthView</a>.<a href="/source/s?defs=monthLabel" class="intelliWindow-symbol" data-definition-place="undefined-in-file">monthLabel</a>.<a href="/source/s?defs=text" class="intelliWindow-symbol" data-definition-place="undefined-in-file">text</a> = <a class="d intelliWindow-symbol" href="#formatter" data-definition-place="defined-in-file">formatter</a>.<a href="/source/s?defs=string" class="intelliWindow-symbol" data-definition-place="undefined-in-file">string</a>(<a href="/source/s?defs=from" class="intelliWindow-symbol" data-definition-place="undefined-in-file">from</a>: <a href="/source/s?defs=date" class="intelliWindow-symbol" data-definition-place="undefined-in-file">date</a>)
160160
<a class="l" name="152" href="#152">152</a><span class='fold-space'>&nbsp;</span>
161-
<a class="l" name="153" href="#153">153</a><span class='fold-space'>&nbsp;</span> <a class="d intelliWindow-symbol" href="#formatter" data-definition-place="defined-in-file">formatter</a>.<a href="/source/s?defs=dateFormat" class="intelliWindow-symbol" data-definition-place="undefined-in-file">dateFormat</a> = <span class="s">"dd"</span>
161+
<a class="l" name="153" href="#153">153</a><span class='fold-space'>&nbsp;</span> <a class="d intelliWindow-symbol" href="#formatter" data-definition-place="defined-in-file">formatter</a>.<a href="/source/s?defs=dateFormat" class="intelliWindow-symbol" data-definition-place="undefined-in-file">dateFormat</a> = <span class="s">&quot;dd&quot;</span>
162162
<a class="l" name="154" href="#154">154</a><span class='fold-space'>&nbsp;</span> <b>self</b>.<a href="/source/s?defs=dayView" class="intelliWindow-symbol" data-definition-place="undefined-in-file">dayView</a>.<a href="/source/s?defs=dayLabel" class="intelliWindow-symbol" data-definition-place="undefined-in-file">dayLabel</a>.<a href="/source/s?defs=text" class="intelliWindow-symbol" data-definition-place="undefined-in-file">text</a> = <a class="d intelliWindow-symbol" href="#formatter" data-definition-place="defined-in-file">formatter</a>.<a href="/source/s?defs=string" class="intelliWindow-symbol" data-definition-place="undefined-in-file">string</a>(<a href="/source/s?defs=from" class="intelliWindow-symbol" data-definition-place="undefined-in-file">from</a>: <a href="/source/s?defs=date" class="intelliWindow-symbol" data-definition-place="undefined-in-file">date</a>)
163163
<a class="l" name="155" href="#155">155</a><span class='fold-space'>&nbsp;</span>
164-
<a class="l" name="156" href="#156">156</a><span class='fold-space'>&nbsp;</span> <a class="d intelliWindow-symbol" href="#formatter" data-definition-place="defined-in-file">formatter</a>.<a href="/source/s?defs=dateFormat" class="intelliWindow-symbol" data-definition-place="undefined-in-file">dateFormat</a> = <span class="s">"EEEE"</span>
164+
<a class="l" name="156" href="#156">156</a><span class='fold-space'>&nbsp;</span> <a class="d intelliWindow-symbol" href="#formatter" data-definition-place="defined-in-file">formatter</a>.<a href="/source/s?defs=dateFormat" class="intelliWindow-symbol" data-definition-place="undefined-in-file">dateFormat</a> = <span class="s">&quot;EEEE&quot;</span>
165165
<a class="l" name="157" href="#157">157</a><span class='fold-space'>&nbsp;</span> <b>self</b>.<a href="/source/s?defs=dayView" class="intelliWindow-symbol" data-definition-place="undefined-in-file">dayView</a>.<a href="/source/s?defs=weekDayLabel" class="intelliWindow-symbol" data-definition-place="undefined-in-file">weekDayLabel</a>.<a href="/source/s?defs=text" class="intelliWindow-symbol" data-definition-place="undefined-in-file">text</a> = <a class="d intelliWindow-symbol" href="#formatter" data-definition-place="defined-in-file">formatter</a>.<a href="/source/s?defs=string" class="intelliWindow-symbol" data-definition-place="undefined-in-file">string</a>(<a href="/source/s?defs=from" class="intelliWindow-symbol" data-definition-place="undefined-in-file">from</a>: <a href="/source/s?defs=date" class="intelliWindow-symbol" data-definition-place="undefined-in-file">date</a>)
166166
<a class="l" name="158" href="#158">158</a><span class='fold-space'>&nbsp;</span>
167-
<a class="l" name="159" href="#159">159</a><span class='fold-space'>&nbsp;</span> <a class="d intelliWindow-symbol" href="#formatter" data-definition-place="defined-in-file">formatter</a>.<a href="/source/s?defs=dateFormat" class="intelliWindow-symbol" data-definition-place="undefined-in-file">dateFormat</a> = <span class="s">"""
167+
<a class="l" name="159" href="#159">159</a><span class='fold-space'>&nbsp;</span> <a class="d intelliWindow-symbol" href="#formatter" data-definition-place="defined-in-file">formatter</a>.<a href="/source/s?defs=dateFormat" class="intelliWindow-symbol" data-definition-place="undefined-in-file">dateFormat</a> = <span class="s">&quot;&quot;&quot;
168168
<a class="hl" name="160" href="#160">160</a><span class='fold-space'>&nbsp;</span> YYYY
169-
<a class="l" name="161" href="#161">161</a><span class='fold-space'>&nbsp;</span> """</span>
169+
<a class="l" name="161" href="#161">161</a><span class='fold-space'>&nbsp;</span> &quot;&quot;&quot;</span>
170170
<a class="l" name="162" href="#162">162</a><span class='fold-space'>&nbsp;</span> <b>self</b>.<a href="/source/s?defs=yearView" class="intelliWindow-symbol" data-definition-place="undefined-in-file">yearView</a>.<a href="/source/s?defs=yearLabel" class="intelliWindow-symbol" data-definition-place="undefined-in-file">yearLabel</a>.<a href="/source/s?defs=text" class="intelliWindow-symbol" data-definition-place="undefined-in-file">text</a> = <a class="d intelliWindow-symbol" href="#formatter" data-definition-place="defined-in-file">formatter</a>.<a href="/source/s?defs=string" class="intelliWindow-symbol" data-definition-place="undefined-in-file">string</a>(<a href="/source/s?defs=from" class="intelliWindow-symbol" data-definition-place="undefined-in-file">from</a>: <a href="/source/s?defs=date" class="intelliWindow-symbol" data-definition-place="undefined-in-file">date</a>)
171171
<a class="l" name="163" href="#163">163</a><span class='fold-space'>&nbsp;</span> &#125;
172172
<a class="l" name="164" href="#164">164</a><span class='fold-space'>&nbsp;</span>
@@ -221,6 +221,6 @@
221221
<a class="l" name="213" href="#213">213</a><span class='fold-space'>&nbsp;</span> */</span>
222222
<a class="l" name="214" href="#214">214</a><span class='fold-space'>&nbsp;</span>
223223
<a class="l" name="215" href="#215">215</a><span class='fold-space'>&nbsp;</span>&#125;
224-
</span><a class="l" name="216" href="#216">216</a><span class='fold-space'>&nbsp;</span><span class="c">/*<a href="http://example.com.*/">http://example.com.*/</a>
224+
</span><a class="l" name="216" href="#216">216</a><span class='fold-space'>&nbsp;</span><span class="c">/*<a href="http://example.com">http://example.com</a>.*/</span>
225225
<a class="l" name="217" href="#217">217</a><span class='fold-space'>&nbsp;</span></body>
226226
</html>

test/org/opensolaris/opengrok/analysis/swift/truncated_xref.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
class="xref">
66
<head>
77
<title>sampleFile - OpenGrok cross reference for /sampleFile</title></head><body>
8-
<a class="l" name="1" href="#1">1</a><span class='fold-space'>&nbsp;</span> <span class="s">"oops this string is tru</span></body>
8+
<a class="l" name="1" href="#1">1</a><span class='fold-space'>&nbsp;</span> <span class="s">&quot;oops this string is tru</span></body>
99
</html>

0 commit comments

Comments
 (0)