diff --git a/src/autocomplete/Autocompleter.js b/src/autocomplete/Autocompleter.js index b8988e889f..f5fec4c502 100644 --- a/src/autocomplete/Autocompleter.js +++ b/src/autocomplete/Autocompleter.js @@ -43,10 +43,6 @@ export type Completion = { href: ?string, }; -export function stripDiacritics(str: string): string { - return str.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); -} - const PROVIDERS = [ UserProvider, RoomProvider, diff --git a/src/autocomplete/QueryMatcher.js b/src/autocomplete/QueryMatcher.js index 762b285685..9d4d4d0598 100644 --- a/src/autocomplete/QueryMatcher.js +++ b/src/autocomplete/QueryMatcher.js @@ -1,6 +1,7 @@ //@flow /* Copyright 2017 Aviral Dasgupta +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -27,6 +28,10 @@ class KeyMap { priorityMap = new Map(); } +function stripDiacritics(str: string): string { + return str.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); +} + export default class QueryMatcher { /** * @param {object[]} objects the objects to perform a match on @@ -46,10 +51,11 @@ export default class QueryMatcher { objects.forEach((object, i) => { const keyValues = _at(object, keys); for (const keyValue of keyValues) { - if (!map.hasOwnProperty(keyValue)) { - map[keyValue] = []; + const key = stripDiacritics(keyValue).toLowerCase(); + if (!map.hasOwnProperty(key)) { + map[key] = []; } - map[keyValue].push(object); + map[key].push(object); } keyMap.priorityMap.set(object, i); }); @@ -82,7 +88,7 @@ export default class QueryMatcher { } match(query: String): Array { - query = query.toLowerCase(); + query = stripDiacritics(query).toLowerCase(); if (this.options.shouldMatchWordsOnly) { query = query.replace(/[^\w]/g, ''); } @@ -91,7 +97,7 @@ export default class QueryMatcher { } const results = []; this.keyMap.keys.forEach((key) => { - let resultKey = key.toLowerCase(); + let resultKey = key; if (this.options.shouldMatchWordsOnly) { resultKey = resultKey.replace(/[^\w]/g, ''); } diff --git a/src/autocomplete/RoomProvider.js b/src/autocomplete/RoomProvider.js index a72cc3fce2..c222ae95d4 100644 --- a/src/autocomplete/RoomProvider.js +++ b/src/autocomplete/RoomProvider.js @@ -2,7 +2,6 @@ Copyright 2016 Aviral Dasgupta Copyright 2017 Vector Creations Ltd Copyright 2017, 2018 New Vector Ltd -Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -28,7 +27,6 @@ import sdk from '../index'; import _sortBy from 'lodash/sortBy'; import {makeRoomPermalink} from "../matrix-to"; import type {Completion, SelectionRange} from "./Autocompleter"; -import {stripDiacritics} from "./Autocompleter"; const ROOM_REGEX = /(?=#)(\S*)/g; @@ -45,7 +43,7 @@ export default class RoomProvider extends AutocompleteProvider { constructor() { super(ROOM_REGEX); this.matcher = new FuzzyMatcher([], { - keys: ['displayedAlias', '_name'], + keys: ['displayedAlias', 'name'], }); } @@ -69,12 +67,11 @@ export default class RoomProvider extends AutocompleteProvider { return { room: room, name: room.name, - _name: stripDiacritics(room.name), displayedAlias: getDisplayAliasForRoom(room), }; })); const matchedString = command[0]; - completions = this.matcher.match(stripDiacritics(matchedString)); + completions = this.matcher.match(matchedString); completions = _sortBy(completions, [ (c) => score(matchedString, c.displayedAlias), (c) => c.displayedAlias.length, diff --git a/src/autocomplete/UserProvider.js b/src/autocomplete/UserProvider.js index 42fcb5899b..9c2fb58084 100644 --- a/src/autocomplete/UserProvider.js +++ b/src/autocomplete/UserProvider.js @@ -30,7 +30,6 @@ import MatrixClientPeg from '../MatrixClientPeg'; import type {MatrixEvent, Room, RoomMember, RoomState} from 'matrix-js-sdk'; import {makeUserPermalink} from "../matrix-to"; import type {Completion, SelectionRange} from "./Autocompleter"; -import {stripDiacritics} from "./Autocompleter"; const USER_REGEX = /@\S*/g; @@ -40,11 +39,11 @@ export default class UserProvider extends AutocompleteProvider { constructor(room: Room) { super(USER_REGEX, { - keys: ['_name'], + keys: ['name'], }); this.room = room; this.matcher = new FuzzyMatcher([], { - keys: ['_name', 'userId'], + keys: ['name', 'userId'], shouldMatchPrefix: true, shouldMatchWordsOnly: false, }); @@ -109,7 +108,7 @@ export default class UserProvider extends AutocompleteProvider { const fullMatch = command[0]; // Don't search if the query is a single "@" if (fullMatch && fullMatch !== '@') { - completions = this.matcher.match(stripDiacritics(fullMatch)).map((user) => { + completions = this.matcher.match(fullMatch).map((user) => { const displayName = (user.name || user.userId || '').replace(' (IRC)', ''); // FIXME when groups are done return { // Length of completion should equal length of text in decorator. draft-js @@ -143,21 +142,9 @@ export default class UserProvider extends AutocompleteProvider { } const currentUserId = MatrixClientPeg.get().credentials.userId; + this.users = this.room.getJoinedMembers().filter(({userId}) => userId !== currentUserId); - this.users = []; - this.room.getJoinedMembers().forEach(({userId, name, ...rest}) => { - if (userId === currentUserId) return; // skip self - this.users.push({ - userId, - name, - _name: stripDiacritics(name), - ...rest, - }); - }); - - this.users = _sortBy(this.users, (member) => - 1E20 - lastSpoken[member.userId] || 1E20, - ); + this.users = _sortBy(this.users, (member) => 1E20 - lastSpoken[member.userId] || 1E20); this.matcher.setObjects(this.users); }