add custom search engines to google mfm
All checks were successful
Lint / pnpm_install (pull_request) Successful in 2m11s
Test (production install and build) / production (22.x) (pull_request) Successful in 2m49s
Test (frontend) / vitest (22.x) (pull_request) Successful in 4m57s
Lint / lint (frontend) (pull_request) Successful in 9m52s
Lint / lint (backend) (pull_request) Successful in 11m39s
Lint / lint (misskey-js) (pull_request) Successful in 4m9s
Lint / lint (sw) (pull_request) Successful in 7m51s
Lint / typecheck (backend) (pull_request) Successful in 4m58s
Lint / typecheck (misskey-js) (pull_request) Successful in 2h11m8s
All checks were successful
Lint / pnpm_install (pull_request) Successful in 2m11s
Test (production install and build) / production (22.x) (pull_request) Successful in 2m49s
Test (frontend) / vitest (22.x) (pull_request) Successful in 4m57s
Lint / lint (frontend) (pull_request) Successful in 9m52s
Lint / lint (backend) (pull_request) Successful in 11m39s
Lint / lint (misskey-js) (pull_request) Successful in 4m9s
Lint / lint (sw) (pull_request) Successful in 7m51s
Lint / typecheck (backend) (pull_request) Successful in 4m58s
Lint / typecheck (misskey-js) (pull_request) Successful in 2h11m8s
This commit is contained in:
parent
9dbb4124da
commit
e2e0e9d956
8 changed files with 78 additions and 5 deletions
|
@ -762,6 +762,10 @@ noCrawleDescription: "Ask search engines to not index your profile page, notes,
|
||||||
lockedAccountInfo: "Unless you set your note visiblity to \"Followers only\", your notes will be visible to anyone, even if you require followers to be manually approved."
|
lockedAccountInfo: "Unless you set your note visiblity to \"Followers only\", your notes will be visible to anyone, even if you require followers to be manually approved."
|
||||||
alwaysMarkSensitive: "Mark as sensitive by default"
|
alwaysMarkSensitive: "Mark as sensitive by default"
|
||||||
loadRawImages: "Load original images instead of showing thumbnails"
|
loadRawImages: "Load original images instead of showing thumbnails"
|
||||||
|
searchEngine: "Search Engine For Search MFM"
|
||||||
|
searchEngineOther: "Other"
|
||||||
|
searchEngineCustomURIDescription: "The custom URI must be input in the format like \"https://www.google.com/search?q=\\{query}\" or \"https://www.google.com/search?q=%s\"."
|
||||||
|
searchEngineCusomURI: "Custom URI"
|
||||||
disableShowingAnimatedImages: "Don't play animated images"
|
disableShowingAnimatedImages: "Don't play animated images"
|
||||||
highlightSensitiveMedia: "Highlight sensitive media"
|
highlightSensitiveMedia: "Highlight sensitive media"
|
||||||
verificationEmailSent: "A verification email has been sent. Please follow the included link to complete verification."
|
verificationEmailSent: "A verification email has been sent. Please follow the included link to complete verification."
|
||||||
|
|
18
locales/index.d.ts
vendored
18
locales/index.d.ts
vendored
|
@ -3064,6 +3064,22 @@ export interface Locale extends ILocale {
|
||||||
* 添付画像のサムネイルをオリジナル画質にする
|
* 添付画像のサムネイルをオリジナル画質にする
|
||||||
*/
|
*/
|
||||||
"loadRawImages": string;
|
"loadRawImages": string;
|
||||||
|
/**
|
||||||
|
* 検索MFMの検索エンジン
|
||||||
|
*/
|
||||||
|
"searchEngine": string;
|
||||||
|
/**
|
||||||
|
* 他
|
||||||
|
*/
|
||||||
|
"searchEngineOther": string;
|
||||||
|
/**
|
||||||
|
* カスタム URI は、"https://www.google.com/search?q=\{query}" や "https://www.google.com/search?q=%s" のような形式で入力する必要があります。
|
||||||
|
*/
|
||||||
|
"searchEngineCustomURIDescription": ParameterizedString<"query">;
|
||||||
|
/**
|
||||||
|
* カスタム URI
|
||||||
|
*/
|
||||||
|
"searchEngineCusomURI": string;
|
||||||
/**
|
/**
|
||||||
* アニメーション画像を再生しない
|
* アニメーション画像を再生しない
|
||||||
*/
|
*/
|
||||||
|
@ -6843,7 +6859,7 @@ export interface Locale extends ILocale {
|
||||||
};
|
};
|
||||||
"_tutorialCompleted": {
|
"_tutorialCompleted": {
|
||||||
/**
|
/**
|
||||||
* Misskey初心者講座 修了証
|
* Forkey初心者講座 修了証
|
||||||
*/
|
*/
|
||||||
"title": string;
|
"title": string;
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -49,7 +49,7 @@ const primaries = {
|
||||||
};
|
};
|
||||||
|
|
||||||
// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
|
// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
|
||||||
const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
|
const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '').replaceAll(new RegExp(/\\+\{/,'g'), '{');
|
||||||
|
|
||||||
export function build() {
|
export function build() {
|
||||||
const metaUrl = import.meta.url;
|
const metaUrl = import.meta.url;
|
||||||
|
|
|
@ -762,6 +762,10 @@ noCrawleDescription: "外部の検索エンジンにあなたのユーザーペ
|
||||||
lockedAccountInfo: "フォローを承認制にしても、ノートの公開範囲を「フォロワー」にしない限り、誰でもあなたのノートを見ることができます。"
|
lockedAccountInfo: "フォローを承認制にしても、ノートの公開範囲を「フォロワー」にしない限り、誰でもあなたのノートを見ることができます。"
|
||||||
alwaysMarkSensitive: "デフォルトでメディアをセンシティブ設定にする"
|
alwaysMarkSensitive: "デフォルトでメディアをセンシティブ設定にする"
|
||||||
loadRawImages: "添付画像のサムネイルをオリジナル画質にする"
|
loadRawImages: "添付画像のサムネイルをオリジナル画質にする"
|
||||||
|
searchEngine: "検索MFMの検索エンジン"
|
||||||
|
searchEngineOther: "他"
|
||||||
|
searchEngineCustomURIDescription: "カスタム URI は、\"https://www.google.com/search?q=\\{query}\" や \"https://www.google.com/search?q=%s\" のような形式で入力する必要があります。"
|
||||||
|
searchEngineCusomURI: "カスタム URI"
|
||||||
disableShowingAnimatedImages: "アニメーション画像を再生しない"
|
disableShowingAnimatedImages: "アニメーション画像を再生しない"
|
||||||
highlightSensitiveMedia: "メディアがセンシティブであることを分かりやすく表示"
|
highlightSensitiveMedia: "メディアがセンシティブであることを分かりやすく表示"
|
||||||
verificationEmailSent: "確認のメールを送信しました。メールに記載されたリンクにアクセスして、設定を完了してください。"
|
verificationEmailSent: "確認のメールを送信しました。メールに記載されたリンクにアクセスして、設定を完了してください。"
|
||||||
|
|
|
@ -13,6 +13,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import { i18n } from '@/i18n.js';
|
import { i18n } from '@/i18n.js';
|
||||||
|
import { defaultStore } from '@/store';
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
q: string;
|
q: string;
|
||||||
|
@ -21,9 +22,9 @@ const props = defineProps<{
|
||||||
const query = ref(props.q);
|
const query = ref(props.q);
|
||||||
|
|
||||||
const search = () => {
|
const search = () => {
|
||||||
const sp = new URLSearchParams();
|
const searchQuery = encodeURIComponent(query.value);
|
||||||
sp.append('q', query.value);
|
const searchUrl = defaultStore.state.searchEngine.replace(/{query}|%s\b/g, searchQuery);
|
||||||
window.open(`https://www.google.com/search?${sp.toString()}`, '_blank', 'noopener');
|
window.open(searchUrl, '_blank', 'noopener');
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,27 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<MkSwitch v-model="showReactionsCount">{{ i18n.ts.showReactionsCount }}</MkSwitch>
|
<MkSwitch v-model="showReactionsCount">{{ i18n.ts.showReactionsCount }}</MkSwitch>
|
||||||
<MkSwitch v-model="showGapBetweenNotesInTimeline">{{ i18n.ts.showGapBetweenNotesInTimeline }}</MkSwitch>
|
<MkSwitch v-model="showGapBetweenNotesInTimeline">{{ i18n.ts.showGapBetweenNotesInTimeline }}</MkSwitch>
|
||||||
<MkSwitch v-model="loadRawImages">{{ i18n.ts.loadRawImages }}</MkSwitch>
|
<MkSwitch v-model="loadRawImages">{{ i18n.ts.loadRawImages }}</MkSwitch>
|
||||||
|
<MkSelect v-model="searchEngine" placeholder="Other">
|
||||||
|
<template #label>{{ i18n.ts.searchEngine }}</template>
|
||||||
|
<option
|
||||||
|
v-for="[key, value] in Object.entries(searchEngineMap)" :key="key" :value="key"
|
||||||
|
>
|
||||||
|
{{ value }}
|
||||||
|
</option>
|
||||||
|
<!-- If the user is on Other and enters a domain add this one so that the dropdown doesnt go blank -->
|
||||||
|
<option v-if="useCustomSearchEngine" :value="searchEngine">
|
||||||
|
{{ i18n.ts.searchEngineOther }}
|
||||||
|
</option>
|
||||||
|
<!-- If one of the other options is selected show this as a blank other -->
|
||||||
|
<option v-if="!useCustomSearchEngine" value="">{{ i18n.ts.searchEngineOther }}</option>
|
||||||
|
</MkSelect>
|
||||||
|
|
||||||
|
<div v-if="useCustomSearchEngine">
|
||||||
|
<MkInput v-model="searchEngine" :max="300">
|
||||||
|
<template #label>{{ i18n.ts.searchEngineCusomURI }}</template>
|
||||||
|
<template #caption>{{ i18n.ts.searchEngineCustomURIDescription }}</template>
|
||||||
|
</MkInput>
|
||||||
|
</div>
|
||||||
<MkRadios v-model="reactionsDisplaySize">
|
<MkRadios v-model="reactionsDisplaySize">
|
||||||
<template #label>{{ i18n.ts.reactionsDisplaySize }}</template>
|
<template #label>{{ i18n.ts.reactionsDisplaySize }}</template>
|
||||||
<option value="small">{{ i18n.ts.small }}</option>
|
<option value="small">{{ i18n.ts.small }}</option>
|
||||||
|
@ -241,6 +262,7 @@ import * as Misskey from 'misskey-js';
|
||||||
import MkSwitch from '@/components/MkSwitch.vue';
|
import MkSwitch from '@/components/MkSwitch.vue';
|
||||||
import MkSelect from '@/components/MkSelect.vue';
|
import MkSelect from '@/components/MkSelect.vue';
|
||||||
import MkRadios from '@/components/MkRadios.vue';
|
import MkRadios from '@/components/MkRadios.vue';
|
||||||
|
import MkInput from '@/components/MkInput.vue';
|
||||||
import MkRange from '@/components/MkRange.vue';
|
import MkRange from '@/components/MkRange.vue';
|
||||||
import MkFolder from '@/components/MkFolder.vue';
|
import MkFolder from '@/components/MkFolder.vue';
|
||||||
import MkButton from '@/components/MkButton.vue';
|
import MkButton from '@/components/MkButton.vue';
|
||||||
|
@ -249,6 +271,7 @@ import FormLink from '@/components/form/link.vue';
|
||||||
import MkLink from '@/components/MkLink.vue';
|
import MkLink from '@/components/MkLink.vue';
|
||||||
import MkInfo from '@/components/MkInfo.vue';
|
import MkInfo from '@/components/MkInfo.vue';
|
||||||
import { langs } from '@/config.js';
|
import { langs } from '@/config.js';
|
||||||
|
import { searchEngineMap } from '@/scripts/search-engine-map.js';
|
||||||
import { defaultStore } from '@/store.js';
|
import { defaultStore } from '@/store.js';
|
||||||
import * as os from '@/os.js';
|
import * as os from '@/os.js';
|
||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
|
import { misskeyApi } from '@/scripts/misskey-api.js';
|
||||||
|
@ -313,6 +336,7 @@ const showAvatarDecorations = computed(defaultStore.makeGetterSetter('showAvatar
|
||||||
const mediaListWithOneImageAppearance = computed(defaultStore.makeGetterSetter('mediaListWithOneImageAppearance'));
|
const mediaListWithOneImageAppearance = computed(defaultStore.makeGetterSetter('mediaListWithOneImageAppearance'));
|
||||||
const notificationPosition = computed(defaultStore.makeGetterSetter('notificationPosition'));
|
const notificationPosition = computed(defaultStore.makeGetterSetter('notificationPosition'));
|
||||||
const notificationStackAxis = computed(defaultStore.makeGetterSetter('notificationStackAxis'));
|
const notificationStackAxis = computed(defaultStore.makeGetterSetter('notificationStackAxis'));
|
||||||
|
const searchEngine = computed(defaultStore.makeGetterSetter('searchEngine'));
|
||||||
const keepScreenOn = computed(defaultStore.makeGetterSetter('keepScreenOn'));
|
const keepScreenOn = computed(defaultStore.makeGetterSetter('keepScreenOn'));
|
||||||
const disableStreamingTimeline = computed(defaultStore.makeGetterSetter('disableStreamingTimeline'));
|
const disableStreamingTimeline = computed(defaultStore.makeGetterSetter('disableStreamingTimeline'));
|
||||||
const useGroupedNotifications = computed(defaultStore.makeGetterSetter('useGroupedNotifications'));
|
const useGroupedNotifications = computed(defaultStore.makeGetterSetter('useGroupedNotifications'));
|
||||||
|
@ -485,4 +509,6 @@ definePageMetadata(() => ({
|
||||||
title: i18n.ts.general,
|
title: i18n.ts.general,
|
||||||
icon: 'ti ti-adjustments',
|
icon: 'ti ti-adjustments',
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
const useCustomSearchEngine = computed(() => !Object.keys(searchEngineMap).includes(searchEngine.value));
|
||||||
</script>
|
</script>
|
||||||
|
|
17
packages/frontend/src/scripts/search-engine-map.ts
Normal file
17
packages/frontend/src/scripts/search-engine-map.ts
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: leah and other Sharkey contributors
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
//store the URL and if its none of these it's a custom one
|
||||||
|
export const searchEngineMap = {
|
||||||
|
//The first one is the default search engine
|
||||||
|
'https://www.google.com/search?q={query}': 'Google',
|
||||||
|
'https://duckduckgo.com/?q={query}': 'Duckduckgo',
|
||||||
|
'https://www.bing.com/search?q={query}': 'Bing',
|
||||||
|
'https://search.yahoo.com/search?p={query}': 'Yahoo',
|
||||||
|
'https://www.ecosia.org/search?q={query}': 'Ecosia',
|
||||||
|
'https://www.qwant.com/?q={query}': 'Qwant',
|
||||||
|
'https://search.aol.com/aol/search?q={query}': 'AOL',
|
||||||
|
'https://yandex.com/search?text={query}': 'Yandex',
|
||||||
|
};
|
|
@ -6,6 +6,7 @@
|
||||||
import { markRaw, ref } from 'vue';
|
import { markRaw, ref } from 'vue';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import { miLocalStorage } from './local-storage.js';
|
import { miLocalStorage } from './local-storage.js';
|
||||||
|
import { searchEngineMap } from './scripts/search-engine-map.js';
|
||||||
import type { SoundType } from '@/scripts/sound.js';
|
import type { SoundType } from '@/scripts/sound.js';
|
||||||
import { Storage } from '@/pizzax.js';
|
import { Storage } from '@/pizzax.js';
|
||||||
import { hemisphere } from '@/scripts/intl-const.js';
|
import { hemisphere } from '@/scripts/intl-const.js';
|
||||||
|
@ -247,6 +248,10 @@ export const defaultStore = markRaw(new Storage('base', {
|
||||||
where: 'device',
|
where: 'device',
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
searchEngine: {
|
||||||
|
where: 'account',
|
||||||
|
default: Object.keys(searchEngineMap)[0],
|
||||||
|
},
|
||||||
warnMissingAltText: {
|
warnMissingAltText: {
|
||||||
where: 'device',
|
where: 'device',
|
||||||
default: true,
|
default: true,
|
||||||
|
|
Loading…
Reference in a new issue