├── .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 | [![GitHub downloads](https://img.shields.io/github/downloads/micelle/dc_DiSpeak/total.svg)](https://github.com/micelle/dc_DiSpeak/releases) 4 | [![GitHub release](https://img.shields.io/github/release/micelle/dc_DiSpeak.svg)](https://github.com/micelle/dc_DiSpeak/releases/latest) 5 | [![GitHub Release Date](https://img.shields.io/github/release-date/micelle/dc_DiSpeak.svg)](https://github.com/micelle/dc_DiSpeak/releases/latest) 6 | [![GitHub last commit](https://img.shields.io/github/last-commit/micelle/dc_DiSpeak.svg)](https://github.com/micelle/dc_DiSpeak/commits/) 7 | [![GitHub license](https://img.shields.io/github/license/micelle/dc_DiSpeak.svg)](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 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 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 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/images/icon_group.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 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 |
28 | 29 | 30 | 31 |
32 |
33 | notifications 34 |
35 |
36 | 37 |
38 |
39 | 40 |
41 |
42 | 43 |
44 |
45 |
46 | 47 |
48 |
49 | 50 |
51 | 56 |
57 | 58 |
59 |
    60 |
    61 | 62 | 691 | 692 | 886 |
    887 |
    888 | 889 |
    890 | 891 | mic 892 | 893 | 896 |
    897 | 898 |
    899 | 900 | keyboard_arrow_up 901 | 902 |
    903 | 904 | 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 | --------------------------------------------------------------------------------