Fix bug
This commit is contained in:
parent
556677be7a
commit
00f979f0e6
5 changed files with 34 additions and 16 deletions
|
@ -74,6 +74,7 @@ import { host } from '../../../config';
|
||||||
import { erase, unique } from '../../../../../prelude/array';
|
import { erase, unique } from '../../../../../prelude/array';
|
||||||
import { length } from 'stringz';
|
import { length } from 'stringz';
|
||||||
import { toASCII } from 'punycode';
|
import { toASCII } from 'punycode';
|
||||||
|
import extractMentions from '../../../../../misc/extract-mentions';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('desktop/views/components/post-form.vue'),
|
i18n: i18n('desktop/views/components/post-form.vue'),
|
||||||
|
@ -184,8 +185,7 @@ export default Vue.extend({
|
||||||
if (this.reply && this.reply.text != null) {
|
if (this.reply && this.reply.text != null) {
|
||||||
const ast = parse(this.reply.text);
|
const ast = parse(this.reply.text);
|
||||||
|
|
||||||
// TODO: 新しいMFMパーサに対応
|
for (const x of extractMentions(ast)) {
|
||||||
for (const x of ast.filter(t => t.type == 'mention')) {
|
|
||||||
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
|
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
|
||||||
|
|
||||||
// 自分は除外
|
// 自分は除外
|
||||||
|
|
|
@ -66,6 +66,7 @@ import { host } from '../../../config';
|
||||||
import { erase, unique } from '../../../../../prelude/array';
|
import { erase, unique } from '../../../../../prelude/array';
|
||||||
import { length } from 'stringz';
|
import { length } from 'stringz';
|
||||||
import { toASCII } from 'punycode';
|
import { toASCII } from 'punycode';
|
||||||
|
import extractMentions from '../../../../../misc/extract-mentions';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('mobile/views/components/post-form.vue'),
|
i18n: i18n('mobile/views/components/post-form.vue'),
|
||||||
|
@ -174,7 +175,7 @@ export default Vue.extend({
|
||||||
if (this.reply && this.reply.text != null) {
|
if (this.reply && this.reply.text != null) {
|
||||||
const ast = parse(this.reply.text);
|
const ast = parse(this.reply.text);
|
||||||
|
|
||||||
for (const x of ast.filter(t => t.type == 'mention')) {
|
for (const x of extractMentions(ast)) {
|
||||||
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
|
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
|
||||||
|
|
||||||
// 自分は除外
|
// 自分は除外
|
||||||
|
|
|
@ -11,6 +11,15 @@ export type Node = {
|
||||||
props?: any;
|
props?: any;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export interface IMentionNode extends Node {
|
||||||
|
props: {
|
||||||
|
canonical: string;
|
||||||
|
username: string;
|
||||||
|
host: string;
|
||||||
|
acct: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function _makeNode(name: string, children?: Node[], props?: any): Node {
|
function _makeNode(name: string, children?: Node[], props?: any): Node {
|
||||||
return children ? {
|
return children ? {
|
||||||
name,
|
name,
|
||||||
|
|
19
src/misc/extract-mentions.ts
Normal file
19
src/misc/extract-mentions.ts
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
import parse from '../mfm/parse';
|
||||||
|
import { Node, IMentionNode } from '../mfm/parser';
|
||||||
|
|
||||||
|
export default function(tokens: ReturnType<typeof parse>): IMentionNode['props'][] {
|
||||||
|
const mentions: IMentionNode['props'][] = [];
|
||||||
|
|
||||||
|
const extract = (tokens: Node[]) => {
|
||||||
|
for (const x of tokens.filter(x => x.name === 'mention')) {
|
||||||
|
mentions.push(x.props);
|
||||||
|
}
|
||||||
|
for (const x of tokens.filter(x => x.children)) {
|
||||||
|
extract(x.children);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
extract(tokens);
|
||||||
|
|
||||||
|
return mentions;
|
||||||
|
}
|
|
@ -29,6 +29,7 @@ import insertNoteUnread from './unread';
|
||||||
import registerInstance from '../register-instance';
|
import registerInstance from '../register-instance';
|
||||||
import Instance from '../../models/instance';
|
import Instance from '../../models/instance';
|
||||||
import { Node } from '../../mfm/parser';
|
import { Node } from '../../mfm/parser';
|
||||||
|
import extractMentions from '../../misc/extract-mentions';
|
||||||
|
|
||||||
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
|
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
|
||||||
|
|
||||||
|
@ -665,19 +666,7 @@ function incNotesCount(user: IUser) {
|
||||||
async function extractMentionedUsers(user: IUser, tokens: ReturnType<typeof parse>): Promise<IUser[]> {
|
async function extractMentionedUsers(user: IUser, tokens: ReturnType<typeof parse>): Promise<IUser[]> {
|
||||||
if (tokens == null) return [];
|
if (tokens == null) return [];
|
||||||
|
|
||||||
const mentions: any[] = [];
|
const mentions = extractMentions(tokens);
|
||||||
|
|
||||||
const extract = (tokens: Node[]) => {
|
|
||||||
for (const x of tokens.filter(x => x.name === 'mention')) {
|
|
||||||
mentions.push(x.props);
|
|
||||||
}
|
|
||||||
for (const x of tokens.filter(x => x.children)) {
|
|
||||||
extract(x.children);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Extract hashtags
|
|
||||||
extract(tokens);
|
|
||||||
|
|
||||||
let mentionedUsers =
|
let mentionedUsers =
|
||||||
erase(null, await Promise.all(mentions.map(async m => {
|
erase(null, await Promise.all(mentions.map(async m => {
|
||||||
|
|
Loading…
Reference in a new issue