1. URL 패턴
1.1. 소개
URL 패턴은 여러 컴포넌트로 구성되며, 각각은 패턴을 나타내며, 해당 URL의 컴포넌트와 매칭될 수 있습니다.
각 컴포넌트에 대한 문자열이나 축약 문자열을 사용하여 생성할 수 있습니다. 선택적으로 기준 URL에 상대적으로 resolve할 수 있습니다.
축약형 "https://example.com/:category/*
"는 다음 컴포넌트에 해당합니다:
- protocol
- "
https
" - username
- "
*
" - password
- "
*
" - hostname
- "
example.com
" - port
- ""
- pathname
- "
/:category/*
" - search
- "
*
" - hash
- "
*
"
다음 URL들과 매칭됩니다:
-
https://example.com/products/
-
https://example.com/blog/our-greatest-product-ever
다음 URL들과는 매칭되지 않습니다:
-
https://example.com/
-
http://example.com/products/
-
https://example.com:8443/blog/our-greatest-product-ever
이 패턴은 대부분의 컴포넌트가 정확한 문자열과 일치하거나 모든 문자열("*
")을 허용하는 비교적 단순한 패턴입니다. pathname
컴포넌트는 최소 두 개의 /
로 구분된 경로 컴포넌트를 가진 모든 경로와 매칭되며, 첫 번째 경로는 "category
"로
캡처됩니다.
축약형 "http{s}?://{:subdomain.}?shop.example/products/:id([0-9]+)#reviews
"는 다음 컴포넌트에 해당합니다:
- protocol
- "
http{s}?
" - username
- "
*
" - password
- "
*
" - hostname
- "
{:subdomain.}?shop.example
" - port
- ""
- pathname
- "
/products/:id([0-9]+)
" - search
- ""
- hash
- "
reviews
"
다음 URL들과 매칭됩니다:
-
https://shop.example/products/74205#reviews
-
https://kathryn@voyager.shop.example/products/74656#reviews
-
http://insecure.shop.example/products/1701#reviews
다음 URL들과는 매칭되지 않습니다:
-
https://shop.example/products/2000
-
http://shop.example:8080/products/0#reviews
-
https://nx.shop.example/products/01?speed=5#reviews
-
https://shop.example/products/chair#reviews
이 패턴은 다음과 같은 더 복잡한 특징을 포함합니다:
기준 URL "https://discussion.example/forum/?page=2
"에 대해 축약형 "../admin/*
"는 다음
컴포넌트에 해당합니다:
- protocol
- "
https
" - username
- "
*
" - password
- "
*
" - hostname
- "
discussion.example
" - port
- ""
- pathname
- "
/admin/*
" - search
- "
*
" - hash
- "
*
"
다음 URL들과 매칭됩니다:
-
https://discussion.example/admin/
-
https://edd:librarian@discussion.example/admin/update?id=1
다음 URL들과는 매칭되지 않습니다:
-
https://discussion.example/forum/admin/
-
http://discussion.example:8080/admin/update?id=1
이 패턴은 상대 경로가 기준 URL에 대해 어떻게 resolve되는지, 즉 상대 URL처럼 동작함을 보여줍니다.
1.2. URLPattern
클래스
typedef (USVString or URLPatternInit ); [
URLPatternInput Exposed =(Window ,Worker )]interface {
URLPattern constructor (URLPatternInput ,
input USVString ,
baseURL optional URLPatternOptions = {});
options constructor (optional URLPatternInput = {},
input optional URLPatternOptions = {});
options boolean test (optional URLPatternInput = {},
input optional USVString );
baseURL URLPatternResult ?exec (optional URLPatternInput = {},
input optional USVString );
baseURL readonly attribute USVString protocol ;readonly attribute USVString username ;readonly attribute USVString password ;readonly attribute USVString hostname ;readonly attribute USVString port ;readonly attribute USVString pathname ;readonly attribute USVString search ;readonly attribute USVString hash ;readonly attribute boolean hasRegExpGroups ; };dictionary {
URLPatternInit USVString ;
protocol USVString ;
username USVString ;
password USVString ;
hostname USVString ;
port USVString ;
pathname USVString ;
search USVString ;
hash USVString ; };
baseURL dictionary {
URLPatternOptions boolean =
ignoreCase false ; };dictionary {
URLPatternResult sequence <URLPatternInput >;
inputs URLPatternComponentResult ;
protocol URLPatternComponentResult ;
username URLPatternComponentResult ;
password URLPatternComponentResult ;
hostname URLPatternComponentResult ;
port URLPatternComponentResult ;
pathname URLPatternComponentResult ;
search URLPatternComponentResult ; };
hash dictionary {
URLPatternComponentResult USVString ;
input record <USVString , (USVString or undefined )>; };
groups
각 URLPattern
은 연관 URL 패턴을 가지며, 이는 URL 패턴입니다.
urlPattern = new
URLPattern
(input)- 새로운
URLPattern
객체를 생성합니다. input은 각 URL 컴포넌트별 패턴을 포함하는 객체입니다(예: hostname, pathname 등). 누락된 컴포넌트는 와일드카드 패턴으로 기본값이 설정됩니다. 또한, input에는 누락된 컴포넌트에 대한 정적 텍스트 패턴을 제공하는baseURL
속성을 포함할 수 있습니다. urlPattern = new
URLPattern
(patternString, baseURL)- 새로운
URLPattern
객체를 생성합니다. patternString은 하나 이상의 컴포넌트에 대한 패턴 문법을 포함하는 URL 문자열입니다. baseURL이 제공되면 patternString을 상대 경로로 사용할 수 있습니다. 이 생성자는 항상 최소한 빈 문자열 값을 설정하며, 컴포넌트를 와일드카드 패턴으로 기본값을 설정하지 않습니다. urlPattern = new
URLPattern
(input, options)-
새로운
URLPattern
객체를 생성합니다. options는 컴포넌트의 매칭 방식에 영향을 줄 수 있는 추가 구성 옵션을 포함하는 객체입니다. 현재는 대소문자 구분 없이 매칭을 활성화할 수 있는ignoreCase
속성만 있습니다.기본적으로, 즉 options 인자가 없는 경우, 매칭은 항상 대소문자를 구분합니다.
urlPattern = new
URLPattern
(patternString, baseURL, options)- 새로운
URLPattern
객체를 생성합니다. 이 생성자는URLPatternOptions
객체를 지원하며, patternString 객체에서 컴포넌트별 패턴과 기준 URL을 기술합니다. matches = urlPattern.
test
(input)- urlPattern이 주어진 인자와 매칭되는지 검사합니다. input은 각 URL 컴포넌트를 나타내는 문자열을 포함하는 객체입니다(예:
hostname, pathname 등). 누락된 컴포넌트는 빈 문자열로 처리됩니다. 또한 input에는 누락된 컴포넌트에 대한 값을 제공하는
baseURL
속성을 포함할 수 있습니다. urlPattern이 각 컴포넌트별로 input과 매칭된다면 true를 반환, 그렇지 않으면 false를 반환합니다. matches = urlPattern.
test
(url, baseURL)-
urlPattern이 주어진 인자와 매칭되는지 검사합니다. url은 URL 문자열입니다. baseURL이 주어지면
url은 상대 경로가 될 수 있습니다.
urlPattern이 각 컴포넌트별로 input과 매칭된다면 true를 반환, 그렇지 않으면 false를 반환합니다.
result = urlPattern.
exec
(input)-
urlPattern을 주어진 인자에 대해 실행합니다. input은 각 URL 컴포넌트를 나타내는 문자열을 포함하는 객체입니다(예: hostname,
pathname 등). 누락된 컴포넌트는 빈 문자열로 처리됩니다. 또한 input에는 누락된 컴포넌트에 대한 값을 제공하는 baseURL 속성을 포함할 수 있습니다.
urlPattern이 각 컴포넌트별로 input과 매칭된다면 결과 객체를 반환합니다. 매칭된 그룹 값은 result 객체 내에서 컴포넌트별 그룹 객체에 포함됩니다(예:
matches.pathname.groups.id
). urlPattern이 input과 매칭되지 않으면 result는 null입니다. result = urlPattern.
exec
(url, baseURL)-
urlPattern을 주어진 인자에 대해 실행합니다. url은 URL 문자열입니다. baseURL이 주어지면
input은 상대 경로가 될 수 있습니다.
urlPattern이 각 컴포넌트별로 input과 매칭된다면 결과 객체를 반환합니다. 매칭된 그룹 값은 result 객체 내에서 컴포넌트별 그룹 객체에 포함됩니다(예:
matches.pathname.groups.id
). urlPattern이 input과 매칭되지 않으면 result는 null입니다. urlPattern.
protocol
-
urlPattern의 정규화된 protocol 패턴 문자열을 반환합니다.
urlPattern.
username
-
urlPattern의 정규화된 username 패턴 문자열을 반환합니다.
urlPattern.
password
-
urlPattern의 정규화된 password 패턴 문자열을 반환합니다.
urlPattern.
hostname
-
urlPattern의 정규화된 hostname 패턴 문자열을 반환합니다.
urlPattern.
port
-
urlPattern의 정규화된 port 패턴 문자열을 반환합니다.
urlPattern.
pathname
-
urlPattern의 정규화된 pathname 패턴 문자열을 반환합니다.
urlPattern.
search
-
urlPattern의 정규화된 search 패턴 문자열을 반환합니다.
urlPattern.
hash
-
urlPattern의 정규화된 hash 패턴 문자열을 반환합니다.
urlPattern.
hasRegExpGroups
-
urlPattern에 하나 이상의 정규표현식 그룹이 포함되어 있는지 여부를 반환합니다.
new URLPattern(input, baseURL, options)
생성자 단계:
-
initialize를 this, input, baseURL, options에 대해 실행합니다.
new URLPattern(input, options)
생성자 단계:
-
initialize를 this, input, null, options에 대해 실행합니다.
URLPattern
this, URLPatternInput
input, string 또는 null baseURL, URLPatternOptions
options에 대해:
protocol
getter 단계:
-
this의 연관 URL 패턴의 protocol 컴포넌트의 패턴 문자열을 반환합니다.
username
getter 단계:
-
this의 연관 URL 패턴의 username 컴포넌트의 패턴 문자열을 반환합니다.
password
getter 단계:
-
this의 연관 URL 패턴의 password 컴포넌트의 패턴 문자열을 반환합니다.
hostname
getter 단계:
-
this의 연관 URL 패턴의 hostname 컴포넌트의 패턴 문자열을 반환합니다.
pathname
getter 단계:
-
this의 연관 URL 패턴의 pathname 컴포넌트의 패턴 문자열을 반환합니다.
search
getter 단계:
-
this의 연관 URL 패턴의 search 컴포넌트의 패턴 문자열을 반환합니다.
hasRegExpGroups
getter 단계:
-
this의 연관 URL 패턴의 정규표현식 그룹 포함 여부가 true면 true 반환.
-
false 반환.
test(input, baseURL)
메서드 단계:
1.3. URL 패턴 구조체
-
protocol 컴포넌트, 컴포넌트
-
username 컴포넌트, 컴포넌트
-
password 컴포넌트, 컴포넌트
-
hostname 컴포넌트, 컴포넌트
-
port 컴포넌트, 컴포넌트
-
pathname 컴포넌트, 컴포넌트
-
search 컴포넌트, 컴포넌트
-
hash 컴포넌트, 컴포넌트
-
패턴 문자열, well formed 패턴 문자열
-
정규표현식,
RegExp
-
그룹 이름 목록, 문자열 리스트
-
정규표현식 그룹 포함 여부, boolean
1.4. 고수준 연산
URLPatternInput
input, string 또는 null baseURL, URLPatternOptions
options로 URL 패턴을 생성하려면:
-
init을 null로 설정합니다.
-
input이 스칼라 값 문자열이면:
-
그 외의 경우:
-
단언: input은
URLPatternInit
입니다. -
baseURL이 null이 아니면,
TypeError
를 throw합니다. -
init을 input으로 설정합니다.
-
-
processedInit을 URLPatternInit 처리의 결과로 설정합니다. 인자는 init, "
pattern
", null, null, null, null, null, null, null, null입니다. -
각 componentName에 대해 « "
protocol
", "username
", "password
", "hostname
", "port
", "pathname
", "search
", "hash
" »: -
processedInit["
protocol
"] 이 특수 scheme이고 processedInit["port
"] 가 기본 포트를 radix-10 ASCII 숫자로 표현한 문자열이면 processedInit["port
"] 을 빈 문자열로 설정합니다. -
urlPattern을 새 URL 패턴으로 생성합니다.
-
urlPattern의 protocol 컴포넌트를 컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["
protocol
"], 프로토콜 정규화, 기본 옵션입니다. -
urlPattern의 username 컴포넌트를 컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["
username
"], username 정규화, 기본 옵션입니다. -
urlPattern의 password 컴포넌트를 컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["
password
"], password 정규화, 기본 옵션입니다. -
hostname 패턴이 IPv6 주소인지 processedInit["
hostname
"]에 대해 실행한 결과가 true이면, urlPattern의 hostname 컴포넌트를 컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["hostname
"], IPv6 hostname 정규화, hostname 옵션입니다. -
그 외의 경우, urlPattern의 hostname 컴포넌트를 컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["
hostname
"], hostname 정규화, hostname 옵션입니다. -
urlPattern의 port 컴포넌트를 컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["
port
"], port 정규화, 기본 옵션입니다. -
compileOptions를 기본 옵션을 복사한 것으로, ignore case 속성을 options["
ignoreCase
"]로 설정합니다. -
protocol 컴포넌트가 특수 scheme과 매칭되는지 urlPattern의 protocol 컴포넌트에 대해 실행한 결과가 true이면:
-
pathCompileOptions를 pathname 옵션을 복사한 것으로, ignore case 속성을 options["
ignoreCase
"]로 설정합니다. -
urlPattern의 pathname 컴포넌트를 컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["
pathname
"], pathname 정규화, pathCompileOptions입니다.
-
-
그 외의 경우 urlPattern의 pathname 컴포넌트를 컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["
pathname
"], 불투명 pathname 정규화, compileOptions입니다. -
urlPattern의 search 컴포넌트를 컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["
search
"], search 정규화, compileOptions입니다. -
urlPattern의 hash 컴포넌트를 컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["
hash
"], hash 정규화, compileOptions입니다. -
urlPattern을 반환합니다.
URLPatternInput
또는 URL
input, 그리고 선택적 문자열 baseURLString을 받아 다음을 수행합니다:
-
protocol을 빈 문자열로 설정합니다.
-
username을 빈 문자열로 설정합니다.
-
password를 빈 문자열로 설정합니다.
-
hostname을 빈 문자열로 설정합니다.
-
port를 빈 문자열로 설정합니다.
-
pathname을 빈 문자열로 설정합니다.
-
search를 빈 문자열로 설정합니다.
-
hash를 빈 문자열로 설정합니다.
-
inputs를 빈 리스트로 설정합니다.
-
input이 URL이면, append를 사용해 input의 직렬화를 inputs에 추가합니다.
-
그 외의 경우, append를 사용해 input을 inputs에 추가합니다.
-
input이
URLPatternInit
이면:-
baseURLString이 주어졌으면
TypeError
를 throw합니다. -
applyResult를 URLPatternInit 처리의 결과로 설정합니다. 인자는 input, "url", protocol, username, password, hostname, port, pathname, search, hash입니다. 예외 발생 시, 잡아서 null을 반환합니다.
-
protocol을 applyResult["
protocol
"]로 설정합니다. -
username을 applyResult["
username
"]로 설정합니다. -
password를 applyResult["
password
"]로 설정합니다. -
hostname을 applyResult["
hostname
"]로 설정합니다. -
port를 applyResult["
port
"]로 설정합니다. -
pathname을 applyResult["
pathname
"]로 설정합니다. -
search를 applyResult["
search
"]로 설정합니다. -
hash를 applyResult["
hash
"]로 설정합니다.
-
-
그 외의 경우:
-
protocolExecResult를 RegExpBuiltinExec(urlPattern의 protocol 컴포넌트의 정규표현식, protocol)의 결과로 설정합니다.
-
usernameExecResult를 RegExpBuiltinExec(urlPattern의 username 컴포넌트의 정규표현식, username)의 결과로 설정합니다.
-
passwordExecResult를 RegExpBuiltinExec(urlPattern의 password 컴포넌트의 정규표현식, password)의 결과로 설정합니다.
-
hostnameExecResult를 RegExpBuiltinExec(urlPattern의 hostname 컴포넌트의 정규표현식, hostname)의 결과로 설정합니다.
-
portExecResult를 RegExpBuiltinExec(urlPattern의 port 컴포넌트의 정규표현식, port)의 결과로 설정합니다.
-
pathnameExecResult를 RegExpBuiltinExec(urlPattern의 pathname 컴포넌트의 정규표현식, pathname)의 결과로 설정합니다.
-
searchExecResult를 RegExpBuiltinExec(urlPattern의 search 컴포넌트의 정규표현식, search)의 결과로 설정합니다.
-
hashExecResult를 RegExpBuiltinExec(urlPattern의 hash 컴포넌트의 정규표현식, hash)의 결과로 설정합니다.
-
protocolExecResult, usernameExecResult, passwordExecResult, hostnameExecResult, portExecResult, pathnameExecResult, searchExecResult, hashExecResult 중 하나라도 null이면 null을 반환합니다.
-
result를 새
URLPatternResult
로 생성합니다. -
result["
inputs
"] 를 inputs로 설정합니다. -
result["
protocol
"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPattern의 protocol 컴포넌트, protocol, protocolExecResult입니다. -
result["
username
"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPattern의 username 컴포넌트, username, usernameExecResult입니다. -
result["
password
"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPattern의 password 컴포넌트, password, passwordExecResult입니다. -
result["
hostname
"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPattern의 hostname 컴포넌트, hostname, hostnameExecResult입니다. -
result["
port
"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPattern의 port 컴포넌트, port, portExecResult입니다. -
result["
pathname
"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPattern의 pathname 컴포넌트, pathname, pathnameExecResult입니다. -
result["
search
"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPattern의 search 컴포넌트, search, searchExecResult입니다. -
result["
hash
"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPattern의 hash 컴포넌트, hash, hashExecResult입니다. -
result를 반환합니다.
-
urlPattern의 protocol 컴포넌트의 정규표현식 그룹 포함 여부가 true면 true를 반환합니다.
-
urlPattern의 username 컴포넌트의 정규표현식 그룹 포함 여부가 true면 true를 반환합니다.
-
urlPattern의 password 컴포넌트의 정규표현식 그룹 포함 여부가 true면 true를 반환합니다.
-
urlPattern의 hostname 컴포넌트의 정규표현식 그룹 포함 여부가 true면 true를 반환합니다.
-
urlPattern의 port 컴포넌트의 정규표현식 그룹 포함 여부가 true면 true를 반환합니다.
-
urlPattern의 pathname 컴포넌트의 정규표현식 그룹 포함 여부가 true면 true를 반환합니다.
-
urlPattern의 search 컴포넌트의 정규표현식 그룹 포함 여부가 true면 true를 반환합니다.
-
urlPattern의 hash 컴포넌트의 정규표현식 그룹 포함 여부가 true면 true를 반환합니다.
-
false를 반환합니다.
1.5. 내부 동작
-
part list를 패턴 문자열 파싱에 input, options, encoding callback을 넘겨 실행한 결과로 설정합니다.
-
(regular expression string, name list)를 정규표현식 및 이름 목록 생성에 part list, options를 넘겨 실행한 결과로 설정합니다.
-
flags를 빈 문자열로 설정합니다.
-
options의 ignore case가 true면 flags를 "
vi
"로 설정합니다. -
그 외의 경우 flags를 "
v
"로 설정합니다. -
regular expression을 RegExpCreate(regular expression string, flags)로 생성합니다. 예외 발생 시, 잡아서
TypeError
를 throw합니다.이 명세는 모든 매칭에 정규표현식을 사용하지만, 반드시 강제되는 것은 아닙니다. 구현에서는 커스텀 regexp 매칭 그룹이 없을 때 part list에 직접 매칭을 수행해도 됩니다. 단, 커스텀 정규표현식이 있을 때는 반드시 컴포넌트 컴파일 알고리즘에서 바로 평가하여 유효하지 않은 경우 에러를 발생시켜야 합니다.
-
pattern string을 패턴 문자열 생성에 part list, options를 넘겨 실행한 결과로 설정합니다.
-
has regexp groups를 false로 설정합니다.
-
각 part에 대해 part list를 순회합니다:
-
컴포넌트 객체를 생성하여 반환합니다. 패턴 문자열은 pattern string, 정규표현식은 regular expression, 그룹 이름 목록은 name list, 정규표현식 그룹 포함 여부는 has regexp groups입니다.
-
result를 새
URLPatternComponentResult
로 생성합니다. -
result["
input
"]에 input을 설정합니다. -
index를 1로 설정합니다.
-
index가 Get(execResult, "
length
")보다 작을 때까지 반복합니다: -
result["
groups
"]에 groups를 설정합니다. -
result를 반환합니다.
-
dummyInput을 "
https://dummy.invalid/
"로 설정합니다. -
dummyInput에 대해 기본 URL 파서를 실행한 결과를 반환합니다.
기본 옵션은 옵션 구조체로, delimiter code point는 빈 문자열, prefix code point는 빈 문자열로 설정합니다.
hostname 옵션은 옵션 구조체로, delimiter code
point는 ".
", prefix code point는 빈 문자열로 설정합니다.
pathname 옵션은 옵션 구조체로, delimiter code
point는 "/
", prefix code point는 "/
"로 설정합니다.
-
각 scheme에 대해 special scheme list를 순회합니다:
-
test result를 RegExpBuiltinExec(protocol component의 정규표현식, scheme)로 설정합니다.
-
test result가 null이 아니면 true를 반환합니다.
-
-
false를 반환합니다.
-
input의 code point 길이가 2 미만이면 false를 반환합니다.
-
input code points를 input을 리스트의 code point로 해석합니다.
-
input code points[0]가 U+005B (
[
)이면 true를 반환합니다. -
input code points[0]가 U+007B (
{
)이고 input code points[1] 가 U+005B ([
)이면 true를 반환합니다. -
input code points[0]가 U+005C (
\
)이고 input code points[1] 가 U+005B ([
)이면 true를 반환합니다. -
false를 반환합니다.
1.6. 생성자 문자열 파싱
생성자 문자열 파서는 구조체입니다.
생성자 문자열 파서는 input이라는 문자열을 가지며, 생성 시 반드시 설정되어야 합니다.
생성자 문자열 파서는 토큰 리스트라는 토큰 리스트를 가지며, 생성 시 반드시 설정되어야 합니다.
생성자 문자열
파서는 result라는 URLPatternInit
를
가지며,
초기값은 새 URLPatternInit
입니다.
생성자 문자열 파서는 컴포넌트 시작이라는 숫자를 가지며, 초기값은 0입니다.
생성자 문자열 파서는 토큰 인덱스라는 숫자를 가지며, 초기값은 0입니다.
생성자 문자열 파서는 토큰 증가값이라는 숫자를 가지며, 초기값은 1입니다.
생성자 문자열 파서는 그룹 깊이라는 숫자를 가지며, 초기값은 0입니다.
생성자 문자열 파서는 hostname IPv6 대괄호 깊이라는 숫자를 가지며, 초기값은 0입니다.
생성자 문자열 파서는 프로토콜 특수 scheme 매칭 플래그라는 boolean 값을 가지며, 초기값은 false입니다.
생성자 문자열
파서는 상태라는 문자열을 가지며, 초기값은 "init
"입니다. 다음 중 하나여야 합니다:
- "
init
" - "
protocol
" - "
authority
" - "
username
" - "
password
" - "
hostname
" - "
port
" - "
pathname
" - "
search
" - "
hash
" - "
done
"
URLPattern 생성자 문자열 알고리즘은 기본 URL 파서 알고리즘과 매우 유사하지만, 직접 사용할 수 없게 만드는 몇 가지 차이점이 있습니다.
첫째, URLPattern 생성자 문자열 파서는 "lenient
" 토크나이즈 정책을 사용해 생성된 토큰에 대해 동작합니다. 반면 기본 URL 파서는 코드 포인트에 대해 동작합니다. 토큰을 사용하면 URLPattern 생성자 문자열 파서가 패턴 문법에서 의미 있는 코드 포인트와 URL 컴포넌트
구분자일 수 있는 코드 포인트를 더 쉽게 구분할 수 있습니다. 예를 들어, "https://a.c:hmm.example.com:8080
"에서 포트 번호와 혼동하지
않고 ":hmm
" 같은 이름 그룹을 다루기가 훨씬 쉬워집니다.
둘째, URLPattern 생성자 문자열 파서는 모든 코드 포인트에 대해 URL 정규화를 적용하지 않아야 합니다. 기본 URL 파서와 달리, 우리는 각 컴포넌트 패턴 문자열을 컴파일할 때 안전하다고 판단되는 부분에만 정규화를 수행합니다.
마지막으로, URLPattern 생성자 문자열 파서는 기본 URL 파서 상태 머신의 일부를 처리하지 않습니다. 예를 들어, 역슬래시를 특별하게 다루지
않는데, 이는 모두 패턴 문자로 처리되며 과도한 이스케이프가 필요하기 때문입니다. 또한, 이 파서는 파일 URL에서 hostname이 있는 것 같은 더 특이한 부분은 다루지 않을 수
있습니다. 이 파서의 목표는 가장 일반적인 URL을 처리하면서, 니치 케이스는 URLPatternInit
생성자를 통해 처리할 수 있도록 하는 것입니다.
생성자 문자열 알고리즘에서 pathname, search, hash는 앞의 컴포넌트가 지정되고 뒤의 컴포넌트가 지정되지 않은 경우 와일드카드됩니다. 예를 들어,
"https://example.com/foo
"는 모든 search와 모든 hash와 매칭됩니다. 마찬가지로
"https://example.com
"은 해당 origin의 모든 URL과 매칭됩니다. 이는 URLPatternInit 처리 노트에서
언급된 더 구체적인 컴포넌트 개념과 유사하지만, 생성자 구문에서는 더 구체적인 컴포넌트를 덜 구체적인 컴포넌트를 지정하지 않고도 지정할 수 있는 경우가 몇 가지뿐입니다.
username과 password 컴포넌트는 명시적으로 지정하지 않으면 항상 와일드카드입니다.
hostname이 지정되고 port가 지정되지 않으면 port는 기본 포트로 간주됩니다. 모든 포트와 매칭하려면 :*
를 명시적으로 작성해야 합니다. 예를 들어,
"https://*
"은 포트 443의 모든 HTTPS origin이고, "https://*:*
"은 모든 포트의 모든 HTTPS
origin입니다.
-
parser를 새 생성자 문자열 파서로 생성합니다. input은 input이고 토큰 리스트는 토크나이즈를 input과 "
lenient
"으로 실행한 결과입니다. -
While parser의 토큰 인덱스가 parser의 토큰 리스트 길이보다 작은 동안:
-
parser의 토큰 증가값을 1로 설정합니다.
파싱 루프의 모든 반복마다 parser의 토큰 인덱스는 토큰 증가값만큼 증가합니다. 일반적으로 1씩 증가하지만, 특정 시점에는 0으로 설정될 때도 있습니다. 토큰 증가값은 항상 루프 상단에서 1로 리셋됩니다.
-
parser의 토큰 리스트[parser의 토큰 인덱스]의 타입이 "
end
"이면:-
"
init
" 상태에서 문자열의 끝에 도달했다면, 프로토콜 종결자를 찾지 못했으므로 상대 URLPattern 생성자 문자열이어야 합니다.-
rewind를 parser에 대해 실행합니다.
이후 상대 패턴이 어느 컴포넌트에서 시작하는지 결정합니다. 상대 경로(pathname)가 가장 일반적이지만, URL 및 URLPattern 생성자 문자열은 search나 hash 컴포넌트로도 시작할 수 있습니다.
-
is a hash prefix를 parser에 대해 실행한 결과가 true면 change state를 parser, "
hash
"와 1로 실행합니다. -
그 외 is a search prefix를 parser에 대해 실행한 결과가 true면:
-
change state를 parser, "
search
"와 1로 실행합니다.
-
-
그 외에는:
-
change state를 parser, "
pathname
"와 0으로 실행합니다.
-
-
-
"
authority
" 상태에서 문자열의 끝에 도달했다면, "@
"를 찾지 못했으므로 username이나 password가 없습니다.-
rewind and set state를 parser와 "
hostname
"로 실행합니다.
-
-
change state를 parser, "
done
"와 0으로 실행합니다.
-
-
is a group open를 parser에 대해 실행한 결과가 true면:
"
{ ... }
" 패턴 그룹 내의 모든 코드 포인트는 무시합니다. 예를 들어, "https://example.c{om/fo}o
"처럼 그룹 내에 URL 컴포넌트 경계가 있는 것은 허용되지 않습니다. well formed 패턴 문자열에서는 지원되지 않지만, 파서 혼란을 피하기 위해 여기서는 중첩 그룹도 처리합니다.정규표현식이나 이름 그룹에는 이 로직이 필요하지 않습니다. 해당 값들은 토큰으로 토크나이즈 알고리즘에서 이미 병합되기 때문입니다.
-
parser의 그룹 깊이가 0보다 크면:
-
is a group close를 parser에 대해 실행한 결과가 true면 parser의 그룹 깊이를 1 감소시킵니다.
-
그 외에는:
-
-
parser의 상태에 따라 아래 과정을 실행합니다:
- "
init
" -
-
is a protocol suffix를 parser에 대해 실행한 결과가 true면:
-
rewind and set state를 parser와 "
protocol
"로 실행합니다.
-
-
- "
protocol
" -
-
is a protocol suffix를 parser에 대해 실행한 결과가 true면:
-
compute protocol matches a special scheme flag를 parser에 대해 실행합니다.
프로토콜 컴포넌트가 특수 scheme과 매칭되는지 미리 컴파일해야 합니다. 매칭된다면 특별 규칙이 적용됩니다. pathname이 기본적으로 "
/
"가 되는지, username, password, hostname, port 컴포넌트를 찾을지 결정합니다. authority 슬래시가 있으면 해당 컴포넌트들도 찾고, 그렇지 않으면 "불투명 경로 URL"로 간주하여 바로 pathname 컴포넌트로 이동합니다. -
next state를 "
pathname
"로 설정합니다. -
skip을 1로 설정합니다.
-
next is authority slashes를 parser에 대해 실행한 결과가 true면:
-
next state를 "
authority
"로 설정합니다. -
skip을 3으로 설정합니다.
-
-
그 외 parser의 프로토콜 특수 scheme 매칭 플래그가 true면 next state를 "
authority
"로 설정합니다. -
change state를 parser, next state, skip로 실행합니다.
-
-
- "
authority
" -
-
is an identity terminator를 parser에 대해 실행한 결과가 true면 rewind and set state를 parser와 "
username
"로 실행합니다. -
그 외 아래 중 하나라도 true면:
- is a pathname start를 parser에 대해 실행한 결과;
- is a search prefix를 parser에 대해 실행한 결과; 또는
- is a hash prefix를 parser에 대해 실행한 결과,
위 중 하나라도 true면 rewind and set state를 parser와 "
hostname
"로 실행합니다.
-
- "
username
" -
-
is a password prefix를 parser에 대해 실행한 결과가 true면 change state를 parser, "
password
", 1로 실행합니다. -
그 외 is an identity terminator를 parser에 대해 실행한 결과가 true면 change state를 parser, "
hostname
", 1로 실행합니다.
-
- "
password
" -
-
is an identity terminator를 parser에 대해 실행한 결과가 true면 change state를 parser, "
hostname
", 1로 실행합니다.
-
- "
hostname
" -
-
is an IPv6 open을 parser에 대해 실행한 결과가 true면 parser의 hostname IPv6 대괄호 깊이를 1 증가시킵니다.
-
그 외 is an IPv6 close를 parser에 대해 실행한 결과가 true면 parser의 hostname IPv6 대괄호 깊이를 1 감소시킵니다.
-
그 외 is a port prefix를 parser에 대해 실행한 결과가 true고 parser의 hostname IPv6 대괄호 깊이가 0이면 change state를 parser, "
port
", 1로 실행합니다. -
그 외 is a pathname start를 parser에 대해 실행한 결과가 true면 change state를 parser, "
pathname
", 0으로 실행합니다. -
그 외 is a search prefix를 parser에 대해 실행한 결과가 true면 change state를 parser, "
search
", 1로 실행합니다. -
그 외 is a hash prefix를 parser에 대해 실행한 결과가 true면 change state를 parser, "
hash
", 1로 실행합니다.
-
- "
port
" -
-
is a pathname start를 parser에 대해 실행한 결과가 true면 change state를 parser, "
pathname
", 0으로 실행합니다. -
그 외 is a search prefix를 parser에 대해 실행한 결과가 true면 change state를 parser, "
search
", 1로 실행합니다. -
그 외 is a hash prefix를 parser에 대해 실행한 결과가 true면 change state를 parser, "
hash
", 1로 실행합니다.
-
- "
pathname
" -
-
is a search prefix를 parser에 대해 실행한 결과가 true면 change state를 parser, "
search
", 1로 실행합니다. -
그 외 is a hash prefix를 parser에 대해 실행한 결과가 true면 change state를 parser, "
hash
", 1로 실행합니다.
-
- "
search
" -
-
is a hash prefix를 parser에 대해 실행한 결과가 true면 change state를 parser, "
hash
", 1로 실행합니다.
-
- "
hash
" -
-
아무 것도 하지 않습니다.
-
- "
done
" -
-
단언: 이 단계에는 도달하지 않습니다.
-
- "
-
-
parser의 result 에 "
hostname
" 이 있고, "port
" 가 없으면, parser의 result["port
"] 를 빈 문자열로 설정합니다.이 경우는 특별 취급합니다. 작성자가 포트를 지정하지 않으면 기본 포트를 의도하는 경우가 많기 때문입니다. 모든 포트를 허용하려면 와일드카드를 명시적으로 지정해야 합니다. 예를 들어, "https://example.com/*
"은 "https://example.com:8443/
"로 시작하는 URL과 매칭되지 않습니다. -
parser의 result를 반환합니다.
-
parser의 state가 "
init
", "authority
", "done
"가 아니면, parser의 result[parser의 state]에 컴포넌트 문자열 생성을 parser에 대해 실행한 결과를 설정합니다. -
parser의 state가 "
init
"가 아니고 new state가 "done
"가 아니면:-
parser의 state가 "
protocol
", "authority
", "username
", 또는 "password
"; new state가 "port
", "pathname
", "search
", 또는 "hash
"; 그리고 parser의 result["hostname
"] 가 존재하지 않으면, parser의 result["hostname
"] 를 빈 문자열로 설정합니다. -
parser의 state가 "
protocol
", "authority
", "username
", "password
", "hostname
", 또는 "port
"; new state가 "search
" 또는 "hash
"; 그리고 parser의 result["pathname
"] 가 존재하지 않으면,-
parser의 프로토콜 특수 scheme 매칭 플래그가 true면 parser의 result["
pathname
"] 를 "/
"로 설정합니다.
-
-
parser의 state가 "
protocol
", "authority
", "username
", "password
", "hostname
", "port
", 또는 "pathname
"; new state가 "hash
"; 그리고 parser의 result["search
"] 가 존재하지 않으면, parser의 result["search
"] 를 빈 문자열로 설정합니다.
-
-
parser의 state를 new state로 설정합니다.
-
parser의 토큰 인덱스를 skip만큼 증가시킵니다.
-
parser의 토큰 증가값을 0으로 설정합니다.
-
token을 안전한 토큰 얻기를 parser, index로 실행한 결과로 설정합니다.
-
token의 value가 value와 다르면 false 반환.
-
아래 중 하나라도 true이면:
- token의 type이 "
char
"; - token의 type이 "
escaped-char
"; 또는 - token의 type이 "
invalid-char
",
true 반환.
- token의 type이 "
-
false 반환.
-
특수하지 않은 패턴 문자 여부 판정을 parser, parser의 token index, "
:
"로 실행한 결과를 반환.
-
특수하지 않은 패턴 문자 여부 판정을 parser, parser의 token index + 1, "
/
"로 실행한 결과가 false면 false 반환. -
특수하지 않은 패턴 문자 여부 판정을 parser, parser의 token index + 2, "
/
"로 실행한 결과가 false면 false 반환. -
true 반환.
-
특수하지 않은 패턴 문자 여부 판정을 parser, parser의 token index, "
@
"로 실행한 결과를 반환.
-
특수하지 않은 패턴 문자 여부 판정을 parser, parser의 token index, "
:
"로 실행한 결과를 반환.
-
특수하지 않은 패턴 문자 여부 판정을 parser, parser의 token index, "
:
"로 실행한 결과를 반환.
-
특수하지 않은 패턴 문자 여부 판정을 parser, parser의 token index, "
/
"로 실행한 결과를 반환.
-
특수하지 않은 패턴 문자 여부 판정을 parser, parser의 token index, "
?
"로 실행한 결과가 true면 true 반환. -
parser의 토큰 리스트[parser의 token index]의 value가 "
?
"가 아니면 false 반환. -
previous index를 parser의 token index − 1로 설정합니다.
-
previous index가 0 미만이면 true 반환.
-
previous token을 안전한 토큰 얻기를 parser, previous index로 실행한 결과로 설정합니다.
-
아래 중 하나라도 true면 false 반환:
-
true 반환.
-
특수하지 않은 패턴 문자 여부 판정을 parser, parser의 token index, "
#
"로 실행한 결과를 반환.
-
parser의 토큰 리스트[parser의 token index]의 type이 "
open
"이면 true 반환. -
그 외에는 false 반환.
-
parser의 토큰 리스트[parser의 token index]의 type이 "
close
"이면 true 반환. -
그 외에는 false 반환.
-
특수하지 않은 패턴 문자 여부 판정을 parser, parser의 token index, "
[
"로 실행한 결과를 반환.
-
특수하지 않은 패턴 문자 여부 판정을 parser, parser의 token index, "
]
"로 실행한 결과를 반환.
-
단언: parser의 token index가 parser의 토큰 리스트 길이보다 작음.
-
token을 parser의 토큰 리스트[parser의 token index]로 설정합니다.
-
component start token을 안전한 토큰 얻기를 parser, parser의 컴포넌트 시작으로 실행한 결과로 설정합니다.
-
component start input index를 component start token의 index로 설정합니다.
-
end index를 token의 index로 설정합니다.
-
parser의 code point substring을 component start input index부터 end index까지 input에서 추출하여 반환합니다.
-
protocol string을 컴포넌트 문자열 생성을 parser에 대해 실행한 결과로 설정합니다.
-
protocol component를 컴포넌트 컴파일을 protocol string, 프로토콜 정규화, 기본 옵션으로 실행한 결과로 설정합니다.
-
protocol 컴포넌트가 특수 scheme과 매칭되는지를 protocol component에 대해 실행한 결과가 true면, parser의 프로토콜 특수 scheme 매칭 플래그를 true로 설정합니다.
2. 패턴 문자열
패턴 문자열은 일련의 대상 문자열 집합과 매칭하기 위해 작성된 문자열입니다. well formed 패턴 문자열은 특정 패턴 문법을 준수합니다. 이 패턴 문법은 인기 있는 path-to-regexp JavaScript 라이브러리의 문법을 직접 기반으로 합니다.
패턴 문자열은 파싱되어 part list를 생성할 수 있으며, 이 리스트는 패턴 문자열이 매칭되기 위해 컴포넌트 문자열에 어떤 내용이 어떤 순서로 등장해야 하는지를 설명합니다.
/
는 pathname, .
는 hostname)까지 매칭합니다. 예를 들어, pathname 패턴
"/blog/:title
"은 "/blog/hello-world
"와 매칭되지만 "/blog/2012/02
"와는 매칭되지
않습니다.
괄호로 둘러싼 정규표현식도 사용할 수 있으므로, pathname 패턴 "/blog/:year(\d+)/:month(\d+)
"은
"/blog/2012/02
"와 매칭됩니다.
그룹은 선택적이거나 반복될 수 있으며, 수정자를 사용해서 지정할 수 있습니다. 예를 들어, pathname 패턴
"/products/:id?
"은 "/products
"와 "/products/2
" 모두와 매칭되지만
"/products/
"와는 매칭되지 않습니다. pathname에서는 그룹이 자동으로 선행 /
를 요구하므로, 이를 피하려면 그룹을 명시적으로
구분할 수 있습니다(예: pathname 패턴 "/products/{:id}?
").
전체 와일드카드 *
도 사용할 수 있으며, 가능한 한 많이 매칭합니다(예: pathname 패턴 "/products/*
").
2.1. 패턴 문자열 파싱
2.1.1. 토큰
토큰 리스트는 리스트로, 0개 이상의 토큰 구조체를 포함합니다.
토큰은 구조체로, 패턴 문자열 내의 개별 렉시컬 토큰 하나를 나타냅니다.
토큰은 타입을 가지며, 문자열이고, 초기값은 "invalid-char
"입니다. 다음 중 하나여야 합니다:
- "
open
" - 토큰이 U+007B(
{
) 코드 포인트를 나타냅니다. - "
close
" - 토큰이 U+007D(
}
) 코드 포인트를 나타냅니다. - "
regexp
" - 토큰이 "
(<정규표현식>)
" 형태의 문자열을 나타냅니다. 정규표현식은 ASCII 코드 포인트만으로 구성되어야 합니다. - "
name
" - 토큰이 "
:<이름>
" 형태의 문자열을 나타냅니다. name 값은 JavaScript 식별자에 부합하는 코드 포인트로 제한됩니다. - "
char
" - 토큰이 특별한 문법적 의미가 없는 유효한 패턴 코드 포인트를 나타냅니다.
- "
escaped-char
" - 토큰이 백슬래시로 이스케이프된 코드
포인트("
\<char>
")를 나타냅니다. - "
other-modifier
" - 토큰이 매칭 그룹 수정자로, U+003F(
?
) 또는 U+002B(+
) 코드 포인트를 나타냅니다. - "
asterisk
" - 토큰이 U+002A(
*
) 코드 포인트를 나타내며, 와일드카드 매칭 그룹 또는 매칭 그룹 수정자일 수 있습니다. - "
end
" - 토큰이 패턴 문자열의 끝을 나타냅니다.
- "
invalid-char
" - 토큰이 패턴에서 유효하지 않은 코드 포인트를 나타냅니다. 이는 코드 포인트 값 자체가 원인일 수도 있고, 패턴 내의 다른 문법 요소와의 위치 때문에 발생할 수도 있습니다.
토큰은 index를 가지며, 숫자이고 초기값은 0입니다. 이는 토큰이 나타내는 패턴 문자열 내 첫 번째 코드 포인트의 위치입니다.
토큰은 value를 가지며, 문자열이고, 초기값은 빈 문자열입니다. 토큰이 나타내는 패턴 문자열의 코드 포인트를 포함합니다.
2.1.2. 토크나이즈
토크나이즈 정책은 문자열이며, 반드시
"strict
" 또는 "lenient
" 중 하나여야 합니다.
토크나이저는 구조체입니다.
토크나이저는 input을 가지며, 패턴 문자열이고, 초기값은 빈 문자열입니다.
토크나이저는 policy를 가지며, 토크나이즈 정책이고, 초기값은 "strict
"입니다.
토크나이저는 토큰 리스트를 가지며, 토큰 리스트이고, 초기값은 빈 리스트입니다.
토크나이저는 index를 가지며, 숫자이고, 초기값은 0입니다.
토크나이저는 next index를 가지며, 숫자이고, 초기값은 0입니다.
토크나이저는 code point를 가지며, 유니코드 코드 포인트이고, 초기값은 null입니다.
-
tokenizer를 새 토크나이저로 생성합니다.
-
tokenizer의 input을 input으로 설정합니다.
-
tokenizer의 policy를 policy로 설정합니다.
-
tokenizer의 index가 tokenizer의 input의 code point length보다 작은 동안:
-
seek and get the next code point를 tokenizer와 tokenizer의 index로 실행합니다.
-
tokenizer의 code point가 U+002A(
*
)이면:-
기본 위치 및 길이로 토큰 추가를 tokenizer와 "
asterisk
"로 실행합니다.
-
-
tokenizer의 code point가 U+002B(
+
) 또는 U+003F(?
)이면:-
기본 위치 및 길이로 토큰 추가를 tokenizer와 "
other-modifier
"로 실행합니다.
-
-
tokenizer의 code point가 U+005C(
\
)이면:-
tokenizer의 index가 tokenizer의 input의 code point length − 1과 같으면:
-
토크나이즈 에러 처리를 tokenizer, tokenizer의 next index, tokenizer의 index로 실행합니다.
-
-
escaped index를 tokenizer의 next index로 설정합니다.
-
get the next code point를 tokenizer로 실행합니다.
-
기본 길이로 토큰 추가를 tokenizer, "
escaped-char
", tokenizer의 next index, escaped index로 실행합니다.
-
-
tokenizer의 code point가 U+007B(
{
)이면:-
기본 위치 및 길이로 토큰 추가를 tokenizer와 "
open
"로 실행합니다.
-
-
tokenizer의 code point가 U+007D(
}
)이면:-
기본 위치 및 길이로 토큰 추가를 tokenizer와 "
close
"로 실행합니다.
-
-
tokenizer의 code point가 U+003A(
:
)이면:-
name position을 tokenizer의 next index로 설정합니다.
-
name start를 name position으로 설정합니다.
-
name position이 tokenizer의 input의 code point length보다 작은 동안:
-
seek and get the next code point를 tokenizer와 name position으로 실행합니다.
-
first code point가 name position이 name start와 같으면 true, 아니면 false로 설정합니다.
-
valid code point를 유효한 이름 코드 포인트 여부 판정을 tokenizer의 code point, first code point로 실행한 결과로 설정합니다.
-
valid code point가 false이면 break.
-
name position을 tokenizer의 next index로 설정합니다.
-
-
name position이 name start 이하이면:
-
토크나이즈 에러 처리를 tokenizer, name start, tokenizer의 index로 실행합니다.
-
-
기본 길이로 토큰 추가를 tokenizer, "
name
", name position, name start로 실행합니다.
-
-
tokenizer의 code point가 U+0028(
(
)이면:-
depth를 1로 설정합니다.
-
regexp position을 tokenizer의 next index로 설정합니다.
-
regexp start를 regexp position으로 설정합니다.
-
error를 false로 설정합니다.
-
regexp position이 tokenizer의 input의 code point length보다 작은 동안:
-
seek and get the next code point를 tokenizer와 regexp position으로 실행합니다.
-
tokenizer의 code point가 ASCII 코드 포인트가 아니면:
-
토크나이즈 에러 처리를 tokenizer, regexp start, tokenizer의 index로 실행합니다.
-
error를 true로 설정합니다.
-
-
regexp position이 regexp start와 같고 tokenizer의 code point가 U+003F(
?
)이면:-
토크나이즈 에러 처리를 tokenizer, regexp start, tokenizer의 index로 실행합니다.
-
error를 true로 설정합니다.
-
-
tokenizer의 code point가 U+005C(
\
)이면:-
regexp position이 tokenizer의 input의 code point length − 1과 같으면:
-
토크나이즈 에러 처리를 tokenizer, regexp start, tokenizer의 index로 실행합니다.
-
error를 true로 설정합니다.
-
-
get the next code point를 tokenizer로 실행합니다.
-
tokenizer의 code point가 ASCII 코드 포인트가 아니면:
-
토크나이즈 에러 처리를 tokenizer, regexp start, tokenizer의 index로 실행합니다.
-
error를 true로 설정합니다.
-
-
regexp position을 tokenizer의 next index로 설정합니다.
-
-
tokenizer의 code point가 U+0029(
)
)이면:-
depth를 1 감소시킵니다.
-
depth가 0이면:
-
regexp position을 tokenizer의 next index로 설정합니다.
-
-
-
그 외 tokenizer의 code point가 U+0028(
(
)이면:-
depth를 1 증가시킵니다.
-
regexp position이 tokenizer의 input의 code point length − 1과 같으면:
-
process a tokenizing error를 tokenizer, regexp start, tokenizer의 index로 실행합니다.
-
error를 true로 설정합니다.
-
-
temporary position을 tokenizer의 next index로 설정합니다.
-
get the next code point를 tokenizer로 실행합니다.
-
tokenizer의 code point가 U+003F(
?
)가 아니면:-
토크나이즈 에러 처리를 tokenizer, regexp start, tokenizer의 index로 실행합니다.
-
error를 true로 설정합니다.
-
-
tokenizer의 next index를 temporary position으로 설정합니다.
-
-
regexp position을 tokenizer의 next index로 설정합니다.
-
-
error가 true면 continue.
-
depth가 0이 아니면:
-
토크나이즈 에러 처리를 tokenizer, regexp start, tokenizer의 index로 실행합니다.
-
-
regexp length를 regexp position − regexp start − 1로 설정합니다.
-
regexp length가 0이면:
-
토크나이즈 에러 처리를 tokenizer, regexp start, tokenizer의 index로 실행합니다.
-
-
토큰 추가를 tokenizer, "
regexp
", regexp position, regexp start, regexp length로 실행합니다.
-
-
기본 위치 및 길이로 토큰 추가를 tokenizer와 "
char
"로 실행합니다.
-
-
기본 길이로 토큰 추가를 tokenizer, "
end
", tokenizer의 index, tokenizer의 index로 실행합니다. -
tokenizer의 토큰 리스트를 반환합니다.
-
tokenizer의 code point를 tokenizer의 input에서 tokenizer의 next index 위치에 있는 유니코드 코드 포인트로 설정합니다.
-
tokenizer의 next index를 1 증가시킵니다.
-
tokenizer의 next index를 index로 설정합니다.
-
다음 코드 포인트 가져오기를 tokenizer로 실행합니다.
-
computed length를 next position − value position으로 설정합니다.
-
토큰 추가를 tokenizer, type, next position, value position, computed length로 실행합니다.
-
기본 길이로 토큰 추가를 tokenizer, type, tokenizer의 next index, tokenizer의 index로 실행합니다.
-
기본 길이로 토큰 추가를 tokenizer, "
invalid-char
", next position, value position로 실행합니다.
-
first가 true라면, code point가 IdentifierStart 코드 포인트 집합에 포함되어 있는지 검사한 결과를 반환합니다.
-
그 외에는 code point가 IdentifierPart 코드 포인트 집합에 포함되어 있는지 검사한 결과를 반환합니다.
2.1.3. 부분
부분 리스트는 리스트로, 0개 이상의 부분을 포함합니다.
부분은 구조체로, 파서의 패턴 문자열의 한 조각을 나타냅니다. 최대 하나의 매칭 그룹, 고정 텍스트 접두사, 고정 텍스트 접미사, 수정자를 포함할 수 있습니다. 최소로는 하나의 고정 텍스트 문자열 또는 하나의 매칭 그룹만을 가질 수 있습니다.
부분은 타입을 가지며, 문자열로 반드시 생성 시 설정해야 합니다. 다음 중 하나여야 합니다:
- "
fixed-text
" - 부분이 단순 고정 텍스트 문자열을 나타냅니다.
- "
regexp
" - 부분이 커스텀 정규표현식이 있는 매칭 그룹을 나타냅니다.
- "
segment-wildcard
" - 부분이 다음 분리자 코드 포인트까지 매칭하는 매칭 그룹을 나타냅니다. 보통
커스텀 정규표현식이 없는 "
:foo
"와 같은 이름 그룹에 사용됩니다. - "
full-wildcard
" - 부분이 모든 코드 포인트를 탐욕적으로 매칭하는 매칭 그룹을 나타냅니다. 보통
"
*
" 와일드카드 매칭 그룹에 사용됩니다.
부분은 값을 가지며, 문자열로 반드시 생성 시 설정해야 합니다.
부분은 수정자를 가지며, 문자열로 반드시 생성 시 설정해야 합니다. 다음 중 하나여야 합니다:
- "
none
" - 부분은 수정자가 없습니다.
- "
optional
" - 부분은 U+003F(
?
) 코드 포인트로 표시되는 선택적 수정자를 가집니다. - "
zero-or-more
" - 부분은 U+002A(
*
) 코드 포인트로 표시되는 "zero or more" 수정자를 가집니다. - "
one-or-more
" - 부분은 U+002B(
+
) 코드 포인트로 표시되는 "one or more" 수정자를 가집니다.
부분은 이름을 가지며, 문자열로 초기값은 빈 문자열입니다.
부분은 접두사를 가지며, 문자열로 초기값은 빈 문자열입니다.
부분은 접미사를 가지며, 문자열로 초기값은 빈 문자열입니다.
2.1.4. 옵션
옵션 구조체는 패턴 문자열의 동작을 제어하는 다양한 설정을 포함합니다. 이 옵션들은 원래 path-to-regexp에서 유래되었습니다. URLPattern 명세에서 변경되는 옵션만
포함하며, 그 외의 옵션은 제외합니다. 비교 목적으로, 이 명세는 path-to-regexp에서 strict
,
start
, end
가 항상 false로 설정된 것과 같습니다.
옵션은 구분자 코드
포인트를 가지며, 문자열로 반드시 생성 시 설정해야 합니다. 1개의 ASCII 코드 포인트
또는 빈 문자열이어야 합니다. 이 코드 포인트는 세그먼트 구분자로 처리되며, 기본적으로 :foo
이름 그룹이 어디까지 매칭되는지 결정하는 데 사용됩니다. 예를 들어, 구분자
코드 포인트가 "/
"이면 "/:foo
"는 "/bar
"와 매칭되지만,
"/bar/baz
"와는 매칭되지 않습니다. 구분자 코드 포인트가 빈 문자열이면 두 예제 패턴 모두와 매칭됩니다.
옵션은 접두사 코드
포인트를 가지며, 문자열로 반드시 생성 시 설정해야 합니다. 1개의 ASCII 코드 포인트
또는 빈 문자열이어야 합니다. 이 코드 포인트는 매칭 그룹 바로 앞에 있으면 자동 접두사로 처리됩니다. 이는 매칭 그룹이 선택적이거나 반복적으로 변경될 때 중요합니다. 예를 들어, 접두사 코드
포인트가 "/
"이면 "/foo/:bar?/baz
"에서 ":bar
" 앞의 "/
"가
접두사로 처리되어 이름 그룹과 함께 선택적으로 됩니다. 그래서 이 패턴은 "/foo/baz
"와 매칭됩니다.
옵션은 대소문자 무시를 가지며,
boolean 타입으로 반드시 생성 시 설정해야 합니다. 기본값은 false입니다. true 또는 false로 설정하면 각각 대소문자 구분, 대소문자 무시 매칭이 활성화됩니다. 비교 목적으로,
이 케이스는 path-to-regexp의 sensitive
옵션의
부정값처럼 생각할 수 있습니다.
2.1.5. 파싱
패턴 파서는 구조체입니다.
패턴 파서는 토큰 리스트를 가지며, 토큰 리스트이고, 초기값은 빈 리스트입니다.
패턴 파서는 인코딩 콜백을 가지며, 인코딩 콜백이고 반드시 생성 시 설정해야 합니다.
패턴 파서는 세그먼트 와일드카드 정규표현식을 가지며, 문자열이고 반드시 생성 시 설정해야 합니다.
패턴 파서는 부분 리스트를 가지며, 부분 리스트이고, 초기값은 빈 리스트입니다.
패턴 파서는 대기 중 고정 값을 가지며, 문자열이고 초기값은 빈 문자열입니다.
패턴 파서는 인덱스를 가지며, 숫자로 초기값은 0입니다.
패턴 파서는 다음 숫자 이름을 가지며, 숫자로 초기값은 0입니다.
-
parser를 새 패턴 파서로 생성합니다. 인코딩 콜백은 encoding callback, 세그먼트 와일드카드 정규표현식은 세그먼트 와일드카드 정규표현식 생성을 options로 실행한 결과입니다.
-
parser의 인덱스가 parser의 토큰 리스트 길이보다 작은 동안:
-
regexp or wildcard token을 정규표현식 또는 와일드카드 토큰 소모 시도를 parser, name token으로 실행한 결과로 설정합니다.
-
name token이 null이 아니거나 regexp or wildcard token이 null이 아니면:
매칭 그룹이 있다면 즉시 부분을 추가해야 합니다.
-
prefix를 빈 문자열로 설정합니다.
-
char token이 null이 아니면 prefix를 char token의 value로 설정합니다.
-
prefix가 빈 문자열이 아니고 options의 접두사 코드 포인트가 아니면:
-
prefix를 parser의 대기 중 고정 값 끝에 추가합니다.
-
prefix를 빈 문자열로 설정합니다.
-
-
대기 중 고정 값에서 부분 추가 시도를 parser로 실행합니다.
-
modifier token을 수정자 토큰 소모 시도를 parser로 실행한 결과로 설정합니다.
-
부분 추가를 parser, prefix, name token, regexp or wildcard token, 빈 문자열, modifier token으로 실행합니다.
-
-
fixed token을 char token으로 설정합니다.
매칭 그룹이 없었다면 고정 텍스트를 버퍼링해야 합니다. 가능한 한 많은 텍스트를 모아서 "
fixed-text
" 부분으로 추가하기 원합니다. -
fixed token이 null이면 fixed token을 토큰 소모 시도를 parser, "
escaped-char
"로 실행한 결과로 설정합니다. -
fixed token이 null이 아니면:
-
open token이 null이 아니면:
-
prefix를 텍스트 소비를 parser로 실행한 결과로 설정합니다.
-
regexp or wildcard token을 정규표현식 또는 와일드카드 토큰 소모 시도를 parser, name token으로 실행한 결과로 설정합니다.
-
suffix를 텍스트 소비를 parser로 실행한 결과로 설정합니다.
-
modifier token을 수정자 토큰 소모 시도를 parser로 실행한 결과로 설정합니다.
-
부분 추가를 parser, prefix, name token, regexp or wildcard token, suffix, modifier token으로 실행합니다.
-
-
대기 중 고정 값에서 부분 추가 시도를 parser로 실행합니다.
-
parser의 부분 리스트를 반환합니다.
전체 와일드카드 정규식
값은 문자열 ".*
"입니다.
-
result를 "
[^
"로 설정합니다. -
options의 delimiter code point에 대해 정규식 문자열 이스케이프를 실행한 결과를 result 끝에 추가합니다.
-
"
]+?
"를 result 끝에 추가합니다. -
result를 반환합니다.
-
단언: parser의 index가 parser의 token list 길이보다 작음.
-
next token을 parser의 token list[parser의 index]로 설정합니다.
-
next token의 type이 type이 아니면 null 반환.
-
parser의 index를 1 증가시킵니다.
-
next token을 반환합니다.
-
token을 토큰 소모 시도를 parser, "
other-modifier
"로 실행한 결과로 설정합니다. -
token이 null이 아니면 token을 반환합니다.
-
token을 반환합니다.
-
modifier를 "
none
"로 설정합니다. -
modifier token이 null이 아니면:
-
그 외 modifier token의 value가 "
*
"이면 modifier를 "zero-or-more
"로 설정합니다. -
그 외 modifier token의 value가 "
+
"이면 modifier를 "one-or-more
"로 설정합니다.
-
name token이 null이고 regexp or wildcard token도 null이고 modifier가 "
none
"이면:이 경우는 "
{foo}
" 그룹입니다. 대기 중 고정 값에 추가하여 이전/이후 텍스트와 결합될 수 있도록 합니다.-
prefix를 parser의 대기 중 고정 값 끝에 추가합니다.
-
반환합니다.
-
-
대기 중 고정 값에서 부분 추가 시도를 parser로 실행합니다.
-
name token이 null이고 regexp or wildcard token도 null이면:
이 경우는 "
{foo}?
" 그룹입니다. modifier가 있으므로 다른 텍스트와 결합할 수 없습니다. 즉시 부분으로 추가합니다. -
regexp value를 빈 문자열로 설정합니다.
다음은 regexp or wildcard token을 정규표현식으로 변환합니다.
-
regexp or wildcard token이 null이면 regexp value를 parser의 세그먼트 와일드카드 정규식으로 설정합니다.
-
그 외 regexp or wildcard token의 type이 "
asterisk
"이면 regexp value를 전체 와일드카드 정규식 값으로 설정합니다. -
그 외에는 regexp value를 regexp or wildcard token의 value로 설정합니다.
-
type을 "
regexp
"로 설정합니다.다음은 regexp value를 부분 type으로 변환합니다. 정규표현식으로 먼저 변환하여 "
regexp
" token이 "name
" 또는 "asterisk
" token과 동일하게 처리되도록 합니다. -
regexp value가 parser의 세그먼트 와일드카드 정규식과 같으면:
-
type을 "
segment-wildcard
"로 설정합니다. -
regexp value를 빈 문자열로 설정합니다.
-
-
그 외 regexp value가 전체 와일드카드 정규식 값과 같으면:
-
type을 "
full-wildcard
"로 설정합니다. -
regexp value를 빈 문자열로 설정합니다.
-
-
name을 빈 문자열로 설정합니다.
다음은 부분 이름을 결정합니다. 이는 "
name
" token으로 명시적으로 제공되거나 자동으로 할당될 수 있습니다. -
name token이 null이 아니면 name을 name token의 value로 설정합니다.
-
그 외 regexp or wildcard token이 null이 아니면:
-
중복 이름 여부 판정을 parser, name으로 실행한 결과가 true면
TypeError
를 throw합니다. -
encoded prefix를 parser의 인코딩 콜백을 prefix에 대해 실행한 결과로 설정합니다.
마지막으로, 고정 텍스트 값을 인코딩하고 부분을 생성합니다.
-
encoded suffix를 parser의 인코딩 콜백을 suffix에 대해 실행한 결과로 설정합니다.
-
part를 새 부분으로 생성합니다. type은 type, value는 regexp value, modifier는 modifier, name은 name, prefix는 encoded prefix, suffix는 encoded suffix입니다.
2.2. 부분 리스트를 정규표현식으로 변환하기
-
result를 "
^
"로 설정합니다. -
name list를 새 리스트로 생성합니다.
-
각 part를 part list에서 반복합니다:
-
part의 type이 "
fixed-text
"이면:-
part의 modifier가 "
none
"이면, 정규식 문자열 이스케이프를 part의 value에 대해 실행한 결과를 result 끝에 추가합니다. -
그 외에는:
"
fixed-text
" part에 modifier가 있으면 비캡처 그룹을 사용합니다. 아래 형태를 사용합니다.(?:<고정 텍스트>)<modifier>
-
"
(?:
"를 result 끝에 추가합니다. -
정규식 문자열 이스케이프를 part의 value에 대해 실행한 결과를 result 끝에 추가합니다.
-
"
)
"를 result 끝에 추가합니다. -
modifier를 문자열로 변환을 part의 modifier로 실행한 결과를 result 끝에 추가합니다.
-
-
-
Append를 사용해 part의 name을 name list 끝에 추가합니다.
매칭 그룹 이름을 병렬 리스트로 수집합니다. 이는 대부분 path-to-regexp와의 레거시 호환성을 위한 것입니다. 정규표현식의 named capture group으로 전환할 수도 있지만, 알고리즘의 복잡성 때문에 의도치 않은 버그가 발생할 위험이 있습니다. 또한, 생성된 정규표현식을 웹에 노출할 경우 path-to-regexp와의 호환성을 유지하는 것이 중요합니다.
-
regexp value를 part의 value로 설정합니다.
-
part의 type이 "
segment-wildcard
"이면 regexp value를 세그먼트 와일드카드 정규식 생성을 options로 실행한 결과로 설정합니다. -
그 외 part의 type이 "
full-wildcard
"이면 regexp value를 전체 와일드카드 정규식 값으로 설정합니다. -
part의 prefix와 part의 suffix가 모두 빈 문자열이면:
prefix나 suffix가 없으면 modifier에 따라 생성 방식이 달라집니다. modifier가 없거나 optional만 있을 때는 아래와 같은 간단한 형태를 사용합니다:
(<regexp value>)<modifier>
반복 modifier가 있으면 더 복잡한 형태를 사용합니다:
((?:<regexp value>)<modifier>)
-
part의 modifier가 "
none
" 또는 "optional
"이면:-
"
(
"를 result 끝에 추가합니다. -
regexp value를 result 끝에 추가합니다.
-
"
)
"를 result 끝에 추가합니다. -
modifier를 문자열로 변환을 part의 modifier로 실행한 결과를 result 끝에 추가합니다.
-
-
그 외에는:
-
"
((?:
"를 result 끝에 추가합니다. -
regexp value를 result 끝에 추가합니다.
-
"
)
"를 result 끝에 추가합니다. -
modifier를 문자열로 변환을 part의 modifier로 실행한 결과를 result 끝에 추가합니다.
-
"
)
"를 result 끝에 추가합니다.
-
-
-
part의 modifier가 "
none
" 또는 "optional
"이면:이 부분은 prefix나 suffix가 있는 반복되지 않는 부분을 처리합니다. 내부 캡처 그룹이 주 regexp value를 포함하고, 그 그룹은 prefix/suffix와 비캡처 그룹으로 결합됩니다. 마지막으로 modifier가 적용됩니다. 아래 형태입니다.
(?:<prefix>(<regexp value>)<suffix>)<modifier>
-
"
(?:
"를 result 끝에 추가합니다. -
정규식 문자열 이스케이프를 part의 prefix에 대해 실행한 결과를 result 끝에 추가합니다.
-
"
(
"를 result 끝에 추가합니다. -
regexp value를 result 끝에 추가합니다.
-
"
)
"를 result 끝에 추가합니다. -
정규식 문자열 이스케이프를 part의 suffix에 대해 실행한 결과를 result 끝에 추가합니다.
-
"
)
"를 result 끝에 추가합니다. -
modifier를 문자열로 변환을 part의 modifier로 실행한 결과를 result 끝에 추가합니다.
-
-
단언: part의 modifier가 "
zero-or-more
" 또는 "one-or-more
"임을 보장합니다. -
단언: part의 prefix가 빈 문자열이 아니거나 part의 suffix가 빈 문자열이 아니어야 합니다.
prefix나 suffix가 있는 반복 부분은 매우 복잡합니다. 최초 prefix와 마지막 suffix를 제외하고 반복 요소 사이에는 포함됩니다. 이를 위해, prefix를 제외한 초기 표현식을 따로 두고, prefix/suffix가 포함된 표현을 반복적으로 추가합니다. zero 값이 허용되면 마지막에 optional modifier를 추가할 수 있습니다. 아래 형태입니다.
(?:<prefix>((?:<regexp value>)(?:<suffix><prefix>(?:<regexp value>))*)<suffix>)?
-
"
(?:
"를 result 끝에 추가합니다. -
정규식 문자열 이스케이프를 part의 prefix에 대해 실행한 결과를 result 끝에 추가합니다.
-
"
((?:
"를 result 끝에 추가합니다. -
regexp value를 result 끝에 추가합니다.
-
"
)(?:
"를 result 끝에 추가합니다. -
정규식 문자열 이스케이프를 part의 suffix에 대해 실행한 결과를 result 끝에 추가합니다.
-
정규식 문자열 이스케이프를 part의 prefix에 대해 실행한 결과를 result 끝에 추가합니다.
-
"
(?:
"를 result 끝에 추가합니다. -
regexp value를 result 끝에 추가합니다.
-
"
))*)
"를 result 끝에 추가합니다. -
정규식 문자열 이스케이프를 part의 suffix에 대해 실행한 결과를 result 끝에 추가합니다.
-
"
)
"를 result 끝에 추가합니다. -
part의 modifier가 "
zero-or-more
"이면, "?
"를 result 끝에 추가합니다.
-
-
"
$
"를 result 끝에 추가합니다. -
(result, name list)를 반환합니다.
-
result를 빈 문자열로 설정합니다.
-
index를 0으로 설정합니다.
-
index가 input의 길이보다 작은 동안:
-
c를 input[index]로 설정합니다.
-
index를 1 증가시킵니다.
-
c가 아래 중 하나면:
- U+002E (
.
); - U+002B (
+
); - U+002A (
*
); - U+003F (
?
); - U+005E (
^
); - U+0024 (
$
); - U+007B (
{
); - U+007D (
}
); - U+0028 (
(
); - U+0029 (
)
); - U+005B (
[
); - U+005D (
]
); - U+007C (
|
); - U+002F (
/
); 또는 - U+005C (
\
),
그 경우 "
\
"를 result 끝에 추가합니다. - U+002E (
-
c를 result 끝에 추가합니다.
-
-
result를 반환합니다.
2.3. 부분 리스트를 패턴 문자열로 변환하기
-
result를 빈 문자열로 설정합니다.
-
index list를 인덱스 얻기를 part list에 대해 실행한 결과로 설정합니다.
-
각 index를 index list에서 반복:
-
part를 part list[index]로 설정합니다.
-
previous part를 index가 0보다 크면 part list[index - 1], 아니면 null로 설정합니다.
-
next part를 index가 index list의 길이 - 1보다 작으면 part list[index + 1], 아니면 null로 설정합니다.
-
part의 type이 "
fixed-text
"이면:-
-
패턴 문자열 이스케이프를 part의 value에 대해 실행한 결과를 result 끝에 추가합니다.
-
-
"
{
"를 result 끝에 추가합니다. -
패턴 문자열 이스케이프를 part의 value에 대해 실행한 결과를 result 끝에 추가합니다.
-
"
}
"를 result 끝에 추가합니다. -
modifier를 문자열로 변환을 part의 modifier로 실행한 결과를 result 끝에 추가합니다.
-
-
custom name을 part의 name[0]이 ASCII digit이 아니면 true, 아니면 false로 설정합니다.
-
needs grouping을 아래 중 하나라도 true면 true, 아니면 false로 설정합니다:
- part의 suffix가 빈 문자열이 아님.
- part의 prefix가 빈 문자열이 아니고 options의 prefix code point가 아님.
-
아래 모두 true이면:
- needs grouping이 false
- custom name이 true
- part의 type이 "
segment-wildcard
" - part의 modifier가 "
none
" - next part가 null이 아님
- next part의 prefix가 빈 문자열임
- next part의 suffix가 빈 문자열임
-
next part의 type이 "
fixed-text
"이면:-
유효한 이름 코드 포인트 여부 판정을 next part의 value의 첫 코드 포인트, 불린값 false로 실행한 결과가 true면 needs grouping을 true로 설정합니다.
-
-
그 외에는:
-
next part의 name[0]이 ASCII digit이면 needs grouping을 true로 설정합니다.
-
-
아래 모두 true이면:
- needs grouping이 false
- part의 prefix가 빈 문자열임
- previous part가 null이 아님
- previous part의 type이 "
fixed-text
" - previous part의 value의 마지막 코드 포인트가 options의 prefix code point임
-
needs grouping이 true면 "
{
"를 result 끝에 추가합니다. -
패턴 문자열 이스케이프를 part의 prefix에 대해 실행한 결과를 result 끝에 추가합니다.
-
custom name이 true면:
-
"
:
"를 result 끝에 추가합니다. -
part의 name을 result 끝에 추가합니다.
-
-
-
"
(
"를 result 끝에 추가합니다. -
part의 value를 result 끝에 추가합니다.
-
"
)
"를 result 끝에 추가합니다.
-
-
그 외 part의 type이 "
segment-wildcard
"이고 custom name이 false이면:-
"
(
"를 result 끝에 추가합니다. -
세그먼트 와일드카드 정규식 생성을 options로 실행한 결과를 result 끝에 추가합니다.
-
"
)
"를 result 끝에 추가합니다.
-
-
그 외 part의 type이 "
full-wildcard
"이면:-
custom name이 false이고 아래 중 하나라도 true이면:
- previous part가 null임
- previous part의 type이 "
fixed-text
" - previous part의 modifier가 "
none
"가 아님 - needs grouping이 true
- part의 prefix가 빈 문자열이 아님
*
"를 result 끝에 추가합니다. -
그 외에는:
-
"
(
"를 result 끝에 추가합니다. -
전체 와일드카드 정규식 값을 result 끝에 추가합니다.
-
"
)
"를 result 끝에 추가합니다.
-
-
-
아래 모두 true이면:
- part의 type이 "
segment-wildcard
" - custom name이 true
- part의 suffix가 빈 문자열이 아님
- 유효한 이름 코드 포인트 여부 판정을 part의 suffix의 첫 코드 포인트, 불린값 false로 실행한 결과가 true
\
)를 result 끝에 추가합니다. - part의 type이 "
-
패턴 문자열 이스케이프를 part의 suffix에 대해 실행한 결과를 result 끝에 추가합니다.
-
needs grouping이 true이면 "
}
"를 result 끝에 추가합니다. -
modifier를 문자열로 변환을 part의 modifier로 실행한 결과를 result 끝에 추가합니다.
-
-
result를 반환합니다.
-
result를 빈 문자열로 설정합니다.
-
index를 0으로 설정합니다.
-
index가 input의 길이보다 작은 동안:
-
c를 input[index]로 설정합니다.
-
index를 1 증가시킵니다.
-
c가 아래 중 하나면:
- U+002B (
+
); - U+002A (
*
); - U+003F (
?
); - U+003A (
:
); - U+007B (
{
); - U+007D (
}
); - U+0028 (
(
); - U+0029 (
)
); - U+005C (
\
)
그 경우 U+005C (
\
)를 result 끝에 추가합니다. - U+002B (
-
c를 result 끝에 추가합니다.
-
-
result를 반환합니다.
-
modifier가 "
zero-or-more
"이면 "*
" 반환. -
modifier가 "
optional
"이면 "?
" 반환. -
modifier가 "
one-or-more
"이면 "+
" 반환. -
빈 문자열 반환.
3. 정규화(Canonicalization)
3.1. 인코딩 콜백(Encoding callbacks)
-
value가 빈 문자열이면 value를 반환합니다.
-
parseResult를 기본 URL 파서를 value + "
://dummy.invalid/
"로 실행한 결과로 설정합니다.참고: state override는 여기서 사용하지 않습니다. 해당 기능은
protocol
setter에만 적합한 제한을 강제하기 때문입니다. 대신, 일반적인 파싱 진입점을 사용하여 프로토콜로 더미 URL을 파싱합니다. -
parseResult가 실패면
TypeError
를 throw합니다. -
parseResult의 scheme을 반환합니다.
-
value가 빈 문자열이면 value를 반환합니다.
-
dummyURL를 더미 URL 생성으로 설정합니다.
-
parseResult를 기본 URL 파서를 value로 실행하되 dummyURL을 url로, hostname state를 state override로 설정합니다.
-
parseResult가 실패면
TypeError
를 throw합니다.
-
result를 빈 문자열로 설정합니다.
-
각 code point를 value를 리스트로 해석한 코드 포인트에서 반복합니다:
-
아래 모두 true이면:
- code point가 ASCII 16진수가 아님;
- code point가 U+005B (
[
)가 아님; - code point가 U+005D (
]
)가 아님; - code point가 U+003A (
:
)가 아님,
그 경우
TypeError
를 throw합니다. -
ASCII 소문자화를 code point에 대해 실행한 결과를 result 끝에 추가합니다.
-
-
result를 반환합니다.
-
portValue가 빈 문자열이면 portValue를 반환합니다.
-
dummyURL를 더미 URL 생성으로 설정합니다.
-
protocolValue가 주어졌으면 dummyURL의 scheme을 protocolValue로 설정합니다.
참고: URL record의 scheme을 설정하는 것은 기본 URL 파서가 기본 포트값을 인식 및 정규화하기 위함입니다.
-
parseResult를 기본 URL 파서를 portValue로 실행하되 dummyURL을 url로, port state를 state override로 설정합니다.
-
parseResult가 실패면
TypeError
를 throw합니다.
-
value가 빈 문자열이면 value를 반환합니다.
-
leading slash를 value의 첫 코드 포인트가 U+002F(
/
)이면 true, 아니면 false로 설정합니다. -
modified value를 leading slash가 false면 "
/-
", 아니면 빈 문자열로 설정합니다.URL 파서는 canonicalized pathname에 자동으로 선행 슬래시를 붙입니다. 하지만 이 알고리즘은 pathname의 부분에 대해 호출되므로, 슬래시 붙임을 막기 위해 직접 슬래시를 넣고, 점(.)이 앞에 올 때 "/." 패턴으로 오해하지 않게 추가 문자도 삽입합니다. 나중에 결과에서 이들 문자를 제거합니다.
구현체는 성능 상 이 알고리즘에서 슬래시 삽입/제거 대신 파싱 코드에서 슬래시 붙임을 비활성화해도 됩니다.
-
value를 modified value 끝에 추가합니다.
-
dummyURL를 더미 URL 생성으로 설정합니다.
-
기본 URL 파서를 modified value로 실행하되 dummyURL을 url로, path start state를 state override로 설정합니다.
-
result를 URL 경로 serialize를 dummyURL에 대해 실행한 결과로 설정합니다.
-
leading slash가 false면 result를 2번째부터 끝까지 코드 포인트 서브스트링으로 설정합니다.
-
result를 반환합니다.
-
value가 빈 문자열이면 value를 반환합니다.
-
dummyURL를 더미 URL 생성으로 설정합니다.
-
dummyURL의 path를 빈 문자열로 설정합니다.
-
parseResult를 URL 파싱을 value로 실행하되 dummyURL을 url로, opaque path state를 state override로 설정합니다.
-
parseResult가 실패면
TypeError
를 throw합니다. -
URL 경로 serialize를 dummyURL에 대해 실행한 결과를 반환합니다.
-
value가 빈 문자열이면 value를 반환합니다.
-
dummyURL를 더미 URL 생성으로 설정합니다.
-
dummyURL의 query를 빈 문자열로 설정합니다.
-
기본 URL 파서를 value로 실행하되 dummyURL을 url로, query state를 state override로 설정합니다.
-
dummyURL의 query를 반환합니다.
-
value가 빈 문자열이면 value를 반환합니다.
-
dummyURL를 더미 URL 생성으로 설정합니다.
-
dummyURL의 fragment를 빈 문자열로 설정합니다.
-
기본 URL 파서를 value로 실행하되 dummyURL을 url로, fragment state를 state override로 설정합니다.
-
dummyURL의 fragment를 반환합니다.
3.2.
URLPatternInit
처리
URLPatternInit
init, 문자열 type, 문자열 또는 null protocol, 문자열 또는 null
username, 문자열 또는 null password, 문자열 또는 null hostname, 문자열 또는
null port, 문자열 또는 null pathname, 문자열 또는 null search, 문자열 또는 null
hash에 대해 실행하려면:
-
result를 새
URLPatternInit
으로 생성합니다. -
protocol이 null이 아니면 result["protocol"]에 protocol을 설정합니다.
-
username이 null이 아니면 result["username"]에 username을 설정합니다.
-
password이 null이 아니면 result["password"]에 password을 설정합니다.
-
hostname이 null이 아니면 result["hostname"]에 hostname을 설정합니다.
-
port가 null이 아니면 result["port"]에 port를 설정합니다.
-
pathname이 null이 아니면 result["pathname"]에 pathname을 설정합니다.
-
search가 null이 아니면 result["search"]에 search를 설정합니다.
-
hash가 null이 아니면 result["hash"]에 hash를 설정합니다.
-
baseURL을 null로 설정합니다.
-
init["baseURL"]이 존재하면:
base URL은 추가 컨텍스트를 제공할 수 있지만, 각 컴포넌트에서 init이 base URL보다 구체적인 컴포넌트를 포함하면 상속되지 않습니다.컴포넌트가 더 구체적이라는 것은 아래 두 리스트에서 더 뒤에 나타나면 더 구체적입니다(이는 URL 문법 순서와 거의 유사합니다):
-
protocol, hostname, port, pathname, search, hash
-
protocol, hostname, port, username, password
username과 password는
URLPattern
생성 시 base URL에서 상속되지 않습니다. (단,test()
또는exec()
호출 시 인자로 전달된 URL 파싱에는 상속됩니다.)-
baseURL을 기본 URL 파서로 init["baseURL"]에 실행한 결과로 설정합니다.
-
baseURL이 실패면
TypeError
를 throw합니다. -
init["protocol"]이 존재하지 않으면 base URL 문자열 처리를 baseURL의 scheme, type으로 실행한 결과를 result["protocol"]에 설정합니다.
-
type이 "
pattern
"이 아니고 init이 "protocol", "hostname", "port", "username" 중 아무 것도 포함하지 않으면 base URL 문자열 처리를 baseURL의 username, type으로 result["username"]에 설정합니다. -
type이 "
pattern
"이 아니고 init이 "protocol", "hostname", "port", "username", "password" 중 아무 것도 포함하지 않으면 base URL 문자열 처리를 baseURL의 password, type으로 result["password"]에 설정합니다. -
init이 "protocol"과 "hostname" 모두 포함하지 않으면:
-
baseHost를 빈 문자열로 설정합니다.
-
base URL 문자열 처리를 baseHost, type으로 실행한 결과를 result["hostname"]에 설정합니다.
-
-
init이 "protocol", "hostname", "port" 모두 포함하지 않으면:
-
init이 "protocol", "hostname", "port", "pathname" 모두 포함하지 않으면 base URL 문자열 처리를 URL 경로 serialize baseURL, type으로 실행한 결과를 result["pathname"]에 설정합니다.
-
init이 "protocol", "hostname", "port", "pathname", "search" 모두 포함하지 않으면:
-
baseQuery를 baseURL의 query로 설정합니다.
-
baseQuery가 null이면 빈 문자열로 설정합니다.
-
base URL 문자열 처리를 baseQuery, type으로 실행한 결과를 result["search"]에 설정합니다.
-
-
init이 "protocol", "hostname", "port", "pathname", "search", "hash" 모두 포함하지 않으면:
-
baseFragment를 baseURL의 fragment로 설정합니다.
-
baseFragment가 null이면 빈 문자열로 설정합니다.
-
base URL 문자열 처리를 baseFragment, type으로 실행한 결과를 result["hash"]에 설정합니다.
-
-
-
init["protocol"]이 존재하면 process protocol for init를 init["protocol"], type으로 실행한 결과를 result["protocol"]에 설정합니다.
-
init["username"]이 존재하면 process username for init를 init["username"], type으로 실행한 결과를 result["username"]에 설정합니다.
-
init["password"]이 존재하면 process password for init를 init["password"], type으로 실행한 결과를 result["password"]에 설정합니다.
-
init["hostname"]이 존재하면 process hostname for init를 init["hostname"], type으로 실행한 결과를 result["hostname"]에 설정합니다.
-
resultProtocolString을 result["protocol"]이 존재하면 해당 값, 아니면 빈 문자열로 설정합니다.
-
init["port"]이 존재하면 process port for init를 init["port"], resultProtocolString, type으로 실행한 결과를 result["port"]에 설정합니다.
-
init["pathname"]이 존재하면:
-
result["pathname"]에 init["pathname"]를 설정합니다.
-
아래 모두 true라면:
- baseURL이 null이 아님;
- baseURL에 opaque path가 없음;
- is an absolute pathname을 result["pathname"], type으로 실행한 결과가 false,
그 경우:
-
baseURLPath를 base URL 문자열 처리를 URL 경로 serialize baseURL, type으로 실행한 결과로 설정합니다.
-
slash index를 baseURLPath에서 마지막 U+002F(
/
) 코드 포인트의 인덱스로(코드 포인트 시퀀스 기준), 없으면 null로 설정합니다. -
slash index가 null이 아니면:
-
new pathname을 코드 포인트 서브스트링 0~(slash index+1) 까지 baseURLPath에서 추출합니다.
-
result["pathname"]를 new pathname 뒤에 추가합니다.
-
result["pathname"]에 new pathname을 설정합니다.
-
-
result["pathname"]에 process pathname for init을 result["pathname"], resultProtocolString, type으로 실행한 결과를 설정합니다.
-
-
init["search"]이 존재하면 process search for init를 init["search"], type으로 실행한 결과를 result["search"]에 설정합니다.
-
init["hash"]가 존재하면 process hash for init를 init["hash"], type으로 실행한 결과를 result["hash"]에 설정합니다.
-
result를 반환합니다.
-
단언: input이 null이 아님을 보장합니다.
-
type이 "
pattern
"이 아니면 input을 반환합니다. -
패턴 문자열 이스케이프를 input에 대해 실행한 결과를 반환합니다.
-
input이 빈 문자열이면 false 반환.
-
input[0]이 U+002F(
/
)이면 true 반환. -
type이 "
url
"이면 false 반환. -
input의 코드 포인트 길이가 2 미만이면 false 반환.
-
input[0]이 U+005C(
\
)이고 input[1]이 U+002F(/
)이면 true 반환. -
input[0]이 U+007B(
{
)이고 input[1]이 U+002F(/
)이면 true 반환. -
false 반환.
-
strippedValue를 value에서 마지막 U+003A(
:
) 하나를 제거한 값으로 설정합니다. -
type이 "
pattern
"이면 strippedValue를 반환합니다. -
프로토콜 정규화를 strippedValue에 대해 실행한 결과를 반환합니다.
-
type이 "
pattern
"이면 value를 반환합니다. -
사용자명 정규화를 value에 대해 실행한 결과를 반환합니다.
-
type이 "
pattern
"이면 value를 반환합니다. -
비밀번호 정규화를 value에 대해 실행한 결과를 반환합니다.
-
type이 "
pattern
"이면 value를 반환합니다. -
호스트명 정규화를 value에 대해 실행한 결과를 반환합니다.
-
type이 "
pattern
"이면 portValue를 반환합니다. -
포트 정규화를 portValue, protocolValue에 대해 실행한 결과를 반환합니다.
-
type이 "
pattern
"이면 pathnameValue를 반환합니다. -
protocolValue가 특수 scheme이거나 빈 문자열이면, 경로명 정규화를 pathnameValue에 대해 실행한 결과를 반환합니다.
protocolValue가 빈 문자열이면 생성자 딕셔너리에서 protocol이 제공되지 않은 것과 같습니다. 일반적으로 빈 문자열 값에 특수 처리를 하지 않지만, 이 경우에는 특수 scheme으로 간주하여 가장 일반적인 경로명 정규화로 처리합니다.
-
불투명 경로명 정규화를 pathnameValue에 대해 실행한 결과를 반환합니다.
-
strippedValue를 value에서 첫 U+003F(
?
)를 하나 제거한 값으로 설정합니다. -
type이 "
pattern
"이면 strippedValue를 반환합니다. -
검색 정규화를 strippedValue에 대해 실행한 결과를 반환합니다.
-
strippedValue를 value에서 첫 U+0023(
#
)를 하나 제거한 값으로 설정합니다. -
type이 "
pattern
"이면 strippedValue를 반환합니다. -
해시 정규화를 strippedValue에 대해 실행한 결과를 반환합니다.
4. 다른 명세에서 URL 패턴 사용하기
웹 플랫폼의 일관성을 높이기 위해, 이 명세와 통합되는 다른 문서들은 특별한 사유가 없는 한 아래 지침을 따라야 합니다.
-
축약형 허용. 대부분의 저작자 패턴은 단순합니다. 따라서 API는 흔한 케이스에 대해 축약형을 받아들이고 저작자가 완전한
URLPattern
객체로 변환하는 추가 작업을 하지 않도록 해야 합니다. -
기준(base) URL 준수. 일반적으로 URL은 환경의 기준 URL(대부분 문서 base URL)을 기준으로 파싱됩니다. URL 패턴도 이를 따라야 합니다. 단,
URLPattern
생성자는 개념 자체를 직접 노출하므로 예외입니다. 이는 URL 생성자가 플랫폼 전체와 달리 기준 URL을 따르지 않는 것과 유사합니다. -
정규표현식 그룹 명확히. 일부 API는 정규표현식 그룹이 없는 URL 패턴만 허용하는 것이 유익할 수 있습니다. 예를 들어, 사용자 에이전트가 저작자 스크립트와 다른 쓰레드/프로세스에서 이를 구현할 수 있고, 보안/성능상의 이유로 JavaScript 엔진이 별도로 실행되지 않을 수 있기 때문입니다. 이 경우 명확히 문서화(참조: 정규표현식 그룹 보유 여부)하고, 가능한 빨리 오류(예: 예외 throw)를 보고해야 합니다. 이 제약이 미래에 해제될 수 있으므로, 기능 탐지(feature detection)가 가능해야 합니다. 편의상 URL 패턴의 부분집합을 만들기 전에 이 명세의 편집자와 상의하세요.
-
어떤 URL이 매칭되는지 명확히. 예를 들어, fetch 알고리즘은 fragment가 없는 URL에 대해 동작하는 경우가 많습니다. 그렇다면 명세에 이를 명확히 나타내고, 매칭이 불가능한 패턴(예: non-empty fragment 요구) 사용 시 개발자 경고를 주는 것도 권장할 수 있습니다.
4.1. JavaScript API와의 통합
typedef (USVString or URLPatternInit or URLPattern );
URLPatternCompatible
JavaScript API는 다음 모두를 받아야 합니다:
-
URLPattern
객체 -
패턴을 구성하는데 필요한 컴포넌트를 명시하는 딕셔너리 형태의 객체
-
문자열(생성자 문자열 문법 사용)
이를 위해 명세는 URLPatternCompatible
타입을 operation 또는 dictionary member의 인자로 받아, 아래 알고리즘을 사용해 처리해야 합니다. 적절한 environment settings object의 API
base URL을 사용하세요.
URLPattern
객체를 Web IDL 값에서 생성을 URLPatternCompatible
input, URL baseURL, realm realm에 대해 다음을 수행:
-
input의 특정 타입이
URLPattern
이면:-
input을 반환합니다.
-
-
그 외:
-
pattern을 새로운
URLPattern
(realm 지정)으로 생성합니다. -
pattern의 연결된 URL 패턴을 Web IDL 값에서 URL 패턴 생성을 input, baseURL로 실행한 결과로 설정합니다.
-
pattern을 반환합니다.
-
URLPatternCompatible
input, URL baseURL에 대해 다음을 수행:
-
input의 특정 타입이
URLPattern
이면:-
input의 연결된 URL 패턴을 반환합니다.
-
-
그 외, input의 특정 타입이
URLPatternInit
이면: -
그 외:
이로써 저작자는 대부분의 패턴을 간결하게 명시할 수 있고, 생성자를 통해 드물게 필요한 옵션에 접근할 수 있습니다. base URL의 암묵적 사용은 HTML의 URL 파싱 알고리즘과 유사하며 일관성을 유지합니다. [HTML]
4.2. JSON 데이터 형식과의 통합
URL 패턴을 포함하는 JSON 데이터 형식은 JavaScript API 동작과 동일하게 다음을 모두 허용해야 합니다:
-
패턴을 구성하는데 필요한 컴포넌트를 명시하는 객체
-
문자열(생성자 문자열 문법 사용)
명세에 Infra 값이 있다면(예: JSON 문자열을 Infra 값으로 파싱을 이용한 후), 아래 알고리즘을 사용하여 적절한 기준 baseURL(기본적으로 JSON 리소스의 URL)을 사용하세요. [INFRA]
-
serializedBaseURL을 baseURL의 serialize한 값으로 설정합니다.
-
rawPattern이 문자열이면:
-
그 외, rawPattern이 map이면:
-
init을 «[ "baseURL" → serializedBaseURL ]»로 설정(즉,
URLPatternInit
타입의 딕셔너리). -
각 key → value를 rawPattern에서 반복:
-
key가
URLPatternInit
의 식별자가 아니거나, value가 문자열이 아니거나, 해당 멤버 타입이USVString
이 아니라면 null 반환.향후URLPatternInit
가 다른 타입 멤버를 가지면 업데이트 필요.향후 덜 엄격한 모드를 지원할 수도 있습니다. -
init[key]에 value를 설정합니다.
-
-
URL 패턴 생성을 init, null, 빈 map으로 실행한 결과를 반환합니다.
향후 옵션이 필요하다면 여기서 비어있지 않은 옵션을 추가할 수 있습니다.
-
-
그 외에는 null 반환.
명세는 URLPatternOptions
에
대한 옵션, baseURL 재정의 등도 허용할 수 있습니다. JSON에서는 URLPattern
객체를 직접 만들 수 없으므로, 예를 들어 Speculation Rules는 "relative_to
" 키로 문서 base URL을 JSON 리소스의 URL 대신 사용할 수 있습니다. [SPECULATION-RULES]
4.3. HTTP 헤더 필드와의 통합
URL 패턴을 포함하는 HTTP 헤더는 생성자 문자열 문법의 문자열을 받아야 하며, 이는 structured field의 일부로 처리될 수 있습니다. [RFC9651].
HTTP 헤더 명세는 URL 패턴 자체(예: 매칭 알고리즘 사용)를 대상으로 해야
하며, URLPattern
객체(즉, JavaScript realm 필요)에는 의존하지 않아야 합니다.
감사의 말씀
편집자들은 아래 분들께 감사의 뜻을 전합니다. Alex Russell, Anne van Kesteren, Asa Kusuma, Blake Embrey, Cyrus Kasaaian, Daniel Murphy, Darwin Huang, Devlin Cronin, Domenic Denicola, Dominick Ng, Jake Archibald, Jeffrey Posnick, Jeremy Roman, Jimmy Shen, Joe Gregorio, Joshua Bell, Kenichi Ishibashi, Kenji Baheux, Kenneth Rohde Christiansen, Kingsley Ngan, Kinuko Yasuda, L. David Baron, Luca Casonato, Łukasz Anforowicz, Makoto Shimazu, Marijn Kruisselbrink, Matt Falkenhagen, Matt Giuca, Michael Landry, R. Samuel Klatchko, Rajesh Jagannathan, Ralph Chelala, Sangwhan Moon, Sayan Pal, Victor Costan, Yoshisato Yanagisawa, Youenn Fablet 이 명세에 기여해주신 모든 분들께 감사드립니다.
특별히 Blake Embrey와 pillarjs/path-to-regexp 기여자들께 감사의 말씀을 드립니다. 많은 사람들이 유용하게 사용한 훌륭한 오픈소스 라이브러리를 만들어주셨습니다.
또한 Kenneth Rohde Christiansen의 polyfill 작업에도 특별히 감사드립니다. 그는 변화하는 URLPattern
API에 맞춰 광범위하게 수정 작업을 해주셨습니다.
이 표준은 다음 저자에 의해 작성되었습니다. Ben Kelly (Google, wanderview@chromium.org), Jeremy Roman (Google, jbroman@chromium.org), 그리고 宍戸俊哉 (Shunya Shishido, Google, sisidovski@chromium.org).
지적 재산권(Intellectual property rights)
Copyright © WHATWG (Apple, Google, Mozilla, Microsoft). 이 작업은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스 하에 라이선스됩니다. 이 표준의 일부가 소스 코드에 통합되는 경우, 해당 부분은 BSD 3-Clause 라이선스에 따라 소스 코드에서 라이선스됩니다.
이 문서는 현행 표준입니다. 특허 심사 버전에 관심이 있으신 분은 현행 표준 심사 초안을 참고하시기 바랍니다.