├── .gitignore
├── LICENSE
├── README.md
├── lib
├── build.js
└── ftp.js
├── package-lock.json
├── package.json
└── src
├── css
├── fonts
│ ├── NotoSansJP-Bold.otf
│ ├── NotoSansJP-Bold.woff
│ ├── NotoSansJP-Bold.woff2
│ ├── NotoSansJP-Regular.otf
│ ├── NotoSansJP-Regular.woff
│ ├── NotoSansJP-Regular.woff2
│ └── flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2
├── icon.css
├── materialize.css
├── notosansjapanese.css
├── style.css
└── sweetalert2.css
├── images
├── discord.png
├── discord_red.png
├── group.svg
├── icon.ico
├── icon.png
├── icon.svg
├── icon_group.svg
└── loading.gif
├── index.html
├── index.js
├── js
├── materialize.js
├── script.js
├── sweetalert2.js
└── twemoji.js
├── package-lock.json
└── package.json
/.gitignore:
--------------------------------------------------------------------------------
1 | *.bat
2 | /build/
3 | /lib/setting.json
4 | /node_modules/
5 | /release/
6 | /src/node_modules/
7 | /setting.json
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 micelle
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | DiSpeak - でぃすぴーく
2 | =====
3 | [](https://github.com/micelle/dc_DiSpeak/releases)
4 | [](https://github.com/micelle/dc_DiSpeak/releases/latest)
5 | [](https://github.com/micelle/dc_DiSpeak/releases/latest)
6 | [](https://github.com/micelle/dc_DiSpeak/commits/)
7 | [](https://github.com/micelle/dc_DiSpeak/blob/master/LICENSE)
8 |
9 | Discordのチャット内容を棒読みちゃんで読み上げてくれるツールです。
10 | Discordを起動していなくても読み上げてくれます。
11 |
12 | 詳細については[Wiki](https://github.com/micelle/dc_DiSpeak/wiki)をご確認ください。
13 |
14 | ## 日本語
15 |
16 | ### ダウンロード、インストール
17 | 詳細については[ダウンロードについて](https://github.com/micelle/dc_DiSpeak/wiki/Download)、
18 | エラーや警告が出たときは[Defender SmartScreenについて](https://github.com/micelle/dc_DiSpeak/wiki/Defender)をご確認ください。
19 |
20 | 1. インストーラーのダウンロードは[releases](https://github.com/micelle/dc_DiSpeak/releases)から行えます。
21 | 1. 「 **DiSpeakSetup-xxx.exe** 」をクリックし、インストーラーのダウンロードを行います。
22 | どれが最新か分からないときは[こちら](https://github.com/micelle/dc_DiSpeak/releases/latest)にある「 **DiSpeakSetup-xxx.exe** 」をダウンロードしてください。
23 | 1. ダウンロード後、インストーラーを実行することでDiSpeakのインストールが開始されます。
24 | 1. インストールが完了すると自動的にDiSpeakが起動します。
25 |
26 | ### アンインストール
27 | コントロールパネル「プログラムと機能」よりアンインストールしてください。
28 |
29 | ### 設定
30 | 「設定」をクリックすることで、各種設定画面が表示されます。
31 |
32 | ### 使い方
33 | 1. DiSpeakを起動。
34 | 1. DiSpeakの設定を済ませる。
35 | 1. 読み上げボタン(マイクボタン)をクリック。
36 |
37 | ### 動作確認
38 | Windows10 64bitで動作確認済み。
39 |
40 | ### ライセンス
41 | このソフトウェアはMITライセンスでリリースされています。「LICENSE」を参照してください。
42 |
43 | ### その他
44 | * 必須パッケージ
45 | ```
46 | npm i -g npm-check-updates
47 | ```
48 | * 起動
49 | ```
50 | npm start
51 | ```
52 | * ビルド
53 | ```
54 | npm run build
55 | ```
56 | * 更新チェック
57 | ```
58 | npm run c
59 | npm run cs
60 | ```
61 | * 更新
62 | ```
63 | npm run u
64 | npm run us
65 | ```
66 |
67 | ## English
68 | Not support.
--------------------------------------------------------------------------------
/lib/build.js:
--------------------------------------------------------------------------------
1 | const packager = require('electron-packager');
2 | const electronInstaller = require('electron-winstaller');
3 | const fs = require('fs-extra');
4 | const srcPackage = require('../src/package.json');
5 | const bldPackage = require('../package.json');
6 | const sourceDir = 'src';
7 | const buildDir = 'build';
8 | const releaseDir = 'release';
9 | const rimrafOptions = {};
10 | const packagerOptions = {
11 | name: srcPackage['name'],
12 | dir: `./${sourceDir}`,
13 | out: `./${buildDir}`,
14 | icon: `./${sourceDir}/images/icon.ico`,
15 | platform: 'win32',
16 | arch: 'ia32',
17 | electronVersion: bldPackage.devDependencies.electron.replace(/\^/, ''), // Electronのバージョン
18 | overwrite: true, // 上書き
19 | asar: true, // asarパッケージ化
20 | appVersion: srcPackage['version'],
21 | appCopyright: `(C) 2017 ${srcPackage['author']}`,
22 | // Windowsのみのオプション
23 | win32metadata: {
24 | CompanyName: 'prfac.com',
25 | FileDescription: srcPackage['name'],
26 | OriginalFilename: `${srcPackage['name']}.exe`,
27 | ProductName: srcPackage['name'],
28 | InternalName: srcPackage['name']
29 | }
30 | };
31 | const installerOptions = {
32 | //appDirectory: `./${buildDir}/DiSpeak-win32-ia32`,
33 | outputDirectory: `./${releaseDir}`,
34 | loadingGif: `./${sourceDir}/images/loading.gif`,
35 | authors: srcPackage['name'],
36 | owners: srcPackage['name'],
37 | exe: `${srcPackage['name']}.exe`,
38 | description: srcPackage['description'],
39 | version: srcPackage['version'],
40 | title: srcPackage['name'],
41 | name: srcPackage['name'],
42 | //signWithParams: `signtool sign /a ${srcPackage['name']}.exe`,
43 | iconUrl: 'https://prfac.com/dispeak/icon.ico',
44 | setupIcon: `./${sourceDir}/images/icon.ico`,
45 | setupExe: `DiSpeakSetup-${srcPackage['version']}.exe`,
46 | noMsi: true
47 | };
48 | // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md
49 | // https://github.com/electron/windows-installer
50 | fs.remove(`./${buildDir}`).then(res => {
51 | console.log('remove: buildDir');
52 | return fs.remove(`./${releaseDir}`);
53 | }).then(res => {
54 | console.log('remove: releaseDir');
55 | return packager(packagerOptions);
56 | }).then(path => {
57 | console.log('packager: ', path);
58 | installerOptions.appDirectory = `./${path[0]}`;
59 | return electronInstaller.createWindowsInstaller(installerOptions);
60 | }).then(res => {
61 | console.log('installer: complete');
62 | }).catch(function(err) {
63 | console.log('error: ', err);
64 | });
--------------------------------------------------------------------------------
/lib/ftp.js:
--------------------------------------------------------------------------------
1 | const FtpDeploy = require('ftp-deploy');
2 | const ftpDeploy = new FtpDeploy();
3 | const setting = require('./setting.json');
4 |
5 | // 現在の親ディレクトリを取得
6 | const dir = __dirname.replace(/lib$/g, '');
7 |
8 | // FTP 接続先情報
9 | const user = setting['user'];
10 | const password = setting['password'];
11 | const host = setting['host'];
12 | const config = {
13 | user: user,
14 | password: password,
15 | host: host,
16 | port: 21,
17 | localRoot: `${dir}release`,
18 | remoteRoot: setting['dir'], // リモートのルートとなるディレクトリを指定
19 | include: ['*.nupkg', 'RELEASES'], // localRoot 以外に追加でアップしたいファイルがあれば指定する
20 | exclude: ['*.exe'], // 除外したいファイル
21 | deleteRemote: false,
22 | forcePasv: true
23 | };
24 |
25 | // FTP 接続しデプロイする
26 | ftpDeploy
27 | .deploy(config)
28 | .then(res => console.log("finished:", res))
29 | .catch(err => console.log(err)
30 | );
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "DiSpeak_build",
3 | "version": "2.0.5",
4 | "description": "For DiSpeak build.",
5 | "main": "index.js",
6 | "dependencies": {
7 | "discord.js": "^11.6.4",
8 | "electron-squirrel-startup": "^1.0.0",
9 | "jquery": "^3.5.1",
10 | "markdown": "^0.5.0",
11 | "mime-types": "^2.1.27",
12 | "universal-analytics": "^0.4.23"
13 | },
14 | "devDependencies": {
15 | "electron": "^9.4.0",
16 | "electron-packager": "^15.1.0",
17 | "electron-winstaller": "^4.0.1",
18 | "fs-extra": "^9.0.1",
19 | "ftp-deploy": "^2.3.7"
20 | },
21 | "scripts": {
22 | "c": "ncu -x discord.js",
23 | "cs": "cd src && ncu -x discord.js",
24 | "u": "ncu -u -x discord.js && npm i",
25 | "us": "cd src && ncu -u -x discord.js && npm i",
26 | "build": "node lib/build.js",
27 | "start": "./node_modules/.bin/electron src"
28 | },
29 | "repository": {
30 | "type": "git",
31 | "url": "git+https://github.com/micelle/dc_DiSpeak.git"
32 | },
33 | "author": "micelle",
34 | "license": "MIT",
35 | "bugs": {
36 | "url": "https://github.com/micelle/dc_DiSpeak/issues"
37 | },
38 | "homepage": "https://github.com/micelle/dc_DiSpeak#readme"
39 | }
40 |
--------------------------------------------------------------------------------
/src/css/fonts/NotoSansJP-Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudukiak/DiSpeak/7322d4358eb44ddb4a66b39e582e43a80003d7e0/src/css/fonts/NotoSansJP-Bold.otf
--------------------------------------------------------------------------------
/src/css/fonts/NotoSansJP-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudukiak/DiSpeak/7322d4358eb44ddb4a66b39e582e43a80003d7e0/src/css/fonts/NotoSansJP-Bold.woff
--------------------------------------------------------------------------------
/src/css/fonts/NotoSansJP-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudukiak/DiSpeak/7322d4358eb44ddb4a66b39e582e43a80003d7e0/src/css/fonts/NotoSansJP-Bold.woff2
--------------------------------------------------------------------------------
/src/css/fonts/NotoSansJP-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudukiak/DiSpeak/7322d4358eb44ddb4a66b39e582e43a80003d7e0/src/css/fonts/NotoSansJP-Regular.otf
--------------------------------------------------------------------------------
/src/css/fonts/NotoSansJP-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudukiak/DiSpeak/7322d4358eb44ddb4a66b39e582e43a80003d7e0/src/css/fonts/NotoSansJP-Regular.woff
--------------------------------------------------------------------------------
/src/css/fonts/NotoSansJP-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudukiak/DiSpeak/7322d4358eb44ddb4a66b39e582e43a80003d7e0/src/css/fonts/NotoSansJP-Regular.woff2
--------------------------------------------------------------------------------
/src/css/fonts/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudukiak/DiSpeak/7322d4358eb44ddb4a66b39e582e43a80003d7e0/src/css/fonts/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2
--------------------------------------------------------------------------------
/src/css/icon.css:
--------------------------------------------------------------------------------
1 | /* fallback */
2 | @font-face {
3 | font-family: 'Material Icons';
4 | font-style: normal;
5 | font-weight: 400;
6 | font-display: block;
7 | src: url(fonts/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2');
8 | }
9 |
10 | .material-icons {
11 | font-family: 'Material Icons';
12 | font-weight: normal;
13 | font-style: normal;
14 | font-size: 24px;
15 | line-height: 1;
16 | letter-spacing: normal;
17 | text-transform: none;
18 | display: inline-block;
19 | white-space: nowrap;
20 | word-wrap: normal;
21 | direction: ltr;
22 | -webkit-font-feature-settings: 'liga';
23 | -webkit-font-smoothing: antialiased;
24 | }
25 |
--------------------------------------------------------------------------------
/src/css/notosansjapanese.css:
--------------------------------------------------------------------------------
1 | /*
2 | * Noto Sans Japanese (japanese) http://www.google.com/fonts/earlyaccess
3 | */
4 | @font-face {
5 | font-family: 'Noto Sans Japanese';
6 | font-style: normal;
7 | font-weight: 400;
8 | font-display: block;
9 | src: url(fonts/NotoSansJP-Regular.woff2) format('woff2'),
10 | url(fonts/NotoSansJP-Regular.woff) format('woff'),
11 | url(fonts/NotoSansJP-Regular.otf) format('opentype');
12 | }
13 | @font-face {
14 | font-family: 'Noto Sans Japanese';
15 | font-style: normal;
16 | font-weight: 700;
17 | font-display: block;
18 | src: url(fonts/NotoSansJP-Bold.woff2) format('woff2'),
19 | url(fonts/NotoSansJP-Bold.woff) format('woff'),
20 | url(fonts/NotoSansJP-Bold.otf) format('opentype');
21 | }
22 |
--------------------------------------------------------------------------------
/src/css/style.css:
--------------------------------------------------------------------------------
1 | /* ********************
2 | header
3 | ******************** */
4 | header {
5 | -webkit-app-region: no-drag;
6 | -webkit-user-select: none;
7 | background: #4a5459;
8 | color: #fff;
9 | display: flex;
10 | justify-content: flex-end;
11 | font-size: 15px;
12 | height: 25px;
13 | }
14 |
15 | header>div:first-child {
16 | -webkit-app-region: drag;
17 | width: 100%;
18 | margin-top: 5px;
19 | margin-left: 5px;
20 | }
21 |
22 | header>div:first-child svg {
23 | height: 100%;
24 | width: auto;
25 | padding-bottom: 5px;
26 | fill: #fff;
27 | }
28 |
29 | header>div:not(:first-child) {
30 | -webkit-app-region: no-drag;
31 | text-align: center;
32 | display: flex;
33 | justify-content: center;
34 | align-items: center;
35 | width: 35px;
36 | }
37 |
38 | header>div:not(:first-child):not(:last-child):hover {
39 | background: #5c656a;
40 | }
41 |
42 | header>div:last-child:hover {
43 | background: #e81123;
44 | }
45 |
46 | #notification {
47 | display: flex;
48 | justify-content: center;
49 | align-items: center;
50 | }
51 |
52 | /* ********************
53 | main
54 | ******************** */
55 | main {
56 | overflow-y: scroll;
57 | height: calc(100vh - 25px);
58 | }
59 |
60 | main>.container {
61 | width: 100%;
62 | }
63 |
64 | main>.container>.row {
65 | margin: 0;
66 | }
67 |
68 | main>.container>.row>.col.s12.z-depth-1 {
69 | position: relative;
70 | z-index: 2;
71 | }
72 |
73 | main .row .col.contents {
74 | padding-top: .5em;
75 | }
76 |
77 | /* ********************
78 | tabs
79 | ******************** */
80 | main .tabs {
81 | margin-top: .5rem;
82 | margin-bottom: .5rem;
83 | }
84 | main .tabs .tab a {
85 | color: rgba(33, 150, 243, 0.7);
86 | }
87 |
88 | main .tabs .tab a:hover,
89 | main .tabs .tab a.active {
90 | color: #2196f3;
91 | }
92 |
93 | main .tabs .tab a.active {
94 | font-weight: bolder;
95 | }
96 |
97 | main .tabs .tab a:focus,
98 | main .tabs .tab a:focus.active,
99 | main .tabs .tab a:hover.active {
100 | background-color: transparent;
101 | }
102 |
103 | main .tabs .tab a:hover {
104 | background-color: rgba(33, 150, 243, 0.2);
105 | }
106 |
107 | main .tabs .indicator {
108 | background-color: #2196f3;
109 | }
110 |
111 | /* ********************
112 | tab固定
113 | ******************** */
114 | main.tab-fixed {
115 | overflow-y: hidden;
116 | }
117 | main.tab-fixed .tabs {
118 | padding-right: 10px;
119 | }
120 | main.tab-fixed .contents {
121 | overflow-y: scroll;
122 | height: calc(100vh - 25px - 48px - .5rem - .5em);
123 | }
124 |
125 | /* ********************
126 | log
127 | ******************** */
128 | #log .collection .collection-item.avatar {
129 | min-height: 50px;
130 | }
131 |
132 | #log .collection .collection-item.avatar p {
133 | word-wrap: break-word;
134 | overflow-wrap: break-word;
135 | word-break: break-all;
136 | width: 100%
137 | }
138 |
139 | .file-list-log {
140 | font-size: 12px;
141 | display: flex;
142 | }
143 |
144 | .file-list-log>span {
145 | white-space: nowrap;
146 | margin-left: 5px;
147 | }
148 |
149 | /* ********************
150 | setting_menu, help_menu
151 | ******************** */
152 | #setting_menu .collection .collection-item,
153 | #help_menu .collection .collection-item {
154 | padding: 10px;
155 | cursor: pointer;
156 | }
157 |
158 | #setting_menu .waves-effect,
159 | #help_menu .waves-effect {
160 | display: list-item;
161 | }
162 |
163 | /* ********************
164 | setting_table, help_table
165 | ******************** */
166 | #setting_table .row,
167 | #help_table .row {
168 | margin-bottom: 0;
169 | }
170 |
171 | /* ********************
172 | dispeak
173 | ******************** */
174 | #dispeak i.small {
175 | font-size: 1.5rem;
176 | }
177 |
178 | #dispeak .collapsible-body {
179 | padding-top: 0;
180 | }
181 |
182 | /* ********************
183 | server
184 | ******************** */
185 | #server .row.section.right-align {
186 | margin-bottom: 20px;
187 | padding-top: 0px;
188 | }
189 |
190 | #server .collection .collection-item {
191 | border-bottom: 0;
192 | border-top: 1px solid #ddd;
193 | }
194 |
195 | #server .collection .collection-item:first-child {
196 | border-top: 0;
197 | }
198 |
199 | #server #server-list .input-field {
200 | margin: 0;
201 | }
202 |
203 | #server #server-list .row.section.right-align span {
204 | color: #9e9e9e;
205 | font-size: 0.8rem;
206 | }
207 |
208 | #server-list div.col.s9 {
209 | word-wrap: break-word;
210 | overflow-wrap: break-word;
211 | word-break: break-all;
212 | }
213 |
214 | #server-list .col.s6.valign-wrapper>div {
215 | padding: 0;
216 | }
217 |
218 | #server-list .switch label .lever {
219 | margin-left: 6px;
220 | }
221 |
222 | /* ********************
223 | emojis
224 | ******************** */
225 | #emojis>.collapsible {
226 | box-shadow: none;
227 | border-radius: 3px;
228 | border-top: 1px solid #e0e0e0;
229 | border-right: 1px solid #e0e0e0;
230 | border-left: 1px solid #e0e0e0;
231 | }
232 |
233 | #emojis .collapsible-header img {
234 | width: auto;
235 | height: auto;
236 | max-width: 30px;
237 | max-height: 30px;
238 | margin-right: 16px;
239 | }
240 |
241 | #emojis .collapsible-body img {
242 | width: auto;
243 | height: auto;
244 | max-width: 60px;
245 | max-height: 60px;
246 | }
247 |
248 | /* ********************
249 | blacklist, whitelist, ngword
250 | ******************** */
251 | #blacklist img,
252 | #whitelist img {
253 | cursor: pointer;
254 | }
255 |
256 | #blacklist .chip,
257 | #whitelist .chip {
258 | display: block;
259 | }
260 |
261 | #blacklist .chips .input,
262 | #whitelist .chips .input,
263 | #ngword .chips .input {
264 | width: 100% !important
265 | }
266 |
267 | #blacklist .chips.focus,
268 | #whitelist .chips.focus,
269 | #ngword .chips.focus {
270 | border-bottom: 1px solid #5c6bc0;
271 | -webkit-box-shadow: 0 1px 0 0 #5c6bc0;
272 | box-shadow: 0 1px 0 0 #5c6bc0;
273 | }
274 |
275 | #blacklist .chip:focus,
276 | #whitelist .chip:focus,
277 | #ngword .chip:focus {
278 | background-color: #5c6bc0;
279 | }
280 |
281 | #ngword tr {
282 | border-bottom: 0;
283 | }
284 |
285 | /* ********************
286 | help
287 | ******************** */
288 | #help tr:last-child {
289 | border-bottom: none;
290 | }
291 |
292 | /* ********************
293 | template
294 | ******************** */
295 | #template td>input {
296 | margin: 0;
297 | border: none;
298 | }
299 |
300 | /* ********************
301 | info
302 | ******************** */
303 | #info h4 {
304 | margin: 0;
305 | margin-top: 14px;
306 | }
307 |
308 | #info svg {
309 | width: 56px;
310 | height: 56px;
311 | fill: #607d8b;
312 | }
313 |
314 | /* ********************
315 | release
316 | ******************** */
317 | #release>.collapsible {
318 | box-shadow: none;
319 | border-radius: 3px;
320 | border-top: 1px solid #e0e0e0;
321 | border-right: 1px solid #e0e0e0;
322 | border-left: 1px solid #e0e0e0;
323 | }
324 |
325 | #release .collapsible-body p:first-child {
326 | margin: 0;
327 | }
328 |
329 | #release .collapsible-body h2 {
330 | padding-bottom: 0.3em;
331 | font-size: 1.5em;
332 | border-bottom: 1px solid #eaecef;
333 | margin-top: 24px;
334 | margin-bottom: 16px;
335 | font-weight: 600;
336 | line-height: 1.25;
337 | }
338 |
339 | #release .collapsible-body h3 {
340 | font-size: 1.25em;
341 | margin-top: 24px;
342 | margin-bottom: 16px;
343 | font-weight: 600;
344 | line-height: 1.25;
345 | }
346 |
347 | #release .collapsible-body ul {
348 | padding-left: 2em;
349 | margin-top: 0;
350 | margin-bottom: 16px;
351 | }
352 |
353 | #release .collapsible-body li {
354 | list-style-type: disc;
355 | }
356 |
357 | #release .collapsible-body li li {
358 | list-style-type: circle;
359 | }
360 |
361 | #release .collapsible-body li+li {
362 | margin-top: .25em;
363 | }
364 |
365 | #release .collapsible-body code {
366 | padding: 0.2em 0.4em;
367 | margin: 0;
368 | font-size: 85%;
369 | background-color: rgba(27, 31, 35, 0.05);
370 | border-radius: 3px;
371 | }
372 |
373 | #release .collapsible-header span.badge.new {
374 | font-weight: 300;
375 | font-size: 0.8rem;
376 | color: #2cbe4e;
377 | background-color: #fff;
378 | border-radius: 2px;
379 | border: 1px solid #2cbe4e;
380 | }
381 |
382 | #release .collapsible-header span.badge.new.pre-release {
383 | color: #f66a0a;
384 | border: 1px solid #f66a0a;
385 | }
386 |
387 | /* ********************
388 | toast
389 | ******************** */
390 | .toast {
391 | background-color: rgba(50, 50, 50, 0.95);
392 | /*background-color: #323232;*/
393 | }
394 |
395 | .toast.toast-logout,
396 | .toast.toast-error {
397 | /*background-color: rgba(183, 28, 28, 0.95);*/
398 | /*background-color: #b71c1c;*/
399 | justify-content: flex-start;
400 | }
401 |
402 | .toast.toast-logout>div .toast.toast-error>div {
403 | margin-left: 3rem;
404 | }
405 |
406 | .toast .material-icons {
407 | padding-right: 25px;
408 | }
409 |
410 | .toast.toast-logout .toast-action .toast.toast-error .toast-action {
411 | margin: 0;
412 | color: #fff;
413 | }
414 |
415 | #toast-container {
416 | top: auto;
417 | right: auto;
418 | left: 5%;
419 | bottom: 7%;
420 | min-width: 320px;
421 | max-width: 86%;
422 | }
423 |
424 | /* ********************
425 | modal
426 | ******************** */
427 | main .modal {
428 | height: 100%;
429 | bottom: 10%;
430 | }
431 |
432 | main #modal_error.modal .modal-content {
433 | padding-bottom: 0;
434 | min-height: 100px;
435 | }
436 |
437 | #modal_error {
438 | overflow-y: scroll;
439 | }
440 |
441 | #modal_error>div {
442 | margin: 0;
443 | }
444 |
445 | #modal_error .modal-content.row {
446 | height: auto;
447 | }
448 |
449 | #modal_error textarea,
450 | .hiddendiv.common {
451 | word-break: break-all;
452 | }
453 |
454 | .swal2-container,
455 | main .modal-overlay {
456 | top: 25px;
457 | }
458 |
459 | #modal_notification .modal-content {
460 | overflow-y: scroll;
461 | }
462 |
463 | /* ********************
464 | 各種微調整
465 | ******************** */
466 | ::-webkit-scrollbar {
467 | width: 10px;
468 | height: 10px;
469 | }
470 |
471 | ::-webkit-scrollbar-thumb {
472 | border-radius: 4px;
473 | background: #4a5459;
474 | }
475 |
476 | ::-webkit-scrollbar-track-piece {
477 | background: #fff;
478 | }
479 |
480 | [type="checkbox"]:checked + span:not(.lever):before {
481 | border-right: 2px solid #3949ab;
482 | border-bottom: 2px solid #3949ab;
483 | }
484 |
485 | [type="radio"]:checked + span:after,
486 | [type="radio"].with-gap:checked + span:after {
487 | background-color: #3949ab
488 | }
489 |
490 | [type="radio"]:checked + span:after,
491 | [type="radio"].with-gap:checked + span:before,
492 | [type="radio"].with-gap:checked + span:after {
493 | border: 2px solid #3949ab;
494 | }
495 |
496 | input[type="number"]::-webkit-outer-spin-button,
497 | input[type="number"]::-webkit-inner-spin-button {
498 | -webkit-appearance: none;
499 | margin: 0;
500 | }
501 |
502 | input[type=checkbox]:checked:not(:disabled)~.lever:active::before,
503 | input[type=checkbox]:checked:not(:disabled).tabbed:focus~.lever::before {
504 | background-color: rgba(92, 107, 192, 0.15);
505 | }
506 |
507 | input:not([type]):focus:not([readonly]),
508 | input[type=text]:not(.browser-default):focus:not([readonly]).swal2-input,
509 | .input-field input[type=text]:not(.browser-default):focus:not([readonly]),
510 | .input-field input[type=number]:not(.browser-default):focus:not([readonly]),
511 | textarea.materialize-textarea:focus:not([readonly]) {
512 | border-bottom: 1px solid #3949ab;
513 | -webkit-box-shadow: 0 1px 0 0 #3949ab;
514 | box-shadow: 0 1px 0 0 #3949ab;
515 | }
516 |
517 | input:not([type]):focus:not([readonly])+label,
518 | .input-field input[type=text]:not(.browser-default):focus:not([readonly])+label,
519 | .input-field input[type=number]:not(.browser-default):focus:not([readonly])+label,
520 | textarea.materialize-textarea:focus:not([readonly])+label {
521 | color: #3949ab;
522 | }
523 |
524 | .switch label input[type=checkbox]:checked+.lever {
525 | background-color: #9fa8da;
526 | }
527 |
528 | .switch label input[type=checkbox]:checked+.lever:after {
529 | background-color: #5c6bc0;
530 | }
531 |
532 | .input-field .prefix.active {
533 | color: #3949ab;
534 | }
535 |
536 | .swal2-popup input.swal2-input.swal2-inputerror {
537 | /*
538 | border-color: #f27474 !important;
539 | box-shadow: 0 0 2px #f27474 !important;
540 | */
541 | border: 0 !important;
542 | border-bottom: 1px solid #F44336 !important;
543 | box-shadow: 0 1px 0 0 #F44336 !important;
544 | }
545 |
546 | .collection:empty {
547 | margin: 0;
548 | border: none;
549 | }
550 |
551 | .chip>div {
552 | width: 385px;
553 | height: 32px;
554 | display: inline-block;
555 | overflow: hidden;
556 | }
557 | main>.fixed-action-btn:nth-child(3) {
558 | left: 23px;
559 | right: auto;
560 | display: none;
561 | }
562 |
563 | input[type=text]:not(.browser-default).swal2-input {
564 | height: 2.625em;
565 | padding: 0 0.75em;
566 | width: 100%;
567 | transition: border-color .3s, box-shadow .3s;
568 | border: 0;
569 | border-bottom: 1px solid #9e9e9e;
570 | /*border: 1px solid #d9d9d9;*/
571 | /*border-radius: 0.1875em;*/
572 | background: inherit;
573 | font-size: 1.125em;
574 | /*box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06);*/
575 | box-sizing: border-box;
576 | margin: 1em auto;
577 | }
578 |
579 | /* その他 */
580 | html {
581 | background: #fff;
582 | }
583 |
584 | body {
585 | color: #333;
586 | margin: 0;
587 | letter-spacing: 1px;
588 | line-height: 1.75;
589 | font-family:
590 | -apple-system,
591 | BlinkMacSystemFont,
592 | "Helvetica Neue",
593 | "Noto Sans Japanese",
594 | "ヒラギノ角ゴ ProN W3",
595 | Hiragino Kaku Gothic ProN,
596 | Arial,
597 | Meiryo,
598 | sans-serif;
599 | font-size: 1em;
600 | }
601 |
602 | b, strong {
603 | font-weight: bolder;
604 | }
605 |
606 | .display-none {
607 | display: none;
608 | }
609 |
610 | .emoji {
611 | height: 20px;
612 | width: 20px;
613 | margin: 0 1px;
614 | }
615 |
616 | .thumbnail {
617 | max-height: 120px;
618 | width: auto;
619 | margin: 0 1px;
620 | }
621 |
622 | .spoiler-text {
623 | color: transparent;
624 | background-color: rgb(51, 51, 51);
625 | display: inline-block;
626 | cursor: pointer;
627 | }
628 |
629 | .spoiler-text img {
630 | opacity: 0;
631 | /*display: block;*/
632 | }
633 |
634 | .spoiler-text.spoiler-non {
635 | color: rgb(51, 51, 51);
636 | background-color: transparent;
637 | cursor: auto;
638 | }
639 |
640 | .spoiler-text.spoiler-non img {
641 | opacity: 1;
642 | }
643 |
644 | .spoiler-image {
645 | overflow: hidden;
646 | display: inline-block;
647 | cursor: pointer;
648 | position: relative;
649 | }
650 |
651 | .spoiler-image .spoiler-image-warning {
652 | background-color: rgba(0,0,0,.6);
653 | color: #dcddde;
654 | border-radius: 12px;
655 | font-size: 8px;
656 | font-weight: 600;
657 | left: 50%;
658 | letter-spacing: .5px;
659 | padding: 2px 8px;
660 | position: absolute;
661 | text-transform: uppercase;
662 | top: 50%;
663 | transform: translate(-50%,-50%);
664 | user-select: none;
665 | z-index: 1;
666 | white-space: nowrap;
667 | }
668 |
669 | .spoiler-image .spoiler-image-filter {
670 | filter: blur(44px);
671 | }
672 |
673 | .spoiler-image.spoiler-non {
674 | cursor: auto;
675 | }
676 |
677 | .spoiler-image.spoiler-non .spoiler-image-warning {
678 | display: none;
679 | }
680 |
681 | .spoiler-image.spoiler-non .spoiler-image-filter {
682 | filter: blur(0px);
683 | }
684 |
685 | .keyboard {
686 | height: 41px;
687 | min-width: 24px;
688 | padding: 0 10px;
689 | margin: 5px 10px;
690 | background: #FFF;
691 | border-radius: 4px;
692 | border-top: 1px solid #F5F5F5;
693 | box-shadow: 0 0 25px #E8E8E8 inset, 0 1px 0 #C3C3C3, 0 2px 0 #C9C9C9, 0 2px 3px #333333;
694 | color: #666;
695 | text-shadow: 0 1px 0 #F5F5F5;
696 | font: bold 14px arial;
697 | text-align: center;
698 | line-height: 41px;
699 | display: inline-block;
700 | }
701 |
702 | .m0 {
703 | margin: 0;
704 | }
705 |
706 | .mb0 {
707 | margin-bottom: 0;
708 | }
709 |
710 | #swal2-content td {
711 | word-wrap: break-word;
712 | overflow-wrap: break-word;
713 | word-break: break-all;
714 | }
--------------------------------------------------------------------------------
/src/css/sweetalert2.css:
--------------------------------------------------------------------------------
1 | @-webkit-keyframes swal2-show {
2 | 0% {
3 | -webkit-transform: scale(0.7);
4 | transform: scale(0.7); }
5 | 45% {
6 | -webkit-transform: scale(1.05);
7 | transform: scale(1.05); }
8 | 80% {
9 | -webkit-transform: scale(0.95);
10 | transform: scale(0.95); }
11 | 100% {
12 | -webkit-transform: scale(1);
13 | transform: scale(1); } }
14 |
15 | @keyframes swal2-show {
16 | 0% {
17 | -webkit-transform: scale(0.7);
18 | transform: scale(0.7); }
19 | 45% {
20 | -webkit-transform: scale(1.05);
21 | transform: scale(1.05); }
22 | 80% {
23 | -webkit-transform: scale(0.95);
24 | transform: scale(0.95); }
25 | 100% {
26 | -webkit-transform: scale(1);
27 | transform: scale(1); } }
28 |
29 | @-webkit-keyframes swal2-hide {
30 | 0% {
31 | -webkit-transform: scale(1);
32 | transform: scale(1);
33 | opacity: 1; }
34 | 100% {
35 | -webkit-transform: scale(0.5);
36 | transform: scale(0.5);
37 | opacity: 0; } }
38 |
39 | @keyframes swal2-hide {
40 | 0% {
41 | -webkit-transform: scale(1);
42 | transform: scale(1);
43 | opacity: 1; }
44 | 100% {
45 | -webkit-transform: scale(0.5);
46 | transform: scale(0.5);
47 | opacity: 0; } }
48 |
49 | @-webkit-keyframes swal2-animate-success-line-tip {
50 | 0% {
51 | top: 1.1875em;
52 | left: .0625em;
53 | width: 0; }
54 | 54% {
55 | top: 1.0625em;
56 | left: .125em;
57 | width: 0; }
58 | 70% {
59 | top: 2.1875em;
60 | left: -.375em;
61 | width: 3.125em; }
62 | 84% {
63 | top: 3em;
64 | left: 1.3125em;
65 | width: 1.0625em; }
66 | 100% {
67 | top: 2.8125em;
68 | left: .875em;
69 | width: 1.5625em; } }
70 |
71 | @keyframes swal2-animate-success-line-tip {
72 | 0% {
73 | top: 1.1875em;
74 | left: .0625em;
75 | width: 0; }
76 | 54% {
77 | top: 1.0625em;
78 | left: .125em;
79 | width: 0; }
80 | 70% {
81 | top: 2.1875em;
82 | left: -.375em;
83 | width: 3.125em; }
84 | 84% {
85 | top: 3em;
86 | left: 1.3125em;
87 | width: 1.0625em; }
88 | 100% {
89 | top: 2.8125em;
90 | left: .875em;
91 | width: 1.5625em; } }
92 |
93 | @-webkit-keyframes swal2-animate-success-line-long {
94 | 0% {
95 | top: 3.375em;
96 | right: 2.875em;
97 | width: 0; }
98 | 65% {
99 | top: 3.375em;
100 | right: 2.875em;
101 | width: 0; }
102 | 84% {
103 | top: 2.1875em;
104 | right: 0;
105 | width: 3.4375em; }
106 | 100% {
107 | top: 2.375em;
108 | right: .5em;
109 | width: 2.9375em; } }
110 |
111 | @keyframes swal2-animate-success-line-long {
112 | 0% {
113 | top: 3.375em;
114 | right: 2.875em;
115 | width: 0; }
116 | 65% {
117 | top: 3.375em;
118 | right: 2.875em;
119 | width: 0; }
120 | 84% {
121 | top: 2.1875em;
122 | right: 0;
123 | width: 3.4375em; }
124 | 100% {
125 | top: 2.375em;
126 | right: .5em;
127 | width: 2.9375em; } }
128 |
129 | @-webkit-keyframes swal2-rotate-success-circular-line {
130 | 0% {
131 | -webkit-transform: rotate(-45deg);
132 | transform: rotate(-45deg); }
133 | 5% {
134 | -webkit-transform: rotate(-45deg);
135 | transform: rotate(-45deg); }
136 | 12% {
137 | -webkit-transform: rotate(-405deg);
138 | transform: rotate(-405deg); }
139 | 100% {
140 | -webkit-transform: rotate(-405deg);
141 | transform: rotate(-405deg); } }
142 |
143 | @keyframes swal2-rotate-success-circular-line {
144 | 0% {
145 | -webkit-transform: rotate(-45deg);
146 | transform: rotate(-45deg); }
147 | 5% {
148 | -webkit-transform: rotate(-45deg);
149 | transform: rotate(-45deg); }
150 | 12% {
151 | -webkit-transform: rotate(-405deg);
152 | transform: rotate(-405deg); }
153 | 100% {
154 | -webkit-transform: rotate(-405deg);
155 | transform: rotate(-405deg); } }
156 |
157 | @-webkit-keyframes swal2-animate-error-x-mark {
158 | 0% {
159 | margin-top: 1.625em;
160 | -webkit-transform: scale(0.4);
161 | transform: scale(0.4);
162 | opacity: 0; }
163 | 50% {
164 | margin-top: 1.625em;
165 | -webkit-transform: scale(0.4);
166 | transform: scale(0.4);
167 | opacity: 0; }
168 | 80% {
169 | margin-top: -.375em;
170 | -webkit-transform: scale(1.15);
171 | transform: scale(1.15); }
172 | 100% {
173 | margin-top: 0;
174 | -webkit-transform: scale(1);
175 | transform: scale(1);
176 | opacity: 1; } }
177 |
178 | @keyframes swal2-animate-error-x-mark {
179 | 0% {
180 | margin-top: 1.625em;
181 | -webkit-transform: scale(0.4);
182 | transform: scale(0.4);
183 | opacity: 0; }
184 | 50% {
185 | margin-top: 1.625em;
186 | -webkit-transform: scale(0.4);
187 | transform: scale(0.4);
188 | opacity: 0; }
189 | 80% {
190 | margin-top: -.375em;
191 | -webkit-transform: scale(1.15);
192 | transform: scale(1.15); }
193 | 100% {
194 | margin-top: 0;
195 | -webkit-transform: scale(1);
196 | transform: scale(1);
197 | opacity: 1; } }
198 |
199 | @-webkit-keyframes swal2-animate-error-icon {
200 | 0% {
201 | -webkit-transform: rotateX(100deg);
202 | transform: rotateX(100deg);
203 | opacity: 0; }
204 | 100% {
205 | -webkit-transform: rotateX(0deg);
206 | transform: rotateX(0deg);
207 | opacity: 1; } }
208 |
209 | @keyframes swal2-animate-error-icon {
210 | 0% {
211 | -webkit-transform: rotateX(100deg);
212 | transform: rotateX(100deg);
213 | opacity: 0; }
214 | 100% {
215 | -webkit-transform: rotateX(0deg);
216 | transform: rotateX(0deg);
217 | opacity: 1; } }
218 |
219 | body.swal2-toast-shown .swal2-container {
220 | background-color: transparent; }
221 | body.swal2-toast-shown .swal2-container.swal2-shown {
222 | background-color: transparent; }
223 | body.swal2-toast-shown .swal2-container.swal2-top {
224 | top: 0;
225 | right: auto;
226 | bottom: auto;
227 | left: 50%;
228 | -webkit-transform: translateX(-50%);
229 | transform: translateX(-50%); }
230 | body.swal2-toast-shown .swal2-container.swal2-top-end, body.swal2-toast-shown .swal2-container.swal2-top-right {
231 | top: 0;
232 | right: 0;
233 | bottom: auto;
234 | left: auto; }
235 | body.swal2-toast-shown .swal2-container.swal2-top-start, body.swal2-toast-shown .swal2-container.swal2-top-left {
236 | top: 0;
237 | right: auto;
238 | bottom: auto;
239 | left: 0; }
240 | body.swal2-toast-shown .swal2-container.swal2-center-start, body.swal2-toast-shown .swal2-container.swal2-center-left {
241 | top: 50%;
242 | right: auto;
243 | bottom: auto;
244 | left: 0;
245 | -webkit-transform: translateY(-50%);
246 | transform: translateY(-50%); }
247 | body.swal2-toast-shown .swal2-container.swal2-center {
248 | top: 50%;
249 | right: auto;
250 | bottom: auto;
251 | left: 50%;
252 | -webkit-transform: translate(-50%, -50%);
253 | transform: translate(-50%, -50%); }
254 | body.swal2-toast-shown .swal2-container.swal2-center-end, body.swal2-toast-shown .swal2-container.swal2-center-right {
255 | top: 50%;
256 | right: 0;
257 | bottom: auto;
258 | left: auto;
259 | -webkit-transform: translateY(-50%);
260 | transform: translateY(-50%); }
261 | body.swal2-toast-shown .swal2-container.swal2-bottom-start, body.swal2-toast-shown .swal2-container.swal2-bottom-left {
262 | top: auto;
263 | right: auto;
264 | bottom: 0;
265 | left: 0; }
266 | body.swal2-toast-shown .swal2-container.swal2-bottom {
267 | top: auto;
268 | right: auto;
269 | bottom: 0;
270 | left: 50%;
271 | -webkit-transform: translateX(-50%);
272 | transform: translateX(-50%); }
273 | body.swal2-toast-shown .swal2-container.swal2-bottom-end, body.swal2-toast-shown .swal2-container.swal2-bottom-right {
274 | top: auto;
275 | right: 0;
276 | bottom: 0;
277 | left: auto; }
278 |
279 | body.swal2-toast-column .swal2-toast {
280 | flex-direction: column;
281 | align-items: stretch; }
282 | body.swal2-toast-column .swal2-toast .swal2-actions {
283 | flex: 1;
284 | align-self: stretch;
285 | height: 2.2em;
286 | margin-top: .3125em; }
287 | body.swal2-toast-column .swal2-toast .swal2-loading {
288 | justify-content: center; }
289 | body.swal2-toast-column .swal2-toast .swal2-input {
290 | height: 2em;
291 | margin: .3125em auto;
292 | font-size: 1em; }
293 | body.swal2-toast-column .swal2-toast .swal2-validation-message {
294 | font-size: 1em; }
295 |
296 | .swal2-popup.swal2-toast {
297 | flex-direction: row;
298 | align-items: center;
299 | width: auto;
300 | padding: 0.625em;
301 | box-shadow: 0 0 0.625em #d9d9d9;
302 | overflow-y: hidden; }
303 | .swal2-popup.swal2-toast .swal2-header {
304 | flex-direction: row; }
305 | .swal2-popup.swal2-toast .swal2-title {
306 | flex-grow: 1;
307 | justify-content: flex-start;
308 | margin: 0 .6em;
309 | font-size: 1em; }
310 | .swal2-popup.swal2-toast .swal2-footer {
311 | margin: 0.5em 0 0;
312 | padding: 0.5em 0 0;
313 | font-size: 0.8em; }
314 | .swal2-popup.swal2-toast .swal2-close {
315 | position: initial;
316 | width: 0.8em;
317 | height: 0.8em;
318 | line-height: 0.8; }
319 | .swal2-popup.swal2-toast .swal2-content {
320 | justify-content: flex-start;
321 | font-size: 1em; }
322 | .swal2-popup.swal2-toast .swal2-icon {
323 | width: 2em;
324 | min-width: 2em;
325 | height: 2em;
326 | margin: 0; }
327 | .swal2-popup.swal2-toast .swal2-icon-text {
328 | font-size: 2em;
329 | font-weight: bold;
330 | line-height: 1em; }
331 | .swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring {
332 | width: 2em;
333 | height: 2em; }
334 | .swal2-popup.swal2-toast .swal2-icon.swal2-error [class^='swal2-x-mark-line'] {
335 | top: .875em;
336 | width: 1.375em; }
337 | .swal2-popup.swal2-toast .swal2-icon.swal2-error [class^='swal2-x-mark-line'][class$='left'] {
338 | left: .3125em; }
339 | .swal2-popup.swal2-toast .swal2-icon.swal2-error [class^='swal2-x-mark-line'][class$='right'] {
340 | right: .3125em; }
341 | .swal2-popup.swal2-toast .swal2-actions {
342 | height: auto;
343 | margin: 0 .3125em; }
344 | .swal2-popup.swal2-toast .swal2-styled {
345 | margin: 0 .3125em;
346 | padding: .3125em .625em;
347 | font-size: 1em; }
348 | .swal2-popup.swal2-toast .swal2-styled:focus {
349 | box-shadow: 0 0 0 0.0625em #fff, 0 0 0 0.125em rgba(50, 100, 150, 0.4); }
350 | .swal2-popup.swal2-toast .swal2-success {
351 | border-color: #a5dc86; }
352 | .swal2-popup.swal2-toast .swal2-success [class^='swal2-success-circular-line'] {
353 | position: absolute;
354 | width: 2em;
355 | height: 2.8125em;
356 | -webkit-transform: rotate(45deg);
357 | transform: rotate(45deg);
358 | border-radius: 50%; }
359 | .swal2-popup.swal2-toast .swal2-success [class^='swal2-success-circular-line'][class$='left'] {
360 | top: -.25em;
361 | left: -.9375em;
362 | -webkit-transform: rotate(-45deg);
363 | transform: rotate(-45deg);
364 | -webkit-transform-origin: 2em 2em;
365 | transform-origin: 2em 2em;
366 | border-radius: 4em 0 0 4em; }
367 | .swal2-popup.swal2-toast .swal2-success [class^='swal2-success-circular-line'][class$='right'] {
368 | top: -.25em;
369 | left: .9375em;
370 | -webkit-transform-origin: 0 2em;
371 | transform-origin: 0 2em;
372 | border-radius: 0 4em 4em 0; }
373 | .swal2-popup.swal2-toast .swal2-success .swal2-success-ring {
374 | width: 2em;
375 | height: 2em; }
376 | .swal2-popup.swal2-toast .swal2-success .swal2-success-fix {
377 | top: 0;
378 | left: .4375em;
379 | width: .4375em;
380 | height: 2.6875em; }
381 | .swal2-popup.swal2-toast .swal2-success [class^='swal2-success-line'] {
382 | height: .3125em; }
383 | .swal2-popup.swal2-toast .swal2-success [class^='swal2-success-line'][class$='tip'] {
384 | top: 1.125em;
385 | left: .1875em;
386 | width: .75em; }
387 | .swal2-popup.swal2-toast .swal2-success [class^='swal2-success-line'][class$='long'] {
388 | top: .9375em;
389 | right: .1875em;
390 | width: 1.375em; }
391 | .swal2-popup.swal2-toast.swal2-show {
392 | -webkit-animation: showSweetToast .5s;
393 | animation: showSweetToast .5s; }
394 | .swal2-popup.swal2-toast.swal2-hide {
395 | -webkit-animation: hideSweetToast .2s forwards;
396 | animation: hideSweetToast .2s forwards; }
397 | .swal2-popup.swal2-toast .swal2-animate-success-icon .swal2-success-line-tip {
398 | -webkit-animation: animate-toast-success-tip .75s;
399 | animation: animate-toast-success-tip .75s; }
400 | .swal2-popup.swal2-toast .swal2-animate-success-icon .swal2-success-line-long {
401 | -webkit-animation: animate-toast-success-long .75s;
402 | animation: animate-toast-success-long .75s; }
403 |
404 | @-webkit-keyframes showSweetToast {
405 | 0% {
406 | -webkit-transform: translateY(-0.625em) rotateZ(2deg);
407 | transform: translateY(-0.625em) rotateZ(2deg);
408 | opacity: 0; }
409 | 33% {
410 | -webkit-transform: translateY(0) rotateZ(-2deg);
411 | transform: translateY(0) rotateZ(-2deg);
412 | opacity: .5; }
413 | 66% {
414 | -webkit-transform: translateY(0.3125em) rotateZ(2deg);
415 | transform: translateY(0.3125em) rotateZ(2deg);
416 | opacity: .7; }
417 | 100% {
418 | -webkit-transform: translateY(0) rotateZ(0);
419 | transform: translateY(0) rotateZ(0);
420 | opacity: 1; } }
421 |
422 | @keyframes showSweetToast {
423 | 0% {
424 | -webkit-transform: translateY(-0.625em) rotateZ(2deg);
425 | transform: translateY(-0.625em) rotateZ(2deg);
426 | opacity: 0; }
427 | 33% {
428 | -webkit-transform: translateY(0) rotateZ(-2deg);
429 | transform: translateY(0) rotateZ(-2deg);
430 | opacity: .5; }
431 | 66% {
432 | -webkit-transform: translateY(0.3125em) rotateZ(2deg);
433 | transform: translateY(0.3125em) rotateZ(2deg);
434 | opacity: .7; }
435 | 100% {
436 | -webkit-transform: translateY(0) rotateZ(0);
437 | transform: translateY(0) rotateZ(0);
438 | opacity: 1; } }
439 |
440 | @-webkit-keyframes hideSweetToast {
441 | 0% {
442 | opacity: 1; }
443 | 33% {
444 | opacity: .5; }
445 | 100% {
446 | -webkit-transform: rotateZ(1deg);
447 | transform: rotateZ(1deg);
448 | opacity: 0; } }
449 |
450 | @keyframes hideSweetToast {
451 | 0% {
452 | opacity: 1; }
453 | 33% {
454 | opacity: .5; }
455 | 100% {
456 | -webkit-transform: rotateZ(1deg);
457 | transform: rotateZ(1deg);
458 | opacity: 0; } }
459 |
460 | @-webkit-keyframes animate-toast-success-tip {
461 | 0% {
462 | top: .5625em;
463 | left: .0625em;
464 | width: 0; }
465 | 54% {
466 | top: .125em;
467 | left: .125em;
468 | width: 0; }
469 | 70% {
470 | top: .625em;
471 | left: -.25em;
472 | width: 1.625em; }
473 | 84% {
474 | top: 1.0625em;
475 | left: .75em;
476 | width: .5em; }
477 | 100% {
478 | top: 1.125em;
479 | left: .1875em;
480 | width: .75em; } }
481 |
482 | @keyframes animate-toast-success-tip {
483 | 0% {
484 | top: .5625em;
485 | left: .0625em;
486 | width: 0; }
487 | 54% {
488 | top: .125em;
489 | left: .125em;
490 | width: 0; }
491 | 70% {
492 | top: .625em;
493 | left: -.25em;
494 | width: 1.625em; }
495 | 84% {
496 | top: 1.0625em;
497 | left: .75em;
498 | width: .5em; }
499 | 100% {
500 | top: 1.125em;
501 | left: .1875em;
502 | width: .75em; } }
503 |
504 | @-webkit-keyframes animate-toast-success-long {
505 | 0% {
506 | top: 1.625em;
507 | right: 1.375em;
508 | width: 0; }
509 | 65% {
510 | top: 1.25em;
511 | right: .9375em;
512 | width: 0; }
513 | 84% {
514 | top: .9375em;
515 | right: 0;
516 | width: 1.125em; }
517 | 100% {
518 | top: .9375em;
519 | right: .1875em;
520 | width: 1.375em; } }
521 |
522 | @keyframes animate-toast-success-long {
523 | 0% {
524 | top: 1.625em;
525 | right: 1.375em;
526 | width: 0; }
527 | 65% {
528 | top: 1.25em;
529 | right: .9375em;
530 | width: 0; }
531 | 84% {
532 | top: .9375em;
533 | right: 0;
534 | width: 1.125em; }
535 | 100% {
536 | top: .9375em;
537 | right: .1875em;
538 | width: 1.375em; } }
539 |
540 | body.swal2-shown {
541 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
542 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */ }
543 | body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) {
544 | overflow: hidden; }
545 |
546 | body.swal2-height-auto {
547 | height: auto !important; }
548 |
549 | body.swal2-no-backdrop .swal2-shown {
550 | top: auto;
551 | right: auto;
552 | bottom: auto;
553 | left: auto;
554 | background-color: transparent; }
555 | body.swal2-no-backdrop .swal2-shown > .swal2-modal {
556 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.4); }
557 | body.swal2-no-backdrop .swal2-shown.swal2-top {
558 | top: 0;
559 | left: 50%;
560 | -webkit-transform: translateX(-50%);
561 | transform: translateX(-50%); }
562 | body.swal2-no-backdrop .swal2-shown.swal2-top-start, body.swal2-no-backdrop .swal2-shown.swal2-top-left {
563 | top: 0;
564 | left: 0; }
565 | body.swal2-no-backdrop .swal2-shown.swal2-top-end, body.swal2-no-backdrop .swal2-shown.swal2-top-right {
566 | top: 0;
567 | right: 0; }
568 | body.swal2-no-backdrop .swal2-shown.swal2-center {
569 | top: 50%;
570 | left: 50%;
571 | -webkit-transform: translate(-50%, -50%);
572 | transform: translate(-50%, -50%); }
573 | body.swal2-no-backdrop .swal2-shown.swal2-center-start, body.swal2-no-backdrop .swal2-shown.swal2-center-left {
574 | top: 50%;
575 | left: 0;
576 | -webkit-transform: translateY(-50%);
577 | transform: translateY(-50%); }
578 | body.swal2-no-backdrop .swal2-shown.swal2-center-end, body.swal2-no-backdrop .swal2-shown.swal2-center-right {
579 | top: 50%;
580 | right: 0;
581 | -webkit-transform: translateY(-50%);
582 | transform: translateY(-50%); }
583 | body.swal2-no-backdrop .swal2-shown.swal2-bottom {
584 | bottom: 0;
585 | left: 50%;
586 | -webkit-transform: translateX(-50%);
587 | transform: translateX(-50%); }
588 | body.swal2-no-backdrop .swal2-shown.swal2-bottom-start, body.swal2-no-backdrop .swal2-shown.swal2-bottom-left {
589 | bottom: 0;
590 | left: 0; }
591 | body.swal2-no-backdrop .swal2-shown.swal2-bottom-end, body.swal2-no-backdrop .swal2-shown.swal2-bottom-right {
592 | right: 0;
593 | bottom: 0; }
594 |
595 | .swal2-container {
596 | display: flex;
597 | position: fixed;
598 | top: 0;
599 | right: 0;
600 | bottom: 0;
601 | left: 0;
602 | flex-direction: row;
603 | align-items: center;
604 | justify-content: center;
605 | padding: 10px;
606 | background-color: transparent;
607 | z-index: 1060;
608 | overflow-x: hidden;
609 | -webkit-overflow-scrolling: touch;
610 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
611 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
612 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
613 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
614 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
615 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
616 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
617 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
618 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
619 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
620 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
621 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
622 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
623 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
624 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */ }
625 | .swal2-container.swal2-top {
626 | align-items: flex-start; }
627 | .swal2-container.swal2-top-start, .swal2-container.swal2-top-left {
628 | align-items: flex-start;
629 | justify-content: flex-start; }
630 | .swal2-container.swal2-top-end, .swal2-container.swal2-top-right {
631 | align-items: flex-start;
632 | justify-content: flex-end; }
633 | .swal2-container.swal2-center {
634 | align-items: center; }
635 | .swal2-container.swal2-center-start, .swal2-container.swal2-center-left {
636 | align-items: center;
637 | justify-content: flex-start; }
638 | .swal2-container.swal2-center-end, .swal2-container.swal2-center-right {
639 | align-items: center;
640 | justify-content: flex-end; }
641 | .swal2-container.swal2-bottom {
642 | align-items: flex-end; }
643 | .swal2-container.swal2-bottom-start, .swal2-container.swal2-bottom-left {
644 | align-items: flex-end;
645 | justify-content: flex-start; }
646 | .swal2-container.swal2-bottom-end, .swal2-container.swal2-bottom-right {
647 | align-items: flex-end;
648 | justify-content: flex-end; }
649 | .swal2-container.swal2-bottom > :first-child,
650 | .swal2-container.swal2-bottom-start > :first-child,
651 | .swal2-container.swal2-bottom-left > :first-child,
652 | .swal2-container.swal2-bottom-end > :first-child,
653 | .swal2-container.swal2-bottom-right > :first-child {
654 | margin-top: auto; }
655 | .swal2-container.swal2-grow-fullscreen > .swal2-modal {
656 | display: flex !important;
657 | flex: 1;
658 | align-self: stretch;
659 | justify-content: center; }
660 | .swal2-container.swal2-grow-row > .swal2-modal {
661 | display: flex !important;
662 | flex: 1;
663 | align-content: center;
664 | justify-content: center; }
665 | .swal2-container.swal2-grow-column {
666 | flex: 1;
667 | flex-direction: column; }
668 | .swal2-container.swal2-grow-column.swal2-top, .swal2-container.swal2-grow-column.swal2-center, .swal2-container.swal2-grow-column.swal2-bottom {
669 | align-items: center; }
670 | .swal2-container.swal2-grow-column.swal2-top-start, .swal2-container.swal2-grow-column.swal2-center-start, .swal2-container.swal2-grow-column.swal2-bottom-start, .swal2-container.swal2-grow-column.swal2-top-left, .swal2-container.swal2-grow-column.swal2-center-left, .swal2-container.swal2-grow-column.swal2-bottom-left {
671 | align-items: flex-start; }
672 | .swal2-container.swal2-grow-column.swal2-top-end, .swal2-container.swal2-grow-column.swal2-center-end, .swal2-container.swal2-grow-column.swal2-bottom-end, .swal2-container.swal2-grow-column.swal2-top-right, .swal2-container.swal2-grow-column.swal2-center-right, .swal2-container.swal2-grow-column.swal2-bottom-right {
673 | align-items: flex-end; }
674 | .swal2-container.swal2-grow-column > .swal2-modal {
675 | display: flex !important;
676 | flex: 1;
677 | align-content: center;
678 | justify-content: center; }
679 | .swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen) > .swal2-modal {
680 | margin: auto; }
681 | @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
682 | .swal2-container .swal2-modal {
683 | margin: 0 !important; } }
684 | .swal2-container.swal2-fade {
685 | transition: background-color .1s; }
686 | .swal2-container.swal2-shown {
687 | background-color: rgba(0, 0, 0, 0.4); }
688 |
689 | .swal2-popup {
690 | display: none;
691 | position: relative;
692 | flex-direction: column;
693 | justify-content: center;
694 | width: 32em;
695 | max-width: 100%;
696 | padding: 1.25em;
697 | border-radius: 0.3125em;
698 | background: #fff;
699 | font-family: inherit;
700 | font-size: 1rem;
701 | box-sizing: border-box; }
702 | .swal2-popup:focus {
703 | outline: none; }
704 | .swal2-popup.swal2-loading {
705 | overflow-y: hidden; }
706 | .swal2-popup .swal2-header {
707 | display: flex;
708 | flex-direction: column;
709 | align-items: center; }
710 | .swal2-popup .swal2-title {
711 | display: block;
712 | position: relative;
713 | max-width: 100%;
714 | margin: 0 0 0.4em;
715 | padding: 0;
716 | color: #595959;
717 | font-size: 1.875em;
718 | font-weight: 600;
719 | text-align: center;
720 | text-transform: none;
721 | word-wrap: break-word; }
722 | .swal2-popup .swal2-actions {
723 | flex-wrap: wrap;
724 | align-items: center;
725 | justify-content: center;
726 | margin: 1.25em auto 0;
727 | z-index: 1; }
728 | .swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled[disabled] {
729 | opacity: .4; }
730 | .swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled:hover {
731 | background-image: linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1)); }
732 | .swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled:active {
733 | background-image: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)); }
734 | .swal2-popup .swal2-actions.swal2-loading .swal2-styled.swal2-confirm {
735 | width: 2.5em;
736 | height: 2.5em;
737 | margin: .46875em;
738 | padding: 0;
739 | border: .25em solid transparent;
740 | border-radius: 100%;
741 | border-color: transparent;
742 | background-color: transparent !important;
743 | color: transparent;
744 | cursor: default;
745 | box-sizing: border-box;
746 | -webkit-animation: swal2-rotate-loading 1.5s linear 0s infinite normal;
747 | animation: swal2-rotate-loading 1.5s linear 0s infinite normal;
748 | -webkit-user-select: none;
749 | -moz-user-select: none;
750 | -ms-user-select: none;
751 | user-select: none; }
752 | .swal2-popup .swal2-actions.swal2-loading .swal2-styled.swal2-cancel {
753 | margin-right: 30px;
754 | margin-left: 30px; }
755 | .swal2-popup .swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after {
756 | display: inline-block;
757 | width: 15px;
758 | height: 15px;
759 | margin-left: 5px;
760 | border: 3px solid #999999;
761 | border-radius: 50%;
762 | border-right-color: transparent;
763 | box-shadow: 1px 1px 1px #fff;
764 | content: '';
765 | -webkit-animation: swal2-rotate-loading 1.5s linear 0s infinite normal;
766 | animation: swal2-rotate-loading 1.5s linear 0s infinite normal; }
767 | .swal2-popup .swal2-styled {
768 | margin: .3125em;
769 | padding: .625em 2em;
770 | font-weight: 500;
771 | box-shadow: none; }
772 | .swal2-popup .swal2-styled:not([disabled]) {
773 | cursor: pointer; }
774 | .swal2-popup .swal2-styled.swal2-confirm {
775 | border: 0;
776 | border-radius: 0.25em;
777 | background: initial;
778 | background-color: #3085d6;
779 | color: #fff;
780 | font-size: 1.0625em; }
781 | .swal2-popup .swal2-styled.swal2-cancel {
782 | border: 0;
783 | border-radius: 0.25em;
784 | background: initial;
785 | background-color: #aaa;
786 | color: #fff;
787 | font-size: 1.0625em; }
788 | .swal2-popup .swal2-styled:focus {
789 | outline: none;
790 | box-shadow: 0 0 0 2px #fff, 0 0 0 4px rgba(50, 100, 150, 0.4); }
791 | .swal2-popup .swal2-styled::-moz-focus-inner {
792 | border: 0; }
793 | .swal2-popup .swal2-footer {
794 | justify-content: center;
795 | margin: 1.25em 0 0;
796 | padding: 1em 0 0;
797 | border-top: 1px solid #eee;
798 | color: #545454;
799 | font-size: 1em; }
800 | .swal2-popup .swal2-image {
801 | max-width: 100%;
802 | margin: 1.25em auto; }
803 | .swal2-popup .swal2-close {
804 | position: absolute;
805 | top: 0;
806 | right: 0;
807 | justify-content: center;
808 | width: 1.2em;
809 | height: 1.2em;
810 | padding: 0;
811 | transition: color 0.1s ease-out;
812 | border: none;
813 | border-radius: 0;
814 | outline: initial;
815 | background: transparent;
816 | color: #cccccc;
817 | font-family: serif;
818 | font-size: 2.5em;
819 | line-height: 1.2;
820 | cursor: pointer;
821 | overflow: hidden; }
822 | .swal2-popup .swal2-close:hover {
823 | -webkit-transform: none;
824 | transform: none;
825 | color: #f27474; }
826 | .swal2-popup > .swal2-input,
827 | .swal2-popup > .swal2-file,
828 | .swal2-popup > .swal2-textarea,
829 | .swal2-popup > .swal2-select,
830 | .swal2-popup > .swal2-radio,
831 | .swal2-popup > .swal2-checkbox {
832 | display: none; }
833 | .swal2-popup .swal2-content {
834 | justify-content: center;
835 | margin: 0;
836 | padding: 0;
837 | color: #545454;
838 | font-size: 1.125em;
839 | font-weight: 300;
840 | line-height: normal;
841 | z-index: 1;
842 | word-wrap: break-word; }
843 | .swal2-popup #swal2-content {
844 | text-align: center; }
845 | .swal2-popup .swal2-input,
846 | .swal2-popup .swal2-file,
847 | .swal2-popup .swal2-textarea,
848 | .swal2-popup .swal2-select,
849 | .swal2-popup .swal2-radio,
850 | .swal2-popup .swal2-checkbox {
851 | margin: 1em auto; }
852 | .swal2-popup .swal2-input,
853 | .swal2-popup .swal2-file,
854 | .swal2-popup .swal2-textarea {
855 | width: 100%;
856 | transition: border-color .3s, box-shadow .3s;
857 | border: 1px solid #d9d9d9;
858 | border-radius: 0.1875em;
859 | background: inherit;
860 | font-size: 1.125em;
861 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06);
862 | box-sizing: border-box; }
863 | .swal2-popup .swal2-input.swal2-inputerror,
864 | .swal2-popup .swal2-file.swal2-inputerror,
865 | .swal2-popup .swal2-textarea.swal2-inputerror {
866 | border-color: #f27474 !important;
867 | box-shadow: 0 0 2px #f27474 !important; }
868 | .swal2-popup .swal2-input:focus,
869 | .swal2-popup .swal2-file:focus,
870 | .swal2-popup .swal2-textarea:focus {
871 | border: 1px solid #b4dbed;
872 | outline: none;
873 | box-shadow: 0 0 3px #c4e6f5; }
874 | .swal2-popup .swal2-input::-webkit-input-placeholder,
875 | .swal2-popup .swal2-file::-webkit-input-placeholder,
876 | .swal2-popup .swal2-textarea::-webkit-input-placeholder {
877 | color: #cccccc; }
878 | .swal2-popup .swal2-input:-ms-input-placeholder,
879 | .swal2-popup .swal2-file:-ms-input-placeholder,
880 | .swal2-popup .swal2-textarea:-ms-input-placeholder {
881 | color: #cccccc; }
882 | .swal2-popup .swal2-input::-ms-input-placeholder,
883 | .swal2-popup .swal2-file::-ms-input-placeholder,
884 | .swal2-popup .swal2-textarea::-ms-input-placeholder {
885 | color: #cccccc; }
886 | .swal2-popup .swal2-input::placeholder,
887 | .swal2-popup .swal2-file::placeholder,
888 | .swal2-popup .swal2-textarea::placeholder {
889 | color: #cccccc; }
890 | .swal2-popup .swal2-range {
891 | margin: 1em auto;
892 | background: inherit; }
893 | .swal2-popup .swal2-range input {
894 | width: 80%; }
895 | .swal2-popup .swal2-range output {
896 | width: 20%;
897 | font-weight: 600;
898 | text-align: center; }
899 | .swal2-popup .swal2-range input,
900 | .swal2-popup .swal2-range output {
901 | height: 2.625em;
902 | padding: 0;
903 | font-size: 1.125em;
904 | line-height: 2.625em; }
905 | .swal2-popup .swal2-input {
906 | height: 2.625em;
907 | padding: 0 0.75em; }
908 | .swal2-popup .swal2-input[type='number'] {
909 | max-width: 10em; }
910 | .swal2-popup .swal2-file {
911 | background: inherit;
912 | font-size: 1.125em; }
913 | .swal2-popup .swal2-textarea {
914 | height: 6.75em;
915 | padding: 0.75em; }
916 | .swal2-popup .swal2-select {
917 | min-width: 50%;
918 | max-width: 100%;
919 | padding: .375em .625em;
920 | background: inherit;
921 | color: #545454;
922 | font-size: 1.125em; }
923 | .swal2-popup .swal2-radio,
924 | .swal2-popup .swal2-checkbox {
925 | align-items: center;
926 | justify-content: center;
927 | background: inherit; }
928 | .swal2-popup .swal2-radio label,
929 | .swal2-popup .swal2-checkbox label {
930 | margin: 0 .6em;
931 | font-size: 1.125em; }
932 | .swal2-popup .swal2-radio input,
933 | .swal2-popup .swal2-checkbox input {
934 | margin: 0 .4em; }
935 | .swal2-popup .swal2-validation-message {
936 | display: none;
937 | align-items: center;
938 | justify-content: center;
939 | padding: 0.625em;
940 | background: #f0f0f0;
941 | color: #666666;
942 | font-size: 1em;
943 | font-weight: 300;
944 | overflow: hidden; }
945 | .swal2-popup .swal2-validation-message::before {
946 | display: inline-block;
947 | width: 1.5em;
948 | min-width: 1.5em;
949 | height: 1.5em;
950 | margin: 0 .625em;
951 | border-radius: 50%;
952 | background-color: #f27474;
953 | color: #fff;
954 | font-weight: 600;
955 | line-height: 1.5em;
956 | text-align: center;
957 | content: '!';
958 | zoom: normal; }
959 |
960 | @supports (-ms-accelerator: true) {
961 | .swal2-range input {
962 | width: 100% !important; }
963 | .swal2-range output {
964 | display: none; } }
965 |
966 | @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
967 | .swal2-range input {
968 | width: 100% !important; }
969 | .swal2-range output {
970 | display: none; } }
971 |
972 | @-moz-document url-prefix() {
973 | .swal2-close:focus {
974 | outline: 2px solid rgba(50, 100, 150, 0.4); } }
975 |
976 | .swal2-icon {
977 | position: relative;
978 | justify-content: center;
979 | width: 5em;
980 | height: 5em;
981 | margin: 1.25em auto 1.875em;
982 | border: .25em solid transparent;
983 | border-radius: 50%;
984 | line-height: 5em;
985 | cursor: default;
986 | box-sizing: content-box;
987 | -webkit-user-select: none;
988 | -moz-user-select: none;
989 | -ms-user-select: none;
990 | user-select: none;
991 | zoom: normal; }
992 | .swal2-icon-text {
993 | font-size: 3.75em; }
994 | .swal2-icon.swal2-error {
995 | border-color: #f27474; }
996 | .swal2-icon.swal2-error .swal2-x-mark {
997 | position: relative;
998 | flex-grow: 1; }
999 | .swal2-icon.swal2-error [class^='swal2-x-mark-line'] {
1000 | display: block;
1001 | position: absolute;
1002 | top: 2.3125em;
1003 | width: 2.9375em;
1004 | height: .3125em;
1005 | border-radius: .125em;
1006 | background-color: #f27474; }
1007 | .swal2-icon.swal2-error [class^='swal2-x-mark-line'][class$='left'] {
1008 | left: 1.0625em;
1009 | -webkit-transform: rotate(45deg);
1010 | transform: rotate(45deg); }
1011 | .swal2-icon.swal2-error [class^='swal2-x-mark-line'][class$='right'] {
1012 | right: 1em;
1013 | -webkit-transform: rotate(-45deg);
1014 | transform: rotate(-45deg); }
1015 | .swal2-icon.swal2-warning {
1016 | border-color: #facea8;
1017 | color: #f8bb86; }
1018 | .swal2-icon.swal2-info {
1019 | border-color: #9de0f6;
1020 | color: #3fc3ee; }
1021 | .swal2-icon.swal2-question {
1022 | border-color: #c9dae1;
1023 | color: #87adbd; }
1024 | .swal2-icon.swal2-success {
1025 | border-color: #a5dc86; }
1026 | .swal2-icon.swal2-success [class^='swal2-success-circular-line'] {
1027 | position: absolute;
1028 | width: 3.75em;
1029 | height: 7.5em;
1030 | -webkit-transform: rotate(45deg);
1031 | transform: rotate(45deg);
1032 | border-radius: 50%; }
1033 | .swal2-icon.swal2-success [class^='swal2-success-circular-line'][class$='left'] {
1034 | top: -.4375em;
1035 | left: -2.0635em;
1036 | -webkit-transform: rotate(-45deg);
1037 | transform: rotate(-45deg);
1038 | -webkit-transform-origin: 3.75em 3.75em;
1039 | transform-origin: 3.75em 3.75em;
1040 | border-radius: 7.5em 0 0 7.5em; }
1041 | .swal2-icon.swal2-success [class^='swal2-success-circular-line'][class$='right'] {
1042 | top: -.6875em;
1043 | left: 1.875em;
1044 | -webkit-transform: rotate(-45deg);
1045 | transform: rotate(-45deg);
1046 | -webkit-transform-origin: 0 3.75em;
1047 | transform-origin: 0 3.75em;
1048 | border-radius: 0 7.5em 7.5em 0; }
1049 | .swal2-icon.swal2-success .swal2-success-ring {
1050 | position: absolute;
1051 | top: -.25em;
1052 | left: -.25em;
1053 | width: 100%;
1054 | height: 100%;
1055 | border: 0.25em solid rgba(165, 220, 134, 0.3);
1056 | border-radius: 50%;
1057 | z-index: 2;
1058 | box-sizing: content-box; }
1059 | .swal2-icon.swal2-success .swal2-success-fix {
1060 | position: absolute;
1061 | top: .5em;
1062 | left: 1.625em;
1063 | width: .4375em;
1064 | height: 5.625em;
1065 | -webkit-transform: rotate(-45deg);
1066 | transform: rotate(-45deg);
1067 | z-index: 1; }
1068 | .swal2-icon.swal2-success [class^='swal2-success-line'] {
1069 | display: block;
1070 | position: absolute;
1071 | height: .3125em;
1072 | border-radius: .125em;
1073 | background-color: #a5dc86;
1074 | z-index: 2; }
1075 | .swal2-icon.swal2-success [class^='swal2-success-line'][class$='tip'] {
1076 | top: 2.875em;
1077 | left: .875em;
1078 | width: 1.5625em;
1079 | -webkit-transform: rotate(45deg);
1080 | transform: rotate(45deg); }
1081 | .swal2-icon.swal2-success [class^='swal2-success-line'][class$='long'] {
1082 | top: 2.375em;
1083 | right: .5em;
1084 | width: 2.9375em;
1085 | -webkit-transform: rotate(-45deg);
1086 | transform: rotate(-45deg); }
1087 |
1088 | .swal2-progress-steps {
1089 | align-items: center;
1090 | margin: 0 0 1.25em;
1091 | padding: 0;
1092 | background: inherit;
1093 | font-weight: 600; }
1094 | .swal2-progress-steps li {
1095 | display: inline-block;
1096 | position: relative; }
1097 | .swal2-progress-steps .swal2-progress-step {
1098 | width: 2em;
1099 | height: 2em;
1100 | border-radius: 2em;
1101 | background: #3085d6;
1102 | color: #fff;
1103 | line-height: 2em;
1104 | text-align: center;
1105 | z-index: 20; }
1106 | .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step {
1107 | background: #3085d6; }
1108 | .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step {
1109 | background: #add8e6;
1110 | color: #fff; }
1111 | .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step-line {
1112 | background: #add8e6; }
1113 | .swal2-progress-steps .swal2-progress-step-line {
1114 | width: 2.5em;
1115 | height: .4em;
1116 | margin: 0 -1px;
1117 | background: #3085d6;
1118 | z-index: 10; }
1119 |
1120 | [class^='swal2'] {
1121 | -webkit-tap-highlight-color: transparent; }
1122 |
1123 | .swal2-show {
1124 | -webkit-animation: swal2-show 0.3s;
1125 | animation: swal2-show 0.3s; }
1126 | .swal2-show.swal2-noanimation {
1127 | -webkit-animation: none;
1128 | animation: none; }
1129 |
1130 | .swal2-hide {
1131 | -webkit-animation: swal2-hide 0.15s forwards;
1132 | animation: swal2-hide 0.15s forwards; }
1133 | .swal2-hide.swal2-noanimation {
1134 | -webkit-animation: none;
1135 | animation: none; }
1136 |
1137 | .swal2-rtl .swal2-close {
1138 | right: auto;
1139 | left: 0; }
1140 |
1141 | .swal2-animate-success-icon .swal2-success-line-tip {
1142 | -webkit-animation: swal2-animate-success-line-tip 0.75s;
1143 | animation: swal2-animate-success-line-tip 0.75s; }
1144 |
1145 | .swal2-animate-success-icon .swal2-success-line-long {
1146 | -webkit-animation: swal2-animate-success-line-long 0.75s;
1147 | animation: swal2-animate-success-line-long 0.75s; }
1148 |
1149 | .swal2-animate-success-icon .swal2-success-circular-line-right {
1150 | -webkit-animation: swal2-rotate-success-circular-line 4.25s ease-in;
1151 | animation: swal2-rotate-success-circular-line 4.25s ease-in; }
1152 |
1153 | .swal2-animate-error-icon {
1154 | -webkit-animation: swal2-animate-error-icon 0.5s;
1155 | animation: swal2-animate-error-icon 0.5s; }
1156 | .swal2-animate-error-icon .swal2-x-mark {
1157 | -webkit-animation: swal2-animate-error-x-mark 0.5s;
1158 | animation: swal2-animate-error-x-mark 0.5s; }
1159 |
1160 | @-webkit-keyframes swal2-rotate-loading {
1161 | 0% {
1162 | -webkit-transform: rotate(0deg);
1163 | transform: rotate(0deg); }
1164 | 100% {
1165 | -webkit-transform: rotate(360deg);
1166 | transform: rotate(360deg); } }
1167 |
1168 | @keyframes swal2-rotate-loading {
1169 | 0% {
1170 | -webkit-transform: rotate(0deg);
1171 | transform: rotate(0deg); }
1172 | 100% {
1173 | -webkit-transform: rotate(360deg);
1174 | transform: rotate(360deg); } }
1175 |
1176 | @media print {
1177 | body.swal2-shown {
1178 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */
1179 | /* stylelint-disable-line scss/no-duplicate-dollar-variables */ }
1180 | body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) {
1181 | overflow-y: scroll !important; }
1182 | body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) > [aria-hidden='true'] {
1183 | display: none; }
1184 | body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container {
1185 | position: initial !important; } }
1186 |
--------------------------------------------------------------------------------
/src/images/discord.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudukiak/DiSpeak/7322d4358eb44ddb4a66b39e582e43a80003d7e0/src/images/discord.png
--------------------------------------------------------------------------------
/src/images/discord_red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudukiak/DiSpeak/7322d4358eb44ddb4a66b39e582e43a80003d7e0/src/images/discord_red.png
--------------------------------------------------------------------------------
/src/images/group.svg:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/src/images/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudukiak/DiSpeak/7322d4358eb44ddb4a66b39e582e43a80003d7e0/src/images/icon.ico
--------------------------------------------------------------------------------
/src/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudukiak/DiSpeak/7322d4358eb44ddb4a66b39e582e43a80003d7e0/src/images/icon.png
--------------------------------------------------------------------------------
/src/images/icon.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/icon_group.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/src/images/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudukiak/DiSpeak/7322d4358eb44ddb4a66b39e582e43a80003d7e0/src/images/loading.gif
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
12 | DiSpeak
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
32 |
33 | notifications
34 |
35 |
38 |
41 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
57 |
58 |
61 |
62 |
63 |
77 |
78 |
79 |
80 |
81 |
ウィンドウの「閉じる(close)」の設定Onでアプリを終了する。Offでウィンドウを閉じる。
82 |
83 |
84 |
85 |
86 |
ウィンドウのサイズ・位置を保存する?
87 |
88 |
89 |
90 |
94 |
95 |
96 |
エラーログを自動送信する?
ログは匿名の状態で送信されます。
97 |
98 |
99 |
100 |
101 |
DiSpeakの起動と同時に読み上げを開始する?棒読みちゃんも自動的に起動します。
102 |
103 |
104 |
105 |
106 |
自分のチャットを読み上げる?
107 |
108 |
109 |
110 |
111 |
自分以外のチャットを読み上げる?
112 |
113 |
114 |
115 |
116 |
BOTのチャットを読み上げる?
117 |
118 |
119 |
120 |
121 |
参加していないボイスチャンネルの通知をする?
122 |
123 |
124 |
125 |
126 |
ホワイトリストを利用する?Onで利用する。Offで利用しない。
127 |
128 |
129 |
130 |
131 |
132 |
メンション設定以下の文章を先頭に付けて表示&読み上げます。
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
ログに画像を表示させる?
166 |
167 |
168 |
169 |
170 |
ログに送信されたファイル一覧を表示させる?
171 |
172 |
173 |
174 |
175 |
176 |
ファイルを読み上げる?以下の文章を末尾に付けて読み上げます。
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 | -
190 |
191 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
スポイラー(ネタバレタグ)の設定Onで表示&読み上げ。Offで非表示&以下の文章に置換。
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
「再接続をします」の通知を表示させる?
265 |
266 |
267 |
268 |
269 |
通知の表示方法
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 | ※一部の通知はDiSpeak側での表示になります
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
315 |
316 |
317 |
318 |
319 |
320 |
テンプレート - ログ
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
テンプレート - 棒読みちゃん
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
棒読みちゃん
341 |
364 |
367 |
368 |
369 |
370 |
371 |
372 |
テンプレート - ログ
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
テンプレート - 棒読みちゃん
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
棒読みちゃん
393 |
416 |
419 |
420 |
421 |
422 |
423 |
424 |
テンプレート - ログ
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
テンプレート - 棒読みちゃん
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
棒読みちゃん
499 |
522 |
525 |
526 |
527 |
528 |
531 |
532 |
533 |
534 |
基本設定
535 |
536 |
537 |
538 | 棒読みちゃんの実行ファイルを選択してください。
539 |
540 |
541 |
542 |
543 |
544 |
545 |
546 |
通信設定
547 |
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
Socket通信
557 |
558 |
559 |
560 |
561 |
562 |
563 |
564 |
565 |
566 |
567 |
568 |
569 |
570 |
571 |
572 |
573 |
574 |
575 |
576 |
577 |
578 |
HTTP通信
579 |
580 |
581 |
582 |
583 |
584 |
585 |
586 |
587 |
588 |
589 |
590 |
591 |
592 |
593 |
594 | 特定のユーザーをブラックリストに追加することで「全てのチャット」と「サーバーのボイスチャンネル」の通知を読ませない・ログを表示させないことができます。
595 |
596 |
599 |
600 |
601 |
602 |
読み込み中です
603 |
しばらくお待ちください
604 |
605 |
610 |
615 |
621 |
626 |
627 |
628 |
629 |
630 |
631 |
632 |
633 |
634 | 特定のユーザーをホワイトリストに追加することで、該当ユーザーのみ「全てのチャット」と「サーバーのボイスチャンネル」の通知を読ませる・ログを表示させることができます。
635 |
636 |
639 |
640 |
641 |
642 |
読み込み中です
643 |
しばらくお待ちください
644 |
645 |
650 |
655 |
661 |
666 |
667 |
668 |
669 |
670 |
671 |
672 |
673 |
674 |
675 | NGワードを追加することで、該当するワードが入力されているチャットを読ませない・ログに表示させないことができます。
676 | NGワードは正規表現を利用しない限り「完全一致」です。
677 |
678 |
679 |
684 |
687 |
688 |
689 |
690 |
691 |
692 |
693 |
702 |
703 |
704 |
705 |
706 |
707 |
708 | Wikiを開く |
709 | F1 |
710 |
711 |
712 | リロード |
713 | Ctrl+R |
714 |
715 |
716 | ログの保存 |
717 | Ctrl+S |
718 |
719 |
720 | 最新のバージョンを確認 |
721 | Ctrl+H |
722 |
723 |
724 | ウィンドウを閉じる |
725 | Ctrl+W |
726 |
727 |
728 | 終了する |
729 | Ctrl+Shift+Q |
730 |
731 |
732 |
733 |
734 |
735 |
736 |
テンプレートのキーは「ログ・棒読みちゃん」どちらでも使えます。
「ログ」ではHTMLタグも利用できます。
737 |
803 |
804 |
805 |
808 |
809 |
810 |
811 |
812 |
813 | DiSpeakに関する意見・感想・要望・不具合などありましたら、以下のフォームより投稿してみてください。
814 | 実装する要望・改修する不具合についてはこちらにて確認できます。
815 |
816 |
817 | 匿名で送信してもOKです。
818 | が、TwitterのIDがあればフォローするかもしれません(気まぐれ)。
819 |
820 |
821 |
822 | account_circle
823 |
824 |
825 |
826 |
827 |
828 |
829 |
830 |
831 | mode_edit
832 |
833 |
834 |
835 |
836 |
837 |
838 |
839 |
840 |
841 |
842 |
843 |
844 |
DiSpeak - でぃすぴーく
845 |
846 |
851 |
852 |
858 |
864 |
870 |
876 |
877 |
878 |
879 |
880 | © 2018 micelle
881 |
882 |
883 |
884 |
885 |
886 |
887 |
888 |
889 |
897 |
898 |
903 |
904 |
905 |
906 |
907 |
908 |
Discordへログイン中です
909 |
しばらくお待ちください
910 |
911 |
912 |
913 |
918 |
923 |
929 |
934 |
935 |
936 |
937 |
938 |
939 |
977 |
978 |
979 |
980 |
981 |
982 |
983 |
984 |
985 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | // デスクトップにショートカットアイコン追加
3 | if (require('electron-squirrel-startup')) return;
4 | // モジュールの読み込み
5 | const {app, Menu, Tray, shell, BrowserWindow, dialog, ipcMain, autoUpdater} = require('electron');
6 | const {execFile} = require('child_process');
7 | const fs = require('fs');
8 | const path = require('path');
9 | const packageJson = require('./package.json');
10 | const userData = app.getPath('userData'); // \AppData\Roaming\DiSpeak
11 | // DiSpeakの設定ファイル
12 | const appSetting = `${userData}\\setting.json`;
13 | let appSettingObj = {};
14 | // windowの設定ファイル
15 | const winSetting = `${userData}\\window.json`;
16 | let winSettingObj = (() => {
17 | const res = readFileSync(winSetting);
18 | if (res == null) return {};
19 | return res;
20 | })();
21 | // 変数の指定
22 | const nowVersion = packageJson['version'];
23 | const appName = app.getName();
24 | let mainWindow = null; // メインウィンドウはGCされないようにグローバル宣言
25 | let tray = null;
26 | // 起動時にバージョンのチェックを行う
27 | let updateFirst = true; // 初回の時のみtrue
28 | let updateInterval = false; // 定期アップデートの時のみtrue
29 | let updateDownloaded = false; // ダウンロード済みの場合true
30 | autoUpdater.setFeedURL('https://prfac.com/dispeak/update');
31 | autoUpdateCheck();
32 | setInterval(() => {
33 | autoUpdateCheck('interval');
34 | }, 1000 * 60 * 60);
35 | // バージョンチェック用の関数
36 | function autoUpdateCheck(timing) {
37 | sendDebugLog('[autoUpdateCheck] timing', timing);
38 | sendDebugLog('[autoUpdateCheck] updateInterval', updateInterval);
39 | if (timing == 'interval') updateInterval = true;
40 | // batから起動したときの対策
41 | try {
42 | autoUpdater.checkForUpdates();
43 | } catch (e) {}
44 | }
45 | autoUpdater.on("update-downloaded", () => {
46 | const mesOptions = {
47 | type: 'warning',
48 | buttons: ['する', 'あとで'],
49 | title: '再起動するっす?',
50 | message: '新しいバージョンをダウンロードしたっす!',
51 | detail: '再起動してインストールするっす?\nあとでを選んだときは終了時にインストールするっすよ。'
52 | };
53 | dialog.showMessageBox(mainWindow, mesOptions).then(res => {
54 | if (res.response == 0) {
55 | autoUpdater.quitAndInstall();
56 | } else {
57 | updateDownloaded = true;
58 | }
59 | }).catch(err => {
60 | sendDebugLog('[update-downloaded] showMessageBox err', err);
61 | });
62 | updateFirst = false;
63 | updateInterval = false;
64 | });
65 | autoUpdater.on("update-not-available", () => {
66 | sendDebugLog('[update-not-available] updateFirst', updateFirst);
67 | sendDebugLog('[update-not-available] updateInterval', updateInterval);
68 | if (updateFirst || updateInterval) {
69 | updateFirst = false;
70 | return;
71 | }
72 | // ダウンロードが合った場合(=ダウンロード済み)
73 | else if (updateDownloaded) {
74 | const mesOptions = {
75 | type: 'warning',
76 | buttons: ['する', 'あとで'],
77 | title: '再起動するっす?',
78 | message: '新しいバージョンをダウンロードしたっす!',
79 | detail: '再起動してインストールするっす?\nあとでを選んだときは終了時にインストールするっすよ。'
80 | };
81 | dialog.showMessageBox(mainWindow, mesOptions).then(res => {
82 | if (res.response == 0) autoUpdater.quitAndInstall();
83 | }).catch(err => {
84 | sendDebugLog('[update-not-available] showMessageBox err', err);
85 | });
86 | }
87 | // ダウンロードが無かった場合
88 | else {
89 | const mesOptions = {
90 | type: 'info',
91 | buttons: ['OK'],
92 | title: 'アップデートないっす!',
93 | message: 'おぉ…!!',
94 | detail: '最新のバージョンを使ってるっす。ありがとおぉおおぉっ!!'
95 | };
96 | dialog.showMessageBox(mainWindow, mesOptions);
97 | }
98 | updateInterval = false;
99 | });
100 | autoUpdater.on("error", (e) => {
101 | if (updateFirst || updateInterval) return;
102 | const mesOptions = {
103 | type: 'error',
104 | buttons: ['OK'],
105 | title: 'エラーが発生したっす…',
106 | message: '最新のバージョン取得に失敗しました。',
107 | detail: '時間を置いてからご確認ください。お願いします。'
108 | };
109 | dialog.showMessageBox(mainWindow, mesOptions);
110 | updateFirst = false;
111 | updateInterval = false;
112 | // エラーの送信
113 | const obj = {};
114 | obj.time = whatTimeIsIt(true);
115 | obj.version = nowVersion;
116 | obj.process = 'main';
117 | obj.message = e.message;
118 | obj.stack = e.stack;
119 | const jsn = JSON.stringify(obj);
120 | mainWindow.webContents.send('log-error', jsn);
121 | });
122 | // 多重起動を防ぐ
123 | const gotTheLock = app.requestSingleInstanceLock();
124 | if (!gotTheLock) {
125 | app.quit();
126 | } else {
127 | app.on('second-instance', (event, commandLine, workingDirectory) => {
128 | if (mainWindow) {
129 | if (mainWindow.isMinimized()) mainWindow.restore();
130 | mainWindow.show();
131 | }
132 | });
133 | // Electronの初期化完了後に実行
134 | app.on('ready', () => {
135 | createMainwindow(); // mainWindowの生成
136 | });
137 | }
138 | // 全てのウィンドウが閉じたら終了
139 | app.on('window-all-closed', () => {
140 | if (process.platform != 'darwin') {
141 | app.quit();
142 | }
143 | });
144 | // ------------------------------
145 | // 処理用の関数
146 | // ------------------------------
147 | // メインウィンドウの処理
148 | function createMainwindow() {
149 | // タスクトレイを表示
150 | createTray();
151 | //ウィンドウサイズを設定する
152 | mainWindow = new BrowserWindow({
153 | webPreferences: {
154 | nodeIntegration: true
155 | },
156 | frame: false,
157 | show: false,
158 | width: 960,
159 | height: 540,
160 | minWidth: 768,
161 | minHeight: 432,
162 | icon: `${__dirname}/images/icon.png`,
163 | backgroundColor: '#4a5459'
164 | });
165 | // ウィンドウの準備ができたら表示
166 | mainWindow.once('ready-to-show', () => {
167 | if (!winSettingObj.hide) mainWindow.show();
168 | });
169 | // ウィンドウメニューをカスタマイズ
170 | const template = mainWindowMenu();
171 | const menu = Menu.buildFromTemplate(template)
172 | Menu.setApplicationMenu(menu)
173 | // 使用するhtmlファイルを指定する
174 | mainWindow.loadURL(`file://${__dirname}/index.html`);
175 | // リンクをデフォルトブラウザで開く
176 | mainWindow.webContents.on('new-window', (ev, url) => {
177 | ev.preventDefault();
178 | shell.openExternal(url);
179 | });
180 | // winSettingObjに設定があれば処理する
181 | if (winSettingObj.bounds != null) {
182 | const bounds = winSettingObj.bounds;
183 | if (bounds) mainWindow.setBounds(bounds);
184 | if (winSettingObj.maximized) mainWindow.maximize();
185 | if (winSettingObj.minimized) mainWindow.minimize();
186 | }
187 | // ウィンドウが最大化状態から抜けるとき
188 | mainWindow.on('unmaximize', () => {
189 | mainWindow.webContents.send('resize-textarea');
190 | });
191 | // ウィンドウがリサイズされた後に発生
192 | mainWindow.on('resize', () => {
193 | mainWindow.webContents.send('resize-textarea');
194 | });
195 | // ウィンドウが閉じる時
196 | mainWindow.on('close', () => {
197 | const isMaximized = mainWindow.isMaximized(); // true, false
198 | const isMinimized = mainWindow.isMinimized();
199 | const bounds = mainWindow.getBounds(); // {x:0, y:0, width:0, height:0}
200 | winSettingObj.maximized = isMaximized;
201 | winSettingObj.minimized = isMinimized;
202 | if (isMaximized) {
203 | winSettingObj.bounds = winSettingObj.bounds; // 最大化してるときは変更しない
204 | } else {
205 | winSettingObj.bounds = bounds;
206 | }
207 | const close = objectCheck(appSettingObj, 'dispeak.window');
208 | if (close) writeFileSync(winSetting, winSettingObj);
209 | });
210 | // ウィンドウが閉じられたらアプリも終了
211 | mainWindow.on('closed', () => {
212 | mainWindow = null;
213 | });
214 | // ウィンドウが非表示になるとき
215 | mainWindow.on('hide', () => {
216 | winSettingObj.hide = true;
217 | writeFileSync(winSetting, winSettingObj);
218 | });
219 | // ウィンドウが表示されるとき
220 | mainWindow.on('show', () => {
221 | winSettingObj.hide = false;
222 | writeFileSync(winSetting, winSettingObj);
223 | mainWindow.webContents.send('resize-textarea');
224 | });
225 | }
226 | // タスクトレイ
227 | function createTray() {
228 | tray = new Tray(`${__dirname}/images/icon.png`);
229 | const template = taskTrayMenu();
230 | const menu = Menu.buildFromTemplate(template)
231 | tray.setContextMenu(menu);
232 | tray.setToolTip(`${appName} v${nowVersion}`);
233 | tray.on('click', () => {
234 | mainWindow.show();
235 | });
236 | }
237 | // ファイルの読み込み
238 | function readFileSync(target) {
239 | let res = {};
240 | try {
241 | const data = fs.readFileSync(target, 'utf8');
242 | const ary = JSON.parse(data);
243 | Object.assign(res, ary);
244 | } catch (err) {
245 | return null;
246 | }
247 | return res;
248 | }
249 | // ファイルの書き込み
250 | function writeFileSync(target, data) {
251 | const json = JSON.stringify(data, null, 2);
252 | try {
253 | fs.writeFileSync(target, json, 'utf8');
254 | } catch (err) {
255 | return err.code;
256 | }
257 | return true;
258 | }
259 | // 連想配列にアクセス
260 | function objectCheck(obj, path) {
261 | if (!(obj instanceof Object)) return null;
262 | if (/\./.test(path)) {
263 | path = path.split('.');
264 | } else {
265 | path = [path];
266 | }
267 | let cursor = obj;
268 | for (let i = 0; i < path.length; i++) {
269 | if (cursor[path[i]] == null) return null; // 見つからないときはnullを
270 | cursor = cursor[path[i]]; // 見つかったときはその情報を返す
271 | }
272 | return cursor;
273 | }
274 | // 現在の時刻を取得
275 | function whatTimeIsIt(iso) {
276 | const time = new Date();
277 | const year = time.getFullYear();
278 | const month = zeroPadding(time.getMonth() + 1);
279 | const day = zeroPadding(time.getDate());
280 | const hours = zeroPadding(time.getHours());
281 | const minutes = zeroPadding(time.getMinutes());
282 | const seconds = zeroPadding(time.getSeconds());
283 | const text = (() => {
284 | if (iso == null) return `${year}/${month}/${day} ${hours}:${minutes}`;
285 | if (iso === 'YYYYMMDDThhmmss') return `${year}${month}${day}T${hours}${minutes}${seconds}`;
286 | return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}+0900`;
287 | })();
288 | return text;
289 | }
290 | // ゼロパディング
291 | function zeroPadding(num) {
292 | const str = String(num);
293 | const txt = (() => {
294 | if (str.length == 1) return `0${str}`;
295 | return str;
296 | })();
297 | return txt;
298 | }
299 | // 自動ログイン機能
300 | function setupAutomaticLogin() {
301 | const appFolder = path.dirname(process.execPath);
302 | const updateExe = path.resolve(appFolder, '..', 'Update.exe');
303 | const exeName = path.basename(process.execPath);
304 | const argsSettings = [
305 | '--processStart', `"${exeName}"`,
306 | '--process-start-args', `"--hidden"`
307 | ];
308 | const settingOptions = {
309 | openAtLogin: false,
310 | path: updateExe,
311 | args: argsSettings
312 | }
313 | const loginItemSettings = app.getLoginItemSettings(settingOptions);
314 | const openAtLogin = loginItemSettings.openAtLogin; // true:登録済、false:未登録
315 | const mesOptions = (() => {
316 | if (openAtLogin) {
317 | return {
318 | type: 'warning',
319 | buttons: ['削除する', 'しない'],
320 | title: '削除するっす?',
321 | message: 'スタートアップから削除しちゃうよ?',
322 | detail: 'レジストリからDiSpeakを削除するっす。\nまた登録することもできるっすよ”'
323 | };
324 | } else {
325 | return {
326 | type: 'info',
327 | buttons: ['登録する', 'しない'],
328 | title: '登録するっす?',
329 | message: 'スタートアップに登録しちゃうよ?',
330 | detail: 'レジストリにDiSpeakを自動起動するよう書き込むっす。\nあとで削除もできるっすよ!'
331 | };
332 | }
333 | })();
334 | sendDebugLog('[setupAutomaticLogin] loginItemSettings', loginItemSettings);
335 | dialog.showMessageBox(mainWindow, mesOptions).then(res => {
336 | settingOptions.openAtLogin = !openAtLogin;
337 | sendDebugLog('[setupAutomaticLogin] res', res);
338 | if (res.response !== 0) return;
339 | app.setLoginItemSettings(settingOptions);
340 | }).catch(err => {
341 | sendDebugLog('[setupAutomaticLogin] err', err);
342 | });
343 | }
344 | // デバッグ用
345 | function openDevtools() {
346 | const devtools = new BrowserWindow({
347 | autoHideMenuBar: true,
348 | icon: `${__dirname}/images/icon.png`,
349 | backgroundColor: '#4a5459'
350 | })
351 | mainWindow.webContents.setDevToolsWebContents(devtools.webContents)
352 | mainWindow.webContents.openDevTools({
353 | mode: 'detach'
354 | })
355 | }
356 | // ------------------------------
357 | // レンダラープロセスとのやりとり
358 | // ------------------------------
359 | // 現在のバージョンを返す
360 | ipcMain.on('now-version-check', (event) => {
361 | event.returnValue = nowVersion;
362 | });
363 | // 設定ファイルを返す
364 | ipcMain.on('setting-file-read', (event) => {
365 | appSettingObj = readFileSync(appSetting);
366 | event.returnValue = appSettingObj;
367 | });
368 | // 設定ファイルを保存する
369 | ipcMain.on('setting-file-write', (event, data) => {
370 | appSettingObj = data;
371 | event.returnValue = writeFileSync(appSetting, data);
372 | });
373 | // exeのパスを返す
374 | ipcMain.on('get-path-exe', (event) => {
375 | event.returnValue = app.getPath('exe');
376 | });
377 | // UIの挙動
378 | ipcMain.on('window-minimize', () => {
379 | mainWindow.minimize();
380 | });
381 | ipcMain.on('window-maximize', () => {
382 | if (mainWindow.isMaximized()) {
383 | mainWindow.unmaximize();
384 | } else {
385 | mainWindow.maximize();
386 | }
387 | });
388 | ipcMain.on('window-close', () => {
389 | if (objectCheck(appSettingObj, 'dispeak.close') == null) {
390 | mainWindow.close();
391 | } else if (objectCheck(appSettingObj, 'dispeak.close')) {
392 | mainWindow.close();
393 | } else {
394 | mainWindow.hide();
395 | }
396 | });
397 | // 棒読みちゃんのディレクトリ
398 | ipcMain.on('bouyomi-dir-dialog', (event) => {
399 | const options = {
400 | title: '選択',
401 | filters: [{
402 | name: 'EXE File',
403 | extensions: ['exe']
404 | }],
405 | defaultPath: '.',
406 | properties: ['openFile'],
407 | };
408 | dialog.showOpenDialog(mainWindow, options).then(result => {
409 | if (result.canceled) event.returnValue = null;
410 | const filePaths = result.filePaths;
411 | const filePath = (() => {
412 | if (filePaths == void 0) return '';
413 | return filePaths[0];
414 | })();
415 | event.returnValue = filePath;
416 | }).catch(err => {
417 | sendDebugLog('[showOpenDialog] error', error);
418 | event.returnValue = null;
419 | })
420 | });
421 | ipcMain.on('bouyomi-exe-start', (event, dir) => {
422 | const dirRep = dir.replace(/([%&(,\-;=^ ])/g, '^$1');
423 | const child = execFile('cmd', ['/c', dirRep], {encoding: 'Shift_JIS', env: {'Path': 'C:\\Windows\\system32\\'}}, (error, stdout, stderr) => {
424 | if (error) {
425 | const obj = {};
426 | obj.time = whatTimeIsIt(true);
427 | obj.version = nowVersion;
428 | obj.process = 'main';
429 | obj.message = error.message;
430 | obj.stack = {'stack':error.stack, 'dir':dir, 'dirRep':dirRep, 'process':process.env.Path};
431 | const jsn = JSON.stringify(obj);
432 | mainWindow.webContents.send('log-error', jsn);
433 | sendDebugLog('[execFile] error', error);
434 | }
435 | sendDebugLog('[execFile] stdout', stdout);
436 | sendDebugLog('[execFile] stderr', stderr);
437 | });
438 | const res = (() => {
439 | if (child.pid == null) return false;
440 | return true;
441 | })();
442 | event.returnValue = res;
443 | });
444 | // バージョンチェック
445 | ipcMain.on('version-check', () => {
446 | updateInterval = false;
447 | autoUpdateCheck();
448 | });
449 | // ログアウト処理
450 | ipcMain.on('logout-process', () => {
451 | fs.unlink(appSetting, function(e) {
452 | if (e) {
453 | const obj = {};
454 | obj.time = whatTimeIsIt(true);
455 | obj.version = nowVersion;
456 | obj.process = 'main';
457 | obj.message = e.message;
458 | obj.stack = e.stack;
459 | const jsn = JSON.stringify(obj);
460 | mainWindow.webContents.send('log-error', jsn);
461 | } else {
462 | mainWindow.reload();
463 | }
464 | });
465 | });
466 | // ログの保存
467 | ipcMain.on('saving-log-return', (event, data) => {
468 | const date = whatTimeIsIt('YYYYMMDDThhmmss');
469 | const path = app.getPath('desktop');
470 | const savePath = `${path}\\DiSpeak_${date}`;
471 | dialog.showSaveDialog({
472 | defaultPath: savePath,
473 | filters: [{
474 | name: 'JSON File',
475 | extensions: ['json']
476 | }]
477 | }, filename => {
478 | if (filename) {
479 | fs.writeFile(filename, data, 'utf8', err => {
480 | if (err == null) return;
481 | const obj = {};
482 | obj.time = whatTimeIsIt(true);
483 | obj.version = nowVersion;
484 | obj.process = 'main';
485 | obj.message = err.message;
486 | obj.stack = err.stack;
487 | const jsn = JSON.stringify(obj);
488 | mainWindow.webContents.send('log-error', jsn);
489 | });
490 | }
491 | });
492 | });
493 | // ------------------------------
494 | // その他
495 | // ------------------------------
496 | // エラーの処理
497 | process.on('uncaughtException', (e) => {
498 | const obj = {};
499 | obj.time = whatTimeIsIt(true);
500 | obj.version = nowVersion;
501 | obj.process = 'main';
502 | obj.message = e.message;
503 | obj.stack = e.stack;
504 | const jsn = JSON.stringify(obj);
505 | mainWindow.webContents.send('log-error', jsn);
506 | });
507 | // ログ
508 | function sendDebugLog(title, data) {
509 | if (mainWindow != null) mainWindow.webContents.send('log-debug', title, data);
510 | }
511 | // ウィンドウメニューをカスタマイズ
512 | function mainWindowMenu() {
513 | const template = [{
514 | label: 'メニュー',
515 | submenu: [{
516 | label: 'Wikiを開く',
517 | accelerator: 'F1',
518 | click: () => {
519 | shell.openExternal('https://github.com/micelle/DiSpeak/wiki')
520 | }
521 | },
522 | {
523 | label: 'リロード',
524 | accelerator: 'CmdOrCtrl+R',
525 | click: () => {
526 | mainWindow.reload()
527 | }
528 | },
529 | {
530 | label: 'ログの保存',
531 | accelerator: 'CmdOrCtrl+S',
532 | click: () => {
533 | mainWindow.webContents.send('saving-log-create')
534 | }
535 | },
536 | {
537 | label: '最新のバージョンを確認',
538 | accelerator: 'CmdOrCtrl+H',
539 | click: () => {
540 | autoUpdateCheck()
541 | }
542 | },
543 | {
544 | label: 'ウィンドウを閉じる',
545 | accelerator: 'CmdOrCtrl+W',
546 | click: () => {
547 | mainWindow.hide()
548 | }
549 | },
550 | {
551 | label: '終了する',
552 | accelerator: 'CmdOrCtrl+Shift+Q',
553 | click: () => {
554 | mainWindow.close()
555 | }
556 | },
557 | {
558 | label: 'デバッグ',
559 | accelerator: 'CmdOrCtrl+Shift+I',
560 | click: () => {
561 | //mainWindow.toggleDevTools()
562 | openDevtools()
563 | }
564 | },
565 | {
566 | label: 'エラー',
567 | accelerator: 'CmdOrCtrl+Shift+E',
568 | click: () => {
569 | if (objectCheck(appSettingObj, 'dispeak.debug')) console.log(this_variable_is_error)
570 | }
571 | }
572 | ]
573 | }];
574 | return template;
575 | }
576 |
577 | function taskTrayMenu() {
578 | const template = [{
579 | label: '表示する',
580 | click: () => {
581 | mainWindow.show()
582 | }
583 | },
584 | {
585 | label: 'サイズを元に戻す',
586 | click: () => {
587 | mainWindow.setSize(960, 540), mainWindow.center()
588 | }
589 | },
590 | {
591 | label: 'スタートアップの設定',
592 | click: () => {
593 | setupAutomaticLogin()
594 | }
595 | },
596 | {
597 | type: "separator"
598 | },
599 | {
600 | label: 'Wikiを開く',
601 | click: () => {
602 | shell.openExternal('https://github.com/micelle/dc_DiSpeak/wiki')
603 | }
604 | },
605 | {
606 | type: "separator"
607 | },
608 | {
609 | label: 'Roamingを開く',
610 | click: () => {
611 | shell.openExternal(process.env.APPDATA + '\\DiSpeak')
612 | }
613 | },
614 | {
615 | label: 'Localを開く',
616 | click: () => {
617 | shell.openExternal(process.env.LOCALAPPDATA + '\\DiSpeak')
618 | }
619 | },
620 | {
621 | label: 'DevToolsを開く',
622 | click: () => {
623 | //mainWindow.webContents.openDevTools()
624 | openDevtools()
625 | }
626 | },
627 | {
628 | type: "separator"
629 | },
630 | {
631 | label: 'ログの保存',
632 | click: () => {
633 | mainWindow.webContents.send('saving-log-create')
634 | }
635 | },
636 | {
637 | type: "separator"
638 | },
639 | {
640 | label: '終了する',
641 | click: () => {
642 | mainWindow.close()
643 | }
644 | }
645 | ];
646 | return template;
647 | }
--------------------------------------------------------------------------------
/src/js/twemoji.js:
--------------------------------------------------------------------------------
1 | /*jslint indent: 2, browser: true, bitwise: true, plusplus: true */
2 | var twemoji = (function (
3 | /*! Copyright Twitter Inc. and other contributors. Licensed under MIT *//*
4 | https://github.com/twitter/twemoji/blob/gh-pages/LICENSE
5 | */
6 |
7 | // WARNING: this file is generated automatically via
8 | // `node twemoji-generator.js`
9 | // please update its `createTwemoji` function
10 | // at the bottom of the same file instead.
11 |
12 | ) {
13 | 'use strict';
14 |
15 | /*jshint maxparams:4 */
16 |
17 | var
18 | // the exported module object
19 | twemoji = {
20 |
21 |
22 | /////////////////////////
23 | // properties //
24 | /////////////////////////
25 |
26 | // default assets url, by default will be Twitter Inc. CDN
27 | base: 'https://twemoji.maxcdn.com/2/',
28 |
29 | // default assets file extensions, by default '.png'
30 | ext: '.png',
31 |
32 | // default assets/folder size, by default "72x72"
33 | // available via Twitter CDN: 72
34 | size: '72x72',
35 |
36 | // default class name, by default 'emoji'
37 | className: 'emoji',
38 |
39 | // basic utilities / helpers to convert code points
40 | // to JavaScript surrogates and vice versa
41 | convert: {
42 |
43 | /**
44 | * Given an HEX codepoint, returns UTF16 surrogate pairs.
45 | *
46 | * @param string generic codepoint, i.e. '1F4A9'
47 | * @return string codepoint transformed into utf16 surrogates pair,
48 | * i.e. \uD83D\uDCA9
49 | *
50 | * @example
51 | * twemoji.convert.fromCodePoint('1f1e8');
52 | * // "\ud83c\udde8"
53 | *
54 | * '1f1e8-1f1f3'.split('-').map(twemoji.convert.fromCodePoint).join('')
55 | * // "\ud83c\udde8\ud83c\uddf3"
56 | */
57 | fromCodePoint: fromCodePoint,
58 |
59 | /**
60 | * Given UTF16 surrogate pairs, returns the equivalent HEX codepoint.
61 | *
62 | * @param string generic utf16 surrogates pair, i.e. \uD83D\uDCA9
63 | * @param string optional separator for double code points, default='-'
64 | * @return string utf16 transformed into codepoint, i.e. '1F4A9'
65 | *
66 | * @example
67 | * twemoji.convert.toCodePoint('\ud83c\udde8\ud83c\uddf3');
68 | * // "1f1e8-1f1f3"
69 | *
70 | * twemoji.convert.toCodePoint('\ud83c\udde8\ud83c\uddf3', '~');
71 | * // "1f1e8~1f1f3"
72 | */
73 | toCodePoint: toCodePoint
74 | },
75 |
76 |
77 | /////////////////////////
78 | // methods //
79 | /////////////////////////
80 |
81 | /**
82 | * User first: used to remove missing images
83 | * preserving the original text intent when
84 | * a fallback for network problems is desired.
85 | * Automatically added to Image nodes via DOM
86 | * It could be recycled for string operations via:
87 | * $('img.emoji').on('error', twemoji.onerror)
88 | */
89 | onerror: function onerror() {
90 | if (this.parentNode) {
91 | this.parentNode.replaceChild(createText(this.alt, false), this);
92 | }
93 | },
94 |
95 | /**
96 | * Main method/logic to generate either
tags or HTMLImage nodes.
97 | * "emojify" a generic text or DOM Element.
98 | *
99 | * @overloads
100 | *
101 | * String replacement for `innerHTML` or server side operations
102 | * twemoji.parse(string);
103 | * twemoji.parse(string, Function);
104 | * twemoji.parse(string, Object);
105 | *
106 | * HTMLElement tree parsing for safer operations over existing DOM
107 | * twemoji.parse(HTMLElement);
108 | * twemoji.parse(HTMLElement, Function);
109 | * twemoji.parse(HTMLElement, Object);
110 | *
111 | * @param string|HTMLElement the source to parse and enrich with emoji.
112 | *
113 | * string replace emoji matches with
tags.
114 | * Mainly used to inject emoji via `innerHTML`
115 | * It does **not** parse the string or validate it,
116 | * it simply replaces found emoji with a tag.
117 | * NOTE: be sure this won't affect security.
118 | *
119 | * HTMLElement walk through the DOM tree and find emoji
120 | * that are inside **text node only** (nodeType === 3)
121 | * Mainly used to put emoji in already generated DOM
122 | * without compromising surrounding nodes and
123 | * **avoiding** the usage of `innerHTML`.
124 | * NOTE: Using DOM elements instead of strings should
125 | * improve security without compromising too much
126 | * performance compared with a less safe `innerHTML`.
127 | *
128 | * @param Function|Object [optional]
129 | * either the callback that will be invoked or an object
130 | * with all properties to use per each found emoji.
131 | *
132 | * Function if specified, this will be invoked per each emoji
133 | * that has been found through the RegExp except
134 | * those follwed by the invariant \uFE0E ("as text").
135 | * Once invoked, parameters will be:
136 | *
137 | * iconId:string the lower case HEX code point
138 | * i.e. "1f4a9"
139 | *
140 | * options:Object all info for this parsing operation
141 | *
142 | * variant:char the optional \uFE0F ("as image")
143 | * variant, in case this info
144 | * is anyhow meaningful.
145 | * By default this is ignored.
146 | *
147 | * If such callback will return a falsy value instead
148 | * of a valid `src` to use for the image, nothing will
149 | * actually change for that specific emoji.
150 | *
151 | *
152 | * Object if specified, an object containing the following properties
153 | *
154 | * callback Function the callback to invoke per each found emoji.
155 | * base string the base url, by default twemoji.base
156 | * ext string the image extension, by default twemoji.ext
157 | * size string the assets size, by default twemoji.size
158 | *
159 | * @example
160 | *
161 | * twemoji.parse("I \u2764\uFE0F emoji!");
162 | * // I
emoji!
163 | *
164 | *
165 | * twemoji.parse("I \u2764\uFE0F emoji!", function(iconId, options) {
166 | * return '/assets/' + iconId + '.gif';
167 | * });
168 | * // I
emoji!
169 | *
170 | *
171 | * twemoji.parse("I \u2764\uFE0F emoji!", {
172 | * size: 72,
173 | * callback: function(iconId, options) {
174 | * return '/assets/' + options.size + '/' + iconId + options.ext;
175 | * }
176 | * });
177 | * // I
emoji!
178 | *
179 | */
180 | parse: parse,
181 |
182 | /**
183 | * Given a string, invokes the callback argument
184 | * per each emoji found in such string.
185 | * This is the most raw version used by
186 | * the .parse(string) method itself.
187 | *
188 | * @param string generic string to parse
189 | * @param Function a generic callback that will be
190 | * invoked to replace the content.
191 | * This calback wil receive standard
192 | * String.prototype.replace(str, callback)
193 | * arguments such:
194 | * callback(
195 | * rawText, // the emoji match
196 | * );
197 | *
198 | * and others commonly received via replace.
199 | */
200 | replace: replace,
201 |
202 | /**
203 | * Simplify string tests against emoji.
204 | *
205 | * @param string some text that might contain emoji
206 | * @return boolean true if any emoji was found, false otherwise.
207 | *
208 | * @example
209 | *
210 | * if (twemoji.test(someContent)) {
211 | * console.log("emoji All The Things!");
212 | * }
213 | */
214 | test: test
215 | },
216 |
217 | // used to escape HTML special chars in attributes
218 | escaper = {
219 | '&': '&',
220 | '<': '<',
221 | '>': '>',
222 | "'": ''',
223 | '"': '"'
224 | },
225 |
226 | // RegExp based on emoji's official Unicode standards
227 | // http://www.unicode.org/Public/UNIDATA/EmojiSources.txt
228 | re = /(?:\ud83d[\udc68\udc69])(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddb0-\uddb3])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f)|[\u0023\u002a\u0030-\u0039]\ufe0f?\u20e3|(?:[\u00a9\u00ae\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\uddb5\uddb6\uddb8\uddb9\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a-\udc6d\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\udeeb\udeec\udef4-\udef9]|\ud83e[\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd40-\udd45\udd47-\udd70\udd73-\udd76\udd7a\udd7c-\udda2\uddb4\uddb7\uddc0-\uddc2\uddd0\uddde-\uddff]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g,
229 |
230 | // avoid runtime RegExp creation for not so smart,
231 | // not JIT based, and old browsers / engines
232 | UFE0Fg = /\uFE0F/g,
233 |
234 | // avoid using a string literal like '\u200D' here because minifiers expand it inline
235 | U200D = String.fromCharCode(0x200D),
236 |
237 | // used to find HTML special chars in attributes
238 | rescaper = /[&<>'"]/g,
239 |
240 | // nodes with type 1 which should **not** be parsed
241 | shouldntBeParsed = /^(?:iframe|noframes|noscript|script|select|style|textarea)$/,
242 |
243 | // just a private shortcut
244 | fromCharCode = String.fromCharCode;
245 |
246 | return twemoji;
247 |
248 |
249 | /////////////////////////
250 | // private functions //
251 | // declaration //
252 | /////////////////////////
253 |
254 | /**
255 | * Shortcut to create text nodes
256 | * @param string text used to create DOM text node
257 | * @return Node a DOM node with that text
258 | */
259 | function createText(text, clean) {
260 | return document.createTextNode(clean ? text.replace(UFE0Fg, '') : text);
261 | }
262 |
263 | /**
264 | * Utility function to escape html attribute text
265 | * @param string text use in HTML attribute
266 | * @return string text encoded to use in HTML attribute
267 | */
268 | function escapeHTML(s) {
269 | return s.replace(rescaper, replacer);
270 | }
271 |
272 | /**
273 | * Default callback used to generate emoji src
274 | * based on Twitter CDN
275 | * @param string the emoji codepoint string
276 | * @param string the default size to use, i.e. "36x36"
277 | * @return string the image source to use
278 | */
279 | function defaultImageSrcGenerator(icon, options) {
280 | return ''.concat(options.base, options.size, '/', icon, options.ext);
281 | }
282 |
283 | /**
284 | * Given a generic DOM nodeType 1, walk through all children
285 | * and store every nodeType 3 (#text) found in the tree.
286 | * @param Element a DOM Element with probably some text in it
287 | * @param Array the list of previously discovered text nodes
288 | * @return Array same list with new discovered nodes, if any
289 | */
290 | function grabAllTextNodes(node, allText) {
291 | var
292 | childNodes = node.childNodes,
293 | length = childNodes.length,
294 | subnode,
295 | nodeType;
296 | while (length--) {
297 | subnode = childNodes[length];
298 | nodeType = subnode.nodeType;
299 | // parse emoji only in text nodes
300 | if (nodeType === 3) {
301 | // collect them to process emoji later
302 | allText.push(subnode);
303 | }
304 | // ignore all nodes that are not type 1, that are svg, or that
305 | // should not be parsed as script, style, and others
306 | else if (nodeType === 1 && !('ownerSVGElement' in subnode) &&
307 | !shouldntBeParsed.test(subnode.nodeName.toLowerCase())) {
308 | grabAllTextNodes(subnode, allText);
309 | }
310 | }
311 | return allText;
312 | }
313 |
314 | /**
315 | * Used to both remove the possible variant
316 | * and to convert utf16 into code points.
317 | * If there is a zero-width-joiner (U+200D), leave the variants in.
318 | * @param string the raw text of the emoji match
319 | * @return string the code point
320 | */
321 | function grabTheRightIcon(rawText) {
322 | // if variant is present as \uFE0F
323 | return toCodePoint(rawText.indexOf(U200D) < 0 ?
324 | rawText.replace(UFE0Fg, '') :
325 | rawText
326 | );
327 | }
328 |
329 | /**
330 | * DOM version of the same logic / parser:
331 | * emojify all found sub-text nodes placing images node instead.
332 | * @param Element generic DOM node with some text in some child node
333 | * @param Object options containing info about how to parse
334 | *
335 | * .callback Function the callback to invoke per each found emoji.
336 | * .base string the base url, by default twemoji.base
337 | * .ext string the image extension, by default twemoji.ext
338 | * .size string the assets size, by default twemoji.size
339 | *
340 | * @return Element same generic node with emoji in place, if any.
341 | */
342 | function parseNode(node, options) {
343 | var
344 | allText = grabAllTextNodes(node, []),
345 | length = allText.length,
346 | attrib,
347 | attrname,
348 | modified,
349 | fragment,
350 | subnode,
351 | text,
352 | match,
353 | i,
354 | index,
355 | img,
356 | rawText,
357 | iconId,
358 | src;
359 | while (length--) {
360 | modified = false;
361 | fragment = document.createDocumentFragment();
362 | subnode = allText[length];
363 | text = subnode.nodeValue;
364 | i = 0;
365 | while ((match = re.exec(text))) {
366 | index = match.index;
367 | if (index !== i) {
368 | fragment.appendChild(
369 | createText(text.slice(i, index), true)
370 | );
371 | }
372 | rawText = match[0];
373 | iconId = grabTheRightIcon(rawText);
374 | i = index + rawText.length;
375 | src = options.callback(iconId, options);
376 | if (iconId && src) {
377 | img = new Image();
378 | img.onerror = options.onerror;
379 | img.setAttribute('draggable', 'false');
380 | attrib = options.attributes(rawText, iconId);
381 | for (attrname in attrib) {
382 | if (
383 | attrib.hasOwnProperty(attrname) &&
384 | // don't allow any handlers to be set + don't allow overrides
385 | attrname.indexOf('on') !== 0 &&
386 | !img.hasAttribute(attrname)
387 | ) {
388 | img.setAttribute(attrname, attrib[attrname]);
389 | }
390 | }
391 | img.className = options.className;
392 | img.alt = rawText;
393 | img.src = src;
394 | modified = true;
395 | fragment.appendChild(img);
396 | }
397 | if (!img) fragment.appendChild(createText(rawText, false));
398 | img = null;
399 | }
400 | // is there actually anything to replace in here ?
401 | if (modified) {
402 | // any text left to be added ?
403 | if (i < text.length) {
404 | fragment.appendChild(
405 | createText(text.slice(i), true)
406 | );
407 | }
408 | // replace the text node only, leave intact
409 | // anything else surrounding such text
410 | subnode.parentNode.replaceChild(fragment, subnode);
411 | }
412 | }
413 | return node;
414 | }
415 |
416 | /**
417 | * String/HTML version of the same logic / parser:
418 | * emojify a generic text placing images tags instead of surrogates pair.
419 | * @param string generic string with possibly some emoji in it
420 | * @param Object options containing info about how to parse
421 | *
422 | * .callback Function the callback to invoke per each found emoji.
423 | * .base string the base url, by default twemoji.base
424 | * .ext string the image extension, by default twemoji.ext
425 | * .size string the assets size, by default twemoji.size
426 | *
427 | * @return the string with
replacing all found and parsed emoji
428 | */
429 | function parseString(str, options) {
430 | return replace(str, function (rawText) {
431 | var
432 | ret = rawText,
433 | iconId = grabTheRightIcon(rawText),
434 | src = options.callback(iconId, options),
435 | attrib,
436 | attrname;
437 | if (iconId && src) {
438 | // recycle the match string replacing the emoji
439 | // with its image counter part
440 | ret = '
');
464 | }
465 | return ret;
466 | });
467 | }
468 |
469 | /**
470 | * Function used to actually replace HTML special chars
471 | * @param string HTML special char
472 | * @return string encoded HTML special char
473 | */
474 | function replacer(m) {
475 | return escaper[m];
476 | }
477 |
478 | /**
479 | * Default options.attribute callback
480 | * @return null
481 | */
482 | function returnNull() {
483 | return null;
484 | }
485 |
486 | /**
487 | * Given a generic value, creates its squared counterpart if it's a number.
488 | * As example, number 36 will return '36x36'.
489 | * @param any a generic value.
490 | * @return any a string representing asset size, i.e. "36x36"
491 | * only in case the value was a number.
492 | * Returns initial value otherwise.
493 | */
494 | function toSizeSquaredAsset(value) {
495 | return typeof value === 'number' ?
496 | value + 'x' + value :
497 | value;
498 | }
499 |
500 |
501 | /////////////////////////
502 | // exported functions //
503 | // declaration //
504 | /////////////////////////
505 |
506 | function fromCodePoint(codepoint) {
507 | var code = typeof codepoint === 'string' ?
508 | parseInt(codepoint, 16) : codepoint;
509 | if (code < 0x10000) {
510 | return fromCharCode(code);
511 | }
512 | code -= 0x10000;
513 | return fromCharCode(
514 | 0xD800 + (code >> 10),
515 | 0xDC00 + (code & 0x3FF)
516 | );
517 | }
518 |
519 | function parse(what, how) {
520 | if (!how || typeof how === 'function') {
521 | how = {callback: how};
522 | }
523 | // if first argument is string, inject html
tags
524 | // otherwise use the DOM tree and parse text nodes only
525 | return (typeof what === 'string' ? parseString : parseNode)(what, {
526 | callback: how.callback || defaultImageSrcGenerator,
527 | attributes: typeof how.attributes === 'function' ? how.attributes : returnNull,
528 | base: typeof how.base === 'string' ? how.base : twemoji.base,
529 | ext: how.ext || twemoji.ext,
530 | size: how.folder || toSizeSquaredAsset(how.size || twemoji.size),
531 | className: how.className || twemoji.className,
532 | onerror: how.onerror || twemoji.onerror
533 | });
534 | }
535 |
536 | function replace(text, callback) {
537 | return String(text).replace(re, callback);
538 | }
539 |
540 | function test(text) {
541 | // IE6 needs a reset before too
542 | re.lastIndex = 0;
543 | var result = re.test(text);
544 | re.lastIndex = 0;
545 | return result;
546 | }
547 |
548 | function toCodePoint(unicodeSurrogates, sep) {
549 | var
550 | r = [],
551 | c = 0,
552 | p = 0,
553 | i = 0;
554 | while (i < unicodeSurrogates.length) {
555 | c = unicodeSurrogates.charCodeAt(i++);
556 | if (p) {
557 | r.push((0x10000 + ((p - 0xD800) << 10) + (c - 0xDC00)).toString(16));
558 | p = 0;
559 | } else if (0xD800 <= c && c <= 0xDBFF) {
560 | p = c;
561 | } else {
562 | r.push(c.toString(16));
563 | }
564 | }
565 | return r.join(sep || '-');
566 | }
567 |
568 | }());
--------------------------------------------------------------------------------
/src/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "DiSpeak",
3 | "version": "2.6.6",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "abbrev": {
8 | "version": "1.1.1",
9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
11 | },
12 | "ajv": {
13 | "version": "6.12.3",
14 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
15 | "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
16 | "requires": {
17 | "fast-deep-equal": "^3.1.1",
18 | "fast-json-stable-stringify": "^2.0.0",
19 | "json-schema-traverse": "^0.4.1",
20 | "uri-js": "^4.2.2"
21 | }
22 | },
23 | "asn1": {
24 | "version": "0.2.4",
25 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
26 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
27 | "requires": {
28 | "safer-buffer": "~2.1.0"
29 | }
30 | },
31 | "assert-plus": {
32 | "version": "1.0.0",
33 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
34 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
35 | },
36 | "async-limiter": {
37 | "version": "1.0.1",
38 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
39 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
40 | },
41 | "asynckit": {
42 | "version": "0.4.0",
43 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
44 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
45 | },
46 | "aws-sign2": {
47 | "version": "0.7.0",
48 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
49 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
50 | },
51 | "aws4": {
52 | "version": "1.10.0",
53 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
54 | "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
55 | },
56 | "bcrypt-pbkdf": {
57 | "version": "1.0.2",
58 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
59 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
60 | "requires": {
61 | "tweetnacl": "^0.14.3"
62 | },
63 | "dependencies": {
64 | "tweetnacl": {
65 | "version": "0.14.5",
66 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
67 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
68 | }
69 | }
70 | },
71 | "caseless": {
72 | "version": "0.12.0",
73 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
74 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
75 | },
76 | "combined-stream": {
77 | "version": "1.0.8",
78 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
79 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
80 | "requires": {
81 | "delayed-stream": "~1.0.0"
82 | }
83 | },
84 | "core-util-is": {
85 | "version": "1.0.2",
86 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
87 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
88 | },
89 | "dashdash": {
90 | "version": "1.14.1",
91 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
92 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
93 | "requires": {
94 | "assert-plus": "^1.0.0"
95 | }
96 | },
97 | "debug": {
98 | "version": "2.6.9",
99 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
100 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
101 | "requires": {
102 | "ms": "2.0.0"
103 | }
104 | },
105 | "delayed-stream": {
106 | "version": "1.0.0",
107 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
108 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
109 | },
110 | "discord.js": {
111 | "version": "11.6.4",
112 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-11.6.4.tgz",
113 | "integrity": "sha512-cK6rH1PuGjSjpmEQbnpuTxq1Yv8B89SotyKUFcr4RhnsiZnfBfDOev7DD7v5vhtEyyj51NuMWFoRJzgy/m08Uw==",
114 | "requires": {
115 | "long": "^4.0.0",
116 | "prism-media": "^0.0.4",
117 | "snekfetch": "^3.6.4",
118 | "tweetnacl": "^1.0.0",
119 | "ws": "^6.0.0"
120 | }
121 | },
122 | "ecc-jsbn": {
123 | "version": "0.1.2",
124 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
125 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
126 | "requires": {
127 | "jsbn": "~0.1.0",
128 | "safer-buffer": "^2.1.0"
129 | }
130 | },
131 | "electron-squirrel-startup": {
132 | "version": "1.0.0",
133 | "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz",
134 | "integrity": "sha1-GbTlWTP6Dvj1VnhLnGYPdyVGoLg=",
135 | "requires": {
136 | "debug": "^2.2.0"
137 | }
138 | },
139 | "extend": {
140 | "version": "3.0.2",
141 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
142 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
143 | },
144 | "extsprintf": {
145 | "version": "1.3.0",
146 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
147 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
148 | },
149 | "fast-deep-equal": {
150 | "version": "3.1.3",
151 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
152 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
153 | },
154 | "fast-json-stable-stringify": {
155 | "version": "2.1.0",
156 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
157 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
158 | },
159 | "forever-agent": {
160 | "version": "0.6.1",
161 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
162 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
163 | },
164 | "form-data": {
165 | "version": "2.3.3",
166 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
167 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
168 | "requires": {
169 | "asynckit": "^0.4.0",
170 | "combined-stream": "^1.0.6",
171 | "mime-types": "^2.1.12"
172 | }
173 | },
174 | "getpass": {
175 | "version": "0.1.7",
176 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
177 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
178 | "requires": {
179 | "assert-plus": "^1.0.0"
180 | }
181 | },
182 | "har-schema": {
183 | "version": "2.0.0",
184 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
185 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
186 | },
187 | "har-validator": {
188 | "version": "5.1.3",
189 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
190 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
191 | "requires": {
192 | "ajv": "^6.5.5",
193 | "har-schema": "^2.0.0"
194 | }
195 | },
196 | "http-signature": {
197 | "version": "1.2.0",
198 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
199 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
200 | "requires": {
201 | "assert-plus": "^1.0.0",
202 | "jsprim": "^1.2.2",
203 | "sshpk": "^1.7.0"
204 | }
205 | },
206 | "is-typedarray": {
207 | "version": "1.0.0",
208 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
209 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
210 | },
211 | "isstream": {
212 | "version": "0.1.2",
213 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
214 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
215 | },
216 | "jquery": {
217 | "version": "3.5.1",
218 | "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz",
219 | "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg=="
220 | },
221 | "jsbn": {
222 | "version": "0.1.1",
223 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
224 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
225 | },
226 | "json-schema": {
227 | "version": "0.2.3",
228 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
229 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
230 | },
231 | "json-schema-traverse": {
232 | "version": "0.4.1",
233 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
234 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
235 | },
236 | "json-stringify-safe": {
237 | "version": "5.0.1",
238 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
239 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
240 | },
241 | "jsprim": {
242 | "version": "1.4.1",
243 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
244 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
245 | "requires": {
246 | "assert-plus": "1.0.0",
247 | "extsprintf": "1.3.0",
248 | "json-schema": "0.2.3",
249 | "verror": "1.10.0"
250 | }
251 | },
252 | "long": {
253 | "version": "4.0.0",
254 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
255 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
256 | },
257 | "markdown": {
258 | "version": "0.5.0",
259 | "resolved": "https://registry.npmjs.org/markdown/-/markdown-0.5.0.tgz",
260 | "integrity": "sha1-KCBbVlqK51kt4gdGPWY33BgnIrI=",
261 | "requires": {
262 | "nopt": "~2.1.1"
263 | }
264 | },
265 | "mime-db": {
266 | "version": "1.44.0",
267 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
268 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
269 | },
270 | "mime-types": {
271 | "version": "2.1.27",
272 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
273 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
274 | "requires": {
275 | "mime-db": "1.44.0"
276 | }
277 | },
278 | "ms": {
279 | "version": "2.0.0",
280 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
281 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
282 | },
283 | "nopt": {
284 | "version": "2.1.2",
285 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz",
286 | "integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=",
287 | "requires": {
288 | "abbrev": "1"
289 | }
290 | },
291 | "oauth-sign": {
292 | "version": "0.9.0",
293 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
294 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
295 | },
296 | "performance-now": {
297 | "version": "2.1.0",
298 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
299 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
300 | },
301 | "prism-media": {
302 | "version": "0.0.4",
303 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-0.0.4.tgz",
304 | "integrity": "sha512-dG2w7WtovUa4SiYTdWn9H8Bd4JNdei2djtkP/Bk9fXq81j5Q15ZPHYSwhUVvBRbp5zMkGtu0Yk62HuMcly0pRw=="
305 | },
306 | "psl": {
307 | "version": "1.8.0",
308 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
309 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
310 | },
311 | "punycode": {
312 | "version": "2.1.1",
313 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
314 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
315 | },
316 | "qs": {
317 | "version": "6.5.2",
318 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
319 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
320 | },
321 | "request": {
322 | "version": "2.88.2",
323 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
324 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
325 | "requires": {
326 | "aws-sign2": "~0.7.0",
327 | "aws4": "^1.8.0",
328 | "caseless": "~0.12.0",
329 | "combined-stream": "~1.0.6",
330 | "extend": "~3.0.2",
331 | "forever-agent": "~0.6.1",
332 | "form-data": "~2.3.2",
333 | "har-validator": "~5.1.3",
334 | "http-signature": "~1.2.0",
335 | "is-typedarray": "~1.0.0",
336 | "isstream": "~0.1.2",
337 | "json-stringify-safe": "~5.0.1",
338 | "mime-types": "~2.1.19",
339 | "oauth-sign": "~0.9.0",
340 | "performance-now": "^2.1.0",
341 | "qs": "~6.5.2",
342 | "safe-buffer": "^5.1.2",
343 | "tough-cookie": "~2.5.0",
344 | "tunnel-agent": "^0.6.0",
345 | "uuid": "^3.3.2"
346 | }
347 | },
348 | "safe-buffer": {
349 | "version": "5.2.1",
350 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
351 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
352 | },
353 | "safer-buffer": {
354 | "version": "2.1.2",
355 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
356 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
357 | },
358 | "snekfetch": {
359 | "version": "3.6.4",
360 | "resolved": "https://registry.npmjs.org/snekfetch/-/snekfetch-3.6.4.tgz",
361 | "integrity": "sha512-NjxjITIj04Ffqid5lqr7XdgwM7X61c/Dns073Ly170bPQHLm6jkmelye/eglS++1nfTWktpP6Y2bFXjdPlQqdw=="
362 | },
363 | "sshpk": {
364 | "version": "1.16.1",
365 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
366 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
367 | "requires": {
368 | "asn1": "~0.2.3",
369 | "assert-plus": "^1.0.0",
370 | "bcrypt-pbkdf": "^1.0.0",
371 | "dashdash": "^1.12.0",
372 | "ecc-jsbn": "~0.1.1",
373 | "getpass": "^0.1.1",
374 | "jsbn": "~0.1.0",
375 | "safer-buffer": "^2.0.2",
376 | "tweetnacl": "~0.14.0"
377 | },
378 | "dependencies": {
379 | "tweetnacl": {
380 | "version": "0.14.5",
381 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
382 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
383 | }
384 | }
385 | },
386 | "tough-cookie": {
387 | "version": "2.5.0",
388 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
389 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
390 | "requires": {
391 | "psl": "^1.1.28",
392 | "punycode": "^2.1.1"
393 | }
394 | },
395 | "tunnel-agent": {
396 | "version": "0.6.0",
397 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
398 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
399 | "requires": {
400 | "safe-buffer": "^5.0.1"
401 | }
402 | },
403 | "tweetnacl": {
404 | "version": "1.0.3",
405 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
406 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="
407 | },
408 | "universal-analytics": {
409 | "version": "0.4.23",
410 | "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz",
411 | "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==",
412 | "requires": {
413 | "debug": "^4.1.1",
414 | "request": "^2.88.2",
415 | "uuid": "^3.0.0"
416 | },
417 | "dependencies": {
418 | "debug": {
419 | "version": "4.1.1",
420 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
421 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
422 | "requires": {
423 | "ms": "^2.1.1"
424 | }
425 | },
426 | "ms": {
427 | "version": "2.1.2",
428 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
429 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
430 | }
431 | }
432 | },
433 | "uri-js": {
434 | "version": "4.2.2",
435 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
436 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
437 | "requires": {
438 | "punycode": "^2.1.0"
439 | }
440 | },
441 | "uuid": {
442 | "version": "3.4.0",
443 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
444 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
445 | },
446 | "verror": {
447 | "version": "1.10.0",
448 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
449 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
450 | "requires": {
451 | "assert-plus": "^1.0.0",
452 | "core-util-is": "1.0.2",
453 | "extsprintf": "^1.2.0"
454 | }
455 | },
456 | "ws": {
457 | "version": "6.2.1",
458 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
459 | "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
460 | "requires": {
461 | "async-limiter": "~1.0.0"
462 | }
463 | }
464 | }
465 | }
466 |
--------------------------------------------------------------------------------
/src/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "DiSpeak",
3 | "version": "2.6.6",
4 | "description": "Bouyomi speaks the notice of Discord.",
5 | "main": "index.js",
6 | "dependencies": {
7 | "discord.js": "^11.6.4",
8 | "electron-squirrel-startup": "^1.0.0",
9 | "jquery": "^3.5.1",
10 | "markdown": "^0.5.0",
11 | "mime-types": "^2.1.27",
12 | "universal-analytics": "^0.4.23"
13 | },
14 | "devDependencies": {},
15 | "scripts": {},
16 | "repository": {
17 | "type": "git",
18 | "url": "git+https://github.com/micelle/dc_DiSpeak.git"
19 | },
20 | "author": "DiSpeak",
21 | "license": "MIT",
22 | "bugs": {
23 | "url": "https://github.com/micelle/dc_DiSpeak/issues"
24 | },
25 | "homepage": "https://github.com/micelle/dc_DiSpeak#readme"
26 | }
27 |
--------------------------------------------------------------------------------