Compare commits

..

8 Commits

Author SHA1 Message Date
syuilo
845be966a0 10.28.0 2018-10-20 09:39:56 +09:00
syuilo
80818d79eb Fix bug 2018-10-20 09:38:36 +09:00
syuilo
cb9b3c00dd Use router-link instead of a to improve usability 2018-10-20 09:34:34 +09:00
syuilo
dbb7c756cd Fix bug 2018-10-20 09:31:56 +09:00
syuilo
13f381710c Validate param 2018-10-20 09:31:52 +09:00
syuilo
70897c0e9a 🎨 2018-10-20 09:28:48 +09:00
syuilo
f51d1c5264 Fix test 2018-10-20 09:14:16 +09:00
syuilo
70d0937aab Fix #2949 2018-10-20 09:03:04 +09:00
9 changed files with 44 additions and 18 deletions

View File

@@ -124,6 +124,10 @@ common:
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
error:
title: '問題が発生しました'
retry: 'やり直す'
reversi: reversi:
drawn: "引き分け" drawn: "引き分け"
my-turn: "あなたのターンです" my-turn: "あなたのターンです"

View File

@@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "10.27.0", "version": "10.28.0",
"clientVersion": "1.0.10768", "clientVersion": "1.0.10776",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,

View File

@@ -114,10 +114,9 @@ export default Vue.component('misskey-flavored-markdown', {
} }
case 'mention': { case 'mention': {
return (createElement as any)('a', { return (createElement as any)('router-link', {
attrs: { attrs: {
href: `${url}/${token.canonical}`, to: `/${token.canonical}`,
target: '_blank',
dataIsMe: (this as any).i && getAcct((this as any).i) == getAcct(token), dataIsMe: (this as any).i && getAcct((this as any).i) == getAcct(token),
style: 'color:var(--mfmMention);' style: 'color:var(--mfmMention);'
}, },
@@ -129,10 +128,9 @@ export default Vue.component('misskey-flavored-markdown', {
} }
case 'hashtag': { case 'hashtag': {
return [createElement('a', { return [createElement('router-link', {
attrs: { attrs: {
href: `${url}/tags/${encodeURIComponent(token.hashtag)}`, to: `/tags/${encodeURIComponent(token.hashtag)}`,
target: '_blank',
style: 'color:var(--mfmHashtag);' style: 'color:var(--mfmHashtag);'
} }
}, token.content)]; }, token.content)];

View File

@@ -4,9 +4,9 @@
<slot name="empty" v-if="notes.length == 0 && !fetching && requestInitPromise == null"></slot> <slot name="empty" v-if="notes.length == 0 && !fetching && requestInitPromise == null"></slot>
<div v-if="!fetching && requestInitPromise != null"> <div v-if="!fetching && requestInitPromise != null" class="error">
<p>%i18n:@error%</p> <p>%fa:exclamation-triangle% %i18n:common.error.title%</p>
<button @click="resolveInitPromise">%i18n:@retry%</button> <ui-button @click="resolveInitPromise">%i18n:common.error.retry%</ui-button>
</div> </div>
<div class="placeholder" v-if="fetching"> <div class="placeholder" v-if="fetching">
@@ -215,6 +215,13 @@ export default Vue.extend({
> * > *
transition transform .3s ease, opacity .3s ease transition transform .3s ease, opacity .3s ease
> .error
max-width 300px
margin 0 auto
padding 16px
text-align center
color var(--text)
> .placeholder > .placeholder
padding 32px padding 32px
opacity 0.3 opacity 0.3

View File

@@ -47,14 +47,16 @@ export default Vue.extend({
mounted() { mounted() {
if (this.connection) this.connection.close(); if (this.connection) this.connection.close();
this.connection = (this as any).os.stream.connectToChannel('hashtag', this.tagTl.query); this.connection = (this as any).os.stream.connectToChannel('hashtag', {
q: this.tagTl.query
});
this.connection.on('note', this.onNote); this.connection.on('note', this.onNote);
this.fetch(); this.fetch();
}, },
beforeDestroy() { beforeDestroy() {
this.connection.close(); this.connection.dispose();
}, },
methods: { methods: {

View File

@@ -8,9 +8,9 @@
</template> </template>
</div> </div>
<div v-if="!fetching && requestInitPromise != null"> <div v-if="!fetching && requestInitPromise != null" class="error">
<p>%i18n:@error%</p> <p>%fa:exclamation-triangle% %i18n:common.error.title%</p>
<button @click="resolveInitPromise">%i18n:@retry%</button> <ui-button @click="resolveInitPromise">%i18n:common.error.retry%</ui-button>
</div> </div>
<!-- トランジションを有効にするとなぜかメモリリークする --> <!-- トランジションを有効にするとなぜかメモリリークする -->
@@ -226,6 +226,13 @@ export default Vue.extend({
> * > *
transition transform .3s ease, opacity .3s ease transition transform .3s ease, opacity .3s ease
> .error
max-width 300px
margin 0 auto
padding 16px
text-align center
color var(--text)
> .placeholder > .placeholder
padding 16px padding 16px
opacity 0.3 opacity 0.3

View File

@@ -9,9 +9,9 @@ export type TextElementHashtag = {
}; };
export default function(text: string, i: number) { export default function(text: string, i: number) {
if (!(/^\s#[^\s\.,]+/.test(text) || (i == 0 && /^#[^\s\.,]+/.test(text)))) return null; if (!(/^\s#[^\s\.,!\?]+/.test(text) || (i == 0 && /^#[^\s\.,!\?]+/.test(text)))) return null;
const isHead = text.startsWith('#'); const isHead = text.startsWith('#');
const hashtag = text.match(/^\s?#[^\s\.,]+/)[0]; const hashtag = text.match(/^\s?#[^\s\.,!\?]+/)[0];
const res: any[] = !isHead ? [{ const res: any[] = !isHead ? [{
type: 'text', type: 'text',
content: text[0] content: text[0]

View File

@@ -15,6 +15,8 @@ export default class extends Channel {
const q: Array<string[]> = params.q; const q: Array<string[]> = params.q;
if (q == null) return;
// Subscribe stream // Subscribe stream
this.subscriber.on('hashtag', async note => { this.subscriber.on('hashtag', async note => {
const matched = q.some(tags => tags.every(tag => note.tags.map((t: string) => t.toLowerCase()).includes(tag.toLowerCase()))); const matched = q.some(tags => tags.every(tag => note.tags.map((t: string) => t.toLowerCase()).includes(tag.toLowerCase())));

View File

@@ -122,6 +122,12 @@ describe('Text', () => {
{ type: 'hashtag', content: '#piyo', hashtag: 'piyo' }, { type: 'hashtag', content: '#piyo', hashtag: 'piyo' },
{ type: 'text', content: '.' } { type: 'text', content: '.' }
], tokens2); ], tokens2);
const tokens3 = analyze('#Foo!');
assert.deepEqual([
{ type: 'hashtag', content: '#Foo', hashtag: 'Foo' },
{ type: 'text', content: '!' },
], tokens3);
}); });
it('quote', () => { it('quote', () => {