diff --git a/src/client/app/common/views/components/google.vue b/src/client/app/common/views/components/google.vue
new file mode 100644
index 0000000000..92817d3c1f
--- /dev/null
+++ b/src/client/app/common/views/components/google.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/client/app/common/views/components/note-html.ts b/src/client/app/common/views/components/note-html.ts
index 38f6251cf7..f86b50659e 100644
--- a/src/client/app/common/views/components/note-html.ts
+++ b/src/client/app/common/views/components/note-html.ts
@@ -4,6 +4,7 @@ import parse from '../../../../../text/parse';
import getAcct from '../../../../../acct/render';
import { url } from '../../../config';
import MkUrl from './url.vue';
+import MkGoogle from './google.vue';
const flatten = list => list.reduce(
(a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []
@@ -145,6 +146,13 @@ export default Vue.component('mk-note-html', {
const emoji = emojilib.lib[token.emoji];
return createElement('span', emoji ? emoji.char : token.content);
+ case 'search':
+ return createElement(MkGoogle, {
+ props: {
+ q: token.query
+ }
+ });
+
default:
console.log('unknown ast type:', token.type);
}
diff --git a/src/text/html.ts b/src/text/html.ts
index 55265c206a..f33ef4997b 100644
--- a/src/text/html.ts
+++ b/src/text/html.ts
@@ -75,6 +75,13 @@ const handlers = {
a.href = url;
a.textContent = url;
document.body.appendChild(a);
+ },
+
+ search({ document }, { content, query }) {
+ const a = document.createElement('a');
+ a.href = `https://www.google.com/?#q=${query}`;
+ a.textContent = content;
+ document.body.appendChild(a);
}
};
diff --git a/src/text/parse/elements/search.ts b/src/text/parse/elements/search.ts
new file mode 100644
index 0000000000..12ee8ecbb8
--- /dev/null
+++ b/src/text/parse/elements/search.ts
@@ -0,0 +1,13 @@
+/**
+ * Search
+ */
+
+module.exports = text => {
+ const match = text.match(/^(.+?) 検索(\n|$)/);
+ if (!match) return null;
+ return {
+ type: 'search',
+ content: match[0],
+ query: match[1]
+ };
+};