Merge remote branch 'upstream/master'
This commit is contained in:
commit
5c64ff4ad2
36 changed files with 9183 additions and 340 deletions
3
.gitmodules
vendored
3
.gitmodules
vendored
|
|
@ -1,6 +1,3 @@
|
||||||
[submodule "support/node-o3-xml"]
|
|
||||||
path = support/node-o3-xml
|
|
||||||
url = git://github.com/ajaxorg/node-o3-xml.git
|
|
||||||
[submodule "support/cockpit"]
|
[submodule "support/cockpit"]
|
||||||
path = support/cockpit
|
path = support/cockpit
|
||||||
url = git://github.com/ajaxorg/cockpit.git
|
url = git://github.com/ajaxorg/cockpit.git
|
||||||
|
|
|
||||||
1
demo/icons/Readme.txt
Normal file
1
demo/icons/Readme.txt
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
The icons in this folder are from the Eclipse project and licensed under the Eclipse public license version 1.0 (EPL).
|
||||||
260
demo/icons/epl.html
Normal file
260
demo/icons/epl.html
Normal file
|
|
@ -0,0 +1,260 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||||
|
|
||||||
|
<title>Eclipse Public License - Version 1.0</title>
|
||||||
|
<style type="text/css">
|
||||||
|
body {
|
||||||
|
size: 8.5in 11.0in;
|
||||||
|
margin: 0.25in 0.5in 0.25in 0.5in;
|
||||||
|
tab-interval: 0.5in;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-top: 0.5em;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
p.list {
|
||||||
|
margin-left: 0.5in;
|
||||||
|
margin-top: 0.05em;
|
||||||
|
margin-bottom: 0.05em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script src="chrome-extension://jgghnecdoiloelcogfmgjgcacadpaejf/inject.js"></script></head>
|
||||||
|
|
||||||
|
<body lang="EN-US">
|
||||||
|
|
||||||
|
<h2>Eclipse Public License - v 1.0</h2>
|
||||||
|
|
||||||
|
<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
|
||||||
|
PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
|
||||||
|
DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
|
||||||
|
AGREEMENT.</p>
|
||||||
|
|
||||||
|
<p><b>1. DEFINITIONS</b></p>
|
||||||
|
|
||||||
|
<p>"Contribution" means:</p>
|
||||||
|
|
||||||
|
<p class="list">a) in the case of the initial Contributor, the initial
|
||||||
|
code and documentation distributed under this Agreement, and</p>
|
||||||
|
<p class="list">b) in the case of each subsequent Contributor:</p>
|
||||||
|
<p class="list">i) changes to the Program, and</p>
|
||||||
|
<p class="list">ii) additions to the Program;</p>
|
||||||
|
<p class="list">where such changes and/or additions to the Program
|
||||||
|
originate from and are distributed by that particular Contributor. A
|
||||||
|
Contribution 'originates' from a Contributor if it was added to the
|
||||||
|
Program by such Contributor itself or anyone acting on such
|
||||||
|
Contributor's behalf. Contributions do not include additions to the
|
||||||
|
Program which: (i) are separate modules of software distributed in
|
||||||
|
conjunction with the Program under their own license agreement, and (ii)
|
||||||
|
are not derivative works of the Program.</p>
|
||||||
|
|
||||||
|
<p>"Contributor" means any person or entity that distributes
|
||||||
|
the Program.</p>
|
||||||
|
|
||||||
|
<p>"Licensed Patents" mean patent claims licensable by a
|
||||||
|
Contributor which are necessarily infringed by the use or sale of its
|
||||||
|
Contribution alone or when combined with the Program.</p>
|
||||||
|
|
||||||
|
<p>"Program" means the Contributions distributed in accordance
|
||||||
|
with this Agreement.</p>
|
||||||
|
|
||||||
|
<p>"Recipient" means anyone who receives the Program under
|
||||||
|
this Agreement, including all Contributors.</p>
|
||||||
|
|
||||||
|
<p><b>2. GRANT OF RIGHTS</b></p>
|
||||||
|
|
||||||
|
<p class="list">a) Subject to the terms of this Agreement, each
|
||||||
|
Contributor hereby grants Recipient a non-exclusive, worldwide,
|
||||||
|
royalty-free copyright license to reproduce, prepare derivative works
|
||||||
|
of, publicly display, publicly perform, distribute and sublicense the
|
||||||
|
Contribution of such Contributor, if any, and such derivative works, in
|
||||||
|
source code and object code form.</p>
|
||||||
|
|
||||||
|
<p class="list">b) Subject to the terms of this Agreement, each
|
||||||
|
Contributor hereby grants Recipient a non-exclusive, worldwide,
|
||||||
|
royalty-free patent license under Licensed Patents to make, use, sell,
|
||||||
|
offer to sell, import and otherwise transfer the Contribution of such
|
||||||
|
Contributor, if any, in source code and object code form. This patent
|
||||||
|
license shall apply to the combination of the Contribution and the
|
||||||
|
Program if, at the time the Contribution is added by the Contributor,
|
||||||
|
such addition of the Contribution causes such combination to be covered
|
||||||
|
by the Licensed Patents. The patent license shall not apply to any other
|
||||||
|
combinations which include the Contribution. No hardware per se is
|
||||||
|
licensed hereunder.</p>
|
||||||
|
|
||||||
|
<p class="list">c) Recipient understands that although each Contributor
|
||||||
|
grants the licenses to its Contributions set forth herein, no assurances
|
||||||
|
are provided by any Contributor that the Program does not infringe the
|
||||||
|
patent or other intellectual property rights of any other entity. Each
|
||||||
|
Contributor disclaims any liability to Recipient for claims brought by
|
||||||
|
any other entity based on infringement of intellectual property rights
|
||||||
|
or otherwise. As a condition to exercising the rights and licenses
|
||||||
|
granted hereunder, each Recipient hereby assumes sole responsibility to
|
||||||
|
secure any other intellectual property rights needed, if any. For
|
||||||
|
example, if a third party patent license is required to allow Recipient
|
||||||
|
to distribute the Program, it is Recipient's responsibility to acquire
|
||||||
|
that license before distributing the Program.</p>
|
||||||
|
|
||||||
|
<p class="list">d) Each Contributor represents that to its knowledge it
|
||||||
|
has sufficient copyright rights in its Contribution, if any, to grant
|
||||||
|
the copyright license set forth in this Agreement.</p>
|
||||||
|
|
||||||
|
<p><b>3. REQUIREMENTS</b></p>
|
||||||
|
|
||||||
|
<p>A Contributor may choose to distribute the Program in object code
|
||||||
|
form under its own license agreement, provided that:</p>
|
||||||
|
|
||||||
|
<p class="list">a) it complies with the terms and conditions of this
|
||||||
|
Agreement; and</p>
|
||||||
|
|
||||||
|
<p class="list">b) its license agreement:</p>
|
||||||
|
|
||||||
|
<p class="list">i) effectively disclaims on behalf of all Contributors
|
||||||
|
all warranties and conditions, express and implied, including warranties
|
||||||
|
or conditions of title and non-infringement, and implied warranties or
|
||||||
|
conditions of merchantability and fitness for a particular purpose;</p>
|
||||||
|
|
||||||
|
<p class="list">ii) effectively excludes on behalf of all Contributors
|
||||||
|
all liability for damages, including direct, indirect, special,
|
||||||
|
incidental and consequential damages, such as lost profits;</p>
|
||||||
|
|
||||||
|
<p class="list">iii) states that any provisions which differ from this
|
||||||
|
Agreement are offered by that Contributor alone and not by any other
|
||||||
|
party; and</p>
|
||||||
|
|
||||||
|
<p class="list">iv) states that source code for the Program is available
|
||||||
|
from such Contributor, and informs licensees how to obtain it in a
|
||||||
|
reasonable manner on or through a medium customarily used for software
|
||||||
|
exchange.</p>
|
||||||
|
|
||||||
|
<p>When the Program is made available in source code form:</p>
|
||||||
|
|
||||||
|
<p class="list">a) it must be made available under this Agreement; and</p>
|
||||||
|
|
||||||
|
<p class="list">b) a copy of this Agreement must be included with each
|
||||||
|
copy of the Program.</p>
|
||||||
|
|
||||||
|
<p>Contributors may not remove or alter any copyright notices contained
|
||||||
|
within the Program.</p>
|
||||||
|
|
||||||
|
<p>Each Contributor must identify itself as the originator of its
|
||||||
|
Contribution, if any, in a manner that reasonably allows subsequent
|
||||||
|
Recipients to identify the originator of the Contribution.</p>
|
||||||
|
|
||||||
|
<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
|
||||||
|
|
||||||
|
<p>Commercial distributors of software may accept certain
|
||||||
|
responsibilities with respect to end users, business partners and the
|
||||||
|
like. While this license is intended to facilitate the commercial use of
|
||||||
|
the Program, the Contributor who includes the Program in a commercial
|
||||||
|
product offering should do so in a manner which does not create
|
||||||
|
potential liability for other Contributors. Therefore, if a Contributor
|
||||||
|
includes the Program in a commercial product offering, such Contributor
|
||||||
|
("Commercial Contributor") hereby agrees to defend and
|
||||||
|
indemnify every other Contributor ("Indemnified Contributor")
|
||||||
|
against any losses, damages and costs (collectively "Losses")
|
||||||
|
arising from claims, lawsuits and other legal actions brought by a third
|
||||||
|
party against the Indemnified Contributor to the extent caused by the
|
||||||
|
acts or omissions of such Commercial Contributor in connection with its
|
||||||
|
distribution of the Program in a commercial product offering. The
|
||||||
|
obligations in this section do not apply to any claims or Losses
|
||||||
|
relating to any actual or alleged intellectual property infringement. In
|
||||||
|
order to qualify, an Indemnified Contributor must: a) promptly notify
|
||||||
|
the Commercial Contributor in writing of such claim, and b) allow the
|
||||||
|
Commercial Contributor to control, and cooperate with the Commercial
|
||||||
|
Contributor in, the defense and any related settlement negotiations. The
|
||||||
|
Indemnified Contributor may participate in any such claim at its own
|
||||||
|
expense.</p>
|
||||||
|
|
||||||
|
<p>For example, a Contributor might include the Program in a commercial
|
||||||
|
product offering, Product X. That Contributor is then a Commercial
|
||||||
|
Contributor. If that Commercial Contributor then makes performance
|
||||||
|
claims, or offers warranties related to Product X, those performance
|
||||||
|
claims and warranties are such Commercial Contributor's responsibility
|
||||||
|
alone. Under this section, the Commercial Contributor would have to
|
||||||
|
defend claims against the other Contributors related to those
|
||||||
|
performance claims and warranties, and if a court requires any other
|
||||||
|
Contributor to pay any damages as a result, the Commercial Contributor
|
||||||
|
must pay those damages.</p>
|
||||||
|
|
||||||
|
<p><b>5. NO WARRANTY</b></p>
|
||||||
|
|
||||||
|
<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
|
||||||
|
PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
|
||||||
|
OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
|
||||||
|
ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
|
||||||
|
OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
|
||||||
|
responsible for determining the appropriateness of using and
|
||||||
|
distributing the Program and assumes all risks associated with its
|
||||||
|
exercise of rights under this Agreement , including but not limited to
|
||||||
|
the risks and costs of program errors, compliance with applicable laws,
|
||||||
|
damage to or loss of data, programs or equipment, and unavailability or
|
||||||
|
interruption of operations.</p>
|
||||||
|
|
||||||
|
<p><b>6. DISCLAIMER OF LIABILITY</b></p>
|
||||||
|
|
||||||
|
<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
|
||||||
|
NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
|
||||||
|
WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
|
||||||
|
DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
|
||||||
|
HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
|
||||||
|
|
||||||
|
<p><b>7. GENERAL</b></p>
|
||||||
|
|
||||||
|
<p>If any provision of this Agreement is invalid or unenforceable under
|
||||||
|
applicable law, it shall not affect the validity or enforceability of
|
||||||
|
the remainder of the terms of this Agreement, and without further action
|
||||||
|
by the parties hereto, such provision shall be reformed to the minimum
|
||||||
|
extent necessary to make such provision valid and enforceable.</p>
|
||||||
|
|
||||||
|
<p>If Recipient institutes patent litigation against any entity
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that the
|
||||||
|
Program itself (excluding combinations of the Program with other
|
||||||
|
software or hardware) infringes such Recipient's patent(s), then such
|
||||||
|
Recipient's rights granted under Section 2(b) shall terminate as of the
|
||||||
|
date such litigation is filed.</p>
|
||||||
|
|
||||||
|
<p>All Recipient's rights under this Agreement shall terminate if it
|
||||||
|
fails to comply with any of the material terms or conditions of this
|
||||||
|
Agreement and does not cure such failure in a reasonable period of time
|
||||||
|
after becoming aware of such noncompliance. If all Recipient's rights
|
||||||
|
under this Agreement terminate, Recipient agrees to cease use and
|
||||||
|
distribution of the Program as soon as reasonably practicable. However,
|
||||||
|
Recipient's obligations under this Agreement and any licenses granted by
|
||||||
|
Recipient relating to the Program shall continue and survive.</p>
|
||||||
|
|
||||||
|
<p>Everyone is permitted to copy and distribute copies of this
|
||||||
|
Agreement, but in order to avoid inconsistency the Agreement is
|
||||||
|
copyrighted and may only be modified in the following manner. The
|
||||||
|
Agreement Steward reserves the right to publish new versions (including
|
||||||
|
revisions) of this Agreement from time to time. No one other than the
|
||||||
|
Agreement Steward has the right to modify this Agreement. The Eclipse
|
||||||
|
Foundation is the initial Agreement Steward. The Eclipse Foundation may
|
||||||
|
assign the responsibility to serve as the Agreement Steward to a
|
||||||
|
suitable separate entity. Each new version of the Agreement will be
|
||||||
|
given a distinguishing version number. The Program (including
|
||||||
|
Contributions) may always be distributed subject to the version of the
|
||||||
|
Agreement under which it was received. In addition, after a new version
|
||||||
|
of the Agreement is published, Contributor may elect to distribute the
|
||||||
|
Program (including its Contributions) under the new version. Except as
|
||||||
|
expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
|
||||||
|
rights or licenses to the intellectual property of any Contributor under
|
||||||
|
this Agreement, whether expressly, by implication, estoppel or
|
||||||
|
otherwise. All rights in the Program not expressly granted under this
|
||||||
|
Agreement are reserved.</p>
|
||||||
|
|
||||||
|
<p>This Agreement is governed by the laws of the State of New York and
|
||||||
|
the intellectual property laws of the United States of America. No party
|
||||||
|
to this Agreement will bring a legal action under this Agreement more
|
||||||
|
than one year after the cause of action arose. Each party waives its
|
||||||
|
rights to a jury trial in any resulting litigation.</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body></html>
|
||||||
BIN
demo/icons/error_obj.gif
Normal file
BIN
demo/icons/error_obj.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 339 B |
BIN
demo/icons/warning_obj.gif
Normal file
BIN
demo/icons/warning_obj.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 324 B |
|
|
@ -58,13 +58,43 @@ exports.launch = function(env) {
|
||||||
var vim = require("ace/keyboard/keybinding/vim").Vim;
|
var vim = require("ace/keyboard/keybinding/vim").Vim;
|
||||||
var emacs = require("ace/keyboard/keybinding/emacs").Emacs;
|
var emacs = require("ace/keyboard/keybinding/emacs").Emacs;
|
||||||
var HashHandler = require("ace/keyboard/hash_handler").HashHandler;
|
var HashHandler = require("ace/keyboard/hash_handler").HashHandler;
|
||||||
|
|
||||||
var docs = {};
|
var docs = {};
|
||||||
|
|
||||||
docs.js = new EditSession(document.getElementById("jstext").innerHTML);
|
docs.js = new EditSession(document.getElementById("jstext").innerHTML);
|
||||||
docs.js.setMode(new JavaScriptMode());
|
docs.js.setMode(new JavaScriptMode());
|
||||||
docs.js.setUndoManager(new UndoManager());
|
docs.js.setUndoManager(new UndoManager());
|
||||||
|
|
||||||
|
if (false && window.Worker) {
|
||||||
|
var worker = new WorkerClient("../..", ["ace", "pilot"], "ace/worker/mirror", "Mirror");
|
||||||
|
worker.call("setValue", [docs.js.getValue()]);
|
||||||
|
|
||||||
|
docs.js.getDocument().on("change", function(e) {
|
||||||
|
e.range = {
|
||||||
|
start: e.data.range.start,
|
||||||
|
end: e.data.range.end
|
||||||
|
};
|
||||||
|
worker.emit("change", e);
|
||||||
|
});
|
||||||
|
|
||||||
|
worker.on("jslint", function(results) {
|
||||||
|
var errors = [];
|
||||||
|
for (var i=0; i<results.data.length; i++) {
|
||||||
|
var error = results.data[i];
|
||||||
|
if (error)
|
||||||
|
errors.push({
|
||||||
|
row: error.line-1,
|
||||||
|
column: error.character-1,
|
||||||
|
text: error.reason,
|
||||||
|
type: "error",
|
||||||
|
lint: error
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
docs.js.setAnnotations(errors)
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
docs.css = new EditSession(document.getElementById("csstext").innerHTML);
|
docs.css = new EditSession(document.getElementById("csstext").innerHTML);
|
||||||
docs.css.setMode(new CssMode());
|
docs.css.setMode(new CssMode());
|
||||||
docs.css.setUndoManager(new UndoManager());
|
docs.css.setUndoManager(new UndoManager());
|
||||||
|
|
|
||||||
68
demo/styles.css
Normal file
68
demo/styles.css
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
html {
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
font-family: Arial, Helvetica, sans-serif, Tahoma, Verdana, sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
background: rgb(14, 98, 165);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
#editor {
|
||||||
|
top: 55px;
|
||||||
|
left: 0px;
|
||||||
|
background: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ace_gutter-cell.ace_error {
|
||||||
|
background-image: url("icons/error_obj.gif");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: 4px center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ace_gutter-cell.ace_warning {
|
||||||
|
background-image: url("icons/warning_obj.gif");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: 4px center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#controls {
|
||||||
|
width: 100%;
|
||||||
|
height: 55px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#jump {
|
||||||
|
position: absolute;
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
border: 1px solid red;
|
||||||
|
z-index: 10000;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cockpitInput {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
bottom: 0;
|
||||||
|
|
||||||
|
border: none; outline: none;
|
||||||
|
font-family: consolas, courier, monospace;
|
||||||
|
font-size: 120%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cockpitOutput {
|
||||||
|
padding: 10px;
|
||||||
|
margin: 0 15px;
|
||||||
|
border: 1px solid #AAA;
|
||||||
|
-moz-border-radius-topleft: 10px;
|
||||||
|
-moz-border-radius-topright: 10px;
|
||||||
|
border-top-left-radius: 4px; border-top-right-radius: 4px;
|
||||||
|
background: #DDD; color: #000;
|
||||||
|
}
|
||||||
|
|
@ -1,207 +0,0 @@
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
|
||||||
"http://www.w3.org/TR/html4/strict.dtd">
|
|
||||||
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>Editor</title>
|
|
||||||
<meta name="author" content="Fabian Jakobs">
|
|
||||||
|
|
||||||
<style type="text/css" media="screen">
|
|
||||||
|
|
||||||
html {
|
|
||||||
height: 100%;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
overflow: hidden;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
font-family: Arial, Helvetica, sans-serif, Tahoma, Verdana, sans-serif;
|
|
||||||
font-size: 12px;
|
|
||||||
background: rgb(14, 98, 165);
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
#editor {
|
|
||||||
top: 55px;
|
|
||||||
left: 0px;
|
|
||||||
background: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
#controls {
|
|
||||||
width: 100%;
|
|
||||||
height: 55px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#jump {
|
|
||||||
position: absolute;
|
|
||||||
width: 10px;
|
|
||||||
height: 10px;
|
|
||||||
border: 1px solid red;
|
|
||||||
z-index: 10000;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#cockpitInput {
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
bottom: 0;
|
|
||||||
|
|
||||||
border: none; outline: none;
|
|
||||||
font-family: consolas, courier, monospace;
|
|
||||||
font-size: 120%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#cockpitOutput {
|
|
||||||
padding: 10px;
|
|
||||||
margin: 0 15px;
|
|
||||||
border: 1px solid #AAA;
|
|
||||||
-moz-border-radius-topleft: 10px;
|
|
||||||
-moz-border-radius-topright: 10px;
|
|
||||||
border-top-left-radius: 4px; border-top-right-radius: 4px;
|
|
||||||
background: #DDD; color: #000;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="jump"></div>
|
|
||||||
|
|
||||||
<table id="controls">
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<label for="doc">Document:</label>
|
|
||||||
<select id="doc" size="1">
|
|
||||||
<option value="js">JS Document</option>
|
|
||||||
<option value="html">HTML Document</option>
|
|
||||||
<option value="css">CSS Document</option>
|
|
||||||
<option value="python">Python Document</option>
|
|
||||||
<option value="php">PHP Document</option>
|
|
||||||
</select>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<label for="mode">Mode:</label>
|
|
||||||
<select id="mode" size="1">
|
|
||||||
<option value="text">Plain Text</option>
|
|
||||||
<option value="javascript">JavaScript</option>
|
|
||||||
<option value="xml">XML</option>
|
|
||||||
<option value="html">HTML</option>
|
|
||||||
<option value="css">CSS</option>
|
|
||||||
<option value="python">Python</option>
|
|
||||||
<option value="php">PHP</option>
|
|
||||||
</select>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<label for="theme">Theme:</label>
|
|
||||||
<select id="theme" size="1">
|
|
||||||
<option value="ace/theme/textmate">TextMate</option>
|
|
||||||
<option value="ace/theme/eclipse">Eclipse</option>
|
|
||||||
<option value="ace/theme/dawn">Dawn</option>
|
|
||||||
<option value="ace/theme/idle_fingers">idleFingers</option>
|
|
||||||
<option value="ace/theme/pastel_on_dark">Pastel on dark</option>
|
|
||||||
<option value="ace/theme/twilight">Twilight</option>
|
|
||||||
</select>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<label for="select_style">Full line selections</label>
|
|
||||||
<input type="checkbox" name="select_style" id="select_style" checked>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<label for="highlight_active">Highlight active line</label>
|
|
||||||
<input type="checkbox" name="highlight_active" id="highlight_active" checked>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<label for="show_hidden">Show invisibles</label>
|
|
||||||
<input type="checkbox" name="show_hidden" id="show_hidden">
|
|
||||||
</td>
|
|
||||||
<td align="right">
|
|
||||||
<img src="demo/logo.png">
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<div id="editor">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script type="text/editor" id="jstext">function foo(items) {
|
|
||||||
for (var i=0; i<items.length; i++) {
|
|
||||||
alert(items[i] + "juhu");
|
|
||||||
}
|
|
||||||
}</script>
|
|
||||||
|
|
||||||
<script type="text/editor" id="csstext">.text-layer {
|
|
||||||
font-family: Monaco, "Courier New", monospace;
|
|
||||||
font-size: 12px;
|
|
||||||
cursor: text;
|
|
||||||
}</script>
|
|
||||||
|
|
||||||
<script type="text/editor" id="htmltext"><html>
|
|
||||||
<head>
|
|
||||||
|
|
||||||
<style type="text/css">
|
|
||||||
.text-layer {
|
|
||||||
font-family: Monaco, "Courier New", monospace;
|
|
||||||
font-size: 12px;
|
|
||||||
cursor: text;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1 style="color:red">Juhu Kinners</h1>
|
|
||||||
</body>
|
|
||||||
</html></script>
|
|
||||||
|
|
||||||
<script type="text/editor" id="pythontext">#!/usr/local/bin/python
|
|
||||||
|
|
||||||
import string, sys
|
|
||||||
|
|
||||||
# If no arguments were given, print a helpful message
|
|
||||||
if len(sys.argv)==1:
|
|
||||||
print 'Usage: celsius temp1 temp2 ...'
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
# Loop over the arguments
|
|
||||||
for i in sys.argv[1:]:
|
|
||||||
try:
|
|
||||||
fahrenheit=float(string.atoi(i))
|
|
||||||
except string.atoi_error:
|
|
||||||
print repr(i), "not a numeric value"
|
|
||||||
else:
|
|
||||||
celsius=(fahrenheit-32)*5.0/9.0
|
|
||||||
print '%i\260F = %i\260C' % (int(fahrenheit), int(celsius+.5))
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/editor" id="phptext"><?php
|
|
||||||
|
|
||||||
function nfact($n) {
|
|
||||||
if ($n == 0) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return $n * nfact($n - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "\n\nPlease enter a whole number ... ";
|
|
||||||
$num = trim(fgets(STDIN));
|
|
||||||
|
|
||||||
// ===== PROCESS - Determing the factorial of the input number =====
|
|
||||||
$output = "\n\nFactorial " . $num . " = " . nfact($num) . "\n\n";
|
|
||||||
echo $output;
|
|
||||||
|
|
||||||
?></script>
|
|
||||||
|
|
||||||
<input id="cockpitInput" type="text"/>
|
|
||||||
|
|
||||||
<script src="demo/require.js" type="text/javascript" charset="utf-8"></script>
|
|
||||||
<script src="demo/boot.js" type="text/javascript" charset="utf-8"></script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
require("demo/boot");
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
61
editor.html
61
editor.html
|
|
@ -6,66 +6,7 @@
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<title>Editor</title>
|
<title>Editor</title>
|
||||||
<meta name="author" content="Fabian Jakobs">
|
<meta name="author" content="Fabian Jakobs">
|
||||||
|
<link rel="stylesheet" href="demo/styles.css" type="text/css" media="screen" charset="utf-8">
|
||||||
<style type="text/css" media="screen">
|
|
||||||
|
|
||||||
html {
|
|
||||||
height: 100%;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
overflow: hidden;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
font-family: Arial, Helvetica, sans-serif, Tahoma, Verdana, sans-serif;
|
|
||||||
font-size: 12px;
|
|
||||||
background: rgb(14, 98, 165);
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
#editor {
|
|
||||||
top: 55px;
|
|
||||||
left: 0px;
|
|
||||||
background: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
#controls {
|
|
||||||
width: 100%;
|
|
||||||
height: 55px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#jump {
|
|
||||||
position: absolute;
|
|
||||||
width: 10px;
|
|
||||||
height: 10px;
|
|
||||||
border: 1px solid red;
|
|
||||||
z-index: 10000;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#cockpitInput {
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
bottom: 0;
|
|
||||||
|
|
||||||
border: none; outline: none;
|
|
||||||
font-family: consolas, courier, monospace;
|
|
||||||
font-size: 120%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#cockpitOutput {
|
|
||||||
padding: 10px;
|
|
||||||
margin: 0 15px;
|
|
||||||
border: 1px solid #AAA;
|
|
||||||
-moz-border-radius-topleft: 10px;
|
|
||||||
-moz-border-radius-topright: 10px;
|
|
||||||
border-top-left-radius: 4px; border-top-right-radius: 4px;
|
|
||||||
background: #DDD; color: #000;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="jump"></div>
|
<div id="jump"></div>
|
||||||
|
|
|
||||||
45
experiments/capture.html
Normal file
45
experiments/capture.html
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||||
|
"http://www.w3.org/TR/html4/strict.dtd">
|
||||||
|
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta name="author" content="Fabian Jakobs">
|
||||||
|
<!-- Date: 2010-04-07 -->
|
||||||
|
|
||||||
|
<style type="text/css" media="screen">
|
||||||
|
#juhu {
|
||||||
|
width: 100px;
|
||||||
|
height: 50px;
|
||||||
|
background: yellow;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="juhu">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../src/ace.js" type="text/javascript" charset="utf-8"></script>
|
||||||
|
<script type="text/javascript" charset="utf-8">
|
||||||
|
|
||||||
|
var el = document.getElementById("juhu");
|
||||||
|
|
||||||
|
ace.addListener(el, "mousedown", function(e) {
|
||||||
|
el.innerHTML = ace.getDocumentX(e) + " " + ace.getDocumentY(e);
|
||||||
|
ace.capture(
|
||||||
|
el,
|
||||||
|
function(e) {
|
||||||
|
el.innerHTML = ace.getDocumentX(e) + " " + ace.getDocumentY(e);
|
||||||
|
}, function() {
|
||||||
|
el.innerHTML = "";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
105
experiments/cut_copy.html
Normal file
105
experiments/cut_copy.html
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||||
|
"http://www.w3.org/TR/html4/strict.dtd">
|
||||||
|
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>Text Events</title>
|
||||||
|
<meta name="author" content="Fabian Jakobs">
|
||||||
|
|
||||||
|
<style type="text/css" media="screen">
|
||||||
|
|
||||||
|
#container {
|
||||||
|
border: 1px solid black;
|
||||||
|
width: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#canvas {
|
||||||
|
border: 1px solid black;
|
||||||
|
margin: 4px;
|
||||||
|
width: 590px;
|
||||||
|
height: 400px;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="container">
|
||||||
|
<textarea id="text"></textarea>
|
||||||
|
<div id="canvas"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<input type="button" value="Clear" id="some_name" onclick="document.getElementById('logger').innerHTML = ''">
|
||||||
|
<div id="logger">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript" charset="utf-8">
|
||||||
|
|
||||||
|
if (!window.console) window.console = {};
|
||||||
|
if (!console.log) {
|
||||||
|
var logger = document.getElementById("logger");
|
||||||
|
console.log = function() {
|
||||||
|
logger.innerHTML += Array.prototype.join.call(arguments, ", ") + "<br>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function addListener(elem, type, callback) {
|
||||||
|
if (elem.addEventListener) {
|
||||||
|
return elem.addEventListener(type, callback, false);
|
||||||
|
}
|
||||||
|
if (elem.attachEvent) {
|
||||||
|
elem.attachEvent("on" + type, function() {
|
||||||
|
callback(window.event);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var container = document.getElementById("container");
|
||||||
|
var canvas = document.getElementById("canvas");
|
||||||
|
var text = document.getElementById("text");
|
||||||
|
|
||||||
|
function log(e) {
|
||||||
|
console.log(e.type, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
function logKey(e) {
|
||||||
|
console.log(e.type, e.charCode, e.keyCode, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
addListener(text, "keydown", logKey, false);
|
||||||
|
addListener(text, "keyup", logKey, false);
|
||||||
|
addListener(text, "keypress", logKey, false);
|
||||||
|
|
||||||
|
addListener(text, "textInput", function(e) {
|
||||||
|
console.log(e.type, e.data, e);
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
function fillSelection() {
|
||||||
|
text.value = "Juhu Kinners";
|
||||||
|
text.select();
|
||||||
|
}
|
||||||
|
|
||||||
|
addListener(text, "copy", fillSelection, false);
|
||||||
|
addListener(text, "paste", log, false);
|
||||||
|
addListener(text, "cut", fillSelection, false);
|
||||||
|
|
||||||
|
addListener(text, "beforecopy", log, false);
|
||||||
|
addListener(text, "beforepaste", log, false);
|
||||||
|
addListener(text, "beforecut", log, false);
|
||||||
|
|
||||||
|
addListener(text, "compositionstart", log, false);
|
||||||
|
addListener(text, "compositionupdate", log, false);
|
||||||
|
addListener(text, "compositionend", log, false);
|
||||||
|
|
||||||
|
addListener(text, "propertychange", function(e) {
|
||||||
|
console.log(e.type, e.propertyName, e);
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
34
experiments/triple_click.html
Normal file
34
experiments/triple_click.html
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||||
|
"http://www.w3.org/TR/html4/strict.dtd">
|
||||||
|
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>triple_click</title>
|
||||||
|
<meta name="author" content="Fabian Jakobs">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="juhu">
|
||||||
|
Juhu Kinners
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../src/ace/lib/core.js" type="text/javascript" charset="utf-8"></script>
|
||||||
|
<script src="../src/ace/lib/event.js" type="text/javascript" charset="utf-8"></script>
|
||||||
|
<script type="text/javascript" charset="utf-8">
|
||||||
|
|
||||||
|
var el = document.getElementById("juhu");
|
||||||
|
ace.addTripleClickListener(el, function() {
|
||||||
|
console.log("triple");
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.addListener(el, "selectstart", function(e) {
|
||||||
|
return ace.preventDefault(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
33
experiments/worker.html
Normal file
33
experiments/worker.html
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||||
|
"http://www.w3.org/TR/html4/strict.dtd">
|
||||||
|
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>worker</title>
|
||||||
|
<meta name="generator" content="TextMate http://macromates.com/">
|
||||||
|
<meta name="author" content="Fabian Jakobs">
|
||||||
|
<!-- Date: 2010-04-08 -->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<script type="text/javascript" charset="utf-8">
|
||||||
|
|
||||||
|
var worker = new Worker("worker.js");
|
||||||
|
|
||||||
|
worker.onmessage = function(e) {
|
||||||
|
console.log(e.data);
|
||||||
|
};
|
||||||
|
|
||||||
|
worker.onerror = function(e) {
|
||||||
|
console.log(e.data);
|
||||||
|
};
|
||||||
|
|
||||||
|
worker.postMessage("postMessage('juhu')");
|
||||||
|
worker.postMessage("postMessage('juhu')");
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
3
experiments/worker.js
Normal file
3
experiments/worker.js
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
onmessage = function(e) {
|
||||||
|
onmessage = new Function("e", e.data);
|
||||||
|
};
|
||||||
|
|
@ -12,6 +12,20 @@
|
||||||
overflow-y: hidden;
|
overflow-y: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ace_content {
|
||||||
|
position: absolute;
|
||||||
|
box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ace_composition {
|
||||||
|
position: absolute;
|
||||||
|
background: #555;
|
||||||
|
color: #DDD;
|
||||||
|
z-index: 4;
|
||||||
|
}
|
||||||
|
|
||||||
.ace_gutter {
|
.ace_gutter {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
|
|
@ -61,8 +75,14 @@
|
||||||
color: black;
|
color: black;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ace_cjk {
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
.ace_cursor-layer {
|
.ace_cursor-layer {
|
||||||
cursor: text;
|
cursor: text;
|
||||||
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ace_cursor {
|
.ace_cursor {
|
||||||
|
|
|
||||||
|
|
@ -52,16 +52,14 @@ var EditSession = function(text, mode) {
|
||||||
this.selection = new Selection(this);
|
this.selection = new Selection(this);
|
||||||
this.$breakpoints = [];
|
this.$breakpoints = [];
|
||||||
|
|
||||||
this.listeners = [];
|
|
||||||
if (mode) {
|
|
||||||
this.setMode(mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (text instanceof Document) {
|
if (text instanceof Document) {
|
||||||
this.setDocument(text)
|
this.setDocument(text)
|
||||||
} else {
|
} else {
|
||||||
this.setDocument(new Document(text));
|
this.setDocument(new Document(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mode)
|
||||||
|
this.setMode(mode);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -198,6 +196,41 @@ var EditSession = function(text, mode) {
|
||||||
this._dispatchEvent("changeBreakpoint", {});
|
this._dispatchEvent("changeBreakpoint", {});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.getBreakpoints = function() {
|
||||||
|
return this.$breakpoints;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error:
|
||||||
|
* {
|
||||||
|
* row: 12,
|
||||||
|
* column: 2, //can be undefined
|
||||||
|
* text: "Missing argument",
|
||||||
|
* type: "error" // or "warning" or "info"
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
this.setAnnotations = function(annotations) {
|
||||||
|
this.$annotations = [];
|
||||||
|
for (var i=0; i<annotations.length; i++) {
|
||||||
|
var annotation = annotations[i];
|
||||||
|
var row = annotation.row;
|
||||||
|
if (this.$annotations[row])
|
||||||
|
this.$annotations[row].push(annotation);
|
||||||
|
else
|
||||||
|
this.$annotations[row] = [annotation];
|
||||||
|
}
|
||||||
|
this._dispatchEvent("changeAnnotation", {});
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getAnnotations = function() {
|
||||||
|
return this.$annotations;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.clearAnnotations = function() {
|
||||||
|
this.$annotations = [];
|
||||||
|
this._dispatchEvent("changeAnnotation", {});
|
||||||
|
};
|
||||||
|
|
||||||
this.$detectNewLine = function(text) {
|
this.$detectNewLine = function(text) {
|
||||||
var match = text.match(/^.*?(\r?\n)/m);
|
var match = text.match(/^.*?(\r?\n)/m);
|
||||||
if (match) {
|
if (match) {
|
||||||
|
|
@ -208,8 +241,7 @@ var EditSession = function(text, mode) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.tokenRe = /^[\w\d]+/g;
|
this.tokenRe = /^[\w\d]+/g;
|
||||||
this.nonTokenRe = /^[^\w\d]+/g;
|
this.nonTokenRe = /^(?:[^\w\d|[\u3040-\u309F]|[\u30A0-\u30FF]|[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF])+/g
|
||||||
|
|
||||||
this.getWordRange = function(row, column) {
|
this.getWordRange = function(row, column) {
|
||||||
var line = this.getLine(row);
|
var line = this.getLine(row);
|
||||||
|
|
||||||
|
|
@ -253,6 +285,12 @@ var EditSession = function(text, mode) {
|
||||||
this.setMode = function(mode) {
|
this.setMode = function(mode) {
|
||||||
if (this.$mode === mode) return;
|
if (this.$mode === mode) return;
|
||||||
|
|
||||||
|
if (this.$worker)
|
||||||
|
this.$worker.terminate();
|
||||||
|
|
||||||
|
if (window.Worker)
|
||||||
|
this.$worker = mode.createWorker(this);
|
||||||
|
|
||||||
this.$mode = mode;
|
this.$mode = mode;
|
||||||
this._dispatchEvent("changeMode");
|
this._dispatchEvent("changeMode");
|
||||||
};
|
};
|
||||||
|
|
@ -492,9 +530,9 @@ var EditSession = function(text, mode) {
|
||||||
var lastDelta = deltas[deltas.length-1];
|
var lastDelta = deltas[deltas.length-1];
|
||||||
|
|
||||||
this.selection.clearSelection();
|
this.selection.clearSelection();
|
||||||
if (firstDelta.action == "insertText" || firstDelta.action == "insertLines")
|
if (firstDelta.action == "insertText" || firstDelta.action == "insertLines")
|
||||||
this.selection.moveCursorToPosition(firstDelta.range.start);
|
this.selection.moveCursorToPosition(firstDelta.range.start);
|
||||||
if (firstDelta.action == "removeText" || firstDelta.action == "removeLines")
|
if (firstDelta.action == "removeText" || firstDelta.action == "removeLines")
|
||||||
this.selection.setSelectionRange(Range.fromPoints(firstDelta.range.start, lastDelta.range.end));
|
this.selection.setSelectionRange(Range.fromPoints(firstDelta.range.start, lastDelta.range.end));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -511,9 +549,9 @@ var EditSession = function(text, mode) {
|
||||||
var lastDelta = deltas[deltas.length-1];
|
var lastDelta = deltas[deltas.length-1];
|
||||||
|
|
||||||
this.selection.clearSelection();
|
this.selection.clearSelection();
|
||||||
if (firstDelta.action == "insertText" || firstDelta.action == "insertLines")
|
if (firstDelta.action == "insertText" || firstDelta.action == "insertLines")
|
||||||
this.selection.setSelectionRange(Range.fromPoints(firstDelta.range.start, lastDelta.range.end));
|
this.selection.setSelectionRange(Range.fromPoints(firstDelta.range.start, lastDelta.range.end));
|
||||||
if (firstDelta.action == "removeText" || firstDelta.action == "removeLines")
|
if (firstDelta.action == "removeText" || firstDelta.action == "removeLines")
|
||||||
this.selection.moveCursorToPosition(firstDelta.range.start);
|
this.selection.moveCursorToPosition(firstDelta.range.start);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -594,19 +632,32 @@ var EditSession = function(text, mode) {
|
||||||
|
|
||||||
var screenColumn = 0;
|
var screenColumn = 0;
|
||||||
var remaining = docColumn;
|
var remaining = docColumn;
|
||||||
|
var line = this.getLine(row);
|
||||||
var line = this.getLine(row).split("\t");
|
|
||||||
for (var i=0; i<line.length; i++) {
|
for (var i=0; i<line.length; i++) {
|
||||||
var len = line[i].length;
|
var c = line.charCodeAt(i);
|
||||||
if (remaining > len) {
|
if (remaining > 0) {
|
||||||
remaining -= (len + 1);
|
remaining -= 1;
|
||||||
screenColumn += len + tabSize;
|
// tab
|
||||||
}
|
if (c == 9) {
|
||||||
else {
|
screenColumn += tabSize;
|
||||||
screenColumn += remaining;
|
}
|
||||||
break;
|
// CJK characters
|
||||||
}
|
else if (
|
||||||
}
|
c >= 0x3040 && c <= 0x309F || // Hiragana
|
||||||
|
c >= 0x30A0 && c <= 0x30FF || // Katakana
|
||||||
|
c >= 0x4E00 && c <= 0x9FFF || // Single CJK ideographs
|
||||||
|
c >= 0xF900 && c <= 0xFAFF ||
|
||||||
|
c >= 0x3400 && c <= 0x4DBF
|
||||||
|
) {
|
||||||
|
screenColumn += 2;
|
||||||
|
} else {
|
||||||
|
screenColumn += 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return screenColumn;
|
return screenColumn;
|
||||||
};
|
};
|
||||||
|
|
@ -616,23 +667,44 @@ var EditSession = function(text, mode) {
|
||||||
|
|
||||||
var docColumn = 0;
|
var docColumn = 0;
|
||||||
var remaining = screenColumn;
|
var remaining = screenColumn;
|
||||||
|
var line = this.getLine(row);
|
||||||
var line = this.getLine(row).split("\t");
|
|
||||||
for (var i=0; i<line.length; i++) {
|
for(var i=0; i<line.length; i++) {
|
||||||
var len = line[i].length;
|
var c = line.charCodeAt(i);
|
||||||
if (remaining >= len + tabSize) {
|
|
||||||
remaining -= (len + tabSize);
|
if (remaining > 0) {
|
||||||
docColumn += (len + 1);
|
docColumn += 1;
|
||||||
}
|
// tab
|
||||||
else if (remaining > len){
|
if (c == 9) {
|
||||||
docColumn += len;
|
if (remaining >= tabSize) {
|
||||||
break;
|
remaining -= tabSize;
|
||||||
}
|
} else {
|
||||||
else {
|
remaining = 0;
|
||||||
docColumn += remaining;
|
docColumn -= 1;
|
||||||
break;
|
}
|
||||||
}
|
}
|
||||||
}
|
// CJK characters
|
||||||
|
else if (
|
||||||
|
c >= 0x3040 && c <= 0x309F || // Hiragana
|
||||||
|
c >= 0x30A0 && c <= 0x30FF || // Katakana
|
||||||
|
c >= 0x4E00 && c <= 0x9FFF || // Single CJK ideographs
|
||||||
|
c >= 0xF900 && c <= 0xFAFF ||
|
||||||
|
c >= 0x3400 && c <= 0x4DBF
|
||||||
|
) {
|
||||||
|
if (remaining >= 2) {
|
||||||
|
remaining -= 2;
|
||||||
|
} else {
|
||||||
|
remaining = 0;
|
||||||
|
docColumn -= 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
remaining -= 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return docColumn;
|
return docColumn;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ var Editor =function(renderer, session) {
|
||||||
this.keyBinding = new KeyBinding(this);
|
this.keyBinding = new KeyBinding(this);
|
||||||
var self = this;
|
var self = this;
|
||||||
event.addListener(container, "mousedown", function(e) {
|
event.addListener(container, "mousedown", function(e) {
|
||||||
setTimeout(function() {self.focus();});
|
self.focus();
|
||||||
return event.preventDefault(e);
|
return event.preventDefault(e);
|
||||||
});
|
});
|
||||||
event.addListener(container, "selectstart", function(e) {
|
event.addListener(container, "selectstart", function(e) {
|
||||||
|
|
@ -122,10 +122,12 @@ var Editor =function(renderer, session) {
|
||||||
if (this.session == session) return;
|
if (this.session == session) return;
|
||||||
|
|
||||||
if (this.session) {
|
if (this.session) {
|
||||||
|
var oldSession = this.session;
|
||||||
this.session.removeEventListener("change", this.$onDocumentChange);
|
this.session.removeEventListener("change", this.$onDocumentChange);
|
||||||
this.session.removeEventListener("changeMode", this.$onDocumentModeChange);
|
this.session.removeEventListener("changeMode", this.$onDocumentModeChange);
|
||||||
this.session.removeEventListener("changeTabSize", this.$onDocumentChangeTabSize);
|
this.session.removeEventListener("changeTabSize", this.$onDocumentChangeTabSize);
|
||||||
this.session.removeEventListener("changeBreakpoint", this.$onDocumentChangeBreakpoint);
|
this.session.removeEventListener("changeBreakpoint", this.$onDocumentChangeBreakpoint);
|
||||||
|
this.session.removeEventListener("changeAnnotation", this.$onDocumentChangeAnnotation);
|
||||||
|
|
||||||
var selection = this.session.getSelection();
|
var selection = this.session.getSelection();
|
||||||
selection.removeEventListener("changeCursor", this.$onCursorChange);
|
selection.removeEventListener("changeCursor", this.$onCursorChange);
|
||||||
|
|
@ -148,6 +150,9 @@ var Editor =function(renderer, session) {
|
||||||
|
|
||||||
this.$onDocumentChangeBreakpoint = this.onDocumentChangeBreakpoint.bind(this);
|
this.$onDocumentChangeBreakpoint = this.onDocumentChangeBreakpoint.bind(this);
|
||||||
this.session.addEventListener("changeBreakpoint", this.$onDocumentChangeBreakpoint);
|
this.session.addEventListener("changeBreakpoint", this.$onDocumentChangeBreakpoint);
|
||||||
|
|
||||||
|
this.$onDocumentChangeAnnotation = this.onDocumentChangeAnnotation.bind(this);
|
||||||
|
this.session.addEventListener("changeAnnotation", this.$onDocumentChangeAnnotation);
|
||||||
|
|
||||||
this.selection = session.getSelection();
|
this.selection = session.getSelection();
|
||||||
this.$desiredColumn = 0;
|
this.$desiredColumn = 0;
|
||||||
|
|
@ -165,8 +170,14 @@ var Editor =function(renderer, session) {
|
||||||
this.onCursorChange();
|
this.onCursorChange();
|
||||||
this.onSelectionChange();
|
this.onSelectionChange();
|
||||||
this.onDocumentChangeBreakpoint();
|
this.onDocumentChangeBreakpoint();
|
||||||
|
this.onDocumentChangeAnnotation();
|
||||||
this.renderer.scrollToRow(session.getScrollTopRow());
|
this.renderer.scrollToRow(session.getScrollTopRow());
|
||||||
this.renderer.updateFull();
|
this.renderer.updateFull();
|
||||||
|
|
||||||
|
this._dispatchEvent("changeSession", {
|
||||||
|
session: session,
|
||||||
|
oldSession: oldSession
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getSession = function() {
|
this.getSession = function() {
|
||||||
|
|
@ -289,6 +300,10 @@ var Editor =function(renderer, session) {
|
||||||
this.renderer.setBreakpoints(this.session.getBreakpoints());
|
this.renderer.setBreakpoints(this.session.getBreakpoints());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.onDocumentChangeAnnotation = function() {
|
||||||
|
this.renderer.setAnnotations(this.session.getAnnotations());
|
||||||
|
};
|
||||||
|
|
||||||
this.onDocumentModeChange = function() {
|
this.onDocumentModeChange = function() {
|
||||||
var mode = this.session.getMode();
|
var mode = this.session.getMode();
|
||||||
if (this.mode == mode)
|
if (this.mode == mode)
|
||||||
|
|
|
||||||
|
|
@ -43,11 +43,34 @@ var TextInput = function(parentNode, host) {
|
||||||
|
|
||||||
var text = document.createElement("textarea");
|
var text = document.createElement("textarea");
|
||||||
var style = text.style;
|
var style = text.style;
|
||||||
style.position = "absolute";
|
style.position = "fixed";
|
||||||
style.left = "-10000px";
|
style.left = "-10000px";
|
||||||
style.top = "-10000px";
|
style.top = "-10000px";
|
||||||
parentNode.appendChild(text);
|
parentNode.appendChild(text);
|
||||||
|
|
||||||
|
// move text input over the cursor
|
||||||
|
// this is required for iOS and IME
|
||||||
|
style.left = "0px";
|
||||||
|
style.top = "0px";
|
||||||
|
style.zIndex = -1;
|
||||||
|
style.opacity = 0;
|
||||||
|
style.width = "10px";
|
||||||
|
style.height = "30px";
|
||||||
|
|
||||||
|
var changeCursor = function() {
|
||||||
|
var cursor = host.getCursorPosition();
|
||||||
|
var pos = host.renderer.textToScreenCoordinates(cursor.row, cursor.column);
|
||||||
|
var epos = parentNode.getBoundingClientRect();
|
||||||
|
style.left = (pos.pageX - epos.left - 6) + "px";
|
||||||
|
style.top = (pos.pageY - epos.top + 52) + "px";
|
||||||
|
};
|
||||||
|
|
||||||
|
host.addEventListener("changeSession", function(e) {
|
||||||
|
if (e.oldSession)
|
||||||
|
e.oldSession.getSelection().removeEventListener("changeCursor", changeCursor);
|
||||||
|
e.session.getSelection().addEventListener("changeCursor", changeCursor);
|
||||||
|
});
|
||||||
|
|
||||||
var PLACEHOLDER = String.fromCharCode(0);
|
var PLACEHOLDER = String.fromCharCode(0);
|
||||||
sendText();
|
sendText();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ var Gutter = function(parentEl) {
|
||||||
parentEl.appendChild(this.element);
|
parentEl.appendChild(this.element);
|
||||||
|
|
||||||
this.$breakpoints = [];
|
this.$breakpoints = [];
|
||||||
|
this.$annotations = [];
|
||||||
this.$decorations = [];
|
this.$decorations = [];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -57,22 +58,49 @@ var Gutter = function(parentEl) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.removeGutterDecoration = function(row, className){
|
this.removeGutterDecoration = function(row, className){
|
||||||
this.$decorations[row] =
|
this.$decorations[row] = this.$decorations[row].replace(" ace_" + className, "");
|
||||||
this.$decorations[row].replace(" ace_" + className, "");
|
};
|
||||||
}
|
|
||||||
|
|
||||||
this.setBreakpoints = function(rows) {
|
this.setBreakpoints = function(rows) {
|
||||||
this.$breakpoints = rows.concat();
|
this.$breakpoints = rows.concat();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.setAnnotations = function(annotations) {
|
||||||
|
// iterate over sparse array
|
||||||
|
this.$annotations = [];
|
||||||
|
for (var row in annotations) {
|
||||||
|
var rowInfo = this.$annotations[row] = {
|
||||||
|
text: []
|
||||||
|
};
|
||||||
|
var rowAnnotations = annotations[row];
|
||||||
|
for (var i=0; i<rowAnnotations.length; i++) {
|
||||||
|
var annotation = rowAnnotations[i];
|
||||||
|
rowInfo.text.push(annotation.text.replace(/"/g, """).replace(/'/g, "’").replace(/</, "<"));
|
||||||
|
var type = annotation.type;
|
||||||
|
if (type == "error")
|
||||||
|
rowInfo.className = "ace_error";
|
||||||
|
else if (type == "warning" && rowInfo.className != "ace_error")
|
||||||
|
rowInfo.className = "ace_warning";
|
||||||
|
else if (type == "info" && (!rowInfo.className))
|
||||||
|
rowInfo.className = "ace_info";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
this.update = function(config) {
|
this.update = function(config) {
|
||||||
this.$config = config;
|
this.$config = config;
|
||||||
|
|
||||||
var html = [];
|
var html = [];
|
||||||
for ( var i = config.firstRow; i <= config.lastRow; i++) {
|
for ( var i = config.firstRow; i <= config.lastRow; i++) {
|
||||||
|
var annotation = this.$annotations[i] || {
|
||||||
|
className: "",
|
||||||
|
text: []
|
||||||
|
};
|
||||||
html.push("<div class='ace_gutter-cell",
|
html.push("<div class='ace_gutter-cell",
|
||||||
this.$decorations[i] || "",
|
this.$decorations[i] || "",
|
||||||
this.$breakpoints[i] ? " ace_breakpoint" : "",
|
this.$breakpoints[i] ? " ace_breakpoint " : " ",
|
||||||
|
annotation.className,
|
||||||
|
"' title='", annotation.text.join("\n"),
|
||||||
"' style='height:", config.lineHeight, "px;'>", (i+1), "</div>");
|
"' style='height:", config.lineHeight, "px;'>", (i+1), "</div>");
|
||||||
html.push("</div>");
|
html.push("</div>");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -248,19 +248,26 @@ var Text = function(parentEl) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.$renderLine = function(stringBuilder, row, tokens) {
|
this.$renderLine = function(stringBuilder, row, tokens) {
|
||||||
// if (this.showInvisibles) {
|
if (this.showInvisibles) {
|
||||||
// var self = this;
|
var self = this;
|
||||||
// var spaceRe = /[\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]+/g;
|
var spaceRe = /( +)|([\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000])/g;
|
||||||
// var spaceReplace = function(space) {
|
var spaceReplace = function(space) {
|
||||||
// var space = new Array(space.length+1).join(self.SPACE_CHAR);
|
if (space.charCodeAt(0) == 32)
|
||||||
// return "<span class='ace_invisible'>" + space + "</span>";
|
return new Array(space.length+1).join(" ");
|
||||||
// };
|
else {
|
||||||
// }
|
var space = new Array(space.length+1).join(self.SPACE_CHAR);
|
||||||
// else {
|
return "<span class='ace_invisible'>" + space + "</span>";
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
var spaceRe = /[\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]/g;
|
var spaceRe = /[\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]/g;
|
||||||
var spaceReplace = " ";
|
var spaceReplace = " ";
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
var characterWidth = this.config.characterWidth;
|
||||||
|
|
||||||
for ( var i = 0; i < tokens.length; i++) {
|
for ( var i = 0; i < tokens.length; i++) {
|
||||||
var token = tokens[i];
|
var token = tokens[i];
|
||||||
|
|
||||||
|
|
@ -268,8 +275,11 @@ var Text = function(parentEl) {
|
||||||
.replace(/&/g, "&")
|
.replace(/&/g, "&")
|
||||||
.replace(/</g, "<")
|
.replace(/</g, "<")
|
||||||
.replace(spaceRe, spaceReplace)
|
.replace(spaceRe, spaceReplace)
|
||||||
.replace(/\t/g, this.$tabString);
|
.replace(/\t/g, this.$tabString)
|
||||||
|
.replace(/[\u3040-\u309F]|[\u30A0-\u30FF]|[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF]/g, function(c) {
|
||||||
|
return "<span class='ace_cjk' style='width:" + (characterWidth * 2) + "px'>" + c + "</span>"
|
||||||
|
});
|
||||||
|
|
||||||
if (!this.$textToken[token.type]) {
|
if (!this.$textToken[token.type]) {
|
||||||
var classes = "ace_" + token.type.replace(/\./g, " ace_");
|
var classes = "ace_" + token.type.replace(/\./g, " ace_");
|
||||||
stringBuilder.push("<span class='", classes, "'>", output, "</span>");
|
stringBuilder.push("<span class='", classes, "'>", output, "</span>");
|
||||||
|
|
|
||||||
|
|
@ -44,14 +44,14 @@ var TextHighlightRules = require("ace/mode/text_highlight_rules").TextHighlightR
|
||||||
var CssHighlightRules = function() {
|
var CssHighlightRules = function() {
|
||||||
|
|
||||||
var properties = lang.arrayToMap(
|
var properties = lang.arrayToMap(
|
||||||
("azimuth|background-attachment|background-color|background-image|" +
|
("-moz-box-sizing|-webkit-box-sizing|azimuth|background-attachment|background-color|background-image|" +
|
||||||
"background-position|background-repeat|background|border-bottom-color|" +
|
"background-position|background-repeat|background|border-bottom-color|" +
|
||||||
"border-bottom-style|border-bottom-width|border-bottom|border-collapse|" +
|
"border-bottom-style|border-bottom-width|border-bottom|border-collapse|" +
|
||||||
"border-color|border-left-color|border-left-style|border-left-width|" +
|
"border-color|border-left-color|border-left-style|border-left-width|" +
|
||||||
"border-left|border-right-color|border-right-style|border-right-width|" +
|
"border-left|border-right-color|border-right-style|border-right-width|" +
|
||||||
"border-right|border-spacing|border-style|border-top-color|" +
|
"border-right|border-spacing|border-style|border-top-color|" +
|
||||||
"border-top-style|border-top-width|border-top|border-width|border|" +
|
"border-top-style|border-top-width|border-top|border-width|border|" +
|
||||||
"bottom|caption-side|clear|clip|color|content|counter-increment|" +
|
"bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|" +
|
||||||
"counter-reset|cue-after|cue-before|cue|cursor|direction|display|" +
|
"counter-reset|cue-after|cue-before|cue|cursor|direction|display|" +
|
||||||
"elevation|empty-cells|float|font-family|font-size-adjust|font-size|" +
|
"elevation|empty-cells|float|font-family|font-size-adjust|font-size|" +
|
||||||
"font-stretch|font-style|font-variant|font-weight|font|height|left|" +
|
"font-stretch|font-style|font-variant|font-weight|font|height|left|" +
|
||||||
|
|
@ -76,8 +76,8 @@ var CssHighlightRules = function() {
|
||||||
|
|
||||||
var constants = lang.arrayToMap(
|
var constants = lang.arrayToMap(
|
||||||
("absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|" +
|
("absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|" +
|
||||||
"block|bold|bolder|both|bottom|break-all|break-word|capitalize|center|" +
|
"block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|" +
|
||||||
"char|circle|cjk-ideographic|col-resize|collapse|crosshair|dashed|" +
|
"char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|" +
|
||||||
"decimal-leading-zero|decimal|default|disabled|disc|" +
|
"decimal-leading-zero|decimal|default|disabled|disc|" +
|
||||||
"distribute-all-lines|distribute-letter|distribute-space|" +
|
"distribute-all-lines|distribute-letter|distribute-space|" +
|
||||||
"distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|" +
|
"distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|" +
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ var Tokenizer = require("ace/tokenizer").Tokenizer;
|
||||||
var JavaScriptHighlightRules = require("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules;
|
var JavaScriptHighlightRules = require("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules;
|
||||||
var MatchingBraceOutdent = require("ace/mode/matching_brace_outdent").MatchingBraceOutdent;
|
var MatchingBraceOutdent = require("ace/mode/matching_brace_outdent").MatchingBraceOutdent;
|
||||||
var Range = require("ace/range").Range;
|
var Range = require("ace/range").Range;
|
||||||
|
var WorkerClient = require("ace/worker/worker_client").WorkerClient;
|
||||||
|
|
||||||
var Mode = function() {
|
var Mode = function() {
|
||||||
this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());
|
this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());
|
||||||
|
|
@ -120,6 +121,47 @@ oop.inherits(Mode, TextMode);
|
||||||
this.autoOutdent = function(state, doc, row) {
|
this.autoOutdent = function(state, doc, row) {
|
||||||
return this.$outdent.autoOutdent(doc, row);
|
return this.$outdent.autoOutdent(doc, row);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.createWorker = function(session) {
|
||||||
|
var doc = session.getDocument();
|
||||||
|
var worker = new WorkerClient("../..", ["ace", "pilot"], "ace/mode/javascript_worker", "JavaScriptWorker");
|
||||||
|
worker.call("setValue", [doc.getValue()]);
|
||||||
|
|
||||||
|
doc.on("change", function(e) {
|
||||||
|
e.range = {
|
||||||
|
start: e.data.range.start,
|
||||||
|
end: e.data.range.end
|
||||||
|
};
|
||||||
|
worker.emit("change", e);
|
||||||
|
});
|
||||||
|
|
||||||
|
worker.on("jslint", function(results) {
|
||||||
|
var errors = [];
|
||||||
|
for (var i=0; i<results.data.length; i++) {
|
||||||
|
var error = results.data[i];
|
||||||
|
if (error)
|
||||||
|
errors.push({
|
||||||
|
row: error.line-1,
|
||||||
|
column: error.character-1,
|
||||||
|
text: error.reason,
|
||||||
|
type: "warning",
|
||||||
|
lint: error
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
session.setAnnotations(errors)
|
||||||
|
});
|
||||||
|
|
||||||
|
worker.on("narcissus", function(e) {
|
||||||
|
session.setAnnotations([e.data]);
|
||||||
|
});
|
||||||
|
|
||||||
|
worker.on("terminate", function() {
|
||||||
|
session.clearAnnotations();
|
||||||
|
});
|
||||||
|
|
||||||
|
return worker;
|
||||||
|
};
|
||||||
|
|
||||||
}).call(Mode.prototype);
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
|
|
||||||
47
lib/ace/mode/javascript_worker.js
Normal file
47
lib/ace/mode/javascript_worker.js
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
|
||||||
|
define(function(require, exports, module) {
|
||||||
|
|
||||||
|
var oop = require("pilot/oop");
|
||||||
|
var Mirror = require("ace/worker/mirror").Mirror;
|
||||||
|
var lint = require("ace/worker/jslint").JSLINT;
|
||||||
|
|
||||||
|
var JavaScriptWorker = exports.JavaScriptWorker = function(sender) {
|
||||||
|
Mirror.call(this, sender);
|
||||||
|
this.setTimeout(500);
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(JavaScriptWorker, Mirror);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.onUpdate = function() {
|
||||||
|
var value = this.doc.getValue();
|
||||||
|
|
||||||
|
var start = new Date();
|
||||||
|
var parser = require("ace/narcissus/jsparse");
|
||||||
|
try {
|
||||||
|
parser.parse(value);
|
||||||
|
} catch(e) {
|
||||||
|
console.log("narcissus")
|
||||||
|
console.log(e);
|
||||||
|
sender.emit("narcissus", {
|
||||||
|
row: e.lineno-1,
|
||||||
|
column: null, // TODO convert e.cursor
|
||||||
|
text: e.message,
|
||||||
|
type: "error"
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
} finally {
|
||||||
|
console.log("parse time: " + (new Date() - start));
|
||||||
|
}
|
||||||
|
|
||||||
|
var start = new Date();
|
||||||
|
console.log("jslint")
|
||||||
|
lint(value, {undef: false, onevar: false, passfail: false});
|
||||||
|
this.sender.emit("jslint", lint.errors);
|
||||||
|
console.log("lint time: " + (new Date() - start));
|
||||||
|
}
|
||||||
|
|
||||||
|
}).call(JavaScriptWorker.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
@ -73,6 +73,10 @@ var Mode = function() {
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.createWorker = function(session) {
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
}).call(Mode.prototype);
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
|
|
||||||
375
lib/ace/narcissus/jsdefs.js
Normal file
375
lib/ace/narcissus/jsdefs.js
Normal file
|
|
@ -0,0 +1,375 @@
|
||||||
|
/* vim: set sw=4 ts=4 et tw=78: */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Narcissus JavaScript engine.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Brendan Eich <brendan@mozilla.org>.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Tom Austin <taustin@ucsc.edu>
|
||||||
|
* Brendan Eich <brendan@mozilla.org>
|
||||||
|
* Shu-Yu Guo <shu@rfrn.org>
|
||||||
|
* Dave Herman <dherman@mozilla.com>
|
||||||
|
* Dimitris Vardoulakis <dimvar@ccs.neu.edu>
|
||||||
|
* Patrick Walton <pcwalton@mozilla.com>
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Narcissus - JS implemented in JS.
|
||||||
|
*
|
||||||
|
* Well-known constants and lookup tables. Many consts are generated from the
|
||||||
|
* tokens table via eval to minimize redundancy, so consumers must be compiled
|
||||||
|
* separately to take advantage of the simple switch-case constant propagation
|
||||||
|
* done by SpiderMonkey.
|
||||||
|
*/
|
||||||
|
|
||||||
|
define(function(require, exports, module) {
|
||||||
|
|
||||||
|
exports.options = {
|
||||||
|
version: 185,
|
||||||
|
};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
exports.hostGlobal = this
|
||||||
|
})();
|
||||||
|
|
||||||
|
var tokens = [
|
||||||
|
// End of source.
|
||||||
|
"END",
|
||||||
|
|
||||||
|
// Operators and punctuators. Some pair-wise order matters, e.g. (+, -)
|
||||||
|
// and (UNARY_PLUS, UNARY_MINUS).
|
||||||
|
"\n", ";",
|
||||||
|
",",
|
||||||
|
"=",
|
||||||
|
"?", ":", "CONDITIONAL",
|
||||||
|
"||",
|
||||||
|
"&&",
|
||||||
|
"|",
|
||||||
|
"^",
|
||||||
|
"&",
|
||||||
|
"==", "!=", "===", "!==",
|
||||||
|
"<", "<=", ">=", ">",
|
||||||
|
"<<", ">>", ">>>",
|
||||||
|
"+", "-",
|
||||||
|
"*", "/", "%",
|
||||||
|
"!", "~", "UNARY_PLUS", "UNARY_MINUS",
|
||||||
|
"++", "--",
|
||||||
|
".",
|
||||||
|
"[", "]",
|
||||||
|
"{", "}",
|
||||||
|
"(", ")",
|
||||||
|
|
||||||
|
// Nonterminal tree node type codes.
|
||||||
|
"SCRIPT", "BLOCK", "LABEL", "FOR_IN", "CALL", "NEW_WITH_ARGS", "INDEX",
|
||||||
|
"ARRAY_INIT", "OBJECT_INIT", "PROPERTY_INIT", "GETTER", "SETTER",
|
||||||
|
"GROUP", "LIST", "LET_BLOCK", "ARRAY_COMP", "GENERATOR", "COMP_TAIL",
|
||||||
|
|
||||||
|
// Terminals.
|
||||||
|
"IDENTIFIER", "NUMBER", "STRING", "REGEXP",
|
||||||
|
|
||||||
|
// Keywords.
|
||||||
|
"break",
|
||||||
|
"case", "catch", "const", "continue",
|
||||||
|
"debugger", "default", "delete", "do",
|
||||||
|
"else",
|
||||||
|
"false", "finally", "for", "function",
|
||||||
|
"if", "in", "instanceof",
|
||||||
|
"let",
|
||||||
|
"new", "null",
|
||||||
|
"return",
|
||||||
|
"switch",
|
||||||
|
"this", "throw", "true", "try", "typeof",
|
||||||
|
"var", "void",
|
||||||
|
"yield",
|
||||||
|
"while", "with",
|
||||||
|
];
|
||||||
|
|
||||||
|
var statementStartTokens = [
|
||||||
|
"break",
|
||||||
|
"const", "continue",
|
||||||
|
"debugger", "do",
|
||||||
|
"for",
|
||||||
|
"if",
|
||||||
|
"return",
|
||||||
|
"switch",
|
||||||
|
"throw", "try",
|
||||||
|
"var",
|
||||||
|
"yield",
|
||||||
|
"while", "with",
|
||||||
|
];
|
||||||
|
|
||||||
|
// Operator and punctuator mapping from token to tree node type name.
|
||||||
|
// NB: because the lexer doesn't backtrack, all token prefixes must themselves
|
||||||
|
// be valid tokens (e.g. !== is acceptable because its prefixes are the valid
|
||||||
|
// tokens != and !).
|
||||||
|
var opTypeNames = {
|
||||||
|
'\n': "NEWLINE",
|
||||||
|
';': "SEMICOLON",
|
||||||
|
',': "COMMA",
|
||||||
|
'?': "HOOK",
|
||||||
|
':': "COLON",
|
||||||
|
'||': "OR",
|
||||||
|
'&&': "AND",
|
||||||
|
'|': "BITWISE_OR",
|
||||||
|
'^': "BITWISE_XOR",
|
||||||
|
'&': "BITWISE_AND",
|
||||||
|
'===': "STRICT_EQ",
|
||||||
|
'==': "EQ",
|
||||||
|
'=': "ASSIGN",
|
||||||
|
'!==': "STRICT_NE",
|
||||||
|
'!=': "NE",
|
||||||
|
'<<': "LSH",
|
||||||
|
'<=': "LE",
|
||||||
|
'<': "LT",
|
||||||
|
'>>>': "URSH",
|
||||||
|
'>>': "RSH",
|
||||||
|
'>=': "GE",
|
||||||
|
'>': "GT",
|
||||||
|
'++': "INCREMENT",
|
||||||
|
'--': "DECREMENT",
|
||||||
|
'+': "PLUS",
|
||||||
|
'-': "MINUS",
|
||||||
|
'*': "MUL",
|
||||||
|
'/': "DIV",
|
||||||
|
'%': "MOD",
|
||||||
|
'!': "NOT",
|
||||||
|
'~': "BITWISE_NOT",
|
||||||
|
'.': "DOT",
|
||||||
|
'[': "LEFT_BRACKET",
|
||||||
|
']': "RIGHT_BRACKET",
|
||||||
|
'{': "LEFT_CURLY",
|
||||||
|
'}': "RIGHT_CURLY",
|
||||||
|
'(': "LEFT_PAREN",
|
||||||
|
')': "RIGHT_PAREN"
|
||||||
|
};
|
||||||
|
|
||||||
|
// Hash of keyword identifier to tokens index. NB: we must null __proto__ to
|
||||||
|
// avoid toString, etc. namespace pollution.
|
||||||
|
var keywords = {__proto__: null};
|
||||||
|
|
||||||
|
// Define const END, etc., based on the token names. Also map name to index.
|
||||||
|
var tokenIds = {};
|
||||||
|
|
||||||
|
// Building up a string to be eval'd in different contexts.
|
||||||
|
var consts = "const ";
|
||||||
|
for (var i = 0, j = tokens.length; i < j; i++) {
|
||||||
|
if (i > 0)
|
||||||
|
consts += ", ";
|
||||||
|
var t = tokens[i];
|
||||||
|
var name;
|
||||||
|
if (/^[a-z]/.test(t)) {
|
||||||
|
name = t.toUpperCase();
|
||||||
|
keywords[t] = i;
|
||||||
|
} else {
|
||||||
|
name = (/^\W/.test(t) ? opTypeNames[t] : t);
|
||||||
|
}
|
||||||
|
consts += name + " = " + i;
|
||||||
|
tokenIds[name] = i;
|
||||||
|
tokens[t] = i;
|
||||||
|
}
|
||||||
|
consts += ";";
|
||||||
|
|
||||||
|
var isStatementStartCode = {__proto__: null};
|
||||||
|
for (i = 0, j = statementStartTokens.length; i < j; i++)
|
||||||
|
isStatementStartCode[keywords[statementStartTokens[i]]] = true;
|
||||||
|
|
||||||
|
// Map assignment operators to their indexes in the tokens array.
|
||||||
|
var assignOps = ['|', '^', '&', '<<', '>>', '>>>', '+', '-', '*', '/', '%'];
|
||||||
|
|
||||||
|
for (i = 0, j = assignOps.length; i < j; i++) {
|
||||||
|
t = assignOps[i];
|
||||||
|
assignOps[t] = tokens[t];
|
||||||
|
}
|
||||||
|
|
||||||
|
function defineGetter(obj, prop, fn, dontDelete, dontEnum) {
|
||||||
|
Object.defineProperty(obj, prop,
|
||||||
|
{ get: fn, configurable: !dontDelete, enumerable: !dontEnum });
|
||||||
|
}
|
||||||
|
|
||||||
|
function defineProperty(obj, prop, val, dontDelete, readOnly, dontEnum) {
|
||||||
|
Object.defineProperty(obj, prop,
|
||||||
|
{ value: val, writable: !readOnly, configurable: !dontDelete,
|
||||||
|
enumerable: !dontEnum });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns true if fn is a native function. (Note: SpiderMonkey specific.)
|
||||||
|
function isNativeCode(fn) {
|
||||||
|
// Relies on the toString method to identify native code.
|
||||||
|
return ((typeof fn) === "function") && fn.toString().match(/\[native code\]/);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPropertyDescriptor(obj, name) {
|
||||||
|
while (obj) {
|
||||||
|
if (({}).hasOwnProperty.call(obj, name))
|
||||||
|
return Object.getOwnPropertyDescriptor(obj, name);
|
||||||
|
obj = Object.getPrototypeOf(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOwnProperties(obj) {
|
||||||
|
var map = {};
|
||||||
|
for (var name in Object.getOwnPropertyNames(obj))
|
||||||
|
map[name] = Object.getOwnPropertyDescriptor(obj, name);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
function makePassthruHandler(obj) {
|
||||||
|
// Handler copied from
|
||||||
|
// http://wiki.ecmascript.org/doku.php?id=harmony:proxies&s=proxy%20object#examplea_no-op_forwarding_proxy
|
||||||
|
return {
|
||||||
|
getOwnPropertyDescriptor: function(name) {
|
||||||
|
var desc = Object.getOwnPropertyDescriptor(obj, name);
|
||||||
|
|
||||||
|
// a trapping proxy's properties must always be configurable
|
||||||
|
desc.configurable = true;
|
||||||
|
return desc;
|
||||||
|
},
|
||||||
|
getPropertyDescriptor: function(name) {
|
||||||
|
var desc = getPropertyDescriptor(obj, name);
|
||||||
|
|
||||||
|
// a trapping proxy's properties must always be configurable
|
||||||
|
desc.configurable = true;
|
||||||
|
return desc;
|
||||||
|
},
|
||||||
|
getOwnPropertyNames: function() {
|
||||||
|
return Object.getOwnPropertyNames(obj);
|
||||||
|
},
|
||||||
|
defineProperty: function(name, desc) {
|
||||||
|
Object.defineProperty(obj, name, desc);
|
||||||
|
},
|
||||||
|
"delete": function(name) { return delete obj[name]; },
|
||||||
|
fix: function() {
|
||||||
|
if (Object.isFrozen(obj)) {
|
||||||
|
return getOwnProperties(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
// As long as obj is not frozen, the proxy won't allow itself to be fixed.
|
||||||
|
return undefined; // will cause a TypeError to be thrown
|
||||||
|
},
|
||||||
|
|
||||||
|
has: function(name) { return name in obj; },
|
||||||
|
hasOwn: function(name) { return ({}).hasOwnProperty.call(obj, name); },
|
||||||
|
get: function(receiver, name) { return obj[name]; },
|
||||||
|
|
||||||
|
// bad behavior when set fails in non-strict mode
|
||||||
|
set: function(receiver, name, val) { obj[name] = val; return true; },
|
||||||
|
enumerate: function() {
|
||||||
|
var result = [];
|
||||||
|
for (name in obj) { result.push(name); };
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
keys: function() { return Object.keys(obj); }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// default function used when looking for a property in the global object
|
||||||
|
function noPropFound() { return undefined; }
|
||||||
|
|
||||||
|
var hasOwnProperty = ({}).hasOwnProperty;
|
||||||
|
|
||||||
|
function StringMap() {
|
||||||
|
this.table = Object.create(null, {});
|
||||||
|
this.size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringMap.prototype = {
|
||||||
|
has: function(x) { return hasOwnProperty.call(this.table, x); },
|
||||||
|
set: function(x, v) {
|
||||||
|
if (!hasOwnProperty.call(this.table, x))
|
||||||
|
this.size++;
|
||||||
|
this.table[x] = v;
|
||||||
|
},
|
||||||
|
get: function(x) { return this.table[x]; },
|
||||||
|
getDef: function(x, thunk) {
|
||||||
|
if (!hasOwnProperty.call(this.table, x)) {
|
||||||
|
this.size++;
|
||||||
|
this.table[x] = thunk();
|
||||||
|
}
|
||||||
|
return this.table[x];
|
||||||
|
},
|
||||||
|
forEach: function(f) {
|
||||||
|
var table = this.table;
|
||||||
|
for (var key in table)
|
||||||
|
f.call(this, key, table[key]);
|
||||||
|
},
|
||||||
|
toString: function() { return "[object StringMap]" }
|
||||||
|
};
|
||||||
|
|
||||||
|
// non-destructive stack
|
||||||
|
function Stack(elts) {
|
||||||
|
this.elts = elts || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Stack.prototype = {
|
||||||
|
push: function(x) {
|
||||||
|
return new Stack({ top: x, rest: this.elts });
|
||||||
|
},
|
||||||
|
top: function() {
|
||||||
|
if (!this.elts)
|
||||||
|
throw new Error("empty stack");
|
||||||
|
return this.elts.top;
|
||||||
|
},
|
||||||
|
isEmpty: function() {
|
||||||
|
return this.top === null;
|
||||||
|
},
|
||||||
|
find: function(test) {
|
||||||
|
for (var elts = this.elts; elts; elts = elts.rest) {
|
||||||
|
if (test(elts.top))
|
||||||
|
return elts.top;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
has: function(x) {
|
||||||
|
return Boolean(this.find(function(elt) { return elt === x }));
|
||||||
|
},
|
||||||
|
forEach: function(f) {
|
||||||
|
for (var elts = this.elts; elts; elts = elts.rest) {
|
||||||
|
f(elts.top);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.tokens = tokens;
|
||||||
|
exports.opTypeNames = opTypeNames;
|
||||||
|
exports.keywords = keywords;
|
||||||
|
exports.isStatementStartCode = isStatementStartCode;
|
||||||
|
exports.tokenIds = tokenIds;
|
||||||
|
exports.consts = consts;
|
||||||
|
exports.assignOps = assignOps;
|
||||||
|
exports.defineGetter = defineGetter;
|
||||||
|
exports.defineProperty = defineProperty;
|
||||||
|
exports.isNativeCode = isNativeCode;
|
||||||
|
exports.makePassthruHandler = makePassthruHandler;
|
||||||
|
exports.noPropFound = noPropFound;
|
||||||
|
exports.StringMap = StringMap;
|
||||||
|
exports.Stack = Stack;
|
||||||
|
|
||||||
|
});
|
||||||
460
lib/ace/narcissus/jslex.js
Normal file
460
lib/ace/narcissus/jslex.js
Normal file
|
|
@ -0,0 +1,460 @@
|
||||||
|
/* vim: set sw=4 ts=4 et tw=78: */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Narcissus JavaScript engine.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Brendan Eich <brendan@mozilla.org>.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Tom Austin <taustin@ucsc.edu>
|
||||||
|
* Brendan Eich <brendan@mozilla.org>
|
||||||
|
* Shu-Yu Guo <shu@rfrn.org>
|
||||||
|
* Dave Herman <dherman@mozilla.com>
|
||||||
|
* Dimitris Vardoulakis <dimvar@ccs.neu.edu>
|
||||||
|
* Patrick Walton <pcwalton@mozilla.com>
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Narcissus - JS implemented in JS.
|
||||||
|
*
|
||||||
|
* Lexical scanner.
|
||||||
|
*/
|
||||||
|
|
||||||
|
define(function(require, exports, module) {
|
||||||
|
|
||||||
|
var definitions = require("ace/narcissus/jsdefs");
|
||||||
|
|
||||||
|
// Set constants in the local scope.
|
||||||
|
eval(definitions.consts);
|
||||||
|
|
||||||
|
// Build up a trie of operator tokens.
|
||||||
|
var opTokens = {};
|
||||||
|
for (var op in definitions.opTypeNames) {
|
||||||
|
if (op === '\n' || op === '.')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var node = opTokens;
|
||||||
|
for (var i = 0; i < op.length; i++) {
|
||||||
|
var ch = op[i];
|
||||||
|
if (!(ch in node))
|
||||||
|
node[ch] = {};
|
||||||
|
node = node[ch];
|
||||||
|
node.op = op;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tokenizer :: (source, filename, line number) -> Tokenizer
|
||||||
|
*/
|
||||||
|
function Tokenizer(s, f, l) {
|
||||||
|
this.cursor = 0;
|
||||||
|
this.source = String(s);
|
||||||
|
this.tokens = [];
|
||||||
|
this.tokenIndex = 0;
|
||||||
|
this.lookahead = 0;
|
||||||
|
this.scanNewlines = false;
|
||||||
|
this.unexpectedEOF = false;
|
||||||
|
this.filename = f || "";
|
||||||
|
this.lineno = l || 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Tokenizer.prototype = {
|
||||||
|
get done() {
|
||||||
|
// We need to set scanOperand to true here because the first thing
|
||||||
|
// might be a regexp.
|
||||||
|
return this.peek(true) === END;
|
||||||
|
},
|
||||||
|
|
||||||
|
get token() {
|
||||||
|
return this.tokens[this.tokenIndex];
|
||||||
|
},
|
||||||
|
|
||||||
|
match: function (tt, scanOperand) {
|
||||||
|
return this.get(scanOperand) === tt || this.unget();
|
||||||
|
},
|
||||||
|
|
||||||
|
mustMatch: function (tt) {
|
||||||
|
if (!this.match(tt)) {
|
||||||
|
throw this.newSyntaxError("Missing " +
|
||||||
|
definitions.tokens[tt].toLowerCase());
|
||||||
|
}
|
||||||
|
return this.token;
|
||||||
|
},
|
||||||
|
|
||||||
|
peek: function (scanOperand) {
|
||||||
|
var tt, next;
|
||||||
|
if (this.lookahead) {
|
||||||
|
next = this.tokens[(this.tokenIndex + this.lookahead) & 3];
|
||||||
|
tt = (this.scanNewlines && next.lineno !== this.lineno)
|
||||||
|
? NEWLINE
|
||||||
|
: next.type;
|
||||||
|
} else {
|
||||||
|
tt = this.get(scanOperand);
|
||||||
|
this.unget();
|
||||||
|
}
|
||||||
|
return tt;
|
||||||
|
},
|
||||||
|
|
||||||
|
peekOnSameLine: function (scanOperand) {
|
||||||
|
this.scanNewlines = true;
|
||||||
|
var tt = this.peek(scanOperand);
|
||||||
|
this.scanNewlines = false;
|
||||||
|
return tt;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Eat comments and whitespace.
|
||||||
|
skip: function () {
|
||||||
|
var input = this.source;
|
||||||
|
for (;;) {
|
||||||
|
var ch = input[this.cursor++];
|
||||||
|
var next = input[this.cursor];
|
||||||
|
if (ch === '\n' && !this.scanNewlines) {
|
||||||
|
this.lineno++;
|
||||||
|
} else if (ch === '/' && next === '*') {
|
||||||
|
this.cursor++;
|
||||||
|
for (;;) {
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
if (ch === undefined)
|
||||||
|
throw this.newSyntaxError("Unterminated comment");
|
||||||
|
|
||||||
|
if (ch === '*') {
|
||||||
|
next = input[this.cursor];
|
||||||
|
if (next === '/') {
|
||||||
|
this.cursor++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (ch === '\n') {
|
||||||
|
this.lineno++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (ch === '/' && next === '/') {
|
||||||
|
this.cursor++;
|
||||||
|
for (;;) {
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
if (ch === undefined)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ch === '\n') {
|
||||||
|
this.lineno++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (ch !== ' ' && ch !== '\t') {
|
||||||
|
this.cursor--;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Lex the exponential part of a number, if present. Return true iff an
|
||||||
|
// exponential part was found.
|
||||||
|
lexExponent: function() {
|
||||||
|
var input = this.source;
|
||||||
|
var next = input[this.cursor];
|
||||||
|
if (next === 'e' || next === 'E') {
|
||||||
|
this.cursor++;
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
if (ch === '+' || ch === '-')
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
|
||||||
|
if (ch < '0' || ch > '9')
|
||||||
|
throw this.newSyntaxError("Missing exponent");
|
||||||
|
|
||||||
|
do {
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
} while (ch >= '0' && ch <= '9');
|
||||||
|
this.cursor--;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
lexZeroNumber: function (ch) {
|
||||||
|
var token = this.token, input = this.source;
|
||||||
|
token.type = NUMBER;
|
||||||
|
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
if (ch === '.') {
|
||||||
|
do {
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
} while (ch >= '0' && ch <= '9');
|
||||||
|
this.cursor--;
|
||||||
|
|
||||||
|
this.lexExponent();
|
||||||
|
token.value = parseFloat(token.start, this.cursor);
|
||||||
|
} else if (ch === 'x' || ch === 'X') {
|
||||||
|
do {
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
} while ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') ||
|
||||||
|
(ch >= 'A' && ch <= 'F'));
|
||||||
|
this.cursor--;
|
||||||
|
|
||||||
|
token.value = parseInt(input.substring(token.start, this.cursor));
|
||||||
|
} else if (ch >= '0' && ch <= '7') {
|
||||||
|
do {
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
} while (ch >= '0' && ch <= '7');
|
||||||
|
this.cursor--;
|
||||||
|
|
||||||
|
token.value = parseInt(input.substring(token.start, this.cursor));
|
||||||
|
} else {
|
||||||
|
this.cursor--;
|
||||||
|
this.lexExponent(); // 0E1, &c.
|
||||||
|
token.value = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
lexNumber: function (ch) {
|
||||||
|
var token = this.token, input = this.source;
|
||||||
|
token.type = NUMBER;
|
||||||
|
|
||||||
|
var floating = false;
|
||||||
|
do {
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
if (ch === '.' && !floating) {
|
||||||
|
floating = true;
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
}
|
||||||
|
} while (ch >= '0' && ch <= '9');
|
||||||
|
|
||||||
|
this.cursor--;
|
||||||
|
|
||||||
|
var exponent = this.lexExponent();
|
||||||
|
floating = floating || exponent;
|
||||||
|
|
||||||
|
var str = input.substring(token.start, this.cursor);
|
||||||
|
token.value = floating ? parseFloat(str) : parseInt(str);
|
||||||
|
},
|
||||||
|
|
||||||
|
lexDot: function (ch) {
|
||||||
|
var token = this.token, input = this.source;
|
||||||
|
var next = input[this.cursor];
|
||||||
|
if (next >= '0' && next <= '9') {
|
||||||
|
do {
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
} while (ch >= '0' && ch <= '9');
|
||||||
|
this.cursor--;
|
||||||
|
|
||||||
|
this.lexExponent();
|
||||||
|
|
||||||
|
token.type = NUMBER;
|
||||||
|
token.value = parseFloat(token.start, this.cursor);
|
||||||
|
} else {
|
||||||
|
token.type = DOT;
|
||||||
|
token.assignOp = null;
|
||||||
|
token.value = '.';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
lexString: function (ch) {
|
||||||
|
var token = this.token, input = this.source;
|
||||||
|
token.type = STRING;
|
||||||
|
|
||||||
|
var hasEscapes = false;
|
||||||
|
var delim = ch;
|
||||||
|
while ((ch = input[this.cursor++]) !== delim) {
|
||||||
|
if (this.cursor == input.length)
|
||||||
|
throw this.newSyntaxError("Unterminated string literal");
|
||||||
|
if (ch === '\\') {
|
||||||
|
hasEscapes = true;
|
||||||
|
if (++this.cursor == input.length)
|
||||||
|
throw this.newSyntaxError("Unterminated string literal");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
token.value = hasEscapes
|
||||||
|
? eval(input.substring(token.start, this.cursor))
|
||||||
|
: input.substring(token.start + 1, this.cursor - 1);
|
||||||
|
},
|
||||||
|
|
||||||
|
lexRegExp: function (ch) {
|
||||||
|
var token = this.token, input = this.source;
|
||||||
|
token.type = REGEXP;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
if (ch === '\\') {
|
||||||
|
this.cursor++;
|
||||||
|
} else if (ch === '[') {
|
||||||
|
do {
|
||||||
|
if (ch === undefined)
|
||||||
|
throw this.newSyntaxError("Unterminated character class");
|
||||||
|
|
||||||
|
if (ch === '\\')
|
||||||
|
this.cursor++;
|
||||||
|
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
} while (ch !== ']');
|
||||||
|
} else if (ch === undefined) {
|
||||||
|
throw this.newSyntaxError("Unterminated regex");
|
||||||
|
}
|
||||||
|
} while (ch !== '/');
|
||||||
|
|
||||||
|
do {
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
} while (ch >= 'a' && ch <= 'z');
|
||||||
|
|
||||||
|
this.cursor--;
|
||||||
|
|
||||||
|
token.value = eval(input.substring(token.start, this.cursor));
|
||||||
|
},
|
||||||
|
|
||||||
|
lexOp: function (ch) {
|
||||||
|
var token = this.token, input = this.source;
|
||||||
|
|
||||||
|
// A bit ugly, but it seems wasteful to write a trie lookup routine
|
||||||
|
// for only 3 characters...
|
||||||
|
var node = opTokens[ch];
|
||||||
|
var next = input[this.cursor];
|
||||||
|
if (next in node) {
|
||||||
|
node = node[next];
|
||||||
|
this.cursor++;
|
||||||
|
next = input[this.cursor];
|
||||||
|
if (next in node) {
|
||||||
|
node = node[next];
|
||||||
|
this.cursor++;
|
||||||
|
next = input[this.cursor];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var op = node.op;
|
||||||
|
if (definitions.assignOps[op] && input[this.cursor] === '=') {
|
||||||
|
this.cursor++;
|
||||||
|
token.type = ASSIGN;
|
||||||
|
token.assignOp = definitions.tokenIds[definitions.opTypeNames[op]];
|
||||||
|
op += '=';
|
||||||
|
} else {
|
||||||
|
token.type = definitions.tokenIds[definitions.opTypeNames[op]];
|
||||||
|
token.assignOp = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
token.value = op;
|
||||||
|
},
|
||||||
|
|
||||||
|
// FIXME: Unicode escape sequences
|
||||||
|
// FIXME: Unicode identifiers
|
||||||
|
lexIdent: function (ch) {
|
||||||
|
var token = this.token, input = this.source;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ch = input[this.cursor++];
|
||||||
|
} while ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
|
||||||
|
(ch >= '0' && ch <= '9') || ch === '$' || ch === '_');
|
||||||
|
|
||||||
|
this.cursor--; // Put the non-word character back.
|
||||||
|
|
||||||
|
var id = input.substring(token.start, this.cursor);
|
||||||
|
token.type = definitions.keywords[id] || IDENTIFIER;
|
||||||
|
token.value = id;
|
||||||
|
},
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tokenizer.get :: void -> token type
|
||||||
|
*
|
||||||
|
* Consume input *only* if there is no lookahead.
|
||||||
|
* Dispatch to the appropriate lexing function depending on the input.
|
||||||
|
*/
|
||||||
|
get: function (scanOperand) {
|
||||||
|
var token;
|
||||||
|
while (this.lookahead) {
|
||||||
|
--this.lookahead;
|
||||||
|
this.tokenIndex = (this.tokenIndex + 1) & 3;
|
||||||
|
token = this.tokens[this.tokenIndex];
|
||||||
|
if (token.type !== NEWLINE || this.scanNewlines)
|
||||||
|
return token.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.skip();
|
||||||
|
|
||||||
|
this.tokenIndex = (this.tokenIndex + 1) & 3;
|
||||||
|
token = this.tokens[this.tokenIndex];
|
||||||
|
if (!token)
|
||||||
|
this.tokens[this.tokenIndex] = token = {};
|
||||||
|
|
||||||
|
var input = this.source;
|
||||||
|
if (this.cursor === input.length)
|
||||||
|
return token.type = END;
|
||||||
|
|
||||||
|
token.start = this.cursor;
|
||||||
|
token.lineno = this.lineno;
|
||||||
|
|
||||||
|
var ch = input[this.cursor++];
|
||||||
|
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '$' || ch === '_') {
|
||||||
|
this.lexIdent(ch);
|
||||||
|
} else if (scanOperand && ch === '/') {
|
||||||
|
this.lexRegExp(ch);
|
||||||
|
} else if (ch in opTokens) {
|
||||||
|
this.lexOp(ch);
|
||||||
|
} else if (ch === '.') {
|
||||||
|
this.lexDot(ch);
|
||||||
|
} else if (ch >= '1' && ch <= '9') {
|
||||||
|
this.lexNumber(ch);
|
||||||
|
} else if (ch === '0') {
|
||||||
|
this.lexZeroNumber(ch);
|
||||||
|
} else if (ch === '"' || ch === "'") {
|
||||||
|
this.lexString(ch);
|
||||||
|
} else if (this.scanNewlines && ch === '\n') {
|
||||||
|
token.type = NEWLINE;
|
||||||
|
token.value = '\n';
|
||||||
|
this.lineno++;
|
||||||
|
} else {
|
||||||
|
throw this.newSyntaxError("Illegal token");
|
||||||
|
}
|
||||||
|
|
||||||
|
token.end = this.cursor;
|
||||||
|
return token.type;
|
||||||
|
},
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tokenizer.unget :: void -> undefined
|
||||||
|
*
|
||||||
|
* Match depends on unget returning undefined.
|
||||||
|
*/
|
||||||
|
unget: function () {
|
||||||
|
if (++this.lookahead === 4) throw "PANIC: too much lookahead!";
|
||||||
|
this.tokenIndex = (this.tokenIndex - 1) & 3;
|
||||||
|
},
|
||||||
|
|
||||||
|
newSyntaxError: function (m) {
|
||||||
|
var e = new SyntaxError(m, this.filename, this.lineno);
|
||||||
|
e.source = this.source;
|
||||||
|
e.lineno = this.lineno;
|
||||||
|
e.cursor = this.lookahead
|
||||||
|
? this.tokens[(this.tokenIndex + this.lookahead) & 3].start
|
||||||
|
: this.cursor;
|
||||||
|
return e;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.Tokenizer = Tokenizer;
|
||||||
|
|
||||||
|
});
|
||||||
1432
lib/ace/narcissus/jsparse.js
Normal file
1432
lib/ace/narcissus/jsparse.js
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -129,5 +129,8 @@ MockRenderer.prototype.showCursor = function() {
|
||||||
MockRenderer.prototype.visualizeFocus = function() {
|
MockRenderer.prototype.visualizeFocus = function() {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
MockRenderer.prototype.setAnnotations = function() {
|
||||||
|
};
|
||||||
|
|
||||||
return MockRenderer;
|
return MockRenderer;
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -68,8 +68,7 @@ var VirtualRenderer = function(container, theme) {
|
||||||
this.container.appendChild(this.scroller);
|
this.container.appendChild(this.scroller);
|
||||||
|
|
||||||
this.content = document.createElement("div");
|
this.content = document.createElement("div");
|
||||||
this.content.style.cssText = "position:absolute;box-sizing:border-box;" +
|
this.content.className = "ace_content";
|
||||||
"-moz-box-sizing:border-box;-webkit-box-sizing:border-box";
|
|
||||||
this.scroller.appendChild(this.content);
|
this.scroller.appendChild(this.content);
|
||||||
|
|
||||||
this.$gutterLayer = new GutterLayer(this.$gutter);
|
this.$gutterLayer = new GutterLayer(this.$gutter);
|
||||||
|
|
@ -479,6 +478,11 @@ var VirtualRenderer = function(container, theme) {
|
||||||
this.$loop.schedule(this.CHANGE_GUTTER);
|
this.$loop.schedule(this.CHANGE_GUTTER);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.setAnnotations = function(annotations) {
|
||||||
|
this.$gutterLayer.setAnnotations(annotations);
|
||||||
|
this.$loop.schedule(this.CHANGE_GUTTER);
|
||||||
|
};
|
||||||
|
|
||||||
this.updateCursor = function(position, overwrite) {
|
this.updateCursor = function(position, overwrite) {
|
||||||
this.$cursorLayer.setCursor(position, overwrite);
|
this.$cursorLayer.setCursor(position, overwrite);
|
||||||
this.$loop.schedule(this.CHANGE_CURSOR);
|
this.$loop.schedule(this.CHANGE_CURSOR);
|
||||||
|
|
@ -591,12 +595,38 @@ var VirtualRenderer = function(container, theme) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.showComposition = function(position) {
|
this.showComposition = function(position) {
|
||||||
|
console.log("show composition")
|
||||||
|
if (!this.$composition) {
|
||||||
|
this.$composition = document.createElement("div");
|
||||||
|
this.$composition.className = "ace_composition";
|
||||||
|
this.content.appendChild(this.$composition);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$composition.innerHTML = " ";
|
||||||
|
|
||||||
|
var pos = this.$cursorLayer.getPixelPosition();
|
||||||
|
var style = this.$composition.style;
|
||||||
|
style.top = pos.top + "px";
|
||||||
|
style.left = (pos.left + this.$padding) + "px";
|
||||||
|
style.height = this.lineHeight + "px";
|
||||||
|
//style.width = this.characterWidth + "px";
|
||||||
|
|
||||||
|
this.hideCursor();
|
||||||
};
|
};
|
||||||
|
|
||||||
this.setCompositionText = function(text) {
|
this.setCompositionText = function(text) {
|
||||||
|
this.$composition.innerText = this.$composition.textContent = text;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.hideComposition = function() {
|
this.hideComposition = function() {
|
||||||
|
this.showCursor();
|
||||||
|
|
||||||
|
if (!this.$composition)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var style = this.$composition.style;
|
||||||
|
style.top = "-10000px";
|
||||||
|
style.left = "-10000px";
|
||||||
};
|
};
|
||||||
|
|
||||||
this.setTheme = function(theme) {
|
this.setTheme = function(theme) {
|
||||||
|
|
|
||||||
90
lib/ace/worker/host.js
Normal file
90
lib/ace/worker/host.js
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
var console = {
|
||||||
|
log: function(msg) {
|
||||||
|
postMessage({type: "log", data: msg});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var window = {
|
||||||
|
console: console
|
||||||
|
};
|
||||||
|
|
||||||
|
var require = function(name) {
|
||||||
|
if (require.modules[name])
|
||||||
|
return require.modules[name].exports;
|
||||||
|
|
||||||
|
var chunks = name.split("/");
|
||||||
|
chunks[0] = require.tlns[chunks[0]] || chunks[0];
|
||||||
|
path = require.baseUrl + "/" + chunks.join("/") + ".js"
|
||||||
|
|
||||||
|
require.id = name;
|
||||||
|
importScripts(path);
|
||||||
|
return require.modules[name].exports;
|
||||||
|
};
|
||||||
|
require.modules = {};
|
||||||
|
require.tlns = {};
|
||||||
|
require.baseUrl;
|
||||||
|
|
||||||
|
var define = function(factory) {
|
||||||
|
var module = {
|
||||||
|
exports: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
var name = require.id;
|
||||||
|
var returnExports = factory(require, module.exports, module);
|
||||||
|
if (returnExports)
|
||||||
|
module.exports = exports;
|
||||||
|
|
||||||
|
require.modules[name] = module;
|
||||||
|
};
|
||||||
|
|
||||||
|
function initBaseUrls(baseUrl, topLevelNamespaces) {
|
||||||
|
require.baseUrl = baseUrl;
|
||||||
|
require.tlns = topLevelNamespaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
function initSender() {
|
||||||
|
|
||||||
|
var EventEmitter = require("pilot/event_emitter").EventEmitter;
|
||||||
|
var oop = require("pilot/oop");
|
||||||
|
|
||||||
|
var Sender = function() {};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
oop.implement(this, EventEmitter);
|
||||||
|
|
||||||
|
this.callback = function(data, callbackId) {
|
||||||
|
postMessage({
|
||||||
|
type: "call",
|
||||||
|
id: callbackId,
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
this.emit = function(name, data) {
|
||||||
|
postMessage({
|
||||||
|
type: "event",
|
||||||
|
name: name,
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).call(Sender.prototype);
|
||||||
|
|
||||||
|
return new Sender();
|
||||||
|
}
|
||||||
|
|
||||||
|
var main;
|
||||||
|
var sender;
|
||||||
|
|
||||||
|
onmessage = function(e) {
|
||||||
|
var msg = e.data;
|
||||||
|
if (msg.command)
|
||||||
|
main[msg.command].apply(main, msg.args);
|
||||||
|
else if (msg.init) {
|
||||||
|
initBaseUrls(msg.base, msg.tlns);
|
||||||
|
sender = initSender();
|
||||||
|
var clazz = require(msg.module)[msg.classname];
|
||||||
|
main = new clazz(sender);
|
||||||
|
} else if (msg.event) {
|
||||||
|
sender._dispatchEvent(msg.event, msg.data);
|
||||||
|
}
|
||||||
|
};
|
||||||
5747
lib/ace/worker/jslint.js
Normal file
5747
lib/ace/worker/jslint.js
Normal file
File diff suppressed because it is too large
Load diff
43
lib/ace/worker/mirror.js
Normal file
43
lib/ace/worker/mirror.js
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
|
||||||
|
define(function(require, exports, module) {
|
||||||
|
|
||||||
|
var Document = require("ace/document").Document;
|
||||||
|
var lang = require("pilot/lang");
|
||||||
|
|
||||||
|
var Mirror = exports.Mirror = function(sender) {
|
||||||
|
this.sender = sender;
|
||||||
|
var doc = this.doc = new Document("");
|
||||||
|
|
||||||
|
var deferredUpdate = this.deferredUpdate = lang.deferredCall(this.onUpdate.bind(this));
|
||||||
|
|
||||||
|
var _self = this;
|
||||||
|
sender.on("change", function(e) {
|
||||||
|
doc.applyDeltas([e.data]);
|
||||||
|
deferredUpdate.schedule(_self.$timeout);
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.$timeout = 500;
|
||||||
|
|
||||||
|
this.setTimeout = function(timeout) {
|
||||||
|
this.$timeout = timeout;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.setValue = function(value) {
|
||||||
|
this.doc.setValue(value);
|
||||||
|
this.deferredUpdate.schedule(this.$timeout);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getValue = function(callbackId) {
|
||||||
|
this.sender.callback(this.doc.getValue(), callbackId);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.onUpdate = function() {
|
||||||
|
// abstract method
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(Mirror.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
93
lib/ace/worker/worker_client.js
Normal file
93
lib/ace/worker/worker_client.js
Normal file
|
|
@ -0,0 +1,93 @@
|
||||||
|
/**
|
||||||
|
* Ajax.org Code Editor (ACE)
|
||||||
|
*
|
||||||
|
* @copyright 2010, Ajax.org Services B.V.
|
||||||
|
* @license LGPLv3 <http://www.gnu.org/licenses/lgpl-3.0.txt>
|
||||||
|
* @author Fabian Jakobs <fabian AT ajax DOT org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
define(function(require, exports, module) {
|
||||||
|
|
||||||
|
var oop = require("pilot/oop");
|
||||||
|
var EventEmitter = require("pilot/event_emitter").EventEmitter;
|
||||||
|
|
||||||
|
var WorkerClient = function(baseUrl, topLevelNamespaces, module, classname) {
|
||||||
|
|
||||||
|
this.callbacks = [];
|
||||||
|
var workerUrl = require.nameToUrl("ace/worker/host", null, "_");
|
||||||
|
var worker = this.$worker = new Worker(workerUrl);
|
||||||
|
|
||||||
|
var tlns = {};
|
||||||
|
for (var i=0; i<topLevelNamespaces.length; i++) {
|
||||||
|
var ns = topLevelNamespaces[i];
|
||||||
|
tlns[ns] = require.nameToUrl(ns, null, "_").replace(/.js$/, "").replace(require.config.baseUrl, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$worker.postMessage({
|
||||||
|
init : true,
|
||||||
|
tlns: tlns,
|
||||||
|
base: baseUrl,
|
||||||
|
module: module,
|
||||||
|
classname: classname
|
||||||
|
});
|
||||||
|
|
||||||
|
this.callbackId = 1;
|
||||||
|
this.callbacks = {};
|
||||||
|
|
||||||
|
var _self = this;
|
||||||
|
this.$worker.onerror = function(e) {
|
||||||
|
throw e;
|
||||||
|
};
|
||||||
|
this.$worker.onmessage = function(e) {
|
||||||
|
var msg = e.data;
|
||||||
|
switch(msg.type) {
|
||||||
|
case "log":
|
||||||
|
console.log(msg.data);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "event":
|
||||||
|
_self._dispatchEvent(msg.name, {data: msg.data});
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "call":
|
||||||
|
var callback = _self.callbacks[msg.id];
|
||||||
|
if (callback) {
|
||||||
|
callback(msg.data);
|
||||||
|
delete _self.callbacks[msg.id];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
oop.implement(this, EventEmitter);
|
||||||
|
|
||||||
|
this.terminate = function() {
|
||||||
|
this._dispatchEvent("terminate", {});
|
||||||
|
this.$worker.terminate();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.send = function(cmd, args) {
|
||||||
|
this.$worker.postMessage({command: cmd, args: args});
|
||||||
|
};
|
||||||
|
|
||||||
|
this.call = function(cmd, args, callback) {
|
||||||
|
if (callback) {
|
||||||
|
var id = this.callbackId++;
|
||||||
|
this.callbacks[id] = callback;
|
||||||
|
args.push(id);
|
||||||
|
}
|
||||||
|
this.send(cmd, args);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.emit = function(event, data) {
|
||||||
|
this.$worker.postMessage({event: event, data: data});
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(WorkerClient.prototype);
|
||||||
|
|
||||||
|
exports.WorkerClient = WorkerClient;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
@ -231,7 +231,7 @@ def test():
|
||||||
app = Cling(getcwd())
|
app = Cling(getcwd())
|
||||||
try:
|
try:
|
||||||
print "Serving " + getcwd() + " to http://localhost:9999"
|
print "Serving " + getcwd() + " to http://localhost:9999"
|
||||||
make_server('localhost', 9999, validator(app)).serve_forever()
|
make_server('0.0.0.0', 9999, validator(app)).serve_forever()
|
||||||
except KeyboardInterrupt, ki:
|
except KeyboardInterrupt, ki:
|
||||||
print ""
|
print ""
|
||||||
print "Ciao, baby!"
|
print "Ciao, baby!"
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 563a2b1091bd1b9a7d26a9f597aacb4341edb619
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 9ef10946d31d1b0e2bd63466fa5aba9c5269e5fd
|
Subproject commit af90344687c8486892b44d5decc4c2181df3a6cf
|
||||||
Loading…
Add table
Add a link
Reference in a new issue