From c390ad9356a6426874b2a11e7e9f88b07a204f7c Mon Sep 17 00:00:00 2001 From: Yuki KAN Date: Thu, 4 May 2017 23:54:23 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 16 ++ .eslintrc.yml | 23 +++ .gitignore | 3 + .npmignore | 4 + .vscode/.editorconfig | 2 + .vscode/settings.json | 10 ++ LICENSE | 201 +++++++++++++++++++++++ app/images/icon-active.png | Bin 0 -> 482 bytes app/images/icon-active@1.25x.png | Bin 0 -> 593 bytes app/images/icon-active@1.5x.png | Bin 0 -> 679 bytes app/images/icon-active@2x.png | Bin 0 -> 859 bytes app/images/icon-active@4x.png | Bin 0 -> 1598 bytes app/images/icon-active@5x.png | Bin 0 -> 1929 bytes app/images/icon-gray.png | Bin 0 -> 450 bytes app/images/icon-gray@1.25x.png | Bin 0 -> 546 bytes app/images/icon-gray@1.5x.png | Bin 0 -> 617 bytes app/images/icon-gray@2x.png | Bin 0 -> 800 bytes app/images/icon-gray@4x.png | Bin 0 -> 1423 bytes app/images/icon-gray@5x.png | Bin 0 -> 1730 bytes app/images/icon.ico | Bin 0 -> 105928 bytes app/images/icon.png | Bin 0 -> 447 bytes app/images/icon.svg | 40 +++++ app/images/icon30.png | Bin 0 -> 740 bytes app/images/icon30@2x.png | Bin 0 -> 1388 bytes app/images/icon30@4x.png | Bin 0 -> 2541 bytes app/images/icon@1.25x.png | Bin 0 -> 546 bytes app/images/icon@1.5x.png | Bin 0 -> 619 bytes app/images/icon@2x.png | Bin 0 -> 780 bytes app/images/icon@4x.png | Bin 0 -> 1439 bytes app/images/icon@5x.png | Bin 0 -> 1736 bytes app/main.js | 271 +++++++++++++++++++++++++++++++ app/regexp.js | 8 + app/ui/basic.css | 82 ++++++++++ app/ui/basic.js | 49 ++++++ app/ui/pref.html | 18 ++ app/ui/pref.js | 62 +++++++ app/ui/status.html | 18 ++ app/ui/status.js | 136 ++++++++++++++++ jsconfig.json | 16 ++ package.json | 60 +++++++ 40 files changed, 1019 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintrc.yml create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 .vscode/.editorconfig create mode 100644 .vscode/settings.json create mode 100644 LICENSE create mode 100644 app/images/icon-active.png create mode 100644 app/images/icon-active@1.25x.png create mode 100644 app/images/icon-active@1.5x.png create mode 100644 app/images/icon-active@2x.png create mode 100644 app/images/icon-active@4x.png create mode 100644 app/images/icon-active@5x.png create mode 100644 app/images/icon-gray.png create mode 100644 app/images/icon-gray@1.25x.png create mode 100644 app/images/icon-gray@1.5x.png create mode 100644 app/images/icon-gray@2x.png create mode 100644 app/images/icon-gray@4x.png create mode 100644 app/images/icon-gray@5x.png create mode 100644 app/images/icon.ico create mode 100644 app/images/icon.png create mode 100644 app/images/icon.svg create mode 100644 app/images/icon30.png create mode 100644 app/images/icon30@2x.png create mode 100644 app/images/icon30@4x.png create mode 100644 app/images/icon@1.25x.png create mode 100644 app/images/icon@1.5x.png create mode 100644 app/images/icon@2x.png create mode 100644 app/images/icon@4x.png create mode 100644 app/images/icon@5x.png create mode 100644 app/main.js create mode 100644 app/regexp.js create mode 100644 app/ui/basic.css create mode 100644 app/ui/basic.js create mode 100644 app/ui/pref.html create mode 100644 app/ui/pref.js create mode 100644 app/ui/status.html create mode 100644 app/ui/status.js create mode 100644 jsconfig.json create mode 100644 package.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..feb33c3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# EditorConfig is awesome: http://EditorConfig.org + +root = true + +[*.{js,yml,json}] +charset = utf-8 +end_of_line = crlf +indent_style = space +indent_size = 4 +insert_final_newline = true + +[*.{yml,json}] +indent_size = 2 + +[package.json] +end_of_line = lf \ No newline at end of file diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000..36ce451 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,23 @@ +env: + browser: true + commonjs: true + es6: true + node: true +parserOptions: + ecmaVersion: 2017 +extends: 'eslint:recommended' +rules: + indent: + - error + - 4 + linebreak-style: + - error + - windows + quotes: + - error + - double + semi: + - error + - always + no-console: 1 + no-empty: 1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f8e3f17 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/dist +/*.log \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..d3586a9 --- /dev/null +++ b/.npmignore @@ -0,0 +1,4 @@ +/.vscode +/node_modules +/*.log +/.editorconfig \ No newline at end of file diff --git a/.vscode/.editorconfig b/.vscode/.editorconfig new file mode 100644 index 0000000..91d2506 --- /dev/null +++ b/.vscode/.editorconfig @@ -0,0 +1,2 @@ +[*.json] +indent_size = 4 \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..12857cd --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "editor.tabSize": 4, + "editor.insertSpaces": true, + "editor.renderWhitespace": "all", + "editor.formatOnType": false, + "editor.autoClosingBrackets": true, + "files.trimTrailingWhitespace": true, + "git.enabled": true, + "git.autofetch": false +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/app/images/icon-active.png b/app/images/icon-active.png new file mode 100644 index 0000000000000000000000000000000000000000..b54d049552a69a06ea1b84f2d3ed7aee8d85759c GIT binary patch literal 482 zcmV<80UiE{P)lWZ=5zph)qv-fMd-8*dE>% z1LB866A?Nlx|s8Aw3-#VZoYQV1jy+-s0iIL1tfqp9hoB(Gl?$2*P{|oEko-G+;>UX ztN_ppnkiUH&U{{`P3VK}a0*9nSkAa4k( zAoVjz-wA^7a}wAURzVutC=$1wrQ?8^fyl~Wfyj#5>p0-Hv$`=N@B%gF)>F)EKy(cz z=G4ZI1FZ-6yaVUn7HcP)J&oT7k@*YU4{)mRe5!=MZ52CJa6eRz2YxGuCawSYw+(Ms z{dic;Kmp~2KHjQoh^7}3qjG{)PU#yi0ZFl1N{ZD|5=d%J>YR}Sl=FCg=!|q5MW5;Z Y04Rfzj)xFuoB#j-07*qoM6N<$f^~e$t^fc4 literal 0 HcmV?d00001 diff --git a/app/images/icon-active@1.25x.png b/app/images/icon-active@1.25x.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb3afb86859a7fa24827f417c10666e7046b5c7 GIT binary patch literal 593 zcmV-X0VX}g4Rk_2bL(i&S$e15=NDC= z&hodd0UrTJ zNUH-Nyl%4yoGQ~b9)s}+Wi@>!_wdjopap87&DB>+uWBk*>TY>eb zpk>vfTGsb_D=;~CfLg>IX$5Hw_%m)X?Lq$lejUSw8x_28eS7}^rahRAT0&ZpA<&ce zW!UJeF!}@|{3_pm<`-!;gzs+_Kf1OG0y}XKg(zs5XlA{A|GT#z&0Nd){QruoFg}HE zZ~Zj|RHCJXWj1!`A9k3Hoiu!1L6YHC0b1hjt{ocZQt%W$SMZmL&czzRv=QqN8!)|Y fv!Qswt`2_znAE7@X#iR(00000NkvXXu0mjf7G?=f literal 0 HcmV?d00001 diff --git a/app/images/icon-active@1.5x.png b/app/images/icon-active@1.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..f2ebad9a3e75d7de250ff42b7b3ca5c5fcd02b63 GIT binary patch literal 679 zcmV;Y0$BZtP)3sUGOAYHqpTSvkG>Vz^dR4P&(7OJMSi3Hd(Y0PkM8pp9yXW&Sde9z;5 z?s?pE;6Ia?M%izzzXuSyRSCH-H0m%nRMJLk>PD@E}#R zDFS#I^FJUng7-*EczY9A4X{=fFG!sTQ(H>_o&%~8qN&$o}3llQUO>U%DBs^y@o7lbMAzvHZ3%u}xJ@4d5YQ()SE{ z4lJ6$U-qRqkkpl1} zw1^67;7u&D5dh8$-Kqp1PVix><)05M8zaej%&7%G75S}oBedZF_y<|(&8+GAjEDdL N002ovPDHLkV1hNlF5mzF literal 0 HcmV?d00001 diff --git a/app/images/icon-active@2x.png b/app/images/icon-active@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8a671e7cbf61b20c6a6e9bded92021f06d930580 GIT binary patch literal 859 zcmV-h1ElOPPrlF`mop`SH5P%gx6KzGJw`SoSV0CwT(Wg3Gy%$)n>sl6lRuYhy3OJ3x zs#v)xn&|6VR0pe{6NGA(U@aH(S@fqQ=2EHy;;l(kHib^TgaIpp#{KC;cK|3A)&QSG z!zXku#h*@OfO#M;qLBi^{&XT_`xw@~Jk@|rAi(f#x$?<(fFux7re5ZIN<_6>%uA&h z<3iK0C@(+Ht2K56+M#e2te$ePqh2M+~xVL6rpkf3^$ zwb(>wH{5s#eZz3@2GoA&bDN`C5&BO+2FRMA6p>ChZE;}i3AiT==jUJH?3>X)cn1dV z8X$`MaPZnLt3ob;DBpCh+mP_k0HC^I=$_G<hxy**sis({KKO0WV z1>^r!zY9cp^-((e+D+s4_hBbL51P-v9TI9Csw1=bfPRnB9N2P6%PUz*trX4s9V$h$ ze$XVgQr!a3+f=w4iXKU}*|q?%WbqczdyPOGh{{SUk;aoiQan;t>&kbZ698GejxB&> lflw_MiwYqB;+l6Re*n;v5aU?UpvM3J002ovPDHLkV1m#)lC}T< literal 0 HcmV?d00001 diff --git a/app/images/icon-active@4x.png b/app/images/icon-active@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d608ccc6e7a6085d1cdafdfd04d360686c855f GIT binary patch literal 1598 zcmV-E2EqA>P)Ghm*dzw|aJ!I>0|+aX_nY_QTMKa@4&-NcHuDz_0Hyq2 z>gQEIKu}6A1M@(v=~fBI0xRucga&8;%U!;kDnAcA0TOM>qkboVCu-baEud}n@oEK+ zZ!OFM4>YFSnc3Og8l(j*yS(N``53UFIc-DD3myQq`iTy=5>8Omq($~ zMPrK2*qotQxgagz2hB(ww+rc?T#j8clxZyx0PI3~+R(3;)!d$>QrlHc-m6YZECMk7 z2f(xkGrc3MRLMm`w9#jWaVRshvzZJk25fjx9yQlhJWxt4sluldm4KyY<P)7@PFQtg;97BLFQB2GS6* zcNgQp<_Y@#0^r1iq?lUIT_^zT-Nl&N>RO|Hcnn4_dt-j|O1eQ?6bIJC)OvoP0H};@ zj>d6<${yH_)&XN*z)-}Sg!L*^{%w;wBrPj6k^$}uE0qld09B|=1K+B&_OuXb9K+k! z(5QnD5d9iH`3lP0P%E2B7mh;o8#wqA%D;haLud$wCm=M^J~|8h0c;5?wdDx_RhP$= zl9p0hZ##?Lmcj!ZKGg%lQGEQm{9WFL@*|TRA_o+JEubWv&wfahI|LXu3iitr?k|pe8+0gR}e(xV(>U!`7?ckj^(g#AdF0M zA$YWzeO~~40b%S*{|wg~udd4XZHTCeW_k9fH~j;^oL5if-FAeM=yqNwZbIaWe*i?T zNS^xp{8GO`eF0GYxP>0Arn5d9z3u@qr7VX6bM;*wVy)~_Om2M7?2grt=$)!tf-FUXk0ESIcmE2S-JC zyVu%PYV8-l+B}T@>2uDXmG0@Zsnj#3 zk;nG)Zv9(WDRJ%qsJB1&U99#!WPh&Y#je%!5(E#5;mElUge1VA203M+NhPvtv+kr7tvDzZhN_hTn80U#E%;u=6`=K>}! wkOgia-_Hw7>25#(8RZ&tn4V*Pqz{<>2VBh+VOWvxvj6}907*qoM6N<$f+#Zcb^rhX literal 0 HcmV?d00001 diff --git a/app/images/icon-active@5x.png b/app/images/icon-active@5x.png new file mode 100644 index 0000000000000000000000000000000000000000..64daba328b32c05324a9bbfca8a71a1958655ea4 GIT binary patch literal 1929 zcmV;42X^?0P)tu~pi@!#k7 z?ma(8{v-<2}n+Cu4b#h^m*6-XB)g%2`>&jZvqc# zjq||sXIH0VT>((vS-d9||I`ShJ1d5_QdLhgi301@5H%0N3jwd|G%O2@X^})$k*`~~ zczYHYGrF@EE%06gs|d;ORLBDx_l7Ebv$rg;iS;S7LYvlCV}-shu|AbncuRqvAz;!| zU07P5nbCGuUTaliid2qy%?Gx!J|}#kZSi@;`l6MN*@Vo?dwKwEjEeIX>&hz9*&AVu zzOy(9+_rFQT;AKRY$#Ga?G+1LaoKWH3al_avALS*I6#>&u;a^OvJBHAXAny^RbS|M zAg%8##^gj^gd3MO>$y$b*`g>h>YV_Rk{HSvEdYuX}9}V!s}!gUa{GA z>jkwd7P|5jkTf~s&P{Bt&QyQldKcFJ{Aq>3i*ZK^|L`WIef#r_h52z*Mgq4un~}}{ zzX5CYlBuo()L-6R0pbLPq3^uf!ap8D;Q%0|jW5r*)h5j)a3L9T2+KRy4+A4=D>>SO zljF)zWlkGk&N|&Tp9}C}i1bn1MPrWx>$2|dv_SpkU1NS*3(h|P{a>lA@c12+jv58d z3)=Ydc2@wD@!c#R-oz;v>t8f*0nP=~R(w)`qqhzE*%vT)F$Fx-B8jx;0LnS(Ejf~j z@T6RX<9|5=QS(7y82mwJ%)XQt1BqTf3$Oo6@mI(;um)^sk;Izo0A(5}CSTW)nc2pT zIua0lemFM(qxYbE47sO}-%?*pMMhMvEl2l>n5H zy#Xpx@jhg$v0wiP{vioBXAh(SuCly;ezE&=WDS_WP6gP;aiD}12fmYC&_1X}a^VgH zMysq;f;@T!$BieuDNvuFN>GzvYia1wMZf< z<0a?iB-fo~SH+f++38F~izH@Tf!NB&*|P5c+=4e#cPi%!#Nu9O+=Bz~>du8-v&8O` z8h8zp2|bAB;5E(0I0n%d_-x=c1y}(wqg0(QMx1ME|ETH`)6L+u1Sn-nDa3(G&H+?g zb_SR>6$iGk!mKigMxgAJ1TU*{5gB00%sxa@8EIM2G2vMwaA5F;oW2PD#mo5h`$ojNM*nE-dWdQ%?25IK;-1J*SLPpey`JuL8sHku7Nm-M zr;W%}%voD45Sf*7K`cb&x2!BGxxcX9U@&=&u_K{BY<}l~F95?gtj~`R{}7gLcA21* zhvWTEp^G-YJZ3xORG7JdzF>RXHp&Iqe=J_@%Kl?Gc+%b)i$5rIJdOSE2Ee}H3;M$l z2wS^9zttYZ{m0gKGX%n-m-GcUyaO;0w!dL0zhw@J+3Q+aqSYVUp)RauC+NYG=HX8% zC$903sP%z%rCbnuWEx5Csk7_K9RwIvrcr)N#B%lGJ5}4^K5Kw*8icp{-)96+tsL*3 zwL)Wd(F17F3O#Cls-|)vHfE}~!lPHG@72q7F9B4)o3)gO-Cw1agU)SC_Xt3BgNR-h zr;aLj_m_^qcPLIbY0A8gl0!J&8- zC29G0qsrl{K0Off0>DWHWvoe9X>EKt)52<^vQFbMH2VjhG%qd`Q+a* zsY}+0fLb-cj)SuRGSZCJoItiu(12jyE$b~j+NAk{v1M+|J^Un-C2&I%%O36o<8IR*VtlKF-^x*Xk zumLt9AC0F8at{0h&hjf@E2Y%`RZ!P;Zj5=oA_J_AF|T!9=c5XgQtLqYYpvbQX0tp^ zQ;x?Y07;TyjKMjl=kxgo@C_&_W%Z<#dIxsbw=S1Ugbk!!VE}$>(G%M^W_WoO|zS+xC)=Va8_RW^nfVy#h$nR8C>;J8>NxegjrzS+2^m sTmh@FrvqkkfOcUHrp|Mv)J@a<07pHp)QCp=RR91007*qoM6N<$f^}uZ(EtDd literal 0 HcmV?d00001 diff --git a/app/images/icon-gray@1.25x.png b/app/images/icon-gray@1.25x.png new file mode 100644 index 0000000000000000000000000000000000000000..12e2f73838f09ae45f096ce9d9871183a46846bf GIT binary patch literal 546 zcmV+-0^R+IP)!uQ0}h#+a|hnD7?7 zx{-GZe5lT=(Yi$?@Dm7u9WWA+-D{OjD?+Ms`YNUC_4+|6^}U`i%ktgb-QDu9l}1rC zwbnj1)vUFTQ4~$DDmBJD00O)P-aF?c2m*ZH$6EW;5Cj3vIjpt#zHfkUzz@KP$P%Ds zjFD;(zeN~^^!t7CJjYr~5CmwgNz;_w?&7RQN<<7WX{tKs0MJ^~?RL>xpXD23A|gfs zh{yu?Qb%+;oyJbz_nXq6E1u^;iO39CoHlm5-A2-0uU98th{&f))1MuWM*}bz3{a}s z97-t$g8={)esXws=Hu~rb@H9>fsfUGt>gdr{6)1lCnB<{ kIbwg}<07NyvgU*VdM*si-07*qoM6N<$f&nV_GXMYp literal 0 HcmV?d00001 diff --git a/app/images/icon-gray@1.5x.png b/app/images/icon-gray@1.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..3daf16e8bb2026ccf15aa04900e62dfe3150d3de GIT binary patch literal 617 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 literal 0 HcmV?d00001 diff --git a/app/images/icon-gray@5x.png b/app/images/icon-gray@5x.png new file mode 100644 index 0000000000000000000000000000000000000000..ffab20f9b3ca88ba64643716dd893471b7e69bd3 GIT binary patch literal 1730 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 + + + + + + + icon-mirakurun + + + + + + + + + + + + diff --git a/app/images/icon30.png b/app/images/icon30.png new file mode 100644 index 0000000000000000000000000000000000000000..6f90fbb88adbf016fe256dbf7d9ef51540edd6a3 GIT binary patch literal 740 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 DnWN6p literal 0 HcmV?d00001 diff --git a/app/images/icon@1.25x.png b/app/images/icon@1.25x.png new file mode 100644 index 0000000000000000000000000000000000000000..9359d63e32ea05c6a4f4d96dcb310a1e839be352 GIT binary patch literal 546 zcmV+-0^R+IP)P znc0K?WjYELbQHYHi??#(JYZ8t!EPR~$fFWC1r~rVuq344y{}R)AtdqMy_D*cy;Ta% zr&MAXuZgE`nt!cSA8&c6^Zm@EI^WmFTi&fobrh@u72rAWn)tFpNrLkTuFpmlr82}F zxQ@Vi90DJKuRtiI-vkgk3Mxq>(&oMb_azK^5TAil2HS<+XXqWx61rpw>4!iyGu{7b zyzRpLvhm~bv{i-lLkmDizX8-zkWx9jw78fRttC98MhWTf0*#5n`Q>cVhcBjy8%cd; z_jgbiA-VvI>tH!EX2vmjT>y0v0y{HDN=U!UP}S+Tp>qhozQ9d9Nq7^Rc;^uMZ5XQh z^oH5#`*K^@b8z(yt}tDGvSFGu=)sToqYpip13~Nd;V-&i6(^Oo56roJFsa-s8vLDJ zDRm0pKNx?|B%&^ZDVRe kT0m7tK@E8O&wf9@0m#6diW9y5*#H0l07*qoM6N<$f?4|WaR2}S literal 0 HcmV?d00001 diff --git a/app/images/icon@1.5x.png b/app/images/icon@1.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..d33efb32735586fb1a152c9d49ede8df158d1023 GIT binary patch literal 619 zcmV-x0+juUP)ab8Hp-m*fmT_Z-d)p*_#UTqvvUDHk|3CM< z?lt^R61E#VVY{(23r5U9ZURSYS`~)n3T4oW4qyWx0p~nFB5XIdfhVax>i0okhhPBiSGiWc z4Fw$rpJDJRD?)EIU>E35%|$_n%lG70(DM{uAK2A|VYPsbTt@OsUsYI31IRQ|T1}@( z-n$^5C{wkt8H@i?hJmG3sWT~?=j5?I5Qb&rb(?rysN9jsohJIa)b+aHb(_)djyGE1 zz9MkJ@5w5057WurL#gBUAaEr%Posqg&yOfwF%jCRg04P<;&nOqJJ9VIY3Fg+uuMUXB+l zOn8`vNy>q`o=;<%XTF1bEW=Q~VX{y(6Zlr5*LNYu>6^eiaqC4Za*!JE7N_QNa{er0ne%3z@Q-yaz{sOUxy2(nrWG?^!002ovPDHLk FV1f_;7jXap literal 0 HcmV?d00001 diff --git a/app/images/icon@2x.png b/app/images/icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2af4f53d25efa3dab145d64256c80c63fc8bad43 GIT binary patch literal 780 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 ew4n_x5c?01A6VE2bbSo~0000 checkRetryTimer = setTimeout(checker, 1500)); + settings.watch("port", () => checkRetryTimer = setTimeout(checker, 1500)); +} + +async function checker() { + + clearTimeout(checkRetryTimer); + + tray.setImage(icon.offline); + + if (eventsStream) { + if (eventsStream.socket.destroyed === false) { + eventsStream.destroy(); + } + + eventsStream.removeAllListeners(); + } + + const host = settings.get("host"); + const port = settings.get("port"); + console.log("host:", host); + console.log("port:", port); + + if (!host || !port) { + return; + } + if (regexp.privateIPv4Address.test(host) === false || regexp.integer.test(port) === false) { + return; + } + + mirakurun.host = host; + mirakurun.port = parseInt(port, 10); + + try { + global.tuners = await mirakurun.getTuners(); + console.log("tuners:", global.tuners.length); + } catch (e) { + console.warn("tuners:", "error"); + tray.setToolTip(`${app.getName()} - Disconnected`); + + checkRetryTimer = setTimeout(checker, 5000); + return; + } + + try { + eventsStream = await mirakurun.getEventsStream({ + resource: "tuner", + type: "update" + }); + eventsStream.setEncoding("utf8"); + console.warn("events:", eventsStream.statusCode); + } catch (e) { + console.warn("events:", "error"); + tray.setToolTip(`${app.getName()} - Disconnected`); + + checkRetryTimer = setTimeout(checker, 5000); + return; + } + + if (eventsStream.statusCode !== 200) { + eventsStream = undefined; + tray.setToolTip(`${app.getName()} - Error: ${eventsStream.statusCode}`); + + checkRetryTimer = setTimeout(checker, 5000); + return; + } + + const updateTray = () => { + const isActive = global.tuners.some(tuner => tuner.isUsing === true && tuner.users.some(user => user.priority !== -1)); + if (isActive) { + tray.setToolTip(`${app.getName()} - Active`); + tray.setImage(icon.active); + } else { + tray.setToolTip(`${app.getName()} - Standby`); + tray.setImage(icon.normal); + } + }; + updateTray(); + + eventsStream.on("data", data => { + data = data.match(/(\{.+\})\n,/m); + if (!data) { + return; + } + // console.log(data[1]); + try { + const tuner = JSON.parse(data[1]).data; + global.tuners[tuner.index] = tuner; + updateTray(); + } catch (e) { } + }); + + eventsStream.on("end", () => { + console.log("ENDED!!! will retry"); + checkRetryTimer = setTimeout(checker, 3000); + }); + + clearTimeout(checkRetryTimer); +} + +function showStatus() { + + if (statusWindow) { + statusWindow.show(); + statusWindow.focus(); + return; + } + + statusWindow = new electron.BrowserWindow({ + icon: icon.normal, + width: 600, + height: 350, + minWidth: 600, + minHeight: 300, + frame: false, + closable: true, + alwaysOnTop: true, + transparent: true + }); + + statusWindow.loadURL(`file://${ __dirname }/ui/status.html`); + + statusWindow.once("closed", () => { + statusWindow = null; + }); +} + +function showPref() { + + prefWindow.show(); + prefWindow.focus(); +} + +function openHomepage() { + electron.shell.openExternal(pkg.homepage); +} + +function openFeedback() { + electron.shell.openExternal(pkg.bugs.url); +} + +function about() { + + electron.dialog.showMessageBox({ + type: "info", + icon: icon.normal30, + title: app.getName(), + message: app.getName(), + detail: `Version ${app.getVersion()}\nNode ${process.version}`, + buttons: [ + "Close" + ] + }); +} + +function quit() { + + if (statusWindow) { + statusWindow.destroy(); + } + if (prefWindow) { + prefWindow.destroy(); + } + + app.quit(); +} diff --git a/app/regexp.js b/app/regexp.js new file mode 100644 index 0000000..418bd96 --- /dev/null +++ b/app/regexp.js @@ -0,0 +1,8 @@ +"use strict"; + +module.exports = { + privateIPv4Address: /^(?:(?:(?:127\.)|(?:10\.)[0-9]{0,3}\.)|(?:172\.1[6-9]\.)|(?:172\.2[0-9]\.)|(?:172\.3[0-1]\.)|(?:192\.168\.))[0-9]{1,3}\.[0-9]{1,3}$/, + windowsNamedPipe: /^\\\\\.\\pipe\\.+/, + unixDomainSocket: /^\/.+/, + integer: /^[0-9]+$/ +}; diff --git a/app/ui/basic.css b/app/ui/basic.css new file mode 100644 index 0000000..12505bd --- /dev/null +++ b/app/ui/basic.css @@ -0,0 +1,82 @@ +body { + font-family: 'Segoe UI', Helvetica, arial, freesans, clean, sans-serif; +} + +div#container { + -webkit-app-region: drag; + user-select: none; + position: absolute; + top: 8px; + right: 8px; + bottom: 8px; + left: 8px; + background: #fff; + box-shadow: 0 0 8px rgba(130,130,130,0.5); + border: 1px solid #777; + padding: 45px 10px 10px 10px; +} + +div#container.active { + box-shadow: 0 0 8px rgba(255,225,138,0.5); + border: 1px solid #ffd56c; +} + +div#container * { + -webkit-app-region: no-drag; +} + +div#container > h1.title { + -webkit-app-region: drag; + z-index: 9999; + position: absolute; + display: block; + top: 0; + right: 40px; + left: 0; + margin: 0; + padding: 0 10px 0 44px; + line-height: 35px; + font-weight: normal; + font-size: 12px; + cursor: default; + background-image: url(../images/icon.svg); + background-position: 10px 5px; + background-size: 24px 24px; + background-repeat: no-repeat; + color: #777; +} + +div#container.active > h1.title { + color: #000; +} + +div#container > button.close { + z-index: 9999; + position: absolute; + top: 0; + right: 0; + width: 40px; + height: 35px; + font-size: 14px; +} + +div#container > button.close > span { + color: #777; +} + +div#container > button.close:focus, +div#container > button.close:active, +div#container > button.close:hover { + box-shadow: none; + border-color: transparent; +} + +div#container > button.close:hover > span { + color: #000; +} + +.command { + color: #555; + font-family: monospace; + font-size: 12px; +} \ No newline at end of file diff --git a/app/ui/basic.js b/app/ui/basic.js new file mode 100644 index 0000000..7a7878a --- /dev/null +++ b/app/ui/basic.js @@ -0,0 +1,49 @@ +/*eslint no-unused-vars: 0 */ +/*globals flagrate */ +/// +"use strict"; + +const settings = require("electron-settings"); +const electron = require("electron"); +const remote = electron.remote; +const regexp = require("../regexp"); + +window.addEventListener("DOMContentLoaded", () => { + + const container = flagrate.Element.extend(document.getElementById("container")); + + window.addEventListener("blur", updateWindowState); + window.addEventListener("focus", updateWindowState); + + function updateWindowState() { + setImmediate(() => { + if (document.hasFocus() === true) { + container.addClassName("active"); + } else { + container.removeClassName("active"); + } + }); + } + + updateWindowState(); + + new flagrate.Element("h1", { + "class": "title" + }) + .insertText(document.title) + .insertTo(container); + + new flagrate.Button({ + label: "✕", + color: "#fff", + className: "close", + onSelect: () => { + const w = remote.BrowserWindow.getFocusedWindow(); + if (w.isClosable()) { + w.close(); + } else { + w.hide(); + } + } + }).insertTo(container); +}); diff --git a/app/ui/pref.html b/app/ui/pref.html new file mode 100644 index 0000000..626bb2c --- /dev/null +++ b/app/ui/pref.html @@ -0,0 +1,18 @@ + + + + + Preferences + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/app/ui/pref.js b/app/ui/pref.js new file mode 100644 index 0000000..2fd756b --- /dev/null +++ b/app/ui/pref.js @@ -0,0 +1,62 @@ +/*globals flagrate, settings, regexp */ +/// +"use strict"; + +window.addEventListener("DOMContentLoaded", () => { + + const container = flagrate.Element.extend(document.getElementById("container")); + + const div = new flagrate.Element().insertTo(container); + + let current = `${settings.get("host")}:${settings.get("port")}`; + let saveHostTimer; + + const form = new flagrate.Form({ + fields: [ + { + label: "Host", + input: { + type: "combobox", + items: [ + "192.168.x.x:40772" + ], + trim: true, + val: current, + validators: [ + (input, done) => { + + if (input === "") { + done(null, "N/A"); + return; + } + + const [host, port] = input.split(":"); + + if (regexp.privateIPv4Address.test(host) === true && regexp.integer.test(port) === true) { + clearTimeout(saveHostTimer); + saveHostTimer = setTimeout(() => { + if (current !== input) { + current = input; + + settings.setAll({ + host: host, + port: port + }); + } + }, 1500); + + done(true, "TCP/IPv4"); + return; + } + + done(false, "Invalid Host"); + }, + (input, done) => done(true, "Saved.") + ] + } + } + ] + }); + + form.insertTo(div); +}); diff --git a/app/ui/status.html b/app/ui/status.html new file mode 100644 index 0000000..37e709a --- /dev/null +++ b/app/ui/status.html @@ -0,0 +1,18 @@ + + + + + Status + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/app/ui/status.js b/app/ui/status.js new file mode 100644 index 0000000..cda40d5 --- /dev/null +++ b/app/ui/status.js @@ -0,0 +1,136 @@ +/*globals flagrate, remote */ +/// +"use strict"; + +window.addEventListener("DOMContentLoaded", async () => { + + const container = flagrate.Element.extend(document.getElementById("container")); + + const mirakurun = remote.getGlobal("mirakurun"); + + let status/*, logStream*/; + try { + status = await mirakurun.getStatus(); + // logStream = await mirakurun.getLogStream(); + // remote.BrowserWindow.getFocusedWindow().once("closed", () => { logStream.destroy(); }); + } catch (e) { + console.error(e); + container.updateText("Connection Failed."); + return; + } + + const title = document.querySelector("h1"); + title.insertText(` - Mirakurun ${status.version} ${status.process.arch} (${status.process.platform})`); + + const tunersElement = new flagrate.Element(); + // const logsElement = new flagrate.Element(); + + const tunersGrid = new flagrate.Grid({ + disableSelect: true, + cols: [ + { + key: "name", + label: "Name", + width: 80 + }, + { + key: "types", + label: "Types", + width: 55 + }, + { + key: "command", + label: "Command" + }, + { + key: "users", + label: "Users [Priority]", + width: 170 + } + ] + }).insertTo(tunersElement); + + const updateTuners = () => { + const tuners = remote.getGlobal("tuners"); + const rows = tuners.map(tuner => { + let menuItems; + if (tuner.command) { + menuItems = [{ + label: "Kill Tuner Process...", + onSelect: () => { + new flagrate.Modal({ + title: "Kill Tuner Process", + text: "Are you sure?", + buttons: [ + { + label: "Kill", + color: "@red", + onSelect: async (e, modal) => { + modal.close(); + + modal = new flagrate.Modal({ + disableCloseButton: true, + disableCloseByMask: true, + disableCloseByEsc: true, + title: "Kill Tuner Process", + text: "Killing..." + }).open(); + + await mirakurun.killTunerProcess(tuner.index); + + modal.close(); + } + }, + { + label: "Cancel", + onSelect: (e, modal) => { + modal.close(); + } + } + ] + }).open(); + } + }]; + } + + return { + cell: { + name: tuner.name, + types: tuner.types.join(", "), + command: { + text: tuner.command || "-", + className: "command" + }, + users: { + html: tuner.users.map(user => `${user.id} [${user.priority}]`).join("
") + } + }, + menuItems: menuItems + }; + }); + + tunersGrid.splice(0, tunersGrid.rows.length, rows); + }; + setInterval(updateTuners, 3000); + updateTuners(); + + /* logStream.on("data", data => { + logsElement.insertText(data); + }); */ + + new flagrate.createTab({ + fill: true, + tabs: [ + { + key: "tuners", + label: "Tuners", + element: tunersElement + }/* , + { + key: "logs", + label: "Logs", + element: logsElement + } */ + ] + }).insertTo(container); +}); diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..2eefe90 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,16 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=759670 + // for the documentation about the jsconfig.json format + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "allowSyntheticDefaultImports": true + }, + "exclude": [ + "node_modules", + "bower_components", + "jspm_packages", + "tmp", + "temp" + ] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c96ac9a --- /dev/null +++ b/package.json @@ -0,0 +1,60 @@ +{ + "name": "mirakurun-ui", + "productName": "Mirakurun UI", + "version": "1.0.0", + "description": "Mirakurun's Desktop UI Application.", + "homepage": "https://github.com/Chinachu/Mirakurun-UI", + "keywords": [ + "mirakurun", + "chinachu", + "dtv" + ], + "main": "app/main.js", + "scripts": { + "start": "electron .", + "package.win32": "electron-packager ./ mirakurun-ui --platform=win32 --arch=ia32 --icon=app/images/icon.ico --out=dist --asar --overwrite", + "package.darwin": "electron-packager ./ mirakurun-ui --platform=darwin --arch=x64 --out=dist --overwrite", + "build.win32": "build --win --ia32", + "test": "eslint app/**/*.js" + }, + "build": { + "appId": "moe.chinachu.mirakurun.ui", + "copyright": "Chinatsu Yoshikawa", + "compression": "maximum", + "win": { + "target": "nsis-web", + "icon": "app/images/icon.ico" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Chinachu/Mirakurun-UI.git" + }, + "author": "kanreisa (https://github.com/kanreisa)", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/Chinachu/Mirakurun-UI/issues" + }, + "dependencies": { + "electron-settings": "^3.0.14", + "flagrate": "^1.0.0-beta.20", + "mirakurun": "^2.3.1" + }, + "devDependencies": { + "@types/electron": "^1.4.37", + "@types/electron-settings": "^3.0.0", + "@types/node": "^7.0.16", + "electron": "^1.6.6", + "electron-builder": "^17.1.2", + "electron-packager": "^8.7.0", + "eslint": "^3.19.0", + "eslint-config-defaults": "^9.0.0" + }, + "engines": { + "node": ">=7.4.0" + }, + "os": [ + "darwin", + "win32" + ] +}