Compare commits

...
349 Commits
Author SHA1 Message Date
Paris Kasidiaris 01c20807c2 Bump version to 1.1.2
Signed-off-by: Paris Kasidiaris <paris@sourcelair.com>
2016-08-22 14:26:27 +00:00
Paris Kasidiaris 243ce59806 Merge pull request #240 from sourcelair/issue/239
Fix alt + arrow key movement
2016-08-22 17:28:23 +03:00
Paris Kasidiaris 5d6e0356b3 Add tests for arrow key movements 2016-08-22 17:21:58 +03:00
Paris Kasidiaris 8324b43cc2 Fix Alt + Arrow movement
Fix #239
2016-08-22 17:17:58 +03:00
Paris Kasidiaris 4c3ccc264c Bump version to 1.1.1
Signed-off-by: Paris Kasidiaris <paris@sourcelair.com>
2016-08-22 13:11:54 +00:00
Paris Kasidiaris 197c83d993 Merge pull request #234 from Tyriar/233_fix_cursor_on_top_of_ime
Ensure composition view is on top of cursor
2016-08-22 16:14:15 +03:00
Paris Kasidiaris aaded29855 Merge pull request #238 from sourcelair/gitter-badge
Add "Chat on Gitter" badge
2016-08-22 14:47:21 +03:00
Paris Kasidiaris e5656b9982 Add "Chat on Gitter" badge 2016-08-22 14:40:34 +03:00
Paris c06b08df5b Bump version to 1.1.0
Signed-off-by: Paris <paris@sourcelair.com>
2016-08-22 11:22:21 +00:00
Daniel Imms fc16752cec Merge pull request #236 from Tyriar/235_fix_scroll_to_top_on_app_mode
Disable onScroll event during application mode
2016-08-21 00:58:47 -07:00
Daniel Imms 588d3b12e0 Disable onScroll event during application mode
Fixes #235
2016-08-19 12:52:13 -07:00
Daniel Imms 7de7bdac71 Ensure composition view is on top of cursor
Fixes #233
2016-08-18 11:28:10 -07:00
Paris Kasidiaris 6e8e78db57 Merge pull request #230 from ayapi/refresh-viewport-height
Refresh the height of the viewport when the line-height changed
2016-08-18 20:35:39 +03:00
ayapi dcc991bd5c refresh the height of the viewport when the line-height changed 2016-08-18 19:37:16 +09:00
Daniel Imms 04cb9f33ff Merge pull request #226 from Tyriar/208_fix_ime_popup_pos
Reposition textview after composition view
2016-08-17 08:50:41 -07:00
Paris Kasidiaris 9bd167c10d Merge pull request #231 from meefik/patch-1
Fix incorrect mouse position
2016-08-17 11:57:16 +03:00
Anton Skshidlevsky dc6aab88b0 Fix incorrect mouse position
Incorrect mouse position in Midnight Commander
2016-08-17 10:38:12 +03:00
Paris Kasidiaris 43fc6f1fa3 Merge pull request #228 from ayapi/restore-customkeydownhandler
restore customKeydownHandler on reset(RIS)
2016-08-16 17:20:40 +03:00
ayapi c2aa0d75ec restore customKeydownHandler on reset(RIS) 2016-08-13 22:44:56 +09:00
Daniel Imms c24ae84b00 Fix tests 2016-08-12 10:27:49 -07:00
Daniel Imms 92605a9734 Reposition textview after composition view
Call the function again via setTimeout to allow changes after composition
events. This prevents the IME windows jumping sometimes on thesecond key
press.

Fixes #208
2016-08-12 10:21:41 -07:00
Daniel Imms b32a34b97c Merge pull request #224 from sourcelair/Tyriar-patch-2
Sync scroll bar height if the viewport height changes
2016-08-09 09:03:16 -07:00
Daniel Imms 12923a6649 Sync scroll bar height if the viewport height changes 2016-08-08 14:41:39 -07:00
Daniel Imms e7c7160f85 Merge pull request #218 from Tyriar/77_scroll_bar
Implement scroll bar
2016-08-08 12:52:12 -07:00
Paris Kasidiaris 2a0962183e Merge pull request #223 from sourcelair/Tyriar-patch-1
By more explicit in security warning
2016-08-08 20:14:14 +01:00
Daniel Imms 95d9ad46cf By more explicit in security warning
Calling out that the insecurity is due to the barebones implementation
of the demo will prevent people thinking that the library is inherently
insecure.
2016-08-08 10:38:01 -07:00
Daniel Imms e60513f554 Fix outline showing up when clicking terminal 2016-08-08 10:22:34 -07:00
Daniel Imms a557a82b40 Fix scrollbar being transparent on OS X 2016-08-08 10:22:19 -07:00
Paris Kasidiaris 3dd6f368d6 Merge pull request #220 from sourcelair/improve-demo
Introduce resizing option in demo
2016-08-08 14:35:02 +01:00
Paris 5ce012bdac Add notice about security risks 2016-08-08 16:28:29 +03:00
Paris Kasidiaris a2338c49b9 Merge pull request #222 from sourcelair/signed-releases
Require release commits to be signed
2016-08-05 14:56:00 +01:00
Paris Kasidiaris dd6886f358 Merge pull request #221 from odino/patch-1
Update pty.js
2016-08-05 14:55:14 +01:00
Paris 5ddf6301c2 Add Sign-Off flag as well 2016-08-05 16:49:04 +03:00
Paris 14dd2c0afb Require release commits to be signed 2016-08-05 11:21:27 +00:00
Alessandro Nadalin fc2a0d3e65 Update pty.js 2016-08-05 13:59:21 +04:00
Paris 0f8fc63a5e First functional resizing demo
Fix #211
2016-08-05 12:28:22 +03:00
Paris f57a40eeb3 First batch of improvements to demo
- Used fetch tentatively
- Implemented resize endpoint
- Create terminals with the appropriate size
2016-08-05 08:46:49 +00:00
Daniel Imms 2c9c95f531 Add another test 2016-08-04 18:56:33 -07:00
Daniel Imms 7048f6edf7 Add some tests, fix app keypad mode bug 2016-08-04 18:34:04 -07:00
Paris Kasidiaris c333cfa073 Merge pull request #214 from mentos1386/mentos1386-linkify
Make linkify links open in new tab/window
2016-08-04 14:31:29 +01:00
Tine Jozelj 64d77d2491 Making it more human readable 2016-08-04 15:22:45 +02:00
Tine Jozelj 9604674c65 Default without target atribute 2016-08-04 15:05:09 +02:00
Tine Jozelj d9294779a6 Add target as option
You can now provide target argument if you want to modify target attribute on links. It defaults to `_self` to keep current behavior.
2016-08-04 14:58:42 +02:00
Paris Kasidiaris 3117fe9465 Merge pull request #219 from sourcelair/issue/198
Update README and remove screenshot
2016-08-04 11:07:20 +01:00
Paris 0a74b9aa3b Fix typos 2016-08-04 13:00:47 +03:00
Paris 7e90576391 Update README and remove screenshot 2016-08-04 12:01:37 +03:00
Daniel Imms 0a34885fbc Fix line-height after rowContainer moved out of viewport 2016-08-03 18:27:43 -07:00
Daniel Imms 61201525a8 Remaining jsdoc 2016-08-03 18:27:19 -07:00
Daniel Imms 1b886a4420 Disable the scroll bar when in application keypad mode 2016-08-03 18:12:44 -07:00
Daniel Imms 6f70984ab6 Drop support for old mouse wheel APIs
All browsers have supported the WheelEvent (onwheel) for sometime now, since
Firefox does not support onmousewheel which is also non-standard but works with
the standard interface, it makes sense to drop support now.
2016-08-03 13:41:55 -07:00
Daniel Imms 38fa2d78da Support DOMMouseScroll event (Firefox) 2016-08-03 13:00:07 -07:00
Daniel Imms fe905bace5 Prevent the page from scrolling when the terminal scrolls 2016-08-03 12:49:12 -07:00
Daniel Imms e7e1434293 Clean up, refresh sizes when font-size changes 2016-08-03 12:47:36 -07:00
Daniel Imms 363c647a5f Sync scroll bar on more sensible events 2016-08-03 11:27:16 -07:00
Daniel Imms aac60eb029 Add support for WheelEvent.deltaMode 2016-08-03 10:16:08 -07:00
Daniel Imms 06ca03ae9c Get it working 2016-08-02 18:36:24 -07:00
Daniel Imms ff927b8e79 Implement basic scroll bar 2016-08-02 16:59:50 -07:00
Daniel Imms 670b0d58c7 Add base viewport, set line height
Fixes #149
2016-08-02 12:42:13 -07:00
Tine Jozelj 3113cdf0ea Make linkify links open in new tab/window
I believe this behavior is more appropriate.
2016-08-02 15:57:15 +02:00
Paris Kasidiaris d2cef6f29d Merge pull request #210 from Tyriar/209_hide_textarea_when_not_composing
Hide textarea off-screen when not composing
2016-08-01 11:35:06 +03:00
Daniel Imms d62bd5f748 Get rid of rogue whitespace 2016-07-28 11:15:20 -07:00
Daniel Imms e6fd1381ce Hide textarea off-screen when not composing
Fixes #209
2016-07-28 11:13:24 -07:00
Daniel Imms 65b2be7831 Merge pull request #186 from Tyriar/118_support_custom_keydown_handler
Allow custom keydown handler to be attached
2016-07-22 05:21:28 -07:00
Daniel Imms e2d0de2686 Fix test 2016-07-22 05:18:28 -07:00
Daniel Imms 495b2d7fbb Merge remote-tracking branch 'upstream/master' into 118_support_custom_keydown_handler 2016-07-22 05:12:52 -07:00
Paris Kasidiaris 5e662d0eb7 Merge pull request #203 from Tyriar/124_fix_focus_blur
Correct blur/focus delegation
2016-07-22 14:26:48 +03:00
Daniel Imms 892db98c96 Correct blur/focus delegation
Focus and blur events on the Terminal object are delegated to the textarea
which handles everything.
2016-07-22 04:14:05 -07:00
Paris Kasidiaris 10fbf0dccc Merge pull request #175 from Tyriar/124_add_textarea_back
Add textarea back and support IMEs
2016-07-22 11:50:23 +03:00
Daniel Imms 4595a18197 Tidy up blur/focus handlers 2016-07-21 10:51:43 -07:00
Daniel Imms 577a3d81e5 Use explicit boolean comparison 2016-07-21 10:32:20 -07:00
Paris Kasidiaris 55fb5dbcb5 Merge pull request #200 from jerch/fix_193
fixing arrow key sequences
2016-07-21 15:00:17 +03:00
Jörg Breitbart 8e7eeff45c fixing test cases 2016-07-21 12:47:19 +02:00
Jörg Breitbart ec7130b46f fixing arrow key sequences 2016-07-21 12:39:36 +02:00
Paris Kasidiaris dc17f0d02e Merge pull request #192 from sourcelair/bump-version-1-0-0
Bump version to 1.0.0
2016-07-18 11:21:47 +03:00
Paris 14cd4315c7 Bump version to 1.0.0 2016-07-18 07:50:07 +00:00
Paris Kasidiaris 644d881787 Merge pull request #191 from sourcelair/prepare-release-script
Introduce prepare release script
2016-07-18 10:47:00 +03:00
Paris 7fdfc62237 Introduce prepare-release script 2016-07-18 10:43:35 +03:00
Paris 9fa0f00c23 Add AUTHORS and AUTHORS generator script 2016-07-18 10:04:04 +03:00
Paris Kasidiaris fe6aaa3664 Merge pull request #190 from sourcelair/contributing-md
Introduce CONTRIBUTING.md and Contributing section in README.md
2016-07-18 09:40:09 +03:00
Paris 6e6b527d6e Improve issue template 2016-07-18 09:36:39 +03:00
Paris 94d0009994 Add issue template 2016-07-18 09:36:01 +03:00
Paris 7cd99d1559 Add Development and Contribution section in README.md 2016-07-17 22:04:48 +03:00
Paris d91fa3b6fb Add CONTRIBUTING.md 2016-07-17 18:55:49 +00:00
Paris Kasidiaris 466dca361c Merge pull request #187 from Tyriar/remove_linkify_from_readme
Switch linkify for fit in readme
2016-07-17 21:46:19 +03:00
Paris Kasidiaris 8b24c39a1d Merge pull request #184 from Tyriar/patch-2
Add statement on browser support
2016-07-17 18:48:23 +03:00
Daniel Imms 9dd64dfb49 Switch linkify for fit in readme
Linkify doesn't work currently so it shouldn't be used as an example.
2016-07-15 16:41:40 -07:00
Daniel Imms 0010a5a109 Explicitly return from keydown 2016-07-15 16:33:30 -07:00
Daniel Imms 9cb5b005bb Add tests 2016-07-15 16:31:57 -07:00
Daniel Imms 06a3aa6cf8 Merge remote-tracking branch 'upstream/master' into 118_support_custom_keydown_handler 2016-07-15 16:21:06 -07:00
Daniel Imms d4e9d34d2d Allow custom keydown handler to be attached
Fixes #118
2016-07-15 16:16:37 -07:00
Daniel Imms a3a7017f6b Fix tests 2016-07-15 10:22:31 -07:00
Daniel Imms fedc1fd325 Fix keydown conditional 2016-07-15 10:17:29 -07:00
Daniel Imms 11d5f51e67 Merge remote-tracking branch 'upstream/master' into 124_add_textarea_back 2016-07-15 10:13:56 -07:00
Daniel Imms 2c810ce763 Add note about support intentions 2016-07-15 10:12:55 -07:00
Daniel Imms b61e81d5b4 Add latest Edge version as supported, alphabetize 2016-07-15 10:10:10 -07:00
Daniel Imms 534a9e7f5a Big clean up
Move keydown event to CompositionHelper
Move call in refresh to be handled with an event
2016-07-13 21:50:00 -07:00
Daniel Imms 14a62c0f8b Add test cases for Japanese 2016-07-13 21:22:27 -07:00
Daniel Imms 89d29bbc10 Fix non-composition char input after composition char + test 2016-07-13 21:02:43 -07:00
Daniel Imms ac8db6e8ec jsdoc handleAnyTextareaChanges 2016-07-13 20:52:55 -07:00
Daniel Imms 0a7c1bfd98 Position the textarea below the cursor during a composition
This will position any IME helper in the correct position
2016-07-13 20:46:43 -07:00
Daniel Imms 4efb8d24ac Don't wrap multi-character compositions 2016-07-13 20:34:55 -07:00
Daniel Imms 38d08873bc Don't finalize composition on modifier key presses 2016-07-13 20:34:43 -07:00
Daniel Imms 8074d754d3 Only position composition view if a cursor is visible 2016-07-13 20:12:49 -07:00
Daniel Imms f3db84decb Add statement on browser support
Fixes #183
2016-07-13 15:28:14 -07:00
Paris Kasidiaris 13644ce351 Merge pull request #178 from sourcelair/issue/169
Fix entering hash (#) on British keyboard layout
2016-07-13 20:18:41 +03:00
Daniel Imms e1c1b07a0b Add test cases for Korean 2016-07-13 08:37:24 -07:00
Paris 42ec3b492a Clarify isThirdLevelShift 2016-07-13 17:53:33 +03:00
Daniel Imms c18794f202 Merge remote-tracking branch 'upstream/master' into 124_add_textarea_back 2016-07-13 07:14:14 -07:00
Paris 0862fd1f59 Fix thirdLevelKey clause 2016-07-13 17:10:45 +03:00
Paris 6663a947ee Separate dummy keyDown and keyPress events in tests 2016-07-13 16:48:48 +03:00
Paris 3e8bb98197 Fix #169 2016-07-13 16:35:57 +03:00
Paris Kasidiaris 9b2f68a25d Merge pull request #177 from sourcelair/document-everything-part-2
Document all public methods of Xterm
2016-07-13 15:38:18 +03:00
Paris 11a7cd6983 Fix all leading whitespaces (eliminate tabs) 2016-07-13 13:24:53 +03:00
Paris 7d904e455d Fix leading whitespaces (eliminate tabs) 2016-07-13 13:22:51 +03:00
Paris c3cf6a22e9 Document all public methods 2016-07-13 13:14:02 +03:00
Paris 12a150a438 Document more public methods and transform comments to JSDoc compatible 2016-07-13 13:03:40 +03:00
Daniel Imms 8b46e84263 Use correct .terminal-cursor for composition view 2016-07-12 21:42:10 -07:00
Daniel Imms 237e6819bf Fix tests 2016-07-12 20:55:24 -07:00
Daniel Imms 8faea59e31 Handle non-composition input when IME is active 2016-07-12 20:51:55 -07:00
Daniel Imms cab79c473f jsdoc and tidy up 2016-07-12 20:26:18 -07:00
Daniel Imms c656ed04b0 Use handler not write, fix other edge cases 2016-07-12 20:19:26 -07:00
Daniel Imms 29000fb79e Refactor into CompositionHelper object 2016-07-12 19:14:56 -07:00
Daniel Imms 03fa017d4a Re-hide the textarea 2016-07-12 18:49:37 -07:00
Daniel Imms 26af6ffd4d Get IMEs working 2016-07-12 18:48:08 -07:00
Daniel Imms 7d8e28a7dd Merge remote-tracking branch 'upstream/master' into 124_add_textarea_back 2016-07-12 17:02:11 -07:00
Daniel Imms a52b7e7a4e Add starting point for IME support 2016-07-12 16:50:07 -07:00
Daniel Imms aaedcfc700 Support focus class on the .xterm element 2016-07-12 16:18:05 -07:00
Daniel Imms fc7b22dc48 Manually revert textarea changes 2016-07-12 16:03:31 -07:00
Paris Kasidiaris 5b44e36317 Merge pull request #161 from jerch/tests_xterm
xterm test cases
2016-07-13 00:46:44 +03:00
Jörg Breitbart 82f5de3bb9 Merge branch 'tests_xterm' of https://github.com/jerch/xterm.js into tests_xterm 2016-07-12 21:27:06 +02:00
Jörg Breitbart dcf30b40c0 cleanup xterm test file 2016-07-12 21:26:38 +02:00
Jörg Breitbart 3b89134c05 selecting sucessful tests 2016-07-12 21:26:38 +02:00
Jörg Breitbart d76d50677d adding xterm comparison tests 2016-07-12 21:26:38 +02:00
Paris Kasidiaris 8790a94a56 Merge pull request #165 from sourcelair/first-docs
Document several public methods
2016-07-10 03:57:05 +03:00
Jörg Breitbart 308535dc5c cleanup xterm test file 2016-07-09 14:57:57 +02:00
Paris Kasidiaris efe5b20b73 Merge pull request #168 from freebroccolo/master
⬆️ pty.js@0.3.1
2016-07-09 01:47:52 +03:00
Darin Morrison d1a6e8de3b ⬆️ pty.js@0.3.1 2016-07-07 12:42:49 -06:00
Paris f3cf646bbf Better document scrollDisp 2016-07-06 12:37:45 +03:00
Paris a39b309b74 Remove most public directives 2016-07-06 12:36:11 +03:00
Paris 1aeb562066 progress 2016-07-06 09:32:40 +00:00
Paris 107d1a1496 First chunk of documentation 2016-07-06 09:32:40 +00:00
Paris Kasidiaris 39edbfb655 Merge pull request #163 from jerch/fix_147_162
fixing #147 and #162
2016-07-06 12:29:01 +03:00
Jörg Breitbart 246b0edaa1 disable refresh for tests 2016-07-06 00:23:10 +02:00
Jörg Breitbart 4afa08da8d fixing #147 and #162 2016-07-05 23:54:15 +02:00
Jörg Breitbart dc5b525559 selecting sucessful tests 2016-07-05 14:55:03 +02:00
Paris Kasidiaris 30251e5d7c Merge pull request #160 from Tyriar/159_fix_nbsp_resize
Have ' ' chars get inserted correctly after a resize
2016-07-05 13:53:34 +03:00
Paris Kasidiaris 81e231ea20 Merge pull request #155 from Tyriar/154_fix_resize_at_top_exception
Fix exception when increasing size when viewport is at top of buffer
2016-07-05 12:56:45 +03:00
Jörg Breitbart 36930e9661 adding xterm comparison tests 2016-07-05 11:36:30 +02:00
Daniel Imms 838c11b69c Have ' ' chars get inserted correctly after a resize
Since the character spec didn't contain a character width it was being skipped
during refresh.

Fixes #159
2016-07-04 13:17:08 -07:00
Daniel Imms 05041722f1 Correct if condition 2016-07-04 12:15:47 -07:00
Paris Kasidiaris 36eb7efe5e Merge pull request #153 from sourcelair/fix/pasting
Fix Ctrl+Shift+V pasting
2016-06-30 14:29:28 +03:00
Daniel Imms 87c9370e8c Fix exception when increasing size when viewport is at top of buffer
Fixes #154
2016-06-30 02:05:06 -07:00
TDaglis 0b018fd4e9 Fix Ctrl+Shift+V pasting 2016-06-30 10:58:00 +03:00
Paris Kasidiaris 39c4356ef6 Merge pull request #148 from bfis/fix/MouseEvent_clone
Fix MouseEvent cloning
2016-06-27 16:04:33 +03:00
Benjamin Fischer 59b79e9b04 Fix MouseEvent cloning
Cloneing MouseEvent instances via __proto__ (lline 1099) caused the cloned object to be broken and throw "TypeError: Illegal invocation" during property access ("ev.shiftKey" line 1020).
2016-06-27 13:27:19 +02:00
Paris Kasidiaris b2e940f305 Merge pull request #144 from jerch/wcwidth
wcwidth calculation
2016-06-27 12:02:47 +03:00
Jörg Breitbart c3bc59b5e1 adding unicode test cases 2016-06-26 12:50:06 +02:00
Jörg Breitbart e3126ba3f8 cleanup 2016-06-25 10:12:21 +02:00
Jörg Breitbart f951abb7a9 wcwidth only for printables 2016-06-24 16:25:00 +02:00
Paris Kasidiaris 549a8cd31b Merge pull request #142 from Tyriar/patch-1
Only blink cursor if the terminal has focus
2016-06-24 05:58:38 -07:00
Jörg Breitbart 874ba72f4e wcwidth calculation 2016-06-24 14:16:12 +02:00
Daniel Imms ea1fd3d01b Only blink cursor if the terminal has focus
Fixes #141
2016-06-23 22:16:29 -07:00
Paris Kasidiaris 4c6b993458 Merge pull request #138 from dbkaplun/disable-ligatures
Disable ligatures which mess up rendering for certain fonts
2016-06-23 18:39:52 -07:00
Dan Kaplun 323cc44e0e Disable ligatures 2016-06-23 15:07:38 -07:00
Antonis Kalipetis 8bf81875ca Merge pull request #130 from Tyriar/windows_demo
Get demo working on Windows
2016-06-23 11:52:16 +03:00
Daniel Imms 15cf76c767 Bind to 127.0.0.1 on Windows only 2016-06-22 20:43:41 -07:00
Daniel Imms 3df272fb92 Merge remote-tracking branch 'upstream/master' into windows_demo 2016-06-22 20:36:05 -07:00
Paris Kasidiaris 04a8137f09 Merge pull request #137 from sourcelair/improve-paste
Fix cumbersome pasting with Cmd + V
2016-06-19 20:45:31 +03:00
Paris 3217a4bee4 Fix cumbersome pasting with Cmd + V
For some reason, setting the element's contentEditable value to true within a keyboard event, while the element has focus, did not allow pasting with clipboard, unless the element gets clicked explicitly.
2016-06-19 06:12:25 +03:00
Daniel Imms 2aab58473e Fix npm scripts 2016-06-16 16:31:01 -07:00
Daniel Imms 5d3bac6a86 Merge remote-tracking branch 'upstream/master' into windows_demo 2016-06-16 16:28:20 -07:00
Paris Kasidiaris 09d67a6c52 Merge pull request #131 from sourcelair/issue/120
Fix focus and blur events emission
2016-06-16 17:06:10 +03:00
Paris af7588ef16 On big refreshes remove term.rowContainer instead of term.element from DOM
Fix #120
2016-06-16 11:47:05 +03:00
Paris a6e85ad5f5 Progress with #120 2016-06-16 11:41:41 +03:00
Paris Kasidiaris d5e83902a5 Merge pull request #133 from Tyriar/132_fix_constant_focus
Only refresh when asked
2016-06-15 12:53:31 +03:00
Paris Kasidiaris 055614bbbc Merge pull request #121 from Tyriar/119_fix_cursor_blink
Fix cursor blinking when enabled
2016-06-15 09:51:49 +03:00
Daniel Imms 0d803ac895 Use CSS animations 2016-06-14 10:52:49 -07:00
Daniel Imms 253babff62 Merge remote-tracking branch 'upstream/master' into 119_fix_cursor_blink 2016-06-14 10:36:56 -07:00
Daniel Imms fac964bcf5 Only refresh when asked
Fixes #132
2016-06-14 10:33:24 -07:00
Paris Kasidiaris 02d809c194 Merge pull request #117 from Tyriar/86_protect_max_refresh
Bound refresh max rows to this.rows not this.lines
2016-06-14 11:11:04 +03:00
Paris Kasidiaris 5d1b6cfe97 Merge pull request #129 from sourcelair/docs
Improve docs building script and template
2016-06-14 10:56:08 +03:00
Paris Kasidiaris e37a9b62b7 Merge pull request #128 from Tyriar/127_debounce_refresh
Allow refresh to execute 30 times a second maximum
2016-06-14 10:49:53 +03:00
Daniel Imms 623853f3f4 Get demo working on Windows
- Removed bin bash scripts in favor of npm scripts so they work
  cross-platform
- Moved to use 127.0.0.1 as 0.0.0.0 doesn't work on Windows

Note that this doesn't work with the current pty.js as it doesn't build on
Windows.
2016-06-13 15:55:47 -07:00
Paris Kasidiaris 6c892e7161 Merge pull request #125 from sourcelair/addon-loader
Implement addon loader (CommonJS + RequireJS)
2016-06-14 00:58:23 +03:00
Paris be304c6ee7 Implement docs building 2016-06-14 00:21:17 +03:00
Paris 00f380a75c Implement test 2016-06-14 00:05:47 +03:00
Daniel Imms af29effbf3 Allow refresh to execute 30 times a second maximum
For commands that pass a significant amount of output to the write function,
this prevents the terminal maxing out the CPU and making the UI unresponsive.
While commands can still run beyond what they do on the terminal, it is far
better with a debounce in place as every single terminal manipulation does not
need to be constructed in the DOM.

A side-effect of this is that it makes ^C to interrupt a process seem more
responsive.

Fixes #127
Fixes #126
2016-06-13 12:40:56 -07:00
Paris 57300f5159 Implement addon loader (CommonJS + RequireJS)
Closes #96
2016-06-13 19:07:29 +03:00
Paris Kasidiaris 9d34ed8781 Merge pull request #122 from Tyriar/demo_options
Add basic options selection to demo
2016-06-13 15:03:10 +03:00
Paris Kasidiaris f3dd0a4ec8 Merge pull request #123 from Tyriar/jsdoc
Add some jsdoc for important functions
2016-06-13 14:58:17 +03:00
Antonis Kalipetis 9371520a73 Merge pull request #93 from Tyriar/linkify_ip_addr
Add IP addresses to linkify
2016-06-13 14:53:17 +03:00
Daniel Imms fd5be55d81 Add some jsdoc for important functions
Part of #13
2016-06-10 20:05:26 -07:00
Daniel Imms e0c0fb6917 Add basic options selection to demo
This will make it easier to test options without needing to modify the demo.
2016-06-10 19:15:58 -07:00
Daniel Imms f2f0f460c4 Add a bunch of tests 2016-06-10 18:53:32 -07:00
Daniel Imms 08928d8b8e Merge remote-tracking branch 'upstream/master' into linkify_ip_addr 2016-06-10 18:08:39 -07:00
Daniel Imms cb4728f8f5 Tidy up code 2016-06-10 18:05:24 -07:00
Daniel Imms 4a71a41380 Fix cursor blinking when enabled
Fixes #119
2016-06-10 18:05:13 -07:00
Daniel Imms 9c3b1105e2 Check optional port clause after domain too 2016-06-10 13:15:59 -07:00
Daniel Imms edf897182e Bound refresh max rows to this.rows not this.lines
this.row is the size of rows in the viewport, this.lines is the buffer. It's
only possible to refresh `0` to `this.rows - 1`.

Fixes #86
2016-06-10 13:08:43 -07:00
Paris Kasidiaris 7c1559b8ad Merge pull request #60 from runarberg/master
Fix cross platform input problems
2016-06-10 19:32:45 +03:00
runarberg b01165c1f8 Fix third level shifts for Mac OS and windows
ISO third level keys were not working. That prevented some inputting
important characters (like pipe `|` and caret `^`) on some keyboard
layouts.

Instead of parsing the user-agent string to find the users os, we now
look into the `platform` attribute of the `navigator` object.

Removed the hijacking of the command key `⌘` on Mac OS as the `Alt` key
on other systems.
2016-06-10 16:14:31 +00:00
Paris Kasidiaris b5d9c6b113 Merge pull request #115 from sourcelair/decimal-terminal-flags
Stop using binary literals
2016-06-10 19:07:25 +03:00
Paris 5a56849df8 Stop using binary literals. Non ES6 compatible 2016-06-10 19:02:49 +03:00
Paris Kasidiaris c908f849c5 Merge pull request #114 from sourcelair/fix-copy-nbsp
Stop copying non-breaking spaces into clipboard
2016-06-10 17:05:10 +03:00
Paris fed92ac5c8 Implement tests 2016-06-10 16:35:56 +03:00
Paris 00f4232ecc Export copied text processing to static method 2016-06-10 16:27:58 +03:00
Paris fa1cd89aa9 Fix copying of non-breaking spaces 2016-06-10 16:17:14 +03:00
Antonis Kalipetis 5193f4fae0 Merge pull request #109 from Tyriar/65_send_ctrl_l_r_key
Jump over words with ctrl+left/right
2016-06-10 15:57:10 +03:00
Daniel Imms 740ae96f5f Merge remote-tracking branch 'upstream/master' into 65_send_ctrl_l_r_key 2016-06-10 03:00:22 -07:00
Paris Kasidiaris 55ca998224 Merge pull request #110 from Tyriar/64_cursor_disappears_when_scrolling
Draw cursor at correct position when scrolling
2016-06-10 12:22:28 +03:00
Paris Kasidiaris fdff1ca793 Merge pull request #107 from runarberg/fix/ctrl-or-shift-insert-copy-pasting
Allow Ctrl/Shift + insert to copy/paste on windows and linux
2016-06-10 11:57:15 +03:00
Paris Kasidiaris fa729b8306 Merge pull request #112 from Tyriar/111_scroll_with_blank_lines_after_cursor
Improve scroll to work with blank lines after the cursor
2016-06-10 11:40:08 +03:00
Daniel Imms eee99f62e1 Improve scroll to work with blank lines after the cursor
This commit works fixes scrolling when there were blank lines after the cursor.
Here is what it does (blank rows are those added by running `clear`):

when increasing rows:
  if there are blank rows below the cursor:
    add a blank row to the bottom
  else if there is room in the buffer above the viewport
    scroll up
  else
    add a blank row to the bottom

when decreasing rows:
  if there are blank rows below the cursor:
    remove a blank row from the bottom
  else
    scroll down

Fixes #111
2016-06-09 21:13:48 -07:00
Daniel Imms da9f86f1a7 Draw cursor at correct position when scrolling
Fixes #64
2016-06-09 19:59:59 -07:00
Daniel Imms 0535f9425b More escape sequence tests 2016-06-09 19:25:29 -07:00
Daniel Imms c86fd87819 Add tests for F-keys 2016-06-09 19:00:40 -07:00
Daniel Imms 3a866cf202 Refactor escape sequence code and add tests 2016-06-09 18:41:54 -07:00
Daniel Imms e2aaa8d362 Jump over words with ctrl+left/right
Escape codes used: 5=ctrl, C=right, D=left

Fixes #65
2016-06-09 18:01:12 -07:00
runarberg 524db02228 Fix Ctrl/Shift + insert copy/paste
Many systems (including MS Windows and many linuxes) map `<Ctrl>` +
`<Insert>` to copy and `<Shift> + <Insert>` to paste. That serves as a
handy fallback when the more common `<Ctrl> + C` and `<Ctrl> + V`
keybindings have their default prevented to send signals to the
terminal.

Currently all keydown-events with the insert key send `\x1b[2~` to the
terminal. This commit won't send that key if either the `shiftKey` or
the `ctrlKey` are present. Instead it will enable `contentEditable` to
allow for pasting.
2016-06-09 13:45:02 +00:00
Paris Kasidiaris cf9d2348a1 Merge pull request #97 from Tyriar/redundant_resize
Don't resize when unnecessary
2016-06-09 10:53:16 +03:00
Paris Kasidiaris 92122bf29b Merge pull request #105 from sourcelair/issue/46
Introduce testing environment for xterm.js
2016-06-09 10:29:34 +03:00
Paris abb7a49584 Add CXX environment 2016-06-09 10:22:49 +03:00
Paris beff0db301 Add apt addon in travis for node-gyp dependency of pty.js 2016-06-09 10:18:39 +03:00
Paris ab1526b085 Add travis ci build status in xterm.js 2016-06-09 10:10:36 +03:00
Paris b91e737017 Add .travis.yml 2016-06-09 10:08:44 +03:00
Paris fa093e2bd2 Set up environment for testing 2016-06-09 10:04:53 +03:00
Paris Kasidiaris 2f001f8af9 Merge pull request #102 from Tyriar/dont_crash_demo_refresh
Don't crash demo server on refresh
2016-06-09 09:49:28 +03:00
Paris f87300d30e Remove old test-suite completely 2016-06-09 09:49:11 +03:00
Paris Kasidiaris 04ae96617d Merge pull request #101 from Tyriar/fix_resize_buffer
Fix buffer corruption after resizing rows
2016-06-09 09:13:06 +03:00
Daniel Imms 7a80efd8bd Don't crash demo server on refresh
Fixes #100
2016-06-08 19:28:55 -07:00
Daniel Imms df268ad5cd Fix buffer corruption after resizing rows
Lines from the buffer were incorrectly being removed when the viewport was
resized. This change removes the lines when the cursor is above them, if not it
shifts the viewport down. Some basic jsdoc comments were added to some Terminal
properties for future reference.

Fixes #98
Fixes #99
2016-06-08 19:08:32 -07:00
Daniel Imms e721bdc9f0 Don't resize when unnecessary 2016-06-08 17:38:34 -07:00
Paris Kasidiaris ae99ad83d0 Merge pull request #84 from sourcelair/fix/terminal-focus-event
Fix emission of terminal focus&blur events
2016-06-09 00:00:05 +03:00
Paris Kasidiaris c491537de1 Merge pull request #95 from sourcelair/issue/85
Stop marking spans as `inline-block`
2016-06-08 22:09:21 +03:00
Paris 383d59bbc3 Stop marking spans as inline-block (not needed after 670b179140)
Fix #85
2016-06-08 22:03:45 +03:00
Paris Kasidiaris 2471910244 Merge pull request #94 from Tyriar/patch-2
Add section on addons to README
2016-06-08 21:30:34 +03:00
Daniel Imms 2a36ff0839 Merge remote-tracking branch 'upstream/master' into patch-2 2016-06-07 23:34:35 -07:00
Paris Kasidiaris 136c838f30 Merge pull request #89 from Tyriar/readme_demo
Add demo section to README
2016-06-08 09:19:18 +03:00
Paris Kasidiaris bd3936cc9f Merge pull request #88 from Tyriar/patch-1
Add http:// to demo output address
2016-06-08 09:17:49 +03:00
Daniel Imms dab80b58ae Add section on addons to README 2016-06-07 22:31:39 -07:00
Daniel Imms 23cfa3d824 Add IP addresses to linkify
Fixes #91
2016-06-07 22:12:38 -07:00
Daniel Imms 289ff8092d Add demo section to README
Fixes #87
2016-06-07 17:08:37 -07:00
Daniel Imms 47b01786e2 Add http:// to demo output address
This makes it easy to launch the demo in a browser by right clicking the URL in
gnome-terminal
2016-06-07 16:43:33 -07:00
TDaglis 6bc1881727 Fix emission of terminal focus&blur events 2016-06-07 13:58:00 +03:00
Paris Kasidiaris 21d765b227 Merge pull request #82 from sourcelair/issue/79
Make cursor hollow on blur
2016-06-07 13:44:36 +03:00
Paris d82c008052 Make cursor hollow on blur
Fix #79
2016-06-07 10:42:21 +00:00
Paris Kasidiaris 11823ce890 Merge pull request #83 from sourcelair/issue/76
Set line height of terminal rows to normal
2016-06-07 13:39:47 +03:00
Paris 670b179140 Set line height of terminal rows to normal
Fix #76
2016-06-07 12:23:28 +03:00
Paris Kasidiaris 637c2eae43 Merge pull request #81 from sourcelair/bash-demo
Implement fully featured bash terminal demo with a static terminal fallback
2016-06-07 11:43:58 +03:00
Paris 53e8df40bb Implement fully featured terminal demo w/ static fallback 2016-06-07 08:41:41 +00:00
Paris Kasidiaris 180a7af75d Merge pull request #78 from sourcelair/drop-hidden-textarea
Drop hidden textarea for input handling
2016-06-07 09:36:44 +03:00
Paris 0fd0f45d8b Fix indentation 2016-06-06 19:38:13 +03:00
Paris 8754f8d895 Fix focus and blur events 2016-06-05 03:59:52 +00:00
Paris c02cc84498 Fix cut and copy events
- Do not actually cut on cut
- Strip trailing whitespaces on copy (fix #66)
2016-06-05 06:35:33 +03:00
Paris 647216876b Add a few hacks for better paste handling across browsers 2016-06-03 11:04:46 +03:00
Paris f3bd6145a5 Vanish selection when a key with data is being pressed 2016-06-02 13:31:38 +03:00
Paris 7320515820 Tiny styling update in row line height 2016-06-02 13:08:06 +03:00
Paris 8fa1a46584 Handle the paste event better 2016-06-02 13:05:58 +03:00
Paris fa7d214e78 Remove even more useless code 2016-06-02 12:35:03 +03:00
Paris 178b611b0c Remove useless methods 2016-06-02 12:27:43 +03:00
Paris Kasidiaris 1f28c22323 Merge pull request #74 from Tyriar/master
Remove extra whitespace from class names
2016-06-02 12:26:55 +03:00
Daniel Imms ae0f963799 Remove extra whitespace from class names
Use [].join to retain browser compatibility

Fixes #73
2016-06-02 02:17:03 -07:00
Paris 82cac90005 Remove helper styling from xterm.css 2016-06-02 12:02:51 +03:00
Paris 8ebfa27210 Merge branch 'master' of github.com:sourcelair/xterm.js into content-editable 2016-06-02 12:00:31 +03:00
Paris Kasidiaris 4babc92d7c Merge pull request #58 from sourcelair/issue/57
Proper rendering of inverse data in default colors
2016-05-30 23:37:01 +03:00
Paris 1a3846161a Proper rendering of inverse data in default colors
Fix #57
2016-05-30 16:03:26 +00:00
Paris Kasidiaris ff7d0e58dc Merge pull request #56 from sourcelair/issue/54
Explicitly adjust height of terminal rows and child elements
2016-05-30 14:52:59 +03:00
Paris 3d64f91a5c Properly adjust height of terminal rows and child elements
Fix #54
2016-05-26 11:41:42 +03:00
Paris Kasidiaris f980f32fe5 Merge pull request #53 from sourcelair/issue/52
Make all add-ons CommonJS importable
2016-05-04 11:24:36 +03:00
Paris dc67c94545 Change CommonJS package structure
Instead of making Xterm prototype extending optional, just require Xterm and pass it as parameter to the function just like it is being done with RequireJS
2016-05-03 12:48:16 +03:00
Paris fff56eea1b Extend Xterm prototype only when Xterm is a function
Add-ons attempted to extend the `Xterm` prototype no matter what. This was an issue when importing add-ons through CommonJS, where `Xterm` is not available in the global scope.
2016-05-03 12:36:21 +03:00
Paris bd2158613d Make all add-ons CommonJS importable
- Fix #52
- Rename `npm/nodejs project` documentation to `CommonJS environment`
2016-05-03 12:05:13 +03:00
Paris 537fbad705 Bump version to 0.33 2016-04-26 12:17:41 +03:00
Paris Kasidiaris 52cc8fa5fe Merge pull request #51 from blink1073/fix-blink
Fix cursor blink
2016-04-23 02:26:55 +03:00
Steven Silvester 7988f634f3 Handle focus clearing 2016-04-21 07:57:13 -05:00
Steven Silvester a5e34e2288 Fix cursor blink 2016-04-20 15:41:33 -05:00
Paris Kasidiaris ad3764ae4a Merge pull request #50 from blink1073/fix-resize
Use shift() when reducing lines to preserve lines up to cursor
2016-04-20 18:36:38 +03:00
Steven Silvester 685bc54bf2 Use shift to reduce lines to preserve lines up to cursor 2016-04-14 06:35:44 -05:00
Paris Kasidiaris a54eb8ac44 Merge pull request #49 from noseglid/nodejs-module
nodejs module definition
2016-04-12 14:18:03 +03:00
Alexander Olsson 6a87253d94 nodejs module definition
Allow importing xterm into  a nodejs application (for instance an electron
application, or perhaps a test environment using phantomjs which
also has a DOM),
2016-04-11 15:08:47 +02:00
Paris 6406a88ddf pointless 2016-04-08 18:10:27 +03:00
Paris 18b2a1c3b4 Handle drop event 2016-03-10 02:55:24 +02:00
Paris 58056df23d Start working on replacing textarea with contentEditable 2016-03-10 02:07:10 +02:00
Paris a88e27cc7d Bump version to 0.32 2016-02-09 14:50:34 +02:00
Paris 7cab2501da Merge branch 'master' of github.com:sourcelair/xterm.js 2016-02-09 12:49:21 +00:00
Paris dd93e62a41 Update README 2016-02-09 14:48:54 +02:00
Paris d238a1998c Update .gitignore to ingore npm logs 2016-02-09 14:42:33 +02:00
Paris Kasidiaris 6bbb21490c Merge pull request #45 from sourcelair/package-json
Package json
2016-02-06 18:41:54 +02:00
Paris 9f0fa2f815 Update package.json (name, repository, license) 2016-02-06 18:41:24 +02:00
Paris f5fb10063c Fix version 2016-01-09 19:43:56 +02:00
Paris 721bd272b5 Add package.json 2016-01-09 19:43:18 +02:00
Thanasis Daglis c170156147 Merge pull request #44 from sourcelair/issue/18
Cursor is now invisible in IE
2015-11-12 17:47:03 +02:00
TDaglis a2f6f2be03 added comment for fix
explained IE "hack" to fix textarea's blinking cursor
2015-11-12 15:05:51 +02:00
Thanasis Daglis 412260392f Merge pull request #43 from sourcelair/fix/marginal-terminal-width
Fixed marginal width geometry
2015-11-12 11:42:37 +02:00
TDaglis 5f8585a625 made cursor invisible in IE
fixes #18
2015-11-11 10:37:21 +02:00
TDaglis ee0d15c878 added *.css rules in .editorconfig for indent consistency 2015-11-11 10:36:20 +02:00
TDaglis 3f0b584f25 fixed marginal width geometry 2015-11-10 18:27:17 +02:00
Thanasis Daglis 41fd20c6e4 Merge pull request #42 from sourcelair/fix/fit-width
Fixed width of fit
2015-11-04 11:45:21 +02:00
Thanasis Daglis 01e9524098 Merge pull request #41 from sourcelair/fix/firefox-selection
Fixed selection in firefox
2015-11-04 11:45:09 +02:00
TDaglis d9d99c1c27 fixed width of fit
removed firefox hack since it is no longer needed
2015-11-03 14:55:24 +02:00
TDaglis f53f5735e1 added selection.type fallback check
for browsers that might not support Selection.isCollapsed property
2015-11-03 12:00:28 +02:00
TDaglis 7a88a4b0e9 fixed selection in firefox 2015-11-03 09:32:43 +00:00
Thanasis Daglis 85733fea56 Merge pull request #40 from sourcelair/fix/keydown-filtering
Better filtering of input
2015-10-29 18:36:19 +02:00
TDaglis 369e1f4c1e exclude alt and meta keys from ctrl default case 2015-10-29 18:34:20 +02:00
TDaglis 702fd24ce8 ignore ctrl+shift characters in keydown input 2015-10-29 18:27:46 +02:00
Thanasis Daglis 961e62207c Merge pull request #38 from sourcelair/fix/focus-events
Fix xterm focus events
2015-10-27 11:30:00 +02:00
TDaglis cc950614c5 blur textarea on terminal blur 2015-10-26 17:13:04 +02:00
TDaglis 556140e7d9 added .editorconfig 2015-10-26 17:07:34 +02:00
TDaglis 987f09d880 auto emit blur and focus of textarea 2015-10-26 15:07:15 +00:00
Thanasis Daglis 4cf2f9a847 Merge pull request #37 from sourcelair/fix/attach
Fixed typo and reference in attach addon
2015-10-22 12:17:24 +03:00
TDaglis 2fce845ea6 fixed typo and reference in attach addon
also bumped version to 0.31
2015-10-22 11:33:56 +03:00
Thanasis Daglis 9914fd9a38 Merge pull request #36 from sourcelair/linkify/enhance
Added lenient option to linkify
2015-10-22 10:26:44 +03:00
TDaglis a221a3c9f8 documented lenient option of linkify 2015-10-22 09:53:14 +03:00
TDaglis b1058b9fcc Added lenient option to linkify 2015-10-22 06:47:15 +00:00
Paris Kasidiaris 4c2508028a Merge pull request #32 from chani/patch-1
Update main.js
2015-09-08 17:29:06 +03:00
Jean Bruenn d516d4df7c Update main.js
just a tiny change, if you are using the demo file as example to start working with, prompt as variable might cause trouble if you do use prompt() rather use shellprompt as variable name instead of prompt. I'd suggest to rename term's prompt() as well to not cause confusion.
2015-09-08 14:08:44 +02:00
Paris Kasidiaris d20c36dff2 Merge pull request #31 from akalipetis/hotfix/ie
Fixed IE issues with classList.add
2015-08-25 15:37:29 +03:00
Antonis Kalipetis a523803d37 Fixed IE issues with classList.add
`classList.add` in IE does not take more than one parameter and this would not work. Split in 3 statements to fix it.
2015-08-25 14:40:00 +03:00
Paris bbb688313e [attach addon] Improve documentation 2015-04-13 19:47:04 +03:00
Paris d6c8369630 Update README.md 2015-04-13 19:21:47 +03:00
Paris 05eb5df93c Set up JSDoc documentation
Started working on #13
2015-04-13 19:18:09 +03:00
Paris 51fe17ee43 Mark version 0.30 2015-02-25 09:34:12 +02:00
Paris Kasidiaris 1d5737f843 Merge pull request #22 from sourcelair/issue/21
Introduce bufferred attaching to websocket
2015-02-25 09:31:35 +02:00
Paris 13103aecb2 [attach addon] Document with JSDoc 2015-02-24 22:28:47 +02:00
Paris e9d2c806ba [attach addon] Switch indentation to 4 spaces instead of 2 2015-02-24 20:57:28 +02:00
Paris 932ab00a53 Implement buffered attaching
Fixes #21
2015-02-24 20:55:52 +02:00
Paris Kasidiaris 6cfd957697 Merge pull request #20 from akalipetis/issue/19
Pressing Alt + ←/→ does not interfere now with browser
2015-01-28 11:52:55 +02:00
Antonis Kalipetis f00d8964c2 Replaced preventDefault with cancel 2015-01-28 11:20:47 +02:00
Antonis Kalipetis 9ef6b52352 Pressing Alt + ←/→ does not interfere now with browser
Previously, when on Chrome for Windows, if default was not prevented the browser history backward/forward was triggered.

Fixes #19
2015-01-28 11:04:38 +02:00
Paris Kasidiaris 2a9de5e5c0 Merge pull request #17 from sourcelair/issue/8
Bump to v0.29
2015-01-19 19:45:19 +02:00
paris 761e5db937 Merged with master 2015-01-19 19:45:03 +02:00
paris 391d8f4097 Bump version to 0.29 and copyright year to 2015 2015-01-19 19:07:28 +02:00
paris af39a3fcc0 Fix #8
Also fix some Internet Explorer incompatibilities
2015-01-19 19:06:17 +02:00
Paris Kasidiaris 69153c04a6 Merge pull request #16 from sourcelair/addon/linkify
Implement conversion of URLs to link elements in a terminal view
2015-01-15 12:14:23 +02:00
paris 85abfb8151 Bump version to 0.28 2015-01-06 13:12:31 +02:00
paris e100ee0cc0 [addon linkify] Further optimize URL algorithm 2015-01-06 13:03:07 +02:00
Paris Kasidiaris d5d48cd48a Merge pull request #15 from sourcelair/issue/14
Jump words back and forward with "Alt + ←" and "Alt + →"
2015-01-06 12:37:45 +02:00
paris 3e7ab290fa [addon linkify] Remove console.log 2015-01-05 16:07:29 +02:00
paris 43ac453db1 [addon linkify] Improve start and end clauses 2015-01-05 16:05:14 +02:00
paris d0d87505a9 [addon linkify] Improve URL to link conversion algorithm 2015-01-04 22:27:14 +02:00
paris c8a497eb82 [addon linkify] Fine-grained module and documented almost everything 2015-01-04 20:39:57 +02:00
paris 523ff9908f [addon linkify] Set up proper initialization of add-on
- Also created a demo page for the addon
2015-01-04 15:45:26 +02:00
paris 72ed03adcb Fix #14 2015-01-04 15:33:21 +02:00
paris b60903a2ae [addon linkify] Start working on "linkifying" URLs in the terminal 2015-01-04 15:08:36 +02:00
paris c5af270885 Mark version 0.27 2014-11-24 17:42:17 +02:00
Antonis Kalipetis 510990c312 Merge pull request #11 from sourcelair/issue/9
Fixed incorrect row/column calculation in Firefox
2014-11-24 17:36:18 +02:00
akalipetis 37be8e0f34 Fixed correct fitting of Terminal 2014-11-24 17:24:21 +02:00
paris 8dd80566d0 Fix #9
- Calculate character width by using the cursor instead of custom hack in fit addon
- Increment character width by 1 in Firefox, since it seems to have a bug in calculating width of specific elements
2014-11-17 17:08:14 +02:00
paris c6a7e15b03 [fit addon] Restore row content after proposing geometry
- Restore `subjectRow.innerHTML`, using the `contentBuffer`
- Bump version to 0.25
2014-11-17 12:36:13 +02:00
194 changed files with 8106 additions and 2689 deletions
+16
View File
@@ -0,0 +1,16 @@
root = true
[*]
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
[*.js]
max_line_length = 100
[*.css]
indent_size = 4
[*.md]
trim_trailing_whitespace = false
+11
View File
@@ -0,0 +1,11 @@
<!-- Enter your issue description here -->
## Details
- Browser and browser version:
- OS version:
- xterm.js version:
### Steps to reproduce
1.
2.
+2 -1
View File
@@ -8,4 +8,5 @@ Makefile.gyp
*.target.gyp.mk
*.node
example/*.log
docs/_build
docs/
npm-debug.log
+7
View File
@@ -0,0 +1,7 @@
Antonis Kalipetis <akalipetis@sourcelair.com>
Antonis Kalipetis <akalipetis@sourcelair.com> <akalipetis@gmail.com>
Daniel Imms <daimms@microsoft.com> <tyriar@tyriar.com>
Paris Kasidiaris <paris@sourcelair.com>
Paris Kasidiaris <pariskasidiaris@gmail.com>
Thanasis Daglis <thanasis@sourcelair.com>
Thanasis Daglis <thanasis@sourcelair.com> <ath.daglis@gmail.com>
+13
View File
@@ -0,0 +1,13 @@
language: node_js
node_js:
- 4
env:
- CXX=g++-4.8
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8
notifications:
email: false
+23
View File
@@ -0,0 +1,23 @@
List of xterm.js contributors. Updated before every release.
Alessandro Nadalin <alessandro.nadalin@gmail.com>
Alexander Olsson <noseglid@gmail.com>
Antonis Kalipetis <akalipetis@sourcelair.com>
Anton Skshidlevsky <meefik@gmail.com>
Austin Robertson <austinrobertson@gmail.com>
ayapi <colors.aya@gmail.com>
Benjamin Fischer <benjamin.fischer@rwth-aachen.de>
Carson Anderson <carson@betterservers.com>
Christopher Jeffrey <chjjeffrey@gmail.com>
Daniel Imms <daimms@microsoft.com>
Daniel Risacher <drisacher@gmail.com>
Dan Kaplun <dbkaplun@twitch.tv>
Darin Morrison <freebroccolo@users.noreply.github.com>
Jean Bruenn <himself@jeanbruenn.info>
Jörg Breitbart <jerch@rockborn.de>
Paris Kasidiaris <pariskasidiaris@gmail.com>
Paris Kasidiaris <paris@sourcelair.com>
runarberg <runar@greenqloud.com>
Steven Silvester <steven.silvester@ieee.org>
Thanasis Daglis <thanasis@sourcelair.com>
Tine Jozelj <tine.jozelj@outlook.com>
+52
View File
@@ -0,0 +1,52 @@
# How to contribute to xterm.js
- [Opening issues for bug reports or feature requests](#opening-issues)
- [Contributing code](#contributing-code)
## Opening issues
The preferred way to report bugs or request features is to use
[GitHub issues](http://github.com/sourcelair/xterm.js/issues). Before
opening an issue, read these pointers.
### Opening issues effectively
- Include information about **the browser in which the problem occurred**. Even
if you tested several browsers, and the problem occurred in all of them,
mention this fact in the bug report. Also include browser version numbers and
the operating system that you're on.
- Mention which release of xterm.js you're using. Preferably, try also with
the current HEAD of the master branch, to ensure the problem has not already been
fixed.
- Mention precisely what went wrong. What did you expect to happen? What happened instead? Describe the
exact steps a maintainer has to take to make the problem occur.
- If the problem can not be reproduced in the [demo of xterm.js](README.md#demo), please provide an HTML document that demonstrates the problem.
- Be polite. Issues with an indignant or belligerent tone tend to be moved to the
bottom of the pile.
## Contributing code
- Make sure you have a [GitHub account](https://github.com/join)
- Fork [xterm.js](https://github.com/sourcelair/xterm.js/)
([how to fork a repo](https://help.github.com/articles/fork-a-repo))
- Make your changes
- If your changes are easy to test or likely to regress, add tests. Tests go into `test`, directory.
- Follow the general code style of the rest of the project (see below).
- Submit a pull request
([how to create a pull request](https://help.github.com/articles/fork-a-repo)).
Don't put more than one feature/fix in a single pull request.
By contributing code to xterm.js you
- agree to license the contributed code under xterm.js' [MIT
license](LICENSE).
- confirm that you have the right to contribute and license the code
in question. (Either you hold all rights on the code, or the rights
holder has explicitly granted the right to use it like this,
through a compatible open source license or through a direct
agreement with you.)
+4
View File
@@ -0,0 +1,4 @@
FROM node:4-onbuild
MAINTAINER Paris Kasidiaris <paris@sourcelair.com>
EXPOSE 3000
+1
View File
@@ -0,0 +1 @@
web: npm start
+91 -9
View File
@@ -1,19 +1,101 @@
# xterm.js — xterm, in the browser
# xterm.js
Xterm.js is a full xterm clone, written completely in JavaScript.
![xterm.js build status](https://api.travis-ci.org/sourcelair/xterm.js.svg) [![Gitter](https://badges.gitter.im/sourcelair/xterm.js.svg)](https://gitter.im/sourcelair/xterm.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
Xterm.js supplies a modular, event-based interface that lets developers build addons and themes that augment the experience of running a fully-featured terminal inside the browser.
Xterm.js is a terminal front-end component written in JavaScript that works in the browser.
Xterm.js serves as foundation for the terminal found at www.sourcelair.com.
It enables applications to provide fully featured terminals to their users and create great development experiences.
![xterm.js screenshot](docs/screenshot.png)
## Features
- **Text-based application support**: Use xterm.js to work with applications like `bash`, `git` etc.
- **Curses-based application support**: Use xterm.js to work with applications like `vim`, `tmux` etc.
- **Mouse events support**: Xterm.js captures mouse events like click and scroll and passes them to the terminal's back-end controlling process
- **CJK (Chinese, Japanese, Korean) character support**: Xterm.js renders CJK characters seamlessly
- **IME support**: Insert international (including CJK) characters using IME input with your keyboard
- **Self-contained library**: Xterm.js works on its own. It does not require any external libraries like jQuery or React to work
- **Modular, event-based API**: Lets you build addons and themes with ease
### Contribution and License Agreement
## What xterm.js is not
- Xterm.js is not a terminal application that you can download and use on your computer
- Xterm.js is not `bash`. Xterm.js can be connected to processes like `bash` and let you interact with them (provide input, receive output)
## Real-world uses
Xterm.js is used in several world-class applications to provide great terminal experiences.
- [**SourceLair**](https://www.sourcelair.com/): In-browser IDE that provides its users with fully-featured Linux terminals based on xterm.js
- [**Microsoft Visual Studio Code**](http://code.visualstudio.com/): Modern, versatile, powerful and open source code editor that provides integrated terminal based on xterm.js
Do you use xterm.js in your application as well? Please [open a Pull Request](https://github.com/sourcelair/xterm.js/pulls) to include it here. We would love to have it in our list.
## Browser Support
Since xterm.js is typically implemented as a developer tool, only modern browsers are supported officially. Here is a list of the versions we aim to support:
- Chrome 48+
- Edge 13+
- Firefox 44+
- Internet Explorer 11+
- Opera 35+
- Safari 8+
Xterm.js works seamlessly in Electron apps and may even work on earlier versions of the browsers but these are the browsers we strive to keep working.
## Demo
To launch the demo simply run:
```
npm install
npm start
```
Then open http://0.0.0.0:3000 in a web browser (use http://127.0.0.1:3000 is running under Windows).
## Addons
Addons are JavaScript modules that attach functions to the `Terminal` prototype to extend its functionality. There are a handful available in the main repository in the `addons` directory, you can even write your own (though they may break when the internals of xterm.js change across versions).
To use an addon, just include the JavaScript file after xterm.js and before the `Terminal` object has been instantiated. The function should then be exposed on the `Terminal` object:
```html
<script src="node_modules/src/xterm.js"></script>
<script src="node_modules/addons/fit/fit.js"></script>
```
```js
var xterm = new Terminal();
// init code...
xterm.fit();
```
## Releases
Xterm.js follows a monthly release cycle roughly.
The existing releases are available at this GitHub repo's [Releases](https://github.com/sourcelair/xterm.js/releases), while the roadmap is available as [Milestones](https://github.com/sourcelair/xterm.js/milestones).
## Development and Contribution
Xterm.js is maintained by [SourceLair](https://www.sourcelair.com/) and a few external contributors, but we would love to receive contributions from everyone!
To contribute either code, documentation or issues to xterm.js please read the [Contributing document](CONTRIBUTING.md) before.
The development of xterm.js does not require any special tool. All you need is an editor that supports JavaScript and a browser (if you would like to run the demo you will need Node.js to get all features).
It is recommended though to use a development tool that uses xterm.js internally, to develop for xterm.js. [Eating our own dogfood](https://en.wikipedia.org/wiki/Eating_your_own_dog_food) has been proved extremely beneficial for this project. Known tools that use xterm.js internally are:
#### [SourceLair](https://www.sourcelair.com)
Visit https://lair.io/sourcelair/xterm and follow the instructions. All development will happen in your browser.
#### [Visual Studio Code](http://code.visualstudio.com/)
[Download Visual Studio Code](http://code.visualstudio.com/Download), clone xterm.js and you are all set.
## License Agreement
If you contribute code to this project, you are implicitly allowing your code to be distributed under the MIT license. You are also implicitly verifying that all code is your original work.
## License
Copyright (c) 2014, SourceLair, Ltd (www.sourcelair.com) (MIT License)
Copyright (c) 2014-2016, SourceLair, Private Company ([www.sourcelair.com](https://www.sourcelair.com/home)) (MIT License)
Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
+118 -43
View File
@@ -1,59 +1,134 @@
/*
* Implements the attach method, that
* attaches the terminal to a WebSocket stream.
*
*
* The bidirectional argument indicates, whether the terminal should
* send data to the socket as well and is true, by default.
*/
(function (attach) {
if (typeof define == 'function') {
/*
* Require.js is available
*/
define(['../../src/xterm'], attach);
} else {
/*
* Plain browser environment
*/
attach(this.Xterm);
}
if (typeof exports === 'object' && typeof module === 'object') {
/*
* CommonJS environment
*/
module.exports = attach(require('../../src/xterm'));
} else if (typeof define == 'function') {
/*
* Require.js is available
*/
define(['../../src/xterm'], attach);
} else {
/*
* Plain browser environment
*/
attach(this.Xterm);
}
})(function (Xterm) {
Xterm.prototype.attach = function (socket, bidirectional) {
var term = this;
'use strict';
bidirectional = (typeof bidirectional == 'undefined') ? true : bidirectional;
this.socket = socket;
/**
* This module provides methods for attaching a terminal to a WebSocket
* stream.
*
* @module xterm/addons/attach/attach
*/
var exports = {};
term._getMessage = function (ev) {
/**
* Attaches the given terminal to the given socket.
*
* @param {Xterm} term - The terminal to be attached to the given socket.
* @param {WebSocket} socket - The socket to attach the current terminal.
* @param {boolean} bidirectional - Whether the terminal should send data
* to the socket as well.
* @param {boolean} buffered - Whether the rendering of incoming data
* should happen instantly or at a maximum
* frequency of 1 rendering per 10ms.
*/
exports.attach = function (term, socket, bidirectional, buffered) {
bidirectional = (typeof bidirectional == 'undefined') ? true : bidirectional;
term.socket = socket;
term._flushBuffer = function () {
term.write(term._attachSocketBuffer);
term._attachSocketBuffer = null;
clearTimeout(term._attachSocketBufferTimer);
term._attachSocketBufferTimer = null;
};
term._pushToBuffer = function (data) {
if (term._attachSocketBuffer) {
term._attachSocketBuffer += data;
} else {
term._attachSocketBuffer = data;
setTimeout(term._flushBuffer, 10);
}
};
term._getMessage = function (ev) {
if (buffered) {
term._pushToBuffer(ev.data);
} else {
term.write(ev.data);
};
term._sendData = function (data) {
socket.send(data);
};
socket.addEventListener('message', term._getMessage);
if (bidirectional) {
this.on('data', term._sendData);
}
socket.addEventListener('close', term.detach.bind(term, socket));
socket.addEventListener('error', term.detach.bind(term, socket));
};
Xterm.prototype.detach = function (socket) {
var term = this;
term.off('data', term._sendData);
socket = (typeof socket == 'undefined') ? term.socket : socket;
if (socket) {
socket.removeEventListener('message', term._getMessage);
}
delete term.socket;
term._sendData = function (data) {
socket.send(data);
};
});
socket.addEventListener('message', term._getMessage);
if (bidirectional) {
term.on('data', term._sendData);
}
socket.addEventListener('close', term.detach.bind(term, socket));
socket.addEventListener('error', term.detach.bind(term, socket));
};
/**
* Detaches the given terminal from the given socket
*
* @param {Xterm} term - The terminal to be detached from the given socket.
* @param {WebSocket} socket - The socket from which to detach the current
* terminal.
*/
exports.detach = function (term, socket) {
term.off('data', term._sendData);
socket = (typeof socket == 'undefined') ? term.socket : socket;
if (socket) {
socket.removeEventListener('message', term._getMessage);
}
delete term.socket;
};
/**
* Attaches the current terminal to the given socket
*
* @param {WebSocket} socket - The socket to attach the current terminal.
* @param {boolean} bidirectional - Whether the terminal should send data
* to the socket as well.
* @param {boolean} buffered - Whether the rendering of incoming data
* should happen instantly or at a maximum
* frequency of 1 rendering per 10ms.
*/
Xterm.prototype.attach = function (socket, bidirectional, buffered) {
return exports.attach(this, socket, bidirectional, buffered);
};
/**
* Detaches the current terminal from the given socket.
*
* @param {WebSocket} socket - The socket from which to detach the current
* terminal.
*/
Xterm.prototype.detach = function (socket) {
return exports.detach(this, socket);
};
return exports;
});
+5
View File
@@ -0,0 +1,5 @@
{
"name": "xterm.attach",
"main": "attach.js",
"private": true
}
+62 -46
View File
@@ -12,59 +12,75 @@
* of columns)
*/
(function (fit) {
if (typeof define == 'function') {
/*
* Require.js is available
*/
define(['../../src/xterm'], fit);
} else {
/*
* Plain browser environment
*/
fit(this.Xterm);
}
if (typeof exports === 'object' && typeof module === 'object') {
/*
* CommonJS environment
*/
module.exports = fit(require('../../src/xterm'));
} else if (typeof define == 'function') {
/*
* Require.js is available
*/
define(['../../src/xterm'], fit);
} else {
/*
* Plain browser environment
*/
fit(this.Xterm);
}
})(function (Xterm) {
Xterm.prototype.proposeGeometry = function () {
var container = this.rowContainer,
subjectRow = this.rowContainer.firstElementChild,
rows,
contentBuffer,
characterWidth,
cols;
/**
* This module provides methods for fitting a terminal's size to a parent container.
*
* @module xterm/addons/fit/fit
*/
var exports = {};
subjectRow.style.display = 'inline';
exports.proposeGeometry = function (term) {
var parentElementStyle = window.getComputedStyle(term.element.parentElement),
parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height')),
parentElementWidth = parseInt(parentElementStyle.getPropertyValue('width')),
elementStyle = window.getComputedStyle(term.element),
elementPaddingVer = parseInt(elementStyle.getPropertyValue('padding-top')) + parseInt(elementStyle.getPropertyValue('padding-bottom')),
elementPaddingHor = parseInt(elementStyle.getPropertyValue('padding-right')) + parseInt(elementStyle.getPropertyValue('padding-left')),
availableHeight = parentElementHeight - elementPaddingVer,
availableWidth = parentElementWidth - elementPaddingHor,
container = term.rowContainer,
subjectRow = term.rowContainer.firstElementChild,
contentBuffer = subjectRow.innerHTML,
characterHeight,
rows,
characterWidth,
cols,
geometry;
contentBuffer = subjectRow.textContent;
subjectRow.style.display = 'inline';
subjectRow.innerHTML = 'W'; // Common character for measuring width, although on monospace
characterWidth = subjectRow.getBoundingClientRect().width;
subjectRow.style.display = ''; // Revert style before calculating height, since they differ.
characterHeight = parseInt(subjectRow.offsetHeight);
subjectRow.innerHTML = contentBuffer;
subjectRow.innerHTML = '&nbsp;'; /* Arbitrary character to calculate its dimensions */
characterWidth = parseInt(subjectRow.offsetWidth);
characterHeight = parseInt(subjectRow.offsetHeight);
rows = parseInt(availableHeight / characterHeight);
cols = parseInt(availableWidth / characterWidth) - 1;
subjectRow.style.display = '';
geometry = {cols: cols, rows: rows};
return geometry;
};
cols = container.offsetWidth / characterWidth;
cols = parseInt(cols);
exports.fit = function (term) {
var geometry = exports.proposeGeometry(term);
var parentElementStyle = window.getComputedStyle(this.element.parentElement),
parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height')),
elementStyle = window.getComputedStyle(this.element),
elementPadding = parseInt(elementStyle.getPropertyValue('padding-top')) + parseInt(elementStyle.getPropertyValue('padding-bottom')),
availableHeight = parentElementHeight - elementPadding,
rowHeight = this.rowContainer.firstElementChild.offsetHeight;
term.resize(geometry.cols, geometry.rows);
};
rows = parseInt(availableHeight / rowHeight);
var geometry = {
'cols': cols,
'rows': rows
};
Xterm.prototype.proposeGeometry = function () {
return exports.proposeGeometry(this);
};
return geometry;
};
Xterm.prototype.fit = function () {
return exports.fit(this);
};
Xterm.prototype.fit = function () {
var geometry = this.proposeGeometry();
this.resize(geometry.cols, geometry.rows);
};
});
return exports;
});
+5
View File
@@ -0,0 +1,5 @@
{
"name": "xterm.fit",
"main": "fit.js",
"private": true
}
+1 -1
View File
@@ -7,4 +7,4 @@
width: auto;
height: auto;
z-index: 255;
}
}
+36 -23
View File
@@ -11,29 +11,42 @@
* fullscreen mode is being toggled.
*/
(function (fullscreen) {
if (typeof define == 'function') {
/*
* Require.js is available
*/
define(['../../src/xterm'], fullscreen);
} else {
/*
* Plain browser environment
*/
fullscreen(this.Xterm);
}
if (typeof exports === 'object' && typeof module === 'object') {
/*
* CommonJS environment
*/
module.exports = fullscreen(require('../../src/xterm'));
} else if (typeof define == 'function') {
/*
* Require.js is available
*/
define(['../../src/xterm'], fullscreen);
} else {
/*
* Plain browser environment
*/
fullscreen(this.Xterm);
}
})(function (Xterm) {
Xterm.prototype.toggleFullscreen = function (fullscreen) {
var fn;
var exports = {};
if (typeof fullscreen == 'undefined') {
fn = (this.element.classList.contains('fullscreen')) ? 'remove' : 'add';
} else if (!fullscreen) {
fn = 'remove';
} else {
fn = 'add';
}
exports.toggleFullScreen = function (term, fullscreen) {
var fn;
this.element.classList[fn]('fullscreen');
};
});
if (typeof fullscreen == 'undefined') {
fn = (term.element.classList.contains('fullscreen')) ? 'remove' : 'add';
} else if (!fullscreen) {
fn = 'remove';
} else {
fn = 'add';
}
term.element.classList[fn]('fullscreen');
};
Xterm.prototype.toggleFullscreen = function (fullscreen) {
exports.toggleFullScreen(this, fullscreen);
};
return exports;
});
+5
View File
@@ -0,0 +1,5 @@
{
"name": "xterm.fullscreen",
"main": "fullscreen.js",
"private": true
}
+36
View File
@@ -0,0 +1,36 @@
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="../../src/xterm.css" />
<link rel="stylesheet" href="../../demo/style.css" />
<script src="../../src/xterm.js"></script>
<script src="linkify.js"></script>
<style>
body {
color: #111;
}
#terminal-container {
max-width: 900px;
margin: 0 auto;
}
#terminal-container a {
color: #fff;
}
</style>
</head>
<body>
<div id="terminal-container"></div>
<script>
var term = new Terminal(),
container = document.getElementById('terminal-container');
term.open(container);
term.writeln('Hello, welcome to xterm.js');
term.writeln('');
term.writeln('Check it out at github.com/sourcelair/xterm.js');
term.linkify();
</script>
</body>
</html>
+207
View File
@@ -0,0 +1,207 @@
(function (linkify) {
if (typeof exports === 'object' && typeof module === 'object') {
/*
* CommonJS environment
*/
module.exports = linkify(require('../../src/xterm'));
} else if (typeof define == 'function') {
/*
* Require.js is available
*/
define(['../../src/xterm'], linkify);
} else {
/*
* Plain browser environment
*/
linkify(this.Xterm);
}
})(function (Xterm) {
'use strict';
/**
* This module provides methods for convertings valid URL substrings
* into HTML anchor elements (links), inside a terminal view.
*
* @module xterm/addons/linkify/linkify
*/
var exports = {},
protocolClause = '(https?:\\/\\/)',
domainCharacterSet = '[\\da-z\\.-]+',
negatedDomainCharacterSet = '[^\\da-z\\.-]+',
domainBodyClause = '(' + domainCharacterSet + ')',
tldClause = '([a-z\\.]{2,6})',
ipClause = '((\\d{1,3}\\.){3}\\d{1,3})',
portClause = '(:\\d{1,5})',
hostClause = '((' + domainBodyClause + '\\.' + tldClause + ')|' + ipClause + ')' + portClause + '?',
pathClause = '(\\/[\\/\\w\\.-]*)*',
negatedPathCharacterSet = '[^\\/\\w\\.-]+',
bodyClause = hostClause + pathClause,
start = '(?:^|' + negatedDomainCharacterSet + ')(',
end = ')($|' + negatedPathCharacterSet + ')',
lenientUrlClause = start + protocolClause + '?' + bodyClause + end,
strictUrlClause = start + protocolClause + bodyClause + end,
lenientUrlRegex = new RegExp(lenientUrlClause),
strictUrlRegex = new RegExp(strictUrlClause);
/**
* Converts all valid URLs found in the given terminal line into
* hyperlinks. The terminal line can be either the HTML element itself
* or the index of the termina line in the children of the terminal
* rows container.
*
* @param {Xterm} terminal - The terminal that owns the given line.
* @param {number|HTMLDivElement} line - The terminal line that should get
* "linkified".
* @param {boolean} lenient - The regex type that will be used to identify links. If lenient is
* false, the regex requires a protocol clause. Defaults to true.
* @param {string} target - Sets target="" attribute with value provided to links.
* Default doesn't set target attribute
* @emits linkify
* @emits linkify:line
*/
exports.linkifyTerminalLine = function (terminal, line, lenient, target) {
if (typeof line == 'number') {
line = terminal.rowContainer.children[line];
} else if (! (line instanceof HTMLDivElement)) {
var message = 'The "line" argument should be either a number';
message += ' or an HTMLDivElement';
throw new TypeError(message);
}
if (typeof target === 'undefined') {
target = '';
} else {
target = 'target="' + target + '"';
}
var buffer = document.createElement('span'),
nodes = line.childNodes;
for (var j=0; j<nodes.length; j++) {
var node = nodes[j],
match;
/**
* Since we cannot access the TextNode's HTML representation
* from the instance itself, we assign its data as textContent
* to a dummy buffer span, in order to retrieve the TextNode's
* HTML representation from the buffer's innerHTML.
*/
buffer.textContent = node.data;
var nodeHTML = buffer.innerHTML;
/**
* Apply function only on TextNodes
*/
if (node.nodeType != node.TEXT_NODE) {
continue;
}
var url = exports.findLinkMatch(node.data, lenient);
if (!url) {
continue;
}
var startsWithProtocol = new RegExp('^' + protocolClause),
urlHasProtocol = url.match(startsWithProtocol),
href = (urlHasProtocol) ? url : 'http://' + url,
link = '<a href="' + href + '" ' + target + '>' + url + '</a>',
newHTML = nodeHTML.replace(url, link);
line.innerHTML = line.innerHTML.replace(nodeHTML, newHTML);
}
/**
* This event gets emitted when conversion of all URL susbtrings
* to HTML anchor elements (links) has finished, for a specific
* line of the current Xterm instance.
*
* @event linkify:line
*/
terminal.emit('linkify:line', line);
};
/**
* Finds a link within a block of text.
*
* @param {string} text - The text to search .
* @param {boolean} lenient - Whether to use the lenient search.
* @return {string} A URL.
*/
exports.findLinkMatch = function (text, lenient) {
var match = text.match(lenient ? lenientUrlRegex : strictUrlRegex);
if (!match || match.length === 0) {
return null;
}
return match[1];
}
/**
* Converts all valid URLs found in the terminal view into hyperlinks.
*
* @param {Xterm} terminal - The terminal that should get "linkified".
* @param {boolean} lenient - The regex type that will be used to identify links. If lenient is
* false, the regex requires a protocol clause. Defaults to true.
* @param {string} target - Sets target="" attribute with value provided to links.
* Default doesn't set target attribute
* @emits linkify
* @emits linkify:line
*/
exports.linkify = function (terminal, lenient, target) {
var rows = terminal.rowContainer.children;
lenient = (typeof lenient == "boolean") ? lenient : true;
for (var i=0; i<rows.length; i++) {
var line = rows[i];
exports.linkifyTerminalLine(terminal, line, lenient, target);
}
/**
* This event gets emitted when conversion of all URL substrings to
* HTML anchor elements (links) has finished for the current Xterm
* instance's view.
*
* @event linkify
*/
terminal.emit('linkify');
};
/**
* Extend Xterm prototype.
*/
/**
* Converts all valid URLs found in the current terminal linte into
* hyperlinks.
*
* @memberof Xterm
* @param {number|HTMLDivElement} line - The terminal line that should get
* "linkified".
* @param {boolean} lenient - The regex type that will be used to identify links. If lenient is
* false, the regex requires a protocol clause. Defaults to true.
* @param {string} target - Sets target="" attribute with value provided to links.
* Default doesn't set target attribute
*/
Xterm.prototype.linkifyTerminalLine = function (line, lenient, target) {
return exports.linkifyTerminalLine(this, line, lenient, target);
};
/**
* Converts all valid URLs found in the current terminal into hyperlinks.
*
* @memberof Xterm
* @param {boolean} lenient - The regex type that will be used to identify links. If lenient is
* false, the regex requires a protocol clause. Defaults to true.
* @param {string} target - Sets target="" attribute with value provided to links.
* Default doesn't set target attribute
*/
Xterm.prototype.linkify = function (lenient, target) {
return exports.linkify(this, lenient, target);
};
return exports;
});
+5
View File
@@ -0,0 +1,5 @@
{
"name": "xterm.linkify",
"main": "linkify.js",
"private": true
}
+7
View File
@@ -0,0 +1,7 @@
#! /usr/bin/env sh
tail --lines=+3 AUTHORS > AUTHORS.tmp
git log --format='%aN <%aE>' >> AUTHORS.tmp
echo "List of xterm.js contributors. Updated before every release.\n" > AUTHORS
sort -u AUTHORS.tmp >> AUTHORS
rm -f AUTHORS.tmp
+27
View File
@@ -0,0 +1,27 @@
#! /usr/bin/env sh
# Usage: ./bin/prepare-release x.y.z
# x.y.z should be semver (e.g. 1.0.0)
NEW_VERSION=$1
CURRENT_PACKAGE_JSON_VERSION=$(cat package.json \
| grep version \
| head -1 \
| awk -F: '{ print $2 }' \
| sed 's/[",]//g' \
| tr -d '[[:space:]]')
CURRENT_BOWER_JSON_VERSION=$(cat bower.json \
| grep version \
| head -1 \
| awk -F: '{ print $2 }' \
| sed 's/[",]//g' \
| tr -d '[[:space:]]')
# Update version in package.json and bower.json
sed -i "s/\"version\": \"$CURRENT_PACKAGE_JSON_VERSION\"/\"version\": \"$NEW_VERSION\"/g" package.json
sed -i "s/\"version\": \"$CURRENT_BOWER_JSON_VERSION\"/\"version\": \"$NEW_VERSION\"/g" bower.json
# Update AUTHORS file
sh bin/generate-authors
git commit -S -s -a -m "Bump version to $NEW_VERSION"
+2 -2
View File
@@ -1,5 +1,5 @@
{
"name": "xterm.js",
"version": "0.24",
"ignore": ["demo", "docs", "test", ".gitignore"]
"version": "1.1.2",
"ignore": ["demo", "test", ".gitignore"]
}
+85
View File
@@ -0,0 +1,85 @@
var express = require('express');
var app = express();
var expressWs = require('express-ws')(app);
var os = require('os');
var pty = require('pty.js');
var terminals = {},
logs = {};
app.use('/src', express.static(__dirname + '/../src'));
app.use('/addons', express.static(__dirname + '/../addons'));
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
app.get('/style.css', function(req, res){
res.sendFile(__dirname + '/style.css');
});
app.get('/main.js', function(req, res){
res.sendFile(__dirname + '/main.js');
});
app.post('/terminals', function (req, res) {
var cols = parseInt(req.query.cols),
rows = parseInt(req.query.rows),
term = pty.spawn(process.platform === 'win32' ? 'cmd.exe' : 'bash', [], {
name: 'xterm-color',
cols: cols || 80,
rows: rows || 24,
cwd: process.env.PWD,
env: process.env
});
console.log('Created terminal with PID: ' + term.pid);
terminals[term.pid] = term;
logs[term.pid] = '';
term.on('data', function(data) {
logs[term.pid] += data;
});
res.send(term.pid.toString());
res.end();
});
app.post('/terminals/:pid/size', function (req, res) {
var pid = parseInt(req.params.pid),
cols = parseInt(req.query.cols),
rows = parseInt(req.query.rows),
term = terminals[pid];
term.resize(cols, rows);
console.log('Resized terminal ' + pid + ' to ' + cols + ' cols and ' + rows + ' rows.');
res.end();
});
app.ws('/terminals/:pid', function (ws, req) {
var term = terminals[parseInt(req.params.pid)];
console.log('Connected to terminal ' + term.pid);
ws.send(logs[term.pid]);
term.on('data', function(data) {
try {
ws.send(data);
} catch (ex) {
// The WebSocket is not open, ignore
}
});
ws.on('message', function(msg) {
term.write(msg);
});
ws.on('close', function () {
process.kill(term.pid);
console.log('Closed terminal ' + term.pid);
// Clean things up
delete terminals[term.pid];
delete logs[term.pid];
});
});
var port = process.env.PORT || 3000,
host = os.platform() === 'win32' ? '127.0.0.1' : '0.0.0.0';
console.log('App listening to http://' + host + ':' + port);
app.listen(port, host);
+23 -5
View File
@@ -5,15 +5,33 @@
<link rel="stylesheet" href="../src/xterm.css" />
<link rel="stylesheet" href="../addons/fullscreen/fullscreen.css" />
<link rel="stylesheet" href="style.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/fetch/1.0.0/fetch.min.js"></script>
<script src="../src/xterm.js" ></script>
<script src="../addons/attach/attach.js" ></script>
<script src="../addons/fit/fit.js" ></script>
<script src="../addons/fullscreen/fullscreen.js" ></script>
<script src="main.js" defer ></script>
</head>
<body>
<h1>
xterm.js: xterm, in the browser
</h1>
<h1>xterm.js: xterm, in the browser</h1>
<div id="terminal-container"></div>
<div>
<h2>Options</h2>
<label><input type="checkbox" id="option-cursor-blink"> cursorBlink</label>
<div>
<h3>Size</h3>
<div>
<div style="display: inline-block; margin-right: 16px;">
<label for="cols">Columns</label>
<input type="number" id="cols" />
</div>
<div style="display: inline-block; margin-right: 16px;">
<label for="rows">Rows</label>
<input type="number" id="rows" />
</div>
</div>
</div>
</div>
<p><strong>Attention:</strong> The demo is a barebones implementation and is designed for xterm.js evaluation purposes only. Exposing the demo to the public as is would introduce security risks for the host.</p>
<script src="main.js" defer ></script>
</body>
</html>
</html>
+119 -25
View File
@@ -1,32 +1,126 @@
var term,
protocol,
socketURL,
socket,
pid,
charWidth,
charHeight;
var terminalContainer = document.getElementById('terminal-container'),
term = new Terminal(),
prompt = '> ';
optionElements = {
cursorBlink: document.querySelector('#option-cursor-blink')
},
colsElement = document.getElementById('cols'),
rowsElement = document.getElementById('rows');
term.open(terminalContainer);
term.fit();
function setTerminalSize () {
var cols = parseInt(colsElement.value),
rows = parseInt(rowsElement.value),
width = (cols * charWidth).toString() + 'px',
height = (rows * charHeight).toString() + 'px';
term.prompt = function () {
term.write('\r\n' + prompt);
};
terminalContainer.style.width = width;
terminalContainer.style.height = height;
term.resize(cols, rows);
}
term.writeln('Welcome to xterm.js');
term.writeln('Just type some keys in the prompt below.');
term.writeln('');
term.prompt();
colsElement.addEventListener('change', setTerminalSize);
rowsElement.addEventListener('change', setTerminalSize);
term.on('key', function (key, ev) {
var printable = (!ev.altKey && !ev.altGraphKey && !ev.ctrlKey && !ev.metaKey);
optionElements.cursorBlink.addEventListener('change', createTerminal);
if (ev.keyIdentifier == 'Enter') {
term.prompt();
} else if (ev.keyCode == 8) {
/*
* Do not delete the prompt
*/
if (term.x > 2) {
term.write('\b \b');
}
} else if (printable) {
term.write(key);
createTerminal();
function createTerminal() {
// Clean terminal
while (terminalContainer.children.length) {
terminalContainer.removeChild(terminalContainer.children[0]);
}
});
term = new Terminal({
cursorBlink: optionElements.cursorBlink.checked
});
term.on('resize', function (size) {
if (!pid) {
return;
}
var cols = size.cols,
rows = size.rows,
url = '/terminals/' + pid + '/size?cols=' + cols + '&rows=' + rows;
fetch(url, {method: 'POST'});
});
protocol = (location.protocol === 'https:') ? 'wss://' : 'ws://';
socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/terminals/';
term.open(terminalContainer);
term.fit();
var initialGeometry = term.proposeGeometry(),
cols = initialGeometry.cols,
rows = initialGeometry.rows;
colsElement.value = cols;
rowsElement.value = rows;
fetch('/terminals?cols=' + cols + '&rows=' + rows, {method: 'POST'}).then(function (res) {
charWidth = Math.ceil(term.element.offsetWidth / cols);
charHeight = Math.ceil(term.element.offsetHeight / rows);
res.text().then(function (pid) {
window.pid = pid;
socketURL += pid;
socket = new WebSocket(socketURL);
socket.onopen = runRealTerminal;
socket.onclose = runFakeTerminal;
socket.onerror = runFakeTerminal;
});
});
}
function runRealTerminal() {
term.attach(socket);
term._initialized = true;
}
function runFakeTerminal() {
if (term._initialized) {
return;
}
term._initialized = true;
var shellprompt = '$ ';
term.prompt = function () {
term.write('\r\n' + shellprompt);
};
term.writeln('Welcome to xterm.js');
term.writeln('This is a local terminal emulation, without a real terminal in the back-end.');
term.writeln('Type some keys and commands to play around.');
term.writeln('');
term.prompt();
term.on('key', function (key, ev) {
var printable = (
!ev.altKey && !ev.altGraphKey && !ev.ctrlKey && !ev.metaKey
);
if (ev.keyCode == 13) {
term.prompt();
} else if (ev.keyCode == 8) {
// Do not delete the prompt
if (term.x > 2) {
term.write('\b \b');
}
} else if (printable) {
term.write(key);
}
});
term.on('paste', function (data, ev) {
term.write(data);
});
}
+4 -4
View File
@@ -9,8 +9,8 @@ h1 {
}
#terminal-container {
width: 960px;
height: 600px;
width: 800px;
height: 450px;
margin: 0 auto;
padding: 2px;
}
@@ -21,6 +21,6 @@ h1 {
padding: 2px;
}
#terminal-container .terminal .terminal-cursor {
#terminal-container .terminal:focus .terminal-cursor {
background-color: #fafafa;
}
}
-177
View File
@@ -1,177 +0,0 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/xtermjs.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/xtermjs.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/xtermjs"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/xtermjs"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
-258
View File
@@ -1,258 +0,0 @@
# -*- coding: utf-8 -*-
#
# xterm.js documentation build configuration file, created by
# sphinx-quickstart on Tue Mar 25 17:38:05 2014.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = []
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'xterm.js'
copyright = u'2014, SourceLair Limited'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '0.24'
# The full version, including alpha/beta/rc tags.
release = '0.24 Alpha'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'xtermjsdoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
('index', 'xtermjs.tex', u'xterm.js Documentation',
u'sourceLair Limited', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'xtermjs', u'xterm.js Documentation',
[u'sourceLair Limited'], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'xtermjs', u'xterm.js Documentation',
u'sourceLair Limited', 'xtermjs', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
-43
View File
@@ -1,43 +0,0 @@
------
Events
------
focus
^^^^^
This event is fired, when the Terminal gets focus.
blur
^^^^
This event is fired, when the Terminal loses focus.
open
^^^^
This event is fired, when the Terminal gets opened into a DOM Element.
keydown
^^^^^^^
This event is fired, when the `keydown` DOM Event gets triggered on the Terminal.
keypress
^^^^^^^^
This event is fired, when the `keypress` DOM Event gets triggered on the Terminal.
key
^^^
This event is fired, when a key is being handled by the Terminal.
resize
^^^^^^
This event is being fired, when the Terminal view gets resized by the `resize` method.
data
^^^^
This event is being fired, when a chunk of input data gets handled by the terminal.
copy
^^^^
This event is fired, when the `copy` DOM Event gets triggered on the Terminal.
paste
^^^^^
This event is fired, when the `paste` DOM Event gets triggered on the Terminal.
-45
View File
@@ -1,45 +0,0 @@
.. xterm.js documentation master file, created by
sphinx-quickstart on Tue Mar 25 17:38:05 2014.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to xterm.js's documentation!
====================================
This is the documentation for xterm.js. Xterm.js is a full xterm clone, written completely in JavaScript.
Xterm.js supplies a modular, event-based interface that lets developers build addons and themes that augment
the experience of running a fully-feature terminal inside the browser.
Xterm.js serves as the foundation for the terminal found at www.sourcelair.com.
.. image:: screenshot.png
Getting started
^^^^^^^^^^^^^^^
.. code-block:: javascript
var term = new Terminal(),
url = 'ws://docker/containers/mycontainer/attach/ws/?stdin=1&stdout=1&stderr=1&logs=1',
socket = new WebSocket(url);
term.open(document.body);
term.on('data', function (data) {
socket.send(data);
});
socket.onmessage = function (e) {
term.write(e.data);
}
Contents
^^^^^^^^
The standard way to create a terminal-based application with xterm.js is to work with its events and
methods, that let you manipulate input, output, state and size of the terminal.
.. toctree::
:maxdepth: 1
methods
events
-47
View File
@@ -1,47 +0,0 @@
-------
Methods
-------
focus()
^^^^^^^
Sends focus to the terminal
blur()
^^^^^^
Blurs the Terminal
open(element)
^^^^
Open the Xterm terminal, inside the given element.
resize(x, y)
^^^^^^^^^^^^
Resize the terminal, according to the given columns and rows.
insertRow(row)
^^^^^^^^^^^^^^
Insert the given row in the terminal.
on(event, callback)
^^^^^^^^^^^^^^^^^^^
Hook the given callback, to the given event.
off(event, callback)
^^^^^^^^^^^^^^^^^^^
Remove the Hook of the given callback, from the given event.
once(event, callback)
^^^^^^^^^^^^^^^^^^^
Hook the given callback to the given event, for just a single invocation.
write(data)
^^^^^^^^^^^
Write the given data to the terminal.
writeln(data)
^^^^^^^^^^^^^
Write the given data to the terminal, followed by a carriage return and a new line.
handler(data)
^^^^^^^^^^^^^
Fire the data event, for the given data.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

+26
View File
@@ -0,0 +1,26 @@
{
"source": {
"include": [
"src/xterm.js",
"addons/attach/attach.js",
"addons/fit/fit.js",
"addons/fullscreen/fullscreen.js",
"addons/linkify/linkify.js"
]
},
"opts": {
"readme": "README.md",
"template": "node_modules/docdash",
"encoding": "utf8",
"destination": "docs/",
"recurse": true,
"verbose": true
},
"plugins": [
"plugins/markdown"
],
"templates": {
"cleverLinks": false,
"monospaceLinks": false
}
}
+28
View File
@@ -0,0 +1,28 @@
{
"name": "xterm",
"version": "1.1.2",
"ignore": [
"demo",
"test",
".gitignore"
],
"main": "src/xterm.js",
"repository": "https://github.com/sourcelair/xterm.js",
"license": "MIT",
"devDependencies": {
"chai": "3.5.0",
"docdash": "0.4.0",
"express": "4.13.4",
"express-ws": "2.0.0-rc.1",
"glob": "^7.0.5",
"jsdoc": "3.4.0",
"mocha": "2.5.3",
"pty.js": "0.3.1",
"sleep": "^3.0.1"
},
"scripts": {
"start": "node demo/app",
"test": "mocha --recursive",
"build:docs": "node_modules/.bin/jsdoc -c jsdoc.json"
}
}
+594 -526
View File
File diff suppressed because it is too large Load Diff
+1964 -1293
View File
File diff suppressed because it is too large Load Diff
+48
View File
@@ -0,0 +1,48 @@
var assert = require('chai').assert;
var Terminal = require('../../src/xterm');
var linkify = require('../../addons/linkify/linkify');
describe('linkify addon', function () {
var xterm;
describe('API', function () {
it('should define Terminal.prototype.linkify', function () {
assert.isDefined(Terminal.prototype.linkify);
});
it('should define Terminal.prototype.linkifyTerminalLine', function () {
assert.isDefined(Terminal.prototype.linkifyTerminalLine);
});
});
describe('findUrlMatchOnLine', function () {
describe('strict regex', function () {
it('should match when the entire text is a match', function () {
assert.equal(linkify.findLinkMatch('http://github.com', false), 'http://github.com');
assert.equal(linkify.findLinkMatch('http://127.0.0.1', false), 'http://127.0.0.1');
});
it('should match simple domains', function () {
assert.equal(linkify.findLinkMatch('foo http://github.com bar', false), 'http://github.com');
assert.equal(linkify.findLinkMatch('foo http://www.github.com bar', false), 'http://www.github.com');
assert.equal(linkify.findLinkMatch('foo https://github.com bar', false), 'https://github.com');
assert.equal(linkify.findLinkMatch('foo https://www.github.com bar', false), 'https://www.github.com');
});
it('should match web addresses with alpha paths', function () {
assert.equal(linkify.findLinkMatch('foo http://github.com/a/b/c bar', false), 'http://github.com/a/b/c');
assert.equal(linkify.findLinkMatch('foo http://www.github.com/a/b/c bar', false), 'http://www.github.com/a/b/c');
});
it('should not include whitespace surrounding a match', function () {
assert.equal(linkify.findLinkMatch(' http://github.com', false), 'http://github.com');
assert.equal(linkify.findLinkMatch('http://github.com ', false), 'http://github.com');
assert.equal(linkify.findLinkMatch(' http://github.com ', false), 'http://github.com');
});
it('should match IP addresses', function () {
assert.equal(linkify.findLinkMatch('foo http://127.0.0.1 bar', false), 'http://127.0.0.1');
assert.equal(linkify.findLinkMatch('foo https://127.0.0.1 bar', false), 'https://127.0.0.1');
});
it('should match ports on both domains and IP addresses', function () {
assert.equal(linkify.findLinkMatch('foo http://127.0.0.1:8080 bar', false), 'http://127.0.0.1:8080');
assert.equal(linkify.findLinkMatch('foo http://www.github.com:8080 bar', false), 'http://www.github.com:8080');
});
});
});
});
+10
View File
@@ -0,0 +1,10 @@
var assert = require('chai').assert;
var Terminal = require('../../src/xterm');
describe('xterm.js addons', function() {
it('should load addons with Terminal.loadAddon', function () {
Terminal.loadAddon('attach');
// Test that function was loaded successfully
assert.equal(typeof Terminal.prototype.attach, 'function');
});
});
-49
View File
@@ -1,49 +0,0 @@
/**
* term.js
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
*/
var element = {
createElement: function() { return element; },
appendChild: function() {},
removeChild: function() {},
addEventListener: function() {},
removeEventListener: function() {},
setAttribute: function() {},
style: {}
};
global.window = global;
window.navigator = { userAgent: '' };
window.document = element;
window.document.body = element;
element.ownerDocument = window.document;
window.document.defaultView = window;
var Terminal = require('../src/term');
Terminal.cursorBlink = false;
var data = require('./data').data;
var term = new Terminal({
cols: 250,
rows: 100
});
term.open(element);
var time = new Date;
var t = 10;
while (t--) {
var l = data.length
, i = 0;
for (; i < l; i++) {
term.write(data[i]);
}
}
console.log('Completed: %d.', new Date - time);
console.log('Average (?): 13.5k (for ~2.7k writes).');
+263
View File
@@ -0,0 +1,263 @@
var assert = require('chai').assert;
var Terminal = require('../src/xterm');
describe('CompositionHelper', function () {
var terminal;
var compositionHelper;
var compositionView;
var textarea;
var handledText;
beforeEach(function () {
compositionView = {
classList: {
add: function () {},
remove: function () {},
},
getBoundingClientRect: function () {
return { width: 0 }
},
style: {
left: 0,
top: 0
},
textContent: ''
};
textarea = {
value: '',
style: {
left: 0,
top: 0
}
};
terminal = {
element: {
querySelector: function () {
return { offsetLeft: 0, offsetTop: 0 };
}
},
handler: function (text) {
handledText += text;
}
};
handledText = '';
compositionHelper = new Terminal.CompositionHelper(textarea, compositionView, terminal);
});
describe('Public API', function () {
it('should define CompositionHelper.prototype.compositionstart', function () {
assert.isDefined(Terminal.CompositionHelper.prototype.compositionstart);
});
it('should define CompositionHelper.prototype.compositionupdate', function () {
assert.isDefined(Terminal.CompositionHelper.prototype.compositionupdate);
});
it('should define CompositionHelper.prototype.compositionend', function () {
assert.isDefined(Terminal.CompositionHelper.prototype.compositionend);
});
it('should define CompositionHelper.prototype.finalizeComposition', function () {
assert.isDefined(Terminal.CompositionHelper.prototype.finalizeComposition);
});
it('should define CompositionHelper.prototype.handleAnyTextareaChanges', function () {
assert.isDefined(Terminal.CompositionHelper.prototype.handleAnyTextareaChanges);
});
it('should define CompositionHelper.prototype.updateCompositionElements', function () {
assert.isDefined(Terminal.CompositionHelper.prototype.updateCompositionElements);
});
it('should define CompositionHelper.isComposing', function () {
assert.isDefined(compositionHelper.isComposing);
});
it('should define CompositionHelper.isSendingComposition', function () {
assert.isDefined(compositionHelper.isSendingComposition);
});
});
describe('Input', function () {
it('Should insert simple characters', function (done) {
// First character 'ㅇ'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'ㅇ' });
textarea.value = 'ㅇ';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionend();
setTimeout(function() { // wait for any textarea updates
assert.equal(handledText, 'ㅇ');
// Second character 'ㅇ'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'ㅇ' });
textarea.value = 'ㅇㅇ';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionend();
setTimeout(function() { // wait for any textarea updates
assert.equal(handledText, 'ㅇㅇ');
done();
}, 0);
}, 0);
}, 0);
}, 0);
});
it('Should insert complex characters', function (done) {
// First character '앙'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'ㅇ' });
textarea.value = 'ㅇ';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionupdate({ data: '아' });
textarea.value = '아';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionupdate({ data: '앙' });
textarea.value = '앙';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionend();
setTimeout(function() { // wait for any textarea updates
assert.equal(handledText, '앙');
// Second character '앙'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'ㅇ' });
textarea.value = '앙ㅇ';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionupdate({ data: '아' });
textarea.value = '앙아';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionupdate({ data: '앙' });
textarea.value = '앙앙';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionend();
setTimeout(function() { // wait for any textarea updates
assert.equal(handledText, '앙앙');
done();
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
});
it('Should insert complex characters that change with following character', function (done) {
// First character '아'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'ㅇ' });
textarea.value = 'ㅇ';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionupdate({ data: '아' });
textarea.value = '아';
setTimeout(function() { // wait for any textarea updates
// Start second character '아' in first character
compositionHelper.compositionupdate({ data: '앙' });
textarea.value = '앙';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionend();
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: '아' });
textarea.value = '아아'
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionend();
setTimeout(function() { // wait for any textarea updates
assert.equal(handledText, '아아');
done();
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
});
it('Should insert multi-characters compositions', function (done) {
// First character 'だ'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'd' });
textarea.value = 'd';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionupdate({ data: 'だ' });
textarea.value = 'だ';
setTimeout(function() { // wait for any textarea updates
// Second character 'あ'
compositionHelper.compositionupdate({ data: 'だあ' });
textarea.value = 'だあ';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionend();
setTimeout(function() { // wait for any textarea updates
assert.equal(handledText, 'だあ');
done();
}, 0);
}, 0);
}, 0);
}, 0);
});
it('Should insert multi-character compositions that are converted to other characters with the same length', function (done) {
// First character 'だ'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'd' });
textarea.value = 'd';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionupdate({ data: 'だ' });
textarea.value = 'だ';
setTimeout(function() { // wait for any textarea updates
// Second character 'ー'
compositionHelper.compositionupdate({ data: 'だー' });
textarea.value = 'だー';
setTimeout(function() { // wait for any textarea updates
// Convert to katakana 'ダー'
compositionHelper.compositionupdate({ data: 'ダー' });
textarea.value = 'ダー';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionend();
setTimeout(function() { // wait for any textarea updates
assert.equal(handledText, 'ダー');
done();
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
})
it('Should insert multi-character compositions that are converted to other characters with different lengths', function (done) {
// First character 'い'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'い' });
textarea.value = 'い';
setTimeout(function() { // wait for any textarea updates
// Second character 'ま'
compositionHelper.compositionupdate({ data: 'いm' });
textarea.value = 'いm';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionupdate({ data: 'いま' });
textarea.value = 'いま';
setTimeout(function() { // wait for any textarea updates
// Convert to kanji '今'
compositionHelper.compositionupdate({ data: '今' });
textarea.value = '今';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionend();
setTimeout(function() { // wait for any textarea updates
assert.equal(handledText, '今');
done();
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
});
it('Should insert non-composition characters input immediately after composition characters', function (done) {
// First character 'ㅇ'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'ㅇ' });
textarea.value = 'ㅇ';
setTimeout(function() { // wait for any textarea updates
compositionHelper.compositionend();
// Second character '1' (a non-composition character)
textarea.value = 'ㅇ1';
setTimeout(function() { // wait for any textarea updates
assert.equal(handledText, 'ㅇ1');
done();
}, 0);
}, 0);
});
});
});
-10
View File
@@ -1,10 +0,0 @@
167a168,170
> var stream = fs.createWriteStream(__dirname + '/../test/data.js');
> stream.write('this.data = [\n');
>
169a173
> stream.write(' ' + JSON.stringify(data) + ',\n');
182a187,189
>
> stream.write('];\n');
> stream.end();
+21
View File
@@ -0,0 +1,21 @@
All tests are made for 80x25 terminal. Make sure to run tests with 80x25.
Create .text files from xterm (expected output)
- open xterm
- resize xterm to 80x25
- run `python run_tests.py`
- copy & paste whole window output into editor
- add 26th empty line (due to line handling in toString) - not a bug, a feature ;)
- advance to next test with ^D
Known problems
##############
t0031-HBP:
- no documentation at all about CSIj found - skipping
t0050-ICH:
- bug in xterm? (cant ICH last real char, always sticks to last col)
- text used from https://github.com/MarkLodato/vt100-parser/blob/master/test/t0050-ICH.text
@@ -0,0 +1,6 @@
!"#$%&'()*+,-./
0123456789:;<=>?
@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_
`abcdefghijklmno
pqrstuvwxyz{|}~
@@ -0,0 +1,25 @@
!"#$%&'()*+,-./
0123456789:;<=>?
@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_
`abcdefghijklmno
pqrstuvwxyz{|}~
@@ -0,0 +1,95 @@
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
@@ -0,0 +1,25 @@
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
@@ -0,0 +1 @@
abcdefghijklmnopqrstuvwxyz0123456789
@@ -0,0 +1,25 @@
abcdefghijklmnopqrstuvwxyz0123456789
@@ -0,0 +1,83 @@
a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi
abcdefghij
abcdefghijk
abcdefghijkl
abcdefghijklm
abcdefghijklmn
abcdefghijklmno
abcdefghijklmnop
abcdefghijklmnopq
abcdefghijklmnopqr
abcdefghijklmnopqrs
abcdefghijklmnopqrst
abcdefghijklmnopqrstu
abcdefghijklmnopqrstuv
abcdefghijklmnopqrstuvw
abcdefghijklmnopqrstuvwx
abcdefghijklmnopqrstuvwxy
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyzA
abcdefghijklmnopqrstuvwxyzAB
abcdefghijklmnopqrstuvwxyzABC
abcdefghijklmnopqrstuvwxyzABCD
abcdefghijklmnopqrstuvwxyzABCDE
abcdefghijklmnopqrstuvwxyzABCDEF
abcdefghijklmnopqrstuvwxyzABCDEFG
abcdefghijklmnopqrstuvwxyzABCDEFGH
abcdefghijklmnopqrstuvwxyzABCDEFGHI
abcdefghijklmnopqrstuvwxyzABCDEFGHIJ
abcdefghijklmnopqrstuvwxyzABCDEFGHIJK
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKL
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRST
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890a
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890ab
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abc
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcd
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcde
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdef
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefg
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefgh
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghi
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghij
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijk
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijkl
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmn
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmno
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnop
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqr
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrs
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrst
@@ -0,0 +1,25 @@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890a
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890ab
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abc
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcd
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcde
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdef
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefg
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefgh
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghi
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghij
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijk
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijkl
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmn
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmno
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnop
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
r
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
rs
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
rst
+26
View File
@@ -0,0 +1,26 @@
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
+25
View File
@@ -0,0 +1,25 @@
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
+83
View File
@@ -0,0 +1,83 @@
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
0
1
2
3
4
5
6
7
8
9
0
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
+25
View File
@@ -0,0 +1,25 @@
7
8
9
0
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
+7
View File
@@ -0,0 +1,7 @@
1␍x
2␍x
3␍x
4␍x
5␍x
6␍x
7␍x
+25
View File
@@ -0,0 +1,25 @@
x
x2
x 3
x 4
x 5
x 6
x 7
+82
View File
@@ -0,0 +1,82 @@
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
b␍a
+25
View File
@@ -0,0 +1,25 @@
a b
a b
a b
a b
a b
a b
a b
a b
a b
a b
a b
a b
a b
a b
a b
a b
a b
a b
a b
a b
a
ab
+1
View File
@@ -0,0 +1 @@
aDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzDADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD0D1D2D3D4D5D6D7D8D9D0DaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDt
+25
View File
@@ -0,0 +1,25 @@
7
8
9
0
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
@@ -0,0 +1,8 @@
0 space:
1 space:
2 space:
3 space:
70 space:
71 space:
72 space:
73 space:
@@ -0,0 +1,25 @@
0 space:
1 space:
2 space:
3 space:
70 space:
71 space:
72 space:
73 space:
+7
View File
@@ -0,0 +1,7 @@
abcdefghijklmnopqrstuvwxyz!
abc@
#
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnop$
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq%
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqr^
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrs&
+25
View File
@@ -0,0 +1,25 @@
abcdefghijklmnopqrst!vwxyz
@bc
#
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghij$lmnop
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghij%lmnopq
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
^
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
&s
+1
View File
@@ -0,0 +1 @@
aEabEabcEabcdEabcdeEabcdefEabcdefgEabcdefghEabcdefghiEabcdefghijEabcdefghijkEabcdefghijklEabcdefghijklmEabcdefghijklmnEabcdefghijklmnoEabcdefghijklmnopEabcdefghijklmnopqEabcdefghijklmnopqrEabcdefghijklmnopqrsEabcdefghijklmnopqrstEabcdefghijklmnopqrstuEabcdefghijklmnopqrstuvEabcdefghijklmnopqrstuvwEabcdefghijklmnopqrstuvwxEabcdefghijklmnopqrstuvwxyEabcdefghijklmnopqrstuvwxyzEabcdefghijklmnopqrstuvwxyzAEabcdefghijklmnopqrstuvwxyzABEabcdefghijklmnopqrstuvwxyzABCEabcdefghijklmnopqrstuvwxyzABCDEabcdefghijklmnopqrstuvwxyzABCDEEabcdefghijklmnopqrstuvwxyzABCDEFEabcdefghijklmnopqrstuvwxyzABCDEFGEabcdefghijklmnopqrstuvwxyzABCDEFGHEabcdefghijklmnopqrstuvwxyzABCDEFGHIEabcdefghijklmnopqrstuvwxyzABCDEFGHIJEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQREabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0EabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01EabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012EabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123EabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234EabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345EabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456EabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567EabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678EabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789EabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890EabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890aEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdeEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefgEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghiEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijkEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnoEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrsEabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrst
+25
View File
@@ -0,0 +1,25 @@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890a
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890ab
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abc
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcd
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcde
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdef
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefg
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefgh
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghi
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghij
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijk
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijkl
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmn
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmno
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnop
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
r
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
rs
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
rst
+10
View File
@@ -0,0 +1,10 @@
a
b
c
dMeMfMg
h
i
j....................................................................kMlMmMn
+25
View File
@@ -0,0 +1,25 @@
a g n
h f m
ie l
j....................................................................k
@@ -0,0 +1,47 @@
And the third.
This should be the last line.
This one should be lost.
This one's a goner, too.␍MMMMMMMMMMMMMMMMMMMMMMMMThis is second line.␍MThis should be the first line.
@@ -0,0 +1,25 @@
This should be the first line.
This is second line.
And the third.
This should be the last line.
This one should be lost.
+1
View File
@@ -0,0 +1 @@
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t␍
+25
View File
@@ -0,0 +1,25 @@
7
8
9
0
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
+1
View File
@@ -0,0 +1 @@
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t␍
+25
View File
@@ -0,0 +1,25 @@
8
9
0
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
+8
View File
@@ -0,0 +1,8 @@
abcdDefgh
abcdDefgh
abcd!Defgh
abcd!*Defgh
abcd[Defgh
abcd[!Defgh
abcd[2Defgh
abcd[*2;Defgh
+25
View File
@@ -0,0 +1,25 @@
abcdDefgh
abcdDefgh
abcdDefgh
abcdDefgh
abcdDefgh
abcdDefgh
abcdDefgh
abcdDefgh
+8
View File
@@ -0,0 +1,8 @@
abcdDefgh
abcdDefgh
abcd!Defgh
abcd!*Defgh
abcd[Defgh
abcd[!Defgh
abcd[2Defgh
abcd[*2;Defgh
+25
View File
@@ -0,0 +1,25 @@
abcdDefgh
abcdDefgh
abcdDefgh
abcdDefgh
abcdDefgh
abcdDefgh
abcdDefgh
abcdDefgh
+17
View File
@@ -0,0 +1,17 @@
HelloGoodbye
UpDown
x

-----------------------------------------------------------------------------x
------------------------------------------------------------------------------x
-------------------------------------------------------------------------------x
--------------------------------------------------------------------------------x
---------------------------------------------------------------------------------x
.............................................................................x
..............................................................................x
...............................................................................x
................................................................................x
.................................................................................x

The End.
+25
View File
@@ -0,0 +1,25 @@
The End.
+54
View File
@@ -0,0 +1,54 @@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
a
b
c
d
e
f
g
h
------------------------------------------------------------------------------1
-------------------------------------------------------------------------------2
--------------------------------------------------------------------------------3
---------------------------------------------------------------------------------4
..............................................................................5
...............................................................................6
................................................................................7
.................................................................................8
+25
View File
@@ -0,0 +1,25 @@
a
b
f
g
h 1
2
3
-4------------------------------------------------------------------------------
5
6
7
8...............................................................................
+14
View File
@@ -0,0 +1,14 @@
abcdefghijkl
abcdefghijkl
abcdefghijkl
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmno@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnop@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqr@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm@
x
x
abcd
+25
View File
@@ -0,0 +1,25 @@
abcdefg hijkl
abcdefg hijkl
abcdefg hijkl
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmno @
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnop@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnop@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
r @
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm @
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm @
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm @
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm @
x
x
abcd
+8
View File
@@ -0,0 +1,8 @@
abcdefg!@
abcdefg!@
abcdefg!@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmno@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnop@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqr@
x
+25
View File
@@ -0,0 +1,25 @@
abcdef!@
!@cdefg
abcde!@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmn@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmno@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmno@q
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq
@
x
+25
View File
@@ -0,0 +1,25 @@
a
b
c
defg
h
i
j....................................................................klmn
0123
+25
View File
@@ -0,0 +1,25 @@
a g n
h f m
ie l
j....................................................................k
3
2
1
0
@@ -0,0 +1,50 @@
This is the first line.
This is the second line.
And the third.
This line should be deleted.
Penultimate line.
This should be the last line.␍I have gone up all the way...
@@ -0,0 +1,25 @@
I have gone up all the way...
This line should be deleted.
Penultimate line.
This should be the last line.
+24
View File
@@ -0,0 +1,24 @@
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x012345Bottom line.␍ABCDE␍
+25
View File
@@ -0,0 +1,25 @@
b 1
c 2
d 3
e
f 4
g
h
i 5
j
k
l
m
n
o
p
q A
r B
s C
t D
u E
v
w
x
Bottom line.
+1
View File
@@ -0,0 +1 @@
abcdefg
+25
View File
@@ -0,0 +1,25 @@
b
e
d
g
f
+2
View File
@@ -0,0 +1,2 @@
abcdefghi␍
-------------------------------------------------------------------------abcdefghijlast line
+25
View File
@@ -0,0 +1,25 @@
def
ghi
-------------------------------------------------------------------------abcdefg
hij
last line
+6
View File
@@ -0,0 +1,6 @@
erasedreplacement
line fourline two
+25
View File
@@ -0,0 +1,25 @@
replacement
line two
line four
+14
View File
@@ -0,0 +1,14 @@
abcdefghijkl
abcdefghijkl
abcdefghijkl
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmno@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnop@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopq@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqr@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm@
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklm@
x
x
abcd

Some files were not shown because too many files have changed in this diff Show More