Page MenuHomePhabricator

D8834.id30684.diff
No OneTemporary

D8834.id30684.diff

diff --git a/lib/shared/markdown.js b/lib/shared/markdown.js
--- a/lib/shared/markdown.js
+++ b/lib/shared/markdown.js
@@ -2,8 +2,15 @@
import invariant from 'invariant';
-import { markdownMentionRegex } from './mention-utils.js';
-import type { RelativeMemberInfo } from '../types/thread-types.js';
+import {
+ markdownMentionRegex,
+ decodeChatMentionText,
+} from './mention-utils.js';
+import type {
+ RelativeMemberInfo,
+ ResolvedThreadInfo,
+ ChatMentionCandidates,
+} from '../types/thread-types.js';
// simple-markdown types
export type State = {
@@ -218,6 +225,24 @@
return match;
}
+function parseChatMention(
+ chatMentionCandidates: ChatMentionCandidates,
+ capture: Capture,
+): {
+ threadInfo: ?ResolvedThreadInfo,
+ content: string,
+ hasAccessToChat: boolean,
+} {
+ const threadInfo = chatMentionCandidates[capture[2]];
+ const threadName = threadInfo?.uiName ?? decodeChatMentionText(capture[3]);
+ const content = `@${threadName}`;
+ return {
+ threadInfo,
+ content,
+ hasAccessToChat: !!threadInfo,
+ };
+}
+
const blockQuoteRegex: RegExp = /^( *>[^\n]+(?:\n[^\n]+)*)(?:\n|$)/;
const blockQuoteStripFollowingNewlineRegex: RegExp =
/^( *>[^\n]+(?:\n[^\n]+)*)(?:\n|$){2}/;
@@ -317,4 +342,5 @@
matchMentions,
stripSpoilersFromNotifications,
stripSpoilersFromMarkdownAST,
+ parseChatMention,
};
diff --git a/lib/shared/mention-utils.js b/lib/shared/mention-utils.js
--- a/lib/shared/mention-utils.js
+++ b/lib/shared/mention-utils.js
@@ -2,13 +2,14 @@
import { oldValidUsernameRegexString } from './account-utils.js';
import SearchIndex from './search-index.js';
-import { threadOtherMembers } from './thread-utils.js';
+import { threadOtherMembers, chatNameMaxLength } from './thread-utils.js';
import { stringForUserExplicit } from './user-utils.js';
import { threadTypes } from '../types/thread-types-enum.js';
import {
type ThreadInfo,
type RelativeMemberInfo,
} from '../types/thread-types.js';
+import { idSchemaRegex } from '../utils/validation-utils.js';
export type TypeaheadMatchedStrings = {
+textBeforeAtSymbol: string,
@@ -35,6 +36,13 @@
'g',
);
+const chatMentionRegexString = `^(?<!\\\\)(@\\[\\[(${idSchemaRegex}):(.{1,${chatNameMaxLength}}?)(?<!\\\\)\\]\\])`;
+const chatMentionRegex: RegExp = new RegExp(chatMentionRegexString);
+
+function decodeChatMentionText(text: string): string {
+ return text.replace(/\\]/g, ']');
+}
+
function extractMentionsFromText(text: string): string[] {
const iterator = text.matchAll(mentionsExtractionRegex);
return [...iterator].map(matches => matches[2]);
@@ -117,4 +125,6 @@
getNewTextAndSelection,
getTypeaheadRegexMatches,
getMentionsCandidates,
+ chatMentionRegex,
+ decodeChatMentionText,
};

File Metadata

Mime Type
text/plain
Expires
Tue, Oct 22, 9:27 PM (19 h, 44 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2344670
Default Alt Text
D8834.id30684.diff (2 KB)

Event Timeline