Skip to content

Commit 3961e7b

Browse files
authored
Add support for fullwidth parentheses (#461)
1 parent a126aa0 commit 3961e7b

File tree

4 files changed

+28
-1
lines changed

4 files changed

+28
-1
lines changed

packages/linkifyjs/src/parser.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export function init({ groups }) {
5555
tk.CLOSEBRACE,
5656
tk.CLOSEBRACKET,
5757
tk.CLOSEPAREN,
58+
tk.FULLWIDTH_CLOSEPAREN,
5859
tk.COLON,
5960
tk.COMMA,
6061
tk.DOT,
@@ -63,6 +64,7 @@ export function init({ groups }) {
6364
tk.OPENBRACE,
6465
tk.OPENBRACKET,
6566
tk.OPENPAREN,
67+
tk.FULLWIDTH_OPENPAREN,
6668
tk.QUERY,
6769
tk.QUOTE,
6870
tk.SEMI
@@ -209,17 +211,20 @@ export function init({ groups }) {
209211
const UrlOpenbracket = tt(Url, tk.OPENBRACKET); // URL followed by [
210212
const UrlOpenanglebracket = tt(Url, tk.OPENANGLEBRACKET); // URL followed by <
211213
const UrlOpenparen = tt(Url, tk.OPENPAREN); // URL followed by (
214+
const UrlFullwidthOpenparen = tt(Url, tk.FULLWIDTH_OPENPAREN); // URL followed by (
212215

213216
tt(UrlNonaccept, tk.OPENBRACE, UrlOpenbrace);
214217
tt(UrlNonaccept, tk.OPENBRACKET, UrlOpenbracket);
215218
tt(UrlNonaccept, tk.OPENANGLEBRACKET, UrlOpenanglebracket);
216219
tt(UrlNonaccept, tk.OPENPAREN, UrlOpenparen);
220+
tt(UrlNonaccept, tk.FULLWIDTH_OPENPAREN, UrlFullwidthOpenparen);
217221

218222
// Closing bracket component. This character WILL be included in the URL
219223
tt(UrlOpenbrace, tk.CLOSEBRACE, Url);
220224
tt(UrlOpenbracket, tk.CLOSEBRACKET, Url);
221225
tt(UrlOpenanglebracket, tk.CLOSEANGLEBRACKET, Url);
222226
tt(UrlOpenparen, tk.CLOSEPAREN, Url);
227+
tt(UrlFullwidthOpenparen, tk.FULLWIDTH_CLOSEPAREN, Url);
223228
tt(UrlOpenbrace, tk.CLOSEBRACE, Url);
224229

225230
// URL that beings with an opening bracket, followed by a symbols.
@@ -229,48 +234,58 @@ export function init({ groups }) {
229234
const UrlOpenbracketQ = makeState(mtk.Url); // URL followed by [ and some symbols that the URL can end it
230235
const UrlOpenanglebracketQ = makeState(mtk.Url); // URL followed by < and some symbols that the URL can end it
231236
const UrlOpenparenQ = makeState(mtk.Url); // URL followed by ( and some symbols that the URL can end it
237+
const UrlFullwidthOpenparenQ = makeState(mtk.Url); // URL followed by ( and some symbols that the URL can end it
232238
ta(UrlOpenbrace, qsAccepting, UrlOpenbraceQ);
233239
ta(UrlOpenbracket, qsAccepting, UrlOpenbracketQ);
234240
ta(UrlOpenanglebracket, qsAccepting, UrlOpenanglebracketQ);
235241
ta(UrlOpenparen, qsAccepting, UrlOpenparenQ);
242+
ta(UrlFullwidthOpenparen, qsAccepting, UrlFullwidthOpenparenQ);
236243

237244
const UrlOpenbraceSyms = makeState(); // UrlOpenbrace followed by some symbols it cannot end it
238245
const UrlOpenbracketSyms = makeState(); // UrlOpenbracketQ followed by some symbols it cannot end it
239246
const UrlOpenanglebracketSyms = makeState(); // UrlOpenanglebracketQ followed by some symbols it cannot end it
240247
const UrlOpenparenSyms = makeState(); // UrlOpenparenQ followed by some symbols it cannot end it
248+
const UrlFullwidthOpenparenSyms = makeState(); // UrlFullwidthOpenparenQ followed by some symbols it cannot end it
241249
ta(UrlOpenbrace, qsNonAccepting);
242250
ta(UrlOpenbracket, qsNonAccepting);
243251
ta(UrlOpenanglebracket, qsNonAccepting);
244252
ta(UrlOpenparen, qsNonAccepting);
253+
ta(UrlFullwidthOpenparen, qsNonAccepting);
245254

246255
// URL that begins with an opening bracket, followed by some symbols
247256
ta(UrlOpenbraceQ, qsAccepting, UrlOpenbraceQ);
248257
ta(UrlOpenbracketQ, qsAccepting, UrlOpenbracketQ);
249258
ta(UrlOpenanglebracketQ, qsAccepting, UrlOpenanglebracketQ);
250259
ta(UrlOpenparenQ, qsAccepting, UrlOpenparenQ);
260+
ta(UrlFullwidthOpenparenQ, qsAccepting, UrlFullwidthOpenparenQ);
251261
ta(UrlOpenbraceQ, qsNonAccepting, UrlOpenbraceQ);
252262
ta(UrlOpenbracketQ, qsNonAccepting, UrlOpenbracketQ);
253263
ta(UrlOpenanglebracketQ, qsNonAccepting, UrlOpenanglebracketQ);
254264
ta(UrlOpenparenQ, qsNonAccepting, UrlOpenparenQ);
265+
ta(UrlFullwidthOpenparenQ, qsAccepting, UrlFullwidthOpenparenQ);
255266

256267
ta(UrlOpenbraceSyms, qsAccepting, UrlOpenbraceSyms);
257268
ta(UrlOpenbracketSyms, qsAccepting, UrlOpenbracketQ);
258269
ta(UrlOpenanglebracketSyms, qsAccepting, UrlOpenanglebracketQ);
259270
ta(UrlOpenparenSyms, qsAccepting, UrlOpenparenQ);
271+
ta(UrlFullwidthOpenparenSyms, qsAccepting, UrlFullwidthOpenparenQ);
260272
ta(UrlOpenbraceSyms, qsNonAccepting, UrlOpenbraceSyms);
261273
ta(UrlOpenbracketSyms, qsNonAccepting, UrlOpenbracketSyms);
262274
ta(UrlOpenanglebracketSyms, qsNonAccepting, UrlOpenanglebracketSyms);
263275
ta(UrlOpenparenSyms, qsNonAccepting, UrlOpenparenSyms);
276+
ta(UrlFullwidthOpenparenSyms, qsAccepting, UrlFullwidthOpenparenSyms);
264277

265278
// Close brace/bracket to become regular URL
266279
tt(UrlOpenbracketQ, tk.CLOSEBRACKET, Url);
267280
tt(UrlOpenanglebracketQ, tk.CLOSEANGLEBRACKET, Url);
268281
tt(UrlOpenparenQ, tk.CLOSEPAREN, Url);
282+
tt(UrlFullwidthOpenparenQ, tk.FULLWIDTH_CLOSEPAREN, Url);
269283
tt(UrlOpenbraceQ, tk.CLOSEBRACE, Url);
270284
tt(UrlOpenbracketSyms, tk.CLOSEBRACKET, Url);
271285
tt(UrlOpenanglebracketSyms, tk.CLOSEANGLEBRACKET, Url);
272-
tt(UrlOpenparenSyms, tk.CLOSEPAREN, Url);
286+
tt(UrlFullwidthOpenparenSyms, tk.FULLWIDTH_CLOSEPAREN, Url);
273287
tt(UrlOpenbraceSyms, tk.CLOSEPAREN, Url);
288+
tt(UrlOpenbraceSyms, tk.FULLWIDTH_CLOSEPAREN, Url);
274289

275290
tt(Start, tk.LOCALHOST, DomainDotTld); // localhost is a valid URL state
276291
tt(Start, tk.NL, mtk.Nl); // single new line

packages/linkifyjs/src/scanner.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,12 @@ export function init(customSchemes = []) {
5858
tt(Start, '[', tk.OPENBRACKET);
5959
tt(Start, '<', tk.OPENANGLEBRACKET);
6060
tt(Start, '(', tk.OPENPAREN);
61+
tt(Start, '(', tk.FULLWIDTH_OPENPAREN);
6162
tt(Start, '}', tk.CLOSEBRACE);
6263
tt(Start, ']', tk.CLOSEBRACKET);
6364
tt(Start, '>', tk.CLOSEANGLEBRACKET);
6465
tt(Start, ')', tk.CLOSEPAREN);
66+
tt(Start, ')', tk.FULLWIDTH_CLOSEPAREN);
6567
tt(Start, '&', tk.AMPERSAND);
6668
tt(Start, '*', tk.ASTERISK);
6769
tt(Start, '@', tk.AT);

packages/linkifyjs/src/text.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ export const CLOSEBRACE = 'CLOSEBRACE'; // }
4444
export const CLOSEBRACKET = 'CLOSEBRACKET'; // ]
4545
export const CLOSEANGLEBRACKET = 'CLOSEANGLEBRACKET'; // >
4646
export const CLOSEPAREN = 'CLOSEPAREN'; // )
47+
export const FULLWIDTH_OPENPAREN = 'FULLWIDTH_OPENPAREN'; // (
48+
export const FULLWIDTH_CLOSEPAREN = 'FULLWIDTH_CLOSEPAREN'; // )
4749

4850
// Various symbols
4951
export const AMPERSAND = 'AMPERSAND'; // &

test/spec/linkifyjs/parser.test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,14 @@ const tests = [
272272
'This Url www.drive1.com with www and digits also www.500px.com',
273273
[Text, Url, Text, Url],
274274
['This Url ', 'www.drive1.com', ' with www and digits also ', 'www.500px.com']
275+
], [
276+
'Link 1(http://foo.com/blah_blah) Link 2(http://foo.com/blah_blah_(wikipedia)_(again))',
277+
[Text, Url, Text, Url, Text],
278+
['Link 1(', 'http://foo.com/blah_blah', ') Link 2(', 'http://foo.com/blah_blah_(wikipedia)_(again)', ')']
279+
], [
280+
'Link 1(http://foo.com/blah_blah) Link 2(http://foo.com/blah_blah_(wikipedia)_(again))',
281+
[Text, Url, Text, Url, Text],
282+
['Link 1(', 'http://foo.com/blah_blah', ') Link 2(', 'http://foo.com/blah_blah_(wikipedia)_(again)', ')']
275283
],
276284
];
277285

0 commit comments

Comments
 (0)