UTF-8 scanTagURI.
This commit is contained in:
parent
2003a950cb
commit
40fe7090d9
|
@ -1935,6 +1935,40 @@ final class Scanner
|
||||||
enum contextMsg = "While parsing a " ~ name;
|
enum contextMsg = "While parsing a " ~ name;
|
||||||
error(contextMsg, startMark, expected("URI", c), reader_.mark);
|
error(contextMsg, startMark, expected("URI", c), reader_.mark);
|
||||||
}
|
}
|
||||||
|
void scanTagURIToSlice8(string name)(const Mark startMark)
|
||||||
|
@trusted pure nothrow // @nogc
|
||||||
|
{
|
||||||
|
// Note: we do not check if URI is well-formed.
|
||||||
|
dchar c = reader_.peek();
|
||||||
|
const startLen = reader_.sliceBuilder8.length;
|
||||||
|
{
|
||||||
|
uint length = 0;
|
||||||
|
while(c.isAlphaNum || "-;/?:@&=+$,_.!~*\'()[]%"d.canFind(c))
|
||||||
|
{
|
||||||
|
if(c == '%')
|
||||||
|
{
|
||||||
|
auto chars = reader_.get8(length);
|
||||||
|
reader_.sliceBuilder8.write(chars);
|
||||||
|
length = 0;
|
||||||
|
scanURIEscapesToSlice8!name(startMark);
|
||||||
|
if(error_) { return; }
|
||||||
|
}
|
||||||
|
else { ++length; }
|
||||||
|
c = reader_.peek(length);
|
||||||
|
}
|
||||||
|
if(length > 0)
|
||||||
|
{
|
||||||
|
auto chars = reader_.get8(length);
|
||||||
|
reader_.sliceBuilder8.write(chars);
|
||||||
|
length = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// OK if we scanned something, error otherwise.
|
||||||
|
if(reader_.sliceBuilder8.length > startLen) { return; }
|
||||||
|
|
||||||
|
enum contextMsg = "While parsing a " ~ name;
|
||||||
|
error(contextMsg, startMark, expected("URI", c), reader_.mark);
|
||||||
|
}
|
||||||
|
|
||||||
// Not @nogc yet because std.utf.decode is not @nogc
|
// Not @nogc yet because std.utf.decode is not @nogc
|
||||||
/// Scan URI escape sequences.
|
/// Scan URI escape sequences.
|
||||||
|
|
Loading…
Reference in a new issue