Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F96586964
mailto.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sat, Dec 28, 14:33
Size
7 KB
Mime Type
text/x-java
Expires
Mon, Dec 30, 14:33 (2 d)
Engine
blob
Format
Raw Data
Handle
23177481
Attached To
rOACCT Open Access Compliance Check Tool (OACCT)
mailto.js
View Options
import
{
pctEncChar
,
pctDecChars
,
unescapeComponent
}
from
"../uri"
;
import
punycode
from
"punycode"
;
import
{
merge
,
subexp
,
toUpperCase
,
toArray
}
from
"../util"
;
const
O
=
{};
const
isIRI
=
true
;
//RFC 3986
const
UNRESERVED$$
=
"[A-Za-z0-9\\-\\.\\_\\~"
+
(
isIRI
?
"\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF"
:
""
)
+
"]"
;
const
HEXDIG$$
=
"[0-9A-Fa-f]"
;
//case-insensitive
const
PCT_ENCODED$
=
subexp
(
subexp
(
"%[EFef]"
+
HEXDIG$$
+
"%"
+
HEXDIG$$
+
HEXDIG$$
+
"%"
+
HEXDIG$$
+
HEXDIG$$
)
+
"|"
+
subexp
(
"%[89A-Fa-f]"
+
HEXDIG$$
+
"%"
+
HEXDIG$$
+
HEXDIG$$
)
+
"|"
+
subexp
(
"%"
+
HEXDIG$$
+
HEXDIG$$
));
//expanded
//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =
//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]"; //(%d1-8 / %d11-12 / %d14-31 / %d127)
//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext
//const VCHAR$$ = "[\\x21-\\x7E]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext
//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+");
//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$);
//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"');
const
ATEXT$$
=
"[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]"
;
const
QTEXT$$
=
"[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]"
;
const
VCHAR$$
=
merge
(
QTEXT$$
,
"[\\\"\\\\]"
);
const
DOT_ATOM_TEXT$
=
subexp
(
ATEXT$$
+
"+"
+
subexp
(
"\\."
+
ATEXT$$
+
"+"
)
+
"*"
);
const
QUOTED_PAIR$
=
subexp
(
"\\\\"
+
VCHAR$$
);
const
QCONTENT$
=
subexp
(
QTEXT$$
+
"|"
+
QUOTED_PAIR$
);
const
QUOTED_STRING$
=
subexp
(
'\\"'
+
QCONTENT$
+
"*"
+
'\\"'
);
//RFC 6068
const
DTEXT_NO_OBS$$
=
"[\\x21-\\x5A\\x5E-\\x7E]"
;
//%d33-90 / %d94-126
const
SOME_DELIMS$$
=
"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"
;
const
QCHAR$
=
subexp
(
UNRESERVED$$
+
"|"
+
PCT_ENCODED$
+
"|"
+
SOME_DELIMS$$
);
const
DOMAIN$
=
subexp
(
DOT_ATOM_TEXT$
+
"|"
+
"\\["
+
DTEXT_NO_OBS$$
+
"*"
+
"\\]"
);
const
LOCAL_PART$
=
subexp
(
DOT_ATOM_TEXT$
+
"|"
+
QUOTED_STRING$
);
const
ADDR_SPEC$
=
subexp
(
LOCAL_PART$
+
"\\@"
+
DOMAIN$
);
const
TO$
=
subexp
(
ADDR_SPEC$
+
subexp
(
"\\,"
+
ADDR_SPEC$
)
+
"*"
);
const
HFNAME$
=
subexp
(
QCHAR$
+
"*"
);
const
HFVALUE$
=
HFNAME$
;
const
HFIELD$
=
subexp
(
HFNAME$
+
"\\="
+
HFVALUE$
);
const
HFIELDS2$
=
subexp
(
HFIELD$
+
subexp
(
"\\&"
+
HFIELD$
)
+
"*"
);
const
HFIELDS$
=
subexp
(
"\\?"
+
HFIELDS2$
);
const
MAILTO_URI
=
new
RegExp
(
"^mailto\\:"
+
TO$
+
"?"
+
HFIELDS$
+
"?$"
);
const
UNRESERVED
=
new
RegExp
(
UNRESERVED$$
,
"g"
);
const
PCT_ENCODED
=
new
RegExp
(
PCT_ENCODED$
,
"g"
);
const
NOT_LOCAL_PART
=
new
RegExp
(
merge
(
"[^]"
,
ATEXT$$
,
"[\\.]"
,
'[\\"]'
,
VCHAR$$
),
"g"
);
const
NOT_DOMAIN
=
new
RegExp
(
merge
(
"[^]"
,
ATEXT$$
,
"[\\.]"
,
"[\\[]"
,
DTEXT_NO_OBS$$
,
"[\\]]"
),
"g"
);
const
NOT_HFNAME
=
new
RegExp
(
merge
(
"[^]"
,
UNRESERVED$$
,
SOME_DELIMS$$
),
"g"
);
const
NOT_HFVALUE
=
NOT_HFNAME
;
const
TO
=
new
RegExp
(
"^"
+
TO$
+
"$"
);
const
HFIELDS
=
new
RegExp
(
"^"
+
HFIELDS2$
+
"$"
);
function
decodeUnreserved
(
str
)
{
const
decStr
=
pctDecChars
(
str
);
return
(
!
decStr
.
match
(
UNRESERVED
)
?
str
:
decStr
);
}
const
handler
=
{
scheme
:
"mailto"
,
parse
:
function
(
components
,
options
)
{
const
mailtoComponents
=
components
;
const
to
=
mailtoComponents
.
to
=
(
mailtoComponents
.
path
?
mailtoComponents
.
path
.
split
(
","
)
:
[]);
mailtoComponents
.
path
=
undefined
;
if
(
mailtoComponents
.
query
)
{
let
unknownHeaders
=
false
;
const
headers
=
{};
const
hfields
=
mailtoComponents
.
query
.
split
(
"&"
);
for
(
let
x
=
0
,
xl
=
hfields
.
length
;
x
<
xl
;
++
x
)
{
const
hfield
=
hfields
[
x
].
split
(
"="
);
switch
(
hfield
[
0
])
{
case
"to"
:
const
toAddrs
=
hfield
[
1
].
split
(
","
);
for
(
let
x
=
0
,
xl
=
toAddrs
.
length
;
x
<
xl
;
++
x
)
{
to
.
push
(
toAddrs
[
x
]);
}
break
;
case
"subject"
:
mailtoComponents
.
subject
=
unescapeComponent
(
hfield
[
1
],
options
);
break
;
case
"body"
:
mailtoComponents
.
body
=
unescapeComponent
(
hfield
[
1
],
options
);
break
;
default
:
unknownHeaders
=
true
;
headers
[
unescapeComponent
(
hfield
[
0
],
options
)]
=
unescapeComponent
(
hfield
[
1
],
options
);
break
;
}
}
if
(
unknownHeaders
)
mailtoComponents
.
headers
=
headers
;
}
mailtoComponents
.
query
=
undefined
;
for
(
let
x
=
0
,
xl
=
to
.
length
;
x
<
xl
;
++
x
)
{
const
addr
=
to
[
x
].
split
(
"@"
);
addr
[
0
]
=
unescapeComponent
(
addr
[
0
]);
if
(
!
options
.
unicodeSupport
)
{
//convert Unicode IDN -> ASCII IDN
try
{
addr
[
1
]
=
punycode
.
toASCII
(
unescapeComponent
(
addr
[
1
],
options
).
toLowerCase
());
}
catch
(
e
)
{
mailtoComponents
.
error
=
mailtoComponents
.
error
||
"Email address's domain name can not be converted to ASCII via punycode: "
+
e
;
}
}
else
{
addr
[
1
]
=
unescapeComponent
(
addr
[
1
],
options
).
toLowerCase
();
}
to
[
x
]
=
addr
.
join
(
"@"
);
}
return
mailtoComponents
;
},
serialize
:
function
(
mailtoComponents
,
options
)
{
const
components
=
mailtoComponents
;
const
to
=
toArray
(
mailtoComponents
.
to
);
if
(
to
)
{
for
(
let
x
=
0
,
xl
=
to
.
length
;
x
<
xl
;
++
x
)
{
const
toAddr
=
String
(
to
[
x
]);
const
atIdx
=
toAddr
.
lastIndexOf
(
"@"
);
const
localPart
=
(
toAddr
.
slice
(
0
,
atIdx
)).
replace
(
PCT_ENCODED
,
decodeUnreserved
).
replace
(
PCT_ENCODED
,
toUpperCase
).
replace
(
NOT_LOCAL_PART
,
pctEncChar
);
let
domain
=
toAddr
.
slice
(
atIdx
+
1
);
//convert IDN via punycode
try
{
domain
=
(
!
options
.
iri
?
punycode
.
toASCII
(
unescapeComponent
(
domain
,
options
).
toLowerCase
())
:
punycode
.
toUnicode
(
domain
));
}
catch
(
e
)
{
components
.
error
=
components
.
error
||
"Email address's domain name can not be converted to "
+
(
!
options
.
iri
?
"ASCII"
:
"Unicode"
)
+
" via punycode: "
+
e
;
}
to
[
x
]
=
localPart
+
"@"
+
domain
;
}
components
.
path
=
to
.
join
(
","
);
}
const
headers
=
mailtoComponents
.
headers
=
mailtoComponents
.
headers
||
{};
if
(
mailtoComponents
.
subject
)
headers
[
"subject"
]
=
mailtoComponents
.
subject
;
if
(
mailtoComponents
.
body
)
headers
[
"body"
]
=
mailtoComponents
.
body
;
const
fields
=
[];
for
(
const
name
in
headers
)
{
if
(
headers
[
name
]
!==
O
[
name
])
{
fields
.
push
(
name
.
replace
(
PCT_ENCODED
,
decodeUnreserved
).
replace
(
PCT_ENCODED
,
toUpperCase
).
replace
(
NOT_HFNAME
,
pctEncChar
)
+
"="
+
headers
[
name
].
replace
(
PCT_ENCODED
,
decodeUnreserved
).
replace
(
PCT_ENCODED
,
toUpperCase
).
replace
(
NOT_HFVALUE
,
pctEncChar
));
}
}
if
(
fields
.
length
)
{
components
.
query
=
fields
.
join
(
"&"
);
}
return
components
;
}
};
export
default
handler
;
//# sourceMappingURL=mailto.js.map
Event Timeline
Log In to Comment