Compare commits

...

32 Commits

Author SHA1 Message Date
839c93961c 4.14.0 2018-06-26 18:53:35 +09:00
30b1be97dd 🎨 2018-06-26 18:53:06 +09:00
55be57ad21 Clean up 2018-06-26 18:47:09 +09:00
58064ec633 MFM: Improve title syntax 2018-06-26 18:42:00 +09:00
d63044a15e Fix #1781 2018-06-26 18:34:17 +09:00
5422697397 Merge branch 'master' of https://github.com/syuilo/misskey 2018-06-26 18:25:50 +09:00
36c2f8fe5d Improve usability 2018-06-26 18:25:27 +09:00
2defddc153 Merge pull request #1784 from syuilo/greenkeeper/@types/webpack-4.4.3
Update @types/webpack to the latest version 🚀
2018-06-26 13:00:54 +09:00
fb9a219349 Merge pull request #1783 from syuilo/greenkeeper/@types/node-10.3.6
Update @types/node to the latest version 🚀
2018-06-26 13:00:46 +09:00
3b5e4276c8 Merge pull request #1782 from syuilo/greenkeeper/html-minifier-3.5.17
Update html-minifier to the latest version 🚀
2018-06-26 13:00:37 +09:00
fab2e08a0d Merge pull request #1785 from syuilo/greenkeeper/eslint-5.0.1
Update eslint to the latest version 🚀
2018-06-26 13:00:18 +09:00
19e9099a78 fix(package): update eslint to version 5.0.1 2018-06-26 03:50:37 +00:00
91c2b07cd8 fix(package): update @types/webpack to version 4.4.3 2018-06-26 03:06:03 +00:00
fd00c7bd81 fix(package): update @types/node to version 10.3.6 2018-06-26 01:40:05 +00:00
8919082179 fix(package): update html-minifier to version 3.5.17 2018-06-25 20:53:04 +00:00
2f7c191547 Merge pull request #1780 from syuilo/l10n_master
New Crowdin translations
2018-06-26 02:10:31 +09:00
80519dc366 New translations ja.yml (Portuguese) 2018-06-25 21:52:24 +09:00
4d53c813e4 New translations ja.yml (Korean) 2018-06-25 21:52:22 +09:00
750f479d58 New translations ja.yml (Polish) 2018-06-25 21:52:20 +09:00
e9a7e99108 New translations ja.yml (Chinese Simplified) 2018-06-25 21:52:17 +09:00
ebf10b3452 New translations ja.yml (Italian) 2018-06-25 21:52:15 +09:00
5d621f5318 New translations ja.yml (Russian) 2018-06-25 21:52:12 +09:00
35dedfc7e4 New translations ja.yml (English) 2018-06-25 21:52:10 +09:00
39094adfcf New translations ja.yml (Spanish) 2018-06-25 21:52:07 +09:00
74a25bfaa0 New translations ja.yml (German) 2018-06-25 21:52:05 +09:00
04ef2f0c8d New translations ja.yml (French) 2018-06-25 21:52:02 +09:00
fb99906a8c Merge pull request #1779 from otya128/master
Fix v('ω')v
2018-06-25 21:49:35 +09:00
da0d3e4129 正しいv('ω')v 2018-06-25 21:05:12 +09:00
3ffe90146c Update README.md 2018-06-25 13:47:22 +09:00
81cea41154 Merge pull request #1774 from syuilo/greenkeeper/webpack-4.12.1
Update webpack to the latest version 🚀
2018-06-24 18:12:37 +09:00
3ff4f53bbd fix(package): update webpack to version 4.12.1 2018-06-24 08:49:27 +00:00
a77f67fc32 4.13.1 2018-06-24 16:09:41 +09:00
26 changed files with 78 additions and 190 deletions

View File

@ -14,7 +14,7 @@ ultimately sophisticated professional microblogging software.
<a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
![](https://c10.patreonusercontent.com/3/e30%3D/patreon-posts/RsKWEDEKf8D_wYDQWAbex9CSb-1DnXW1nfqfLvuys5ROj2k0VF6_luuzHMTyf95n.png?token-time=1529539200&token-hash=RmcSP0947mw5o2-B6g1L6aU_OoDXANe198kLU6HMO30%3D)
![](https://ja.mstdn.wiki/images/e/ed/Deck.jpg)
:sparkles: Features
----------------------------------------------------------------

View File

@ -400,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "Medien von deinem PC hinzufügen"
attach-media-from-drive: "Medien von deinem Speicher hinzufügen"
attach-cancel: "Hinzufügen abbrechen"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "Eine Abstimmung erstellen"
text-remain: "{} Zeichen verbleibend"
desktop/views/components/post-form-window.vue:

View File

@ -400,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "Attach media from your PC"
attach-media-from-drive: "Attach media from your Drive"
attach-cancel: "Cancel attachment"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "Create a poll"
text-remain: "{} characters remaining"
desktop/views/components/post-form-window.vue:

View File

@ -400,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "Adjunta multimedia desde tu Disco"
attach-cancel: "Quitar el archivo adjunto"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "Crea una encuesta"
text-remain: "quedan {} caracteres"
desktop/views/components/post-form-window.vue:

View File

@ -400,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "Joindre un media depuis votre PC"
attach-media-from-drive: "Joindre un media depuis votre Drive"
attach-cancel: "Annuler la jointure de fichier"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "Créer un sondage"
text-remain: "{} charactères restants"
desktop/views/components/post-form-window.vue:

View File

@ -400,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:

View File

@ -461,7 +461,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"

View File

@ -400,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:

View File

@ -400,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "Załącz zawartość multimedialną z komputera"
attach-media-from-drive: "Załącz zawartość multimedialną z dysku"
attach-cancel: "Usuń załącznik"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "Utwórz ankietę"
text-remain: "pozostałe znaki: {}"
desktop/views/components/post-form-window.vue:

View File

@ -400,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:

View File

@ -400,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:

View File

@ -400,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:

View File

@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "4.13.0",
"clientVersion": "1.0.6783",
"version": "4.14.0",
"clientVersion": "1.0.6815",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@ -65,7 +65,7 @@
"@types/mocha": "5.2.3",
"@types/mongodb": "3.0.21",
"@types/ms": "0.7.30",
"@types/node": "10.3.5",
"@types/node": "10.3.6",
"@types/nopt": "3.0.29",
"@types/parse5": "5.0.0",
"@types/pug": "2.0.4",
@ -80,7 +80,7 @@
"@types/speakeasy": "2.0.2",
"@types/tmp": "0.0.33",
"@types/uuid": "3.4.3",
"@types/webpack": "4.4.2",
"@types/webpack": "4.4.3",
"@types/webpack-stream": "3.2.10",
"@types/websocket": "0.0.39",
"@types/ws": "5.1.2",
@ -102,7 +102,7 @@
"element-ui": "2.4.1",
"emojilib": "2.2.12",
"escape-regexp": "0.0.1",
"eslint": "5.0.0",
"eslint": "5.0.1",
"eslint-plugin-vue": "4.5.0",
"eventemitter3": "3.1.0",
"exif-js": "2.3.0",
@ -126,7 +126,7 @@
"gulp-util": "3.0.8",
"hard-source-webpack-plugin": "0.9.0",
"highlight.js": "9.12.0",
"html-minifier": "3.5.16",
"html-minifier": "3.5.17",
"http-signature": "1.2.0",
"inquirer": "6.0.0",
"is-root": "2.0.0",
@ -213,7 +213,7 @@
"vuex-persistedstate": "^2.5.4",
"web-push": "3.3.2",
"webfinger.js": "2.6.6",
"webpack": "4.12.0",
"webpack": "4.12.1",
"webpack-cli": "3.0.8",
"websocket": "1.0.26",
"ws": "5.2.1",

View File

@ -1,5 +1,5 @@
export default () => [
'(=^・・^=)',
'v(‘ω’)v',
'v('ω')v',
'🐡( \'-\' 🐡 )フグパンチ!!!!'
][Math.floor(Math.random() * 3)];

View File

@ -40,17 +40,6 @@ export default Vue.component('misskey-flavored-markdown', {
ast = this.ast;
}
if (ast.filter(x => x.type != 'hashtag').length == 0) {
return;
}
while (ast[ast.length - 1] && (
ast[ast.length - 1].type == 'hashtag' ||
(ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == ' ') ||
(ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == '\n'))) {
ast.pop();
}
// Parse ast to DOM
const els = flatten(ast.map(token => {
switch (token.type) {

View File

@ -1,7 +1,7 @@
<template>
<div class="mk-reaction-picker">
<div class="backdrop" ref="backdrop" @click="close"></div>
<div class="popover" :class="{ compact }" ref="popover">
<div class="popover" :class="{ compact, big }" ref="popover">
<p v-if="!compact">{{ title }}</p>
<div>
<button @click="react('like')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="1" title="%i18n:common.reactions.like%"><mk-reaction-icon reaction='like'/></button>
@ -25,7 +25,28 @@ import * as anime from 'animejs';
const placeholder = '%i18n:@choose-reaction%';
export default Vue.extend({
props: ['note', 'source', 'compact', 'cb'],
props: {
note: {
type: Object,
required: true
},
source: {
required: true
},
compact: {
type: Boolean,
required: false,
default: false
},
cb: {
required: false
},
big: {
type: Boolean,
required: false,
default: false
}
},
data() {
return {
title: placeholder
@ -162,6 +183,16 @@ root(isDark)
border-right solid $balloon-size transparent
border-bottom solid $balloon-size $bgcolor
&.compact
> div
width 280px
> button
width 50px
height 50px
font-size 28px
border-radius 4px
> p
display block
margin 0

View File

@ -265,8 +265,8 @@ export default Vue.extend({
border-bottom dashed 1px #c4cdd4
> .board
width 350px
height 350px
width calc(100% - 16px)
max-width 500px
margin 0 auto
$label-size = 16px

View File

@ -47,9 +47,6 @@
</div>
<mk-poll v-if="p.poll" :note="p"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
<div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
</div>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
<div class="map" v-if="p.geo" ref="map"></div>
<div class="renote" v-if="p.renote">
@ -363,35 +360,6 @@ root(isDark)
> .mk-url-preview
margin-top 8px
> .tags
margin 4px 0 0 0
> *
display inline-block
margin 0 8px 0 0
padding 2px 8px 2px 16px
font-size 90%
color #8d969e
background #edf0f3
border-radius 4px
&:before
content ""
display block
position absolute
top 0
bottom 0
left 4px
width 8px
height 8px
margin auto 0
background #fff
border-radius 100%
&:hover
text-decoration none
background #e2e7ec
> footer
font-size 1.2em

View File

@ -32,9 +32,6 @@
<mk-media-list :media-list="p.media"/>
</div>
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
<div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
</div>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a>
<div class="map" v-if="p.geo" ref="map"></div>
<div class="renote" v-if="p.renote">
@ -465,35 +462,6 @@ root(isDark)
&:empty
display none
> .tags
margin 4px 0 0 0
> *
display inline-block
margin 0 0 4px 6px
padding 2px 8px 2px 16px
font-size 90%
color $theme-color
background isDark ? #313543 : #edf0f3
border-radius 4px
&:before
content ""
display block
position absolute
top 0
bottom 0
left 4px
width 8px
height 8px
margin auto 0
background isDark ? #282c37 : #fff
border-radius 100%
&:hover
text-decoration none
background #e2e7ec
.mk-url-preview
margin-top 8px

View File

@ -32,9 +32,6 @@
<mk-media-list :media-list="p.media"/>
</div>
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
<div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
</div>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
<div class="renote" v-if="p.renote">
<mk-note-preview :note="p.renote" :mini="true"/>
@ -373,31 +370,6 @@ root(isDark)
.mk-url-preview
margin-top 8px
> .tags
margin 4px 0 0 0
> *
display inline-block
margin 0 0 4px 6px
padding 2px 8px 2px 16px
font-size 90%
color $theme-color
background isDark ? #313543 : #edf0f3
border-radius 4px
&:before
content ""
display block
position absolute
top 0
bottom 0
left 4px
width 8px
height 8px
margin auto 0
background isDark ? #282c37 : #fff
border-radius 100%
> .media
> img
display block

View File

@ -40,9 +40,6 @@
<span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span>
<misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/>
</div>
<div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
</div>
<div class="media" v-if="p.media.length > 0">
<mk-media-list :media-list="p.media" :raw="true"/>
</div>
@ -197,7 +194,8 @@ export default Vue.extend({
(this as any).os.new(MkReactionPicker, {
source: this.$refs.reactButton,
note: this.p,
compact: true
compact: true,
big: true
});
},
menu() {
@ -369,31 +367,6 @@ root(isDark)
display block
max-width 100%
> .tags
margin 4px 0 0 0
> *
display inline-block
margin 0 8px 0 0
padding 2px 8px 2px 16px
font-size 90%
color #8d969e
background #edf0f3
border-radius 4px
&:before
content ""
display block
position absolute
top 0
bottom 0
left 4px
width 8px
height 8px
margin auto 0
background #fff
border-radius 100%
> .time
font-size 16px
color isDark ? #606984 : #c0c0c0

View File

@ -32,9 +32,6 @@
<mk-media-list :media-list="p.media"/>
</div>
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
<div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
</div>
<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
<div class="map" v-if="p.geo" ref="map"></div>
@ -213,7 +210,8 @@ export default Vue.extend({
(this as any).os.new(MkReactionPicker, {
source: this.$refs.reactButton,
note: this.p,
compact: true
compact: true,
big: true
});
},
@ -416,31 +414,6 @@ root(isDark)
.mk-url-preview
margin-top 8px
> .tags
margin 4px 0 0 0
> *
display inline-block
margin 0 0 4px 6px
padding 2px 8px 2px 16px
font-size 90%
color $theme-color
background isDark ? #313543 : #edf0f3
border-radius 4px
&:before
content ""
display block
position absolute
top 0
bottom 0
left 4px
width 8px
height 8px
margin auto 0
background isDark ? #282c37 : #fff
border-radius 100%
> .media
> img
display block

View File

@ -9,7 +9,7 @@ export type TextElementTitle = {
};
export default function(text: string) {
const match = text.match(/^【(.+?)】\n/);
const match = text.match(/^(【|\[)(.+?)(】|])\n/);
if (!match) return null;
const title = match[0];
return {

View File

@ -2,6 +2,8 @@ import renderImage from './image';
import renderKey from './key';
import config from '../../../config';
import { ILocalUser } from '../../../models/user';
import toHtml from '../../../mfm/html';
import parse from '../../../mfm/parse';
export default (user: ILocalUser) => {
const id = `${config.url}/users/${user._id}`;
@ -15,7 +17,7 @@ export default (user: ILocalUser) => {
url: `${config.url}/@${user.username}`,
preferredUsername: user.username,
name: user.name,
summary: user.description,
summary: toHtml(parse(user.description)),
icon: user.avatarId && renderImage(user.avatarId),
image: user.bannerId && renderImage(user.bannerId),
manuallyApprovesFollowers: user.isLocked,

View File

@ -26,9 +26,9 @@ type Type = 'reply' | 'renote' | 'quote' | 'mention';
*/
class NotificationManager {
private notifier: IUser;
private note: any;
private note: INote;
constructor(notifier: IUser, note: any) {
constructor(notifier: IUser, note: INote) {
this.notifier = notifier;
this.note = note;
}
@ -192,7 +192,7 @@ export default async (user: IUser, data: {
// Serialize
const noteObj = await pack(note);
const nm = new NotificationManager(user, noteObj);
const nm = new NotificationManager(user, note);
const render = async () => {
const content = data.renote && data.text == null

View File

@ -115,6 +115,18 @@ describe('Text', () => {
{ type: 'search', content: 'a b c SEARCH', query: 'a b c'}
], tokens4);
});
it('title', () => {
const tokens1 = analyze('【yee】\nhaw');
assert.deepEqual(
{ type: 'title', content: '【yee】\n', title: 'yee'}
, tokens1[0]);
const tokens2 = analyze('[yee]\nhaw');
assert.deepEqual(
{ type: 'title', content: '[yee]\n', title: 'yee'}
, tokens2[0]);
});
});
describe('syntax highlighting', () => {