From 3a04e1c0deed22d158adfb446c759b3f6a7b8738 Mon Sep 17 00:00:00 2001 From: zhangmeng <1334717033@qq.com> Date: Tue, 14 Mar 2023 11:25:33 +0800 Subject: [PATCH] =?UTF-8?q?ssh=20=E5=B7=A5=E5=85=B7=20web=20=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=202023=E5=B9=B43=E6=9C=8814=E6=97=A511:25:04?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 + pom.xml | 5 + .../controller/SSHConnectionController.java | 236 +- .../controller/ServerToolsController.java | 7 + src/main/resources/application.yml | 135 - src/main/resources/fxml/ssh-connection.fxml | 11 +- src/main/resources/static/css/xterm.css | 2261 ++++++++ .../resources/static/js/jquery-3.4.1.min.js | 2 + src/main/resources/static/js/webssh.js | 56 + src/main/resources/static/js/xterm.js | 5132 +++++++++++++++++ src/main/resources/static/redame/img_32.png | Bin 0 -> 100202 bytes src/main/resources/templates/index.ftl | 68 + src/main/resources/templates/ssh.html | 0 13 files changed, 7707 insertions(+), 220 deletions(-) delete mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/static/css/xterm.css create mode 100644 src/main/resources/static/js/jquery-3.4.1.min.js create mode 100644 src/main/resources/static/js/webssh.js create mode 100644 src/main/resources/static/js/xterm.js create mode 100644 src/main/resources/static/redame/img_32.png create mode 100644 src/main/resources/templates/index.ftl create mode 100644 src/main/resources/templates/ssh.html diff --git a/README.md b/README.md index 4bdf3f8..29be5e0 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,19 @@ ![](./src/main/resources/static/redame/img_31.png) +#### 8.3 ssh 服务工具 + +###### 8.3.1 javafx 实现 + + + +###### 8.3.2 html 实现 + +> 项目借鉴开源项目 springboot + websocket 实现, [博客地址](https://blog.objectspace.cn/2020/03/10/%E4%BD%BF%E7%94%A8%E7%BA%AFJava%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAWebSSH%E9%A1%B9%E7%9B%AE/) +> [github地址:](https://github.com/NoCortY/WebSSH) + +![](./src/main/resources/static/redame/img_32.png) + ## 2. 开源项目总览 | 项目名称 |地址| @@ -152,6 +165,7 @@ | rxcontrols |https://gitee.com/leewyatt/rxcontrols| | boot-security |https://gitee.com/zhang.w/boot-security| | 阿里图标库 |https://www.iconfont.cn/home/index?spm=a313x.7781069.1998910419.3| +| ssh工具 |https://www.iconfont.cn/home/index?spm=a313x.7781069.1998910419.3| ## 3. 添加系统托盘 diff --git a/pom.xml b/pom.xml index de1e5e2..d49bb9b 100644 --- a/pom.xml +++ b/pom.xml @@ -295,6 +295,11 @@ 0.1.54 + + org.freemarker + freemarker + 2.3.31 + diff --git a/src/main/java/com/zhangmeng/tools/controller/SSHConnectionController.java b/src/main/java/com/zhangmeng/tools/controller/SSHConnectionController.java index 42fb0b1..9e6facf 100644 --- a/src/main/java/com/zhangmeng/tools/controller/SSHConnectionController.java +++ b/src/main/java/com/zhangmeng/tools/controller/SSHConnectionController.java @@ -4,11 +4,16 @@ import cn.hutool.core.io.BufferUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.Dict; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.ssh.ChannelType; import cn.hutool.extra.ssh.JschRuntimeException; import cn.hutool.extra.ssh.JschUtil; +import cn.hutool.extra.template.Template; +import cn.hutool.extra.template.TemplateConfig; +import cn.hutool.extra.template.TemplateEngine; +import cn.hutool.extra.template.TemplateUtil; import cn.hutool.socket.aio.AioSession; import cn.hutool.socket.aio.SimpleIoAction; import com.alibaba.fastjson.JSON; @@ -23,6 +28,7 @@ import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; +import javafx.concurrent.Worker; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.scene.control.Button; @@ -30,7 +36,11 @@ import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; +import javafx.scene.web.WebEngine; +import javafx.scene.web.WebView; import lombok.extern.slf4j.Slf4j; +import netscape.javascript.JSObject; +import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.java_websocket.WebSocket; import org.java_websocket.client.WebSocketClient; @@ -39,11 +49,11 @@ import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.handshake.ServerHandshake; import org.java_websocket.server.WebSocketServer; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.net.InetSocketAddress; import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -63,11 +73,14 @@ public class SSHConnectionController { @FXML public Button connection; - @FXML - public TextArea show_result; +// @FXML +// public TextArea show_result; +// +// @FXML +// public TextField command; @FXML - public TextField command; + public WebView webView; @FXML private TextField username; @@ -93,13 +106,24 @@ public class SSHConnectionController { private boolean isConnection = false; + /** + * 用于与Javascript引擎通信。 + */ + private JSObject javascriptConnector; + + /** + * 用于从Javascript引擎进行通信。 + */ + private JavaConnector javaConnector = new JavaConnector(); + ; + @FXML public void initialize() { - username.setText("root"); - password.setText("root"); - host.setText("192.168.52.165"); - port.setText("22"); +// username.setText("root"); +// password.setText("root"); +// host.setText("192.168.52.165"); +// port.setText("22"); message_list.addListener((ListChangeListener) c -> { while (c.next()) { @@ -113,38 +137,8 @@ public class SSHConnectionController { } }); sshService = new SSHServiceImpl(); - //启动socket server - webSocketServer = new WebSocketServer(new InetSocketAddress(8888)) { - - @Override - public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) { - add_msg("WebSocketServer:onOpen--------------------------------------------"); - sshService.initConnection(webSocket,uuid.getValue()); - } - - @Override - public void onClose(WebSocket webSocket, int i, String s, boolean b) { - add_msg("WebSocketServer:onClose--------------------------------------------"); - sshService.close(webSocket,uuid.getValue()); - } - - @Override - public void onMessage(WebSocket webSocket, String s) { - add_msg("WebSocketServer:onMessage---" + s); - sshService.recvHandle(s,webSocket,uuid.getValue()); - } - - @Override - public void onError(WebSocket webSocket, Exception e) { - add_msg("WebSocketServer:onError--------------------------------------------"); - } - - @Override - public void onStart() { - add_msg("WebSocketServer:onStart--------------------------------------------"); - } - }; - + //初始化 + sshServer_init(); connection.setOnAction(event -> { if (username.getText().length() == 0) { AlertUtils.alert_warning("用户名不能为空!"); @@ -165,45 +159,124 @@ public class SSHConnectionController { AlertUtils.alert_warning("服务端口不能为空!"); return; } - webSocketServer.start(); - getConnection(); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); + + if (isConnection) { + try { + webSocketServer.stop(); + Thread.sleep(100); + isConnection = false; + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } } + sshServer_init(); + webSocketServer.start(); +// getConnection(); +// try { +// Thread.sleep(1000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } //发送连接信息 - SSHData ssh_data = create_ssh_data(command.getText(), SSHData.Type.connect); - webSocketClient.send(toString(ssh_data)); +// SSHData ssh_data = create_ssh_data(command.getText(), SSHData.Type.connect); +// webSocketClient.send(toString(ssh_data)); + isConnection = true; + //加载页面客户端 + load_page_client(); status.set(1); }); - command.textProperty().addListener((observable, oldValue, newValue) -> { - if (newValue != null){ - char[] chars = newValue.toCharArray(); - char num = 0; - for (int i = 0; i < chars.length; i++) { - if (i == chars.length -1 ){ - num = chars[i]; - } - } - SSHData ssh_data = create_ssh_data(String.valueOf(num), SSHData.Type.command); - webSocketClient.send(toString(ssh_data)); +// command.textProperty().addListener((observable, oldValue, newValue) -> { +// if (newValue != null){ +// char[] chars = newValue.toCharArray(); +// char num = 0; +// for (int i = 0; i < chars.length; i++) { +// if (i == chars.length -1 ){ +// num = chars[i]; +// } +// } +// SSHData ssh_data = create_ssh_data(String.valueOf(num), SSHData.Type.command); +// webSocketClient.send(toString(ssh_data)); +// } +// +// }); +// command.setOnAction(event -> { +// SSHData ssh_data = create_ssh_data("\r", SSHData.Type.command); +// webSocketClient.send(toString(ssh_data)); +// command.setText(null); +// }); + } + + public void sshServer_init(){ + //启动socket server + webSocketServer = new WebSocketServer(new InetSocketAddress(8888)) { + + @Override + public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) { + add_msg("WebSocketServer:onOpen--------------------------------------------"); + sshService.initConnection(webSocket, uuid.getValue()); } - }); - command.setOnAction(event -> { - SSHData ssh_data = create_ssh_data("\r", SSHData.Type.command); - webSocketClient.send(toString(ssh_data)); - command.setText(null); - }); + @Override + public void onClose(WebSocket webSocket, int i, String s, boolean b) { + add_msg("WebSocketServer:onClose--------------------------------------------"); + sshService.close(webSocket, uuid.getValue()); + } + + @Override + public void onMessage(WebSocket webSocket, String s) { + add_msg("WebSocketServer:onMessage---" + s); + sshService.recvHandle(s, webSocket, uuid.getValue()); + } + + @Override + public void onError(WebSocket webSocket, Exception e) { + add_msg("WebSocketServer:onError--------------------------------------------"); + } + + @Override + public void onStart() { + add_msg("WebSocketServer:onStart--------------------------------------------"); + } + }; } - private String toString(SSHData sshData){ - return JSON.toJSONString(sshData); + public class JavaConnector { + + public void ssh_info() { + SSHData ssh_data = create_ssh_data("", SSHData.Type.connect); + javascriptConnector.call(JSON.toJSONString(ssh_data)); + } } - public SSHData create_ssh_data(String command,SSHData.Type type ){ + public void load_page_client() { + WebEngine webEngine = webView.getEngine(); + TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("templates", TemplateConfig.ResourceMode.CLASSPATH)); + Template template = engine.getTemplate("index.ftl"); + + Dict dict = Dict.create(); + dict.set("username", username.getText()); + dict.set("password", password.getText()); + dict.set("host", host.getText()); + dict.set("port", port.getText()); + + String result = template.render(dict); + + URI url = null; + try { + url = this.getClass().getClassLoader().getResource("templates/ssh.html").toURI(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + FileUtil.writeBytes(result.getBytes(StandardCharsets.UTF_8), url.getPath()); + webEngine.load(url.toASCIIString()); + } + + private String toString(SSHData sshData) { + return JSON.toJSONString(sshData); + } + + public SSHData create_ssh_data(String command, SSHData.Type type) { SSHData sshData = new SSHData(); sshData.setUsername(username.getText()); sshData.setPassword(password.getText()); @@ -214,34 +287,36 @@ public class SSHConnectionController { return sshData; } - private void getConnection(){ + private void getConnection() { if (webSocketClient == null) { - webSocketClient( "localhost", 8888); + webSocketClient("localhost", 8888); } } - public void webSocketClient( String socket_address, int socket_port) { + public void webSocketClient(String socket_address, int socket_port) { try { - webSocketClient = new WebSocketClient(new URI( "ws://" + socket_address + ":" + socket_port), new Draft_6455()) { + webSocketClient = new WebSocketClient(new URI("ws://" + socket_address + ":" + socket_port), new Draft_6455()) { //连接服务端时触发 @Override public void onOpen(ServerHandshake handshakedata) { add_msg("websocket客户端和服务器连接成功!"); } + //收到服务端消息时触发 @Override public void onMessage(String message) { String[] s = message.split(" "); for (String s1 : s) { - add_msg( s1 ); + add_msg(s1); } - } + //和服务端断开连接时触发 @Override public void onClose(int code, String reason, boolean remote) { add_msg("websocket客户端退出连接"); } + //连接异常时触发 @Override public void onError(Exception ex) { @@ -255,14 +330,15 @@ public class SSHConnectionController { } public static void add_msg(String msg) { - message_list.add(msg); - message_list.add("------------------------------------------------------------------->"); - message_list.add(System.lineSeparator()); +// message_list.add(msg); +// message_list.add("------------------------------------------------------------------->"); +// message_list.add(System.lineSeparator()); } public void receive(String msg) { Platform.runLater(() -> { - this.show_result.setText(msg); +// this.show_result.setText(msg); }); } + } diff --git a/src/main/java/com/zhangmeng/tools/controller/ServerToolsController.java b/src/main/java/com/zhangmeng/tools/controller/ServerToolsController.java index 9e73920..b8dfebe 100644 --- a/src/main/java/com/zhangmeng/tools/controller/ServerToolsController.java +++ b/src/main/java/com/zhangmeng/tools/controller/ServerToolsController.java @@ -20,6 +20,7 @@ import javafx.scene.layout.AnchorPane; import javafx.scene.layout.HBox; import javafx.scene.paint.Paint; import javafx.scene.text.Font; +import javafx.scene.web.WebView; import javafx.stage.Stage; import javafx.util.Callback; import lombok.extern.slf4j.Slf4j; @@ -284,6 +285,12 @@ public class ServerToolsController { root = ftpServer; } common_method(); + + WebView webView = (WebView) root.lookup("#ssh_web"); + AnchorPane.setTopAnchor(webView,167.0); + AnchorPane.setBottomAnchor(webView,37.0); + AnchorPane.setLeftAnchor(webView,73.0); + AnchorPane.setRightAnchor(webView,45.0); } private void ftpServer(boolean flag) { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index 24f5b80..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,135 +0,0 @@ -server: - port: 8083 -# max-http-header-size: 1000MB -spring: - main: - allow-bean-definition-overriding: true - autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure - session: - timeout: 120m - datasource: - druid: - stat-view-servlet: - loginUsername: - loginPassword: - dynamic: - druid: - initial-size: 5 - min-idle: 5 - maxActive: 20 - maxWait: 60000 - timeBetweenEvictionRunsMillis: 60000 - minEvictableIdleTimeMillis: 300000 - validationQuery: SELECT 1 - testWhileIdle: true - testOnBorrow: false - testOnReturn: false - poolPreparedStatements: true - maxPoolPreparedStatementPerConnectionSize: 20 - filters: stat,wall,slf4j - connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 - primary: master - strict: false - datasource: - # ? ? ? ? - master: - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://127.0.0.1:3306/mystyle-blog?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true - username: root - password: root - jpa: - database: mysql - hibernate: - ddl-auto: update - naming: - physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl - show-sql: true - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL5Dialect - quartz: - properties: - org: - quartz: - scheduler: - instanceName: DefaultQuartzScheduler - instanceId: AUTO - jobStore: - class: org.quartz.impl.jdbcjobstore.JobStoreTX - driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate - tablePrefix: QRTZ_ - isClustered: false - clusterCheckinInterval: 10000 - useProperties: false - threadPool: - class: org.quartz.simpl.SimpleThreadPool - threadCount: 10 - threadPriority: 5 - threadsInheritContextClassLoaderOfInitializingThread: true - job-store-type: jdbc - jdbc: - initialize-schema: never - freemarker: - suffix: .ftl - check-template-location: true - content-type: text/html - charset: UTF-8 - template-loader-path: classpath:/templates/ - cache: false - enabled: true - request-context-attribute: request - mail: - default-encoding: UTF-8 - port: 465 - username: zhang1334717033@foxmail.com - password: gymxczptynubfgih - test-connection: false - host: smtp.qq.com - protocol: smtps - properties: - mail: - smtp: - auth: true - starttls: - enable: true - required: true - rabbitmq: - host: localhost - port: 5672 - username: guest - password: guest - jackson: - date-format: yyyy-MM-dd HH:mm:ss - time-zone: GMT+8 - servlet: - multipart: - max-file-size: 1000MB - max-request-size: 1000MB -pagehelper: - row-bounds-with-count: true - offset-as-page-num: true - page-size-zero: true - reasonable: false - support-methods-arguments: false - params: count=countSql - helper-dialect: mysql -mybatis: - type-aliases-package: com.zhangmeng.modules - configuration: - mapUnderscoreToCamelCase: true - default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler -mapper: - style: normal - enum-as-simple-type: true - identity: MYSQL - check-example-entity-class: true -logging: - config: classpath:logback-spring.xml -log: - level: - root: info - my: info - file-path: logs/admin-server.log - max-size: 30MB diff --git a/src/main/resources/fxml/ssh-connection.fxml b/src/main/resources/fxml/ssh-connection.fxml index 1206ec1..860ddd1 100644 --- a/src/main/resources/fxml/ssh-connection.fxml +++ b/src/main/resources/fxml/ssh-connection.fxml @@ -2,9 +2,9 @@ - + @@ -14,12 +14,13 @@ - ",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0 0 && this._lines.length <= this.ybase + this.y + addToY + 1) { + this.ybase--; + addToY++; + if (this.ydisp > 0) { + this.ydisp--; + } + } + else { + this._lines.push(this._terminal.blankLine(undefined, undefined, newCols)); + } + } + } + } + else { + for (var y = this._terminal.rows; y > newRows; y--) { + if (this._lines.length > newRows + this.ybase) { + if (this._lines.length > this.ybase + this.y + 1) { + this._lines.pop(); + } + else { + this.ybase++; + this.ydisp++; + } + } + } + } + if (this.y >= newRows) { + this.y = newRows - 1; + } + if (addToY) { + this.y += addToY; + } + if (this.x >= newCols) { + this.x = newCols - 1; + } + this.scrollTop = 0; + this.scrollBottom = newRows - 1; + }; + return Buffer; +}()); +exports.Buffer = Buffer; + + + +},{"./utils/CircularList":18}],2:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Buffer_1 = require("./Buffer"); +var EventEmitter_1 = require("./EventEmitter"); +var BufferSet = (function (_super) { + __extends(BufferSet, _super); + function BufferSet(_terminal) { + var _this = _super.call(this) || this; + _this._terminal = _terminal; + _this._normal = new Buffer_1.Buffer(_this._terminal); + _this._normal.fillViewportRows(); + _this._alt = new Buffer_1.Buffer(_this._terminal); + _this._activeBuffer = _this._normal; + return _this; + } + Object.defineProperty(BufferSet.prototype, "alt", { + get: function () { + return this._alt; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(BufferSet.prototype, "active", { + get: function () { + return this._activeBuffer; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(BufferSet.prototype, "normal", { + get: function () { + return this._normal; + }, + enumerable: true, + configurable: true + }); + BufferSet.prototype.activateNormalBuffer = function () { + this._alt.clear(); + this._activeBuffer = this._normal; + this.emit('activate', this._normal); + }; + BufferSet.prototype.activateAltBuffer = function () { + this._alt.fillViewportRows(); + this._activeBuffer = this._alt; + this.emit('activate', this._alt); + }; + BufferSet.prototype.resize = function (newCols, newRows) { + this._normal.resize(newCols, newRows); + this._alt.resize(newCols, newRows); + }; + return BufferSet; +}(EventEmitter_1.EventEmitter)); +exports.BufferSet = BufferSet; + + + +},{"./Buffer":1,"./EventEmitter":6}],3:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CHARSETS = {}; +exports.DEFAULT_CHARSET = exports.CHARSETS['B']; +exports.CHARSETS['0'] = { + '`': '\u25c6', + 'a': '\u2592', + 'b': '\u0009', + 'c': '\u000c', + 'd': '\u000d', + 'e': '\u000a', + 'f': '\u00b0', + 'g': '\u00b1', + 'h': '\u2424', + 'i': '\u000b', + 'j': '\u2518', + 'k': '\u2510', + 'l': '\u250c', + 'm': '\u2514', + 'n': '\u253c', + 'o': '\u23ba', + 'p': '\u23bb', + 'q': '\u2500', + 'r': '\u23bc', + 's': '\u23bd', + 't': '\u251c', + 'u': '\u2524', + 'v': '\u2534', + 'w': '\u252c', + 'x': '\u2502', + 'y': '\u2264', + 'z': '\u2265', + '{': '\u03c0', + '|': '\u2260', + '}': '\u00a3', + '~': '\u00b7' +}; +exports.CHARSETS['A'] = { + '#': '£' +}; +exports.CHARSETS['B'] = null; +exports.CHARSETS['4'] = { + '#': '£', + '@': '¾', + '[': 'ij', + '\\': '½', + ']': '|', + '{': '¨', + '|': 'f', + '}': '¼', + '~': '´' +}; +exports.CHARSETS['C'] = + exports.CHARSETS['5'] = { + '[': 'Ä', + '\\': 'Ö', + ']': 'Å', + '^': 'Ü', + '`': 'é', + '{': 'ä', + '|': 'ö', + '}': 'å', + '~': 'ü' + }; +exports.CHARSETS['R'] = { + '#': '£', + '@': 'à', + '[': '°', + '\\': 'ç', + ']': '§', + '{': 'é', + '|': 'ù', + '}': 'è', + '~': '¨' +}; +exports.CHARSETS['Q'] = { + '@': 'à', + '[': 'â', + '\\': 'ç', + ']': 'ê', + '^': 'î', + '`': 'ô', + '{': 'é', + '|': 'ù', + '}': 'è', + '~': 'û' +}; +exports.CHARSETS['K'] = { + '@': '§', + '[': 'Ä', + '\\': 'Ö', + ']': 'Ü', + '{': 'ä', + '|': 'ö', + '}': 'ü', + '~': 'ß' +}; +exports.CHARSETS['Y'] = { + '#': '£', + '@': '§', + '[': '°', + '\\': 'ç', + ']': 'é', + '`': 'ù', + '{': 'à', + '|': 'ò', + '}': 'è', + '~': 'ì' +}; +exports.CHARSETS['E'] = + exports.CHARSETS['6'] = { + '@': 'Ä', + '[': 'Æ', + '\\': 'Ø', + ']': 'Å', + '^': 'Ü', + '`': 'ä', + '{': 'æ', + '|': 'ø', + '}': 'å', + '~': 'ü' + }; +exports.CHARSETS['Z'] = { + '#': '£', + '@': '§', + '[': '¡', + '\\': 'Ñ', + ']': '¿', + '{': '°', + '|': 'ñ', + '}': 'ç' +}; +exports.CHARSETS['H'] = + exports.CHARSETS['7'] = { + '@': 'É', + '[': 'Ä', + '\\': 'Ö', + ']': 'Å', + '^': 'Ü', + '`': 'é', + '{': 'ä', + '|': 'ö', + '}': 'å', + '~': 'ü' + }; +exports.CHARSETS['='] = { + '#': 'ù', + '@': 'à', + '[': 'é', + '\\': 'ç', + ']': 'ê', + '^': 'î', + '_': 'è', + '`': 'ô', + '{': 'ä', + '|': 'ö', + '}': 'ü', + '~': 'û' +}; + + + +},{}],4:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var CompositionHelper = (function () { + function CompositionHelper(textarea, compositionView, terminal) { + this.textarea = textarea; + this.compositionView = compositionView; + this.terminal = terminal; + this.isComposing = false; + this.isSendingComposition = false; + this.compositionPosition = { start: null, end: null }; + } + CompositionHelper.prototype.compositionstart = function () { + this.isComposing = true; + this.compositionPosition.start = this.textarea.value.length; + this.compositionView.textContent = ''; + this.compositionView.classList.add('active'); + }; + CompositionHelper.prototype.compositionupdate = function (ev) { + var _this = this; + this.compositionView.textContent = ev.data; + this.updateCompositionElements(); + setTimeout(function () { + _this.compositionPosition.end = _this.textarea.value.length; + }, 0); + }; + CompositionHelper.prototype.compositionend = function () { + this.finalizeComposition(true); + }; + CompositionHelper.prototype.keydown = function (ev) { + if (this.isComposing || this.isSendingComposition) { + if (ev.keyCode === 229) { + return false; + } + else if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) { + return false; + } + else { + this.finalizeComposition(false); + } + } + if (ev.keyCode === 229) { + this.handleAnyTextareaChanges(); + return false; + } + return true; + }; + CompositionHelper.prototype.finalizeComposition = function (waitForPropogation) { + var _this = this; + this.compositionView.classList.remove('active'); + this.isComposing = false; + this.clearTextareaPosition(); + if (!waitForPropogation) { + this.isSendingComposition = false; + var input = this.textarea.value.substring(this.compositionPosition.start, this.compositionPosition.end); + this.terminal.handler(input); + } + else { + var currentCompositionPosition_1 = { + start: this.compositionPosition.start, + end: this.compositionPosition.end, + }; + this.isSendingComposition = true; + setTimeout(function () { + if (_this.isSendingComposition) { + _this.isSendingComposition = false; + var input = void 0; + if (_this.isComposing) { + input = _this.textarea.value.substring(currentCompositionPosition_1.start, currentCompositionPosition_1.end); + } + else { + input = _this.textarea.value.substring(currentCompositionPosition_1.start); + } + _this.terminal.handler(input); + } + }, 0); + } + }; + CompositionHelper.prototype.handleAnyTextareaChanges = function () { + var _this = this; + var oldValue = this.textarea.value; + setTimeout(function () { + if (!_this.isComposing) { + var newValue = _this.textarea.value; + var diff = newValue.replace(oldValue, ''); + if (diff.length > 0) { + _this.terminal.handler(diff); + } + } + }, 0); + }; + CompositionHelper.prototype.updateCompositionElements = function (dontRecurse) { + var _this = this; + if (!this.isComposing) { + return; + } + var cursor = this.terminal.element.querySelector('.terminal-cursor'); + if (cursor) { + var xtermRows = this.terminal.element.querySelector('.xterm-rows'); + var cursorTop = xtermRows.offsetTop + cursor.offsetTop; + this.compositionView.style.left = cursor.offsetLeft + 'px'; + this.compositionView.style.top = cursorTop + 'px'; + this.compositionView.style.height = cursor.offsetHeight + 'px'; + this.compositionView.style.lineHeight = cursor.offsetHeight + 'px'; + var compositionViewBounds = this.compositionView.getBoundingClientRect(); + this.textarea.style.left = cursor.offsetLeft + 'px'; + this.textarea.style.top = cursorTop + 'px'; + this.textarea.style.width = compositionViewBounds.width + 'px'; + this.textarea.style.height = compositionViewBounds.height + 'px'; + this.textarea.style.lineHeight = compositionViewBounds.height + 'px'; + } + if (!dontRecurse) { + setTimeout(function () { return _this.updateCompositionElements(true); }, 0); + } + }; + ; + CompositionHelper.prototype.clearTextareaPosition = function () { + this.textarea.style.left = ''; + this.textarea.style.top = ''; + }; + ; + return CompositionHelper; +}()); +exports.CompositionHelper = CompositionHelper; + + + +},{}],5:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var C0; +(function (C0) { + C0.NUL = '\x00'; + C0.SOH = '\x01'; + C0.STX = '\x02'; + C0.ETX = '\x03'; + C0.EOT = '\x04'; + C0.ENQ = '\x05'; + C0.ACK = '\x06'; + C0.BEL = '\x07'; + C0.BS = '\x08'; + C0.HT = '\x09'; + C0.LF = '\x0a'; + C0.VT = '\x0b'; + C0.FF = '\x0c'; + C0.CR = '\x0d'; + C0.SO = '\x0e'; + C0.SI = '\x0f'; + C0.DLE = '\x10'; + C0.DC1 = '\x11'; + C0.DC2 = '\x12'; + C0.DC3 = '\x13'; + C0.DC4 = '\x14'; + C0.NAK = '\x15'; + C0.SYN = '\x16'; + C0.ETB = '\x17'; + C0.CAN = '\x18'; + C0.EM = '\x19'; + C0.SUB = '\x1a'; + C0.ESC = '\x1b'; + C0.FS = '\x1c'; + C0.GS = '\x1d'; + C0.RS = '\x1e'; + C0.US = '\x1f'; + C0.SP = '\x20'; + C0.DEL = '\x7f'; +})(C0 = exports.C0 || (exports.C0 = {})); +; + + + +},{}],6:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +; +var EventEmitter = (function () { + function EventEmitter() { + this._events = this._events || {}; + } + EventEmitter.prototype.on = function (type, listener) { + this._events[type] = this._events[type] || []; + this._events[type].push(listener); + }; + EventEmitter.prototype.off = function (type, listener) { + if (!this._events[type]) { + return; + } + var obj = this._events[type]; + var i = obj.length; + while (i--) { + if (obj[i] === listener || obj[i].listener === listener) { + obj.splice(i, 1); + return; + } + } + }; + EventEmitter.prototype.removeAllListeners = function (type) { + if (this._events[type]) { + delete this._events[type]; + } + }; + EventEmitter.prototype.once = function (type, listener) { + function on() { + var args = Array.prototype.slice.call(arguments); + this.off(type, on); + return listener.apply(this, args); + } + on.listener = listener; + return this.on(type, on); + }; + EventEmitter.prototype.emit = function (type) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + if (!this._events[type]) { + return; + } + var obj = this._events[type]; + for (var i = 0; i < obj.length; i++) { + obj[i].apply(this, args); + } + }; + EventEmitter.prototype.listeners = function (type) { + return this._events[type] || []; + }; + return EventEmitter; +}()); +exports.EventEmitter = EventEmitter; + + + +},{}],7:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var EscapeSequences_1 = require("./EscapeSequences"); +var Charsets_1 = require("./Charsets"); +var InputHandler = (function () { + function InputHandler(_terminal) { + this._terminal = _terminal; + } + InputHandler.prototype.addChar = function (char, code) { + if (char >= ' ') { + var ch_width = exports.wcwidth(code); + if (this._terminal.charset && this._terminal.charset[char]) { + char = this._terminal.charset[char]; + } + var row = this._terminal.buffer.y + this._terminal.buffer.ybase; + if (!ch_width && this._terminal.buffer.x) { + if (this._terminal.buffer.lines.get(row)[this._terminal.buffer.x - 1]) { + if (!this._terminal.buffer.lines.get(row)[this._terminal.buffer.x - 1][2]) { + if (this._terminal.buffer.lines.get(row)[this._terminal.buffer.x - 2]) + this._terminal.buffer.lines.get(row)[this._terminal.buffer.x - 2][1] += char; + } + else { + this._terminal.buffer.lines.get(row)[this._terminal.buffer.x - 1][1] += char; + } + this._terminal.updateRange(this._terminal.buffer.y); + } + return; + } + if (this._terminal.buffer.x + ch_width - 1 >= this._terminal.cols) { + if (this._terminal.wraparoundMode) { + this._terminal.buffer.x = 0; + this._terminal.buffer.y++; + if (this._terminal.buffer.y > this._terminal.buffer.scrollBottom) { + this._terminal.buffer.y--; + this._terminal.scroll(true); + } + else { + this._terminal.buffer.lines.get(this._terminal.buffer.y).isWrapped = true; + } + } + else { + if (ch_width === 2) + return; + } + } + row = this._terminal.buffer.y + this._terminal.buffer.ybase; + if (this._terminal.insertMode) { + for (var moves = 0; moves < ch_width; ++moves) { + var removed = this._terminal.buffer.lines.get(this._terminal.buffer.y + this._terminal.buffer.ybase).pop(); + if (removed[2] === 0 + && this._terminal.buffer.lines.get(row)[this._terminal.cols - 2] + && this._terminal.buffer.lines.get(row)[this._terminal.cols - 2][2] === 2) { + this._terminal.buffer.lines.get(row)[this._terminal.cols - 2] = [this._terminal.curAttr, ' ', 1]; + } + this._terminal.buffer.lines.get(row).splice(this._terminal.buffer.x, 0, [this._terminal.curAttr, ' ', 1]); + } + } + this._terminal.buffer.lines.get(row)[this._terminal.buffer.x] = [this._terminal.curAttr, char, ch_width]; + this._terminal.buffer.x++; + this._terminal.updateRange(this._terminal.buffer.y); + if (ch_width === 2) { + this._terminal.buffer.lines.get(row)[this._terminal.buffer.x] = [this._terminal.curAttr, '', 0]; + this._terminal.buffer.x++; + } + } + }; + InputHandler.prototype.bell = function () { + var _this = this; + if (!this._terminal.visualBell) { + return; + } + this._terminal.element.style.borderColor = 'white'; + setTimeout(function () { return _this._terminal.element.style.borderColor = ''; }, 10); + if (this._terminal.popOnBell) { + this._terminal.focus(); + } + }; + InputHandler.prototype.lineFeed = function () { + if (this._terminal.convertEol) { + this._terminal.buffer.x = 0; + } + this._terminal.buffer.y++; + if (this._terminal.buffer.y > this._terminal.buffer.scrollBottom) { + this._terminal.buffer.y--; + this._terminal.scroll(); + } + if (this._terminal.buffer.x >= this._terminal.cols) { + this._terminal.buffer.x--; + } + this._terminal.emit('lineFeed'); + }; + InputHandler.prototype.carriageReturn = function () { + this._terminal.buffer.x = 0; + }; + InputHandler.prototype.backspace = function () { + if (this._terminal.buffer.x > 0) { + this._terminal.buffer.x--; + } + }; + InputHandler.prototype.tab = function () { + this._terminal.buffer.x = this._terminal.nextStop(); + }; + InputHandler.prototype.shiftOut = function () { + this._terminal.setgLevel(1); + }; + InputHandler.prototype.shiftIn = function () { + this._terminal.setgLevel(0); + }; + InputHandler.prototype.insertChars = function (params) { + var param, row, j, ch; + param = params[0]; + if (param < 1) + param = 1; + row = this._terminal.buffer.y + this._terminal.buffer.ybase; + j = this._terminal.buffer.x; + ch = [this._terminal.eraseAttr(), ' ', 1]; + while (param-- && j < this._terminal.cols) { + this._terminal.buffer.lines.get(row).splice(j++, 0, ch); + this._terminal.buffer.lines.get(row).pop(); + } + }; + InputHandler.prototype.cursorUp = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.buffer.y -= param; + if (this._terminal.buffer.y < 0) { + this._terminal.buffer.y = 0; + } + }; + InputHandler.prototype.cursorDown = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.buffer.y += param; + if (this._terminal.buffer.y >= this._terminal.rows) { + this._terminal.buffer.y = this._terminal.rows - 1; + } + if (this._terminal.buffer.x >= this._terminal.cols) { + this._terminal.buffer.x--; + } + }; + InputHandler.prototype.cursorForward = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.buffer.x += param; + if (this._terminal.buffer.x >= this._terminal.cols) { + this._terminal.buffer.x = this._terminal.cols - 1; + } + }; + InputHandler.prototype.cursorBackward = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + if (this._terminal.buffer.x >= this._terminal.cols) { + this._terminal.buffer.x--; + } + this._terminal.buffer.x -= param; + if (this._terminal.buffer.x < 0) { + this._terminal.buffer.x = 0; + } + }; + InputHandler.prototype.cursorNextLine = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.buffer.y += param; + if (this._terminal.buffer.y >= this._terminal.rows) { + this._terminal.buffer.y = this._terminal.rows - 1; + } + this._terminal.buffer.x = 0; + }; + InputHandler.prototype.cursorPrecedingLine = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.buffer.y -= param; + if (this._terminal.buffer.y < 0) { + this._terminal.buffer.y = 0; + } + this._terminal.buffer.x = 0; + }; + InputHandler.prototype.cursorCharAbsolute = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.buffer.x = param - 1; + }; + InputHandler.prototype.cursorPosition = function (params) { + var row, col; + row = params[0] - 1; + if (params.length >= 2) { + col = params[1] - 1; + } + else { + col = 0; + } + if (row < 0) { + row = 0; + } + else if (row >= this._terminal.rows) { + row = this._terminal.rows - 1; + } + if (col < 0) { + col = 0; + } + else if (col >= this._terminal.cols) { + col = this._terminal.cols - 1; + } + this._terminal.buffer.x = col; + this._terminal.buffer.y = row; + }; + InputHandler.prototype.cursorForwardTab = function (params) { + var param = params[0] || 1; + while (param--) { + this._terminal.buffer.x = this._terminal.nextStop(); + } + }; + InputHandler.prototype.eraseInDisplay = function (params) { + var j; + switch (params[0]) { + case 0: + this._terminal.eraseRight(this._terminal.buffer.x, this._terminal.buffer.y); + j = this._terminal.buffer.y + 1; + for (; j < this._terminal.rows; j++) { + this._terminal.eraseLine(j); + } + break; + case 1: + this._terminal.eraseLeft(this._terminal.buffer.x, this._terminal.buffer.y); + j = this._terminal.buffer.y; + while (j--) { + this._terminal.eraseLine(j); + } + break; + case 2: + j = this._terminal.rows; + while (j--) + this._terminal.eraseLine(j); + break; + case 3: + var scrollBackSize = this._terminal.buffer.lines.length - this._terminal.rows; + if (scrollBackSize > 0) { + this._terminal.buffer.lines.trimStart(scrollBackSize); + this._terminal.buffer.ybase = Math.max(this._terminal.buffer.ybase - scrollBackSize, 0); + this._terminal.buffer.ydisp = Math.max(this._terminal.buffer.ydisp - scrollBackSize, 0); + this._terminal.emit('scroll', 0); + } + break; + } + }; + InputHandler.prototype.eraseInLine = function (params) { + switch (params[0]) { + case 0: + this._terminal.eraseRight(this._terminal.buffer.x, this._terminal.buffer.y); + break; + case 1: + this._terminal.eraseLeft(this._terminal.buffer.x, this._terminal.buffer.y); + break; + case 2: + this._terminal.eraseLine(this._terminal.buffer.y); + break; + } + }; + InputHandler.prototype.insertLines = function (params) { + var param, row, j; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this._terminal.buffer.y + this._terminal.buffer.ybase; + j = this._terminal.rows - 1 - this._terminal.buffer.scrollBottom; + j = this._terminal.rows - 1 + this._terminal.buffer.ybase - j + 1; + while (param--) { + if (this._terminal.buffer.lines.length === this._terminal.buffer.lines.maxLength) { + this._terminal.buffer.lines.trimStart(1); + this._terminal.buffer.ybase--; + this._terminal.buffer.ydisp--; + row--; + j--; + } + this._terminal.buffer.lines.splice(row, 0, this._terminal.blankLine(true)); + this._terminal.buffer.lines.splice(j, 1); + } + this._terminal.updateRange(this._terminal.buffer.y); + this._terminal.updateRange(this._terminal.buffer.scrollBottom); + }; + InputHandler.prototype.deleteLines = function (params) { + var param, row, j; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this._terminal.buffer.y + this._terminal.buffer.ybase; + j = this._terminal.rows - 1 - this._terminal.buffer.scrollBottom; + j = this._terminal.rows - 1 + this._terminal.buffer.ybase - j; + while (param--) { + if (this._terminal.buffer.lines.length === this._terminal.buffer.lines.maxLength) { + this._terminal.buffer.lines.trimStart(1); + this._terminal.buffer.ybase -= 1; + this._terminal.buffer.ydisp -= 1; + } + this._terminal.buffer.lines.splice(j + 1, 0, this._terminal.blankLine(true)); + this._terminal.buffer.lines.splice(row, 1); + } + this._terminal.updateRange(this._terminal.buffer.y); + this._terminal.updateRange(this._terminal.buffer.scrollBottom); + }; + InputHandler.prototype.deleteChars = function (params) { + var param, row, ch; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this._terminal.buffer.y + this._terminal.buffer.ybase; + ch = [this._terminal.eraseAttr(), ' ', 1]; + while (param--) { + this._terminal.buffer.lines.get(row).splice(this._terminal.buffer.x, 1); + this._terminal.buffer.lines.get(row).push(ch); + } + }; + InputHandler.prototype.scrollUp = function (params) { + var param = params[0] || 1; + while (param--) { + this._terminal.buffer.lines.splice(this._terminal.buffer.ybase + this._terminal.buffer.scrollTop, 1); + this._terminal.buffer.lines.splice(this._terminal.buffer.ybase + this._terminal.buffer.scrollBottom, 0, this._terminal.blankLine()); + } + this._terminal.updateRange(this._terminal.buffer.scrollTop); + this._terminal.updateRange(this._terminal.buffer.scrollBottom); + }; + InputHandler.prototype.scrollDown = function (params) { + var param = params[0] || 1; + while (param--) { + this._terminal.buffer.lines.splice(this._terminal.buffer.ybase + this._terminal.buffer.scrollBottom, 1); + this._terminal.buffer.lines.splice(this._terminal.buffer.ybase + this._terminal.buffer.scrollTop, 0, this._terminal.blankLine()); + } + this._terminal.updateRange(this._terminal.buffer.scrollTop); + this._terminal.updateRange(this._terminal.buffer.scrollBottom); + }; + InputHandler.prototype.eraseChars = function (params) { + var param, row, j, ch; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this._terminal.buffer.y + this._terminal.buffer.ybase; + j = this._terminal.buffer.x; + ch = [this._terminal.eraseAttr(), ' ', 1]; + while (param-- && j < this._terminal.cols) { + this._terminal.buffer.lines.get(row)[j++] = ch; + } + }; + InputHandler.prototype.cursorBackwardTab = function (params) { + var param = params[0] || 1; + while (param--) { + this._terminal.buffer.x = this._terminal.prevStop(); + } + }; + InputHandler.prototype.charPosAbsolute = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.buffer.x = param - 1; + if (this._terminal.buffer.x >= this._terminal.cols) { + this._terminal.buffer.x = this._terminal.cols - 1; + } + }; + InputHandler.prototype.HPositionRelative = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.buffer.x += param; + if (this._terminal.buffer.x >= this._terminal.cols) { + this._terminal.buffer.x = this._terminal.cols - 1; + } + }; + InputHandler.prototype.repeatPrecedingCharacter = function (params) { + var param = params[0] || 1, line = this._terminal.buffer.lines.get(this._terminal.buffer.ybase + this._terminal.buffer.y), ch = line[this._terminal.buffer.x - 1] || [this._terminal.defAttr, ' ', 1]; + while (param--) { + line[this._terminal.buffer.x++] = ch; + } + }; + InputHandler.prototype.sendDeviceAttributes = function (params) { + if (params[0] > 0) { + return; + } + if (!this._terminal.prefix) { + if (this._terminal.is('xterm') || this._terminal.is('rxvt-unicode') || this._terminal.is('screen')) { + this._terminal.send(EscapeSequences_1.C0.ESC + '[?1;2c'); + } + else if (this._terminal.is('linux')) { + this._terminal.send(EscapeSequences_1.C0.ESC + '[?6c'); + } + } + else if (this._terminal.prefix === '>') { + if (this._terminal.is('xterm')) { + this._terminal.send(EscapeSequences_1.C0.ESC + '[>0;276;0c'); + } + else if (this._terminal.is('rxvt-unicode')) { + this._terminal.send(EscapeSequences_1.C0.ESC + '[>85;95;0c'); + } + else if (this._terminal.is('linux')) { + this._terminal.send(params[0] + 'c'); + } + else if (this._terminal.is('screen')) { + this._terminal.send(EscapeSequences_1.C0.ESC + '[>83;40003;0c'); + } + } + }; + InputHandler.prototype.linePosAbsolute = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.buffer.y = param - 1; + if (this._terminal.buffer.y >= this._terminal.rows) { + this._terminal.buffer.y = this._terminal.rows - 1; + } + }; + InputHandler.prototype.VPositionRelative = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.buffer.y += param; + if (this._terminal.buffer.y >= this._terminal.rows) { + this._terminal.buffer.y = this._terminal.rows - 1; + } + if (this._terminal.buffer.x >= this._terminal.cols) { + this._terminal.buffer.x--; + } + }; + InputHandler.prototype.HVPosition = function (params) { + if (params[0] < 1) + params[0] = 1; + if (params[1] < 1) + params[1] = 1; + this._terminal.buffer.y = params[0] - 1; + if (this._terminal.buffer.y >= this._terminal.rows) { + this._terminal.buffer.y = this._terminal.rows - 1; + } + this._terminal.buffer.x = params[1] - 1; + if (this._terminal.buffer.x >= this._terminal.cols) { + this._terminal.buffer.x = this._terminal.cols - 1; + } + }; + InputHandler.prototype.tabClear = function (params) { + var param = params[0]; + if (param <= 0) { + delete this._terminal.buffer.tabs[this._terminal.buffer.x]; + } + else if (param === 3) { + this._terminal.buffer.tabs = {}; + } + }; + InputHandler.prototype.setMode = function (params) { + if (params.length > 1) { + for (var i = 0; i < params.length; i++) { + this.setMode([params[i]]); + } + return; + } + if (!this._terminal.prefix) { + switch (params[0]) { + case 4: + this._terminal.insertMode = true; + break; + case 20: + break; + } + } + else if (this._terminal.prefix === '?') { + switch (params[0]) { + case 1: + this._terminal.applicationCursor = true; + break; + case 2: + this._terminal.setgCharset(0, Charsets_1.DEFAULT_CHARSET); + this._terminal.setgCharset(1, Charsets_1.DEFAULT_CHARSET); + this._terminal.setgCharset(2, Charsets_1.DEFAULT_CHARSET); + this._terminal.setgCharset(3, Charsets_1.DEFAULT_CHARSET); + break; + case 3: + this._terminal.savedCols = this._terminal.cols; + this._terminal.resize(132, this._terminal.rows); + break; + case 6: + this._terminal.originMode = true; + break; + case 7: + this._terminal.wraparoundMode = true; + break; + case 12: + break; + case 66: + this._terminal.log('Serial port requested application keypad.'); + this._terminal.applicationKeypad = true; + this._terminal.viewport.syncScrollArea(); + break; + case 9: + case 1000: + case 1002: + case 1003: + this._terminal.x10Mouse = params[0] === 9; + this._terminal.vt200Mouse = params[0] === 1000; + this._terminal.normalMouse = params[0] > 1000; + this._terminal.mouseEvents = true; + this._terminal.element.classList.add('enable-mouse-events'); + this._terminal.selectionManager.disable(); + this._terminal.log('Binding to mouse events.'); + break; + case 1004: + this._terminal.sendFocus = true; + break; + case 1005: + this._terminal.utfMouse = true; + break; + case 1006: + this._terminal.sgrMouse = true; + break; + case 1015: + this._terminal.urxvtMouse = true; + break; + case 25: + this._terminal.cursorHidden = false; + break; + case 1049: + case 47: + case 1047: + this._terminal.buffers.activateAltBuffer(); + this._terminal.viewport.syncScrollArea(); + this._terminal.showCursor(); + break; + } + } + }; + InputHandler.prototype.resetMode = function (params) { + if (params.length > 1) { + for (var i = 0; i < params.length; i++) { + this.resetMode([params[i]]); + } + return; + } + if (!this._terminal.prefix) { + switch (params[0]) { + case 4: + this._terminal.insertMode = false; + break; + case 20: + break; + } + } + else if (this._terminal.prefix === '?') { + switch (params[0]) { + case 1: + this._terminal.applicationCursor = false; + break; + case 3: + if (this._terminal.cols === 132 && this._terminal.savedCols) { + this._terminal.resize(this._terminal.savedCols, this._terminal.rows); + } + delete this._terminal.savedCols; + break; + case 6: + this._terminal.originMode = false; + break; + case 7: + this._terminal.wraparoundMode = false; + break; + case 12: + break; + case 66: + this._terminal.log('Switching back to normal keypad.'); + this._terminal.applicationKeypad = false; + this._terminal.viewport.syncScrollArea(); + break; + case 9: + case 1000: + case 1002: + case 1003: + this._terminal.x10Mouse = false; + this._terminal.vt200Mouse = false; + this._terminal.normalMouse = false; + this._terminal.mouseEvents = false; + this._terminal.element.classList.remove('enable-mouse-events'); + this._terminal.selectionManager.enable(); + break; + case 1004: + this._terminal.sendFocus = false; + break; + case 1005: + this._terminal.utfMouse = false; + break; + case 1006: + this._terminal.sgrMouse = false; + break; + case 1015: + this._terminal.urxvtMouse = false; + break; + case 25: + this._terminal.cursorHidden = true; + break; + case 1049: + case 47: + case 1047: + this._terminal.buffers.activateNormalBuffer(); + this._terminal.selectionManager.setBuffer(this._terminal.buffer.lines); + this._terminal.refresh(0, this._terminal.rows - 1); + this._terminal.viewport.syncScrollArea(); + this._terminal.showCursor(); + break; + } + } + }; + InputHandler.prototype.charAttributes = function (params) { + if (params.length === 1 && params[0] === 0) { + this._terminal.curAttr = this._terminal.defAttr; + return; + } + var l = params.length, i = 0, flags = this._terminal.curAttr >> 18, fg = (this._terminal.curAttr >> 9) & 0x1ff, bg = this._terminal.curAttr & 0x1ff, p; + for (; i < l; i++) { + p = params[i]; + if (p >= 30 && p <= 37) { + fg = p - 30; + } + else if (p >= 40 && p <= 47) { + bg = p - 40; + } + else if (p >= 90 && p <= 97) { + p += 8; + fg = p - 90; + } + else if (p >= 100 && p <= 107) { + p += 8; + bg = p - 100; + } + else if (p === 0) { + flags = this._terminal.defAttr >> 18; + fg = (this._terminal.defAttr >> 9) & 0x1ff; + bg = this._terminal.defAttr & 0x1ff; + } + else if (p === 1) { + flags |= 1; + } + else if (p === 4) { + flags |= 2; + } + else if (p === 5) { + flags |= 4; + } + else if (p === 7) { + flags |= 8; + } + else if (p === 8) { + flags |= 16; + } + else if (p === 22) { + flags &= ~1; + } + else if (p === 24) { + flags &= ~2; + } + else if (p === 25) { + flags &= ~4; + } + else if (p === 27) { + flags &= ~8; + } + else if (p === 28) { + flags &= ~16; + } + else if (p === 39) { + fg = (this._terminal.defAttr >> 9) & 0x1ff; + } + else if (p === 49) { + bg = this._terminal.defAttr & 0x1ff; + } + else if (p === 38) { + if (params[i + 1] === 2) { + i += 2; + fg = this._terminal.matchColor(params[i] & 0xff, params[i + 1] & 0xff, params[i + 2] & 0xff); + if (fg === -1) + fg = 0x1ff; + i += 2; + } + else if (params[i + 1] === 5) { + i += 2; + p = params[i] & 0xff; + fg = p; + } + } + else if (p === 48) { + if (params[i + 1] === 2) { + i += 2; + bg = this._terminal.matchColor(params[i] & 0xff, params[i + 1] & 0xff, params[i + 2] & 0xff); + if (bg === -1) + bg = 0x1ff; + i += 2; + } + else if (params[i + 1] === 5) { + i += 2; + p = params[i] & 0xff; + bg = p; + } + } + else if (p === 100) { + fg = (this._terminal.defAttr >> 9) & 0x1ff; + bg = this._terminal.defAttr & 0x1ff; + } + else { + this._terminal.error('Unknown SGR attribute: %d.', p); + } + } + this._terminal.curAttr = (flags << 18) | (fg << 9) | bg; + }; + InputHandler.prototype.deviceStatus = function (params) { + if (!this._terminal.prefix) { + switch (params[0]) { + case 5: + this._terminal.send(EscapeSequences_1.C0.ESC + '[0n'); + break; + case 6: + this._terminal.send(EscapeSequences_1.C0.ESC + '[' + + (this._terminal.buffer.y + 1) + + ';' + + (this._terminal.buffer.x + 1) + + 'R'); + break; + } + } + else if (this._terminal.prefix === '?') { + switch (params[0]) { + case 6: + this._terminal.send(EscapeSequences_1.C0.ESC + '[?' + + (this._terminal.buffer.y + 1) + + ';' + + (this._terminal.buffer.x + 1) + + 'R'); + break; + case 15: + break; + case 25: + break; + case 26: + break; + case 53: + break; + } + } + }; + InputHandler.prototype.softReset = function (params) { + this._terminal.cursorHidden = false; + this._terminal.insertMode = false; + this._terminal.originMode = false; + this._terminal.wraparoundMode = true; + this._terminal.applicationKeypad = false; + this._terminal.viewport.syncScrollArea(); + this._terminal.applicationCursor = false; + this._terminal.buffer.scrollTop = 0; + this._terminal.buffer.scrollBottom = this._terminal.rows - 1; + this._terminal.curAttr = this._terminal.defAttr; + this._terminal.buffer.x = this._terminal.buffer.y = 0; + this._terminal.charset = null; + this._terminal.glevel = 0; + this._terminal.charsets = [null]; + }; + InputHandler.prototype.setCursorStyle = function (params) { + var param = params[0] < 1 ? 1 : params[0]; + switch (param) { + case 1: + case 2: + this._terminal.setOption('cursorStyle', 'block'); + break; + case 3: + case 4: + this._terminal.setOption('cursorStyle', 'underline'); + break; + case 5: + case 6: + this._terminal.setOption('cursorStyle', 'bar'); + break; + } + var isBlinking = param % 2 === 1; + this._terminal.setOption('cursorBlink', isBlinking); + }; + InputHandler.prototype.setScrollRegion = function (params) { + if (this._terminal.prefix) + return; + this._terminal.buffer.scrollTop = (params[0] || 1) - 1; + this._terminal.buffer.scrollBottom = (params[1] && params[1] <= this._terminal.rows ? params[1] : this._terminal.rows) - 1; + this._terminal.buffer.x = 0; + this._terminal.buffer.y = 0; + }; + InputHandler.prototype.saveCursor = function (params) { + this._terminal.buffer.savedX = this._terminal.buffer.x; + this._terminal.buffer.savedY = this._terminal.buffer.y; + }; + InputHandler.prototype.restoreCursor = function (params) { + this._terminal.buffer.x = this._terminal.buffer.savedX || 0; + this._terminal.buffer.y = this._terminal.buffer.savedY || 0; + }; + return InputHandler; +}()); +exports.InputHandler = InputHandler; +exports.wcwidth = (function (opts) { + var COMBINING_BMP = [ + [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489], + [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2], + [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603], + [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670], + [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED], + [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A], + [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902], + [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D], + [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981], + [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD], + [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C], + [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D], + [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC], + [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD], + [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C], + [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D], + [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0], + [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48], + [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC], + [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD], + [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D], + [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6], + [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E], + [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC], + [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35], + [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E], + [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97], + [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030], + [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039], + [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F], + [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753], + [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD], + [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD], + [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922], + [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B], + [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34], + [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42], + [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF], + [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063], + [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F], + [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B], + [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F], + [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB], + ]; + var COMBINING_HIGH = [ + [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F], + [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169], + [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD], + [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F], + [0xE0100, 0xE01EF] + ]; + function bisearch(ucs, data) { + var min = 0; + var max = data.length - 1; + var mid; + if (ucs < data[0][0] || ucs > data[max][1]) + return false; + while (max >= min) { + mid = (min + max) >> 1; + if (ucs > data[mid][1]) + min = mid + 1; + else if (ucs < data[mid][0]) + max = mid - 1; + else + return true; + } + return false; + } + function wcwidthBMP(ucs) { + if (ucs === 0) + return opts.nul; + if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) + return opts.control; + if (bisearch(ucs, COMBINING_BMP)) + return 0; + if (isWideBMP(ucs)) { + return 2; + } + return 1; + } + function isWideBMP(ucs) { + return (ucs >= 0x1100 && (ucs <= 0x115f || + ucs === 0x2329 || + ucs === 0x232a || + (ucs >= 0x2e80 && ucs <= 0xa4cf && ucs !== 0x303f) || + (ucs >= 0xac00 && ucs <= 0xd7a3) || + (ucs >= 0xf900 && ucs <= 0xfaff) || + (ucs >= 0xfe10 && ucs <= 0xfe19) || + (ucs >= 0xfe30 && ucs <= 0xfe6f) || + (ucs >= 0xff00 && ucs <= 0xff60) || + (ucs >= 0xffe0 && ucs <= 0xffe6))); + } + function wcwidthHigh(ucs) { + if (bisearch(ucs, COMBINING_HIGH)) + return 0; + if ((ucs >= 0x20000 && ucs <= 0x2fffd) || (ucs >= 0x30000 && ucs <= 0x3fffd)) { + return 2; + } + return 1; + } + var control = opts.control | 0; + var table = null; + function init_table() { + var CODEPOINTS = 65536; + var BITWIDTH = 2; + var ITEMSIZE = 32; + var CONTAINERSIZE = CODEPOINTS * BITWIDTH / ITEMSIZE; + var CODEPOINTS_PER_ITEM = ITEMSIZE / BITWIDTH; + table = (typeof Uint32Array === 'undefined') + ? new Array(CONTAINERSIZE) + : new Uint32Array(CONTAINERSIZE); + for (var i = 0; i < CONTAINERSIZE; ++i) { + var num = 0; + var pos = CODEPOINTS_PER_ITEM; + while (pos--) + num = (num << 2) | wcwidthBMP(CODEPOINTS_PER_ITEM * i + pos); + table[i] = num; + } + return table; + } + return function (num) { + num = num | 0; + if (num < 32) + return control | 0; + if (num < 127) + return 1; + var t = table || init_table(); + if (num < 65536) + return t[num >> 4] >> ((num & 15) << 1) & 3; + return wcwidthHigh(num); + }; +})({ nul: 0, control: 0 }); + + + +},{"./Charsets":3,"./EscapeSequences":5}],8:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var INVALID_LINK_CLASS = 'xterm-invalid-link'; +var protocolClause = '(https?:\\/\\/)'; +var domainCharacterSet = '[\\da-z\\.-]+'; +var negatedDomainCharacterSet = '[^\\da-z\\.-]+'; +var domainBodyClause = '(' + domainCharacterSet + ')'; +var tldClause = '([a-z\\.]{2,6})'; +var ipClause = '((\\d{1,3}\\.){3}\\d{1,3})'; +var localHostClause = '(localhost)'; +var portClause = '(:\\d{1,5})'; +var hostClause = '((' + domainBodyClause + '\\.' + tldClause + ')|' + ipClause + '|' + localHostClause + ')' + portClause + '?'; +var pathClause = '(\\/[\\/\\w\\.\\-%~]*)*'; +var queryStringHashFragmentCharacterSet = '[0-9\\w\\[\\]\\(\\)\\/\\?\\!#@$%&\'*+,:;~\\=\\.\\-]*'; +var queryStringClause = '(\\?' + queryStringHashFragmentCharacterSet + ')?'; +var hashFragmentClause = '(#' + queryStringHashFragmentCharacterSet + ')?'; +var negatedPathCharacterSet = '[^\\/\\w\\.\\-%]+'; +var bodyClause = hostClause + pathClause + queryStringClause + hashFragmentClause; +var start = '(?:^|' + negatedDomainCharacterSet + ')('; +var end = ')($|' + negatedPathCharacterSet + ')'; +var strictUrlRegex = new RegExp(start + protocolClause + bodyClause + end); +var HYPERTEXT_LINK_MATCHER_ID = 0; +var Linkifier = (function () { + function Linkifier() { + this._nextLinkMatcherId = HYPERTEXT_LINK_MATCHER_ID; + this._rowTimeoutIds = []; + this._linkMatchers = []; + this.registerLinkMatcher(strictUrlRegex, null, { matchIndex: 1 }); + } + Linkifier.prototype.attachToDom = function (document, rows) { + this._document = document; + this._rows = rows; + }; + Linkifier.prototype.linkifyRow = function (rowIndex) { + if (!this._document) { + return; + } + var timeoutId = this._rowTimeoutIds[rowIndex]; + if (timeoutId) { + clearTimeout(timeoutId); + } + this._rowTimeoutIds[rowIndex] = setTimeout(this._linkifyRow.bind(this, rowIndex), Linkifier.TIME_BEFORE_LINKIFY); + }; + Linkifier.prototype.setHypertextLinkHandler = function (handler) { + this._linkMatchers[HYPERTEXT_LINK_MATCHER_ID].handler = handler; + }; + Linkifier.prototype.setHypertextValidationCallback = function (callback) { + this._linkMatchers[HYPERTEXT_LINK_MATCHER_ID].validationCallback = callback; + }; + Linkifier.prototype.registerLinkMatcher = function (regex, handler, options) { + if (options === void 0) { options = {}; } + if (this._nextLinkMatcherId !== HYPERTEXT_LINK_MATCHER_ID && !handler) { + throw new Error('handler must be defined'); + } + var matcher = { + id: this._nextLinkMatcherId++, + regex: regex, + handler: handler, + matchIndex: options.matchIndex, + validationCallback: options.validationCallback, + priority: options.priority || 0 + }; + this._addLinkMatcherToList(matcher); + return matcher.id; + }; + Linkifier.prototype._addLinkMatcherToList = function (matcher) { + if (this._linkMatchers.length === 0) { + this._linkMatchers.push(matcher); + return; + } + for (var i = this._linkMatchers.length - 1; i >= 0; i--) { + if (matcher.priority <= this._linkMatchers[i].priority) { + this._linkMatchers.splice(i + 1, 0, matcher); + return; + } + } + this._linkMatchers.splice(0, 0, matcher); + }; + Linkifier.prototype.deregisterLinkMatcher = function (matcherId) { + for (var i = 1; i < this._linkMatchers.length; i++) { + if (this._linkMatchers[i].id === matcherId) { + this._linkMatchers.splice(i, 1); + return true; + } + } + return false; + }; + Linkifier.prototype._linkifyRow = function (rowIndex) { + var row = this._rows[rowIndex]; + if (!row) { + return; + } + var text = row.textContent; + for (var i = 0; i < this._linkMatchers.length; i++) { + var matcher = this._linkMatchers[i]; + var linkElements = this._doLinkifyRow(row, matcher); + if (linkElements.length > 0) { + if (matcher.validationCallback) { + var _loop_1 = function (j) { + var element = linkElements[j]; + matcher.validationCallback(element.textContent, element, function (isValid) { + if (!isValid) { + element.classList.add(INVALID_LINK_CLASS); + } + }); + }; + for (var j = 0; j < linkElements.length; j++) { + _loop_1(j); + } + } + return; + } + } + }; + Linkifier.prototype._doLinkifyRow = function (row, matcher) { + var result = []; + var isHttpLinkMatcher = matcher.id === HYPERTEXT_LINK_MATCHER_ID; + var nodes = row.childNodes; + var match = row.textContent.match(matcher.regex); + if (!match || match.length === 0) { + return result; + } + var uri = match[typeof matcher.matchIndex !== 'number' ? 0 : matcher.matchIndex]; + var rowStartIndex = match.index + uri.length; + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var searchIndex = node.textContent.indexOf(uri); + if (searchIndex >= 0) { + var linkElement = this._createAnchorElement(uri, matcher.handler, isHttpLinkMatcher); + if (node.textContent.length === uri.length) { + if (node.nodeType === 3) { + this._replaceNode(node, linkElement); + } + else { + var element = node; + if (element.nodeName === 'A') { + return result; + } + element.innerHTML = ''; + element.appendChild(linkElement); + } + } + else if (node.childNodes.length > 1) { + for (var j = 0; j < node.childNodes.length; j++) { + var childNode = node.childNodes[j]; + var childSearchIndex = childNode.textContent.indexOf(uri); + if (childSearchIndex !== -1) { + this._replaceNodeSubstringWithNode(childNode, linkElement, uri, childSearchIndex); + break; + } + } + } + else { + var nodesAdded = this._replaceNodeSubstringWithNode(node, linkElement, uri, searchIndex); + i += nodesAdded; + } + result.push(linkElement); + match = row.textContent.substring(rowStartIndex).match(matcher.regex); + if (!match || match.length === 0) { + return result; + } + uri = match[typeof matcher.matchIndex !== 'number' ? 0 : matcher.matchIndex]; + rowStartIndex += match.index + uri.length; + } + } + return result; + }; + Linkifier.prototype._createAnchorElement = function (uri, handler, isHypertextLinkHandler) { + var element = this._document.createElement('a'); + element.textContent = uri; + element.draggable = false; + if (isHypertextLinkHandler) { + element.href = uri; + element.target = '_blank'; + element.addEventListener('click', function (event) { + if (handler) { + return handler(event, uri); + } + }); + } + else { + element.addEventListener('click', function (event) { + if (element.classList.contains(INVALID_LINK_CLASS)) { + return; + } + return handler(event, uri); + }); + } + return element; + }; + Linkifier.prototype._replaceNode = function (oldNode) { + var newNodes = []; + for (var _i = 1; _i < arguments.length; _i++) { + newNodes[_i - 1] = arguments[_i]; + } + var parent = oldNode.parentNode; + for (var i = 0; i < newNodes.length; i++) { + parent.insertBefore(newNodes[i], oldNode); + } + parent.removeChild(oldNode); + }; + Linkifier.prototype._replaceNodeSubstringWithNode = function (targetNode, newNode, substring, substringIndex) { + if (targetNode.childNodes.length === 1) { + targetNode = targetNode.childNodes[0]; + } + if (targetNode.nodeType !== 3) { + throw new Error('targetNode must be a text node or only contain a single text node'); + } + var fullText = targetNode.textContent; + if (substringIndex === 0) { + var rightText_1 = fullText.substring(substring.length); + var rightTextNode_1 = this._document.createTextNode(rightText_1); + this._replaceNode(targetNode, newNode, rightTextNode_1); + return 0; + } + if (substringIndex === targetNode.textContent.length - substring.length) { + var leftText_1 = fullText.substring(0, substringIndex); + var leftTextNode_1 = this._document.createTextNode(leftText_1); + this._replaceNode(targetNode, leftTextNode_1, newNode); + return 0; + } + var leftText = fullText.substring(0, substringIndex); + var leftTextNode = this._document.createTextNode(leftText); + var rightText = fullText.substring(substringIndex + substring.length); + var rightTextNode = this._document.createTextNode(rightText); + this._replaceNode(targetNode, leftTextNode, newNode, rightTextNode); + return 1; + }; + return Linkifier; +}()); +Linkifier.TIME_BEFORE_LINKIFY = 200; +exports.Linkifier = Linkifier; + + + +},{}],9:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var EscapeSequences_1 = require("./EscapeSequences"); +var Charsets_1 = require("./Charsets"); +var normalStateHandler = {}; +normalStateHandler[EscapeSequences_1.C0.BEL] = function (parser, handler) { return handler.bell(); }; +normalStateHandler[EscapeSequences_1.C0.LF] = function (parser, handler) { return handler.lineFeed(); }; +normalStateHandler[EscapeSequences_1.C0.VT] = normalStateHandler[EscapeSequences_1.C0.LF]; +normalStateHandler[EscapeSequences_1.C0.FF] = normalStateHandler[EscapeSequences_1.C0.LF]; +normalStateHandler[EscapeSequences_1.C0.CR] = function (parser, handler) { return handler.carriageReturn(); }; +normalStateHandler[EscapeSequences_1.C0.BS] = function (parser, handler) { return handler.backspace(); }; +normalStateHandler[EscapeSequences_1.C0.HT] = function (parser, handler) { return handler.tab(); }; +normalStateHandler[EscapeSequences_1.C0.SO] = function (parser, handler) { return handler.shiftOut(); }; +normalStateHandler[EscapeSequences_1.C0.SI] = function (parser, handler) { return handler.shiftIn(); }; +normalStateHandler[EscapeSequences_1.C0.ESC] = function (parser, handler) { return parser.setState(ParserState.ESCAPED); }; +var escapedStateHandler = {}; +escapedStateHandler['['] = function (parser, terminal) { + terminal.params = []; + terminal.currentParam = 0; + parser.setState(ParserState.CSI_PARAM); +}; +escapedStateHandler[']'] = function (parser, terminal) { + terminal.params = []; + terminal.currentParam = 0; + parser.setState(ParserState.OSC); +}; +escapedStateHandler['P'] = function (parser, terminal) { + terminal.params = []; + terminal.currentParam = 0; + parser.setState(ParserState.DCS); +}; +escapedStateHandler['_'] = function (parser, terminal) { + parser.setState(ParserState.IGNORE); +}; +escapedStateHandler['^'] = function (parser, terminal) { + parser.setState(ParserState.IGNORE); +}; +escapedStateHandler['c'] = function (parser, terminal) { + terminal.reset(); +}; +escapedStateHandler['E'] = function (parser, terminal) { + terminal.buffer.x = 0; + terminal.index(); + parser.setState(ParserState.NORMAL); +}; +escapedStateHandler['D'] = function (parser, terminal) { + terminal.index(); + parser.setState(ParserState.NORMAL); +}; +escapedStateHandler['M'] = function (parser, terminal) { + terminal.reverseIndex(); + parser.setState(ParserState.NORMAL); +}; +escapedStateHandler['%'] = function (parser, terminal) { + terminal.setgLevel(0); + terminal.setgCharset(0, Charsets_1.DEFAULT_CHARSET); + parser.setState(ParserState.NORMAL); + parser.skipNextChar(); +}; +escapedStateHandler[EscapeSequences_1.C0.CAN] = function (parser) { return parser.setState(ParserState.NORMAL); }; +var csiParamStateHandler = {}; +csiParamStateHandler['?'] = function (parser) { return parser.setPrefix('?'); }; +csiParamStateHandler['>'] = function (parser) { return parser.setPrefix('>'); }; +csiParamStateHandler['!'] = function (parser) { return parser.setPrefix('!'); }; +csiParamStateHandler['0'] = function (parser) { return parser.setParam(parser.getParam() * 10); }; +csiParamStateHandler['1'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 1); }; +csiParamStateHandler['2'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 2); }; +csiParamStateHandler['3'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 3); }; +csiParamStateHandler['4'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 4); }; +csiParamStateHandler['5'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 5); }; +csiParamStateHandler['6'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 6); }; +csiParamStateHandler['7'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 7); }; +csiParamStateHandler['8'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 8); }; +csiParamStateHandler['9'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 9); }; +csiParamStateHandler['$'] = function (parser) { return parser.setPostfix('$'); }; +csiParamStateHandler['"'] = function (parser) { return parser.setPostfix('"'); }; +csiParamStateHandler[' '] = function (parser) { return parser.setPostfix(' '); }; +csiParamStateHandler['\''] = function (parser) { return parser.setPostfix('\''); }; +csiParamStateHandler[';'] = function (parser) { return parser.finalizeParam(); }; +csiParamStateHandler[EscapeSequences_1.C0.CAN] = function (parser) { return parser.setState(ParserState.NORMAL); }; +var csiStateHandler = {}; +csiStateHandler['@'] = function (handler, params, prefix) { return handler.insertChars(params); }; +csiStateHandler['A'] = function (handler, params, prefix) { return handler.cursorUp(params); }; +csiStateHandler['B'] = function (handler, params, prefix) { return handler.cursorDown(params); }; +csiStateHandler['C'] = function (handler, params, prefix) { return handler.cursorForward(params); }; +csiStateHandler['D'] = function (handler, params, prefix) { return handler.cursorBackward(params); }; +csiStateHandler['E'] = function (handler, params, prefix) { return handler.cursorNextLine(params); }; +csiStateHandler['F'] = function (handler, params, prefix) { return handler.cursorPrecedingLine(params); }; +csiStateHandler['G'] = function (handler, params, prefix) { return handler.cursorCharAbsolute(params); }; +csiStateHandler['H'] = function (handler, params, prefix) { return handler.cursorPosition(params); }; +csiStateHandler['I'] = function (handler, params, prefix) { return handler.cursorForwardTab(params); }; +csiStateHandler['J'] = function (handler, params, prefix) { return handler.eraseInDisplay(params); }; +csiStateHandler['K'] = function (handler, params, prefix) { return handler.eraseInLine(params); }; +csiStateHandler['L'] = function (handler, params, prefix) { return handler.insertLines(params); }; +csiStateHandler['M'] = function (handler, params, prefix) { return handler.deleteLines(params); }; +csiStateHandler['P'] = function (handler, params, prefix) { return handler.deleteChars(params); }; +csiStateHandler['S'] = function (handler, params, prefix) { return handler.scrollUp(params); }; +csiStateHandler['T'] = function (handler, params, prefix) { + if (params.length < 2 && !prefix) { + handler.scrollDown(params); + } +}; +csiStateHandler['X'] = function (handler, params, prefix) { return handler.eraseChars(params); }; +csiStateHandler['Z'] = function (handler, params, prefix) { return handler.cursorBackwardTab(params); }; +csiStateHandler['`'] = function (handler, params, prefix) { return handler.charPosAbsolute(params); }; +csiStateHandler['a'] = function (handler, params, prefix) { return handler.HPositionRelative(params); }; +csiStateHandler['b'] = function (handler, params, prefix) { return handler.repeatPrecedingCharacter(params); }; +csiStateHandler['c'] = function (handler, params, prefix) { return handler.sendDeviceAttributes(params); }; +csiStateHandler['d'] = function (handler, params, prefix) { return handler.linePosAbsolute(params); }; +csiStateHandler['e'] = function (handler, params, prefix) { return handler.VPositionRelative(params); }; +csiStateHandler['f'] = function (handler, params, prefix) { return handler.HVPosition(params); }; +csiStateHandler['g'] = function (handler, params, prefix) { return handler.tabClear(params); }; +csiStateHandler['h'] = function (handler, params, prefix) { return handler.setMode(params); }; +csiStateHandler['l'] = function (handler, params, prefix) { return handler.resetMode(params); }; +csiStateHandler['m'] = function (handler, params, prefix) { return handler.charAttributes(params); }; +csiStateHandler['n'] = function (handler, params, prefix) { return handler.deviceStatus(params); }; +csiStateHandler['p'] = function (handler, params, prefix) { + switch (prefix) { + case '!': + handler.softReset(params); + break; + } +}; +csiStateHandler['q'] = function (handler, params, prefix, postfix) { + if (postfix === ' ') { + handler.setCursorStyle(params); + } +}; +csiStateHandler['r'] = function (handler, params) { return handler.setScrollRegion(params); }; +csiStateHandler['s'] = function (handler, params) { return handler.saveCursor(params); }; +csiStateHandler['u'] = function (handler, params) { return handler.restoreCursor(params); }; +csiStateHandler[EscapeSequences_1.C0.CAN] = function (handler, params, prefix, postfix, parser) { return parser.setState(ParserState.NORMAL); }; +var ParserState; +(function (ParserState) { + ParserState[ParserState["NORMAL"] = 0] = "NORMAL"; + ParserState[ParserState["ESCAPED"] = 1] = "ESCAPED"; + ParserState[ParserState["CSI_PARAM"] = 2] = "CSI_PARAM"; + ParserState[ParserState["CSI"] = 3] = "CSI"; + ParserState[ParserState["OSC"] = 4] = "OSC"; + ParserState[ParserState["CHARSET"] = 5] = "CHARSET"; + ParserState[ParserState["DCS"] = 6] = "DCS"; + ParserState[ParserState["IGNORE"] = 7] = "IGNORE"; +})(ParserState || (ParserState = {})); +var Parser = (function () { + function Parser(_inputHandler, _terminal) { + this._inputHandler = _inputHandler; + this._terminal = _terminal; + this._state = ParserState.NORMAL; + } + Parser.prototype.parse = function (data) { + var l = data.length, j, cs, ch, code, low; + if (this._terminal.debug) { + this._terminal.log('data: ' + data); + } + this._position = 0; + if (this._terminal.surrogate_high) { + data = this._terminal.surrogate_high + data; + this._terminal.surrogate_high = ''; + } + for (; this._position < l; this._position++) { + ch = data[this._position]; + code = data.charCodeAt(this._position); + if (0xD800 <= code && code <= 0xDBFF) { + low = data.charCodeAt(this._position + 1); + if (isNaN(low)) { + this._terminal.surrogate_high = ch; + continue; + } + code = ((code - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000; + ch += data.charAt(this._position + 1); + } + if (0xDC00 <= code && code <= 0xDFFF) + continue; + switch (this._state) { + case ParserState.NORMAL: + if (ch in normalStateHandler) { + normalStateHandler[ch](this, this._inputHandler); + } + else { + this._inputHandler.addChar(ch, code); + } + break; + case ParserState.ESCAPED: + if (ch in escapedStateHandler) { + escapedStateHandler[ch](this, this._terminal); + break; + } + switch (ch) { + case '(': + case ')': + case '*': + case '+': + case '-': + case '.': + switch (ch) { + case '(': + this._terminal.gcharset = 0; + break; + case ')': + this._terminal.gcharset = 1; + break; + case '*': + this._terminal.gcharset = 2; + break; + case '+': + this._terminal.gcharset = 3; + break; + case '-': + this._terminal.gcharset = 1; + break; + case '.': + this._terminal.gcharset = 2; + break; + } + this._state = ParserState.CHARSET; + break; + case '/': + this._terminal.gcharset = 3; + this._state = ParserState.CHARSET; + this._position--; + break; + case 'N': + break; + case 'O': + break; + case 'n': + this._terminal.setgLevel(2); + break; + case 'o': + this._terminal.setgLevel(3); + break; + case '|': + this._terminal.setgLevel(3); + break; + case '}': + this._terminal.setgLevel(2); + break; + case '~': + this._terminal.setgLevel(1); + break; + case '7': + this._inputHandler.saveCursor(); + this._state = ParserState.NORMAL; + break; + case '8': + this._inputHandler.restoreCursor(); + this._state = ParserState.NORMAL; + break; + case '#': + this._state = ParserState.NORMAL; + this._position++; + break; + case 'H': + this._terminal.tabSet(); + this._state = ParserState.NORMAL; + break; + case '=': + this._terminal.log('Serial port requested application keypad.'); + this._terminal.applicationKeypad = true; + this._terminal.viewport.syncScrollArea(); + this._state = ParserState.NORMAL; + break; + case '>': + this._terminal.log('Switching back to normal keypad.'); + this._terminal.applicationKeypad = false; + this._terminal.viewport.syncScrollArea(); + this._state = ParserState.NORMAL; + break; + default: + this._state = ParserState.NORMAL; + this._terminal.error('Unknown ESC control: %s.', ch); + break; + } + break; + case ParserState.CHARSET: + if (ch in Charsets_1.CHARSETS) { + cs = Charsets_1.CHARSETS[ch]; + if (ch === '/') { + this.skipNextChar(); + } + } + else { + cs = Charsets_1.DEFAULT_CHARSET; + } + this._terminal.setgCharset(this._terminal.gcharset, cs); + this._terminal.gcharset = null; + this._state = ParserState.NORMAL; + break; + case ParserState.OSC: + if (ch === EscapeSequences_1.C0.ESC || ch === EscapeSequences_1.C0.BEL) { + if (ch === EscapeSequences_1.C0.ESC) + this._position++; + this._terminal.params.push(this._terminal.currentParam); + switch (this._terminal.params[0]) { + case 0: + case 1: + case 2: + if (this._terminal.params[1]) { + this._terminal.title = this._terminal.params[1]; + this._terminal.handleTitle(this._terminal.title); + } + break; + case 3: + break; + case 4: + case 5: + break; + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + break; + case 46: + break; + case 50: + break; + case 51: + break; + case 52: + break; + case 104: + case 105: + case 110: + case 111: + case 112: + case 113: + case 114: + case 115: + case 116: + case 117: + case 118: + break; + } + this._terminal.params = []; + this._terminal.currentParam = 0; + this._state = ParserState.NORMAL; + } + else { + if (!this._terminal.params.length) { + if (ch >= '0' && ch <= '9') { + this._terminal.currentParam = + this._terminal.currentParam * 10 + ch.charCodeAt(0) - 48; + } + else if (ch === ';') { + this._terminal.params.push(this._terminal.currentParam); + this._terminal.currentParam = ''; + } + } + else { + this._terminal.currentParam += ch; + } + } + break; + case ParserState.CSI_PARAM: + if (ch in csiParamStateHandler) { + csiParamStateHandler[ch](this); + break; + } + this.finalizeParam(); + this._state = ParserState.CSI; + case ParserState.CSI: + if (ch in csiStateHandler) { + if (this._terminal.debug) { + this._terminal.log("CSI " + (this._terminal.prefix ? this._terminal.prefix : '') + " " + (this._terminal.params ? this._terminal.params.join(';') : '') + " " + (this._terminal.postfix ? this._terminal.postfix : '') + " " + ch); + } + csiStateHandler[ch](this._inputHandler, this._terminal.params, this._terminal.prefix, this._terminal.postfix, this); + } + else { + this._terminal.error('Unknown CSI code: %s.', ch); + } + this._state = ParserState.NORMAL; + this._terminal.prefix = ''; + this._terminal.postfix = ''; + break; + case ParserState.DCS: + if (ch === EscapeSequences_1.C0.ESC || ch === EscapeSequences_1.C0.BEL) { + if (ch === EscapeSequences_1.C0.ESC) + this._position++; + var pt = void 0; + var valid = void 0; + switch (this._terminal.prefix) { + case '': + break; + case '$q': + pt = this._terminal.currentParam; + valid = false; + switch (pt) { + case '"q': + pt = '0"q'; + break; + case '"p': + pt = '61"p'; + break; + case 'r': + pt = '' + + (this._terminal.buffer.scrollTop + 1) + + ';' + + (this._terminal.buffer.scrollBottom + 1) + + 'r'; + break; + case 'm': + pt = '0m'; + break; + default: + this._terminal.error('Unknown DCS Pt: %s.', pt); + pt = ''; + break; + } + this._terminal.send(EscapeSequences_1.C0.ESC + 'P' + +valid + '$r' + pt + EscapeSequences_1.C0.ESC + '\\'); + break; + case '+p': + break; + case '+q': + pt = this._terminal.currentParam; + valid = false; + this._terminal.send(EscapeSequences_1.C0.ESC + 'P' + +valid + '+r' + pt + EscapeSequences_1.C0.ESC + '\\'); + break; + default: + this._terminal.error('Unknown DCS prefix: %s.', this._terminal.prefix); + break; + } + this._terminal.currentParam = 0; + this._terminal.prefix = ''; + this._state = ParserState.NORMAL; + } + else if (!this._terminal.currentParam) { + if (!this._terminal.prefix && ch !== '$' && ch !== '+') { + this._terminal.currentParam = ch; + } + else if (this._terminal.prefix.length === 2) { + this._terminal.currentParam = ch; + } + else { + this._terminal.prefix += ch; + } + } + else { + this._terminal.currentParam += ch; + } + break; + case ParserState.IGNORE: + if (ch === EscapeSequences_1.C0.ESC || ch === EscapeSequences_1.C0.BEL) { + if (ch === EscapeSequences_1.C0.ESC) + this._position++; + this._state = ParserState.NORMAL; + } + break; + } + } + return this._state; + }; + Parser.prototype.setState = function (state) { + this._state = state; + }; + Parser.prototype.setPrefix = function (prefix) { + this._terminal.prefix = prefix; + }; + Parser.prototype.setPostfix = function (postfix) { + this._terminal.postfix = postfix; + }; + Parser.prototype.setParam = function (param) { + this._terminal.currentParam = param; + }; + Parser.prototype.getParam = function () { + return this._terminal.currentParam; + }; + Parser.prototype.finalizeParam = function () { + this._terminal.params.push(this._terminal.currentParam); + this._terminal.currentParam = 0; + }; + Parser.prototype.skipNextChar = function () { + this._position++; + }; + return Parser; +}()); +exports.Parser = Parser; + + + +},{"./Charsets":3,"./EscapeSequences":5}],10:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var DomElementObjectPool_1 = require("./utils/DomElementObjectPool"); +var MAX_REFRESH_FRAME_SKIP = 5; +var FLAGS; +(function (FLAGS) { + FLAGS[FLAGS["BOLD"] = 1] = "BOLD"; + FLAGS[FLAGS["UNDERLINE"] = 2] = "UNDERLINE"; + FLAGS[FLAGS["BLINK"] = 4] = "BLINK"; + FLAGS[FLAGS["INVERSE"] = 8] = "INVERSE"; + FLAGS[FLAGS["INVISIBLE"] = 16] = "INVISIBLE"; +})(FLAGS || (FLAGS = {})); +; +var brokenBold = null; +var Renderer = (function () { + function Renderer(_terminal) { + this._terminal = _terminal; + this._refreshRowsQueue = []; + this._refreshFramesSkipped = 0; + this._refreshAnimationFrame = null; + this._spanElementObjectPool = new DomElementObjectPool_1.DomElementObjectPool('span'); + if (brokenBold === null) { + brokenBold = checkBoldBroken(this._terminal.element); + } + this._spanElementObjectPool = new DomElementObjectPool_1.DomElementObjectPool('span'); + } + Renderer.prototype.queueRefresh = function (start, end) { + this._refreshRowsQueue.push({ start: start, end: end }); + if (!this._refreshAnimationFrame) { + this._refreshAnimationFrame = window.requestAnimationFrame(this._refreshLoop.bind(this)); + } + }; + Renderer.prototype._refreshLoop = function () { + var skipFrame = this._terminal.writeBuffer.length > 0 && this._refreshFramesSkipped++ <= MAX_REFRESH_FRAME_SKIP; + if (skipFrame) { + this._refreshAnimationFrame = window.requestAnimationFrame(this._refreshLoop.bind(this)); + return; + } + this._refreshFramesSkipped = 0; + var start; + var end; + if (this._refreshRowsQueue.length > 4) { + start = 0; + end = this._terminal.rows - 1; + } + else { + start = this._refreshRowsQueue[0].start; + end = this._refreshRowsQueue[0].end; + for (var i = 1; i < this._refreshRowsQueue.length; i++) { + if (this._refreshRowsQueue[i].start < start) { + start = this._refreshRowsQueue[i].start; + } + if (this._refreshRowsQueue[i].end > end) { + end = this._refreshRowsQueue[i].end; + } + } + } + this._refreshRowsQueue = []; + this._refreshAnimationFrame = null; + this._refresh(start, end); + }; + Renderer.prototype._refresh = function (start, end) { + var parent; + if (end - start >= this._terminal.rows / 2) { + parent = this._terminal.element.parentNode; + if (parent) { + this._terminal.element.removeChild(this._terminal.rowContainer); + } + } + var width = this._terminal.cols; + var y = start; + if (end >= this._terminal.rows) { + this._terminal.log('`end` is too large. Most likely a bad CSR.'); + end = this._terminal.rows - 1; + } + for (; y <= end; y++) { + var row = y + this._terminal.buffer.ydisp; + var line = this._terminal.buffer.lines.get(row); + var x = void 0; + if (this._terminal.buffer.y === y - (this._terminal.buffer.ybase - this._terminal.buffer.ydisp) && + this._terminal.cursorState && + !this._terminal.cursorHidden) { + x = this._terminal.buffer.x; + } + else { + x = -1; + } + var attr = this._terminal.defAttr; + var documentFragment = document.createDocumentFragment(); + var innerHTML = ''; + var currentElement = void 0; + while (this._terminal.children[y].children.length) { + var child = this._terminal.children[y].children[0]; + this._terminal.children[y].removeChild(child); + this._spanElementObjectPool.release(child); + } + for (var i = 0; i < width; i++) { + var data = line[i][0]; + var ch = line[i][1]; + var ch_width = line[i][2]; + var isCursor = i === x; + if (!ch_width) { + continue; + } + if (data !== attr || isCursor) { + if (attr !== this._terminal.defAttr && !isCursor) { + if (innerHTML) { + currentElement.innerHTML = innerHTML; + innerHTML = ''; + } + documentFragment.appendChild(currentElement); + currentElement = null; + } + if (data !== this._terminal.defAttr || isCursor) { + if (innerHTML && !currentElement) { + currentElement = this._spanElementObjectPool.acquire(); + } + if (currentElement) { + if (innerHTML) { + currentElement.innerHTML = innerHTML; + innerHTML = ''; + } + documentFragment.appendChild(currentElement); + } + currentElement = this._spanElementObjectPool.acquire(); + var bg = data & 0x1ff; + var fg = (data >> 9) & 0x1ff; + var flags = data >> 18; + if (isCursor) { + currentElement.classList.add('reverse-video'); + currentElement.classList.add('terminal-cursor'); + } + if (flags & FLAGS.BOLD) { + if (!brokenBold) { + currentElement.classList.add('xterm-bold'); + } + if (fg < 8) { + fg += 8; + } + } + if (flags & FLAGS.UNDERLINE) { + currentElement.classList.add('xterm-underline'); + } + if (flags & FLAGS.BLINK) { + currentElement.classList.add('xterm-blink'); + } + if (flags & FLAGS.INVERSE) { + var temp = bg; + bg = fg; + fg = temp; + if ((flags & 1) && fg < 8) { + fg += 8; + } + } + if (flags & FLAGS.INVISIBLE && !isCursor) { + currentElement.classList.add('xterm-hidden'); + } + if (flags & FLAGS.INVERSE) { + if (bg === 257) { + bg = 15; + } + if (fg === 256) { + fg = 0; + } + } + if (bg < 256) { + currentElement.classList.add("xterm-bg-color-" + bg); + } + if (fg < 256) { + currentElement.classList.add("xterm-color-" + fg); + } + } + } + if (ch_width === 2) { + innerHTML += "" + ch + ""; + } + else if (ch.charCodeAt(0) > 255) { + innerHTML += "" + ch + ""; + } + else { + switch (ch) { + case '&': + innerHTML += '&'; + break; + case '<': + innerHTML += '<'; + break; + case '>': + innerHTML += '>'; + break; + default: + if (ch <= ' ') { + innerHTML += ' '; + } + else { + innerHTML += ch; + } + break; + } + } + attr = isCursor ? -1 : data; + } + if (innerHTML && !currentElement) { + currentElement = this._spanElementObjectPool.acquire(); + } + if (currentElement) { + if (innerHTML) { + currentElement.innerHTML = innerHTML; + innerHTML = ''; + } + documentFragment.appendChild(currentElement); + currentElement = null; + } + this._terminal.children[y].appendChild(documentFragment); + } + if (parent) { + this._terminal.element.appendChild(this._terminal.rowContainer); + } + this._terminal.emit('refresh', { element: this._terminal.element, start: start, end: end }); + }; + ; + Renderer.prototype.refreshSelection = function (start, end) { + while (this._terminal.selectionContainer.children.length) { + this._terminal.selectionContainer.removeChild(this._terminal.selectionContainer.children[0]); + } + if (!start || !end) { + return; + } + var viewportStartRow = start[1] - this._terminal.buffer.ydisp; + var viewportEndRow = end[1] - this._terminal.buffer.ydisp; + var viewportCappedStartRow = Math.max(viewportStartRow, 0); + var viewportCappedEndRow = Math.min(viewportEndRow, this._terminal.rows - 1); + if (viewportCappedStartRow >= this._terminal.rows || viewportCappedEndRow < 0) { + return; + } + var documentFragment = document.createDocumentFragment(); + var startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0; + var endCol = viewportCappedStartRow === viewportCappedEndRow ? end[0] : this._terminal.cols; + documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol)); + var middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1; + documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._terminal.cols, middleRowsCount)); + if (viewportCappedStartRow !== viewportCappedEndRow) { + var endCol_1 = viewportEndRow === viewportCappedEndRow ? end[0] : this._terminal.cols; + documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, endCol_1)); + } + this._terminal.selectionContainer.appendChild(documentFragment); + }; + Renderer.prototype._createSelectionElement = function (row, colStart, colEnd, rowCount) { + if (rowCount === void 0) { rowCount = 1; } + var element = document.createElement('div'); + element.style.height = rowCount * this._terminal.charMeasure.height + "px"; + element.style.top = row * this._terminal.charMeasure.height + "px"; + element.style.left = colStart * this._terminal.charMeasure.width + "px"; + element.style.width = this._terminal.charMeasure.width * (colEnd - colStart) + "px"; + return element; + }; + return Renderer; +}()); +exports.Renderer = Renderer; +function checkBoldBroken(terminal) { + var document = terminal.ownerDocument; + var el = document.createElement('span'); + el.innerHTML = 'hello world'; + terminal.appendChild(el); + var w1 = el.offsetWidth; + var h1 = el.offsetHeight; + el.style.fontWeight = 'bold'; + var w2 = el.offsetWidth; + var h2 = el.offsetHeight; + terminal.removeChild(el); + return w1 !== w2 || h1 !== h2; +} + + + +},{"./utils/DomElementObjectPool":19}],11:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Mouse = require("./utils/Mouse"); +var Browser = require("./utils/Browser"); +var EventEmitter_1 = require("./EventEmitter"); +var SelectionModel_1 = require("./SelectionModel"); +var BufferLine_1 = require("./utils/BufferLine"); +var DRAG_SCROLL_MAX_THRESHOLD = 50; +var DRAG_SCROLL_MAX_SPEED = 15; +var DRAG_SCROLL_INTERVAL = 50; +var WORD_SEPARATORS = ' ()[]{}\'"'; +var LINE_DATA_CHAR_INDEX = 1; +var LINE_DATA_WIDTH_INDEX = 2; +var NON_BREAKING_SPACE_CHAR = String.fromCharCode(160); +var ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g'); +var SelectionMode; +(function (SelectionMode) { + SelectionMode[SelectionMode["NORMAL"] = 0] = "NORMAL"; + SelectionMode[SelectionMode["WORD"] = 1] = "WORD"; + SelectionMode[SelectionMode["LINE"] = 2] = "LINE"; +})(SelectionMode || (SelectionMode = {})); +var SelectionManager = (function (_super) { + __extends(SelectionManager, _super); + function SelectionManager(_terminal, _buffer, _rowContainer, _charMeasure) { + var _this = _super.call(this) || this; + _this._terminal = _terminal; + _this._buffer = _buffer; + _this._rowContainer = _rowContainer; + _this._charMeasure = _charMeasure; + _this._enabled = true; + _this._initListeners(); + _this.enable(); + _this._model = new SelectionModel_1.SelectionModel(_terminal); + _this._activeSelectionMode = SelectionMode.NORMAL; + return _this; + } + SelectionManager.prototype._initListeners = function () { + var _this = this; + this._mouseMoveListener = function (event) { return _this._onMouseMove(event); }; + this._mouseUpListener = function (event) { return _this._onMouseUp(event); }; + this._rowContainer.addEventListener('mousedown', function (event) { return _this._onMouseDown(event); }); + this._buffer.on('trim', function (amount) { return _this._onTrim(amount); }); + }; + SelectionManager.prototype.disable = function () { + this.clearSelection(); + this._enabled = false; + }; + SelectionManager.prototype.enable = function () { + this._enabled = true; + }; + SelectionManager.prototype.setBuffer = function (buffer) { + this._buffer = buffer; + this.clearSelection(); + }; + Object.defineProperty(SelectionManager.prototype, "selectionStart", { + get: function () { return this._model.finalSelectionStart; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SelectionManager.prototype, "selectionEnd", { + get: function () { return this._model.finalSelectionEnd; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SelectionManager.prototype, "hasSelection", { + get: function () { + var start = this._model.finalSelectionStart; + var end = this._model.finalSelectionEnd; + if (!start || !end) { + return false; + } + return start[0] !== end[0] || start[1] !== end[1]; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SelectionManager.prototype, "selectionText", { + get: function () { + var start = this._model.finalSelectionStart; + var end = this._model.finalSelectionEnd; + if (!start || !end) { + return ''; + } + var startRowEndCol = start[1] === end[1] ? end[0] : null; + var result = []; + result.push(BufferLine_1.translateBufferLineToString(this._buffer.get(start[1]), true, start[0], startRowEndCol)); + for (var i = start[1] + 1; i <= end[1] - 1; i++) { + var bufferLine = this._buffer.get(i); + var lineText = BufferLine_1.translateBufferLineToString(bufferLine, true); + if (bufferLine.isWrapped) { + result[result.length - 1] += lineText; + } + else { + result.push(lineText); + } + } + if (start[1] !== end[1]) { + var bufferLine = this._buffer.get(end[1]); + var lineText = BufferLine_1.translateBufferLineToString(bufferLine, true, 0, end[0]); + if (bufferLine.isWrapped) { + result[result.length - 1] += lineText; + } + else { + result.push(lineText); + } + } + var formattedResult = result.map(function (line) { + return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' '); + }).join(Browser.isMSWindows ? '\r\n' : '\n'); + return formattedResult; + }, + enumerable: true, + configurable: true + }); + SelectionManager.prototype.clearSelection = function () { + this._model.clearSelection(); + this._removeMouseDownListeners(); + this.refresh(); + }; + SelectionManager.prototype.refresh = function (isNewSelection) { + var _this = this; + if (!this._refreshAnimationFrame) { + this._refreshAnimationFrame = window.requestAnimationFrame(function () { return _this._refresh(); }); + } + if (Browser.isLinux && isNewSelection) { + var selectionText = this.selectionText; + if (selectionText.length) { + this.emit('newselection', this.selectionText); + } + } + }; + SelectionManager.prototype._refresh = function () { + this._refreshAnimationFrame = null; + this.emit('refresh', { start: this._model.finalSelectionStart, end: this._model.finalSelectionEnd }); + }; + SelectionManager.prototype.selectAll = function () { + this._model.isSelectAllActive = true; + this.refresh(); + }; + SelectionManager.prototype._onTrim = function (amount) { + var needsRefresh = this._model.onTrim(amount); + if (needsRefresh) { + this.refresh(); + } + }; + SelectionManager.prototype._getMouseBufferCoords = function (event) { + var coords = Mouse.getCoords(event, this._rowContainer, this._charMeasure, this._terminal.cols, this._terminal.rows, true); + if (!coords) { + return null; + } + coords[0]--; + coords[1]--; + coords[1] += this._terminal.buffer.ydisp; + return coords; + }; + SelectionManager.prototype._getMouseEventScrollAmount = function (event) { + var offset = Mouse.getCoordsRelativeToElement(event, this._rowContainer)[1]; + var terminalHeight = this._terminal.rows * this._charMeasure.height; + if (offset >= 0 && offset <= terminalHeight) { + return 0; + } + if (offset > terminalHeight) { + offset -= terminalHeight; + } + offset = Math.min(Math.max(offset, -DRAG_SCROLL_MAX_THRESHOLD), DRAG_SCROLL_MAX_THRESHOLD); + offset /= DRAG_SCROLL_MAX_THRESHOLD; + return (offset / Math.abs(offset)) + Math.round(offset * (DRAG_SCROLL_MAX_SPEED - 1)); + }; + SelectionManager.prototype._onMouseDown = function (event) { + if (event.button === 2 && this.hasSelection) { + event.stopPropagation(); + return; + } + if (event.button !== 0) { + return; + } + if (!this._enabled) { + var shouldForceSelection = Browser.isMac && event.altKey; + if (!shouldForceSelection) { + return; + } + event.stopPropagation(); + } + event.preventDefault(); + this._dragScrollAmount = 0; + if (this._enabled && event.shiftKey) { + this._onIncrementalClick(event); + } + else { + if (event.detail === 1) { + this._onSingleClick(event); + } + else if (event.detail === 2) { + this._onDoubleClick(event); + } + else if (event.detail === 3) { + this._onTripleClick(event); + } + } + this._addMouseDownListeners(); + this.refresh(true); + }; + SelectionManager.prototype._addMouseDownListeners = function () { + var _this = this; + this._rowContainer.ownerDocument.addEventListener('mousemove', this._mouseMoveListener); + this._rowContainer.ownerDocument.addEventListener('mouseup', this._mouseUpListener); + this._dragScrollIntervalTimer = setInterval(function () { return _this._dragScroll(); }, DRAG_SCROLL_INTERVAL); + }; + SelectionManager.prototype._removeMouseDownListeners = function () { + this._rowContainer.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener); + this._rowContainer.ownerDocument.removeEventListener('mouseup', this._mouseUpListener); + clearInterval(this._dragScrollIntervalTimer); + this._dragScrollIntervalTimer = null; + }; + SelectionManager.prototype._onIncrementalClick = function (event) { + if (this._model.selectionStart) { + this._model.selectionEnd = this._getMouseBufferCoords(event); + } + }; + SelectionManager.prototype._onSingleClick = function (event) { + this._model.selectionStartLength = 0; + this._model.isSelectAllActive = false; + this._activeSelectionMode = SelectionMode.NORMAL; + this._model.selectionStart = this._getMouseBufferCoords(event); + if (!this._model.selectionStart) { + return; + } + this._model.selectionEnd = null; + var line = this._buffer.get(this._model.selectionStart[1]); + if (!line) { + return; + } + var char = line[this._model.selectionStart[0]]; + if (char[LINE_DATA_WIDTH_INDEX] === 0) { + this._model.selectionStart[0]++; + } + }; + SelectionManager.prototype._onDoubleClick = function (event) { + var coords = this._getMouseBufferCoords(event); + if (coords) { + this._activeSelectionMode = SelectionMode.WORD; + this._selectWordAt(coords); + } + }; + SelectionManager.prototype._onTripleClick = function (event) { + var coords = this._getMouseBufferCoords(event); + if (coords) { + this._activeSelectionMode = SelectionMode.LINE; + this._selectLineAt(coords[1]); + } + }; + SelectionManager.prototype._onMouseMove = function (event) { + var previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null; + this._model.selectionEnd = this._getMouseBufferCoords(event); + if (!this._model.selectionEnd) { + this.refresh(true); + return; + } + if (this._activeSelectionMode === SelectionMode.LINE) { + if (this._model.selectionEnd[1] < this._model.selectionStart[1]) { + this._model.selectionEnd[0] = 0; + } + else { + this._model.selectionEnd[0] = this._terminal.cols; + } + } + else if (this._activeSelectionMode === SelectionMode.WORD) { + this._selectToWordAt(this._model.selectionEnd); + } + this._dragScrollAmount = this._getMouseEventScrollAmount(event); + if (this._dragScrollAmount > 0) { + this._model.selectionEnd[0] = this._terminal.cols - 1; + } + else if (this._dragScrollAmount < 0) { + this._model.selectionEnd[0] = 0; + } + if (this._model.selectionEnd[1] < this._buffer.length) { + var char = this._buffer.get(this._model.selectionEnd[1])[this._model.selectionEnd[0]]; + if (char && char[2] === 0) { + this._model.selectionEnd[0]++; + } + } + if (!previousSelectionEnd || + previousSelectionEnd[0] !== this._model.selectionEnd[0] || + previousSelectionEnd[1] !== this._model.selectionEnd[1]) { + this.refresh(true); + } + }; + SelectionManager.prototype._dragScroll = function () { + if (this._dragScrollAmount) { + this._terminal.scrollDisp(this._dragScrollAmount, false); + if (this._dragScrollAmount > 0) { + this._model.selectionEnd = [this._terminal.cols - 1, this._terminal.buffer.ydisp + this._terminal.rows]; + } + else { + this._model.selectionEnd = [0, this._terminal.buffer.ydisp]; + } + this.refresh(); + } + }; + SelectionManager.prototype._onMouseUp = function (event) { + this._removeMouseDownListeners(); + }; + SelectionManager.prototype._convertViewportColToCharacterIndex = function (bufferLine, coords) { + var charIndex = coords[0]; + for (var i = 0; coords[0] >= i; i++) { + var char = bufferLine[i]; + if (char[LINE_DATA_WIDTH_INDEX] === 0) { + charIndex--; + } + } + return charIndex; + }; + SelectionManager.prototype.setSelection = function (col, row, length) { + this._model.clearSelection(); + this._removeMouseDownListeners(); + this._model.selectionStart = [col, row]; + this._model.selectionStartLength = length; + this.refresh(); + }; + SelectionManager.prototype._getWordAt = function (coords) { + var bufferLine = this._buffer.get(coords[1]); + if (!bufferLine) { + return null; + } + var line = BufferLine_1.translateBufferLineToString(bufferLine, false); + var endIndex = this._convertViewportColToCharacterIndex(bufferLine, coords); + var startIndex = endIndex; + var charOffset = coords[0] - startIndex; + var leftWideCharCount = 0; + var rightWideCharCount = 0; + if (line.charAt(startIndex) === ' ') { + while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') { + startIndex--; + } + while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') { + endIndex++; + } + } + else { + var startCol = coords[0]; + var endCol = coords[0]; + if (bufferLine[startCol][LINE_DATA_WIDTH_INDEX] === 0) { + leftWideCharCount++; + startCol--; + } + if (bufferLine[endCol][LINE_DATA_WIDTH_INDEX] === 2) { + rightWideCharCount++; + endCol++; + } + while (startIndex > 0 && !this._isCharWordSeparator(line.charAt(startIndex - 1))) { + if (bufferLine[startCol - 1][LINE_DATA_WIDTH_INDEX] === 0) { + leftWideCharCount++; + startCol--; + } + startIndex--; + startCol--; + } + while (endIndex + 1 < line.length && !this._isCharWordSeparator(line.charAt(endIndex + 1))) { + if (bufferLine[endCol + 1][LINE_DATA_WIDTH_INDEX] === 2) { + rightWideCharCount++; + endCol++; + } + endIndex++; + endCol++; + } + } + var start = startIndex + charOffset - leftWideCharCount; + var length = Math.min(endIndex - startIndex + leftWideCharCount + rightWideCharCount + 1, this._terminal.cols); + return { start: start, length: length }; + }; + SelectionManager.prototype._selectWordAt = function (coords) { + var wordPosition = this._getWordAt(coords); + if (wordPosition) { + this._model.selectionStart = [wordPosition.start, coords[1]]; + this._model.selectionStartLength = wordPosition.length; + } + }; + SelectionManager.prototype._selectToWordAt = function (coords) { + var wordPosition = this._getWordAt(coords); + if (wordPosition) { + this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : (wordPosition.start + wordPosition.length), coords[1]]; + } + }; + SelectionManager.prototype._isCharWordSeparator = function (char) { + return WORD_SEPARATORS.indexOf(char) >= 0; + }; + SelectionManager.prototype._selectLineAt = function (line) { + this._model.selectionStart = [0, line]; + this._model.selectionStartLength = this._terminal.cols; + }; + return SelectionManager; +}(EventEmitter_1.EventEmitter)); +exports.SelectionManager = SelectionManager; + + + +},{"./EventEmitter":6,"./SelectionModel":12,"./utils/Browser":15,"./utils/BufferLine":16,"./utils/Mouse":21}],12:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var SelectionModel = (function () { + function SelectionModel(_terminal) { + this._terminal = _terminal; + this.clearSelection(); + } + SelectionModel.prototype.clearSelection = function () { + this.selectionStart = null; + this.selectionEnd = null; + this.isSelectAllActive = false; + this.selectionStartLength = 0; + }; + Object.defineProperty(SelectionModel.prototype, "finalSelectionStart", { + get: function () { + if (this.isSelectAllActive) { + return [0, 0]; + } + if (!this.selectionEnd || !this.selectionStart) { + return this.selectionStart; + } + return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SelectionModel.prototype, "finalSelectionEnd", { + get: function () { + if (this.isSelectAllActive) { + return [this._terminal.cols, this._terminal.buffer.ybase + this._terminal.rows - 1]; + } + if (!this.selectionStart) { + return null; + } + if (!this.selectionEnd || this.areSelectionValuesReversed()) { + return [this.selectionStart[0] + this.selectionStartLength, this.selectionStart[1]]; + } + if (this.selectionStartLength) { + if (this.selectionEnd[1] === this.selectionStart[1]) { + return [Math.max(this.selectionStart[0] + this.selectionStartLength, this.selectionEnd[0]), this.selectionEnd[1]]; + } + } + return this.selectionEnd; + }, + enumerable: true, + configurable: true + }); + SelectionModel.prototype.areSelectionValuesReversed = function () { + var start = this.selectionStart; + var end = this.selectionEnd; + return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]); + }; + SelectionModel.prototype.onTrim = function (amount) { + if (this.selectionStart) { + this.selectionStart[1] -= amount; + } + if (this.selectionEnd) { + this.selectionEnd[1] -= amount; + } + if (this.selectionEnd && this.selectionEnd[1] < 0) { + this.clearSelection(); + return true; + } + if (this.selectionStart && this.selectionStart[1] < 0) { + this.selectionStart[1] = 0; + } + return false; + }; + return SelectionModel; +}()); +exports.SelectionModel = SelectionModel; + + + +},{}],13:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Viewport = (function () { + function Viewport(terminal, viewportElement, scrollArea, charMeasure) { + var _this = this; + this.terminal = terminal; + this.viewportElement = viewportElement; + this.scrollArea = scrollArea; + this.charMeasure = charMeasure; + this.currentRowHeight = 0; + this.lastRecordedBufferLength = 0; + this.lastRecordedViewportHeight = 0; + this.terminal.on('scroll', this.syncScrollArea.bind(this)); + this.terminal.on('resize', this.syncScrollArea.bind(this)); + this.viewportElement.addEventListener('scroll', this.onScroll.bind(this)); + setTimeout(function () { return _this.syncScrollArea(); }, 0); + } + Viewport.prototype.refresh = function () { + if (this.charMeasure.height > 0) { + var rowHeightChanged = this.charMeasure.height !== this.currentRowHeight; + if (rowHeightChanged) { + this.currentRowHeight = this.charMeasure.height; + this.viewportElement.style.lineHeight = this.charMeasure.height + 'px'; + this.terminal.rowContainer.style.lineHeight = this.charMeasure.height + 'px'; + } + var viewportHeightChanged = this.lastRecordedViewportHeight !== this.terminal.rows; + if (rowHeightChanged || viewportHeightChanged) { + this.lastRecordedViewportHeight = this.terminal.rows; + this.viewportElement.style.height = this.charMeasure.height * this.terminal.rows + 'px'; + this.terminal.selectionContainer.style.height = this.viewportElement.style.height; + } + this.scrollArea.style.height = (this.charMeasure.height * this.lastRecordedBufferLength) + 'px'; + } + }; + Viewport.prototype.syncScrollArea = function () { + if (this.lastRecordedBufferLength !== this.terminal.buffer.lines.length) { + this.lastRecordedBufferLength = this.terminal.buffer.lines.length; + this.refresh(); + } + else if (this.lastRecordedViewportHeight !== this.terminal.rows) { + this.refresh(); + } + else { + if (this.charMeasure.height !== this.currentRowHeight) { + this.refresh(); + } + } + var scrollTop = this.terminal.buffer.ydisp * this.currentRowHeight; + if (this.viewportElement.scrollTop !== scrollTop) { + this.viewportElement.scrollTop = scrollTop; + } + }; + Viewport.prototype.onScroll = function (ev) { + var newRow = Math.round(this.viewportElement.scrollTop / this.currentRowHeight); + var diff = newRow - this.terminal.buffer.ydisp; + this.terminal.scrollDisp(diff, true); + }; + Viewport.prototype.onWheel = function (ev) { + if (ev.deltaY === 0) { + return; + } + var multiplier = 1; + if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) { + multiplier = this.currentRowHeight; + } + else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) { + multiplier = this.currentRowHeight * this.terminal.rows; + } + this.viewportElement.scrollTop += ev.deltaY * multiplier; + ev.preventDefault(); + }; + ; + Viewport.prototype.onTouchStart = function (ev) { + this.lastTouchY = ev.touches[0].pageY; + }; + ; + Viewport.prototype.onTouchMove = function (ev) { + var deltaY = this.lastTouchY - ev.touches[0].pageY; + this.lastTouchY = ev.touches[0].pageY; + if (deltaY === 0) { + return; + } + this.viewportElement.scrollTop += deltaY; + ev.preventDefault(); + }; + ; + return Viewport; +}()); +exports.Viewport = Viewport; + + + +},{}],14:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function prepareTextForTerminal(text, isMSWindows) { + if (isMSWindows) { + return text.replace(/\r?\n/g, '\r'); + } + return text; +} +exports.prepareTextForTerminal = prepareTextForTerminal; +function copyHandler(ev, term, selectionManager) { + if (term.browser.isMSIE) { + window.clipboardData.setData('Text', selectionManager.selectionText); + } + else { + ev.clipboardData.setData('text/plain', selectionManager.selectionText); + } + ev.preventDefault(); +} +exports.copyHandler = copyHandler; +function pasteHandler(ev, term) { + ev.stopPropagation(); + var text; + var dispatchPaste = function (text) { + text = prepareTextForTerminal(text, term.browser.isMSWindows); + term.handler(text); + term.textarea.value = ''; + term.emit('paste', text); + return term.cancel(ev); + }; + if (term.browser.isMSIE) { + if (window.clipboardData) { + text = window.clipboardData.getData('Text'); + dispatchPaste(text); + } + } + else { + if (ev.clipboardData) { + text = ev.clipboardData.getData('text/plain'); + dispatchPaste(text); + } + } +} +exports.pasteHandler = pasteHandler; +function moveTextAreaUnderMouseCursor(ev, textarea) { + textarea.style.position = 'fixed'; + textarea.style.width = '20px'; + textarea.style.height = '20px'; + textarea.style.left = (ev.clientX - 10) + 'px'; + textarea.style.top = (ev.clientY - 10) + 'px'; + textarea.style.zIndex = '1000'; + textarea.focus(); + setTimeout(function () { + textarea.style.position = null; + textarea.style.width = null; + textarea.style.height = null; + textarea.style.left = null; + textarea.style.top = null; + textarea.style.zIndex = null; + }, 4); +} +exports.moveTextAreaUnderMouseCursor = moveTextAreaUnderMouseCursor; +function rightClickHandler(ev, textarea, selectionManager) { + moveTextAreaUnderMouseCursor(ev, textarea); + textarea.value = selectionManager.selectionText; + textarea.select(); +} +exports.rightClickHandler = rightClickHandler; + + + +},{}],15:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Generic_1 = require("./Generic"); +var isNode = (typeof navigator === 'undefined') ? true : false; +var userAgent = (isNode) ? 'node' : navigator.userAgent; +var platform = (isNode) ? 'node' : navigator.platform; +exports.isFirefox = !!~userAgent.indexOf('Firefox'); +exports.isMSIE = !!~userAgent.indexOf('MSIE') || !!~userAgent.indexOf('Trident'); +exports.isMac = Generic_1.contains(['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'], platform); +exports.isIpad = platform === 'iPad'; +exports.isIphone = platform === 'iPhone'; +exports.isMSWindows = Generic_1.contains(['Windows', 'Win16', 'Win32', 'WinCE'], platform); +exports.isLinux = platform.indexOf('Linux') >= 0; + + + +},{"./Generic":20}],16:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var LINE_DATA_CHAR_INDEX = 1; +var LINE_DATA_WIDTH_INDEX = 2; +function translateBufferLineToString(line, trimRight, startCol, endCol) { + if (startCol === void 0) { startCol = 0; } + if (endCol === void 0) { endCol = null; } + var lineString = ''; + var widthAdjustedStartCol = startCol; + var widthAdjustedEndCol = endCol; + for (var i = 0; i < line.length; i++) { + var char = line[i]; + lineString += char[LINE_DATA_CHAR_INDEX]; + if (char[LINE_DATA_WIDTH_INDEX] === 0) { + if (startCol >= i) { + widthAdjustedStartCol--; + } + if (endCol >= i) { + widthAdjustedEndCol--; + } + } + } + var finalEndCol = widthAdjustedEndCol || line.length; + if (trimRight) { + var rightWhitespaceIndex = lineString.search(/\s+$/); + if (rightWhitespaceIndex !== -1) { + finalEndCol = Math.min(finalEndCol, rightWhitespaceIndex); + } + if (finalEndCol <= widthAdjustedStartCol) { + return ''; + } + } + return lineString.substring(widthAdjustedStartCol, finalEndCol); +} +exports.translateBufferLineToString = translateBufferLineToString; + + + +},{}],17:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var EventEmitter_js_1 = require("../EventEmitter.js"); +var CharMeasure = (function (_super) { + __extends(CharMeasure, _super); + function CharMeasure(document, parentElement) { + var _this = _super.call(this) || this; + _this._document = document; + _this._parentElement = parentElement; + return _this; + } + Object.defineProperty(CharMeasure.prototype, "width", { + get: function () { + return this._width; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CharMeasure.prototype, "height", { + get: function () { + return this._height; + }, + enumerable: true, + configurable: true + }); + CharMeasure.prototype.measure = function () { + var _this = this; + if (!this._measureElement) { + this._measureElement = this._document.createElement('span'); + this._measureElement.style.position = 'absolute'; + this._measureElement.style.top = '0'; + this._measureElement.style.left = '-9999em'; + this._measureElement.textContent = 'W'; + this._measureElement.setAttribute('aria-hidden', 'true'); + this._parentElement.appendChild(this._measureElement); + setTimeout(function () { return _this._doMeasure(); }, 0); + } + else { + this._doMeasure(); + } + }; + CharMeasure.prototype._doMeasure = function () { + var geometry = this._measureElement.getBoundingClientRect(); + if (geometry.width === 0 || geometry.height === 0) { + return; + } + if (this._width !== geometry.width || this._height !== geometry.height) { + this._width = geometry.width; + this._height = geometry.height; + this.emit('charsizechanged'); + } + }; + return CharMeasure; +}(EventEmitter_js_1.EventEmitter)); +exports.CharMeasure = CharMeasure; + + + +},{"../EventEmitter.js":6}],18:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var EventEmitter_1 = require("../EventEmitter"); +var CircularList = (function (_super) { + __extends(CircularList, _super); + function CircularList(maxLength) { + var _this = _super.call(this) || this; + _this._array = new Array(maxLength); + _this._startIndex = 0; + _this._length = 0; + return _this; + } + Object.defineProperty(CircularList.prototype, "maxLength", { + get: function () { + return this._array.length; + }, + set: function (newMaxLength) { + var newArray = new Array(newMaxLength); + for (var i = 0; i < Math.min(newMaxLength, this.length); i++) { + newArray[i] = this._array[this._getCyclicIndex(i)]; + } + this._array = newArray; + this._startIndex = 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CircularList.prototype, "length", { + get: function () { + return this._length; + }, + set: function (newLength) { + if (newLength > this._length) { + for (var i = this._length; i < newLength; i++) { + this._array[i] = undefined; + } + } + this._length = newLength; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CircularList.prototype, "forEach", { + get: function () { + var _this = this; + return function (callbackfn) { + var i = 0; + var length = _this.length; + for (var i_1 = 0; i_1 < length; i_1++) { + callbackfn(_this.get(i_1), i_1); + } + }; + }, + enumerable: true, + configurable: true + }); + CircularList.prototype.get = function (index) { + return this._array[this._getCyclicIndex(index)]; + }; + CircularList.prototype.set = function (index, value) { + this._array[this._getCyclicIndex(index)] = value; + }; + CircularList.prototype.push = function (value) { + this._array[this._getCyclicIndex(this._length)] = value; + if (this._length === this.maxLength) { + this._startIndex++; + if (this._startIndex === this.maxLength) { + this._startIndex = 0; + } + this.emit('trim', 1); + } + else { + this._length++; + } + }; + CircularList.prototype.pop = function () { + return this._array[this._getCyclicIndex(this._length-- - 1)]; + }; + CircularList.prototype.splice = function (start, deleteCount) { + var items = []; + for (var _i = 2; _i < arguments.length; _i++) { + items[_i - 2] = arguments[_i]; + } + if (deleteCount) { + for (var i = start; i < this._length - deleteCount; i++) { + this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)]; + } + this._length -= deleteCount; + } + if (items && items.length) { + for (var i = this._length - 1; i >= start; i--) { + this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)]; + } + for (var i = 0; i < items.length; i++) { + this._array[this._getCyclicIndex(start + i)] = items[i]; + } + if (this._length + items.length > this.maxLength) { + var countToTrim = (this._length + items.length) - this.maxLength; + this._startIndex += countToTrim; + this._length = this.maxLength; + this.emit('trim', countToTrim); + } + else { + this._length += items.length; + } + } + }; + CircularList.prototype.trimStart = function (count) { + if (count > this._length) { + count = this._length; + } + this._startIndex += count; + this._length -= count; + this.emit('trim', count); + }; + CircularList.prototype.shiftElements = function (start, count, offset) { + if (count <= 0) { + return; + } + if (start < 0 || start >= this._length) { + throw new Error('start argument out of range'); + } + if (start + offset < 0) { + throw new Error('Cannot shift elements in list beyond index 0'); + } + if (offset > 0) { + for (var i = count - 1; i >= 0; i--) { + this.set(start + i + offset, this.get(start + i)); + } + var expandListBy = (start + count + offset) - this._length; + if (expandListBy > 0) { + this._length += expandListBy; + while (this._length > this.maxLength) { + this._length--; + this._startIndex++; + this.emit('trim', 1); + } + } + } + else { + for (var i = 0; i < count; i++) { + this.set(start + i + offset, this.get(start + i)); + } + } + }; + CircularList.prototype._getCyclicIndex = function (index) { + return (this._startIndex + index) % this.maxLength; + }; + return CircularList; +}(EventEmitter_1.EventEmitter)); +exports.CircularList = CircularList; + + + +},{"../EventEmitter":6}],19:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var DomElementObjectPool = (function () { + function DomElementObjectPool(type) { + this.type = type; + this._type = type; + this._pool = []; + this._inUse = {}; + } + DomElementObjectPool.prototype.acquire = function () { + var element; + if (this._pool.length === 0) { + element = this._createNew(); + } + else { + element = this._pool.pop(); + } + this._inUse[element.getAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE)] = element; + return element; + }; + DomElementObjectPool.prototype.release = function (element) { + if (!this._inUse[element.getAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE)]) { + throw new Error('Could not release an element not yet acquired'); + } + delete this._inUse[element.getAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE)]; + this._cleanElement(element); + this._pool.push(element); + }; + DomElementObjectPool.prototype._createNew = function () { + var element = document.createElement(this._type); + var id = DomElementObjectPool._objectCount++; + element.setAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE, id.toString(10)); + return element; + }; + DomElementObjectPool.prototype._cleanElement = function (element) { + element.className = ''; + element.innerHTML = ''; + }; + return DomElementObjectPool; +}()); +DomElementObjectPool.OBJECT_ID_ATTRIBUTE = 'data-obj-id'; +DomElementObjectPool._objectCount = 0; +exports.DomElementObjectPool = DomElementObjectPool; + + + +},{}],20:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function contains(arr, el) { + return arr.indexOf(el) >= 0; +} +exports.contains = contains; +; + + + +},{}],21:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function getCoordsRelativeToElement(event, element) { + if (event.pageX == null) { + return null; + } + var x = event.pageX; + var y = event.pageY; + while (element && element !== self.document.documentElement) { + x -= element.offsetLeft; + y -= element.offsetTop; + element = 'offsetParent' in element ? element.offsetParent : element.parentElement; + } + return [x, y]; +} +exports.getCoordsRelativeToElement = getCoordsRelativeToElement; +function getCoords(event, rowContainer, charMeasure, colCount, rowCount, isSelection) { + if (!charMeasure.width || !charMeasure.height) { + return null; + } + var coords = getCoordsRelativeToElement(event, rowContainer); + if (!coords) { + return null; + } + coords[0] = Math.ceil((coords[0] + (isSelection ? charMeasure.width / 2 : 0)) / charMeasure.width); + coords[1] = Math.ceil(coords[1] / charMeasure.height); + coords[0] = Math.min(Math.max(coords[0], 1), colCount + 1); + coords[1] = Math.min(Math.max(coords[1], 1), rowCount + 1); + return coords; +} +exports.getCoords = getCoords; +function getRawByteCoords(event, rowContainer, charMeasure, colCount, rowCount) { + var coords = getCoords(event, rowContainer, charMeasure, colCount, rowCount); + var x = coords[0]; + var y = coords[1]; + x += 32; + y += 32; + return { x: x, y: y }; +} +exports.getRawByteCoords = getRawByteCoords; + + + +},{}],22:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var BufferSet_1 = require("./BufferSet"); +var CompositionHelper_1 = require("./CompositionHelper"); +var EventEmitter_1 = require("./EventEmitter"); +var Viewport_1 = require("./Viewport"); +var Clipboard_1 = require("./handlers/Clipboard"); +var EscapeSequences_1 = require("./EscapeSequences"); +var InputHandler_1 = require("./InputHandler"); +var Parser_1 = require("./Parser"); +var Renderer_1 = require("./Renderer"); +var Linkifier_1 = require("./Linkifier"); +var SelectionManager_1 = require("./SelectionManager"); +var CharMeasure_1 = require("./utils/CharMeasure"); +var Browser = require("./utils/Browser"); +var Mouse_1 = require("./utils/Mouse"); +var BufferLine_1 = require("./utils/BufferLine"); +var document = (typeof window != 'undefined') ? window.document : null; +var WRITE_BUFFER_PAUSE_THRESHOLD = 5; +var WRITE_BATCH_SIZE = 300; +var CURSOR_BLINK_INTERVAL = 600; +function Terminal(options) { + var self = this; + if (!(this instanceof Terminal)) { + return new Terminal(arguments[0], arguments[1], arguments[2]); + } + self.browser = Browser; + self.cancel = Terminal.cancel; + EventEmitter_1.EventEmitter.call(this); + if (typeof options === 'number') { + options = { + cols: arguments[0], + rows: arguments[1], + handler: arguments[2] + }; + } + options = options || {}; + Object.keys(Terminal.defaults).forEach(function (key) { + if (options[key] == null) { + options[key] = Terminal.options[key]; + if (Terminal[key] !== Terminal.defaults[key]) { + options[key] = Terminal[key]; + } + } + self[key] = options[key]; + }); + if (options.colors.length === 8) { + options.colors = options.colors.concat(Terminal._colors.slice(8)); + } + else if (options.colors.length === 16) { + options.colors = options.colors.concat(Terminal._colors.slice(16)); + } + else if (options.colors.length === 10) { + options.colors = options.colors.slice(0, -2).concat(Terminal._colors.slice(8, -2), options.colors.slice(-2)); + } + else if (options.colors.length === 18) { + options.colors = options.colors.concat(Terminal._colors.slice(16, -2), options.colors.slice(-2)); + } + this.colors = options.colors; + this.options = options; + this.parent = options.body || options.parent || (document ? document.getElementsByTagName('body')[0] : null); + this.cols = options.cols || options.geometry[0]; + this.rows = options.rows || options.geometry[1]; + this.geometry = [this.cols, this.rows]; + if (options.handler) { + this.on('data', options.handler); + } + this.cursorState = 0; + this.cursorHidden = false; + this.convertEol; + this.queue = ''; + this.customKeyEventHandler = null; + this.cursorBlinkInterval = null; + this.applicationKeypad = false; + this.applicationCursor = false; + this.originMode = false; + this.insertMode = false; + this.wraparoundMode = true; + this.charset = null; + this.gcharset = null; + this.glevel = 0; + this.charsets = [null]; + this.decLocator; + this.x10Mouse; + this.vt200Mouse; + this.vt300Mouse; + this.normalMouse; + this.mouseEvents; + this.sendFocus; + this.utfMouse; + this.sgrMouse; + this.urxvtMouse; + this.element; + this.children; + this.refreshStart; + this.refreshEnd; + this.savedX; + this.savedY; + this.savedCols; + this.readable = true; + this.writable = true; + this.defAttr = (0 << 18) | (257 << 9) | (256 << 0); + this.curAttr = this.defAttr; + this.params = []; + this.currentParam = 0; + this.prefix = ''; + this.postfix = ''; + this.inputHandler = new InputHandler_1.InputHandler(this); + this.parser = new Parser_1.Parser(this.inputHandler, this); + this.renderer = this.renderer || null; + this.selectionManager = this.selectionManager || null; + this.linkifier = this.linkifier || new Linkifier_1.Linkifier(); + this.writeBuffer = []; + this.writeInProgress = false; + this.xoffSentToCatchUp = false; + this.writeStopped = false; + this.surrogate_high = ''; + this.buffers = new BufferSet_1.BufferSet(this); + this.buffer = this.buffers.active; + this.buffers.on('activate', function (buffer) { + this._terminal.buffer = buffer; + }); + if (this.selectionManager) { + this.selectionManager.setBuffer(this.buffer.lines); + } + this.setupStops(); + this.userScrolling = false; +} +inherits(Terminal, EventEmitter_1.EventEmitter); +Terminal.prototype.eraseAttr = function () { + return (this.defAttr & ~0x1ff) | (this.curAttr & 0x1ff); +}; +Terminal.tangoColors = [ + '#2e3436', + '#cc0000', + '#4e9a06', + '#c4a000', + '#3465a4', + '#75507b', + '#06989a', + '#d3d7cf', + '#555753', + '#ef2929', + '#8ae234', + '#fce94f', + '#729fcf', + '#ad7fa8', + '#34e2e2', + '#eeeeec' +]; +Terminal.colors = (function () { + var colors = Terminal.tangoColors.slice(), r = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff], i; + i = 0; + for (; i < 216; i++) { + out(r[(i / 36) % 6 | 0], r[(i / 6) % 6 | 0], r[i % 6]); + } + i = 0; + for (; i < 24; i++) { + r = 8 + i * 10; + out(r, r, r); + } + function out(r, g, b) { + colors.push('#' + hex(r) + hex(g) + hex(b)); + } + function hex(c) { + c = c.toString(16); + return c.length < 2 ? '0' + c : c; + } + return colors; +})(); +Terminal._colors = Terminal.colors.slice(); +Terminal.vcolors = (function () { + var out = [], colors = Terminal.colors, i = 0, color; + for (; i < 256; i++) { + color = parseInt(colors[i].substring(1), 16); + out.push([ + (color >> 16) & 0xff, + (color >> 8) & 0xff, + color & 0xff + ]); + } + return out; +})(); +Terminal.defaults = { + colors: Terminal.colors, + theme: 'default', + convertEol: false, + termName: 'xterm', + geometry: [80, 24], + cursorBlink: false, + cursorStyle: 'block', + visualBell: false, + popOnBell: false, + scrollback: 1000, + screenKeys: false, + debug: false, + cancelEvents: false, + disableStdin: false, + useFlowControl: false, + tabStopWidth: 8 +}; +Terminal.options = {}; +Terminal.focus = null; +each(keys(Terminal.defaults), function (key) { + Terminal[key] = Terminal.defaults[key]; + Terminal.options[key] = Terminal.defaults[key]; +}); +Terminal.prototype.focus = function () { + return this.textarea.focus(); +}; +Terminal.prototype.getOption = function (key) { + if (!(key in Terminal.defaults)) { + throw new Error('No option with key "' + key + '"'); + } + if (typeof this.options[key] !== 'undefined') { + return this.options[key]; + } + return this[key]; +}; +Terminal.prototype.setOption = function (key, value) { + if (!(key in Terminal.defaults)) { + throw new Error('No option with key "' + key + '"'); + } + switch (key) { + case 'scrollback': + if (value < this.rows) { + var msg = 'Setting the scrollback value less than the number of rows '; + msg += "(" + this.rows + ") is not allowed."; + console.warn(msg); + return false; + } + if (this.options[key] !== value) { + if (this.buffer.lines.length > value) { + var amountToTrim = this.buffer.lines.length - value; + var needsRefresh = (this.buffer.ydisp - amountToTrim < 0); + this.buffer.lines.trimStart(amountToTrim); + this.buffer.ybase = Math.max(this.buffer.ybase - amountToTrim, 0); + this.buffer.ydisp = Math.max(this.buffer.ydisp - amountToTrim, 0); + if (needsRefresh) { + this.refresh(0, this.rows - 1); + } + } + this.buffer.lines.maxLength = value; + this.viewport.syncScrollArea(); + } + break; + } + this[key] = value; + this.options[key] = value; + switch (key) { + case 'cursorBlink': + this.setCursorBlinking(value); + break; + case 'cursorStyle': + this.element.classList.toggle("xterm-cursor-style-block", value === 'block'); + this.element.classList.toggle("xterm-cursor-style-underline", value === 'underline'); + this.element.classList.toggle("xterm-cursor-style-bar", value === 'bar'); + break; + case 'tabStopWidth': + this.setupStops(); + break; + } +}; +Terminal.prototype.restartCursorBlinking = function () { + this.setCursorBlinking(this.options.cursorBlink); +}; +Terminal.prototype.setCursorBlinking = function (enabled) { + this.element.classList.toggle('xterm-cursor-blink', enabled); + this.clearCursorBlinkingInterval(); + if (enabled) { + var self = this; + this.cursorBlinkInterval = setInterval(function () { + self.element.classList.toggle('xterm-cursor-blink-on'); + }, CURSOR_BLINK_INTERVAL); + } +}; +Terminal.prototype.clearCursorBlinkingInterval = function () { + this.element.classList.remove('xterm-cursor-blink-on'); + if (this.cursorBlinkInterval) { + clearInterval(this.cursorBlinkInterval); + this.cursorBlinkInterval = null; + } +}; +Terminal.bindFocus = function (term) { + on(term.textarea, 'focus', function (ev) { + if (term.sendFocus) { + term.send(EscapeSequences_1.C0.ESC + '[I'); + } + term.element.classList.add('focus'); + term.showCursor(); + term.restartCursorBlinking.apply(term); + Terminal.focus = term; + term.emit('focus', { terminal: term }); + }); +}; +Terminal.prototype.blur = function () { + return this.textarea.blur(); +}; +Terminal.bindBlur = function (term) { + on(term.textarea, 'blur', function (ev) { + term.refresh(term.buffer.y, term.buffer.y); + if (term.sendFocus) { + term.send(EscapeSequences_1.C0.ESC + '[O'); + } + term.element.classList.remove('focus'); + term.clearCursorBlinkingInterval.apply(term); + Terminal.focus = null; + term.emit('blur', { terminal: term }); + }); +}; +Terminal.prototype.initGlobal = function () { + var _this = this; + var term = this; + Terminal.bindKeys(this); + Terminal.bindFocus(this); + Terminal.bindBlur(this); + on(this.element, 'copy', function (event) { + if (!term.hasSelection()) { + return; + } + Clipboard_1.copyHandler(event, term, _this.selectionManager); + }); + var pasteHandlerWrapper = function (event) { return Clipboard_1.pasteHandler(event, term); }; + on(this.textarea, 'paste', pasteHandlerWrapper); + on(this.element, 'paste', pasteHandlerWrapper); + if (term.browser.isFirefox) { + on(this.element, 'mousedown', function (event) { + if (event.button == 2) { + Clipboard_1.rightClickHandler(event, _this.textarea, _this.selectionManager); + } + }); + } + else { + on(this.element, 'contextmenu', function (event) { + Clipboard_1.rightClickHandler(event, _this.textarea, _this.selectionManager); + }); + } + if (term.browser.isLinux) { + on(this.element, 'auxclick', function (event) { + if (event.button === 1) { + Clipboard_1.moveTextAreaUnderMouseCursor(event, _this.textarea, _this.selectionManager); + } + }); + } +}; +Terminal.bindKeys = function (term) { + on(term.element, 'keydown', function (ev) { + if (document.activeElement != this) { + return; + } + term.keyDown(ev); + }, true); + on(term.element, 'keypress', function (ev) { + if (document.activeElement != this) { + return; + } + term.keyPress(ev); + }, true); + on(term.element, 'keyup', function (ev) { + if (!wasMondifierKeyOnlyEvent(ev)) { + term.focus(term); + } + }, true); + on(term.textarea, 'keydown', function (ev) { + term.keyDown(ev); + }, true); + on(term.textarea, 'keypress', function (ev) { + term.keyPress(ev); + this.value = ''; + }, true); + on(term.textarea, 'compositionstart', term.compositionHelper.compositionstart.bind(term.compositionHelper)); + on(term.textarea, 'compositionupdate', term.compositionHelper.compositionupdate.bind(term.compositionHelper)); + on(term.textarea, 'compositionend', term.compositionHelper.compositionend.bind(term.compositionHelper)); + term.on('refresh', term.compositionHelper.updateCompositionElements.bind(term.compositionHelper)); + term.on('refresh', function (data) { + term.queueLinkification(data.start, data.end); + }); +}; +Terminal.prototype.insertRow = function (row) { + if (typeof row != 'object') { + row = document.createElement('div'); + } + this.rowContainer.appendChild(row); + this.children.push(row); + return row; +}; +Terminal.prototype.open = function (parent, focus) { + var _this = this; + var self = this, i = 0, div; + this.parent = parent || this.parent; + if (!this.parent) { + throw new Error('Terminal requires a parent element.'); + } + this.context = this.parent.ownerDocument.defaultView; + this.document = this.parent.ownerDocument; + this.body = this.document.getElementsByTagName('body')[0]; + this.element = this.document.createElement('div'); + this.element.classList.add('terminal'); + this.element.classList.add('xterm'); + this.element.classList.add('xterm-theme-' + this.theme); + this.element.classList.add("xterm-cursor-style-" + this.options.cursorStyle); + this.setCursorBlinking(this.options.cursorBlink); + this.element.setAttribute('tabindex', 0); + this.viewportElement = document.createElement('div'); + this.viewportElement.classList.add('xterm-viewport'); + this.element.appendChild(this.viewportElement); + this.viewportScrollArea = document.createElement('div'); + this.viewportScrollArea.classList.add('xterm-scroll-area'); + this.viewportElement.appendChild(this.viewportScrollArea); + this.selectionContainer = document.createElement('div'); + this.selectionContainer.classList.add('xterm-selection'); + this.element.appendChild(this.selectionContainer); + this.rowContainer = document.createElement('div'); + this.rowContainer.classList.add('xterm-rows'); + this.element.appendChild(this.rowContainer); + this.children = []; + this.linkifier.attachToDom(document, this.children); + this.helperContainer = document.createElement('div'); + this.helperContainer.classList.add('xterm-helpers'); + this.element.appendChild(this.helperContainer); + this.textarea = document.createElement('textarea'); + this.textarea.classList.add('xterm-helper-textarea'); + this.textarea.setAttribute('autocorrect', 'off'); + this.textarea.setAttribute('autocapitalize', 'off'); + this.textarea.setAttribute('spellcheck', 'false'); + this.textarea.tabIndex = 0; + this.textarea.addEventListener('focus', function () { + self.emit('focus', { terminal: self }); + }); + this.textarea.addEventListener('blur', function () { + self.emit('blur', { terminal: self }); + }); + this.helperContainer.appendChild(this.textarea); + this.compositionView = document.createElement('div'); + this.compositionView.classList.add('composition-view'); + this.compositionHelper = new CompositionHelper_1.CompositionHelper(this.textarea, this.compositionView, this); + this.helperContainer.appendChild(this.compositionView); + this.charSizeStyleElement = document.createElement('style'); + this.helperContainer.appendChild(this.charSizeStyleElement); + for (; i < this.rows; i++) { + this.insertRow(); + } + this.parent.appendChild(this.element); + this.charMeasure = new CharMeasure_1.CharMeasure(document, this.helperContainer); + this.charMeasure.on('charsizechanged', function () { + self.updateCharSizeStyles(); + }); + this.charMeasure.measure(); + this.viewport = new Viewport_1.Viewport(this, this.viewportElement, this.viewportScrollArea, this.charMeasure); + this.renderer = new Renderer_1.Renderer(this); + this.selectionManager = new SelectionManager_1.SelectionManager(this, this.buffer.lines, this.rowContainer, this.charMeasure); + this.selectionManager.on('refresh', function (data) { + _this.renderer.refreshSelection(data.start, data.end); + }); + this.selectionManager.on('newselection', function (text) { + _this.textarea.value = text; + _this.textarea.focus(); + _this.textarea.select(); + }); + this.on('scroll', function () { return _this.selectionManager.refresh(); }); + this.viewportElement.addEventListener('scroll', function () { return _this.selectionManager.refresh(); }); + this.refresh(0, this.rows - 1); + this.initGlobal(); + if (typeof focus == 'undefined') { + var message = 'You did not pass the `focus` argument in `Terminal.prototype.open()`.\n'; + message += 'The `focus` argument now defaults to `true` but starting with xterm.js 3.0 '; + message += 'it will default to `false`.'; + console.warn(message); + focus = true; + } + if (focus) { + this.focus(); + } + this.bindMouse(); + this.emit('open'); +}; +Terminal.loadAddon = function (addon, callback) { + if (typeof exports === 'object' && typeof module === 'object') { + return require('./addons/' + addon + '/' + addon); + } + else if (typeof define == 'function') { + return require(['./addons/' + addon + '/' + addon], callback); + } + else { + console.error('Cannot load a module without a CommonJS or RequireJS environment.'); + return false; + } +}; +Terminal.prototype.updateCharSizeStyles = function () { + this.charSizeStyleElement.textContent = + ".xterm-wide-char{width:" + this.charMeasure.width * 2 + "px;}" + + (".xterm-normal-char{width:" + this.charMeasure.width + "px;}") + + (".xterm-rows > div{height:" + this.charMeasure.height + "px;}"); +}; +Terminal.prototype.bindMouse = function () { + var el = this.element, self = this, pressed = 32; + function sendButton(ev) { + var button, pos; + button = getButton(ev); + pos = Mouse_1.getRawByteCoords(ev, self.rowContainer, self.charMeasure, self.cols, self.rows); + if (!pos) + return; + sendEvent(button, pos); + switch (ev.overrideType || ev.type) { + case 'mousedown': + pressed = button; + break; + case 'mouseup': + pressed = 32; + break; + case 'wheel': + break; + } + } + function sendMove(ev) { + var button = pressed, pos; + pos = Mouse_1.getRawByteCoords(ev, self.rowContainer, self.charMeasure, self.cols, self.rows); + if (!pos) + return; + button += 32; + sendEvent(button, pos); + } + function encode(data, ch) { + if (!self.utfMouse) { + if (ch === 255) + return data.push(0); + if (ch > 127) + ch = 127; + data.push(ch); + } + else { + if (ch === 2047) + return data.push(0); + if (ch < 127) { + data.push(ch); + } + else { + if (ch > 2047) + ch = 2047; + data.push(0xC0 | (ch >> 6)); + data.push(0x80 | (ch & 0x3F)); + } + } + } + function sendEvent(button, pos) { + if (self.vt300Mouse) { + button &= 3; + pos.x -= 32; + pos.y -= 32; + var data = EscapeSequences_1.C0.ESC + '[24'; + if (button === 0) + data += '1'; + else if (button === 1) + data += '3'; + else if (button === 2) + data += '5'; + else if (button === 3) + return; + else + data += '0'; + data += '~[' + pos.x + ',' + pos.y + ']\r'; + self.send(data); + return; + } + if (self.decLocator) { + button &= 3; + pos.x -= 32; + pos.y -= 32; + if (button === 0) + button = 2; + else if (button === 1) + button = 4; + else if (button === 2) + button = 6; + else if (button === 3) + button = 3; + self.send(EscapeSequences_1.C0.ESC + '[' + + button + + ';' + + (button === 3 ? 4 : 0) + + ';' + + pos.y + + ';' + + pos.x + + ';' + + (pos.page || 0) + + '&w'); + return; + } + if (self.urxvtMouse) { + pos.x -= 32; + pos.y -= 32; + pos.x++; + pos.y++; + self.send(EscapeSequences_1.C0.ESC + '[' + button + ';' + pos.x + ';' + pos.y + 'M'); + return; + } + if (self.sgrMouse) { + pos.x -= 32; + pos.y -= 32; + self.send(EscapeSequences_1.C0.ESC + '[<' + + (((button & 3) === 3 ? button & ~3 : button) - 32) + + ';' + + pos.x + + ';' + + pos.y + + ((button & 3) === 3 ? 'm' : 'M')); + return; + } + var data = []; + encode(data, button); + encode(data, pos.x); + encode(data, pos.y); + self.send(EscapeSequences_1.C0.ESC + '[M' + String.fromCharCode.apply(String, data)); + } + function getButton(ev) { + var button, shift, meta, ctrl, mod; + switch (ev.overrideType || ev.type) { + case 'mousedown': + button = ev.button != null + ? +ev.button + : ev.which != null + ? ev.which - 1 + : null; + if (self.browser.isMSIE) { + button = button === 1 ? 0 : button === 4 ? 1 : button; + } + break; + case 'mouseup': + button = 3; + break; + case 'DOMMouseScroll': + button = ev.detail < 0 + ? 64 + : 65; + break; + case 'wheel': + button = ev.wheelDeltaY > 0 + ? 64 + : 65; + break; + } + shift = ev.shiftKey ? 4 : 0; + meta = ev.metaKey ? 8 : 0; + ctrl = ev.ctrlKey ? 16 : 0; + mod = shift | meta | ctrl; + if (self.vt200Mouse) { + mod &= ctrl; + } + else if (!self.normalMouse) { + mod = 0; + } + button = (32 + (mod << 2)) + button; + return button; + } + on(el, 'mousedown', function (ev) { + ev.preventDefault(); + self.focus(); + if (!self.mouseEvents) + return; + sendButton(ev); + if (self.vt200Mouse) { + ev.overrideType = 'mouseup'; + sendButton(ev); + return self.cancel(ev); + } + if (self.normalMouse) + on(self.document, 'mousemove', sendMove); + if (!self.x10Mouse) { + on(self.document, 'mouseup', function up(ev) { + sendButton(ev); + if (self.normalMouse) + off(self.document, 'mousemove', sendMove); + off(self.document, 'mouseup', up); + return self.cancel(ev); + }); + } + return self.cancel(ev); + }); + on(el, 'wheel', function (ev) { + if (!self.mouseEvents) + return; + if (self.x10Mouse + || self.vt300Mouse + || self.decLocator) + return; + sendButton(ev); + return self.cancel(ev); + }); + on(el, 'wheel', function (ev) { + if (self.mouseEvents) + return; + self.viewport.onWheel(ev); + return self.cancel(ev); + }); + on(el, 'touchstart', function (ev) { + if (self.mouseEvents) + return; + self.viewport.onTouchStart(ev); + return self.cancel(ev); + }); + on(el, 'touchmove', function (ev) { + if (self.mouseEvents) + return; + self.viewport.onTouchMove(ev); + return self.cancel(ev); + }); +}; +Terminal.prototype.destroy = function () { + this.readable = false; + this.writable = false; + this._events = {}; + this.handler = function () { }; + this.write = function () { }; + if (this.element && this.element.parentNode) { + this.element.parentNode.removeChild(this.element); + } +}; +Terminal.prototype.refresh = function (start, end) { + if (this.renderer) { + this.renderer.queueRefresh(start, end); + } +}; +Terminal.prototype.queueLinkification = function (start, end) { + if (this.linkifier) { + for (var i = start; i <= end; i++) { + this.linkifier.linkifyRow(i); + } + } +}; +Terminal.prototype.showCursor = function () { + if (!this.cursorState) { + this.cursorState = 1; + this.refresh(this.buffer.y, this.buffer.y); + } +}; +Terminal.prototype.scroll = function (isWrapped) { + var row; + if (this.buffer.lines.length === this.buffer.lines.maxLength) { + this.buffer.lines.trimStart(1); + this.buffer.ybase--; + if (this.buffer.ydisp !== 0) { + this.buffer.ydisp--; + } + } + this.buffer.ybase++; + if (!this.userScrolling) { + this.buffer.ydisp = this.buffer.ybase; + } + row = this.buffer.ybase + this.rows - 1; + row -= this.rows - 1 - this.buffer.scrollBottom; + if (row === this.buffer.lines.length) { + this.buffer.lines.push(this.blankLine(undefined, isWrapped)); + } + else { + this.buffer.lines.splice(row, 0, this.blankLine(undefined, isWrapped)); + } + if (this.buffer.scrollTop !== 0) { + if (this.buffer.ybase !== 0) { + this.buffer.ybase--; + if (!this.userScrolling) { + this.buffer.ydisp = this.buffer.ybase; + } + } + this.buffer.lines.splice(this.buffer.ybase + this.buffer.scrollTop, 1); + } + this.updateRange(this.buffer.scrollTop); + this.updateRange(this.buffer.scrollBottom); + this.emit('scroll', this.buffer.ydisp); +}; +Terminal.prototype.scrollDisp = function (disp, suppressScrollEvent) { + if (disp < 0) { + if (this.buffer.ydisp === 0) { + return; + } + this.userScrolling = true; + } + else if (disp + this.buffer.ydisp >= this.buffer.ybase) { + this.userScrolling = false; + } + var oldYdisp = this.buffer.ydisp; + this.buffer.ydisp = Math.max(Math.min(this.buffer.ydisp + disp, this.buffer.ybase), 0); + if (oldYdisp === this.buffer.ydisp) { + return; + } + if (!suppressScrollEvent) { + this.emit('scroll', this.buffer.ydisp); + } + this.refresh(0, this.rows - 1); +}; +Terminal.prototype.scrollPages = function (pageCount) { + this.scrollDisp(pageCount * (this.rows - 1)); +}; +Terminal.prototype.scrollToTop = function () { + this.scrollDisp(-this.buffer.ydisp); +}; +Terminal.prototype.scrollToBottom = function () { + this.scrollDisp(this.buffer.ybase - this.buffer.ydisp); +}; +Terminal.prototype.write = function (data) { + this.writeBuffer.push(data); + if (this.options.useFlowControl && !this.xoffSentToCatchUp && this.writeBuffer.length >= WRITE_BUFFER_PAUSE_THRESHOLD) { + this.send(EscapeSequences_1.C0.DC3); + this.xoffSentToCatchUp = true; + } + if (!this.writeInProgress && this.writeBuffer.length > 0) { + this.writeInProgress = true; + var self = this; + setTimeout(function () { + self.innerWrite(); + }); + } +}; +Terminal.prototype.innerWrite = function () { + var writeBatch = this.writeBuffer.splice(0, WRITE_BATCH_SIZE); + while (writeBatch.length > 0) { + var data = writeBatch.shift(); + var l = data.length, i = 0, j, cs, ch, code, low, ch_width, row; + if (this.xoffSentToCatchUp && writeBatch.length === 0 && this.writeBuffer.length === 0) { + this.send(EscapeSequences_1.C0.DC1); + this.xoffSentToCatchUp = false; + } + this.refreshStart = this.buffer.y; + this.refreshEnd = this.buffer.y; + var state = this.parser.parse(data); + this.parser.setState(state); + this.updateRange(this.buffer.y); + this.refresh(this.refreshStart, this.refreshEnd); + } + if (this.writeBuffer.length > 0) { + var self = this; + setTimeout(function () { + self.innerWrite(); + }, 0); + } + else { + this.writeInProgress = false; + } +}; +Terminal.prototype.writeln = function (data) { + this.write(data + '\r\n'); +}; +Terminal.prototype.attachCustomKeydownHandler = function (customKeydownHandler) { + var message = 'attachCustomKeydownHandler() is DEPRECATED and will be removed soon. Please use attachCustomKeyEventHandler() instead.'; + console.warn(message); + this.attachCustomKeyEventHandler(customKeydownHandler); +}; +Terminal.prototype.attachCustomKeyEventHandler = function (customKeyEventHandler) { + this.customKeyEventHandler = customKeyEventHandler; +}; +Terminal.prototype.setHypertextLinkHandler = function (handler) { + if (!this.linkifier) { + throw new Error('Cannot attach a hypertext link handler before Terminal.open is called'); + } + this.linkifier.setHypertextLinkHandler(handler); + this.refresh(0, this.rows - 1); +}; +Terminal.prototype.setHypertextValidationCallback = function (callback) { + if (!this.linkifier) { + throw new Error('Cannot attach a hypertext validation callback before Terminal.open is called'); + } + this.linkifier.setHypertextValidationCallback(callback); + this.refresh(0, this.rows - 1); +}; +Terminal.prototype.registerLinkMatcher = function (regex, handler, options) { + if (this.linkifier) { + var matcherId = this.linkifier.registerLinkMatcher(regex, handler, options); + this.refresh(0, this.rows - 1); + return matcherId; + } +}; +Terminal.prototype.deregisterLinkMatcher = function (matcherId) { + if (this.linkifier) { + if (this.linkifier.deregisterLinkMatcher(matcherId)) { + this.refresh(0, this.rows - 1); + } + } +}; +Terminal.prototype.hasSelection = function () { + return this.selectionManager ? this.selectionManager.hasSelection : false; +}; +Terminal.prototype.getSelection = function () { + return this.selectionManager ? this.selectionManager.selectionText : ''; +}; +Terminal.prototype.clearSelection = function () { + if (this.selectionManager) { + this.selectionManager.clearSelection(); + } +}; +Terminal.prototype.selectAll = function () { + if (this.selectionManager) { + this.selectionManager.selectAll(); + } +}; +Terminal.prototype.keyDown = function (ev) { + if (this.customKeyEventHandler && this.customKeyEventHandler(ev) === false) { + return false; + } + this.restartCursorBlinking(); + if (!this.compositionHelper.keydown.bind(this.compositionHelper)(ev)) { + if (this.buffer.ybase !== this.buffer.ydisp) { + this.scrollToBottom(); + } + return false; + } + var self = this; + var result = this.evaluateKeyEscapeSequence(ev); + if (result.key === EscapeSequences_1.C0.DC3) { + this.writeStopped = true; + } + else if (result.key === EscapeSequences_1.C0.DC1) { + this.writeStopped = false; + } + if (result.scrollDisp) { + this.scrollDisp(result.scrollDisp); + return this.cancel(ev, true); + } + if (isThirdLevelShift(this, ev)) { + return true; + } + if (result.cancel) { + this.cancel(ev, true); + } + if (!result.key) { + return true; + } + this.emit('keydown', ev); + this.emit('key', result.key, ev); + this.showCursor(); + this.handler(result.key); + return this.cancel(ev, true); +}; +Terminal.prototype.evaluateKeyEscapeSequence = function (ev) { + var result = { + cancel: false, + key: undefined, + scrollDisp: undefined + }; + var modifiers = ev.shiftKey << 0 | ev.altKey << 1 | ev.ctrlKey << 2 | ev.metaKey << 3; + switch (ev.keyCode) { + case 8: + if (ev.shiftKey) { + result.key = EscapeSequences_1.C0.BS; + break; + } + result.key = EscapeSequences_1.C0.DEL; + break; + case 9: + if (ev.shiftKey) { + result.key = EscapeSequences_1.C0.ESC + '[Z'; + break; + } + result.key = EscapeSequences_1.C0.HT; + result.cancel = true; + break; + case 13: + result.key = EscapeSequences_1.C0.CR; + result.cancel = true; + break; + case 27: + result.key = EscapeSequences_1.C0.ESC; + result.cancel = true; + break; + case 37: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'D'; + if (result.key == EscapeSequences_1.C0.ESC + '[1;3D') { + result.key = (this.browser.isMac) ? EscapeSequences_1.C0.ESC + 'b' : EscapeSequences_1.C0.ESC + '[1;5D'; + } + } + else if (this.applicationCursor) { + result.key = EscapeSequences_1.C0.ESC + 'OD'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[D'; + } + break; + case 39: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'C'; + if (result.key == EscapeSequences_1.C0.ESC + '[1;3C') { + result.key = (this.browser.isMac) ? EscapeSequences_1.C0.ESC + 'f' : EscapeSequences_1.C0.ESC + '[1;5C'; + } + } + else if (this.applicationCursor) { + result.key = EscapeSequences_1.C0.ESC + 'OC'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[C'; + } + break; + case 38: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'A'; + if (result.key == EscapeSequences_1.C0.ESC + '[1;3A') { + result.key = EscapeSequences_1.C0.ESC + '[1;5A'; + } + } + else if (this.applicationCursor) { + result.key = EscapeSequences_1.C0.ESC + 'OA'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[A'; + } + break; + case 40: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'B'; + if (result.key == EscapeSequences_1.C0.ESC + '[1;3B') { + result.key = EscapeSequences_1.C0.ESC + '[1;5B'; + } + } + else if (this.applicationCursor) { + result.key = EscapeSequences_1.C0.ESC + 'OB'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[B'; + } + break; + case 45: + if (!ev.shiftKey && !ev.ctrlKey) { + result.key = EscapeSequences_1.C0.ESC + '[2~'; + } + break; + case 46: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[3;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[3~'; + } + break; + case 36: + if (modifiers) + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'H'; + else if (this.applicationCursor) + result.key = EscapeSequences_1.C0.ESC + 'OH'; + else + result.key = EscapeSequences_1.C0.ESC + '[H'; + break; + case 35: + if (modifiers) + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'F'; + else if (this.applicationCursor) + result.key = EscapeSequences_1.C0.ESC + 'OF'; + else + result.key = EscapeSequences_1.C0.ESC + '[F'; + break; + case 33: + if (ev.shiftKey) { + result.scrollDisp = -(this.rows - 1); + } + else { + result.key = EscapeSequences_1.C0.ESC + '[5~'; + } + break; + case 34: + if (ev.shiftKey) { + result.scrollDisp = this.rows - 1; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[6~'; + } + break; + case 112: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'P'; + } + else { + result.key = EscapeSequences_1.C0.ESC + 'OP'; + } + break; + case 113: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'Q'; + } + else { + result.key = EscapeSequences_1.C0.ESC + 'OQ'; + } + break; + case 114: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'R'; + } + else { + result.key = EscapeSequences_1.C0.ESC + 'OR'; + } + break; + case 115: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'S'; + } + else { + result.key = EscapeSequences_1.C0.ESC + 'OS'; + } + break; + case 116: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[15;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[15~'; + } + break; + case 117: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[17;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[17~'; + } + break; + case 118: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[18;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[18~'; + } + break; + case 119: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[19;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[19~'; + } + break; + case 120: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[20;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[20~'; + } + break; + case 121: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[21;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[21~'; + } + break; + case 122: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[23;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[23~'; + } + break; + case 123: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[24;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[24~'; + } + break; + default: + if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) { + if (ev.keyCode >= 65 && ev.keyCode <= 90) { + result.key = String.fromCharCode(ev.keyCode - 64); + } + else if (ev.keyCode === 32) { + result.key = String.fromCharCode(0); + } + else if (ev.keyCode >= 51 && ev.keyCode <= 55) { + result.key = String.fromCharCode(ev.keyCode - 51 + 27); + } + else if (ev.keyCode === 56) { + result.key = String.fromCharCode(127); + } + else if (ev.keyCode === 219) { + result.key = String.fromCharCode(27); + } + else if (ev.keyCode === 220) { + result.key = String.fromCharCode(28); + } + else if (ev.keyCode === 221) { + result.key = String.fromCharCode(29); + } + } + else if (!this.browser.isMac && ev.altKey && !ev.ctrlKey && !ev.metaKey) { + if (ev.keyCode >= 65 && ev.keyCode <= 90) { + result.key = EscapeSequences_1.C0.ESC + String.fromCharCode(ev.keyCode + 32); + } + else if (ev.keyCode === 192) { + result.key = EscapeSequences_1.C0.ESC + '`'; + } + else if (ev.keyCode >= 48 && ev.keyCode <= 57) { + result.key = EscapeSequences_1.C0.ESC + (ev.keyCode - 48); + } + } + else if (this.browser.isMac && !ev.altKey && !ev.ctrlKey && ev.metaKey) { + if (ev.keyCode === 65) { + this.selectAll(); + } + } + break; + } + return result; +}; +Terminal.prototype.setgLevel = function (g) { + this.glevel = g; + this.charset = this.charsets[g]; +}; +Terminal.prototype.setgCharset = function (g, charset) { + this.charsets[g] = charset; + if (this.glevel === g) { + this.charset = charset; + } +}; +Terminal.prototype.keyPress = function (ev) { + var key; + if (this.customKeyEventHandler && this.customKeyEventHandler(ev) === false) { + return false; + } + this.cancel(ev); + if (ev.charCode) { + key = ev.charCode; + } + else if (ev.which == null) { + key = ev.keyCode; + } + else if (ev.which !== 0 && ev.charCode !== 0) { + key = ev.which; + } + else { + return false; + } + if (!key || ((ev.altKey || ev.ctrlKey || ev.metaKey) && !isThirdLevelShift(this, ev))) { + return false; + } + key = String.fromCharCode(key); + this.emit('keypress', key, ev); + this.emit('key', key, ev); + this.showCursor(); + this.handler(key); + return true; +}; +Terminal.prototype.send = function (data) { + var self = this; + if (!this.queue) { + setTimeout(function () { + self.handler(self.queue); + self.queue = ''; + }, 1); + } + this.queue += data; +}; +Terminal.prototype.bell = function () { + if (!this.visualBell) + return; + var self = this; + this.element.style.borderColor = 'white'; + setTimeout(function () { + self.element.style.borderColor = ''; + }, 10); + if (this.popOnBell) + this.focus(); +}; +Terminal.prototype.log = function () { + if (!this.debug) + return; + if (!this.context.console || !this.context.console.log) + return; + var args = Array.prototype.slice.call(arguments); + this.context.console.log.apply(this.context.console, args); +}; +Terminal.prototype.error = function () { + if (!this.debug) + return; + if (!this.context.console || !this.context.console.error) + return; + var args = Array.prototype.slice.call(arguments); + this.context.console.error.apply(this.context.console, args); +}; +Terminal.prototype.resize = function (x, y) { + if (isNaN(x) || isNaN(y)) { + return; + } + if (y > this.getOption('scrollback')) { + this.setOption('scrollback', y); + } + var line, el, i, j, ch, addToY; + if (x === this.cols && y === this.rows) { + if (!this.charMeasure.width || !this.charMeasure.height) { + this.charMeasure.measure(); + } + return; + } + if (x < 1) + x = 1; + if (y < 1) + y = 1; + this.buffers.resize(x, y); + while (this.children.length < y) { + this.insertRow(); + } + while (this.children.length > y) { + el = this.children.shift(); + if (!el) + continue; + el.parentNode.removeChild(el); + } + this.cols = x; + this.rows = y; + this.setupStops(this.cols); + this.charMeasure.measure(); + this.refresh(0, this.rows - 1); + this.geometry = [this.cols, this.rows]; + this.emit('resize', { terminal: this, cols: x, rows: y }); +}; +Terminal.prototype.updateRange = function (y) { + if (y < this.refreshStart) + this.refreshStart = y; + if (y > this.refreshEnd) + this.refreshEnd = y; +}; +Terminal.prototype.maxRange = function () { + this.refreshStart = 0; + this.refreshEnd = this.rows - 1; +}; +Terminal.prototype.setupStops = function (i) { + if (i != null) { + if (!this.buffer.tabs[i]) { + i = this.prevStop(i); + } + } + else { + this.buffer.tabs = {}; + i = 0; + } + for (; i < this.cols; i += this.getOption('tabStopWidth')) { + this.buffer.tabs[i] = true; + } +}; +Terminal.prototype.prevStop = function (x) { + if (x == null) + x = this.buffer.x; + while (!this.buffer.tabs[--x] && x > 0) + ; + return x >= this.cols + ? this.cols - 1 + : x < 0 ? 0 : x; +}; +Terminal.prototype.nextStop = function (x) { + if (x == null) + x = this.buffer.x; + while (!this.buffer.tabs[++x] && x < this.cols) + ; + return x >= this.cols + ? this.cols - 1 + : x < 0 ? 0 : x; +}; +Terminal.prototype.eraseRight = function (x, y) { + var line = this.buffer.lines.get(this.buffer.ybase + y); + if (!line) { + return; + } + var ch = [this.eraseAttr(), ' ', 1]; + for (; x < this.cols; x++) { + line[x] = ch; + } + this.updateRange(y); +}; +Terminal.prototype.eraseLeft = function (x, y) { + var line = this.buffer.lines.get(this.buffer.ybase + y); + if (!line) { + return; + } + var ch = [this.eraseAttr(), ' ', 1]; + x++; + while (x--) { + line[x] = ch; + } + this.updateRange(y); +}; +Terminal.prototype.clear = function () { + if (this.buffer.ybase === 0 && this.buffer.y === 0) { + return; + } + this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)); + this.buffer.lines.length = 1; + this.buffer.ydisp = 0; + this.buffer.ybase = 0; + this.buffer.y = 0; + for (var i = 1; i < this.rows; i++) { + this.buffer.lines.push(this.blankLine()); + } + this.refresh(0, this.rows - 1); + this.emit('scroll', this.buffer.ydisp); +}; +Terminal.prototype.eraseLine = function (y) { + this.eraseRight(0, y); +}; +Terminal.prototype.blankLine = function (cur, isWrapped, cols) { + var attr = cur + ? this.eraseAttr() + : this.defAttr; + var ch = [attr, ' ', 1], line = [], i = 0; + if (isWrapped) { + line.isWrapped = isWrapped; + } + cols = cols || this.cols; + for (; i < cols; i++) { + line[i] = ch; + } + return line; +}; +Terminal.prototype.ch = function (cur) { + return cur + ? [this.eraseAttr(), ' ', 1] + : [this.defAttr, ' ', 1]; +}; +Terminal.prototype.is = function (term) { + var name = this.termName; + return (name + '').indexOf(term) === 0; +}; +Terminal.prototype.handler = function (data) { + if (this.options.disableStdin) { + return; + } + if (this.selectionManager && this.selectionManager.hasSelection) { + this.selectionManager.clearSelection(); + } + if (this.buffer.ybase !== this.buffer.ydisp) { + this.scrollToBottom(); + } + this.emit('data', data); +}; +Terminal.prototype.handleTitle = function (title) { + this.emit('title', title); +}; +Terminal.prototype.index = function () { + this.buffer.y++; + if (this.buffer.y > this.buffer.scrollBottom) { + this.buffer.y--; + this.scroll(); + } + if (this.buffer.x >= this.cols) { + this.buffer.x--; + } +}; +Terminal.prototype.reverseIndex = function () { + var j; + if (this.buffer.y === this.buffer.scrollTop) { + this.buffer.lines.shiftElements(this.buffer.y + this.buffer.ybase, this.rows - 1, 1); + this.buffer.lines.set(this.buffer.y + this.buffer.ybase, this.blankLine(true)); + this.updateRange(this.buffer.scrollTop); + this.updateRange(this.buffer.scrollBottom); + } + else { + this.buffer.y--; + } +}; +Terminal.prototype.reset = function () { + this.options.rows = this.rows; + this.options.cols = this.cols; + var customKeyEventHandler = this.customKeyEventHandler; + var cursorBlinkInterval = this.cursorBlinkInterval; + var inputHandler = this.inputHandler; + Terminal.call(this, this.options); + this.customKeyEventHandler = customKeyEventHandler; + this.cursorBlinkInterval = cursorBlinkInterval; + this.inputHandler = inputHandler; + this.refresh(0, this.rows - 1); + this.viewport.syncScrollArea(); +}; +Terminal.prototype.tabSet = function () { + this.buffer.tabs[this.buffer.x] = true; +}; +function on(el, type, handler, capture) { + if (!Array.isArray(el)) { + el = [el]; + } + el.forEach(function (element) { + element.addEventListener(type, handler, capture || false); + }); +} +function off(el, type, handler, capture) { + el.removeEventListener(type, handler, capture || false); +} +function cancel(ev, force) { + if (!this.cancelEvents && !force) { + return; + } + ev.preventDefault(); + ev.stopPropagation(); + return false; +} +function inherits(child, parent) { + function f() { + this.constructor = child; + } + f.prototype = parent.prototype; + child.prototype = new f; +} +function indexOf(obj, el) { + var i = obj.length; + while (i--) { + if (obj[i] === el) + return i; + } + return -1; +} +function isThirdLevelShift(term, ev) { + var thirdLevelKey = (term.browser.isMac && ev.altKey && !ev.ctrlKey && !ev.metaKey) || + (term.browser.isMSWindows && ev.altKey && ev.ctrlKey && !ev.metaKey); + if (ev.type == 'keypress') { + return thirdLevelKey; + } + return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47); +} +Terminal.prototype.matchColor = matchColor; +function matchColor(r1, g1, b1) { + var hash = (r1 << 16) | (g1 << 8) | b1; + if (matchColor._cache[hash] != null) { + return matchColor._cache[hash]; + } + var ldiff = Infinity, li = -1, i = 0, c, r2, g2, b2, diff; + for (; i < Terminal.vcolors.length; i++) { + c = Terminal.vcolors[i]; + r2 = c[0]; + g2 = c[1]; + b2 = c[2]; + diff = matchColor.distance(r1, g1, b1, r2, g2, b2); + if (diff === 0) { + li = i; + break; + } + if (diff < ldiff) { + ldiff = diff; + li = i; + } + } + return matchColor._cache[hash] = li; +} +matchColor._cache = {}; +matchColor.distance = function (r1, g1, b1, r2, g2, b2) { + return Math.pow(30 * (r1 - r2), 2) + + Math.pow(59 * (g1 - g2), 2) + + Math.pow(11 * (b1 - b2), 2); +}; +function each(obj, iter, con) { + if (obj.forEach) + return obj.forEach(iter, con); + for (var i = 0; i < obj.length; i++) { + iter.call(con, obj[i], i, obj); + } +} +function wasMondifierKeyOnlyEvent(ev) { + return ev.keyCode === 16 || + ev.keyCode === 17 || + ev.keyCode === 18; +} +function keys(obj) { + if (Object.keys) + return Object.keys(obj); + var key, keys = []; + for (key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + keys.push(key); + } + } + return keys; +} +Terminal.translateBufferLineToString = BufferLine_1.translateBufferLineToString; +Terminal.EventEmitter = EventEmitter_1.EventEmitter; +Terminal.inherits = inherits; +Terminal.on = on; +Terminal.off = off; +Terminal.cancel = cancel; +module.exports = Terminal; + + + +},{"./BufferSet":2,"./CompositionHelper":4,"./EscapeSequences":5,"./EventEmitter":6,"./InputHandler":7,"./Linkifier":8,"./Parser":9,"./Renderer":10,"./SelectionManager":11,"./Viewport":13,"./handlers/Clipboard":14,"./utils/Browser":15,"./utils/BufferLine":16,"./utils/CharMeasure":17,"./utils/Mouse":21}]},{},[22])(22) +}); +//# sourceMappingURL=xterm.js.map diff --git a/src/main/resources/static/redame/img_32.png b/src/main/resources/static/redame/img_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0f76855e6cbc6693f7c69dd086dab9a5ec4ade24 GIT binary patch literal 100202 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 W2RCMSnH7mrz{N#mUgZjDfA}9bu(8en literal 0 HcmV?d00001 diff --git a/src/main/resources/templates/index.ftl b/src/main/resources/templates/index.ftl new file mode 100644 index 0000000..e24e5c9 --- /dev/null +++ b/src/main/resources/templates/index.ftl @@ -0,0 +1,68 @@ + + + + WebSSH + + + +
+ + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/ssh.html b/src/main/resources/templates/ssh.html new file mode 100644 index 0000000..e69de29