Compare commits
10 Commits
fedb1f9e47
...
main
Author | SHA1 | Date | |
---|---|---|---|
c574586cdd
|
|||
bbe131697c
|
|||
44a9ccd7d0
|
|||
456c4dacd3
|
|||
f004310476
|
|||
f8456a1e33
|
|||
4dfa9bc085
|
|||
90d11a5605
|
|||
e3d2295a7a
|
|||
3aaf71cf43
|
@ -1,3 +1,11 @@
|
||||
```sh
|
||||
$ jekyll serve
|
||||
```
|
||||
|
||||
https://wasmer.io/
|
||||
|
||||
```sh
|
||||
$ wasmer login
|
||||
$ wasmer deploy
|
||||
wasmer/wasmer-sh
|
||||
```
|
||||
|
520
css/terminal.css
@ -1,520 +0,0 @@
|
||||
html {
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-font-smoothing: antialiased;
|
||||
-ms-font-smoothing: antialiased;
|
||||
-o-font-smoothing: antialiased;
|
||||
}
|
||||
body {
|
||||
background-attachment: fixed;
|
||||
-webkit-background-size: cover;
|
||||
background-size: cover;
|
||||
color: #444;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
#window {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
background: #343434;
|
||||
border-radius: 7px;
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
height: 400px;
|
||||
}
|
||||
|
||||
#topbar {
|
||||
width: 100%;
|
||||
height: 21px;
|
||||
font-size: 16px;
|
||||
font-family: "Myriad Pro", sans-serif;
|
||||
text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.25);
|
||||
-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.5);
|
||||
-moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
#topbar ul li {
|
||||
float: left;
|
||||
padding: 0 10px;
|
||||
height: 21px;
|
||||
line-height: 24px;
|
||||
}
|
||||
#topbar ul li:first-child {
|
||||
font-size: 20px;
|
||||
line-height: 26px;
|
||||
margin-left: 5px;
|
||||
}
|
||||
#topbar ul li:nth-child(2) {
|
||||
font-family: "Myriad-Semi", sans-serif;
|
||||
}
|
||||
#topbar ul li:active {
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(1, #4a82ff), color-stop(0, #0052fc));
|
||||
color: #fff;
|
||||
text-shadow: none;
|
||||
}
|
||||
#toolbar {
|
||||
width: 100%;
|
||||
height: 25px;
|
||||
background: #ccc;
|
||||
}
|
||||
#toolbar .top {
|
||||
float: left;
|
||||
width: 100%;
|
||||
height: 23px;
|
||||
}
|
||||
#toolbar .bottom {
|
||||
float: left;
|
||||
width: 100%;
|
||||
height: 30px;
|
||||
}
|
||||
#toolbar #lights {
|
||||
float: left;
|
||||
position: relative;
|
||||
top: 6px;
|
||||
left: 7px;
|
||||
}
|
||||
.light {
|
||||
float: left;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
border-radius: 14px;
|
||||
-webkit-box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.5), 0px 0px 3px #000 inset;
|
||||
-moz-box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.5), 0px 0px 3px #000 inset;
|
||||
box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.5), 0px 0px 3px #000 inset;
|
||||
overflow: hidden;
|
||||
}
|
||||
#lights:hover .glyph {
|
||||
opacity: 1;
|
||||
cursor: default;
|
||||
}
|
||||
.light .shine {
|
||||
width: 4px;
|
||||
height: 3px;
|
||||
border-radius: 10px;
|
||||
background: -moz-radial-gradient(center, ellipse cover, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
|
||||
background-image: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgba(255, 255, 255, 1)), color-stop(100%, rgba(255, 255, 255, 0)));
|
||||
background: -webkit-radial-gradient(center, ellipse cover, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
|
||||
background: -o-radial-gradient(center, ellipse cover, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
|
||||
background: -ms-radial-gradient(center, ellipse cover, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
|
||||
background: radial-gradient(center, ellipse cover, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
|
||||
}
|
||||
.light .glow {
|
||||
width: 14px;
|
||||
height: 8px;
|
||||
background-image: -webkit-gradient(radial, center bottom, 0, center center, 5, from(rgba(255, 255, 255, 0.75)), to(rgba(255, 255, 255, 0)));
|
||||
background: 0px 0px -moz-radial-gradient(bottom, cover, rgba(255, 255, 255, 0.70) 0%, rgba(255, 255, 255, 0) 80%);
|
||||
}
|
||||
.red {
|
||||
background: #f41b16;
|
||||
background: -moz-linear-gradient(top, #f41b16 0%, #fc7471 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f41b16), color-stop(100%, #fc7471));
|
||||
background: -webkit-linear-gradient(top, #f41b16 0%, #fc7471 100%);
|
||||
background: -o-linear-gradient(top, #f41b16 0%, #fc7471 100%);
|
||||
background: -ms-linear-gradient(top, #f41b16 0%, #fc7471 100%);
|
||||
background: linear-gradient(top, #f41b16 0%, #fc7471 100%);
|
||||
}
|
||||
.red:active {
|
||||
background: #972f2e;
|
||||
background: -moz-linear-gradient(top, #972f2e 0%, #fc7471 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #972f2e), color-stop(100%, #fc7471));
|
||||
background: -webkit-linear-gradient(top, #972f2e 0%, #fc7471 100%);
|
||||
background: -o-linear-gradient(top, #972f2e 0%, #fc7471 100%);
|
||||
background: -ms-linear-gradient(top, #972f2e 0%, #fc7471 100%);
|
||||
background: linear-gradient(top, #972f2e 0%, #fc7471 100%);
|
||||
}
|
||||
.red .shine {
|
||||
position: relative;
|
||||
top: -21px;
|
||||
left: 5px;
|
||||
}
|
||||
.red .glow {
|
||||
position: relative;
|
||||
top: -20px;
|
||||
}
|
||||
.red .glyph {
|
||||
position: relative;
|
||||
top: -5px;
|
||||
left: 3px;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
color: #9b3a36;
|
||||
z-index: 50;
|
||||
opacity: 0;
|
||||
}
|
||||
.yellow {
|
||||
background: #f4a316;
|
||||
background: -moz-linear-gradient(left, #f4a316 0%, #fcc371 100%);
|
||||
background: -webkit-gradient(linear, left top, right top, color-stop(0%, #f4a316), color-stop(100%, #fcc371));
|
||||
background: -webkit-linear-gradient(left, #f4a316 0%, #fcc371 100%);
|
||||
background: -o-linear-gradient(left, #f4a316 0%, #fcc371 100%);
|
||||
background: -ms-linear-gradient(left, #f4a316 0%, #fcc371 100%);
|
||||
background: linear-gradient(left, #f4a316 0%, #fcc371 100%);
|
||||
margin: 0px 7px;
|
||||
}
|
||||
.yellow:active {
|
||||
background: #ae4f1e;
|
||||
background: -moz-linear-gradient(top, #ae4f1e 0%, #fcc371 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ae4f1e), color-stop(100%, #fcc371));
|
||||
background: -webkit-linear-gradient(top, #ae4f1e 0%, #fcc371 100%);
|
||||
background: -o-linear-gradient(top, #ae4f1e 0%, #fcc371 100%);
|
||||
background: -ms-linear-gradient(top, #ae4f1e 0%, #fcc371 100%);
|
||||
background: linear-gradient(top, #ae4f1e 0%, #fcc371 100%);
|
||||
}
|
||||
.yellow .shine {
|
||||
position: relative;
|
||||
top: -21px;
|
||||
left: 5px;
|
||||
}
|
||||
.yellow .glow {
|
||||
position: relative;
|
||||
top: -20px;
|
||||
}
|
||||
.yellow .glyph {
|
||||
position: relative;
|
||||
top: -5px;
|
||||
left: 3px;
|
||||
font-size: 24px;
|
||||
color: #854322;
|
||||
z-index: 50;
|
||||
opacity: 0;
|
||||
-webkit-transform: scaleY(1.5) scaleX(1.3);
|
||||
}
|
||||
.green {
|
||||
background: #4cae2e;
|
||||
background: -moz-linear-gradient(top, #4cae2e 0%, #dafc71 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #4cae2e), color-stop(100%, #dafc71));
|
||||
background: -webkit-linear-gradient(top, #4cae2e 0%, #dafc71 100%);
|
||||
background: -o-linear-gradient(top, #4cae2e 0%, #dafc71 100%);
|
||||
background: -ms-linear-gradient(top, #4cae2e 0%, #dafc71 100%);
|
||||
background: linear-gradient(top, #4cae2e 0%, #dafc71 100%);
|
||||
}
|
||||
.green:active {
|
||||
background: #48752b;
|
||||
background: -moz-linear-gradient(top, #48752b 0%, #dafc71 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #48752b), color-stop(100%, #dafc71));
|
||||
background: -webkit-linear-gradient(top, #48752b 0%, #dafc71 100%);
|
||||
background: -o-linear-gradient(top, #48752b 0%, #dafc71 100%);
|
||||
background: -ms-linear-gradient(top, #48752b 0%, #dafc71 100%);
|
||||
background: linear-gradient(top, #48752b 0%, #dafc71 100%);
|
||||
}
|
||||
.green .shine {
|
||||
position: relative;
|
||||
top: -20px;
|
||||
left: 5px;
|
||||
}
|
||||
.green .glow {
|
||||
position: relative;
|
||||
top: -20px;
|
||||
}
|
||||
.green .glyph {
|
||||
position: relative;
|
||||
top: -5px;
|
||||
left: 3px;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
color: #25571d;
|
||||
z-index: 50;
|
||||
opacity: 0;
|
||||
}
|
||||
@-moz-document url-prefix() {
|
||||
.red .glyph {
|
||||
position: relative;
|
||||
top: -5px;
|
||||
}
|
||||
.yellow .glyph {
|
||||
top: -4px;
|
||||
left: 3px;
|
||||
}
|
||||
.green .glyph {
|
||||
position: relative;
|
||||
top: -4px;
|
||||
}
|
||||
}
|
||||
#title {
|
||||
float: left;
|
||||
position: relative;
|
||||
top: 6px;
|
||||
width: 40%;
|
||||
left: 45%;
|
||||
font-family: "Myriad Pro", sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.folder {
|
||||
float: left;
|
||||
margin-right: 5px;
|
||||
}
|
||||
.folder .tab {
|
||||
width: 4px;
|
||||
height: 2px;
|
||||
background: #a4c5da;
|
||||
border: 1px solid #728ea3;
|
||||
border-bottom: none;
|
||||
border-radius: 2px 2px 0px 0px;
|
||||
-webkit-box-shadow: 0px -1px 0px #99b5c7 inset;
|
||||
margin-left: 1px;
|
||||
z-index: 5000;
|
||||
margin-bottom: -1px;
|
||||
}
|
||||
.folder .body {
|
||||
width: 14px;
|
||||
height: 10px;
|
||||
border: 1px solid #6e8ba1;
|
||||
background: #b8cfe0;
|
||||
background: -moz-linear-gradient(top, #b8cfe0 0%, #86adc8 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b8cfe0), color-stop(100%, #86adc8));
|
||||
background: -webkit-linear-gradient(top, #b8cfe0 0%, #86adc8 100%);
|
||||
background: -o-linear-gradient(top, #b8cfe0 0%, #86adc8 100%);
|
||||
background: -ms-linear-gradient(top, #b8cfe0 0%, #86adc8 100%);
|
||||
background: linear-gradient(top, #b8cfe0 0%, #86adc8 100%);
|
||||
z-index: -50;
|
||||
-webkit-box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.25) inset, 0px 1px 0px rgba(0, 0, 0, 0.2);
|
||||
-moz-box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.25) inset, 0px 1px 0px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
#nav {
|
||||
margin: 1px 8px;
|
||||
float: left;
|
||||
}
|
||||
#view {
|
||||
margin: 2px 0 0 110px;
|
||||
display: inline-block;
|
||||
}
|
||||
.control_box {
|
||||
height: 20px;
|
||||
border-radius: 3px;
|
||||
border: 1px solid #555;
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(1, #fefefe), color-stop(0, #b8b8b8));
|
||||
box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.25);
|
||||
}
|
||||
.control_box .control {
|
||||
height: 20px;
|
||||
border-right: 1px solid #2e2e2e;
|
||||
float: left;
|
||||
text-align: center;
|
||||
width: 27px;
|
||||
}
|
||||
.control:last-child {
|
||||
border-right: 0px solid !important;
|
||||
}
|
||||
.control:active {
|
||||
background: #b0afb0;
|
||||
-webkit-box-shadow: 0px 0px 4px #000 inset;
|
||||
}
|
||||
.active {
|
||||
background: #707070 !important;
|
||||
-webkit-box-shadow: 0px 3px 4px rgba(0, 0, 0, 0.6) inset !important;
|
||||
}
|
||||
#body {
|
||||
font-family: Andale Mono, monospace;
|
||||
line-height: 1em;
|
||||
font-size: 13px;
|
||||
float: left;
|
||||
width: 100%;
|
||||
background: #002b36;
|
||||
padding: 10px;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
#body p {
|
||||
color: #63de00!important;
|
||||
}
|
||||
@keyframes blink {
|
||||
0% {
|
||||
background: rgba(99, 222, 0, 100);
|
||||
}
|
||||
100% {
|
||||
background: rgba(99, 222, 0, 0);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes blink {
|
||||
0% {
|
||||
background: rgba(99, 222, 0, 100);
|
||||
}
|
||||
100% {
|
||||
background: rgba(99, 222, 0, 0);
|
||||
}
|
||||
}
|
||||
@-moz-keyframes blink {
|
||||
0% {
|
||||
background: rgba(99, 222, 0, 100);
|
||||
}
|
||||
100% {
|
||||
background: rgba(99, 222, 0, 0);
|
||||
}
|
||||
}
|
||||
.cursor {
|
||||
width: 10px;
|
||||
margin-left: 0px;
|
||||
color: #fff;
|
||||
}
|
||||
#body p::-webkit-selection {
|
||||
background: #0b209e;
|
||||
}
|
||||
#body p::selection {
|
||||
background: #0b209e;
|
||||
}
|
||||
#body p::-moz-selection {
|
||||
background: #0b209e;
|
||||
}
|
||||
#body p {
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
font-size: 13px;
|
||||
}
|
||||
#content {
|
||||
float: left;
|
||||
margin-top: 1px;
|
||||
}
|
||||
#foot {
|
||||
height: 23px;
|
||||
width: 100%;
|
||||
float: left;
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(1, #cbcbcb), color-stop(0, #a7a7a7));
|
||||
border-top: 1px solid #515151;
|
||||
border-radius: 0 0 5px 5px;
|
||||
}
|
||||
#foot .handle {
|
||||
width: 11px;
|
||||
height: 11px;
|
||||
float: right;
|
||||
margin: 6px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.handle .grip {
|
||||
-webkit-transform: rotate(45deg) scaley(3);
|
||||
margin: 2px 0 0 2px;
|
||||
color: #646464;
|
||||
text-shadow: 1px 1px 0 #c6c6c6;
|
||||
font-size: 14px;
|
||||
}
|
||||
.icon .frame {
|
||||
width: 82px;
|
||||
height: 82px;
|
||||
border-radius: 5px;
|
||||
border: 2px solid transparent;
|
||||
}
|
||||
.icon .name {
|
||||
color: #000;
|
||||
padding-top: 3px;
|
||||
border-radius: 15px;
|
||||
width: 55px;
|
||||
margin: 5px 0 0 15px;
|
||||
}
|
||||
.icon .folder {
|
||||
margin: 15px 0 0 6px;
|
||||
}
|
||||
#icon-github {
|
||||
text-align: -999px;
|
||||
font-size: 1px;
|
||||
display: block;
|
||||
width: 156px;
|
||||
height: 133px;
|
||||
background-image: url(../img/sprite.png);
|
||||
background-position: 0 133px;
|
||||
}
|
||||
#icon-github:hover {
|
||||
background-position: 0 0px;
|
||||
}
|
||||
#icon-rubygems {
|
||||
text-align: -999px;
|
||||
font-size: 1px;
|
||||
display: block;
|
||||
width: 156px;
|
||||
height: 133px;
|
||||
background-image: url(../img/sprite.png);
|
||||
background-position: 158px 133px;
|
||||
}
|
||||
#icon-rubygems:hover {
|
||||
background-position: 158px 0px;
|
||||
}
|
||||
.source-urls {
|
||||
margin-top: 40px;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
.no-margin-bot {
|
||||
color: #337AB7;
|
||||
}
|
||||
span {
|
||||
font-size: 15px;
|
||||
}
|
||||
#particles-js {
|
||||
position: absolute;
|
||||
width: 98%;
|
||||
}
|
||||
#particles-js-no {
|
||||
position: absolute;
|
||||
width: 98%;
|
||||
}
|
||||
|
||||
#icon-github:hover,
|
||||
i.icon.ion-close-circled:hover,
|
||||
i.icon.ion-minus-circled:hover,
|
||||
i.icon.ion-plus-circled:hover {
|
||||
color: rgba(0, 0, 0, .5);
|
||||
}
|
||||
i.icon.ion-close-circled {
|
||||
color: rgba(212, 42, 38, 0.83);
|
||||
text-shadow: 0 0 1px rgba(187, 187, 187, 0.56);
|
||||
padding-top: 3px;
|
||||
}
|
||||
i.icon.ion-minus-circled {
|
||||
color: rgb(160, 165, 34);
|
||||
text-shadow: 0 0 1px rgba(187, 187, 187, 0.56);
|
||||
padding-top: 3px;
|
||||
}
|
||||
i.icon.ion-plus-circled {
|
||||
color: rgb(82, 183, 51);
|
||||
text-shadow: 0 0 1px rgba(187, 187, 187, 0.56);
|
||||
padding-top: 3px;
|
||||
}
|
||||
.icon {
|
||||
margin: 7px;
|
||||
float: left;
|
||||
font-size: 20px;
|
||||
}
|
||||
#title-left {
|
||||
position: relative;
|
||||
top: -8px;
|
||||
font-family: "Myriad Pro", sans-serif;
|
||||
font-size: 14px;
|
||||
left: 49%;
|
||||
}
|
||||
#terminal-origin {
|
||||
font-family: monospace;
|
||||
}
|
||||
@media all and (-webkit-min-device-pixel-ratio: 0) and (min-resolution: .001dpcm) {
|
||||
#title-left {
|
||||
top: -13px;
|
||||
}
|
||||
}
|
||||
|
||||
home-layout {
|
||||
background-color: #f1f1f1;
|
||||
}
|
||||
|
||||
.terminal, .cmd {
|
||||
background-color: #343434;
|
||||
}
|
||||
|
||||
@media screen and (max-width:1000px){i.icon.ion-minus-circled{display:none}
|
||||
#window{width:100%;}
|
||||
}
|
||||
@media screen and (max-width:800px){body{padding-top:0px;}
|
||||
#title-left{left:50%;}
|
||||
#window{width:100%;}
|
||||
.container{padding:0px;}
|
||||
/*article{padding:10px 20px;}*/
|
||||
i.icon.ion-minus-circled{display:none}
|
||||
}
|
||||
@media screen and (max-width:800px){#title-left{left:48%;}
|
||||
}
|
||||
@media screen and (max-width:500px){#title-left{left:40%;}
|
||||
}
|
||||
@media screen and (max-width:400px){body{padding-top:0px;width:auto;}
|
||||
#title-left{left:50%;}
|
||||
/*article{padding:10px 10px;}*/
|
||||
#particles-js{width:auto;}
|
||||
#particles-js-no{width:auto;}
|
||||
i.icon.ion-minus-circled{display:none}
|
||||
i.icon.ion-plus-circled{display:none}
|
||||
}
|
||||
|
23
index.html
@ -6,17 +6,16 @@
|
||||
<meta name="author" content="syui" />
|
||||
<meta name="copyright" content="© syui" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
|
||||
<link rel="icon" href="/icon/term.png" />
|
||||
<link rel="shortcut icon" href="/icon/term.png" />
|
||||
<link rel="stylesheet" href="/pkg/jquery.terminal/css/jquery.terminal.css" />
|
||||
<link rel="stylesheet" href="/css/terminal.css" />
|
||||
<script src="/pkg/jquery.ajax/jquery.min.js"></script>
|
||||
<script src="/pkg/axios/dist/axios.min.js"></script>
|
||||
<script src="/pkg/jquery.terminal/js/jquery.terminal.min.js"></script>
|
||||
<script src="/pkg/jquery.terminal/js/jquery.mousewheel-min.js"></script>
|
||||
<script src="/js/terminal.quick.js"></script>
|
||||
<script src="/js/terminal.js"></script>
|
||||
<link rel="icon" href="/term/icon/term.png" />
|
||||
<link rel="shortcut icon" href="/term/icon/term.png" />
|
||||
<link rel="stylesheet" href="/term/pkg/jquery.terminal/css/jquery.terminal.css" />
|
||||
<link rel="stylesheet" href="/term/css/terminal.css" />
|
||||
<script src="/term/pkg/jquery.ajax/jquery.min.js"></script>
|
||||
<script src="/term/pkg/axios/dist/axios.min.js"></script>
|
||||
<script src="/term/pkg/jquery.terminal/js/jquery.terminal.min.js"></script>
|
||||
<script src="/term/pkg/jquery.terminal/js/jquery.mousewheel-min.js"></script>
|
||||
<script src="/term/js/terminal.js"></script>
|
||||
<app></app>
|
||||
<script src="/js/bundle.js"></script>
|
||||
<script src="/js/terminal-open.js"></script>
|
||||
<script src="/term/js/bundle.js"></script>
|
||||
<script src="/term/js/terminal-open.js"></script>
|
||||
</head>
|
||||
|
275
js/terminal.js
@ -1,275 +0,0 @@
|
||||
$(function() {
|
||||
var prompt = "[[b;#87cefa;]ai][[b;#FFFF00;]@aios] ~$ ";
|
||||
let url = new URL(window.location.href);
|
||||
let user = url.searchParams.get('user');
|
||||
let id = url.searchParams.get('id');
|
||||
if (id == null) { id = 2 };
|
||||
let did = url.searchParams.get('did');
|
||||
if (did == null) { did = "did:plc:4hqjfn7m6n5hno3doamuhgef" };
|
||||
if (user) { prompt = "[[b;#87cefa;]" + user + "][[b;#FFFF00;]@aios] ~$ " };
|
||||
var tab = "[[b;#87cefa;]<tab>]";
|
||||
var command_all = ["ai","ls","ai.json"];
|
||||
var handle = "yui.syui.ai";
|
||||
|
||||
var file_all = "ai.json";
|
||||
var ai_help = "\n\
|
||||
\nCommands:\
|
||||
\n ai\
|
||||
\n\
|
||||
\nFlags:\
|
||||
\n\t\t-h, --help\
|
||||
\n\
|
||||
\nOptions:\
|
||||
\n\ta\t\t\t\t: logo\
|
||||
\n\tv\t\t\t\t: pds version\
|
||||
\n\tp\t\t\t\t: ai profile\
|
||||
\n\tdid\t<handle> : did\
|
||||
\n\tplc\t<handle> : plc\
|
||||
\n\trecord <handle> : timeline\
|
||||
\n\
|
||||
\nex:\
|
||||
\n\t$ ai v\t: {\"version\":\"0.0.1\"}\
|
||||
\n\t\
|
||||
\nhttps://git.syui.ai/ai/bot\
|
||||
\n\t\
|
||||
";
|
||||
|
||||
var ascii_logo = '\n\ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⠉⠀⠀⠀⠀⠀⠈⠉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀\⠀ \n⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣦⣤⣤⣤⣤⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠀⠀\⠀ \n⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀\⠀ \n⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆\⠀ \n⠀⠀⠘⠛⠛⠛⠛⠉⠉⠉⠉⠁⠀⠀⠀⠀⠈⠛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠋⠀⠀⠀⠀⠀⠉⠉⠉⠉⠙⠛⠛⠛⠛\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠛⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠟⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\⠀ \n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\⠀ \n\n';
|
||||
|
||||
var ascii_ai = "\n\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠉⣁⠉⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠟⠛⠋⣉⣉⠡⠤⠤⠤⠤⠤⠤⠤⠤⠬⠤⣁⣉⡉⠛⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢉⣤⡖⠚⣉⣡⣤⣦⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣴⣤⣤⠉⠑⣦⣌⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⣾⣿⣦⣄⣅⣌⣄⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣶⣾⣿⣿⣁⣘⡙⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⢃⣤⣨⣿⡿⡿⠟⠟⠛⠻⠚⠛⠛⠛⠛⠛⠛⠋⡋⡋⠛⠛⠉⠉⠼⠿⠿⠿⠿⠿⠷⢶⢤⣈⠙⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⢋⡡⠞⠛⣉⣉⣤⣤⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣶⣶⣶⣶⣶⣶⣦⣦⣦⣦⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⢁⣀⣤⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠟⠛⠋⡉⣉⣉⣁⣨⣀⣅⣉⣉⢉⠛⠛⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⣁⡤⣴⣲⢯⢯⡯⣗⡯⣞⡾⣺⣺⢵⢯⢯⣟⢶⢦⣤⣀⡉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠉⣠⣔⡯⣗⡯⣗⡯⡯⣟⣞⣗⡯⣗⡯⣗⡯⡯⣟⣽⣺⢽⢽⣺⣳⢯⣟⡦⣌⡙⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⣠⣻⣺⣺⢽⣳⢯⣗⡯⡯⣗⡯⡾⣝⣗⡯⣗⡯⡯⣗⣗⡯⣟⣽⣺⣺⢽⣺⢽⣳⣻⢦⣈⠛⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⢠⣺⣳⢽⣺⣺⢽⣺⢽⣺⢽⣫⣗⡯⡯⣗⣗⡯⣗⡯⡯⣗⣗⡯⣗⣗⡯⡾⣽⣺⢽⡽⣾⣽⣺⢵⡀⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⣔⣟⣞⡾⣽⣺⣺⢽⣺⢽⣺⢽⣺⣺⢽⣫⣗⣗⡯⣗⡯⡯⣗⣗⡯⣗⣗⡯⡯⣗⡯⣟⣞⣗⡿⣾⣽⢽⢦⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⢀⡮⣗⡯⡾⣝⡷⣽⣺⢽⣺⢽⣺⢽⣺⣺⢽⣺⣺⢵⢯⣗⡯⡯⣗⣗⡯⣗⣗⡯⡯⣗⡯⣗⣟⡾⣽⣻⣿⣯⣟⢷⡀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢀⡾⣝⣗⡯⡯⣗⡯⣗⡯⣟⡾⣽⣺⢽⣺⣺⢽⣺⣺⢽⢽⣺⢽⣫⣗⣗⡯⣗⣗⡯⡯⣗⡯⣗⡷⣻⣗⡷⣿⣟⣿⣽⣳⠈⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⣼⢽⣳⢗⡯⡯⣗⡯⣗⡯⣗⡯⣗⡯⠛⣞⡾⣽⣺⣺⢽⢽⣺⢽⣺⣺⢵⢯⣗⣗⡏⠙⣗⡯⣗⣯⢯⣷⢿⣽⣿⣿⡾⡽⣇⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⢸⣳⢽⣺⢽⢽⣫⣗⡯⣗⡯⣗⣯⡓⢡⡂⢵⢯⣗⡯⡾⣽⢽⣺⢽⣺⣺⢽⢽⣺⡞⢀⢇⠸⣽⣳⢽⣯⢿⣿⣿⣽⣷⣿⢯⢿⠀⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⣞⡾⣽⣺⢽⢽⣺⣺⢽⣳⢯⣗⠇⢠⣿⠆⢸⢽⣺⢽⢽⣳⣻⣺⢽⣺⣺⢽⢽⡺⠁⡬⣿⡀⢳⡽⡽⣾⡯⢿⣯⣿⣽⣿⣻⢽⡃⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⠠⣗⡯⣗⡯⣟⣽⣺⣺⢽⣺⢽⡺⢀⣿⣿⢅⠈⣟⡾⣽⢽⣺⢵⢯⣻⣺⣺⢽⢽⠃⡰⣽⣿⡇⢸⡽⡽⣿⢝⣽⣿⣿⣺⣿⡯⣯⡇⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⣳⢯⣗⡯⣗⣗⡯⡾⣽⣺⢽⠂⣸⣿⣾⡕⡀⢗⡯⣗⣟⡾⡽⣽⣺⣳⢽⢽⠃⢰⣱⣿⣷⡇⢸⡯⣟⠟⠀⣿⡿⣞⣾⣻⣽⡳⡇⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⣺⢽⣺⢽⣳⢗⡯⡯⣗⡯⡏⢀⣿⢿⣾⣗⠆⠸⣽⡳⣗⡯⡯⣗⣗⡯⣯⠏⢠⢣⣿⣿⣾⡇⢸⢯⠏⣰⠀⣿⣻⣳⣳⣿⣺⢽⠅⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠸⣺⢽⣺⢽⣺⢽⢽⣫⢷⠉⡇⠰⣿⣿⣻⣽⣎⠀⢗⡯⡗⢙⣽⡳⣗⡯⡏⢀⣗⣿⣿⣷⣿⠂⣺⠋⣠⣿⠀⣿⣺⢵⣫⣿⣺⢽⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠈⣗⣟⡾⣽⣺⢽⢽⣺⠍⠀⡇⠘⣉⣤⣬⣈⣑⣅⠘⣽⠂⠘⣮⢯⣗⠏⢠⡟⣉⣡⠤⢤⠄⢠⠃⢴⡟⣯⠀⣗⡯⠟⡾⣗⡯⡇⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⢸⣳⢯⣗⡯⣟⣽⡺⢀⠃⠀⠸⠋⢡⢡⡉⠻⣷⡄⠸⢀⡆⢹⣳⠃⣴⣿⣿⠋⣠⠐⡔⠀⠂⢳⡄⢰⣟⠀⠉⣠⣦⠘⣷⡻⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢡⡀⢯⣗⣗⡯⣗⣷⡃⠀⣼⠀⠀⠓⠀⠓⢽⠄⢹⣿⡄⢐⣧⠘⢁⣾⣿⣯⡯⢐⢌⠀⠁⣜⠆⢸⣿⡀⢟⠀⢨⣄⠙⡇⢹⠃⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣌⠣⡈⢾⢵⢯⣗⢷⡃⢰⣿⡧⠈⣟⡀⠀⡸⡅⢸⡿⣿⣦⣹⣶⣻⣿⣷⣿⣇⠨⣫⢀⢀⢎⠃⣼⡿⣇⡾⠀⡢⠘⣨⠇⠈⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⡐⠈⢫⣟⢾⢽⡂⢹⣿⣿⡄⠱⢕⢵⠝⢀⣾⣿⣿⣻⣿⣻⣿⣻⣾⣟⣿⣆⠑⡕⠗⣁⣴⣿⡿⣿⠃⠄⣾⣵⡟⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠫⣟⡽⡃⢸⣿⣾⣿⡷⣾⣴⣻⡿⣯⣷⣿⣿⣻⣿⣽⣿⣟⣿⣻⣿⣟⣷⡿⣿⣽⣾⣿⡏⢠⠴⠟⠁⠄⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡈⢯⢧⠈⢿⣿⣾⣿⣿⣾⣿⢿⣿⣟⣿⣾⣿⣼⣿⣾⢿⣻⣿⣽⣿⣻⣿⣿⣻⣯⡿⠀⡄⡔⡔⠅⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠙⢆⠈⠻⣾⣿⣾⢿⣾⣿⣿⣽⠻⢷⣿⣻⣾⠿⠟⢿⣻⣽⣾⣿⢿⣾⡿⠋⡁⡜⠌⠈⣠⠪⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⡂⠀⣤⡈⠻⣾⣿⢿⣷⡿⣯⣷⣤⣤⣤⣤⣶⣾⣿⣿⢿⣻⠽⠛⢉⢠⠸⠈⡠⣰⠀⣿⡀⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⠀⢨⣗⡯⣖⡄⢈⠉⠓⠻⠿⢿⣟⣿⣻⣿⠽⠟⠞⠋⢉⢠⠀⡰⠑⢁⢰⠀⡯⣪⠀⣳⣇⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡗⠨⠀⣻⢮⡯⢺⠀⢜⠈⡊⢐⢶⢔⡤⡤⣤⢤⢖⣖⢷⠅⢸⠀⠐⢁⡴⡇⡘⢠⡫⡎⡇⢸⣺⡄⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⡯⣗⠇⡪⠀⡃⠠⡃⠨⣿⣷⣯⣿⣾⣽⣷⣯⣿⠂⠀⡠⠀⣻⣺⡇⠀⢸⡂⢝⢦⠐⣗⣧⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⣜⠀⡯⡿⠀⠆⢐⠁⢜⠌⢨⣿⣾⣿⣽⣯⣿⣷⣿⢿⡁⢌⠐⠀⣳⣳⡃⠀⡪⡇⢸⢕⠄⢳⢽⡆⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⡰⢱⠀⡯⡏⠨⠂⢀⡈⢈⡄⢸⣷⣿⣷⢿⣯⣷⣿⣾⣿⣆⠙⠅⠀⣞⣾⠀⢀⢯⡢⠘⣎⢇⠘⡽⣽⡀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⣰⡹⠀⢯⠇⢘⠀⠍⣴⣿⣤⣿⡿⣷⣿⢿⣻⣽⣷⣿⡿⣿⣷⡂⢀⣗⣿⠀⠰⠣⢯⡀⢗⡝⡄⠹⣳⢧⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⢁⠔⢁⠞⣈⣴⠀⣫⠃⡐⢀⢞⣿⡿⣾⣟⣿⣿⣽⣿⡿⣟⣿⣾⡿⣿⣽⡂⢐⣗⡗⢀⣶⣦⣦⣤⣄⣉⠘⠀⠹⡽⣆⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⡠⠃⡔⢁⣼⣿⡿⠀⢸⠀⡂⢸⢸⣿⡿⣟⣿⢿⣞⡿⣾⣿⢿⣟⣷⢿⣿⣷⠁⢰⢯⡇⢰⣿⣯⣿⣟⣿⡿⣿⣷⣤⣈⠛⢆⠘⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⢠⠊⡠⢊⣰⣿⣿⠟⣰⠀⢸⠀⠀⡎⣾⠿⠟⠛⣉⢉⠚⢮⢿⣾⢿⣝⠮⢋⣠⣈⠂⣸⢽⠀⢼⣟⣯⣷⣿⣟⣿⣿⣽⣿⣿⡷⡌⢣⡈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⡔⢁⡔⢡⣾⣿⣿⣧⡐⢿⠀⣞⠀⠀⣏⢦⡶⣞⣿⣽⣳⣳⣽⣿⢿⣻⣾⣴⣳⣷⣿⠀⣺⡝⠀⣽⣿⢿⣻⣽⣿⣽⣾⡿⣯⣿⣿⣿⡀⢳⡀⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⢀⠎⢠⠎⣠⣿⣿⣿⣿⣿⣿⣦⠀⡯⠀⠐⠧⠻⠛⠛⢋⢋⠋⠙⠛⠿⣿⢿⣷⡿⣿⣽⡿⠀⣷⠃⠀⣿⡿⣿⡿⣿⣽⣯⣷⣿⣿⡿⣿⣻⡇⢀⠹⣆⠘⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\
|
||||
";
|
||||
|
||||
let list = 'https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=';
|
||||
function bsky_record() {
|
||||
var u;
|
||||
u = axios.get(list + did + '&collection=app.bsky.feed.post&limit=1')
|
||||
.then(function (response) {
|
||||
return JSON.stringify(response.data.records[0].value,null,"\t");
|
||||
})
|
||||
return u;
|
||||
}
|
||||
|
||||
function bsky_ver() {
|
||||
var u;
|
||||
u = axios.get('https://bsky.social/xrpc/_health')
|
||||
.then(function (response) {
|
||||
return JSON.stringify(response.data,null,"\t");
|
||||
})
|
||||
return u;
|
||||
}
|
||||
|
||||
let plc_server = "https://plc.directory/"
|
||||
function bsky_plc() {
|
||||
var u;
|
||||
u = axios.get(plc_server + did + '/log')
|
||||
.then(function (response) {
|
||||
return JSON.stringify(response.data,null,"\t");
|
||||
})
|
||||
return u;
|
||||
}
|
||||
|
||||
let desc = 'https://bsky.social/xrpc/com.atproto.repo.describeRepo?repo=';
|
||||
function bsky_desc() {
|
||||
var u;
|
||||
u = axios.get(desc + did + '&collection=app.bsky.actor.profile')
|
||||
.then(function (response) {
|
||||
return JSON.stringify(response.data,null,"\t");
|
||||
})
|
||||
return u;
|
||||
}
|
||||
|
||||
function bsky_did() {
|
||||
var u;
|
||||
u = axios.get(desc + handle + '&collection=app.bsky.actor.profile')
|
||||
.then(function (response) {
|
||||
return JSON.stringify(response.data.did,null,"\t").replaceAll('"', '');
|
||||
})
|
||||
return u;
|
||||
}
|
||||
|
||||
function test_json() {
|
||||
var u;
|
||||
u = axios.get('/json/ai.json')
|
||||
.then(function (response) {
|
||||
return JSON.stringify(response.data,null,"\t");
|
||||
})
|
||||
return u;
|
||||
}
|
||||
|
||||
function print_slowly(term, paragraph, callback) {
|
||||
var foo, i, lines;
|
||||
lines = paragraph.split("\n");
|
||||
term.pause();
|
||||
i = 0;
|
||||
foo = function(lines) {
|
||||
return setTimeout((function() {
|
||||
if (i < lines.length - 1) {
|
||||
term.echo(lines[i]);
|
||||
i++;
|
||||
return foo(lines);
|
||||
} else {
|
||||
term.resume();
|
||||
return callback();
|
||||
}
|
||||
}), 100);
|
||||
};
|
||||
return foo(lines);
|
||||
}
|
||||
|
||||
function require_command(command_regex, terminal_history) {
|
||||
var executed = true;
|
||||
$.each(terminal_history, function(index, value) {
|
||||
if (command_regex.test(value)) {
|
||||
executed = true
|
||||
}
|
||||
});
|
||||
return executed;
|
||||
}
|
||||
|
||||
function interpreter(input, term) {
|
||||
var command, inputs;
|
||||
inputs = input.split(/ +/)
|
||||
command = inputs[0];
|
||||
option = inputs[1];
|
||||
if (did == null) { did = "did:plc:4hqjfn7m6n5hno3doamuhgef" };
|
||||
if (handle == null) { handle = "did:plc:4hqjfn7m6n5hno3doamuhgef" };
|
||||
if (command === 'ai' && inputs[1] === undefined) {
|
||||
term.echo(ai_help);
|
||||
} else if (command === 'ls') {
|
||||
term.echo(file_all);
|
||||
} else if (command === 'cat') {
|
||||
if (option === 'ai.json') {
|
||||
term.echo(test_json());
|
||||
} else {
|
||||
term.echo(file_all);
|
||||
}
|
||||
} else if (command === 'ai' && option === 'a') {
|
||||
print_slowly(term, ascii_logo);
|
||||
} else if (command === 'ai' && option === 'p') {
|
||||
term.echo(ascii_ai);
|
||||
term.echo(test_json());
|
||||
} else if (command === 'ai' && option === 'plc') {
|
||||
if (inputs[2] != undefined) { did = inputs[2]; }
|
||||
url = desc + did + '&collection=app.bsky.actor.profile';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
did = JSON.stringify(data.did,null,"\t").replaceAll('"', '')
|
||||
url = plc_server + did + '/log';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
term.echo(JSON.stringify(data,null,"\t"));
|
||||
});$.ajaxSetup({async: true});
|
||||
});$.ajaxSetup({async: true});
|
||||
} else if (command === 'ai' && option === 'record') {
|
||||
if (inputs[2] != undefined) { did = inputs[2]; }
|
||||
url = list + did + '&collection=app.bsky.feed.post&limit=1';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
term.echo(JSON.stringify(data,null,"\t"));
|
||||
});$.ajaxSetup({async: true});
|
||||
} else if (command === 'ai' && option === 'did') {
|
||||
if (inputs[2] != undefined) { handle = inputs[2]; }
|
||||
url = desc + handle + '&collection=app.bsky.actor.profile';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
term.echo(JSON.stringify(data.did,null,"\t").replaceAll('"', ''));
|
||||
});$.ajaxSetup({async: true});
|
||||
} else if (command === 'ai' && option === 'handle') {
|
||||
if (inputs[2] != undefined) { did = inputs[2]; }
|
||||
url = desc + did + '&collection=app.bsky.actor.profile';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
term.echo(JSON.stringify(data,null,"\t"));
|
||||
});$.ajaxSetup({async: true});
|
||||
} else if (command === 'ai' && option === 'v') {
|
||||
url = 'https://bsky.social/xrpc/_health';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
term.echo(JSON.stringify(data,null,"\t"));
|
||||
});$.ajaxSetup({async: true});
|
||||
} else {
|
||||
term.echo(ai_help);
|
||||
}
|
||||
}
|
||||
|
||||
function bash(inputs, term) {
|
||||
var argument, echo, insert;
|
||||
echo = term.echo;
|
||||
insert = term.insert;
|
||||
if (!inputs[1]) {
|
||||
//return console.log("none");
|
||||
} else {
|
||||
argument = inputs[1];
|
||||
if (/^\.\./.test(argument)) {
|
||||
return echo("-bash: cd: " + argument + ": Permission denied");
|
||||
} else {
|
||||
return echo("-bash: cd: " + argument + ": No such file or directory");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$('#terminal').terminal(interpreter, {
|
||||
prompt: prompt,
|
||||
name: 'test',
|
||||
greetings: "",
|
||||
exit: false,
|
||||
height: 450,
|
||||
onInit: function(term) {
|
||||
//term.insert("ai");
|
||||
//print_slowly(term, ascii_ai);
|
||||
},
|
||||
completion: function(term, string, callback) {
|
||||
var t = $(term[0]).text();
|
||||
if (t.match(/none/)) {
|
||||
term.clear();
|
||||
} else {
|
||||
callback(command_all);
|
||||
term.history().clear();
|
||||
}
|
||||
},
|
||||
tabcompletion: true
|
||||
});
|
||||
});
|
@ -1,19 +0,0 @@
|
||||
$(function(){
|
||||
|
||||
$(document).bind('keydown','ctrl+return',
|
||||
function(){
|
||||
window.location.href = '/blog';
|
||||
}
|
||||
)
|
||||
|
||||
$(document).bind('keydown', 'Shift+j',
|
||||
function(){
|
||||
if (document.activeElement !== document.body){
|
||||
$(".article-nav-link-wrap:focus").closest("li").next().find("a.lmove").focus();
|
||||
} else {
|
||||
$('#article-nav-older').focus();
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
});
|
@ -1,16 +0,0 @@
|
||||
$(function(){
|
||||
$(document).bind('keydown','ctrl+return',
|
||||
function(){
|
||||
$("home-layout").toggle();
|
||||
$('#terminal').click();
|
||||
var element=document.getElementById("window");
|
||||
var rect=element.getBoundingClientRect();
|
||||
var positionX=rect.left+window.pageXOffset;
|
||||
var positionY=rect.top+window.pageYOffset;
|
||||
window.scrollTo(positionX,positionY);
|
||||
})
|
||||
$('.move').click(
|
||||
function(){
|
||||
this.focus();
|
||||
});
|
||||
});
|
@ -1 +0,0 @@
|
||||
(function(jQuery){jQuery.hotkeys={version:"0.2.0",specialKeys:{8:"backspace",9:"tab",10:"return",13:"return",16:"shift",17:"ctrl",18:"alt",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",59:";",61:"=",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},shiftNums:{"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+",";":": ","'":"\"",",":"<",".":">","/":"?","\\":"|"},textAcceptingInputTypes:["text","password","number","email","url","range","date","month","week","time","datetime","datetime-local","search","color","tel"],textInputTypes:/textarea|input|select/i,options:{filterInputAcceptingElements:true,filterTextInputs:true,filterContentEditable:true}};function keyHandler(handleObj){if(typeof handleObj.data==="string"){handleObj.data={keys:handleObj.data};}if(!handleObj.data||!handleObj.data.keys||typeof handleObj.data.keys!=="string"){return;}var origHandler=handleObj.handler,keys=handleObj.data.keys.toLowerCase().split(" ");handleObj.handler=function(event){if(this!==event.target&&(jQuery.hotkeys.options.filterInputAcceptingElements&&jQuery.hotkeys.textInputTypes.test(event.target.nodeName)||(jQuery.hotkeys.options.filterContentEditable&&jQuery(event.target).attr('contenteditable'))||(jQuery.hotkeys.options.filterTextInputs&&jQuery.inArray(event.target.type,jQuery.hotkeys.textAcceptingInputTypes)>-1))){return;}var special=event.type!=="keypress"&&jQuery.hotkeys.specialKeys[event.which],character=String.fromCharCode(event.which).toLowerCase(),modif="",possible={};jQuery.each(["alt","ctrl","shift"],function(index,specialKey){if(event[specialKey+'Key']&&special!==specialKey){modif+=specialKey+'+';}});if(event.metaKey&&!event.ctrlKey&&special!=="meta"){modif+="meta+";}if(event.metaKey&&special!=="meta"&&modif.indexOf("alt+ctrl+shift+")>-1){modif=modif.replace("alt+ctrl+shift+","hyper+");}if(special){possible[modif+special]=true;}else{possible[modif+character]=true;possible[modif+jQuery.hotkeys.shiftNums[character]]=true;if(modif==="shift+"){possible[jQuery.hotkeys.shiftNums[character]]=true;}}for(var i=0,l=keys.length;i<l;i++){if(possible[keys[i]]){return origHandler.apply(this,arguments);}}};}jQuery.each(["keydown","keyup","keypress"],function(){jQuery.event.special[this]={add:keyHandler};});})(jQuery||this.jQuery||window.jQuery);
|
23
term/ascii/ai.txt
Normal file
@ -0,0 +1,23 @@
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⡿⠿⠟⠛⠻⠿⢿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣦⣀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣶⣶⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⡿⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⢿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⢿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
System name: "ai os"
|
||||
System host name: "aios"
|
||||
System nick name: "ai"
|
||||
System url: "https://git.syui.ai/ai/os"
|
27
term/ascii/avatar.txt
Normal file
@ -0,0 +1,27 @@
|
||||
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⡛⢉⣩⣥⣤⣤⣤⣉⣉⡙⢛⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠻⣦⣽⣯⣭⣭⣭⣭⣭⣭⣭⣴⡟⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⢉⣚⣭⣥⣶⣶⣾⣷⣶⣶⣶⣶⣶⣬⣭⣓⡉⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠿⢿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢛⣉⣥⣶⣶⣶⣶⣶⣶⣶⣬⣍⣛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⣡⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣮⡛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢋⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢃⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⣾⣿⣿⣿⣿⣿⡿⠋⢽⣿⣿⣿⣿⣿⣿⡿⢀⢿⣿⣿⣿⣿⣿⣇⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢠⣿⣿⣿⣿⣿⡿⢡⣷⢸⣿⣿⣿⣿⣿⣿⢃⣿⢸⣿⣿⣿⣿⣿⣿⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢸⣿⣿⣿⣿⣿⠇⣿⣿⡌⣿⣿⣿⣿⣿⠃⣾⣿⢿⣿⠋⣿⣿⣿⣿⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠸⣿⣿⣿⣿⠏⠠⠿⠿⣧⢻⠏⣿⣿⢋⡼⢟⡛⠸⣡⡇⣿⣿⣿⡏⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⢿⣿⣿⡟⢀⠐⡉⢭⠻⣎⢠⠹⣣⣾⠏⠅⢀⠱⡌⡇⠋⢍⢻⢡⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣞⠈⢿⣿⡇⣾⡄⣆⣨⢀⣿⣾⣶⣿⣿⡄⢇⡼⣰⣷⡇⣌⡼⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣌⢿⡇⣿⣿⣶⣷⣾⣿⣿⣿⣿⣿⣿⣾⣾⣿⡿⠠⠛⢁⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⢙⠈⢿⣿⣿⣿⣿⠿⠿⠿⣿⣿⣿⣿⠟⡡⠊⡡⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠈⢠⣷⡍⠛⠻⠿⠿⠿⠿⣟⢛⠉⠔⠈⢰⡇⢳⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⢸⡟⠁⠀⠀⣿⣿⣿⣿⣿⠀⠀⣾⠁⠸⢷⢸⡆⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⡔⢸⠃⠀⠐⢀⣿⣿⣿⣿⣿⡰⠀⣿⠀⣧⢸⡀⣿⡘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠠⣋⢸⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⠀⡿⢠⣉⣈⡓⠘⣧⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⢠⣾⢏⢸⠀⣼⡿⠿⢿⣿⣿⣿⡿⡻⢸⡇⣾⣿⣿⣿⣷⣮⡣⡹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⡑⡁⣴⣿⣷⣍⢸⠀⡷⠾⠿⠿⢿⣿⣿⣿⣿⢸⠃⣿⣿⣿⣿⣿⣿⣷⠑⡜⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
⣿⣿⣿⣿⣿⣿⣿⣿⡿⢃⡎⡼⢸⣿⣿⣿⣿⢸⢐⣶⣿⣿⠇⣷⣮⢻⣿⡇⡼⢠⣿⠿⠿⠿⠿⠿⣛⣰⠸⣮⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿
|
||||
|
20
term/ascii/help.txt
Normal file
@ -0,0 +1,20 @@
|
||||
|
||||
Commands:
|
||||
ai
|
||||
|
||||
Flags:
|
||||
-h, --help
|
||||
|
||||
Options:
|
||||
a : logo
|
||||
v : pds version
|
||||
p : ai profile
|
||||
did <handle> : did
|
||||
plc <handle> : plc
|
||||
record <handle> : timeline
|
||||
|
||||
ex:
|
||||
$ ai v : {\"version\":\"0.0.1\"}
|
||||
|
||||
https://git.syui.ai/ai/bot
|
||||
|
498
term/css/terminal.css
Normal file
@ -0,0 +1,498 @@
|
||||
#window {
|
||||
margin-left: auto;
|
||||
text-align: left;
|
||||
margin-right: auto;
|
||||
background: #343434;
|
||||
border-radius: 7px;
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
height: 400px;
|
||||
}
|
||||
|
||||
#topbar {
|
||||
width: 100%;
|
||||
height: 21px;
|
||||
font-size: 16px;
|
||||
font-family: "Myriad Pro", sans-serif;
|
||||
text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.25);
|
||||
-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.5);
|
||||
-moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
#topbar ul li {
|
||||
float: left;
|
||||
padding: 0 10px;
|
||||
height: 21px;
|
||||
line-height: 24px;
|
||||
}
|
||||
#topbar ul li:first-child {
|
||||
font-size: 20px;
|
||||
line-height: 26px;
|
||||
margin-left: 5px;
|
||||
}
|
||||
#topbar ul li:nth-child(2) {
|
||||
font-family: "Myriad-Semi", sans-serif;
|
||||
}
|
||||
#topbar ul li:active {
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(1, #4a82ff), color-stop(0, #0052fc));
|
||||
color: #fff;
|
||||
text-shadow: none;
|
||||
}
|
||||
#toolbar {
|
||||
width: 100%;
|
||||
height: 25px;
|
||||
background: #ccc;
|
||||
}
|
||||
#toolbar .top {
|
||||
float: left;
|
||||
width: 100%;
|
||||
height: 23px;
|
||||
}
|
||||
#toolbar .bottom {
|
||||
float: left;
|
||||
width: 100%;
|
||||
height: 30px;
|
||||
}
|
||||
#toolbar #lights {
|
||||
float: left;
|
||||
position: relative;
|
||||
top: 6px;
|
||||
left: 7px;
|
||||
}
|
||||
.light {
|
||||
float: left;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
border-radius: 14px;
|
||||
-webkit-box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.5), 0px 0px 3px #000 inset;
|
||||
-moz-box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.5), 0px 0px 3px #000 inset;
|
||||
box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.5), 0px 0px 3px #000 inset;
|
||||
overflow: hidden;
|
||||
}
|
||||
#lights:hover .glyph {
|
||||
opacity: 1;
|
||||
cursor: default;
|
||||
}
|
||||
.light .shine {
|
||||
width: 4px;
|
||||
height: 3px;
|
||||
border-radius: 10px;
|
||||
background: -moz-radial-gradient(center, ellipse cover, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
|
||||
background-image: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgba(255, 255, 255, 1)), color-stop(100%, rgba(255, 255, 255, 0)));
|
||||
background: -webkit-radial-gradient(center, ellipse cover, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
|
||||
background: -o-radial-gradient(center, ellipse cover, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
|
||||
background: -ms-radial-gradient(center, ellipse cover, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
|
||||
background: radial-gradient(center, ellipse cover, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
|
||||
}
|
||||
.light .glow {
|
||||
width: 14px;
|
||||
height: 8px;
|
||||
background-image: -webkit-gradient(radial, center bottom, 0, center center, 5, from(rgba(255, 255, 255, 0.75)), to(rgba(255, 255, 255, 0)));
|
||||
background: 0px 0px -moz-radial-gradient(bottom, cover, rgba(255, 255, 255, 0.70) 0%, rgba(255, 255, 255, 0) 80%);
|
||||
}
|
||||
.red {
|
||||
background: #f41b16;
|
||||
background: -moz-linear-gradient(top, #f41b16 0%, #fc7471 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f41b16), color-stop(100%, #fc7471));
|
||||
background: -webkit-linear-gradient(top, #f41b16 0%, #fc7471 100%);
|
||||
background: -o-linear-gradient(top, #f41b16 0%, #fc7471 100%);
|
||||
background: -ms-linear-gradient(top, #f41b16 0%, #fc7471 100%);
|
||||
background: linear-gradient(top, #f41b16 0%, #fc7471 100%);
|
||||
}
|
||||
.red:active {
|
||||
background: #972f2e;
|
||||
background: -moz-linear-gradient(top, #972f2e 0%, #fc7471 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #972f2e), color-stop(100%, #fc7471));
|
||||
background: -webkit-linear-gradient(top, #972f2e 0%, #fc7471 100%);
|
||||
background: -o-linear-gradient(top, #972f2e 0%, #fc7471 100%);
|
||||
background: -ms-linear-gradient(top, #972f2e 0%, #fc7471 100%);
|
||||
background: linear-gradient(top, #972f2e 0%, #fc7471 100%);
|
||||
}
|
||||
.red .shine {
|
||||
position: relative;
|
||||
top: -21px;
|
||||
left: 5px;
|
||||
}
|
||||
.red .glow {
|
||||
position: relative;
|
||||
top: -20px;
|
||||
}
|
||||
.red .glyph {
|
||||
position: relative;
|
||||
top: -5px;
|
||||
left: 3px;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
color: #9b3a36;
|
||||
z-index: 50;
|
||||
opacity: 0;
|
||||
}
|
||||
.yellow {
|
||||
background: #f4a316;
|
||||
background: -moz-linear-gradient(left, #f4a316 0%, #fcc371 100%);
|
||||
background: -webkit-gradient(linear, left top, right top, color-stop(0%, #f4a316), color-stop(100%, #fcc371));
|
||||
background: -webkit-linear-gradient(left, #f4a316 0%, #fcc371 100%);
|
||||
background: -o-linear-gradient(left, #f4a316 0%, #fcc371 100%);
|
||||
background: -ms-linear-gradient(left, #f4a316 0%, #fcc371 100%);
|
||||
background: linear-gradient(left, #f4a316 0%, #fcc371 100%);
|
||||
margin: 0px 7px;
|
||||
}
|
||||
.yellow:active {
|
||||
background: #ae4f1e;
|
||||
background: -moz-linear-gradient(top, #ae4f1e 0%, #fcc371 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ae4f1e), color-stop(100%, #fcc371));
|
||||
background: -webkit-linear-gradient(top, #ae4f1e 0%, #fcc371 100%);
|
||||
background: -o-linear-gradient(top, #ae4f1e 0%, #fcc371 100%);
|
||||
background: -ms-linear-gradient(top, #ae4f1e 0%, #fcc371 100%);
|
||||
background: linear-gradient(top, #ae4f1e 0%, #fcc371 100%);
|
||||
}
|
||||
.yellow .shine {
|
||||
position: relative;
|
||||
top: -21px;
|
||||
left: 5px;
|
||||
}
|
||||
.yellow .glow {
|
||||
position: relative;
|
||||
top: -20px;
|
||||
}
|
||||
.yellow .glyph {
|
||||
position: relative;
|
||||
top: -5px;
|
||||
left: 3px;
|
||||
font-size: 24px;
|
||||
color: #854322;
|
||||
z-index: 50;
|
||||
opacity: 0;
|
||||
-webkit-transform: scaleY(1.5) scaleX(1.3);
|
||||
}
|
||||
.green {
|
||||
background: #4cae2e;
|
||||
background: -moz-linear-gradient(top, #4cae2e 0%, #dafc71 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #4cae2e), color-stop(100%, #dafc71));
|
||||
background: -webkit-linear-gradient(top, #4cae2e 0%, #dafc71 100%);
|
||||
background: -o-linear-gradient(top, #4cae2e 0%, #dafc71 100%);
|
||||
background: -ms-linear-gradient(top, #4cae2e 0%, #dafc71 100%);
|
||||
background: linear-gradient(top, #4cae2e 0%, #dafc71 100%);
|
||||
}
|
||||
.green:active {
|
||||
background: #48752b;
|
||||
background: -moz-linear-gradient(top, #48752b 0%, #dafc71 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #48752b), color-stop(100%, #dafc71));
|
||||
background: -webkit-linear-gradient(top, #48752b 0%, #dafc71 100%);
|
||||
background: -o-linear-gradient(top, #48752b 0%, #dafc71 100%);
|
||||
background: -ms-linear-gradient(top, #48752b 0%, #dafc71 100%);
|
||||
background: linear-gradient(top, #48752b 0%, #dafc71 100%);
|
||||
}
|
||||
.green .shine {
|
||||
position: relative;
|
||||
top: -20px;
|
||||
left: 5px;
|
||||
}
|
||||
.green .glow {
|
||||
position: relative;
|
||||
top: -20px;
|
||||
}
|
||||
.green .glyph {
|
||||
position: relative;
|
||||
top: -5px;
|
||||
left: 3px;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
color: #25571d;
|
||||
z-index: 50;
|
||||
opacity: 0;
|
||||
}
|
||||
@-moz-document url-prefix() {
|
||||
.red .glyph {
|
||||
position: relative;
|
||||
top: -5px;
|
||||
}
|
||||
.yellow .glyph {
|
||||
top: -4px;
|
||||
left: 3px;
|
||||
}
|
||||
.green .glyph {
|
||||
position: relative;
|
||||
top: -4px;
|
||||
}
|
||||
}
|
||||
#title {
|
||||
float: left;
|
||||
position: relative;
|
||||
top: 6px;
|
||||
width: 40%;
|
||||
left: 45%;
|
||||
font-family: "Myriad Pro", sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.folder {
|
||||
float: left;
|
||||
margin-right: 5px;
|
||||
}
|
||||
.folder .tab {
|
||||
width: 4px;
|
||||
height: 2px;
|
||||
background: #a4c5da;
|
||||
border: 1px solid #728ea3;
|
||||
border-bottom: none;
|
||||
border-radius: 2px 2px 0px 0px;
|
||||
-webkit-box-shadow: 0px -1px 0px #99b5c7 inset;
|
||||
margin-left: 1px;
|
||||
z-index: 5000;
|
||||
margin-bottom: -1px;
|
||||
}
|
||||
.folder .body {
|
||||
width: 14px;
|
||||
height: 10px;
|
||||
border: 1px solid #6e8ba1;
|
||||
background: #b8cfe0;
|
||||
background: -moz-linear-gradient(top, #b8cfe0 0%, #86adc8 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b8cfe0), color-stop(100%, #86adc8));
|
||||
background: -webkit-linear-gradient(top, #b8cfe0 0%, #86adc8 100%);
|
||||
background: -o-linear-gradient(top, #b8cfe0 0%, #86adc8 100%);
|
||||
background: -ms-linear-gradient(top, #b8cfe0 0%, #86adc8 100%);
|
||||
background: linear-gradient(top, #b8cfe0 0%, #86adc8 100%);
|
||||
z-index: -50;
|
||||
-webkit-box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.25) inset, 0px 1px 0px rgba(0, 0, 0, 0.2);
|
||||
-moz-box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.25) inset, 0px 1px 0px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
#nav {
|
||||
margin: 1px 8px;
|
||||
float: left;
|
||||
}
|
||||
#view {
|
||||
margin: 2px 0 0 110px;
|
||||
display: inline-block;
|
||||
}
|
||||
.control_box {
|
||||
height: 20px;
|
||||
border-radius: 3px;
|
||||
border: 1px solid #555;
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(1, #fefefe), color-stop(0, #b8b8b8));
|
||||
box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.25);
|
||||
}
|
||||
.control_box .control {
|
||||
height: 20px;
|
||||
border-right: 1px solid #2e2e2e;
|
||||
float: left;
|
||||
text-align: center;
|
||||
width: 27px;
|
||||
}
|
||||
.control:last-child {
|
||||
border-right: 0px solid !important;
|
||||
}
|
||||
.control:active {
|
||||
background: #b0afb0;
|
||||
-webkit-box-shadow: 0px 0px 4px #000 inset;
|
||||
}
|
||||
.active {
|
||||
background: #707070 !important;
|
||||
-webkit-box-shadow: 0px 3px 4px rgba(0, 0, 0, 0.6) inset !important;
|
||||
}
|
||||
#body {
|
||||
font-family: Andale Mono, monospace;
|
||||
line-height: 1em;
|
||||
font-size: 13px;
|
||||
float: left;
|
||||
width: 100%;
|
||||
background: #002b36;
|
||||
padding: 10px;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
#body p {
|
||||
color: #63de00!important;
|
||||
}
|
||||
@keyframes blink {
|
||||
0% {
|
||||
background: rgba(99, 222, 0, 100);
|
||||
}
|
||||
100% {
|
||||
background: rgba(99, 222, 0, 0);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes blink {
|
||||
0% {
|
||||
background: rgba(99, 222, 0, 100);
|
||||
}
|
||||
100% {
|
||||
background: rgba(99, 222, 0, 0);
|
||||
}
|
||||
}
|
||||
@-moz-keyframes blink {
|
||||
0% {
|
||||
background: rgba(99, 222, 0, 100);
|
||||
}
|
||||
100% {
|
||||
background: rgba(99, 222, 0, 0);
|
||||
}
|
||||
}
|
||||
.cursor {
|
||||
width: 10px;
|
||||
margin-left: 0px;
|
||||
color: #fff;
|
||||
}
|
||||
#body p::-webkit-selection {
|
||||
background: #0b209e;
|
||||
}
|
||||
#body p::selection {
|
||||
background: #0b209e;
|
||||
}
|
||||
#body p::-moz-selection {
|
||||
background: #0b209e;
|
||||
}
|
||||
#body p {
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
font-size: 13px;
|
||||
}
|
||||
#content {
|
||||
float: left;
|
||||
margin-top: 1px;
|
||||
}
|
||||
#foot {
|
||||
height: 23px;
|
||||
width: 100%;
|
||||
float: left;
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(1, #cbcbcb), color-stop(0, #a7a7a7));
|
||||
border-top: 1px solid #515151;
|
||||
border-radius: 0 0 5px 5px;
|
||||
}
|
||||
#foot .handle {
|
||||
width: 11px;
|
||||
height: 11px;
|
||||
float: right;
|
||||
margin: 6px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.handle .grip {
|
||||
-webkit-transform: rotate(45deg) scaley(3);
|
||||
margin: 2px 0 0 2px;
|
||||
color: #646464;
|
||||
text-shadow: 1px 1px 0 #c6c6c6;
|
||||
font-size: 14px;
|
||||
}
|
||||
.icon .frame {
|
||||
width: 82px;
|
||||
height: 82px;
|
||||
border-radius: 5px;
|
||||
border: 2px solid transparent;
|
||||
}
|
||||
.icon .name {
|
||||
color: #000;
|
||||
padding-top: 3px;
|
||||
border-radius: 15px;
|
||||
width: 55px;
|
||||
margin: 5px 0 0 15px;
|
||||
}
|
||||
.icon .folder {
|
||||
margin: 15px 0 0 6px;
|
||||
}
|
||||
#icon-github {
|
||||
text-align: -999px;
|
||||
font-size: 1px;
|
||||
display: block;
|
||||
width: 156px;
|
||||
height: 133px;
|
||||
background-image: url(../img/sprite.png);
|
||||
background-position: 0 133px;
|
||||
}
|
||||
#icon-github:hover {
|
||||
background-position: 0 0px;
|
||||
}
|
||||
#icon-rubygems {
|
||||
text-align: -999px;
|
||||
font-size: 1px;
|
||||
display: block;
|
||||
width: 156px;
|
||||
height: 133px;
|
||||
background-image: url(../img/sprite.png);
|
||||
background-position: 158px 133px;
|
||||
}
|
||||
#icon-rubygems:hover {
|
||||
background-position: 158px 0px;
|
||||
}
|
||||
.source-urls {
|
||||
margin-top: 40px;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
.no-margin-bot {
|
||||
color: #337AB7;
|
||||
}
|
||||
span {
|
||||
font-size: 15px;
|
||||
}
|
||||
#icon-github:hover,
|
||||
i.icon.ion-close-circled:hover,
|
||||
i.icon.ion-minus-circled:hover,
|
||||
i.icon.ion-plus-circled:hover {
|
||||
color: rgba(0, 0, 0, .5);
|
||||
}
|
||||
i.icon.ion-close-circled {
|
||||
color: rgba(212, 42, 38, 0.83);
|
||||
text-shadow: 0 0 1px rgba(187, 187, 187, 0.56);
|
||||
padding-top: 3px;
|
||||
}
|
||||
i.icon.ion-minus-circled {
|
||||
color: rgb(160, 165, 34);
|
||||
text-shadow: 0 0 1px rgba(187, 187, 187, 0.56);
|
||||
padding-top: 3px;
|
||||
}
|
||||
i.icon.ion-plus-circled {
|
||||
color: rgb(82, 183, 51);
|
||||
text-shadow: 0 0 1px rgba(187, 187, 187, 0.56);
|
||||
padding-top: 3px;
|
||||
}
|
||||
.icon {
|
||||
margin: 7px;
|
||||
float: left;
|
||||
font-size: 20px;
|
||||
}
|
||||
#title-left {
|
||||
position: relative;
|
||||
top: -8px;
|
||||
font-family: "Myriad Pro", sans-serif;
|
||||
font-size: 14px;
|
||||
left: 49%;
|
||||
}
|
||||
#terminal-origin {
|
||||
font-family: monospace;
|
||||
}
|
||||
@media all and (-webkit-min-device-pixel-ratio: 0) and (min-resolution: .001dpcm) {
|
||||
#title-left {
|
||||
top: -13px;
|
||||
}
|
||||
}
|
||||
|
||||
home-layout {
|
||||
background-color: #f1f1f1;
|
||||
}
|
||||
|
||||
.terminal, .cmd {
|
||||
background-color: #343434;
|
||||
}
|
||||
|
||||
@media screen and (max-width:1000px){i.icon.ion-minus-circled{display:none}
|
||||
#window{width:100%;}
|
||||
}
|
||||
@media screen and (max-width:800px){body{padding-top:0px;}
|
||||
#title-left{left:50%;}
|
||||
#window{width:100%;}
|
||||
.container{padding:0px;}
|
||||
/*article{padding:10px 20px;}*/
|
||||
i.icon.ion-minus-circled{display:none}
|
||||
}
|
||||
@media screen and (max-width:800px){#title-left{left:48%;}
|
||||
}
|
||||
@media screen and (max-width:500px){#title-left{left:40%;}
|
||||
}
|
||||
@media screen and (max-width:400px){body{padding-top:0px;width:auto;}
|
||||
#title-left{left:50%;}
|
||||
/*article{padding:10px 10px;}*/
|
||||
#particles-js{width:auto;}
|
||||
#particles-js-no{width:auto;}
|
||||
i.icon.ion-minus-circled{display:none}
|
||||
i.icon.ion-plus-circled{display:none}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 557 KiB After Width: | Height: | Size: 557 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 107 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
246
term/js/terminal.js
Executable file
@ -0,0 +1,246 @@
|
||||
$(function() {
|
||||
var prompt = "[[b;#87cefa;]ai][[b;#FFFF00;]@aios] ~$ ";
|
||||
let url = new URL(window.location.href);
|
||||
let user = url.searchParams.get('user');
|
||||
let id = url.searchParams.get('id');
|
||||
if (id == null) { id = 2 };
|
||||
let did = url.searchParams.get('did');
|
||||
if (did == null) { did = "did:plc:4hqjfn7m6n5hno3doamuhgef" };
|
||||
if (user) { prompt = "[[b;#87cefa;]" + user + "][[b;#FFFF00;]@aios] ~$ " };
|
||||
var tab = "[[b;#87cefa;]<tab>]";
|
||||
var command_all = ["ai","ls","ai.json", "hugo", "pico", "nyancat"];
|
||||
var handle = "yui.syui.ai";
|
||||
var file_all = "ai.json";
|
||||
|
||||
var ai_help = axios.get('https://term.syui.ai/term/ascii/help.txt')
|
||||
.then(function (response) {
|
||||
return response.data;
|
||||
});
|
||||
var ascii_ai = axios.get('https://term.syui.ai/term/ascii/ai.txt')
|
||||
.then(function (response) {
|
||||
return response.data;
|
||||
});
|
||||
var ascii_avatar = axios.get('https://term.syui.ai/term/ascii/avatar.txt')
|
||||
.then(function (response) {
|
||||
return response.data;
|
||||
});
|
||||
|
||||
let list = 'https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=';
|
||||
function bsky_record() {
|
||||
var u;
|
||||
u = axios.get(list + did + '&collection=app.bsky.feed.post&limit=1')
|
||||
.then(function (response) {
|
||||
return JSON.stringify(response.data.records[0].value,null,"\t");
|
||||
})
|
||||
return u;
|
||||
}
|
||||
|
||||
function bsky_ver() {
|
||||
var u;
|
||||
u = axios.get('https://bsky.social/xrpc/_health')
|
||||
.then(function (response) {
|
||||
return JSON.stringify(response.data,null,"\t");
|
||||
})
|
||||
return u;
|
||||
}
|
||||
|
||||
let plc_server = "https://plc.directory/"
|
||||
function bsky_plc() {
|
||||
var u;
|
||||
u = axios.get(plc_server + did + '/log')
|
||||
.then(function (response) {
|
||||
return JSON.stringify(response.data,null,"\t");
|
||||
})
|
||||
return u;
|
||||
}
|
||||
|
||||
let desc = 'https://bsky.social/xrpc/com.atproto.repo.describeRepo?repo=';
|
||||
function bsky_desc() {
|
||||
var u;
|
||||
u = axios.get(desc + did + '&collection=app.bsky.actor.profile')
|
||||
.then(function (response) {
|
||||
return JSON.stringify(response.data,null,"\t");
|
||||
})
|
||||
return u;
|
||||
}
|
||||
|
||||
function bsky_did() {
|
||||
var u;
|
||||
u = axios.get(desc + handle + '&collection=app.bsky.actor.profile')
|
||||
.then(function (response) {
|
||||
return JSON.stringify(response.data.did,null,"\t").replaceAll('"', '');
|
||||
})
|
||||
return u;
|
||||
}
|
||||
|
||||
function test_json() {
|
||||
var u;
|
||||
u = axios.get('https://term.syui.ai/term/json/ai.json')
|
||||
.then(function (response) {
|
||||
return JSON.stringify(response.data,null,"\t");
|
||||
})
|
||||
return u;
|
||||
}
|
||||
|
||||
function print_slowly(term, paragraph, callback) {
|
||||
var foo, i, lines;
|
||||
lines = paragraph.split("\n");
|
||||
term.pause();
|
||||
i = 0;
|
||||
foo = function(lines) {
|
||||
return setTimeout((function() {
|
||||
if (i < lines.length - 1) {
|
||||
term.echo(lines[i]);
|
||||
i++;
|
||||
return foo(lines);
|
||||
} else {
|
||||
term.resume();
|
||||
return callback();
|
||||
}
|
||||
}), 100);
|
||||
};
|
||||
return foo(lines);
|
||||
}
|
||||
|
||||
function require_command(command_regex, terminal_history) {
|
||||
var executed = true;
|
||||
$.each(terminal_history, function(index, value) {
|
||||
if (command_regex.test(value)) {
|
||||
executed = true
|
||||
}
|
||||
});
|
||||
return executed;
|
||||
}
|
||||
|
||||
function interpreter(input, term) {
|
||||
var command, inputs;
|
||||
inputs = input.split(/ +/)
|
||||
command = inputs[0];
|
||||
option = inputs[1];
|
||||
if (did == null) { did = "did:plc:4hqjfn7m6n5hno3doamuhgef" };
|
||||
if (handle == null) { handle = "did:plc:4hqjfn7m6n5hno3doamuhgef" };
|
||||
if (command === 'ai' && inputs[1] === undefined) {
|
||||
term.echo(ai_help);
|
||||
} else if (command === 'ls') {
|
||||
term.echo(file_all);
|
||||
} else if (command === 'cat') {
|
||||
if (option === 'ai.json') {
|
||||
term.echo(test_json());
|
||||
} else {
|
||||
term.echo(file_all);
|
||||
}
|
||||
} else if (command === 'ai' && option === 'a') {
|
||||
term.echo(ascii_ai);
|
||||
//print_slowly(term, ascii_ai);
|
||||
} else if (command === 'ai' && option === 'p') {
|
||||
term.echo(test_json());
|
||||
term.echo(ascii_avatar);
|
||||
} else if (command === 'ai' && option === 'plc') {
|
||||
if (inputs[2] != undefined) { did = inputs[2]; }
|
||||
url = desc + did + '&collection=app.bsky.actor.profile';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
did = JSON.stringify(data.did,null,"\t").replaceAll('"', '')
|
||||
url = plc_server + did + '/log';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
term.echo(JSON.stringify(data,null,"\t"));
|
||||
});$.ajaxSetup({async: true});
|
||||
});$.ajaxSetup({async: true});
|
||||
} else if (command === 'ai' && option === 'record') {
|
||||
if (inputs[2] != undefined) { did = inputs[2]; }
|
||||
url = list + did + '&collection=app.bsky.feed.post&limit=1';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
term.echo(JSON.stringify(data,null,"\t"));
|
||||
});$.ajaxSetup({async: true});
|
||||
} else if (command === 'ai' && option === 'did') {
|
||||
if (inputs[2] != undefined) { handle = inputs[2]; }
|
||||
url = desc + handle + '&collection=app.bsky.actor.profile';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
term.echo(JSON.stringify(data.did,null,"\t").replaceAll('"', ''));
|
||||
});$.ajaxSetup({async: true});
|
||||
} else if (command === 'ai' && option === 'handle') {
|
||||
if (inputs[2] != undefined) { did = inputs[2]; }
|
||||
url = desc + did + '&collection=app.bsky.actor.profile';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
term.echo(JSON.stringify(data,null,"\t"));
|
||||
});$.ajaxSetup({async: true});
|
||||
} else if (command === 'ai' && option === 'v') {
|
||||
url = 'https://bsky.social/xrpc/_health';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
term.echo(JSON.stringify(data,null,"\t"));
|
||||
});$.ajaxSetup({async: true});
|
||||
|
||||
} else if (inputs[0] === 'hugo') {
|
||||
hugo_domain = 'yui.syui.ai';
|
||||
if (inputs[1] != undefined) { hugo_domain = inputs[1]; }
|
||||
url = 'https://' + hugo_domain + '/index.json';
|
||||
$.ajaxSetup({async: false});
|
||||
$.getJSON(url, function(data) {
|
||||
index_json = JSON.stringify(data,null,"\t");
|
||||
origin_index_json = JSON.parse(index_json);
|
||||
origin_index_json.forEach(function(v,index) {
|
||||
s = v.title + " " + v.href;
|
||||
term.echo(s);
|
||||
});
|
||||
});$.ajaxSetup({async: true});
|
||||
term.echo("-----");
|
||||
term.echo("$ hugo " + hugo_domain);
|
||||
} else if (/nyancat/.test(input)) {
|
||||
term.read("jump page?[y] : ", function(s) {
|
||||
if (s === "y") {
|
||||
window.location.href = 'https://syui.ai/nyancat';
|
||||
}
|
||||
}).then(function(s) {
|
||||
s.charCodeAt(0);
|
||||
});
|
||||
} else if (/pico/.test(input)) {
|
||||
window.location.href = 'https://syui.ai/pico';
|
||||
|
||||
} else {
|
||||
term.echo(ai_help);
|
||||
}
|
||||
}
|
||||
|
||||
function bash(inputs, term) {
|
||||
var argument, echo, insert;
|
||||
echo = term.echo;
|
||||
insert = term.insert;
|
||||
if (!inputs[1]) {
|
||||
//return console.log("none");
|
||||
} else {
|
||||
argument = inputs[1];
|
||||
if (/^\.\./.test(argument)) {
|
||||
return echo("-bash: cd: " + argument + ": Permission denied");
|
||||
} else {
|
||||
return echo("-bash: cd: " + argument + ": No such file or directory");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$('#terminal').terminal(interpreter, {
|
||||
prompt: prompt,
|
||||
name: 'test',
|
||||
greetings: "",
|
||||
exit: false,
|
||||
height: 360,
|
||||
onInit: function(term) {
|
||||
//term.insert("ai");
|
||||
//print_slowly(term, ascii_ai);
|
||||
},
|
||||
completion: function(term, string, callback) {
|
||||
var t = $(term[0]).text();
|
||||
if (t.match(/none/)) {
|
||||
term.clear();
|
||||
} else {
|
||||
callback(command_all);
|
||||
term.history().clear();
|
||||
}
|
||||
},
|
||||
tabcompletion: true
|
||||
});
|
||||
});
|
23
term/pkg/hotkeys-js/LICENSE
Normal file
@ -0,0 +1,23 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2015-present, Kenny Wong.
|
||||
|
||||
Copyright (c) 2011-2013 Thomas Fuchs (https://github.com/madrobby/keymaster)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
441
term/pkg/hotkeys-js/README.md
Normal file
@ -0,0 +1,441 @@
|
||||
# Hotkeys
|
||||
|
||||
<!--dividing-->
|
||||
|
||||
[](https://jaywcjlove.github.io/#/sponsor)
|
||||
[](https://www.npmjs.com/package/hotkeys-js)
|
||||
[](https://github.com/jaywcjlove/hotkeys/stargazers)
|
||||

|
||||
[](https://github.com/jaywcjlove/hotkeys-js/actions/workflows/ci.yml)
|
||||
[](https://coveralls.io/github/jaywcjlove/hotkeys?branch=master)
|
||||
[](https://github.com/jaywcjlove/hotkeys-js/blob/master/README-zh.md)
|
||||
[](https://gitee.com/jaywcjlove/hotkeys)
|
||||
|
||||
HotKeys.js is an input capture library with some very special features, it is easy to pick up and use, has a reasonable footprint ([~6kB](https://bundlephobia.com/result?p=hotkeys-js)) (gzipped: **`2.8kB`**), and has no dependencies. It should not interfere with any JavaScript libraries or frameworks. Official document [demo preview](https://jaywcjlove.github.io/hotkeys-js). [More examples](https://github.com/jaywcjlove/hotkeys-js/issues?q=label%3ADemo+).
|
||||
|
||||
```bash
|
||||
╭┈┈╮ ╭┈┈╮ ╭┈┈╮
|
||||
┆ ├┈┈..┈┈┈┈┈.┆ └┈╮┆ ├┈┈..┈┈┈┈┈..┈┈.┈┈..┈┈┈┈┈.
|
||||
┆ ┆┆ □ ┆┆ ┈┤┆ < ┆ -__┘┆ ┆ ┆┆__ ┈┈┤
|
||||
╰┈┈┴┈┈╯╰┈┈┈┈┈╯╰┈┈┈┈╯╰┈┈┴┈┈╯╰┈┈┈┈┈╯╰┈┈┈ ┆╰┈┈┈┈┈╯
|
||||
╰┈┈┈┈┈╯
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
You will need `Node.js` installed on your system.
|
||||
|
||||
```bash
|
||||
npm install hotkeys-js --save
|
||||
```
|
||||
|
||||
```js
|
||||
import hotkeys from 'hotkeys-js';
|
||||
|
||||
hotkeys('f5', function(event, handler){
|
||||
// Prevent the default refresh event under WINDOWS system
|
||||
event.preventDefault()
|
||||
alert('you pressed F5!')
|
||||
});
|
||||
```
|
||||
|
||||
Or manually download and link **hotkeys.js** in your HTML, It can also be downloaded via [UNPKG](https://unpkg.com/hotkeys-js/dist/):
|
||||
|
||||
CDN: [UNPKG](https://unpkg.com/hotkeys-js/dist/) | [jsDelivr](https://cdn.jsdelivr.net/npm/hotkeys-js@3.7.3/) | [Githack](https://raw.githack.com/jaywcjlove/hotkeys/master/dist/hotkeys.min.js) | [Statically](https://cdn.statically.io/gh/jaywcjlove/hotkeys/master/dist/hotkeys.min.js) | [bundle.run](https://bundle.run/hotkeys-js@3.7.3)
|
||||
|
||||
```html
|
||||
<script src="https://unpkg.com/hotkeys-js/dist/hotkeys.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
hotkeys('ctrl+a,ctrl+b,r,f', function (event, handler){
|
||||
switch (handler.key) {
|
||||
case 'ctrl+a': alert('you pressed ctrl+a!');
|
||||
break;
|
||||
case 'ctrl+b': alert('you pressed ctrl+b!');
|
||||
break;
|
||||
case 'r': alert('you pressed r!');
|
||||
break;
|
||||
case 'f': alert('you pressed f!');
|
||||
break;
|
||||
default: alert(event);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
### Used in React
|
||||
|
||||
[react-hotkeys](https://github.com/jaywcjlove/react-hotkeys) is the React component that listen to keydown and keyup keyboard events, defining and dispatching keyboard shortcuts. Detailed use method please see its documentation [react-hotkeys](https://github.com/jaywcjlove/react-hotkeys).
|
||||
|
||||
[react-hotkeys-hook](https://github.com/JohannesKlauss/react-hotkeys-hook) - React hook for using keyboard shortcuts in components. Make sure that you have at least version 16.8 of react and react-dom installed, or otherwise hooks won't work for you.
|
||||
|
||||
## Browser Support
|
||||
|
||||
Hotkeys.js has been tested and should work in.
|
||||
|
||||
```shell
|
||||
Internet Explorer 6+
|
||||
Safari
|
||||
Firefox
|
||||
Chrome
|
||||
```
|
||||
|
||||
## Supported Keys
|
||||
|
||||
HotKeys understands the following modifiers: `⇧`, `shift`, `option`, `⌥`, `alt`, `ctrl`, `control`, `command`, and `⌘`.
|
||||
|
||||
The following special keys can be used for shortcuts: backspace, tab, clear, enter, return, esc, escape, space, up, down, left, right, home, end, pageup, pagedown, del, delete, f1 through f19, num_0 through num_9, num_multiply, num_add, num_enter, num_subtract, num_decimal, num_divide.
|
||||
|
||||
`⌘` Command()
|
||||
`⌃` Control
|
||||
`⌥` Option(alt)
|
||||
`⇧` Shift
|
||||
`⇪` Caps Lock(Capital)
|
||||
~~`fn` Does not support fn~~
|
||||
`↩︎` return/Enter space
|
||||
|
||||
## Defining Shortcuts
|
||||
|
||||
One global method is exposed, key which defines shortcuts when called directly.
|
||||
|
||||
```js
|
||||
hotkeys([keys:<String>], [option:[string|object|function]], [callback:<function>])
|
||||
```
|
||||
|
||||
|
||||
```js
|
||||
hotkeys('f5', function(event, handler) {
|
||||
// Prevent the default refresh event under WINDOWS system
|
||||
event.preventDefault();
|
||||
alert('you pressed F5!');
|
||||
});
|
||||
|
||||
// Returning false stops the event and prevents default browser events
|
||||
// Mac OS system defines `command + r` as a refresh shortcut
|
||||
hotkeys('ctrl+r, command+r', function() {
|
||||
alert('stopped reload!');
|
||||
return false;
|
||||
});
|
||||
|
||||
// Single key
|
||||
hotkeys('a', function(event,handler){
|
||||
//event.srcElement: input
|
||||
//event.target: input
|
||||
if(event.target === "input"){
|
||||
alert('you pressed a!')
|
||||
}
|
||||
alert('you pressed a!')
|
||||
});
|
||||
|
||||
// Key Combination
|
||||
hotkeys('ctrl+a,ctrl+b,r,f', function (event, handler){
|
||||
switch (handler.key) {
|
||||
case 'ctrl+a': alert('you pressed ctrl+a!');
|
||||
break;
|
||||
case 'ctrl+b': alert('you pressed ctrl+b!');
|
||||
break;
|
||||
case 'r': alert('you pressed r!');
|
||||
break;
|
||||
case 'f': alert('you pressed f!');
|
||||
break;
|
||||
default: alert(event);
|
||||
}
|
||||
});
|
||||
|
||||
hotkeys('ctrl+a+s', function() {
|
||||
alert('you pressed ctrl+a+s!');
|
||||
});
|
||||
|
||||
// Using a scope
|
||||
hotkeys('*','wcj', function(event){
|
||||
console.log('do something', event);
|
||||
});
|
||||
```
|
||||
|
||||
#### option
|
||||
|
||||
- `scope<String>`
|
||||
- `element<HTMLElement>`
|
||||
- `keyup<Boolean>`
|
||||
- `keydown<Boolean>`
|
||||
- `splitKey<string>` (default is `+`)
|
||||
- `capture<Boolean>`
|
||||
- `single<Boolean>`
|
||||
|
||||
```js
|
||||
hotkeys('o, enter', {
|
||||
scope: 'wcj',
|
||||
element: document.getElementById('wrapper'),
|
||||
}, function() {
|
||||
console.log('do something else');
|
||||
});
|
||||
|
||||
hotkeys('ctrl-+', { splitKey: '-' }, function(e) {
|
||||
console.log('you pressed ctrl and +');
|
||||
});
|
||||
|
||||
hotkeys('+', { splitKey: '-' }, function(e){
|
||||
console.log('you pressed +');
|
||||
})
|
||||
```
|
||||
|
||||
**keyup**
|
||||
|
||||
**key down** and **key up** both perform callback events.
|
||||
|
||||
```js
|
||||
hotkeys('ctrl+a,alt+a+s', {keyup: true}, function(event, handler) {
|
||||
if (event.type === 'keydown') {
|
||||
console.log('keydown:', event.type, handler, handler.key);
|
||||
}
|
||||
|
||||
if (event.type === 'keyup') {
|
||||
console.log('keyup:', event.type, handler, handler.key);
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## API REFERENCE
|
||||
|
||||
Asterisk "*"
|
||||
|
||||
Modifier key judgments
|
||||
|
||||
```js
|
||||
hotkeys('*', function() {
|
||||
if (hotkeys.shift) {
|
||||
console.log('shift is pressed!');
|
||||
}
|
||||
|
||||
if (hotkeys.ctrl) {
|
||||
console.log('ctrl is pressed!');
|
||||
}
|
||||
|
||||
if (hotkeys.alt) {
|
||||
console.log('alt is pressed!');
|
||||
}
|
||||
|
||||
if (hotkeys.option) {
|
||||
console.log('option is pressed!');
|
||||
}
|
||||
|
||||
if (hotkeys.control) {
|
||||
console.log('control is pressed!');
|
||||
}
|
||||
|
||||
if (hotkeys.cmd) {
|
||||
console.log('cmd is pressed!');
|
||||
}
|
||||
|
||||
if (hotkeys.command) {
|
||||
console.log('command is pressed!');
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### setScope
|
||||
|
||||
Use the `hotkeys.setScope` method to set scope. There can only be one active scope besides 'all'. By default 'all' is always active.
|
||||
|
||||
```js
|
||||
// Define shortcuts with a scope
|
||||
hotkeys('ctrl+o, ctrl+alt+enter', 'issues', function() {
|
||||
console.log('do something');
|
||||
});
|
||||
hotkeys('o, enter', 'files', function() {
|
||||
console.log('do something else');
|
||||
});
|
||||
|
||||
// Set the scope (only 'all' and 'issues' shortcuts will be honored)
|
||||
hotkeys.setScope('issues'); // default scope is 'all'
|
||||
```
|
||||
|
||||
### getScope
|
||||
|
||||
Use the `hotkeys.getScope` method to get scope.
|
||||
|
||||
```js
|
||||
hotkeys.getScope();
|
||||
```
|
||||
|
||||
### deleteScope
|
||||
|
||||
Use the `hotkeys.deleteScope` method to delete a scope. This will also remove all associated hotkeys with it.
|
||||
|
||||
```js
|
||||
hotkeys.deleteScope('issues');
|
||||
```
|
||||
You can use second argument, if need set new scope after deleting.
|
||||
|
||||
```js
|
||||
hotkeys.deleteScope('issues', 'newScopeName');
|
||||
```
|
||||
|
||||
### unbind
|
||||
|
||||
Similar to defining shortcuts, they can be unbound using `hotkeys.unbind`.
|
||||
|
||||
```js
|
||||
// unbind 'a' handler
|
||||
hotkeys.unbind('a');
|
||||
|
||||
// Unbind a hotkeys only for a single scope
|
||||
// If no scope is specified it defaults to the current scope (hotkeys.getScope())
|
||||
hotkeys.unbind('o, enter', 'issues');
|
||||
hotkeys.unbind('o, enter', 'files');
|
||||
```
|
||||
|
||||
Unbind events through functions.
|
||||
|
||||
```js
|
||||
function example() {
|
||||
hotkeys('a', example);
|
||||
hotkeys.unbind('a', example);
|
||||
|
||||
hotkeys('a', 'issues', example);
|
||||
hotkeys.unbind('a', 'issues', example);
|
||||
}
|
||||
```
|
||||
|
||||
To unbind everything.
|
||||
|
||||
```js
|
||||
hotkeys.unbind();
|
||||
```
|
||||
|
||||
### isPressed
|
||||
|
||||
For example, `hotkeys.isPressed(77)` is true if the `M` key is currently pressed.
|
||||
|
||||
```js
|
||||
hotkeys('a', function() {
|
||||
console.log(hotkeys.isPressed('a')); //=> true
|
||||
console.log(hotkeys.isPressed('A')); //=> true
|
||||
console.log(hotkeys.isPressed(65)); //=> true
|
||||
});
|
||||
```
|
||||
|
||||
### trigger
|
||||
|
||||
trigger shortcut key event
|
||||
|
||||
```js
|
||||
hotkeys.trigger('ctrl+o');
|
||||
hotkeys.trigger('ctrl+o', 'scope2');
|
||||
```
|
||||
|
||||
### getPressedKeyCodes
|
||||
|
||||
Returns an array of key codes currently pressed.
|
||||
|
||||
```js
|
||||
hotkeys('command+ctrl+shift+a,f', function() {
|
||||
console.log(hotkeys.getPressedKeyCodes()); //=> [17, 65] or [70]
|
||||
})
|
||||
```
|
||||
|
||||
### getPressedKeyString
|
||||
|
||||
Returns an array of key codes currently pressed.
|
||||
|
||||
```js
|
||||
hotkeys('command+ctrl+shift+a,f', function() {
|
||||
console.log(hotkeys.getPressedKeyString()); //=> ['⌘', '⌃', '⇧', 'A', 'F']
|
||||
})
|
||||
```
|
||||
|
||||
### getAllKeyCodes
|
||||
|
||||
Get a list of all registration codes.
|
||||
|
||||
```js
|
||||
hotkeys('command+ctrl+shift+a,f', function() {
|
||||
console.log(hotkeys.getAllKeyCodes());
|
||||
// [
|
||||
// { scope: 'all', shortcut: 'command+ctrl+shift+a', mods: [91, 17, 16], keys: [91, 17, 16, 65] },
|
||||
// { scope: 'all', shortcut: 'f', mods: [], keys: [42] }
|
||||
// ]
|
||||
})
|
||||
```
|
||||
|
||||
### filter
|
||||
|
||||
By default hotkeys are not enabled for `INPUT` `SELECT` `TEXTAREA` elements. `Hotkeys.filter` to return to the `true` shortcut keys set to play a role, `false` shortcut keys set up failure.
|
||||
|
||||
```js
|
||||
hotkeys.filter = function(event){
|
||||
return true;
|
||||
}
|
||||
//How to add the filter to edit labels. <div contentEditable="true"></div>
|
||||
//"contentEditable" Older browsers that do not support drops
|
||||
hotkeys.filter = function(event) {
|
||||
var target = event.target || event.srcElement;
|
||||
var tagName = target.tagName;
|
||||
return !(target.isContentEditable || tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA');
|
||||
}
|
||||
|
||||
hotkeys.filter = function(event){
|
||||
var tagName = (event.target || event.srcElement).tagName;
|
||||
hotkeys.setScope(/^(INPUT|TEXTAREA|SELECT)$/.test(tagName) ? 'input' : 'other');
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
### noConflict
|
||||
|
||||
Relinquish HotKeys’s control of the `hotkeys` variable.
|
||||
|
||||
```js
|
||||
var k = hotkeys.noConflict();
|
||||
k('a', function() {
|
||||
console.log("do something")
|
||||
});
|
||||
|
||||
hotkeys()
|
||||
// -->Uncaught TypeError: hotkeys is not a function(anonymous function)
|
||||
// @ VM2170:2InjectedScript._evaluateOn
|
||||
// @ VM2165:883InjectedScript._evaluateAndWrap
|
||||
// @ VM2165:816InjectedScript.evaluate @ VM2165:682
|
||||
```
|
||||
|
||||
## Development
|
||||
|
||||
To develop, Install dependencies, Get the code:
|
||||
|
||||
```shell
|
||||
$ git https://github.com/jaywcjlove/hotkeys.git
|
||||
$ cd hotkeys # Into the directory
|
||||
$ npm install # or yarn install
|
||||
```
|
||||
|
||||
To develop, run the self-reloading build:
|
||||
|
||||
```shell
|
||||
$ npm run watch
|
||||
```
|
||||
|
||||
Run Document Website Environment.
|
||||
|
||||
```shell
|
||||
$ npm run doc
|
||||
```
|
||||
|
||||
To contribute, please fork Hotkeys.js, add your patch and tests for it (in the `test/` folder) and submit a pull request.
|
||||
|
||||
```shell
|
||||
$ npm run test
|
||||
$ npm run test:watch # Development model
|
||||
```
|
||||
|
||||
## Contributors
|
||||
|
||||
As always, thanks to our amazing contributors!
|
||||
|
||||
<a href="https://github.com/jaywcjlove/hotkeys-js/graphs/contributors">
|
||||
<img src="https://jaywcjlove.github.io/hotkeys-js/CONTRIBUTORS.svg" />
|
||||
</a>
|
||||
|
||||
Made with [github-action-contributors](https://github.com/jaywcjlove/github-action-contributors).
|
||||
|
||||
## License
|
||||
|
||||
[MIT © Kenny Wong](./LICENSE)
|
13
term/pkg/hotkeys-js/dist/README.md
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
|
||||
|
||||
Explanation of Build Files
|
||||
---
|
||||
|
||||
| UMD | Size | CommonJS | Size | ES Module | Size |
|
||||
| ---- | ---- | ---- | ---- | ---- | ---- |
|
||||
| hotkeys.js | 8.37kb | hotkeys.common.js | 8.13kb | hotkeys.esm.js | 8.12kb |
|
||||
| hotkeys.min.js | 3.62kb (gzipped: 1.73kb) | hotkeys.common.min.js | (gzipped: 1.84kb) | - | - |
|
||||
|
||||
- [UMD](https://github.com/umdjs/umd): UMD builds can be used directly in the browser via a `<script>` tag.
|
||||
- [CommonJS](http://wiki.commonjs.org/wiki/Modules/1.1): CommonJS builds are intended for use with older bundlers like [browserify](http://browserify.org/) or [webpack 1](https://webpack.github.io/).
|
||||
- [ES Module](http://exploringjs.com/es6/ch_modules.html): ES module builds are intended for use with modern bundlers like [webpack 2](https://webpack.js.org/) or [rollup](http://rollupjs.org/).
|
677
term/pkg/hotkeys-js/dist/hotkeys.common.js
vendored
Normal file
@ -0,0 +1,677 @@
|
||||
/**!
|
||||
* hotkeys-js v3.13.7
|
||||
* A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies.
|
||||
*
|
||||
* Copyright (c) 2024 kenny wong <wowohoo@qq.com>
|
||||
* https://github.com/jaywcjlove/hotkeys-js.git
|
||||
*
|
||||
* @website: https://jaywcjlove.github.io/hotkeys-js
|
||||
|
||||
* Licensed under the MIT license
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const isff = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase().indexOf('firefox') > 0 : false;
|
||||
|
||||
// 绑定事件
|
||||
function addEvent(object, event, method, useCapture) {
|
||||
if (object.addEventListener) {
|
||||
object.addEventListener(event, method, useCapture);
|
||||
} else if (object.attachEvent) {
|
||||
object.attachEvent("on".concat(event), method);
|
||||
}
|
||||
}
|
||||
function removeEvent(object, event, method, useCapture) {
|
||||
if (object.removeEventListener) {
|
||||
object.removeEventListener(event, method, useCapture);
|
||||
} else if (object.detachEvent) {
|
||||
object.detachEvent("on".concat(event), method);
|
||||
}
|
||||
}
|
||||
|
||||
// 修饰键转换成对应的键码
|
||||
function getMods(modifier, key) {
|
||||
const mods = key.slice(0, key.length - 1);
|
||||
for (let i = 0; i < mods.length; i++) mods[i] = modifier[mods[i].toLowerCase()];
|
||||
return mods;
|
||||
}
|
||||
|
||||
// 处理传的key字符串转换成数组
|
||||
function getKeys(key) {
|
||||
if (typeof key !== 'string') key = '';
|
||||
key = key.replace(/\s/g, ''); // 匹配任何空白字符,包括空格、制表符、换页符等等
|
||||
const keys = key.split(','); // 同时设置多个快捷键,以','分割
|
||||
let index = keys.lastIndexOf('');
|
||||
|
||||
// 快捷键可能包含',',需特殊处理
|
||||
for (; index >= 0;) {
|
||||
keys[index - 1] += ',';
|
||||
keys.splice(index, 1);
|
||||
index = keys.lastIndexOf('');
|
||||
}
|
||||
return keys;
|
||||
}
|
||||
|
||||
// 比较修饰键的数组
|
||||
function compareArray(a1, a2) {
|
||||
const arr1 = a1.length >= a2.length ? a1 : a2;
|
||||
const arr2 = a1.length >= a2.length ? a2 : a1;
|
||||
let isIndex = true;
|
||||
for (let i = 0; i < arr1.length; i++) {
|
||||
if (arr2.indexOf(arr1[i]) === -1) isIndex = false;
|
||||
}
|
||||
return isIndex;
|
||||
}
|
||||
|
||||
// Special Keys
|
||||
const _keyMap = {
|
||||
backspace: 8,
|
||||
'⌫': 8,
|
||||
tab: 9,
|
||||
clear: 12,
|
||||
enter: 13,
|
||||
'↩': 13,
|
||||
return: 13,
|
||||
esc: 27,
|
||||
escape: 27,
|
||||
space: 32,
|
||||
left: 37,
|
||||
up: 38,
|
||||
right: 39,
|
||||
down: 40,
|
||||
del: 46,
|
||||
delete: 46,
|
||||
ins: 45,
|
||||
insert: 45,
|
||||
home: 36,
|
||||
end: 35,
|
||||
pageup: 33,
|
||||
pagedown: 34,
|
||||
capslock: 20,
|
||||
num_0: 96,
|
||||
num_1: 97,
|
||||
num_2: 98,
|
||||
num_3: 99,
|
||||
num_4: 100,
|
||||
num_5: 101,
|
||||
num_6: 102,
|
||||
num_7: 103,
|
||||
num_8: 104,
|
||||
num_9: 105,
|
||||
num_multiply: 106,
|
||||
num_add: 107,
|
||||
num_enter: 108,
|
||||
num_subtract: 109,
|
||||
num_decimal: 110,
|
||||
num_divide: 111,
|
||||
'⇪': 20,
|
||||
',': 188,
|
||||
'.': 190,
|
||||
'/': 191,
|
||||
'`': 192,
|
||||
'-': isff ? 173 : 189,
|
||||
'=': isff ? 61 : 187,
|
||||
';': isff ? 59 : 186,
|
||||
'\'': 222,
|
||||
'[': 219,
|
||||
']': 221,
|
||||
'\\': 220
|
||||
};
|
||||
|
||||
// Modifier Keys
|
||||
const _modifier = {
|
||||
// shiftKey
|
||||
'⇧': 16,
|
||||
shift: 16,
|
||||
// altKey
|
||||
'⌥': 18,
|
||||
alt: 18,
|
||||
option: 18,
|
||||
// ctrlKey
|
||||
'⌃': 17,
|
||||
ctrl: 17,
|
||||
control: 17,
|
||||
// metaKey
|
||||
'⌘': 91,
|
||||
cmd: 91,
|
||||
command: 91
|
||||
};
|
||||
const modifierMap = {
|
||||
16: 'shiftKey',
|
||||
18: 'altKey',
|
||||
17: 'ctrlKey',
|
||||
91: 'metaKey',
|
||||
shiftKey: 16,
|
||||
ctrlKey: 17,
|
||||
altKey: 18,
|
||||
metaKey: 91
|
||||
};
|
||||
const _mods = {
|
||||
16: false,
|
||||
18: false,
|
||||
17: false,
|
||||
91: false
|
||||
};
|
||||
const _handlers = {};
|
||||
|
||||
// F1~F12 special key
|
||||
for (let k = 1; k < 20; k++) {
|
||||
_keyMap["f".concat(k)] = 111 + k;
|
||||
}
|
||||
|
||||
let _downKeys = []; // 记录摁下的绑定键
|
||||
let winListendFocus = null; // window是否已经监听了focus事件
|
||||
let _scope = 'all'; // 默认热键范围
|
||||
const elementEventMap = new Map(); // 已绑定事件的节点记录
|
||||
|
||||
// 返回键码
|
||||
const code = x => _keyMap[x.toLowerCase()] || _modifier[x.toLowerCase()] || x.toUpperCase().charCodeAt(0);
|
||||
const getKey = x => Object.keys(_keyMap).find(k => _keyMap[k] === x);
|
||||
const getModifier = x => Object.keys(_modifier).find(k => _modifier[k] === x);
|
||||
|
||||
// 设置获取当前范围(默认为'所有')
|
||||
function setScope(scope) {
|
||||
_scope = scope || 'all';
|
||||
}
|
||||
// 获取当前范围
|
||||
function getScope() {
|
||||
return _scope || 'all';
|
||||
}
|
||||
// 获取摁下绑定键的键值
|
||||
function getPressedKeyCodes() {
|
||||
return _downKeys.slice(0);
|
||||
}
|
||||
function getPressedKeyString() {
|
||||
return _downKeys.map(c => getKey(c) || getModifier(c) || String.fromCharCode(c));
|
||||
}
|
||||
function getAllKeyCodes() {
|
||||
const result = [];
|
||||
Object.keys(_handlers).forEach(k => {
|
||||
_handlers[k].forEach(_ref => {
|
||||
let {
|
||||
key,
|
||||
scope,
|
||||
mods,
|
||||
shortcut
|
||||
} = _ref;
|
||||
result.push({
|
||||
scope,
|
||||
shortcut,
|
||||
mods,
|
||||
keys: key.split('+').map(v => code(v))
|
||||
});
|
||||
});
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
// 表单控件控件判断 返回 Boolean
|
||||
// hotkey is effective only when filter return true
|
||||
function filter(event) {
|
||||
const target = event.target || event.srcElement;
|
||||
const {
|
||||
tagName
|
||||
} = target;
|
||||
let flag = true;
|
||||
const isInput = tagName === 'INPUT' && !['checkbox', 'radio', 'range', 'button', 'file', 'reset', 'submit', 'color'].includes(target.type);
|
||||
// ignore: isContentEditable === 'true', <input> and <textarea> when readOnly state is false, <select>
|
||||
if (target.isContentEditable || (isInput || tagName === 'TEXTAREA' || tagName === 'SELECT') && !target.readOnly) {
|
||||
flag = false;
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
// 判断摁下的键是否为某个键,返回true或者false
|
||||
function isPressed(keyCode) {
|
||||
if (typeof keyCode === 'string') {
|
||||
keyCode = code(keyCode); // 转换成键码
|
||||
}
|
||||
return _downKeys.indexOf(keyCode) !== -1;
|
||||
}
|
||||
|
||||
// 循环删除handlers中的所有 scope(范围)
|
||||
function deleteScope(scope, newScope) {
|
||||
let handlers;
|
||||
let i;
|
||||
|
||||
// 没有指定scope,获取scope
|
||||
if (!scope) scope = getScope();
|
||||
for (const key in _handlers) {
|
||||
if (Object.prototype.hasOwnProperty.call(_handlers, key)) {
|
||||
handlers = _handlers[key];
|
||||
for (i = 0; i < handlers.length;) {
|
||||
if (handlers[i].scope === scope) {
|
||||
const deleteItems = handlers.splice(i, 1);
|
||||
deleteItems.forEach(_ref2 => {
|
||||
let {
|
||||
element
|
||||
} = _ref2;
|
||||
return removeKeyEvent(element);
|
||||
});
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 如果scope被删除,将scope重置为all
|
||||
if (getScope() === scope) setScope(newScope || 'all');
|
||||
}
|
||||
|
||||
// 清除修饰键
|
||||
function clearModifier(event) {
|
||||
let key = event.keyCode || event.which || event.charCode;
|
||||
const i = _downKeys.indexOf(key);
|
||||
|
||||
// 从列表中清除按压过的键
|
||||
if (i >= 0) {
|
||||
_downKeys.splice(i, 1);
|
||||
}
|
||||
// 特殊处理 cmmand 键,在 cmmand 组合快捷键 keyup 只执行一次的问题
|
||||
if (event.key && event.key.toLowerCase() === 'meta') {
|
||||
_downKeys.splice(0, _downKeys.length);
|
||||
}
|
||||
|
||||
// 修饰键 shiftKey altKey ctrlKey (command||metaKey) 清除
|
||||
if (key === 93 || key === 224) key = 91;
|
||||
if (key in _mods) {
|
||||
_mods[key] = false;
|
||||
|
||||
// 将修饰键重置为false
|
||||
for (const k in _modifier) if (_modifier[k] === key) hotkeys[k] = false;
|
||||
}
|
||||
}
|
||||
function unbind(keysInfo) {
|
||||
// unbind(), unbind all keys
|
||||
if (typeof keysInfo === 'undefined') {
|
||||
Object.keys(_handlers).forEach(key => {
|
||||
Array.isArray(_handlers[key]) && _handlers[key].forEach(info => eachUnbind(info));
|
||||
delete _handlers[key];
|
||||
});
|
||||
removeKeyEvent(null);
|
||||
} else if (Array.isArray(keysInfo)) {
|
||||
// support like : unbind([{key: 'ctrl+a', scope: 's1'}, {key: 'ctrl-a', scope: 's2', splitKey: '-'}])
|
||||
keysInfo.forEach(info => {
|
||||
if (info.key) eachUnbind(info);
|
||||
});
|
||||
} else if (typeof keysInfo === 'object') {
|
||||
// support like unbind({key: 'ctrl+a, ctrl+b', scope:'abc'})
|
||||
if (keysInfo.key) eachUnbind(keysInfo);
|
||||
} else if (typeof keysInfo === 'string') {
|
||||
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||||
args[_key - 1] = arguments[_key];
|
||||
}
|
||||
// support old method
|
||||
// eslint-disable-line
|
||||
let [scope, method] = args;
|
||||
if (typeof scope === 'function') {
|
||||
method = scope;
|
||||
scope = '';
|
||||
}
|
||||
eachUnbind({
|
||||
key: keysInfo,
|
||||
scope,
|
||||
method,
|
||||
splitKey: '+'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 解除绑定某个范围的快捷键
|
||||
const eachUnbind = _ref3 => {
|
||||
let {
|
||||
key,
|
||||
scope,
|
||||
method,
|
||||
splitKey = '+'
|
||||
} = _ref3;
|
||||
const multipleKeys = getKeys(key);
|
||||
multipleKeys.forEach(originKey => {
|
||||
const unbindKeys = originKey.split(splitKey);
|
||||
const len = unbindKeys.length;
|
||||
const lastKey = unbindKeys[len - 1];
|
||||
const keyCode = lastKey === '*' ? '*' : code(lastKey);
|
||||
if (!_handlers[keyCode]) return;
|
||||
// 判断是否传入范围,没有就获取范围
|
||||
if (!scope) scope = getScope();
|
||||
const mods = len > 1 ? getMods(_modifier, unbindKeys) : [];
|
||||
const unbindElements = [];
|
||||
_handlers[keyCode] = _handlers[keyCode].filter(record => {
|
||||
// 通过函数判断,是否解除绑定,函数相等直接返回
|
||||
const isMatchingMethod = method ? record.method === method : true;
|
||||
const isUnbind = isMatchingMethod && record.scope === scope && compareArray(record.mods, mods);
|
||||
if (isUnbind) unbindElements.push(record.element);
|
||||
return !isUnbind;
|
||||
});
|
||||
unbindElements.forEach(element => removeKeyEvent(element));
|
||||
});
|
||||
};
|
||||
|
||||
// 对监听对应快捷键的回调函数进行处理
|
||||
function eventHandler(event, handler, scope, element) {
|
||||
if (handler.element !== element) {
|
||||
return;
|
||||
}
|
||||
let modifiersMatch;
|
||||
|
||||
// 看它是否在当前范围
|
||||
if (handler.scope === scope || handler.scope === 'all') {
|
||||
// 检查是否匹配修饰符(如果有返回true)
|
||||
modifiersMatch = handler.mods.length > 0;
|
||||
for (const y in _mods) {
|
||||
if (Object.prototype.hasOwnProperty.call(_mods, y)) {
|
||||
if (!_mods[y] && handler.mods.indexOf(+y) > -1 || _mods[y] && handler.mods.indexOf(+y) === -1) {
|
||||
modifiersMatch = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 调用处理程序,如果是修饰键不做处理
|
||||
if (handler.mods.length === 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91] || modifiersMatch || handler.shortcut === '*') {
|
||||
handler.keys = [];
|
||||
handler.keys = handler.keys.concat(_downKeys);
|
||||
if (handler.method(event, handler) === false) {
|
||||
if (event.preventDefault) event.preventDefault();else event.returnValue = false;
|
||||
if (event.stopPropagation) event.stopPropagation();
|
||||
if (event.cancelBubble) event.cancelBubble = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 处理keydown事件
|
||||
function dispatch(event, element) {
|
||||
const asterisk = _handlers['*'];
|
||||
let key = event.keyCode || event.which || event.charCode;
|
||||
|
||||
// 表单控件过滤 默认表单控件不触发快捷键
|
||||
if (!hotkeys.filter.call(this, event)) return;
|
||||
|
||||
// Gecko(Firefox)的command键值224,在Webkit(Chrome)中保持一致
|
||||
// Webkit左右 command 键值不一样
|
||||
if (key === 93 || key === 224) key = 91;
|
||||
|
||||
/**
|
||||
* Collect bound keys
|
||||
* If an Input Method Editor is processing key input and the event is keydown, return 229.
|
||||
* https://stackoverflow.com/questions/25043934/is-it-ok-to-ignore-keydown-events-with-keycode-229
|
||||
* http://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html
|
||||
*/
|
||||
if (_downKeys.indexOf(key) === -1 && key !== 229) _downKeys.push(key);
|
||||
/**
|
||||
* Jest test cases are required.
|
||||
* ===============================
|
||||
*/
|
||||
['ctrlKey', 'altKey', 'shiftKey', 'metaKey'].forEach(keyName => {
|
||||
const keyNum = modifierMap[keyName];
|
||||
if (event[keyName] && _downKeys.indexOf(keyNum) === -1) {
|
||||
_downKeys.push(keyNum);
|
||||
} else if (!event[keyName] && _downKeys.indexOf(keyNum) > -1) {
|
||||
_downKeys.splice(_downKeys.indexOf(keyNum), 1);
|
||||
} else if (keyName === 'metaKey' && event[keyName] && _downKeys.length === 3) {
|
||||
/**
|
||||
* Fix if Command is pressed:
|
||||
* ===============================
|
||||
*/
|
||||
if (!(event.ctrlKey || event.shiftKey || event.altKey)) {
|
||||
_downKeys = _downKeys.slice(_downKeys.indexOf(keyNum));
|
||||
}
|
||||
}
|
||||
});
|
||||
/**
|
||||
* -------------------------------
|
||||
*/
|
||||
|
||||
if (key in _mods) {
|
||||
_mods[key] = true;
|
||||
|
||||
// 将特殊字符的key注册到 hotkeys 上
|
||||
for (const k in _modifier) {
|
||||
if (_modifier[k] === key) hotkeys[k] = true;
|
||||
}
|
||||
if (!asterisk) return;
|
||||
}
|
||||
|
||||
// 将 modifierMap 里面的修饰键绑定到 event 中
|
||||
for (const e in _mods) {
|
||||
if (Object.prototype.hasOwnProperty.call(_mods, e)) {
|
||||
_mods[e] = event[modifierMap[e]];
|
||||
}
|
||||
}
|
||||
/**
|
||||
* https://github.com/jaywcjlove/hotkeys/pull/129
|
||||
* This solves the issue in Firefox on Windows where hotkeys corresponding to special characters would not trigger.
|
||||
* An example of this is ctrl+alt+m on a Swedish keyboard which is used to type μ.
|
||||
* Browser support: https://caniuse.com/#feat=keyboardevent-getmodifierstate
|
||||
*/
|
||||
if (event.getModifierState && !(event.altKey && !event.ctrlKey) && event.getModifierState('AltGraph')) {
|
||||
if (_downKeys.indexOf(17) === -1) {
|
||||
_downKeys.push(17);
|
||||
}
|
||||
if (_downKeys.indexOf(18) === -1) {
|
||||
_downKeys.push(18);
|
||||
}
|
||||
_mods[17] = true;
|
||||
_mods[18] = true;
|
||||
}
|
||||
|
||||
// 获取范围 默认为 `all`
|
||||
const scope = getScope();
|
||||
// 对任何快捷键都需要做的处理
|
||||
if (asterisk) {
|
||||
for (let i = 0; i < asterisk.length; i++) {
|
||||
if (asterisk[i].scope === scope && (event.type === 'keydown' && asterisk[i].keydown || event.type === 'keyup' && asterisk[i].keyup)) {
|
||||
eventHandler(event, asterisk[i], scope, element);
|
||||
}
|
||||
}
|
||||
}
|
||||
// key 不在 _handlers 中返回
|
||||
if (!(key in _handlers)) return;
|
||||
const handlerKey = _handlers[key];
|
||||
const keyLen = handlerKey.length;
|
||||
for (let i = 0; i < keyLen; i++) {
|
||||
if (event.type === 'keydown' && handlerKey[i].keydown || event.type === 'keyup' && handlerKey[i].keyup) {
|
||||
if (handlerKey[i].key) {
|
||||
const record = handlerKey[i];
|
||||
const {
|
||||
splitKey
|
||||
} = record;
|
||||
const keyShortcut = record.key.split(splitKey);
|
||||
const _downKeysCurrent = []; // 记录当前按键键值
|
||||
for (let a = 0; a < keyShortcut.length; a++) {
|
||||
_downKeysCurrent.push(code(keyShortcut[a]));
|
||||
}
|
||||
if (_downKeysCurrent.sort().join('') === _downKeys.sort().join('')) {
|
||||
// 找到处理内容
|
||||
eventHandler(event, record, scope, element);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function hotkeys(key, option, method) {
|
||||
_downKeys = [];
|
||||
const keys = getKeys(key); // 需要处理的快捷键列表
|
||||
let mods = [];
|
||||
let scope = 'all'; // scope默认为all,所有范围都有效
|
||||
let element = document; // 快捷键事件绑定节点
|
||||
let i = 0;
|
||||
let keyup = false;
|
||||
let keydown = true;
|
||||
let splitKey = '+';
|
||||
let capture = false;
|
||||
let single = false; // 单个callback
|
||||
|
||||
// 对为设定范围的判断
|
||||
if (method === undefined && typeof option === 'function') {
|
||||
method = option;
|
||||
}
|
||||
if (Object.prototype.toString.call(option) === '[object Object]') {
|
||||
if (option.scope) scope = option.scope; // eslint-disable-line
|
||||
if (option.element) element = option.element; // eslint-disable-line
|
||||
if (option.keyup) keyup = option.keyup; // eslint-disable-line
|
||||
if (option.keydown !== undefined) keydown = option.keydown; // eslint-disable-line
|
||||
if (option.capture !== undefined) capture = option.capture; // eslint-disable-line
|
||||
if (typeof option.splitKey === 'string') splitKey = option.splitKey; // eslint-disable-line
|
||||
if (option.single === true) single = true; // eslint-disable-line
|
||||
}
|
||||
if (typeof option === 'string') scope = option;
|
||||
|
||||
// 如果只允许单个callback,先unbind
|
||||
if (single) unbind(key, scope);
|
||||
|
||||
// 对于每个快捷键进行处理
|
||||
for (; i < keys.length; i++) {
|
||||
key = keys[i].split(splitKey); // 按键列表
|
||||
mods = [];
|
||||
|
||||
// 如果是组合快捷键取得组合快捷键
|
||||
if (key.length > 1) mods = getMods(_modifier, key);
|
||||
|
||||
// 将非修饰键转化为键码
|
||||
key = key[key.length - 1];
|
||||
key = key === '*' ? '*' : code(key); // *表示匹配所有快捷键
|
||||
|
||||
// 判断key是否在_handlers中,不在就赋一个空数组
|
||||
if (!(key in _handlers)) _handlers[key] = [];
|
||||
_handlers[key].push({
|
||||
keyup,
|
||||
keydown,
|
||||
scope,
|
||||
mods,
|
||||
shortcut: keys[i],
|
||||
method,
|
||||
key: keys[i],
|
||||
splitKey,
|
||||
element
|
||||
});
|
||||
}
|
||||
// 在全局document上设置快捷键
|
||||
if (typeof element !== 'undefined' && window) {
|
||||
if (!elementEventMap.has(element)) {
|
||||
const keydownListener = function () {
|
||||
let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event;
|
||||
return dispatch(event, element);
|
||||
};
|
||||
const keyupListenr = function () {
|
||||
let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event;
|
||||
dispatch(event, element);
|
||||
clearModifier(event);
|
||||
};
|
||||
elementEventMap.set(element, {
|
||||
keydownListener,
|
||||
keyupListenr,
|
||||
capture
|
||||
});
|
||||
addEvent(element, 'keydown', keydownListener, capture);
|
||||
addEvent(element, 'keyup', keyupListenr, capture);
|
||||
}
|
||||
if (!winListendFocus) {
|
||||
const listener = () => {
|
||||
_downKeys = [];
|
||||
};
|
||||
winListendFocus = {
|
||||
listener,
|
||||
capture
|
||||
};
|
||||
addEvent(window, 'focus', listener, capture);
|
||||
}
|
||||
}
|
||||
}
|
||||
function trigger(shortcut) {
|
||||
let scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'all';
|
||||
Object.keys(_handlers).forEach(key => {
|
||||
const dataList = _handlers[key].filter(item => item.scope === scope && item.shortcut === shortcut);
|
||||
dataList.forEach(data => {
|
||||
if (data && data.method) {
|
||||
data.method();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 销毁事件,unbind之后判断element上是否还有键盘快捷键,如果没有移除监听
|
||||
function removeKeyEvent(element) {
|
||||
const values = Object.values(_handlers).flat();
|
||||
const findindex = values.findIndex(_ref4 => {
|
||||
let {
|
||||
element: el
|
||||
} = _ref4;
|
||||
return el === element;
|
||||
});
|
||||
if (findindex < 0) {
|
||||
const {
|
||||
keydownListener,
|
||||
keyupListenr,
|
||||
capture
|
||||
} = elementEventMap.get(element) || {};
|
||||
if (keydownListener && keyupListenr) {
|
||||
removeEvent(element, 'keyup', keyupListenr, capture);
|
||||
removeEvent(element, 'keydown', keydownListener, capture);
|
||||
elementEventMap.delete(element);
|
||||
}
|
||||
}
|
||||
if (values.length <= 0 || elementEventMap.size <= 0) {
|
||||
// 移除所有的元素上的监听
|
||||
const eventKeys = Object.keys(elementEventMap);
|
||||
eventKeys.forEach(el => {
|
||||
const {
|
||||
keydownListener,
|
||||
keyupListenr,
|
||||
capture
|
||||
} = elementEventMap.get(el) || {};
|
||||
if (keydownListener && keyupListenr) {
|
||||
removeEvent(el, 'keyup', keyupListenr, capture);
|
||||
removeEvent(el, 'keydown', keydownListener, capture);
|
||||
elementEventMap.delete(el);
|
||||
}
|
||||
});
|
||||
// 清空 elementEventMap
|
||||
elementEventMap.clear();
|
||||
// 清空 _handlers
|
||||
Object.keys(_handlers).forEach(key => delete _handlers[key]);
|
||||
// 移除window上的focus监听
|
||||
if (winListendFocus) {
|
||||
const {
|
||||
listener,
|
||||
capture
|
||||
} = winListendFocus;
|
||||
removeEvent(window, 'focus', listener, capture);
|
||||
winListendFocus = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
const _api = {
|
||||
getPressedKeyString,
|
||||
setScope,
|
||||
getScope,
|
||||
deleteScope,
|
||||
getPressedKeyCodes,
|
||||
getAllKeyCodes,
|
||||
isPressed,
|
||||
filter,
|
||||
trigger,
|
||||
unbind,
|
||||
keyMap: _keyMap,
|
||||
modifier: _modifier,
|
||||
modifierMap
|
||||
};
|
||||
for (const a in _api) {
|
||||
if (Object.prototype.hasOwnProperty.call(_api, a)) {
|
||||
hotkeys[a] = _api[a];
|
||||
}
|
||||
}
|
||||
if (typeof window !== 'undefined') {
|
||||
const _hotkeys = window.hotkeys;
|
||||
hotkeys.noConflict = deep => {
|
||||
if (deep && window.hotkeys === hotkeys) {
|
||||
window.hotkeys = _hotkeys;
|
||||
}
|
||||
return hotkeys;
|
||||
};
|
||||
window.hotkeys = hotkeys;
|
||||
}
|
||||
|
||||
module.exports = hotkeys;
|
2
term/pkg/hotkeys-js/dist/hotkeys.common.min.js
vendored
Normal file
675
term/pkg/hotkeys-js/dist/hotkeys.esm.js
vendored
Normal file
@ -0,0 +1,675 @@
|
||||
/**!
|
||||
* hotkeys-js v3.13.7
|
||||
* A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies.
|
||||
*
|
||||
* Copyright (c) 2024 kenny wong <wowohoo@qq.com>
|
||||
* https://github.com/jaywcjlove/hotkeys-js.git
|
||||
*
|
||||
* @website: https://jaywcjlove.github.io/hotkeys-js
|
||||
|
||||
* Licensed under the MIT license
|
||||
*/
|
||||
|
||||
const isff = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase().indexOf('firefox') > 0 : false;
|
||||
|
||||
// 绑定事件
|
||||
function addEvent(object, event, method, useCapture) {
|
||||
if (object.addEventListener) {
|
||||
object.addEventListener(event, method, useCapture);
|
||||
} else if (object.attachEvent) {
|
||||
object.attachEvent("on".concat(event), method);
|
||||
}
|
||||
}
|
||||
function removeEvent(object, event, method, useCapture) {
|
||||
if (object.removeEventListener) {
|
||||
object.removeEventListener(event, method, useCapture);
|
||||
} else if (object.detachEvent) {
|
||||
object.detachEvent("on".concat(event), method);
|
||||
}
|
||||
}
|
||||
|
||||
// 修饰键转换成对应的键码
|
||||
function getMods(modifier, key) {
|
||||
const mods = key.slice(0, key.length - 1);
|
||||
for (let i = 0; i < mods.length; i++) mods[i] = modifier[mods[i].toLowerCase()];
|
||||
return mods;
|
||||
}
|
||||
|
||||
// 处理传的key字符串转换成数组
|
||||
function getKeys(key) {
|
||||
if (typeof key !== 'string') key = '';
|
||||
key = key.replace(/\s/g, ''); // 匹配任何空白字符,包括空格、制表符、换页符等等
|
||||
const keys = key.split(','); // 同时设置多个快捷键,以','分割
|
||||
let index = keys.lastIndexOf('');
|
||||
|
||||
// 快捷键可能包含',',需特殊处理
|
||||
for (; index >= 0;) {
|
||||
keys[index - 1] += ',';
|
||||
keys.splice(index, 1);
|
||||
index = keys.lastIndexOf('');
|
||||
}
|
||||
return keys;
|
||||
}
|
||||
|
||||
// 比较修饰键的数组
|
||||
function compareArray(a1, a2) {
|
||||
const arr1 = a1.length >= a2.length ? a1 : a2;
|
||||
const arr2 = a1.length >= a2.length ? a2 : a1;
|
||||
let isIndex = true;
|
||||
for (let i = 0; i < arr1.length; i++) {
|
||||
if (arr2.indexOf(arr1[i]) === -1) isIndex = false;
|
||||
}
|
||||
return isIndex;
|
||||
}
|
||||
|
||||
// Special Keys
|
||||
const _keyMap = {
|
||||
backspace: 8,
|
||||
'⌫': 8,
|
||||
tab: 9,
|
||||
clear: 12,
|
||||
enter: 13,
|
||||
'↩': 13,
|
||||
return: 13,
|
||||
esc: 27,
|
||||
escape: 27,
|
||||
space: 32,
|
||||
left: 37,
|
||||
up: 38,
|
||||
right: 39,
|
||||
down: 40,
|
||||
del: 46,
|
||||
delete: 46,
|
||||
ins: 45,
|
||||
insert: 45,
|
||||
home: 36,
|
||||
end: 35,
|
||||
pageup: 33,
|
||||
pagedown: 34,
|
||||
capslock: 20,
|
||||
num_0: 96,
|
||||
num_1: 97,
|
||||
num_2: 98,
|
||||
num_3: 99,
|
||||
num_4: 100,
|
||||
num_5: 101,
|
||||
num_6: 102,
|
||||
num_7: 103,
|
||||
num_8: 104,
|
||||
num_9: 105,
|
||||
num_multiply: 106,
|
||||
num_add: 107,
|
||||
num_enter: 108,
|
||||
num_subtract: 109,
|
||||
num_decimal: 110,
|
||||
num_divide: 111,
|
||||
'⇪': 20,
|
||||
',': 188,
|
||||
'.': 190,
|
||||
'/': 191,
|
||||
'`': 192,
|
||||
'-': isff ? 173 : 189,
|
||||
'=': isff ? 61 : 187,
|
||||
';': isff ? 59 : 186,
|
||||
'\'': 222,
|
||||
'[': 219,
|
||||
']': 221,
|
||||
'\\': 220
|
||||
};
|
||||
|
||||
// Modifier Keys
|
||||
const _modifier = {
|
||||
// shiftKey
|
||||
'⇧': 16,
|
||||
shift: 16,
|
||||
// altKey
|
||||
'⌥': 18,
|
||||
alt: 18,
|
||||
option: 18,
|
||||
// ctrlKey
|
||||
'⌃': 17,
|
||||
ctrl: 17,
|
||||
control: 17,
|
||||
// metaKey
|
||||
'⌘': 91,
|
||||
cmd: 91,
|
||||
command: 91
|
||||
};
|
||||
const modifierMap = {
|
||||
16: 'shiftKey',
|
||||
18: 'altKey',
|
||||
17: 'ctrlKey',
|
||||
91: 'metaKey',
|
||||
shiftKey: 16,
|
||||
ctrlKey: 17,
|
||||
altKey: 18,
|
||||
metaKey: 91
|
||||
};
|
||||
const _mods = {
|
||||
16: false,
|
||||
18: false,
|
||||
17: false,
|
||||
91: false
|
||||
};
|
||||
const _handlers = {};
|
||||
|
||||
// F1~F12 special key
|
||||
for (let k = 1; k < 20; k++) {
|
||||
_keyMap["f".concat(k)] = 111 + k;
|
||||
}
|
||||
|
||||
let _downKeys = []; // 记录摁下的绑定键
|
||||
let winListendFocus = null; // window是否已经监听了focus事件
|
||||
let _scope = 'all'; // 默认热键范围
|
||||
const elementEventMap = new Map(); // 已绑定事件的节点记录
|
||||
|
||||
// 返回键码
|
||||
const code = x => _keyMap[x.toLowerCase()] || _modifier[x.toLowerCase()] || x.toUpperCase().charCodeAt(0);
|
||||
const getKey = x => Object.keys(_keyMap).find(k => _keyMap[k] === x);
|
||||
const getModifier = x => Object.keys(_modifier).find(k => _modifier[k] === x);
|
||||
|
||||
// 设置获取当前范围(默认为'所有')
|
||||
function setScope(scope) {
|
||||
_scope = scope || 'all';
|
||||
}
|
||||
// 获取当前范围
|
||||
function getScope() {
|
||||
return _scope || 'all';
|
||||
}
|
||||
// 获取摁下绑定键的键值
|
||||
function getPressedKeyCodes() {
|
||||
return _downKeys.slice(0);
|
||||
}
|
||||
function getPressedKeyString() {
|
||||
return _downKeys.map(c => getKey(c) || getModifier(c) || String.fromCharCode(c));
|
||||
}
|
||||
function getAllKeyCodes() {
|
||||
const result = [];
|
||||
Object.keys(_handlers).forEach(k => {
|
||||
_handlers[k].forEach(_ref => {
|
||||
let {
|
||||
key,
|
||||
scope,
|
||||
mods,
|
||||
shortcut
|
||||
} = _ref;
|
||||
result.push({
|
||||
scope,
|
||||
shortcut,
|
||||
mods,
|
||||
keys: key.split('+').map(v => code(v))
|
||||
});
|
||||
});
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
// 表单控件控件判断 返回 Boolean
|
||||
// hotkey is effective only when filter return true
|
||||
function filter(event) {
|
||||
const target = event.target || event.srcElement;
|
||||
const {
|
||||
tagName
|
||||
} = target;
|
||||
let flag = true;
|
||||
const isInput = tagName === 'INPUT' && !['checkbox', 'radio', 'range', 'button', 'file', 'reset', 'submit', 'color'].includes(target.type);
|
||||
// ignore: isContentEditable === 'true', <input> and <textarea> when readOnly state is false, <select>
|
||||
if (target.isContentEditable || (isInput || tagName === 'TEXTAREA' || tagName === 'SELECT') && !target.readOnly) {
|
||||
flag = false;
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
// 判断摁下的键是否为某个键,返回true或者false
|
||||
function isPressed(keyCode) {
|
||||
if (typeof keyCode === 'string') {
|
||||
keyCode = code(keyCode); // 转换成键码
|
||||
}
|
||||
return _downKeys.indexOf(keyCode) !== -1;
|
||||
}
|
||||
|
||||
// 循环删除handlers中的所有 scope(范围)
|
||||
function deleteScope(scope, newScope) {
|
||||
let handlers;
|
||||
let i;
|
||||
|
||||
// 没有指定scope,获取scope
|
||||
if (!scope) scope = getScope();
|
||||
for (const key in _handlers) {
|
||||
if (Object.prototype.hasOwnProperty.call(_handlers, key)) {
|
||||
handlers = _handlers[key];
|
||||
for (i = 0; i < handlers.length;) {
|
||||
if (handlers[i].scope === scope) {
|
||||
const deleteItems = handlers.splice(i, 1);
|
||||
deleteItems.forEach(_ref2 => {
|
||||
let {
|
||||
element
|
||||
} = _ref2;
|
||||
return removeKeyEvent(element);
|
||||
});
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 如果scope被删除,将scope重置为all
|
||||
if (getScope() === scope) setScope(newScope || 'all');
|
||||
}
|
||||
|
||||
// 清除修饰键
|
||||
function clearModifier(event) {
|
||||
let key = event.keyCode || event.which || event.charCode;
|
||||
const i = _downKeys.indexOf(key);
|
||||
|
||||
// 从列表中清除按压过的键
|
||||
if (i >= 0) {
|
||||
_downKeys.splice(i, 1);
|
||||
}
|
||||
// 特殊处理 cmmand 键,在 cmmand 组合快捷键 keyup 只执行一次的问题
|
||||
if (event.key && event.key.toLowerCase() === 'meta') {
|
||||
_downKeys.splice(0, _downKeys.length);
|
||||
}
|
||||
|
||||
// 修饰键 shiftKey altKey ctrlKey (command||metaKey) 清除
|
||||
if (key === 93 || key === 224) key = 91;
|
||||
if (key in _mods) {
|
||||
_mods[key] = false;
|
||||
|
||||
// 将修饰键重置为false
|
||||
for (const k in _modifier) if (_modifier[k] === key) hotkeys[k] = false;
|
||||
}
|
||||
}
|
||||
function unbind(keysInfo) {
|
||||
// unbind(), unbind all keys
|
||||
if (typeof keysInfo === 'undefined') {
|
||||
Object.keys(_handlers).forEach(key => {
|
||||
Array.isArray(_handlers[key]) && _handlers[key].forEach(info => eachUnbind(info));
|
||||
delete _handlers[key];
|
||||
});
|
||||
removeKeyEvent(null);
|
||||
} else if (Array.isArray(keysInfo)) {
|
||||
// support like : unbind([{key: 'ctrl+a', scope: 's1'}, {key: 'ctrl-a', scope: 's2', splitKey: '-'}])
|
||||
keysInfo.forEach(info => {
|
||||
if (info.key) eachUnbind(info);
|
||||
});
|
||||
} else if (typeof keysInfo === 'object') {
|
||||
// support like unbind({key: 'ctrl+a, ctrl+b', scope:'abc'})
|
||||
if (keysInfo.key) eachUnbind(keysInfo);
|
||||
} else if (typeof keysInfo === 'string') {
|
||||
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||||
args[_key - 1] = arguments[_key];
|
||||
}
|
||||
// support old method
|
||||
// eslint-disable-line
|
||||
let [scope, method] = args;
|
||||
if (typeof scope === 'function') {
|
||||
method = scope;
|
||||
scope = '';
|
||||
}
|
||||
eachUnbind({
|
||||
key: keysInfo,
|
||||
scope,
|
||||
method,
|
||||
splitKey: '+'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 解除绑定某个范围的快捷键
|
||||
const eachUnbind = _ref3 => {
|
||||
let {
|
||||
key,
|
||||
scope,
|
||||
method,
|
||||
splitKey = '+'
|
||||
} = _ref3;
|
||||
const multipleKeys = getKeys(key);
|
||||
multipleKeys.forEach(originKey => {
|
||||
const unbindKeys = originKey.split(splitKey);
|
||||
const len = unbindKeys.length;
|
||||
const lastKey = unbindKeys[len - 1];
|
||||
const keyCode = lastKey === '*' ? '*' : code(lastKey);
|
||||
if (!_handlers[keyCode]) return;
|
||||
// 判断是否传入范围,没有就获取范围
|
||||
if (!scope) scope = getScope();
|
||||
const mods = len > 1 ? getMods(_modifier, unbindKeys) : [];
|
||||
const unbindElements = [];
|
||||
_handlers[keyCode] = _handlers[keyCode].filter(record => {
|
||||
// 通过函数判断,是否解除绑定,函数相等直接返回
|
||||
const isMatchingMethod = method ? record.method === method : true;
|
||||
const isUnbind = isMatchingMethod && record.scope === scope && compareArray(record.mods, mods);
|
||||
if (isUnbind) unbindElements.push(record.element);
|
||||
return !isUnbind;
|
||||
});
|
||||
unbindElements.forEach(element => removeKeyEvent(element));
|
||||
});
|
||||
};
|
||||
|
||||
// 对监听对应快捷键的回调函数进行处理
|
||||
function eventHandler(event, handler, scope, element) {
|
||||
if (handler.element !== element) {
|
||||
return;
|
||||
}
|
||||
let modifiersMatch;
|
||||
|
||||
// 看它是否在当前范围
|
||||
if (handler.scope === scope || handler.scope === 'all') {
|
||||
// 检查是否匹配修饰符(如果有返回true)
|
||||
modifiersMatch = handler.mods.length > 0;
|
||||
for (const y in _mods) {
|
||||
if (Object.prototype.hasOwnProperty.call(_mods, y)) {
|
||||
if (!_mods[y] && handler.mods.indexOf(+y) > -1 || _mods[y] && handler.mods.indexOf(+y) === -1) {
|
||||
modifiersMatch = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 调用处理程序,如果是修饰键不做处理
|
||||
if (handler.mods.length === 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91] || modifiersMatch || handler.shortcut === '*') {
|
||||
handler.keys = [];
|
||||
handler.keys = handler.keys.concat(_downKeys);
|
||||
if (handler.method(event, handler) === false) {
|
||||
if (event.preventDefault) event.preventDefault();else event.returnValue = false;
|
||||
if (event.stopPropagation) event.stopPropagation();
|
||||
if (event.cancelBubble) event.cancelBubble = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 处理keydown事件
|
||||
function dispatch(event, element) {
|
||||
const asterisk = _handlers['*'];
|
||||
let key = event.keyCode || event.which || event.charCode;
|
||||
|
||||
// 表单控件过滤 默认表单控件不触发快捷键
|
||||
if (!hotkeys.filter.call(this, event)) return;
|
||||
|
||||
// Gecko(Firefox)的command键值224,在Webkit(Chrome)中保持一致
|
||||
// Webkit左右 command 键值不一样
|
||||
if (key === 93 || key === 224) key = 91;
|
||||
|
||||
/**
|
||||
* Collect bound keys
|
||||
* If an Input Method Editor is processing key input and the event is keydown, return 229.
|
||||
* https://stackoverflow.com/questions/25043934/is-it-ok-to-ignore-keydown-events-with-keycode-229
|
||||
* http://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html
|
||||
*/
|
||||
if (_downKeys.indexOf(key) === -1 && key !== 229) _downKeys.push(key);
|
||||
/**
|
||||
* Jest test cases are required.
|
||||
* ===============================
|
||||
*/
|
||||
['ctrlKey', 'altKey', 'shiftKey', 'metaKey'].forEach(keyName => {
|
||||
const keyNum = modifierMap[keyName];
|
||||
if (event[keyName] && _downKeys.indexOf(keyNum) === -1) {
|
||||
_downKeys.push(keyNum);
|
||||
} else if (!event[keyName] && _downKeys.indexOf(keyNum) > -1) {
|
||||
_downKeys.splice(_downKeys.indexOf(keyNum), 1);
|
||||
} else if (keyName === 'metaKey' && event[keyName] && _downKeys.length === 3) {
|
||||
/**
|
||||
* Fix if Command is pressed:
|
||||
* ===============================
|
||||
*/
|
||||
if (!(event.ctrlKey || event.shiftKey || event.altKey)) {
|
||||
_downKeys = _downKeys.slice(_downKeys.indexOf(keyNum));
|
||||
}
|
||||
}
|
||||
});
|
||||
/**
|
||||
* -------------------------------
|
||||
*/
|
||||
|
||||
if (key in _mods) {
|
||||
_mods[key] = true;
|
||||
|
||||
// 将特殊字符的key注册到 hotkeys 上
|
||||
for (const k in _modifier) {
|
||||
if (_modifier[k] === key) hotkeys[k] = true;
|
||||
}
|
||||
if (!asterisk) return;
|
||||
}
|
||||
|
||||
// 将 modifierMap 里面的修饰键绑定到 event 中
|
||||
for (const e in _mods) {
|
||||
if (Object.prototype.hasOwnProperty.call(_mods, e)) {
|
||||
_mods[e] = event[modifierMap[e]];
|
||||
}
|
||||
}
|
||||
/**
|
||||
* https://github.com/jaywcjlove/hotkeys/pull/129
|
||||
* This solves the issue in Firefox on Windows where hotkeys corresponding to special characters would not trigger.
|
||||
* An example of this is ctrl+alt+m on a Swedish keyboard which is used to type μ.
|
||||
* Browser support: https://caniuse.com/#feat=keyboardevent-getmodifierstate
|
||||
*/
|
||||
if (event.getModifierState && !(event.altKey && !event.ctrlKey) && event.getModifierState('AltGraph')) {
|
||||
if (_downKeys.indexOf(17) === -1) {
|
||||
_downKeys.push(17);
|
||||
}
|
||||
if (_downKeys.indexOf(18) === -1) {
|
||||
_downKeys.push(18);
|
||||
}
|
||||
_mods[17] = true;
|
||||
_mods[18] = true;
|
||||
}
|
||||
|
||||
// 获取范围 默认为 `all`
|
||||
const scope = getScope();
|
||||
// 对任何快捷键都需要做的处理
|
||||
if (asterisk) {
|
||||
for (let i = 0; i < asterisk.length; i++) {
|
||||
if (asterisk[i].scope === scope && (event.type === 'keydown' && asterisk[i].keydown || event.type === 'keyup' && asterisk[i].keyup)) {
|
||||
eventHandler(event, asterisk[i], scope, element);
|
||||
}
|
||||
}
|
||||
}
|
||||
// key 不在 _handlers 中返回
|
||||
if (!(key in _handlers)) return;
|
||||
const handlerKey = _handlers[key];
|
||||
const keyLen = handlerKey.length;
|
||||
for (let i = 0; i < keyLen; i++) {
|
||||
if (event.type === 'keydown' && handlerKey[i].keydown || event.type === 'keyup' && handlerKey[i].keyup) {
|
||||
if (handlerKey[i].key) {
|
||||
const record = handlerKey[i];
|
||||
const {
|
||||
splitKey
|
||||
} = record;
|
||||
const keyShortcut = record.key.split(splitKey);
|
||||
const _downKeysCurrent = []; // 记录当前按键键值
|
||||
for (let a = 0; a < keyShortcut.length; a++) {
|
||||
_downKeysCurrent.push(code(keyShortcut[a]));
|
||||
}
|
||||
if (_downKeysCurrent.sort().join('') === _downKeys.sort().join('')) {
|
||||
// 找到处理内容
|
||||
eventHandler(event, record, scope, element);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function hotkeys(key, option, method) {
|
||||
_downKeys = [];
|
||||
const keys = getKeys(key); // 需要处理的快捷键列表
|
||||
let mods = [];
|
||||
let scope = 'all'; // scope默认为all,所有范围都有效
|
||||
let element = document; // 快捷键事件绑定节点
|
||||
let i = 0;
|
||||
let keyup = false;
|
||||
let keydown = true;
|
||||
let splitKey = '+';
|
||||
let capture = false;
|
||||
let single = false; // 单个callback
|
||||
|
||||
// 对为设定范围的判断
|
||||
if (method === undefined && typeof option === 'function') {
|
||||
method = option;
|
||||
}
|
||||
if (Object.prototype.toString.call(option) === '[object Object]') {
|
||||
if (option.scope) scope = option.scope; // eslint-disable-line
|
||||
if (option.element) element = option.element; // eslint-disable-line
|
||||
if (option.keyup) keyup = option.keyup; // eslint-disable-line
|
||||
if (option.keydown !== undefined) keydown = option.keydown; // eslint-disable-line
|
||||
if (option.capture !== undefined) capture = option.capture; // eslint-disable-line
|
||||
if (typeof option.splitKey === 'string') splitKey = option.splitKey; // eslint-disable-line
|
||||
if (option.single === true) single = true; // eslint-disable-line
|
||||
}
|
||||
if (typeof option === 'string') scope = option;
|
||||
|
||||
// 如果只允许单个callback,先unbind
|
||||
if (single) unbind(key, scope);
|
||||
|
||||
// 对于每个快捷键进行处理
|
||||
for (; i < keys.length; i++) {
|
||||
key = keys[i].split(splitKey); // 按键列表
|
||||
mods = [];
|
||||
|
||||
// 如果是组合快捷键取得组合快捷键
|
||||
if (key.length > 1) mods = getMods(_modifier, key);
|
||||
|
||||
// 将非修饰键转化为键码
|
||||
key = key[key.length - 1];
|
||||
key = key === '*' ? '*' : code(key); // *表示匹配所有快捷键
|
||||
|
||||
// 判断key是否在_handlers中,不在就赋一个空数组
|
||||
if (!(key in _handlers)) _handlers[key] = [];
|
||||
_handlers[key].push({
|
||||
keyup,
|
||||
keydown,
|
||||
scope,
|
||||
mods,
|
||||
shortcut: keys[i],
|
||||
method,
|
||||
key: keys[i],
|
||||
splitKey,
|
||||
element
|
||||
});
|
||||
}
|
||||
// 在全局document上设置快捷键
|
||||
if (typeof element !== 'undefined' && window) {
|
||||
if (!elementEventMap.has(element)) {
|
||||
const keydownListener = function () {
|
||||
let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event;
|
||||
return dispatch(event, element);
|
||||
};
|
||||
const keyupListenr = function () {
|
||||
let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event;
|
||||
dispatch(event, element);
|
||||
clearModifier(event);
|
||||
};
|
||||
elementEventMap.set(element, {
|
||||
keydownListener,
|
||||
keyupListenr,
|
||||
capture
|
||||
});
|
||||
addEvent(element, 'keydown', keydownListener, capture);
|
||||
addEvent(element, 'keyup', keyupListenr, capture);
|
||||
}
|
||||
if (!winListendFocus) {
|
||||
const listener = () => {
|
||||
_downKeys = [];
|
||||
};
|
||||
winListendFocus = {
|
||||
listener,
|
||||
capture
|
||||
};
|
||||
addEvent(window, 'focus', listener, capture);
|
||||
}
|
||||
}
|
||||
}
|
||||
function trigger(shortcut) {
|
||||
let scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'all';
|
||||
Object.keys(_handlers).forEach(key => {
|
||||
const dataList = _handlers[key].filter(item => item.scope === scope && item.shortcut === shortcut);
|
||||
dataList.forEach(data => {
|
||||
if (data && data.method) {
|
||||
data.method();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 销毁事件,unbind之后判断element上是否还有键盘快捷键,如果没有移除监听
|
||||
function removeKeyEvent(element) {
|
||||
const values = Object.values(_handlers).flat();
|
||||
const findindex = values.findIndex(_ref4 => {
|
||||
let {
|
||||
element: el
|
||||
} = _ref4;
|
||||
return el === element;
|
||||
});
|
||||
if (findindex < 0) {
|
||||
const {
|
||||
keydownListener,
|
||||
keyupListenr,
|
||||
capture
|
||||
} = elementEventMap.get(element) || {};
|
||||
if (keydownListener && keyupListenr) {
|
||||
removeEvent(element, 'keyup', keyupListenr, capture);
|
||||
removeEvent(element, 'keydown', keydownListener, capture);
|
||||
elementEventMap.delete(element);
|
||||
}
|
||||
}
|
||||
if (values.length <= 0 || elementEventMap.size <= 0) {
|
||||
// 移除所有的元素上的监听
|
||||
const eventKeys = Object.keys(elementEventMap);
|
||||
eventKeys.forEach(el => {
|
||||
const {
|
||||
keydownListener,
|
||||
keyupListenr,
|
||||
capture
|
||||
} = elementEventMap.get(el) || {};
|
||||
if (keydownListener && keyupListenr) {
|
||||
removeEvent(el, 'keyup', keyupListenr, capture);
|
||||
removeEvent(el, 'keydown', keydownListener, capture);
|
||||
elementEventMap.delete(el);
|
||||
}
|
||||
});
|
||||
// 清空 elementEventMap
|
||||
elementEventMap.clear();
|
||||
// 清空 _handlers
|
||||
Object.keys(_handlers).forEach(key => delete _handlers[key]);
|
||||
// 移除window上的focus监听
|
||||
if (winListendFocus) {
|
||||
const {
|
||||
listener,
|
||||
capture
|
||||
} = winListendFocus;
|
||||
removeEvent(window, 'focus', listener, capture);
|
||||
winListendFocus = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
const _api = {
|
||||
getPressedKeyString,
|
||||
setScope,
|
||||
getScope,
|
||||
deleteScope,
|
||||
getPressedKeyCodes,
|
||||
getAllKeyCodes,
|
||||
isPressed,
|
||||
filter,
|
||||
trigger,
|
||||
unbind,
|
||||
keyMap: _keyMap,
|
||||
modifier: _modifier,
|
||||
modifierMap
|
||||
};
|
||||
for (const a in _api) {
|
||||
if (Object.prototype.hasOwnProperty.call(_api, a)) {
|
||||
hotkeys[a] = _api[a];
|
||||
}
|
||||
}
|
||||
if (typeof window !== 'undefined') {
|
||||
const _hotkeys = window.hotkeys;
|
||||
hotkeys.noConflict = deep => {
|
||||
if (deep && window.hotkeys === hotkeys) {
|
||||
window.hotkeys = _hotkeys;
|
||||
}
|
||||
return hotkeys;
|
||||
};
|
||||
window.hotkeys = hotkeys;
|
||||
}
|
||||
|
||||
export { hotkeys as default };
|
683
term/pkg/hotkeys-js/dist/hotkeys.js
vendored
Normal file
@ -0,0 +1,683 @@
|
||||
/**!
|
||||
* hotkeys-js v3.13.7
|
||||
* A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies.
|
||||
*
|
||||
* Copyright (c) 2024 kenny wong <wowohoo@qq.com>
|
||||
* https://github.com/jaywcjlove/hotkeys-js.git
|
||||
*
|
||||
* @website: https://jaywcjlove.github.io/hotkeys-js
|
||||
|
||||
* Licensed under the MIT license
|
||||
*/
|
||||
|
||||
(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||
typeof define === 'function' && define.amd ? define(factory) :
|
||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.hotkeys = factory());
|
||||
})(this, (function () { 'use strict';
|
||||
|
||||
const isff = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase().indexOf('firefox') > 0 : false;
|
||||
|
||||
// 绑定事件
|
||||
function addEvent(object, event, method, useCapture) {
|
||||
if (object.addEventListener) {
|
||||
object.addEventListener(event, method, useCapture);
|
||||
} else if (object.attachEvent) {
|
||||
object.attachEvent("on".concat(event), method);
|
||||
}
|
||||
}
|
||||
function removeEvent(object, event, method, useCapture) {
|
||||
if (object.removeEventListener) {
|
||||
object.removeEventListener(event, method, useCapture);
|
||||
} else if (object.detachEvent) {
|
||||
object.detachEvent("on".concat(event), method);
|
||||
}
|
||||
}
|
||||
|
||||
// 修饰键转换成对应的键码
|
||||
function getMods(modifier, key) {
|
||||
const mods = key.slice(0, key.length - 1);
|
||||
for (let i = 0; i < mods.length; i++) mods[i] = modifier[mods[i].toLowerCase()];
|
||||
return mods;
|
||||
}
|
||||
|
||||
// 处理传的key字符串转换成数组
|
||||
function getKeys(key) {
|
||||
if (typeof key !== 'string') key = '';
|
||||
key = key.replace(/\s/g, ''); // 匹配任何空白字符,包括空格、制表符、换页符等等
|
||||
const keys = key.split(','); // 同时设置多个快捷键,以','分割
|
||||
let index = keys.lastIndexOf('');
|
||||
|
||||
// 快捷键可能包含',',需特殊处理
|
||||
for (; index >= 0;) {
|
||||
keys[index - 1] += ',';
|
||||
keys.splice(index, 1);
|
||||
index = keys.lastIndexOf('');
|
||||
}
|
||||
return keys;
|
||||
}
|
||||
|
||||
// 比较修饰键的数组
|
||||
function compareArray(a1, a2) {
|
||||
const arr1 = a1.length >= a2.length ? a1 : a2;
|
||||
const arr2 = a1.length >= a2.length ? a2 : a1;
|
||||
let isIndex = true;
|
||||
for (let i = 0; i < arr1.length; i++) {
|
||||
if (arr2.indexOf(arr1[i]) === -1) isIndex = false;
|
||||
}
|
||||
return isIndex;
|
||||
}
|
||||
|
||||
// Special Keys
|
||||
const _keyMap = {
|
||||
backspace: 8,
|
||||
'⌫': 8,
|
||||
tab: 9,
|
||||
clear: 12,
|
||||
enter: 13,
|
||||
'↩': 13,
|
||||
return: 13,
|
||||
esc: 27,
|
||||
escape: 27,
|
||||
space: 32,
|
||||
left: 37,
|
||||
up: 38,
|
||||
right: 39,
|
||||
down: 40,
|
||||
del: 46,
|
||||
delete: 46,
|
||||
ins: 45,
|
||||
insert: 45,
|
||||
home: 36,
|
||||
end: 35,
|
||||
pageup: 33,
|
||||
pagedown: 34,
|
||||
capslock: 20,
|
||||
num_0: 96,
|
||||
num_1: 97,
|
||||
num_2: 98,
|
||||
num_3: 99,
|
||||
num_4: 100,
|
||||
num_5: 101,
|
||||
num_6: 102,
|
||||
num_7: 103,
|
||||
num_8: 104,
|
||||
num_9: 105,
|
||||
num_multiply: 106,
|
||||
num_add: 107,
|
||||
num_enter: 108,
|
||||
num_subtract: 109,
|
||||
num_decimal: 110,
|
||||
num_divide: 111,
|
||||
'⇪': 20,
|
||||
',': 188,
|
||||
'.': 190,
|
||||
'/': 191,
|
||||
'`': 192,
|
||||
'-': isff ? 173 : 189,
|
||||
'=': isff ? 61 : 187,
|
||||
';': isff ? 59 : 186,
|
||||
'\'': 222,
|
||||
'[': 219,
|
||||
']': 221,
|
||||
'\\': 220
|
||||
};
|
||||
|
||||
// Modifier Keys
|
||||
const _modifier = {
|
||||
// shiftKey
|
||||
'⇧': 16,
|
||||
shift: 16,
|
||||
// altKey
|
||||
'⌥': 18,
|
||||
alt: 18,
|
||||
option: 18,
|
||||
// ctrlKey
|
||||
'⌃': 17,
|
||||
ctrl: 17,
|
||||
control: 17,
|
||||
// metaKey
|
||||
'⌘': 91,
|
||||
cmd: 91,
|
||||
command: 91
|
||||
};
|
||||
const modifierMap = {
|
||||
16: 'shiftKey',
|
||||
18: 'altKey',
|
||||
17: 'ctrlKey',
|
||||
91: 'metaKey',
|
||||
shiftKey: 16,
|
||||
ctrlKey: 17,
|
||||
altKey: 18,
|
||||
metaKey: 91
|
||||
};
|
||||
const _mods = {
|
||||
16: false,
|
||||
18: false,
|
||||
17: false,
|
||||
91: false
|
||||
};
|
||||
const _handlers = {};
|
||||
|
||||
// F1~F12 special key
|
||||
for (let k = 1; k < 20; k++) {
|
||||
_keyMap["f".concat(k)] = 111 + k;
|
||||
}
|
||||
|
||||
let _downKeys = []; // 记录摁下的绑定键
|
||||
let winListendFocus = null; // window是否已经监听了focus事件
|
||||
let _scope = 'all'; // 默认热键范围
|
||||
const elementEventMap = new Map(); // 已绑定事件的节点记录
|
||||
|
||||
// 返回键码
|
||||
const code = x => _keyMap[x.toLowerCase()] || _modifier[x.toLowerCase()] || x.toUpperCase().charCodeAt(0);
|
||||
const getKey = x => Object.keys(_keyMap).find(k => _keyMap[k] === x);
|
||||
const getModifier = x => Object.keys(_modifier).find(k => _modifier[k] === x);
|
||||
|
||||
// 设置获取当前范围(默认为'所有')
|
||||
function setScope(scope) {
|
||||
_scope = scope || 'all';
|
||||
}
|
||||
// 获取当前范围
|
||||
function getScope() {
|
||||
return _scope || 'all';
|
||||
}
|
||||
// 获取摁下绑定键的键值
|
||||
function getPressedKeyCodes() {
|
||||
return _downKeys.slice(0);
|
||||
}
|
||||
function getPressedKeyString() {
|
||||
return _downKeys.map(c => getKey(c) || getModifier(c) || String.fromCharCode(c));
|
||||
}
|
||||
function getAllKeyCodes() {
|
||||
const result = [];
|
||||
Object.keys(_handlers).forEach(k => {
|
||||
_handlers[k].forEach(_ref => {
|
||||
let {
|
||||
key,
|
||||
scope,
|
||||
mods,
|
||||
shortcut
|
||||
} = _ref;
|
||||
result.push({
|
||||
scope,
|
||||
shortcut,
|
||||
mods,
|
||||
keys: key.split('+').map(v => code(v))
|
||||
});
|
||||
});
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
// 表单控件控件判断 返回 Boolean
|
||||
// hotkey is effective only when filter return true
|
||||
function filter(event) {
|
||||
const target = event.target || event.srcElement;
|
||||
const {
|
||||
tagName
|
||||
} = target;
|
||||
let flag = true;
|
||||
const isInput = tagName === 'INPUT' && !['checkbox', 'radio', 'range', 'button', 'file', 'reset', 'submit', 'color'].includes(target.type);
|
||||
// ignore: isContentEditable === 'true', <input> and <textarea> when readOnly state is false, <select>
|
||||
if (target.isContentEditable || (isInput || tagName === 'TEXTAREA' || tagName === 'SELECT') && !target.readOnly) {
|
||||
flag = false;
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
// 判断摁下的键是否为某个键,返回true或者false
|
||||
function isPressed(keyCode) {
|
||||
if (typeof keyCode === 'string') {
|
||||
keyCode = code(keyCode); // 转换成键码
|
||||
}
|
||||
return _downKeys.indexOf(keyCode) !== -1;
|
||||
}
|
||||
|
||||
// 循环删除handlers中的所有 scope(范围)
|
||||
function deleteScope(scope, newScope) {
|
||||
let handlers;
|
||||
let i;
|
||||
|
||||
// 没有指定scope,获取scope
|
||||
if (!scope) scope = getScope();
|
||||
for (const key in _handlers) {
|
||||
if (Object.prototype.hasOwnProperty.call(_handlers, key)) {
|
||||
handlers = _handlers[key];
|
||||
for (i = 0; i < handlers.length;) {
|
||||
if (handlers[i].scope === scope) {
|
||||
const deleteItems = handlers.splice(i, 1);
|
||||
deleteItems.forEach(_ref2 => {
|
||||
let {
|
||||
element
|
||||
} = _ref2;
|
||||
return removeKeyEvent(element);
|
||||
});
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 如果scope被删除,将scope重置为all
|
||||
if (getScope() === scope) setScope(newScope || 'all');
|
||||
}
|
||||
|
||||
// 清除修饰键
|
||||
function clearModifier(event) {
|
||||
let key = event.keyCode || event.which || event.charCode;
|
||||
const i = _downKeys.indexOf(key);
|
||||
|
||||
// 从列表中清除按压过的键
|
||||
if (i >= 0) {
|
||||
_downKeys.splice(i, 1);
|
||||
}
|
||||
// 特殊处理 cmmand 键,在 cmmand 组合快捷键 keyup 只执行一次的问题
|
||||
if (event.key && event.key.toLowerCase() === 'meta') {
|
||||
_downKeys.splice(0, _downKeys.length);
|
||||
}
|
||||
|
||||
// 修饰键 shiftKey altKey ctrlKey (command||metaKey) 清除
|
||||
if (key === 93 || key === 224) key = 91;
|
||||
if (key in _mods) {
|
||||
_mods[key] = false;
|
||||
|
||||
// 将修饰键重置为false
|
||||
for (const k in _modifier) if (_modifier[k] === key) hotkeys[k] = false;
|
||||
}
|
||||
}
|
||||
function unbind(keysInfo) {
|
||||
// unbind(), unbind all keys
|
||||
if (typeof keysInfo === 'undefined') {
|
||||
Object.keys(_handlers).forEach(key => {
|
||||
Array.isArray(_handlers[key]) && _handlers[key].forEach(info => eachUnbind(info));
|
||||
delete _handlers[key];
|
||||
});
|
||||
removeKeyEvent(null);
|
||||
} else if (Array.isArray(keysInfo)) {
|
||||
// support like : unbind([{key: 'ctrl+a', scope: 's1'}, {key: 'ctrl-a', scope: 's2', splitKey: '-'}])
|
||||
keysInfo.forEach(info => {
|
||||
if (info.key) eachUnbind(info);
|
||||
});
|
||||
} else if (typeof keysInfo === 'object') {
|
||||
// support like unbind({key: 'ctrl+a, ctrl+b', scope:'abc'})
|
||||
if (keysInfo.key) eachUnbind(keysInfo);
|
||||
} else if (typeof keysInfo === 'string') {
|
||||
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||||
args[_key - 1] = arguments[_key];
|
||||
}
|
||||
// support old method
|
||||
// eslint-disable-line
|
||||
let [scope, method] = args;
|
||||
if (typeof scope === 'function') {
|
||||
method = scope;
|
||||
scope = '';
|
||||
}
|
||||
eachUnbind({
|
||||
key: keysInfo,
|
||||
scope,
|
||||
method,
|
||||
splitKey: '+'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 解除绑定某个范围的快捷键
|
||||
const eachUnbind = _ref3 => {
|
||||
let {
|
||||
key,
|
||||
scope,
|
||||
method,
|
||||
splitKey = '+'
|
||||
} = _ref3;
|
||||
const multipleKeys = getKeys(key);
|
||||
multipleKeys.forEach(originKey => {
|
||||
const unbindKeys = originKey.split(splitKey);
|
||||
const len = unbindKeys.length;
|
||||
const lastKey = unbindKeys[len - 1];
|
||||
const keyCode = lastKey === '*' ? '*' : code(lastKey);
|
||||
if (!_handlers[keyCode]) return;
|
||||
// 判断是否传入范围,没有就获取范围
|
||||
if (!scope) scope = getScope();
|
||||
const mods = len > 1 ? getMods(_modifier, unbindKeys) : [];
|
||||
const unbindElements = [];
|
||||
_handlers[keyCode] = _handlers[keyCode].filter(record => {
|
||||
// 通过函数判断,是否解除绑定,函数相等直接返回
|
||||
const isMatchingMethod = method ? record.method === method : true;
|
||||
const isUnbind = isMatchingMethod && record.scope === scope && compareArray(record.mods, mods);
|
||||
if (isUnbind) unbindElements.push(record.element);
|
||||
return !isUnbind;
|
||||
});
|
||||
unbindElements.forEach(element => removeKeyEvent(element));
|
||||
});
|
||||
};
|
||||
|
||||
// 对监听对应快捷键的回调函数进行处理
|
||||
function eventHandler(event, handler, scope, element) {
|
||||
if (handler.element !== element) {
|
||||
return;
|
||||
}
|
||||
let modifiersMatch;
|
||||
|
||||
// 看它是否在当前范围
|
||||
if (handler.scope === scope || handler.scope === 'all') {
|
||||
// 检查是否匹配修饰符(如果有返回true)
|
||||
modifiersMatch = handler.mods.length > 0;
|
||||
for (const y in _mods) {
|
||||
if (Object.prototype.hasOwnProperty.call(_mods, y)) {
|
||||
if (!_mods[y] && handler.mods.indexOf(+y) > -1 || _mods[y] && handler.mods.indexOf(+y) === -1) {
|
||||
modifiersMatch = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 调用处理程序,如果是修饰键不做处理
|
||||
if (handler.mods.length === 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91] || modifiersMatch || handler.shortcut === '*') {
|
||||
handler.keys = [];
|
||||
handler.keys = handler.keys.concat(_downKeys);
|
||||
if (handler.method(event, handler) === false) {
|
||||
if (event.preventDefault) event.preventDefault();else event.returnValue = false;
|
||||
if (event.stopPropagation) event.stopPropagation();
|
||||
if (event.cancelBubble) event.cancelBubble = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 处理keydown事件
|
||||
function dispatch(event, element) {
|
||||
const asterisk = _handlers['*'];
|
||||
let key = event.keyCode || event.which || event.charCode;
|
||||
|
||||
// 表单控件过滤 默认表单控件不触发快捷键
|
||||
if (!hotkeys.filter.call(this, event)) return;
|
||||
|
||||
// Gecko(Firefox)的command键值224,在Webkit(Chrome)中保持一致
|
||||
// Webkit左右 command 键值不一样
|
||||
if (key === 93 || key === 224) key = 91;
|
||||
|
||||
/**
|
||||
* Collect bound keys
|
||||
* If an Input Method Editor is processing key input and the event is keydown, return 229.
|
||||
* https://stackoverflow.com/questions/25043934/is-it-ok-to-ignore-keydown-events-with-keycode-229
|
||||
* http://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html
|
||||
*/
|
||||
if (_downKeys.indexOf(key) === -1 && key !== 229) _downKeys.push(key);
|
||||
/**
|
||||
* Jest test cases are required.
|
||||
* ===============================
|
||||
*/
|
||||
['ctrlKey', 'altKey', 'shiftKey', 'metaKey'].forEach(keyName => {
|
||||
const keyNum = modifierMap[keyName];
|
||||
if (event[keyName] && _downKeys.indexOf(keyNum) === -1) {
|
||||
_downKeys.push(keyNum);
|
||||
} else if (!event[keyName] && _downKeys.indexOf(keyNum) > -1) {
|
||||
_downKeys.splice(_downKeys.indexOf(keyNum), 1);
|
||||
} else if (keyName === 'metaKey' && event[keyName] && _downKeys.length === 3) {
|
||||
/**
|
||||
* Fix if Command is pressed:
|
||||
* ===============================
|
||||
*/
|
||||
if (!(event.ctrlKey || event.shiftKey || event.altKey)) {
|
||||
_downKeys = _downKeys.slice(_downKeys.indexOf(keyNum));
|
||||
}
|
||||
}
|
||||
});
|
||||
/**
|
||||
* -------------------------------
|
||||
*/
|
||||
|
||||
if (key in _mods) {
|
||||
_mods[key] = true;
|
||||
|
||||
// 将特殊字符的key注册到 hotkeys 上
|
||||
for (const k in _modifier) {
|
||||
if (_modifier[k] === key) hotkeys[k] = true;
|
||||
}
|
||||
if (!asterisk) return;
|
||||
}
|
||||
|
||||
// 将 modifierMap 里面的修饰键绑定到 event 中
|
||||
for (const e in _mods) {
|
||||
if (Object.prototype.hasOwnProperty.call(_mods, e)) {
|
||||
_mods[e] = event[modifierMap[e]];
|
||||
}
|
||||
}
|
||||
/**
|
||||
* https://github.com/jaywcjlove/hotkeys/pull/129
|
||||
* This solves the issue in Firefox on Windows where hotkeys corresponding to special characters would not trigger.
|
||||
* An example of this is ctrl+alt+m on a Swedish keyboard which is used to type μ.
|
||||
* Browser support: https://caniuse.com/#feat=keyboardevent-getmodifierstate
|
||||
*/
|
||||
if (event.getModifierState && !(event.altKey && !event.ctrlKey) && event.getModifierState('AltGraph')) {
|
||||
if (_downKeys.indexOf(17) === -1) {
|
||||
_downKeys.push(17);
|
||||
}
|
||||
if (_downKeys.indexOf(18) === -1) {
|
||||
_downKeys.push(18);
|
||||
}
|
||||
_mods[17] = true;
|
||||
_mods[18] = true;
|
||||
}
|
||||
|
||||
// 获取范围 默认为 `all`
|
||||
const scope = getScope();
|
||||
// 对任何快捷键都需要做的处理
|
||||
if (asterisk) {
|
||||
for (let i = 0; i < asterisk.length; i++) {
|
||||
if (asterisk[i].scope === scope && (event.type === 'keydown' && asterisk[i].keydown || event.type === 'keyup' && asterisk[i].keyup)) {
|
||||
eventHandler(event, asterisk[i], scope, element);
|
||||
}
|
||||
}
|
||||
}
|
||||
// key 不在 _handlers 中返回
|
||||
if (!(key in _handlers)) return;
|
||||
const handlerKey = _handlers[key];
|
||||
const keyLen = handlerKey.length;
|
||||
for (let i = 0; i < keyLen; i++) {
|
||||
if (event.type === 'keydown' && handlerKey[i].keydown || event.type === 'keyup' && handlerKey[i].keyup) {
|
||||
if (handlerKey[i].key) {
|
||||
const record = handlerKey[i];
|
||||
const {
|
||||
splitKey
|
||||
} = record;
|
||||
const keyShortcut = record.key.split(splitKey);
|
||||
const _downKeysCurrent = []; // 记录当前按键键值
|
||||
for (let a = 0; a < keyShortcut.length; a++) {
|
||||
_downKeysCurrent.push(code(keyShortcut[a]));
|
||||
}
|
||||
if (_downKeysCurrent.sort().join('') === _downKeys.sort().join('')) {
|
||||
// 找到处理内容
|
||||
eventHandler(event, record, scope, element);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function hotkeys(key, option, method) {
|
||||
_downKeys = [];
|
||||
const keys = getKeys(key); // 需要处理的快捷键列表
|
||||
let mods = [];
|
||||
let scope = 'all'; // scope默认为all,所有范围都有效
|
||||
let element = document; // 快捷键事件绑定节点
|
||||
let i = 0;
|
||||
let keyup = false;
|
||||
let keydown = true;
|
||||
let splitKey = '+';
|
||||
let capture = false;
|
||||
let single = false; // 单个callback
|
||||
|
||||
// 对为设定范围的判断
|
||||
if (method === undefined && typeof option === 'function') {
|
||||
method = option;
|
||||
}
|
||||
if (Object.prototype.toString.call(option) === '[object Object]') {
|
||||
if (option.scope) scope = option.scope; // eslint-disable-line
|
||||
if (option.element) element = option.element; // eslint-disable-line
|
||||
if (option.keyup) keyup = option.keyup; // eslint-disable-line
|
||||
if (option.keydown !== undefined) keydown = option.keydown; // eslint-disable-line
|
||||
if (option.capture !== undefined) capture = option.capture; // eslint-disable-line
|
||||
if (typeof option.splitKey === 'string') splitKey = option.splitKey; // eslint-disable-line
|
||||
if (option.single === true) single = true; // eslint-disable-line
|
||||
}
|
||||
if (typeof option === 'string') scope = option;
|
||||
|
||||
// 如果只允许单个callback,先unbind
|
||||
if (single) unbind(key, scope);
|
||||
|
||||
// 对于每个快捷键进行处理
|
||||
for (; i < keys.length; i++) {
|
||||
key = keys[i].split(splitKey); // 按键列表
|
||||
mods = [];
|
||||
|
||||
// 如果是组合快捷键取得组合快捷键
|
||||
if (key.length > 1) mods = getMods(_modifier, key);
|
||||
|
||||
// 将非修饰键转化为键码
|
||||
key = key[key.length - 1];
|
||||
key = key === '*' ? '*' : code(key); // *表示匹配所有快捷键
|
||||
|
||||
// 判断key是否在_handlers中,不在就赋一个空数组
|
||||
if (!(key in _handlers)) _handlers[key] = [];
|
||||
_handlers[key].push({
|
||||
keyup,
|
||||
keydown,
|
||||
scope,
|
||||
mods,
|
||||
shortcut: keys[i],
|
||||
method,
|
||||
key: keys[i],
|
||||
splitKey,
|
||||
element
|
||||
});
|
||||
}
|
||||
// 在全局document上设置快捷键
|
||||
if (typeof element !== 'undefined' && window) {
|
||||
if (!elementEventMap.has(element)) {
|
||||
const keydownListener = function () {
|
||||
let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event;
|
||||
return dispatch(event, element);
|
||||
};
|
||||
const keyupListenr = function () {
|
||||
let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event;
|
||||
dispatch(event, element);
|
||||
clearModifier(event);
|
||||
};
|
||||
elementEventMap.set(element, {
|
||||
keydownListener,
|
||||
keyupListenr,
|
||||
capture
|
||||
});
|
||||
addEvent(element, 'keydown', keydownListener, capture);
|
||||
addEvent(element, 'keyup', keyupListenr, capture);
|
||||
}
|
||||
if (!winListendFocus) {
|
||||
const listener = () => {
|
||||
_downKeys = [];
|
||||
};
|
||||
winListendFocus = {
|
||||
listener,
|
||||
capture
|
||||
};
|
||||
addEvent(window, 'focus', listener, capture);
|
||||
}
|
||||
}
|
||||
}
|
||||
function trigger(shortcut) {
|
||||
let scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'all';
|
||||
Object.keys(_handlers).forEach(key => {
|
||||
const dataList = _handlers[key].filter(item => item.scope === scope && item.shortcut === shortcut);
|
||||
dataList.forEach(data => {
|
||||
if (data && data.method) {
|
||||
data.method();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 销毁事件,unbind之后判断element上是否还有键盘快捷键,如果没有移除监听
|
||||
function removeKeyEvent(element) {
|
||||
const values = Object.values(_handlers).flat();
|
||||
const findindex = values.findIndex(_ref4 => {
|
||||
let {
|
||||
element: el
|
||||
} = _ref4;
|
||||
return el === element;
|
||||
});
|
||||
if (findindex < 0) {
|
||||
const {
|
||||
keydownListener,
|
||||
keyupListenr,
|
||||
capture
|
||||
} = elementEventMap.get(element) || {};
|
||||
if (keydownListener && keyupListenr) {
|
||||
removeEvent(element, 'keyup', keyupListenr, capture);
|
||||
removeEvent(element, 'keydown', keydownListener, capture);
|
||||
elementEventMap.delete(element);
|
||||
}
|
||||
}
|
||||
if (values.length <= 0 || elementEventMap.size <= 0) {
|
||||
// 移除所有的元素上的监听
|
||||
const eventKeys = Object.keys(elementEventMap);
|
||||
eventKeys.forEach(el => {
|
||||
const {
|
||||
keydownListener,
|
||||
keyupListenr,
|
||||
capture
|
||||
} = elementEventMap.get(el) || {};
|
||||
if (keydownListener && keyupListenr) {
|
||||
removeEvent(el, 'keyup', keyupListenr, capture);
|
||||
removeEvent(el, 'keydown', keydownListener, capture);
|
||||
elementEventMap.delete(el);
|
||||
}
|
||||
});
|
||||
// 清空 elementEventMap
|
||||
elementEventMap.clear();
|
||||
// 清空 _handlers
|
||||
Object.keys(_handlers).forEach(key => delete _handlers[key]);
|
||||
// 移除window上的focus监听
|
||||
if (winListendFocus) {
|
||||
const {
|
||||
listener,
|
||||
capture
|
||||
} = winListendFocus;
|
||||
removeEvent(window, 'focus', listener, capture);
|
||||
winListendFocus = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
const _api = {
|
||||
getPressedKeyString,
|
||||
setScope,
|
||||
getScope,
|
||||
deleteScope,
|
||||
getPressedKeyCodes,
|
||||
getAllKeyCodes,
|
||||
isPressed,
|
||||
filter,
|
||||
trigger,
|
||||
unbind,
|
||||
keyMap: _keyMap,
|
||||
modifier: _modifier,
|
||||
modifierMap
|
||||
};
|
||||
for (const a in _api) {
|
||||
if (Object.prototype.hasOwnProperty.call(_api, a)) {
|
||||
hotkeys[a] = _api[a];
|
||||
}
|
||||
}
|
||||
if (typeof window !== 'undefined') {
|
||||
const _hotkeys = window.hotkeys;
|
||||
hotkeys.noConflict = deep => {
|
||||
if (deep && window.hotkeys === hotkeys) {
|
||||
window.hotkeys = _hotkeys;
|
||||
}
|
||||
return hotkeys;
|
||||
};
|
||||
window.hotkeys = hotkeys;
|
||||
}
|
||||
|
||||
return hotkeys;
|
||||
|
||||
}));
|
2
term/pkg/hotkeys-js/dist/hotkeys.min.js
vendored
Normal file
18
term/pkg/hotkeys-js/dist/terminal.js
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
hotkeys('ctrl+enter', function() {
|
||||
let e = document.querySelector('home-layout');
|
||||
e.style.display = "block";
|
||||
var ele = document.getElementById('aiterm');
|
||||
var win = document.getElementById('window');
|
||||
var svg = document.getElementById('aisvg');
|
||||
var term = document.getElementById('terminal');
|
||||
term.click();
|
||||
//var par = document.getElementById('particles-js');
|
||||
//par.style.display = 'block';
|
||||
if (ele.style.display == 'none') {
|
||||
ele.style.display = 'block';
|
||||
svg.style.display = 'none';
|
||||
} else {
|
||||
ele.style.display = 'none';
|
||||
svg.style.display = 'block';
|
||||
}
|
||||
});
|
181
term/pkg/hotkeys-js/index.d.ts
vendored
Normal file
@ -0,0 +1,181 @@
|
||||
export interface HotkeysEvent {
|
||||
key: string;
|
||||
keys: number[];
|
||||
method: KeyHandler;
|
||||
mods: number[];
|
||||
scope: string;
|
||||
shortcut: string;
|
||||
}
|
||||
|
||||
export interface KeyHandler {
|
||||
(keyboardEvent: KeyboardEvent, hotkeysEvent: HotkeysEvent): void | boolean;
|
||||
}
|
||||
|
||||
type Options = {
|
||||
scope?: string;
|
||||
element?: HTMLElement | null;
|
||||
keyup?: boolean | null;
|
||||
keydown?: boolean | null;
|
||||
capture?: boolean
|
||||
splitKey?: string;
|
||||
single?: boolean;
|
||||
}
|
||||
|
||||
export interface Hotkeys {
|
||||
(key: string, method: KeyHandler): void;
|
||||
(key: string, scope: string, method: KeyHandler): void;
|
||||
(key: string, options: Options, method: KeyHandler): void;
|
||||
|
||||
shift: boolean;
|
||||
ctrl: boolean;
|
||||
alt: boolean;
|
||||
option: boolean;
|
||||
control: boolean;
|
||||
cmd: boolean;
|
||||
command: boolean;
|
||||
|
||||
keyMap: Record<string, number>;
|
||||
modifier: Record<string, number>;
|
||||
modifierMap: Record<string, number | string>;
|
||||
|
||||
/**
|
||||
* Use the `hotkeys.setScope` method to set scope. There can only be one active scope besides 'all'. By default 'all' is always active.
|
||||
*
|
||||
* ```js
|
||||
* // Define shortcuts with a scope
|
||||
* hotkeys('ctrl+o, ctrl+alt+enter', 'issues', function() {
|
||||
* console.log('do something');
|
||||
* });
|
||||
* hotkeys('o, enter', 'files', function() {
|
||||
* console.log('do something else');
|
||||
* });
|
||||
*
|
||||
* // Set the scope (only 'all' and 'issues' shortcuts will be honored)
|
||||
* hotkeys.setScope('issues'); // default scope is 'all'
|
||||
* ```
|
||||
*/
|
||||
setScope(scopeName: string): void;
|
||||
/**
|
||||
* Use the `hotkeys.getScope` method to get scope.
|
||||
*
|
||||
* ```js
|
||||
* hotkeys.getScope();
|
||||
* ```
|
||||
*/
|
||||
getScope(): string;
|
||||
/**
|
||||
* Use the `hotkeys.deleteScope` method to delete a scope. This will also remove all associated hotkeys with it.
|
||||
*
|
||||
* ```js
|
||||
* hotkeys.deleteScope('issues');
|
||||
* ```
|
||||
* You can use second argument, if need set new scope after deleting.
|
||||
*
|
||||
* ```js
|
||||
* hotkeys.deleteScope('issues', 'newScopeName');
|
||||
* ```
|
||||
*/
|
||||
deleteScope(scopeName: string, newScopeName?: string): void;
|
||||
|
||||
/**
|
||||
* Relinquish HotKeys’s control of the `hotkeys` variable.
|
||||
*
|
||||
* ```js
|
||||
* var k = hotkeys.noConflict();
|
||||
* k('a', function() {
|
||||
* console.log("do something")
|
||||
* });
|
||||
*
|
||||
* hotkeys()
|
||||
* // -->Uncaught TypeError: hotkeys is not a function(anonymous function)
|
||||
* // @ VM2170:2InjectedScript._evaluateOn
|
||||
* // @ VM2165:883InjectedScript._evaluateAndWrap
|
||||
* // @ VM2165:816InjectedScript.evaluate @ VM2165:682
|
||||
* ```
|
||||
*/
|
||||
noConflict(): Hotkeys;
|
||||
|
||||
/**
|
||||
* trigger shortcut key event
|
||||
*
|
||||
* ```js
|
||||
* hotkeys.trigger('ctrl+o');
|
||||
* hotkeys.trigger('ctrl+o', 'scope2');
|
||||
* ```
|
||||
*/
|
||||
trigger(shortcut: string, scope?: string): void;
|
||||
|
||||
unbind(key?: string): void;
|
||||
unbind(key: string, scopeName: string): void;
|
||||
unbind(key: string, scopeName: string, method: KeyHandler): void;
|
||||
unbind(key: string, method: KeyHandler): void;
|
||||
|
||||
/** For example, `hotkeys.isPressed(77)` is true if the `M` key is currently pressed. */
|
||||
isPressed(keyCode: number): boolean;
|
||||
/** For example, `hotkeys.isPressed('m')` is true if the `M` key is currently pressed. */
|
||||
isPressed(keyCode: string): boolean;
|
||||
/**
|
||||
* Returns an array of key codes currently pressed.
|
||||
*
|
||||
* ```js
|
||||
* hotkeys('command+ctrl+shift+a,f', function() {
|
||||
* console.log(hotkeys.getPressedKeyCodes()); //=> [17, 65] or [70]
|
||||
* })
|
||||
* ```
|
||||
*/
|
||||
getPressedKeyCodes(): number[];
|
||||
/**
|
||||
* Returns an array of key codes currently pressed.
|
||||
*
|
||||
* ```js
|
||||
* hotkeys('command+ctrl+shift+a,f', function() {
|
||||
* console.log(hotkeys.getPressedKeyString()); //=> ['⌘', '⌃', '⇧', 'A', 'F']
|
||||
* })
|
||||
* ```
|
||||
*/
|
||||
getPressedKeyString(): string[];
|
||||
/**
|
||||
* Get a list of all registration codes.
|
||||
*
|
||||
* ```js
|
||||
* hotkeys('command+ctrl+shift+a,f', function() {
|
||||
* console.log(hotkeys.getAllKeyCodes());
|
||||
* // [
|
||||
* // { scope: 'all', shortcut: 'command+ctrl+shift+a', mods: [91, 17, 16], keys: [91, 17, 16, 65] },
|
||||
* // { scope: 'all', shortcut: 'f', mods: [], keys: [42] }
|
||||
* // ]
|
||||
* })
|
||||
* ```
|
||||
*
|
||||
*/
|
||||
getAllKeyCodes(): Omit<HotkeysEvent, 'method' | 'key'>[];
|
||||
|
||||
/**
|
||||
* By default hotkeys are not enabled for `INPUT` `SELECT` `TEXTAREA` elements.
|
||||
* `Hotkeys.filter` to return to the `true` shortcut keys set to play a role,
|
||||
* `false` shortcut keys set up failure.
|
||||
*
|
||||
* ```js
|
||||
* hotkeys.filter = function(event){
|
||||
* return true;
|
||||
* }
|
||||
* //How to add the filter to edit labels. <div contentEditable="true"></div>
|
||||
* //"contentEditable" Older browsers that do not support drops
|
||||
* hotkeys.filter = function(event) {
|
||||
* var target = event.target || event.srcElement;
|
||||
* var tagName = target.tagName;
|
||||
* return !(target.isContentEditable || tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA');
|
||||
* }
|
||||
*
|
||||
* hotkeys.filter = function(event){
|
||||
* var tagName = (event.target || event.srcElement).tagName;
|
||||
* hotkeys.setScope(/^(INPUT|TEXTAREA|SELECT)$/.test(tagName) ? 'input' : 'other');
|
||||
* return true;
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
filter(event: KeyboardEvent): boolean;
|
||||
}
|
||||
// https://github.com/eiriklv/react-masonry-component/issues/57
|
||||
declare var hotkeys: Hotkeys;
|
||||
export default hotkeys;
|
7
term/pkg/hotkeys-js/index.js
Normal file
@ -0,0 +1,7 @@
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
// eslint-disable-next-line global-require
|
||||
module.exports = require('./dist/hotkeys.common.min.js');
|
||||
} else {
|
||||
// eslint-disable-next-line global-require
|
||||
module.exports = require('./dist/hotkeys.common.js');
|
||||
}
|
32
term/pkg/hotkeys-js/package.json
Normal file
@ -0,0 +1,32 @@
|
||||
{
|
||||
"name": "hotkeys-js",
|
||||
"description": "A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies.",
|
||||
"version": "3.13.7",
|
||||
"main": "index.js",
|
||||
"types": "index.d.ts",
|
||||
"module": "dist/hotkeys.esm.js",
|
||||
"files": [
|
||||
"index.d.ts",
|
||||
"dist",
|
||||
"doc"
|
||||
],
|
||||
"keywords": [
|
||||
"hotkey",
|
||||
"hotkeys",
|
||||
"hotkeys-js",
|
||||
"hotkeysjs",
|
||||
"key",
|
||||
"keys",
|
||||
"keyboard",
|
||||
"shortcuts",
|
||||
"keypress"
|
||||
],
|
||||
"author": "kenny wong <wowohoo@qq.com>",
|
||||
"license": "MIT",
|
||||
"homepage": "https://jaywcjlove.github.io/hotkeys-js",
|
||||
"funding": "https://jaywcjlove.github.io/#/sponsor",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/jaywcjlove/hotkeys-js.git"
|
||||
}
|
||||
}
|
1
term/pkg/particles/config.js
Normal file
@ -0,0 +1 @@
|
||||
particlesJS("particles-js", {"particles":{"number":{"value":160,"density":{"enable":false,"value_area":800}},"color":{"value":"#fff700"},"shape":{"type":"circle","stroke":{"width":0,"color":"#000000"},"polygon":{"nb_sides":5},"image":{"src":"","width":120,"height":80}},"opacity":{"value":1,"random":true,"anim":{"enable":true,"speed":0.16240621041348632,"opacity_min":0,"sync":true}},"size":{"value":3,"random":true,"anim":{"enable":true,"speed":0,"size_min":0,"sync":false}},"line_linked":{"enable":true,"distance":128.27296486924183,"color":"#fff700","opacity":0.01,"width":0},"move":{"enable":true,"speed":1,"direction":"none","random":true,"straight":false,"out_mode":"out","bounce":false,"attract":{"enable":false,"rotateX":600,"rotateY":600}}},"interactivity":{"detect_on":"canvas","events":{"onhover":{"enable":true,"mode":"repulse"},"onclick":{"enable":true,"mode":"push"},"resize":true},"modes":{"grab":{"distance":400,"line_linked":{"opacity":1}},"bubble":{"distance":250,"size":0,"duration":2,"opacity":0,"speed":3},"repulse":{"distance":400,"duration":0.4},"push":{"particles_nb":4},"remove":{"particles_nb":2}}},"retina_detect":false});var count_particles, stats, update; stats = new Stats; stats.setMode(0); stats.domElement.style.position = 'absolute'; stats.domElement.style.left = '0px'; stats.domElement.style.top = '0px'; document.body.appendChild(stats.domElement); count_particles = document.querySelector('.js-count-particles'); update = function() { stats.begin(); stats.end(); if (window.pJSDom[0].pJS.particles && window.pJSDom[0].pJS.particles.array) { count_particles.innerText = window.pJSDom[0].pJS.particles.array.length; } requestAnimationFrame(update); }; requestAnimationFrame(update);;
|
34
term/pkg/particles/particles.css
Normal file
@ -0,0 +1,34 @@
|
||||
canvas{
|
||||
display: block;
|
||||
}
|
||||
|
||||
#particles-js{
|
||||
display: none;
|
||||
width:100%;
|
||||
position:absolute;
|
||||
background-color: #313131;
|
||||
}
|
||||
.count-particles{
|
||||
background: #000022;
|
||||
position: absolute;
|
||||
color: #13E8E9;
|
||||
font-size: .8em;
|
||||
text-align: left;
|
||||
text-indent: 4px;
|
||||
line-height: 14px;
|
||||
padding-bottom: 2px;
|
||||
font-family: Helvetica, Arial, sans-serif;
|
||||
font-weight: bold;
|
||||
}
|
||||
.js-count-particles{
|
||||
font-size: 1.1em;
|
||||
}
|
||||
#stats, .count-particles{
|
||||
-webkit-user-select: none;
|
||||
}
|
||||
#stats{
|
||||
overflow: hidden;
|
||||
}
|
||||
.count-particles{
|
||||
border-radius: 0 0 3px 3px;
|
||||
}
|
9
term/pkg/particles/particles.min.js
vendored
Normal file
89
term/pkg/particles/stats.min.js
vendored
Normal file
@ -0,0 +1,89 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; img-src data:; connect-src 'self'">
|
||||
<title>Page not found · GitHub Pages</title>
|
||||
<style type="text/css" media="screen">
|
||||
body {
|
||||
background-color: #f1f1f1;
|
||||
margin: 0;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
.container { margin: 50px auto 40px auto; width: 600px; text-align: center; }
|
||||
|
||||
a { color: #4183c4; text-decoration: none; }
|
||||
a:hover { text-decoration: underline; }
|
||||
|
||||
h1 { width: 800px; position:relative; left: -100px; letter-spacing: -1px; line-height: 60px; font-size: 60px; font-weight: 100; margin: 0px 0 50px 0; text-shadow: 0 1px 0 #fff; }
|
||||
p { color: rgba(0, 0, 0, 0.5); margin: 20px 0; line-height: 1.6; }
|
||||
|
||||
ul { list-style: none; margin: 25px 0; padding: 0; }
|
||||
li { display: table-cell; font-weight: bold; width: 1%; }
|
||||
|
||||
.logo { display: inline-block; margin-top: 35px; }
|
||||
.logo-img-2x { display: none; }
|
||||
@media
|
||||
only screen and (-webkit-min-device-pixel-ratio: 2),
|
||||
only screen and ( min--moz-device-pixel-ratio: 2),
|
||||
only screen and ( -o-min-device-pixel-ratio: 2/1),
|
||||
only screen and ( min-device-pixel-ratio: 2),
|
||||
only screen and ( min-resolution: 192dpi),
|
||||
only screen and ( min-resolution: 2dppx) {
|
||||
.logo-img-1x { display: none; }
|
||||
.logo-img-2x { display: inline-block; }
|
||||
}
|
||||
|
||||
#suggestions {
|
||||
margin-top: 35px;
|
||||
color: #ccc;
|
||||
}
|
||||
#suggestions a {
|
||||
color: #666666;
|
||||
font-weight: 200;
|
||||
font-size: 14px;
|
||||
margin: 0 10px;
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>404</h1>
|
||||
<p><strong>File not found</strong></p>
|
||||
|
||||
<p>
|
||||
The site configured at this address does not
|
||||
contain the requested file.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
If this is your site, make sure that the filename case matches the URL
|
||||
as well as any file permissions.<br>
|
||||
For root URLs (like <code>http://example.com/</code>) you must provide an
|
||||
<code>index.html</code> file.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="https://help.github.com/pages/">Read the full documentation</a>
|
||||
for more information about using <strong>GitHub Pages</strong>.
|
||||
</p>
|
||||
|
||||
<div id="suggestions">
|
||||
<a href="https://githubstatus.com">GitHub Status</a> —
|
||||
<a href="https://twitter.com/githubstatus">@githubstatus</a>
|
||||
</div>
|
||||
|
||||
<a href="/" class="logo logo-img-1x">
|
||||
<img width="32" height="32" title="" alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFMTZCRDY3REIzRjAxMUUyQUQzREIxQzRENUFFNUM5NiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFMTZCRDY3RUIzRjAxMUUyQUQzREIxQzRENUFFNUM5NiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkUxNkJENjdCQjNGMDExRTJBRDNEQjFDNEQ1QUU1Qzk2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkUxNkJENjdDQjNGMDExRTJBRDNEQjFDNEQ1QUU1Qzk2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SM9MCAAAA+5JREFUeNrEV11Ik1EY3s4+ddOp29Q5b0opCgKFsoKoi5Kg6CIhuwi6zLJLoYLopq4qsKKgi4i6CYIoU/q5iDAKs6syoS76IRWtyJ+p7cdt7sf1PGOD+e0c3dygAx/67ZzzPM95/877GYdHRg3ZjMXFxepQKNS6sLCwJxqNNuFpiMfjVs4ZjUa/pmmjeD6VlJS8NpvNT4QQ7mxwjSsJiEQim/1+/9lgMHgIr5ohuxG1WCw9Vqv1clFR0dCqBODElV6v90ogEDjGdYbVjXhpaendioqK07CIR7ZAqE49PT09BPL2PMgTByQGsYiZlQD4uMXtdr+JxWINhgINYhGT2MsKgMrm2dnZXgRXhaHAg5jEJodUAHxux4LudHJE9RdEdA+i3Juz7bGHe4mhE9FNrgwBCLirMFV9Okh5eflFh8PR5nK5nDabrR2BNJlKO0T35+Li4n4+/J+/JQCxhmu5h3uJoXNHPbmWZAHMshWB8l5/ipqammaAf0zPDDx1ONV3vurdidqwAQL+pEc8sLcAe1CCvQ3YHxIW8Pl85xSWNC1hADDIv0rIE/o4J0k3kww4xSlwIhcq3EFFOm7KN/hUGOQkt0CFa5WpNJlMvxBEz/IVQAxg/ZRZl9wiHA63yDYieM7DnLP5CiAGsC7I5sgtYKJGWe2A8seFqgFJrJjEPY1Cn3pJ8/9W1e5VWsFDTEmFrBcoDhZJEQkXuhICMyKpjhahqN21hRYATKfUOlDmkygrR4o4C0VOLGJKrOITKB4jijzdXygBKixyC5TDQdnk/Pz8qRw6oOWGlsTKGOQW6OH6FBWsyePxdOXLTgxiyebILZCjz+GLgMIKnXNzc49YMlcRdHXcSwxFVgTInQhC9G33UhNoJLuqq6t345p9y3eUy8OTk5PjAHuI9uo4b07FBaOhsu0A4Unc+T1TU1Nj3KsSSE5yJ65jqF2DDd8QqWYmAZrIM2VlZTdnZmb6AbpdV9V6ec9znf5Q7HjYumdRE0JOp3MjitO4SFa+cZz8Umqe3TCbSLvdfkR/kWDdNQl5InuTcysOcpFT35ZrbBxx4p3JAHlZVVW1D/634VRt+FvLBgK/v5LV9WS+10xMTEwtRw7XvqOL+e2Q8V3AYIOIAXQ26/heWVnZCVfcyKHg2CBgTpmPmjYM8l24GyaUHyaIh7XwfR9ErE8qHoDfn2LTNAVC0HX6MFcBIP8Bi+6F6cdW/DICkANRfx99fEYFQ7Nph5i/uQiA214gno7K+guhaiKg9gC62+M8eR7XsBsYJ4ilam60Fb7r7uAj8wFyuwM1oIOWgfmDy6RXEEQzJMPe23DXrVS7rtyD3Df8z/FPgAEAzWU5Ku59ZAUAAAAASUVORK5CYII=">
|
||||
</a>
|
||||
|
||||
<a href="/" class="logo logo-img-2x">
|
||||
<img width="32" height="32" title="" alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEQUM1QkUxRUI0MUMxMUUyQUQzREIxQzRENUFFNUM5NiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEQUM1QkUxRkI0MUMxMUUyQUQzREIxQzRENUFFNUM5NiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkUxNkJENjdGQjNGMDExRTJBRDNEQjFDNEQ1QUU1Qzk2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkUxNkJENjgwQjNGMDExRTJBRDNEQjFDNEQ1QUU1Qzk2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+hfPRaQAAB6lJREFUeNrsW2mME2UYbodtt+2222u35QheoCCYGBQligIJgkZJNPzgigoaTEj8AdFEMfADfyABkgWiiWcieK4S+QOiHAYUj2hMNKgYlEujpNttu9vttbvdw+chU1K6M535pt3ubHCSyezR+b73eb73+t7vrfXsufOW4bz6+vom9/b23ovnNNw34b5xYGAgODg46Mbt4mesVmsWd1qSpHhdXd2fuP/Afcput5/A88xwymcdBgLqenp6FuRyuWV4zu/v759QyWBjxoz5t76+/gun09mK5xFyakoCAPSaTCazNpvNPoYVbh6O1YKGRF0u13sNDQ27QMzfpiAAKj0lnU6/gBVfAZW2WWpwwVzy0IgP3G73FpjI6REhAGA9qVRqA1b9mVoBVyIC2tDi8Xg24+dUzQiAbS/s7Ox8G2o/3mKCC+Zw0efzPQEfcVjYrARX3dbV1bUtHo8fMgt42f+Mp0yUTVQbdWsAHVsikdiHkHaPxcQXQufXgUBgMRxme9U0AAxfH4vFvjM7eF6UkbJS5qoQwEQGA57Ac5JllFyUVZZ5ckUEgMVxsK2jlSYzI+QXJsiyjzNEAJyJAzb/KQa41jJKL8pODMQiTEAymXw5n8/P0IjD3bh7Rgog59aanxiIRTVvV/oj0tnHca/WMrVwODwB3raTGxzkBg/gnZVapFV62Wy2n5AO70HM/5wbJ0QnXyQSaVPDIuNZzY0V3ntHMwxiwHA0Gj2Np7ecIBDgaDAYXKCQJM1DhrgJ3nhulcPbl8j4NmHe46X/g60fwbz3aewjkqFQaAqebWU1AOqyQwt8Id6qEHMc97zu7u7FGGsn7HAiVuosVw7P35C1nccdgSCxop1dHeZswmfHMnxBo6ZTk+jN8dl/vF7vWofDsa+MLN9oEUBMxOb3+1eoEsBVw6Zmua49r8YmhAKDiEPcMwBsxMiqQ+ixzPFxZyqRpXARG/YOr1ObFJ0gUskXBbamcR1OKmMUvDxHRAu8/LmY3jFLMUpFqz9HxG65smYJdyKyECOxDiEAe/p1gjF2oonivZAsxVgl2daa4EQWCW6J55qFAFFZiJWYLxNQy2qOSUzGRsyXCUDIeliwAHEO4WSlWQBRFoZakXcKmCXmyXAKs0Ve9vl8q42WoIYpJU4hV3hKcNs8m9gl7p/xQ73eF5kB4j5mNrWmTJRNwAzqiV1CxjVTZCIkEq+Z1bZFZSN2CenmVAFVy4Plz8xKAGWjjAKFk6lCBMDR/MJjLLMSQNm43xAiQKTaA+9/wewhDjL+JVI1kkTSSOTcKbMTwPqESAot6dn6Fr1gHwVJju6IRuyiByPuUUBAg5DGkAgBmxlvdgIEK9gDkohdY/BJo4CAG0R8miRSsGABkgVQs4KXu098IgUXSSRsFAoKZiVAVDY2WUiiPTjYRi41KwGisrGsLtlsth8Fiwnz2fBkQvWfRtlE3iF2yW63/yCacXZ1dW02GwGyTFaRd4idJnCKHRaCxYRHoG5LTKT6SyiToP1fJHbmAYPYRR0UnZQtMnA6s0zg+GZBlt0Gdo7EPHgpE3Q6nZ8YyLhc8Xj8MJh/aKTAY+5FPAKHLE7RdwuYJZmNwzyCMkBCYyKROJBMJl9B/PXXCjjmCmDOVzH3fiPpObEWGqoKe4EBl8v1hlqsdLvd23mkxHM9pc9kMpmno9HoeTii7ewbHEZPPx1ztLS1tV3AnGuMjiNjvbQFuHw6zDo5By7dTPAQNBgMLrRarTkSls1mnwT7uwp9virx9QzbW/HuV/j5d/b+6jniKlllP8lkeONJDk+dq9GsQTnC4fB1heO0K47Hwe7WdDr9nAKgXwOBwHI+C45Htj1d6sd429TUNEcmUdc+PRaLHcvn87dXW4ugzdsaGxufL94NFv9zi1J7GVbhlvb2dnaJ3SVrxfc+n2+NTsZ7/H7/Mr3g5XdSIHyJSH1PZ+7fToyl2+ErqilgZ4NaLYB9goVGaHjR93Hv1ZrU4XDsFT20kH3PObzbWk0CgG1jacVIUnAQb9F+VexyLMzkpcLv0IJV7AHQIOCAUYHx7v5qgScmYHtTqSAyZLEJTK22Bie4iq3xsqpm4SAf9Hq9a2DnJ4uLK3SEULcdRvp3i3zHySqpficxEdsQc1NrlYXXvR+O7qASSezXB+h1SuUomgg9LL8BUoV4749EIolKh+EiqWmqVEZlDgHks2pxHw7xTqUQw9J5NcAXOK10AGIoZ6Zli6JY6Z1Q461KoZ4NiKLHarW+KDsxlDUPHZ5zPQZqUVDPJsTqb5n9malbpAh8C2XXDLl62+WZIDFRUlNVOiwencnNU3aQEkL+cDMSoLvZo2fQB7AJssNAuFuvorlDVVkkg2I87+jo2K2QAVphDrfyViK5VqtO34OkaxXCp+7drdDBCAdubm6eidX+2WwqT5komwh4YQLk+H4aE93h8Xg2gvHekQZOGSgLZTLyDTLJ4Lx9/KZWKBSainT4Iy3FqQBfnUZR42PKQFksBr9QKVXCPusD3OiA/RkQ5kP8qV/Jl1WywAp/6+dcmPM2zL1UrUahe4JqfnWWKXIul3uUbfP8njAFLW1OFr3gdFtZ72cNH+PtQT7/brW+NXqJAHh0y9V8/U/A1U7AfwIMAD7mS3pCbuWJAAAAAElFTkSuQmCC">
|
||||
</a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|