|
6 | 6 | const urlRegexStr = '(?:https?://)?(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]+(?:/[^/]+)*/?' |
7 | 7 | const urlStartRegex = new RegExp(`^${urlRegexStr}`) |
8 | 8 | const mentionRegex = new RegExp( |
9 | | - `(${urlRegexStr})?:?[@@]([^\\s@@.]{0,31}[^\\s@@:.])\\.?`, |
| 9 | + `(${urlRegexStr})?([@@]([^\\s@@.]{0,31}[^\\s@@:.]))\\.?|(:[@@]([^\\s@@.]{0,31}[^\\s@@:.]:))\\.?`, |
10 | 10 | 'g' |
11 | 11 | ) |
12 | 12 | const userStartsRegex = /^[@@]([a-zA-Z0-9_-]{1,32})/g |
@@ -122,21 +122,32 @@ const replaceMention = (m: string, getters: Readonly<UserAndGroupGetters>) => { |
122 | 122 | return m.replace(mentionRegex, s => { |
123 | 123 | const urlStart = s.match(urlStartRegex) |
124 | 124 | if (urlStart && urlStart.length !== 0) return s |
125 | | - // 始まりが:なものを除外 |
126 | | - if (s.startsWith(':')) return s |
| 125 | + const isStartsWithColon = s.startsWith(':') |
| 126 | + |
| 127 | + // 始まりと終わりが:なものを除外 |
| 128 | + if (isStartsWithColon && s.endsWith(':')) { |
| 129 | + return s |
| 130 | + } |
| 131 | + |
127 | 132 | // 終わりが.のものを除外 |
128 | 133 | if (s.endsWith('.')) return s |
129 | 134 |
|
130 | | - // .slice(1)は先頭の@を消すため |
| 135 | + const sColonRemoved = isStartsWithColon ? s.slice(1) : s.slice(0) |
| 136 | + |
| 137 | + // .slice(1)は先頭の@および:@を消すため |
131 | 138 | // 小文字化はgetter内で行う |
132 | | - const name = s.slice(1) |
| 139 | + const name = sColonRemoved.slice(1) |
133 | 140 | const uid = getters.getUser(name)?.id |
134 | 141 | if (uid) { |
135 | | - return `!{"type":"user","raw":"${s}","id":"${uid}"}` |
| 142 | + return `${ |
| 143 | + isStartsWithColon ? ':' : '' |
| 144 | + }!{"type":"user","raw":"${sColonRemoved}","id":"${uid}"}` |
136 | 145 | } |
137 | 146 | const gid = getters.getGroup(name)?.id |
138 | 147 | if (gid) { |
139 | | - return `!{"type":"group","raw":"${s}","id":"${gid}"}` |
| 148 | + return `${ |
| 149 | + isStartsWithColon ? ':' : '' |
| 150 | + }!{"type":"group","raw":"${sColonRemoved}","id":"${gid}"}` |
140 | 151 | } |
141 | 152 |
|
142 | 153 | return s.replace(userStartsRegex, s => { |
|
0 commit comments