From f27378e57a378ee745fbe9729c00351bc1c667f9 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Mon, 8 Apr 2013 20:18:15 -0400 Subject: [PATCH 01/62] Adding in some prototype bits for quoted forms. --- hy/compiler.py | 16 ++++++++++++++++ hy/models/__init__.py | 2 ++ hy/models/list.py | 1 + 3 files changed, 19 insertions(+) diff --git a/hy/compiler.py b/hy/compiler.py index 76b266a..249a0cc 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -160,6 +160,22 @@ class HyASTCompiler(object): def compile_raw_list(self, entries): return [self.compile(x) for x in entries] + def _render_quoted_form(self, form): + name = form.__class__.__name__ + if isinstance(form, HyList): + return HyExpression( + [HySymbol(name), + HyList([self._render_quoted_form(x) for x in form])] + ).replace(form) + elif isinstance(form, HySymbol): + return HyExpression([HySymbol(name), HyString(form)]).replace(form) + return HyExpression([HySymbol(name), form]).replace(form) + + @builds("quote") + @checkargs(min=1, max=2) + def compile_quote(self, entries): + return self.compile(self._render_quoted_form(entries[1])) + @builds("do") @builds("progn") def compile_do_expression(self, expr): diff --git a/hy/models/__init__.py b/hy/models/__init__.py index 408c917..775862a 100644 --- a/hy/models/__init__.py +++ b/hy/models/__init__.py @@ -34,3 +34,5 @@ class HyObject(object): setattr(self, attr, getattr(other, attr)) else: raise TypeError("Can't replace a non Hy object with a Hy object") + + return self diff --git a/hy/models/list.py b/hy/models/list.py index f92bff9..183ec42 100644 --- a/hy/models/list.py +++ b/hy/models/list.py @@ -31,6 +31,7 @@ class HyList(HyObject, list): x.replace(other) HyObject.replace(self, other) + return self def __repr__(self): return "[%s]" % (" ".join([str(x) for x in self])) From 93e4bc17ebba15a00cfc0dd2dabf2babb3e45577 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Mon, 8 Apr 2013 20:23:51 -0400 Subject: [PATCH 02/62] Adding some basic testing in; more to come. --- tests/compilers/native/__init__.hy | 0 tests/compilers/native/quoting.hy | 9 +++++++++ tests/compilers/test_quoting.py | 1 + 3 files changed, 10 insertions(+) create mode 100644 tests/compilers/native/__init__.hy create mode 100644 tests/compilers/native/quoting.hy create mode 100644 tests/compilers/test_quoting.py diff --git a/tests/compilers/native/__init__.hy b/tests/compilers/native/__init__.hy new file mode 100644 index 0000000..e69de29 diff --git a/tests/compilers/native/quoting.hy b/tests/compilers/native/quoting.hy new file mode 100644 index 0000000..3c20bd2 --- /dev/null +++ b/tests/compilers/native/quoting.hy @@ -0,0 +1,9 @@ +;;; +;;; + +(import-from hy.models.expression HyExpression) +(import-from hy.models.symbol HySymbol) + + +(defn test-basic-quoting [] + (assert (= (type (quote (foo bar))) HyExpression))) diff --git a/tests/compilers/test_quoting.py b/tests/compilers/test_quoting.py new file mode 100644 index 0000000..fb83d8d --- /dev/null +++ b/tests/compilers/test_quoting.py @@ -0,0 +1 @@ +from .native.quoting import * # NOQA From eeab56c2b75a5b19527c157877b648dee8719fbc Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Mon, 8 Apr 2013 20:24:47 -0400 Subject: [PATCH 03/62] Adding a symbol checker. --- tests/compilers/native/quoting.hy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/compilers/native/quoting.hy b/tests/compilers/native/quoting.hy index 3c20bd2..63c8f96 100644 --- a/tests/compilers/native/quoting.hy +++ b/tests/compilers/native/quoting.hy @@ -6,4 +6,5 @@ (defn test-basic-quoting [] - (assert (= (type (quote (foo bar))) HyExpression))) + (assert (= (type (quote (foo bar))) HyExpression)) + (assert (= (type (quote foo)) HySymbol))) From 997b32e18cb2f4d453c467da5698af647c4b187a Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Mon, 8 Apr 2013 22:31:26 -0400 Subject: [PATCH 04/62] Testing the behavior of (quote "foo") --- hy/__init__.py | 7 +++++++ tests/compilers/native/quoting.hy | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/hy/__init__.py b/hy/__init__.py index f25dd2f..56ffb1d 100644 --- a/hy/__init__.py +++ b/hy/__init__.py @@ -25,3 +25,10 @@ __version__ = "0.9.5" import hy.importer # NOQA # we import for side-effects. + +from hy.models.expression import HyExpression # NOQA +from hy.models.integer import HyInteger # NOQA +from hy.models.string import HyString # NOQA +from hy.models.symbol import HySymbol # NOQA +from hy.models.dict import HyDict # NOQA +from hy.models.list import HyList # NOQA diff --git a/tests/compilers/native/quoting.hy b/tests/compilers/native/quoting.hy index 63c8f96..6a1b522 100644 --- a/tests/compilers/native/quoting.hy +++ b/tests/compilers/native/quoting.hy @@ -1,10 +1,10 @@ ;;; ;;; -(import-from hy.models.expression HyExpression) -(import-from hy.models.symbol HySymbol) +(import-from hy HyExpression HySymbol HyString) (defn test-basic-quoting [] (assert (= (type (quote (foo bar))) HyExpression)) - (assert (= (type (quote foo)) HySymbol))) + (assert (= (type (quote foo)) HySymbol)) + (assert (= (type (quote "string")) HyString))) From 8212ed57941efe6f4c063fcd32789a38103ae2fb Mon Sep 17 00:00:00 2001 From: Konrad Hinsen Date: Tue, 9 Apr 2013 19:50:49 +0200 Subject: [PATCH 05/62] Do not quit hy if hy.core.process raises an exception --- bin/hy | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bin/hy b/bin/hy index 4167e68..2e27f56 100755 --- a/bin/hy +++ b/bin/hy @@ -48,7 +48,12 @@ class HyREPL(code.InteractiveConsole): _machine = Machine(Idle, 1, 0) return True - tokens = process(_machine.nodes) + try: + tokens = process(_machine.nodes) + except Exception: + _machine = Machine(Idle, 1, 0) + self.showtraceback() + return False _machine = Machine(Idle, 1, 0) try: From e55e63c759b38a63d4afcae1ab49ba2c1ea750a1 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Tue, 9 Apr 2013 19:55:19 -0400 Subject: [PATCH 06/62] Add @khinsen to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 4fae5f8..ffdeee9 100644 --- a/AUTHORS +++ b/AUTHORS @@ -7,3 +7,4 @@ * Julien Danjou * Nicolas Dandrimont * Gergely Nagy +* Konrad Hinsen From b71d5c597e3d0dc151eda30ed602b14fec86b4c2 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Tue, 9 Apr 2013 20:34:46 -0400 Subject: [PATCH 07/62] Fixing a bug @jd noticed. --- hy/compiler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hy/compiler.py b/hy/compiler.py index c4952cf..9a5be4f 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -189,7 +189,7 @@ class HyASTCompiler(object): return HyExpression([HySymbol(name), form]).replace(form) @builds("quote") - @checkargs(min=1, max=2) + @checkargs(exact=1) def compile_quote(self, entries): return self.compile(self._render_quoted_form(entries[1])) From c0b34181bc3b163ff1790877372cc1b4e7b5e110 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Tue, 9 Apr 2013 20:44:05 -0400 Subject: [PATCH 08/62] futzing with alignment --- hy/compiler.py | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/hy/compiler.py b/hy/compiler.py index 9a5be4f..1db4a80 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -83,8 +83,7 @@ def builds(_type): def _raise_wrong_args_number(expression, error): - err = TypeError(error % (expression.pop(0), - len(expression))) + err = TypeError(error % (expression.pop(0), len(expression))) err.start_line = expression.start_line err.start_column = expression.start_column raise err @@ -94,18 +93,15 @@ def checkargs(exact=None, min=None, max=None): def _dec(fn): def checker(self, expression): if exact is not None and (len(expression) - 1) != exact: - _raise_wrong_args_number(expression, - "`%%s' needs %d arguments, got %%d" % - exact) + _raise_wrong_args_number( + expression, "`%%s' needs %d arguments, got %%d" % exact) if min is not None and (len(expression) - 1) < min: - _raise_wrong_args_number( - expression, + _raise_wrong_args_number(expression, "`%%s' needs at least %d arguments, got %%d" % (min)) if max is not None and (len(expression) - 1) > max: - _raise_wrong_args_number( - expression, + _raise_wrong_args_number(expression, "`%%s' needs at most %d arguments, got %%d" % (max)) return fn(self, expression) @@ -140,8 +136,7 @@ class HyASTCompiler(object): def _mangle_branch(self, tree, start_line, start_column): # If tree is empty, just return a pass statement if tree == []: - return [ast.Pass(lineno=start_line, - col_offset=start_column)] + return [ast.Pass(lineno=start_line, col_offset=start_column)] ret = [] tree = list(flatten_literal_list(tree)) @@ -157,7 +152,7 @@ class HyASTCompiler(object): if isinstance(el, ast.FunctionDef): ret.append(ast.Return( value=ast.Name( - arg=el.name, id=el.name, ctx=ast.Load(), + arg=el.name,id=el.name, ctx=ast.Load(), lineno=el.lineno, col_offset=el.col_offset), lineno=el.lineno, col_offset=el.col_offset)) @@ -166,9 +161,10 @@ class HyASTCompiler(object): ret.append(el) continue - ret.append(ast.Expr(value=el, - lineno=el.lineno, - col_offset=el.col_offset)) + ret.append(ast.Expr( + value=el, + lineno=el.lineno, + col_offset=el.col_offset)) ret.reverse() return ret From 3f5ce6440759bc76a7b2396973ac4b733cab55bb Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Tue, 9 Apr 2013 20:44:52 -0400 Subject: [PATCH 09/62] I'm an idiot --- hy/compiler.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/hy/compiler.py b/hy/compiler.py index 1db4a80..0157142 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -97,11 +97,13 @@ def checkargs(exact=None, min=None, max=None): expression, "`%%s' needs %d arguments, got %%d" % exact) if min is not None and (len(expression) - 1) < min: - _raise_wrong_args_number(expression, + _raise_wrong_args_number( + expression, "`%%s' needs at least %d arguments, got %%d" % (min)) if max is not None and (len(expression) - 1) > max: - _raise_wrong_args_number(expression, + _raise_wrong_args_number( + expression, "`%%s' needs at most %d arguments, got %%d" % (max)) return fn(self, expression) @@ -152,7 +154,7 @@ class HyASTCompiler(object): if isinstance(el, ast.FunctionDef): ret.append(ast.Return( value=ast.Name( - arg=el.name,id=el.name, ctx=ast.Load(), + arg=el.name, id=el.name, ctx=ast.Load(), lineno=el.lineno, col_offset=el.col_offset), lineno=el.lineno, col_offset=el.col_offset)) From 73be6afd3a25a4e2d91a70294e9d310971cc9ff5 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Tue, 9 Apr 2013 21:33:09 -0400 Subject: [PATCH 10/62] Initial cut of `eval' --- hy/compiler.py | 18 ++++++++++++++++-- hy/importer.py | 15 ++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/hy/compiler.py b/hy/compiler.py index 0157142..3901c8b 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -133,7 +133,8 @@ class HyASTCompiler(object): start_line=getattr(e, "start_line", 0), start_column=getattr(e, "start_column", 0)) - raise HyCompileError("Unknown type - `%s'" % (str(type(tree)))) + raise HyCompileError( + "Unknown type - `%s' - %s" % (str(type(tree)), tree)) def _mangle_branch(self, tree, start_line, start_column): # If tree is empty, just return a pass statement @@ -191,6 +192,14 @@ class HyASTCompiler(object): def compile_quote(self, entries): return self.compile(self._render_quoted_form(entries[1])) + @builds("eval") + @checkargs(exact=1) + def compile_eval(self, expr): + expr.pop(0) + return self.compile(HyExpression([ + HySymbol("hy_eval")] + expr + [HyExpression([HySymbol("globals")]) + ]).replace(expr)) + @builds("do") @builds("progn") def compile_do_expression(self, expr): @@ -925,5 +934,10 @@ def hy_compile(tree, root=None): tlo = root if root is None: tlo = ast.Module - ret = tlo(body=compiler._mangle_branch(compiler.compile(tree), 0, 0)) + + _ast = compiler.compile(tree) + if type(_ast) == list: + _ast = compiler._mangle_branch(_ast, 0, 0) + + ret = tlo(body=_ast) return ret diff --git a/hy/importer.py b/hy/importer.py index 587d536..94ed984 100644 --- a/hy/importer.py +++ b/hy/importer.py @@ -18,8 +18,9 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. -from hy.compiler import hy_compile from py_compile import wr_long, MAGIC +from hy.compiler import hy_compile +from hy.models import HyObject from hy.core import process from hy.lex import tokenize @@ -28,6 +29,7 @@ from io import open import marshal import imp import sys +import ast import os @@ -67,6 +69,17 @@ def import_file_to_module(name, fpath): return mod +def hy_eval(hytree, namespace): + foo = HyObject() + foo.start_line = 0 + foo.end_line = 0 + foo.start_column = 0 + foo.end_column = 0 + hytree.replace(foo) + _ast = hy_compile(hytree, root=ast.Expression) + return eval(compile(_ast, "", "eval"), namespace) + + def write_hy_as_pyc(fname): with open(fname, 'U') as f: try: From 8cc26ba1bf51c0a7ae0a6fa03f32ef0d96923af3 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Tue, 9 Apr 2013 21:40:54 -0400 Subject: [PATCH 11/62] moving to locals; fixing _ast vs ast, adding tests --- hy/compiler.py | 4 ++-- hy/importer.py | 12 ++++++------ tests/native_tests/language.hy | 13 +++++++++++++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/hy/compiler.py b/hy/compiler.py index 3901c8b..ad14379 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -197,8 +197,8 @@ class HyASTCompiler(object): def compile_eval(self, expr): expr.pop(0) return self.compile(HyExpression([ - HySymbol("hy_eval")] + expr + [HyExpression([HySymbol("globals")]) - ]).replace(expr)) + HySymbol("hy_eval")] + expr + [ + HyExpression([HySymbol("locals")])]).replace(expr)) @builds("do") @builds("progn") diff --git a/hy/importer.py b/hy/importer.py index 94ed984..ee9c405 100644 --- a/hy/importer.py +++ b/hy/importer.py @@ -51,21 +51,21 @@ def import_file_to_hst(fpath): def import_file_to_ast(fpath): tree = import_file_to_hst(fpath) - ast = hy_compile(tree) - return ast + _ast = hy_compile(tree) + return _ast def import_string_to_ast(buff): tree = import_buffer_to_hst(StringIO(buff)) - ast = hy_compile(tree) - return ast + _ast = hy_compile(tree) + return _ast def import_file_to_module(name, fpath): - ast = import_file_to_ast(fpath) + _ast = import_file_to_ast(fpath) mod = imp.new_module(name) mod.__file__ = fpath - eval(compile(ast, fpath, "exec"), mod.__dict__) + eval(compile(_ast, fpath, "exec"), mod.__dict__) return mod diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index c835605..4a62524 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -511,6 +511,19 @@ ((fn [] 1)))))) +(defn test-eval [] + "NATIVE: test eval" + (import-from hy.importer hy-eval) ; XXX: Fix this!!!!! + (import-from hy HyExpression HyInteger HySymbol) + (assert (= 2 (eval (quote (+ 1 1))))) + (setf x 2) + (assert (= 4 (eval (quote (+ x 2))))) + (setf test-payload (quote (+ x 2))) + (setf x 4) + (assert (= 6 (eval test-payload)))) + + + ; FEATURE: native hy-eval ; ; - related to bug #64 From 6f0e739b31b0f0bfb0d8883dbae1e7842c2c0781 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Tue, 9 Apr 2013 21:45:37 -0400 Subject: [PATCH 12/62] test hoisted functions too --- tests/native_tests/language.hy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index 4a62524..f6a6f83 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -520,7 +520,8 @@ (assert (= 4 (eval (quote (+ x 2))))) (setf test-payload (quote (+ x 2))) (setf x 4) - (assert (= 6 (eval test-payload)))) + (assert (= 6 (eval test-payload))) + (assert (= 6 (eval (quote ((fn [] (+ 3 3)))))))) From c98a367495b153db0fc69c5e315665d3eab2f61c Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Tue, 9 Apr 2013 21:55:34 -0400 Subject: [PATCH 13/62] Merging the two tests. --- tests/native_tests/language.hy | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index f6a6f83..6b1f380 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -514,26 +514,15 @@ (defn test-eval [] "NATIVE: test eval" (import-from hy.importer hy-eval) ; XXX: Fix this!!!!! - (import-from hy HyExpression HyInteger HySymbol) + (import-from hy HyExpression HyInteger HySymbol HyString) (assert (= 2 (eval (quote (+ 1 1))))) (setf x 2) (assert (= 4 (eval (quote (+ x 2))))) (setf test-payload (quote (+ x 2))) (setf x 4) (assert (= 6 (eval test-payload))) - (assert (= 6 (eval (quote ((fn [] (+ 3 3)))))))) - - - -; FEATURE: native hy-eval -; -; - related to bug #64 -; - https://github.com/paultag/hy/issues/64 -; - https://github.com/paultag/hy/pull/62 -; -; (defn test-eval [] -; "NATIVE: test eval" -; (assert (= 1 (eval 1))) -; (assert (= "foobar" (eval "foobar"))) -; (setv x 42) -; (assert (= x (eval x)))) + (assert (= 6 (eval (quote ((fn [] (+ 3 3))))))) + (assert (= 1 (eval (quote 1)))) + (assert (= "foobar" (eval (quote "foobar")))) + (setv x (quote 42)) + (assert (= x (eval x)))) From 753460884ec81da784230885ce9e563fcda085d2 Mon Sep 17 00:00:00 2001 From: Konrad Hinsen Date: Wed, 10 Apr 2013 12:32:39 +0200 Subject: [PATCH 14/62] Accept strings as top-level expressions --- hy/lex/states.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hy/lex/states.py b/hy/lex/states.py index 52d6fa3..005e905 100644 --- a/hy/lex/states.py +++ b/hy/lex/states.py @@ -284,6 +284,9 @@ class Idle(State): if char == "#": return Hash + if char == "\"": + return String + if char in WHITESPACE: return From 4f98ea22e8c18e68d64d8e8a3976605e4a6f22b6 Mon Sep 17 00:00:00 2001 From: Konrad Hinsen Date: Wed, 10 Apr 2013 13:08:32 +0200 Subject: [PATCH 15/62] Allow atoms (integers, booleans, symbols) as top-level expressions --- hy/lex/states.py | 55 +++++++++++++++++++++++++++++++++++++++---- tests/lex/test_lex.py | 18 ++++++++++++++ 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/hy/lex/states.py b/hy/lex/states.py index 005e905..f6ec6eb 100644 --- a/hy/lex/states.py +++ b/hy/lex/states.py @@ -255,6 +255,46 @@ class String(State): self.nodes.append(char) +class Atom(State): + """ + This state parses integer constants, boolean constants, and symbols + """ + + def __init__(self, machine): + State.__init__(self, machine) + self.initial_buf = '' + + def enter(self): + self.buf = self.initial_buf + + def exit(self): + self.result = _resolve_atom(self.buf) + + def process(self, char): + """ + State transitions: + + - WHITESPACE - Idle + - ; - Comment + """ + + if char in WHITESPACE: + return Idle + + if char == ";": + return Comment + + self.buf += char + + +def AtomStartingWith(initial_char): + def AtomFactory(machine): + state = Atom(machine) + state.initial_buf = initial_char + return state + return AtomFactory + + class Idle(State): """ Idle state. This is the first (and last) thing that we should @@ -266,7 +306,12 @@ class Idle(State): State transitions: - ( - Expression - - (default) - Error + - [ - List + - { - Dict + - \" - String + - ; - Comment + - # - Hash + - (default) - Atom """ if char == "(": @@ -278,19 +323,19 @@ class Idle(State): if char == "{": return Dict + if char == "\"": + return String + if char == ";": return Comment if char == "#": return Hash - if char == "\"": - return String - if char in WHITESPACE: return - raise LexException("Unknown char (Idle state): `%s`" % (char)) + return AtomStartingWith(char) class Comment(State): diff --git a/tests/lex/test_lex.py b/tests/lex/test_lex.py index 45922b9..06ac7eb 100644 --- a/tests/lex/test_lex.py +++ b/tests/lex/test_lex.py @@ -77,6 +77,24 @@ def test_lex_expression_integer(): assert objs == [HyExpression([HySymbol("foo"), HyInteger(2)])] +def test_lex_symbols(): + """ Make sure that symbols are valid expressions""" + objs = tokenize("foo ") + assert objs == [HySymbol("foo")] + + +def test_lex_symbols(): + """ Make sure that strings are valid expressions""" + objs = tokenize("\"foo\" ") + assert objs == [HyString("foo")] + + +def test_lex_integers(): + """ Make sure that integers are valid expressions""" + objs = tokenize("42 ") + assert objs == [HyInteger(42)] + + def test_lex_line_counting(): """ Make sure we can count lines / columns """ entry = tokenize("(foo (one two))")[0] From b1f66b6893a53375d31b7674f33ba3937cfc67d7 Mon Sep 17 00:00:00 2001 From: Konrad Hinsen Date: Wed, 10 Apr 2013 14:26:16 +0200 Subject: [PATCH 16/62] Handle float and complex constants in addition to integer --- hy/compiler.py | 18 ++++++++++++++++-- hy/lex/states.py | 15 +++++++++++++++ hy/models/complex.py | 32 ++++++++++++++++++++++++++++++++ hy/models/float.py | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 hy/models/complex.py create mode 100644 hy/models/float.py diff --git a/hy/compiler.py b/hy/compiler.py index 0157142..0be2b08 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -25,6 +25,8 @@ from hy.errors import HyError from hy.models.expression import HyExpression from hy.models.integer import HyInteger +from hy.models.float import HyFloat +from hy.models.complex import HyComplex from hy.models.string import HyString from hy.models.symbol import HySymbol from hy.models.list import HyList @@ -873,8 +875,20 @@ class HyASTCompiler(object): return ret @builds(HyInteger) - def compile_number(self, number): - return ast.Num(n=int(number), # See HyInteger above. + def compile_integer(self, number): + return ast.Num(n=int(number), + lineno=number.start_line, + col_offset=number.start_column) + + @builds(HyFloat) + def compile_integer(self, number): + return ast.Num(n=float(number), + lineno=number.start_line, + col_offset=number.start_column) + + @builds(HyComplex) + def compile_integer(self, number): + return ast.Num(n=complex(number), lineno=number.start_line, col_offset=number.start_column) diff --git a/hy/lex/states.py b/hy/lex/states.py index f6ec6eb..9af87d1 100644 --- a/hy/lex/states.py +++ b/hy/lex/states.py @@ -20,6 +20,8 @@ from hy.models.expression import HyExpression from hy.models.integer import HyInteger +from hy.models.float import HyFloat +from hy.models.complex import HyComplex from hy.models.symbol import HySymbol from hy.models.string import HyString from hy.models.dict import HyDict @@ -45,6 +47,8 @@ def _resolve_atom(obj): Resolve a bare atom into one of the following (in order): - Integer + - Float + - Complex - Symbol """ try: @@ -52,6 +56,17 @@ def _resolve_atom(obj): except ValueError: pass + try: + return HyFloat(obj) + except ValueError: + pass + + try: + return HyComplex(obj) + except ValueError: + pass + + table = { "true": "True", "false": "False", diff --git a/hy/models/complex.py b/hy/models/complex.py new file mode 100644 index 0000000..9647997 --- /dev/null +++ b/hy/models/complex.py @@ -0,0 +1,32 @@ +# Copyright (c) 2013 Paul Tagliamonte +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +from hy.models import HyObject + + +class HyComplex(HyObject, complex): + """ + Internal represntation of a Hy Complex. May raise a ValueError as if + complex(foo) was called, given HyComplex(foo). + """ + + def __new__(cls, number, *args, **kwargs): + number = complex(number) + return super(HyComplex, cls).__new__(cls, number) diff --git a/hy/models/float.py b/hy/models/float.py new file mode 100644 index 0000000..184c3a3 --- /dev/null +++ b/hy/models/float.py @@ -0,0 +1,32 @@ +# Copyright (c) 2013 Paul Tagliamonte +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +from hy.models import HyObject + + +class HyFloat(HyObject, float): + """ + Internal represntation of a Hy Float. May raise a ValueError as if + float(foo) was called, given HyFloat(foo). + """ + + def __new__(cls, number, *args, **kwargs): + number = float(number) + return super(HyFloat, cls).__new__(cls, number) From 65db83d1ff70cb114989d7072d0007ecf55c22d2 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Wed, 10 Apr 2013 20:04:58 -0400 Subject: [PATCH 17/62] moving atoms around to make it easier for internals. --- hy/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hy/__init__.py b/hy/__init__.py index 56ffb1d..54936ac 100644 --- a/hy/__init__.py +++ b/hy/__init__.py @@ -23,12 +23,13 @@ __appname__ = "hy" __version__ = "0.9.5" -import hy.importer # NOQA -# we import for side-effects. - from hy.models.expression import HyExpression # NOQA from hy.models.integer import HyInteger # NOQA from hy.models.string import HyString # NOQA from hy.models.symbol import HySymbol # NOQA from hy.models.dict import HyDict # NOQA from hy.models.list import HyList # NOQA + + +import hy.importer # NOQA +# we import for side-effects. From 1adf64839a8c04477f74efac953949740334b860 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Wed, 10 Apr 2013 21:44:23 -0400 Subject: [PATCH 18/62] Updating travis; exceptions. --- .travis.yml | 11 ++++++++--- hy/compiler.py | 12 +++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index ad0a9a0..7b40ddc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,11 @@ notifications: channels: - "irc.freenode.net#woo-city-commits" - "irc.freenode.net#hy" - on_success: always - on_failure: always - use_notice: true + on_success: change + on_failure: change + use_notice: false + +# blacklist +branches: + except: + - debian diff --git a/hy/compiler.py b/hy/compiler.py index ad14379..4187d6a 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -129,9 +129,12 @@ class HyASTCompiler(object): # another HyCompileError! raise except Exception as e: - raise HyCompileError(exception=e, - start_line=getattr(e, "start_line", 0), - start_column=getattr(e, "start_column", 0)) + if isinstance(e, HyError): + raise HyCompileError( + exception=e, + start_line=getattr(e, "start_line", 0), + start_column=getattr(e, "start_column", 0)) + raise raise HyCompileError( "Unknown type - `%s' - %s" % (str(type(tree)), tree)) @@ -630,6 +633,9 @@ class HyASTCompiler(object): if type(call) != ast.Call: raise TypeError("kwapplying a non-call") + if type(kwargs) != HyDict: + raise TypeError("kwapplying with a non-dict") + call.keywords = [ast.keyword(arg=ast_str(x), value=self.compile(kwargs[x])) for x in kwargs] From 644f2756f3f094cd8e26e604d883a61fcbdcb249 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Wed, 10 Apr 2013 21:49:27 -0400 Subject: [PATCH 19/62] Fixing the raised Exception. --- hy/compiler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hy/compiler.py b/hy/compiler.py index 4187d6a..977091c 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -134,7 +134,7 @@ class HyASTCompiler(object): exception=e, start_line=getattr(e, "start_line", 0), start_column=getattr(e, "start_column", 0)) - raise + raise HyCompileError(exception=e) raise HyCompileError( "Unknown type - `%s' - %s" % (str(type(tree)), tree)) From b361a230cb4c0f4f62218fd798c2de20526c1162 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Wed, 10 Apr 2013 22:00:51 -0400 Subject: [PATCH 20/62] Why is the blacklist not working? --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7b40ddc..2b9beda 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,6 @@ notifications: on_success: change on_failure: change use_notice: false - # blacklist branches: except: From d25d3542815136df9ee835e83670efda0fe9b432 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Wed, 10 Apr 2013 22:51:58 -0400 Subject: [PATCH 21/62] Adding in on-the-fly-importing. --- hy/compiler.py | 22 ++++++++++++++++++++++ tests/native_tests/language.hy | 2 -- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/hy/compiler.py b/hy/compiler.py index 977091c..dada940 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -32,6 +32,7 @@ from hy.models.dict import HyDict from hy.util import flatten_literal_list +from collections import defaultdict import codecs import ast import sys @@ -117,6 +118,7 @@ class HyASTCompiler(object): def __init__(self): self.returnable = False self.anon_fn_count = 0 + self.imports = defaultdict(list) def compile(self, tree): try: @@ -181,6 +183,8 @@ class HyASTCompiler(object): def _render_quoted_form(self, form): name = form.__class__.__name__ + self.imports["hy"].append((name, form)) + if isinstance(form, HyList): return HyExpression( [HySymbol(name), @@ -199,6 +203,8 @@ class HyASTCompiler(object): @checkargs(exact=1) def compile_eval(self, expr): expr.pop(0) + self.imports["hy.importer"].append(("hy_eval", expr)) + return self.compile(HyExpression([ HySymbol("hy_eval")] + expr + [ HyExpression([HySymbol("locals")])]).replace(expr)) @@ -945,5 +951,21 @@ def hy_compile(tree, root=None): if type(_ast) == list: _ast = compiler._mangle_branch(_ast, 0, 0) + imports = [] + for package in compiler.imports: + imported = set() + syms = compiler.imports[package] + for entry, form in syms: + if entry in imported: + continue + + imported.add(entry) + imports.append(HyExpression([ + HySymbol("import_from"), + HySymbol(package), + HySymbol(entry) + ]).replace(form)) + _ast = compiler.compile(imports) + _ast + ret = tlo(body=_ast) return ret diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index 6b1f380..018cbc3 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -513,8 +513,6 @@ (defn test-eval [] "NATIVE: test eval" - (import-from hy.importer hy-eval) ; XXX: Fix this!!!!! - (import-from hy HyExpression HyInteger HySymbol HyString) (assert (= 2 (eval (quote (+ 1 1))))) (setf x 2) (assert (= 4 (eval (quote (+ x 2))))) From f6b94b1b40906dd0a36c94a6d0fb29e8c9fc5ce5 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Wed, 10 Apr 2013 23:00:42 -0400 Subject: [PATCH 22/62] Avoiding breaking PyPy. Wat. --- hy/compiler.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hy/compiler.py b/hy/compiler.py index dada940..8c9230e 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -964,7 +964,10 @@ def hy_compile(tree, root=None): HySymbol("import_from"), HySymbol(package), HySymbol(entry) - ]).replace(form)) + ]).replace(tree[0])) # form)) + # using form causes pypy to blow up; let's conditionally + # add this for cpython or something. Muhahaha. - PRT + _ast = compiler.compile(imports) + _ast ret = tlo(body=_ast) From b65f78a0c79b839b6ac992486c925efd81c3edb9 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Wed, 10 Apr 2013 23:06:55 -0400 Subject: [PATCH 23/62] Adding in this barf of a hack beacuse it pleases me. --- hy/compiler.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/hy/compiler.py b/hy/compiler.py index 8c9230e..a8075e2 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -959,14 +959,19 @@ def hy_compile(tree, root=None): if entry in imported: continue + replace = form + if hasattr(sys, "subversion") and sys.subversion[0] == "PyPy": + # using form causes pypy to blow up; let's conditionally + # add this for cpython, since it won't go through and make + # sure the AST makes sense. Muhahaha. - PRT + replace = tree[0] + imported.add(entry) imports.append(HyExpression([ HySymbol("import_from"), HySymbol(package), HySymbol(entry) - ]).replace(tree[0])) # form)) - # using form causes pypy to blow up; let's conditionally - # add this for cpython or something. Muhahaha. - PRT + ]).replace(replace)) _ast = compiler.compile(imports) + _ast From eee65f3051ee789fd8e67a3c0ee29dc3214e3200 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Wed, 10 Apr 2013 23:11:54 -0400 Subject: [PATCH 24/62] Update to the style. --- hy/compiler.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/hy/compiler.py b/hy/compiler.py index a8075e2..d1d4772 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -951,6 +951,11 @@ def hy_compile(tree, root=None): if type(_ast) == list: _ast = compiler._mangle_branch(_ast, 0, 0) + if hasattr(sys, "subversion"): + implementation = sys.subversion[0].lower() + elif hasattr(sys, "implementation"): + implementation = sys.implementation.name.lower() + imports = [] for package in compiler.imports: imported = set() @@ -960,7 +965,7 @@ def hy_compile(tree, root=None): continue replace = form - if hasattr(sys, "subversion") and sys.subversion[0] == "PyPy": + if implementation != "cpython": # using form causes pypy to blow up; let's conditionally # add this for cpython, since it won't go through and make # sure the AST makes sense. Muhahaha. - PRT From f036b360a6145e51d570d33de88965f1f93ab395 Mon Sep 17 00:00:00 2001 From: Konrad Hinsen Date: Thu, 11 Apr 2013 08:26:56 +0200 Subject: [PATCH 25/62] Fixed typo in test_lex.py --- tests/lex/test_lex.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lex/test_lex.py b/tests/lex/test_lex.py index 06ac7eb..0172242 100644 --- a/tests/lex/test_lex.py +++ b/tests/lex/test_lex.py @@ -83,7 +83,7 @@ def test_lex_symbols(): assert objs == [HySymbol("foo")] -def test_lex_symbols(): +def test_lex_strings(): """ Make sure that strings are valid expressions""" objs = tokenize("\"foo\" ") assert objs == [HyString("foo")] From fd99f497a40ae4e860e7994c9707c8b4ec814ffc Mon Sep 17 00:00:00 2001 From: Konrad Hinsen Date: Thu, 11 Apr 2013 08:26:56 +0200 Subject: [PATCH 26/62] Fixed typo in test_lex.py --- tests/lex/test_lex.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lex/test_lex.py b/tests/lex/test_lex.py index 06ac7eb..0172242 100644 --- a/tests/lex/test_lex.py +++ b/tests/lex/test_lex.py @@ -83,7 +83,7 @@ def test_lex_symbols(): assert objs == [HySymbol("foo")] -def test_lex_symbols(): +def test_lex_strings(): """ Make sure that strings are valid expressions""" objs = tokenize("\"foo\" ") assert objs == [HyString("foo")] From 1d73ecb7929e66c6025e56308acca2923dbed1cf Mon Sep 17 00:00:00 2001 From: Konrad Hinsen Date: Wed, 10 Apr 2013 14:26:16 +0200 Subject: [PATCH 27/62] Handle float and complex constants in addition to integer --- hy/compiler.py | 18 ++++++++++++++++-- hy/lex/states.py | 15 +++++++++++++++ hy/models/complex.py | 32 ++++++++++++++++++++++++++++++++ hy/models/float.py | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 hy/models/complex.py create mode 100644 hy/models/float.py diff --git a/hy/compiler.py b/hy/compiler.py index d1d4772..6dc1842 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -25,6 +25,8 @@ from hy.errors import HyError from hy.models.expression import HyExpression from hy.models.integer import HyInteger +from hy.models.float import HyFloat +from hy.models.complex import HyComplex from hy.models.string import HyString from hy.models.symbol import HySymbol from hy.models.list import HyList @@ -894,8 +896,20 @@ class HyASTCompiler(object): return ret @builds(HyInteger) - def compile_number(self, number): - return ast.Num(n=int(number), # See HyInteger above. + def compile_integer(self, number): + return ast.Num(n=int(number), + lineno=number.start_line, + col_offset=number.start_column) + + @builds(HyFloat) + def compile_integer(self, number): + return ast.Num(n=float(number), + lineno=number.start_line, + col_offset=number.start_column) + + @builds(HyComplex) + def compile_integer(self, number): + return ast.Num(n=complex(number), lineno=number.start_line, col_offset=number.start_column) diff --git a/hy/lex/states.py b/hy/lex/states.py index 52d6fa3..da0f466 100644 --- a/hy/lex/states.py +++ b/hy/lex/states.py @@ -20,6 +20,8 @@ from hy.models.expression import HyExpression from hy.models.integer import HyInteger +from hy.models.float import HyFloat +from hy.models.complex import HyComplex from hy.models.symbol import HySymbol from hy.models.string import HyString from hy.models.dict import HyDict @@ -45,6 +47,8 @@ def _resolve_atom(obj): Resolve a bare atom into one of the following (in order): - Integer + - Float + - Complex - Symbol """ try: @@ -52,6 +56,17 @@ def _resolve_atom(obj): except ValueError: pass + try: + return HyFloat(obj) + except ValueError: + pass + + try: + return HyComplex(obj) + except ValueError: + pass + + table = { "true": "True", "false": "False", diff --git a/hy/models/complex.py b/hy/models/complex.py new file mode 100644 index 0000000..9647997 --- /dev/null +++ b/hy/models/complex.py @@ -0,0 +1,32 @@ +# Copyright (c) 2013 Paul Tagliamonte +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +from hy.models import HyObject + + +class HyComplex(HyObject, complex): + """ + Internal represntation of a Hy Complex. May raise a ValueError as if + complex(foo) was called, given HyComplex(foo). + """ + + def __new__(cls, number, *args, **kwargs): + number = complex(number) + return super(HyComplex, cls).__new__(cls, number) diff --git a/hy/models/float.py b/hy/models/float.py new file mode 100644 index 0000000..184c3a3 --- /dev/null +++ b/hy/models/float.py @@ -0,0 +1,32 @@ +# Copyright (c) 2013 Paul Tagliamonte +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +from hy.models import HyObject + + +class HyFloat(HyObject, float): + """ + Internal represntation of a Hy Float. May raise a ValueError as if + float(foo) was called, given HyFloat(foo). + """ + + def __new__(cls, number, *args, **kwargs): + number = float(number) + return super(HyFloat, cls).__new__(cls, number) From ac0a597742d30e32315aade49003690062724272 Mon Sep 17 00:00:00 2001 From: Konrad Hinsen Date: Thu, 11 Apr 2013 09:54:59 +0200 Subject: [PATCH 28/62] Tests for float and complex constants --- tests/lex/test_lex.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/lex/test_lex.py b/tests/lex/test_lex.py index 45922b9..676c109 100644 --- a/tests/lex/test_lex.py +++ b/tests/lex/test_lex.py @@ -20,6 +20,8 @@ from hy.models.expression import HyExpression from hy.models.integer import HyInteger +from hy.models.float import HyFloat +from hy.models.complex import HyComplex from hy.models.symbol import HySymbol from hy.models.string import HyString from hy.models.dict import HyDict @@ -77,6 +79,25 @@ def test_lex_expression_integer(): assert objs == [HyExpression([HySymbol("foo"), HyInteger(2)])] +def test_lex_expression_float(): + """ Make sure expressions can produce floats """ + objs = tokenize("(foo 2.)") + assert objs == [HyExpression([HySymbol("foo"), HyFloat(2.)])] + objs = tokenize("(foo -0.5)") + assert objs == [HyExpression([HySymbol("foo"), HyFloat(-0.5)])] + objs = tokenize("(foo 1.e7)") + assert objs == [HyExpression([HySymbol("foo"), HyFloat(1.e7)])] + +def test_lex_expression_complex(): + """ Make sure expressions can produce complex """ + objs = tokenize("(foo 2.j)") + assert objs == [HyExpression([HySymbol("foo"), HyComplex(2.j)])] + objs = tokenize("(foo -0.5j)") + assert objs == [HyExpression([HySymbol("foo"), HyComplex(-0.5j)])] + objs = tokenize("(foo 1.e7j)") + assert objs == [HyExpression([HySymbol("foo"), HyComplex(1.e7j)])] + + def test_lex_line_counting(): """ Make sure we can count lines / columns """ entry = tokenize("(foo (one two))")[0] From e3a9909a7e682281ef67c462db486611b66f8f4b Mon Sep 17 00:00:00 2001 From: Konrad Hinsen Date: Thu, 11 Apr 2013 10:09:15 +0200 Subject: [PATCH 29/62] Implement integer division operator Fixes #107 --- hy/compiler.py | 2 ++ tests/native_tests/math.hy | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/hy/compiler.py b/hy/compiler.py index d1d4772..9b1c337 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -708,6 +708,7 @@ class HyASTCompiler(object): @builds("%") @builds("-") @builds("/") + @builds("//") @builds("*") @checkargs(min=2) def compile_maths_expression(self, expression): @@ -717,6 +718,7 @@ class HyASTCompiler(object): ops = {"+": ast.Add, "/": ast.Div, + "//": ast.FloorDiv, "*": ast.Mult, "-": ast.Sub, "%": ast.Mod} diff --git a/tests/native_tests/math.hy b/tests/native_tests/math.hy index 2310905..8570ceb 100644 --- a/tests/native_tests/math.hy +++ b/tests/native_tests/math.hy @@ -29,6 +29,10 @@ "NATIVE: Test division" (assert (= 25 (/ 100 2 2))))) +(setv test_int_div (fn [] + "NATIVE: Test integer division" + (assert (= 25 (// 101 2 2))))) + (defn test-modulo [] "NATIVE: test mod" (assert (= (% 10 2) 0))) From 15ae8c83f16866ac3b15e805e5c583047622eab9 Mon Sep 17 00:00:00 2001 From: Konrad Hinsen Date: Thu, 11 Apr 2013 14:41:09 +0200 Subject: [PATCH 30/62] Fix names of methods compile_float and compile_complex --- hy/compiler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hy/compiler.py b/hy/compiler.py index 6dc1842..57c55ad 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -902,13 +902,13 @@ class HyASTCompiler(object): col_offset=number.start_column) @builds(HyFloat) - def compile_integer(self, number): + def compile_float(self, number): return ast.Num(n=float(number), lineno=number.start_line, col_offset=number.start_column) @builds(HyComplex) - def compile_integer(self, number): + def compile_complex(self, number): return ast.Num(n=complex(number), lineno=number.start_line, col_offset=number.start_column) From 702811c69aaf3267ee274ced3b86f5d27323b0fb Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Wed, 10 Apr 2013 17:44:08 +0200 Subject: [PATCH 31/62] Implement :keyword support This implements keywords, ":" prefixed symbols that are able to look themselves up in a collection. They're internally stored as strings that start with "\ufdd0". This fixes #22. Signed-off-by: Gergely Nagy --- hy/compiler.py | 14 ++++++++++++ hy/lex/states.py | 4 ++++ hy/models/keyword.py | 39 ++++++++++++++++++++++++++++++++++ tests/native_tests/language.hy | 6 ++++++ 4 files changed, 63 insertions(+) create mode 100644 hy/models/keyword.py diff --git a/hy/compiler.py b/hy/compiler.py index 9b1c337..a8bee1a 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -29,6 +29,7 @@ from hy.models.string import HyString from hy.models.symbol import HySymbol from hy.models.list import HyList from hy.models.dict import HyDict +from hy.models.keyword import HyKeyword from hy.util import flatten_literal_list @@ -768,6 +769,11 @@ class HyASTCompiler(object): if expression[0].startswith("."): return self.compile_dotted_expression(expression) + if isinstance(fn, HyKeyword): + new_expr = HyExpression(["get", expression[1], fn]) + new_expr.start_line = expression.start_line + new_expr.start_column = expression.start_column + return self.compile_index_expression(new_expr) return ast.Call(func=self.compile(fn), args=[self.compile(x) for x in expression[1:]], @@ -927,6 +933,14 @@ class HyASTCompiler(object): return ast.Str(s=ast_str(string), lineno=string.start_line, col_offset=string.start_column) + @builds(HyKeyword) + def compile_keyword(self, keyword): + _str_type = str + if sys.version_info[0] < 3: + _str_type = unicode + return ast.Str(s=_str_type(keyword), lineno=keyword.start_line, + col_offset=keyword.start_column) + @builds(HyDict) def compile_dict(self, m): keys = [] diff --git a/hy/lex/states.py b/hy/lex/states.py index 52d6fa3..fa39176 100644 --- a/hy/lex/states.py +++ b/hy/lex/states.py @@ -22,6 +22,7 @@ from hy.models.expression import HyExpression from hy.models.integer import HyInteger from hy.models.symbol import HySymbol from hy.models.string import HyString +from hy.models.keyword import HyKeyword from hy.models.dict import HyDict from hy.models.list import HyList @@ -61,6 +62,9 @@ def _resolve_atom(obj): if obj in table: return HySymbol(table[obj]) + if obj.startswith(":"): + return HyKeyword(obj) + if obj.startswith("*") and obj.endswith("*") and obj != "*": obj = obj[1:-1].upper() diff --git a/hy/models/keyword.py b/hy/models/keyword.py new file mode 100644 index 0000000..e57d2f1 --- /dev/null +++ b/hy/models/keyword.py @@ -0,0 +1,39 @@ +# Copyright (c) 2013 Gergely Nagy +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +from __future__ import unicode_literals +from hy.models import HyObject +import sys + + +if sys.version_info[0] >= 3: + _str_type = str +else: + _str_type = unicode + + +class HyKeyword(HyObject, _str_type): + """Generic Hy Keyword object. It's either a ``str`` or a ``unicode``, + depending on the Python version. + """ + + def __new__(cls, value): + obj = _str_type.__new__(cls, "\uFDD0" + value) + return obj diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index 018cbc3..ab71791 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -510,6 +510,12 @@ (pass) ((fn [] 1)))))) +(defn test-keyword [] + "NATIVE: test if keywords are recognised" + + (assert (= :foo :foo)) + (assert (= (get {:foo "bar"} :foo) "bar")) + (assert (= (get {:bar "quux"} (get {:foo :bar} :foo)) "quux"))) (defn test-eval [] "NATIVE: test eval" From 2ea2cd1a8dc74c7570df8d01e792b018401bc7fd Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Thu, 11 Apr 2013 11:46:52 +0200 Subject: [PATCH 32/62] tests: Test that keywords do not clash with normal strings Signed-off-by: Gergely Nagy --- tests/native_tests/language.hy | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index ab71791..f4c0e1c 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -517,6 +517,12 @@ (assert (= (get {:foo "bar"} :foo) "bar")) (assert (= (get {:bar "quux"} (get {:foo :bar} :foo)) "quux"))) +(defn test-keyword-clash [] + "NATIVE: test that keywords do not clash with normal strings" + + (assert (= (get {:foo "bar" ":foo" "quux"} :foo) "bar")) + (assert (= (get {:foo "bar" ":foo" "quux"} ":foo") "quux"))) + (defn test-eval [] "NATIVE: test eval" (assert (= 2 (eval (quote (+ 1 1))))) From db3e2bd3469e7e2e6560c2fed66c16757a73ea39 Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Thu, 11 Apr 2013 22:25:23 -0400 Subject: [PATCH 33/62] updating the nested mangles --- hy/core/mangles.py | 4 ++-- tests/native_tests/language.hy | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/hy/core/mangles.py b/hy/core/mangles.py index 4aaf210..b86dd60 100644 --- a/hy/core/mangles.py +++ b/hy/core/mangles.py @@ -41,7 +41,7 @@ class HoistableMangle(hy.mangle.Mangle): class FunctionMangle(HoistableMangle): hoistable = ["fn"] - ignore = ["def", "decorate_with", "setf", "setv"] + ignore = ["def", "decorate_with", "setf", "setv", "foreach", "do"] def __init__(self): self.series = 0 @@ -65,7 +65,7 @@ class FunctionMangle(HoistableMangle): class IfMangle(HoistableMangle): - ignore = [] + ignore = ["foreach", "do"] def __init__(self): self.series = 0 diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index 018cbc3..0bd08ff 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -511,6 +511,16 @@ ((fn [] 1)))))) +(defn test-nested-if [] + "NATIVE: test nested if" + (for [x (range 10)] + (if (in "foo" "foobar") + (do + (if true true true)) + (do + (if false false false))))) + + (defn test-eval [] "NATIVE: test eval" (assert (= 2 (eval (quote (+ 1 1))))) From 0c56885d42af686b6dada5d0d72fa5d836bb2714 Mon Sep 17 00:00:00 2001 From: Konrad Hinsen Date: Fri, 12 Apr 2013 05:23:25 +0200 Subject: [PATCH 34/62] Use __future__.division for all Hy code Fixes #106 Note: This is implemented by replacing all calls to Python's builtin "compile" function by calls to hy.importer.compile_, which adds the "future division" flag. Anyone using "compile" in future work will have to remember this. --- bin/hy | 3 ++- hy/importer.py | 12 ++++++++---- tests/native_tests/math.hy | 5 ++++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/bin/hy b/bin/hy index 2e27f56..45405aa 100755 --- a/bin/hy +++ b/bin/hy @@ -21,6 +21,7 @@ from hy.lex.states import Idle, LexException from hy.lex.machine import Machine from hy.compiler import hy_compile from hy.core import process +from hy.importer import compile_ import hy.completer @@ -58,7 +59,7 @@ class HyREPL(code.InteractiveConsole): _machine = Machine(Idle, 1, 0) try: _ast = hy_compile(tokens, root=ast.Interactive) - code = compile(_ast, filename, symbol) + code = compile_(_ast, filename, symbol) except Exception: self.showtraceback() return False diff --git a/hy/importer.py b/hy/importer.py index ee9c405..580020e 100644 --- a/hy/importer.py +++ b/hy/importer.py @@ -31,7 +31,7 @@ import imp import sys import ast import os - +import __future__ if sys.version_info[0] >= 3: from io import StringIO @@ -39,6 +39,10 @@ else: from StringIO import StringIO # NOQA +def compile_(ast, filename, mode): + return compile(ast, filename, mode, __future__.CO_FUTURE_DIVISION) + + def import_buffer_to_hst(fd): tree = tokenize(fd.read() + "\n") tree = process(tree) @@ -65,7 +69,7 @@ def import_file_to_module(name, fpath): _ast = import_file_to_ast(fpath) mod = imp.new_module(name) mod.__file__ = fpath - eval(compile(_ast, fpath, "exec"), mod.__dict__) + eval(compile_(_ast, fpath, "exec"), mod.__dict__) return mod @@ -77,7 +81,7 @@ def hy_eval(hytree, namespace): foo.end_column = 0 hytree.replace(foo) _ast = hy_compile(hytree, root=ast.Expression) - return eval(compile(_ast, "", "eval"), namespace) + return eval(compile_(_ast, "", "eval"), namespace) def write_hy_as_pyc(fname): @@ -88,7 +92,7 @@ def write_hy_as_pyc(fname): timestamp = long(os.stat(fname).st_mtime) _ast = import_file_to_ast(fname) - code = compile(_ast, fname, "exec") + code = compile_(_ast, fname, "exec") cfile = "%s.pyc" % fname[:-len(".hy")] with open(cfile, 'wb') as fc: diff --git a/tests/native_tests/math.hy b/tests/native_tests/math.hy index 8570ceb..d2bcaea 100644 --- a/tests/native_tests/math.hy +++ b/tests/native_tests/math.hy @@ -27,7 +27,10 @@ (setv test_div (fn [] "NATIVE: Test division" - (assert (= 25 (/ 100 2 2))))) + (assert (= 25 (/ 100 2 2))) + ; Commented out until float constants get implemented + ; (assert (= 0.5 (/ 1 2))) + (assert (= 1 (* 2 (/ 1 2)))))) (setv test_int_div (fn [] "NATIVE: Test integer division" From c30a1164168c97a41173405f486ccce6ab90cfcb Mon Sep 17 00:00:00 2001 From: Konrad Hinsen Date: Fri, 12 Apr 2013 08:00:08 +0200 Subject: [PATCH 35/62] Add "from __future__ import division" to Python code generated by hy2py This is mainly to make we don't forget this. The current state of hy2py is more a proof-of-concept than a usable tool anyway. --- bin/hy2py | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/hy2py b/bin/hy2py index 9894ec5..5ebdbe0 100755 --- a/bin/hy2py +++ b/bin/hy2py @@ -17,6 +17,7 @@ print "" print ast.dump(_ast) print "" print "" +print "from __future__ import division" print astor.codegen.to_source(_ast) import_file_to_module("", sys.argv[1]) From 1f4ed473d30b3e2cdd5d39379f61d4aaf2ec1230 Mon Sep 17 00:00:00 2001 From: Paul Tagliamonte Date: Fri, 12 Apr 2013 09:11:56 -0400 Subject: [PATCH 36/62] Style fixes; function declashing. --- hy/compiler.py | 4 ++-- hy/lex/states.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/hy/compiler.py b/hy/compiler.py index 5aaaa65..0262c78 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -910,13 +910,13 @@ class HyASTCompiler(object): col_offset=number.start_column) @builds(HyFloat) - def compile_integer(self, number): + def compile_float(self, number): return ast.Num(n=float(number), lineno=number.start_line, col_offset=number.start_column) @builds(HyComplex) - def compile_integer(self, number): + def compile_complex(self, number): return ast.Num(n=complex(number), lineno=number.start_line, col_offset=number.start_column) diff --git a/hy/lex/states.py b/hy/lex/states.py index 8691d9d..7070884 100644 --- a/hy/lex/states.py +++ b/hy/lex/states.py @@ -67,7 +67,6 @@ def _resolve_atom(obj): except ValueError: pass - table = { "true": "True", "false": "False", From e4e61a463e808f321557d1a5625d6fa00b97b0ee Mon Sep 17 00:00:00 2001 From: Paul Tagliamonte Date: Fri, 12 Apr 2013 09:18:25 -0400 Subject: [PATCH 37/62] Adding in the new models. --- hy/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hy/__init__.py b/hy/__init__.py index 54936ac..42e3efe 100644 --- a/hy/__init__.py +++ b/hy/__init__.py @@ -25,8 +25,11 @@ __version__ = "0.9.5" from hy.models.expression import HyExpression # NOQA from hy.models.integer import HyInteger # NOQA +from hy.models.keyword import HyKeyword # NOQA +from hy.models.complex import HyComplex # NOQA from hy.models.string import HyString # NOQA from hy.models.symbol import HySymbol # NOQA +from hy.models.float import HyFloat # NOQA from hy.models.dict import HyDict # NOQA from hy.models.list import HyList # NOQA From 65c08c8c7df169b7896b59419942598e303cf4db Mon Sep 17 00:00:00 2001 From: Nicolas Dandrimont Date: Fri, 12 Apr 2013 20:39:45 +0200 Subject: [PATCH 38/62] Factor str_type into hy.util --- hy/compiler.py | 7 ++----- hy/models/keyword.py | 12 +++--------- hy/models/string.py | 8 +------- hy/util.py | 8 ++++++++ 4 files changed, 14 insertions(+), 21 deletions(-) diff --git a/hy/compiler.py b/hy/compiler.py index 0262c78..ab635e9 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -33,7 +33,7 @@ from hy.models.list import HyList from hy.models.dict import HyDict from hy.models.keyword import HyKeyword -from hy.util import flatten_literal_list +from hy.util import flatten_literal_list, str_type from collections import defaultdict import codecs @@ -949,10 +949,7 @@ class HyASTCompiler(object): @builds(HyKeyword) def compile_keyword(self, keyword): - _str_type = str - if sys.version_info[0] < 3: - _str_type = unicode - return ast.Str(s=_str_type(keyword), lineno=keyword.start_line, + return ast.Str(s=str_type(keyword), lineno=keyword.start_line, col_offset=keyword.start_column) @builds(HyDict) diff --git a/hy/models/keyword.py b/hy/models/keyword.py index e57d2f1..2d1d48b 100644 --- a/hy/models/keyword.py +++ b/hy/models/keyword.py @@ -20,20 +20,14 @@ from __future__ import unicode_literals from hy.models import HyObject -import sys +from hy.util import str_type -if sys.version_info[0] >= 3: - _str_type = str -else: - _str_type = unicode - - -class HyKeyword(HyObject, _str_type): +class HyKeyword(HyObject, str_type): """Generic Hy Keyword object. It's either a ``str`` or a ``unicode``, depending on the Python version. """ def __new__(cls, value): - obj = _str_type.__new__(cls, "\uFDD0" + value) + obj = str_type.__new__(cls, "\uFDD0" + value) return obj diff --git a/hy/models/string.py b/hy/models/string.py index a700470..ce0a238 100644 --- a/hy/models/string.py +++ b/hy/models/string.py @@ -19,13 +19,7 @@ # DEALINGS IN THE SOFTWARE. from hy.models import HyObject -import sys - - -if sys.version_info[0] >= 3: - str_type = str -else: - str_type = unicode +from hy.util import str_type class HyString(HyObject, str_type): diff --git a/hy/util.py b/hy/util.py index f2ffdf1..a600b5e 100644 --- a/hy/util.py +++ b/hy/util.py @@ -18,6 +18,14 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. +import sys + + +if sys.version_info[0] >= 3: + str_type = str +else: + str_type = unicode + def flatten_literal_list(entry): for e in entry: From d5db2840ad7a770e782364b78326432f978aa0ca Mon Sep 17 00:00:00 2001 From: Nicolas Dandrimont Date: Fri, 12 Apr 2013 20:41:29 +0200 Subject: [PATCH 39/62] Don't punycode pure unicode strings. --- hy/compiler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hy/compiler.py b/hy/compiler.py index ab635e9..2cffad1 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -944,7 +944,7 @@ class HyASTCompiler(object): @builds(HyString) def compile_string(self, string): - return ast.Str(s=ast_str(string), lineno=string.start_line, + return ast.Str(s=str_type(string), lineno=string.start_line, col_offset=string.start_column) @builds(HyKeyword) From 30c0b2551219013e58f4f1ec7e2b2a77d53f0ec7 Mon Sep 17 00:00:00 2001 From: Nicolas Dandrimont Date: Fri, 12 Apr 2013 20:58:20 +0200 Subject: [PATCH 40/62] Add a unicode string handling test --- tests/compilers/test_ast.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/compilers/test_ast.py b/tests/compilers/test_ast.py index 0bed73f..1f5a7f9 100644 --- a/tests/compilers/test_ast.py +++ b/tests/compilers/test_ast.py @@ -19,6 +19,9 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. +from __future__ import unicode_literals + +from hy import HyString from hy.compiler import hy_compile, HyCompileError from hy.lex import tokenize @@ -325,3 +328,21 @@ def test_ast_tuple(): """ Ensure tuples work. """ code = hy_compile(tokenize("(, 1 2 3)")).body[0].value assert type(code) == ast.Tuple + + +def test_ast_unicode_strings(): + """Ensure we handle unicode strings correctly""" + + def _compile_string(s): + hy_s = HyString(s) + hy_s.start_line = hy_s.end_line = 0 + hy_s.start_column = hy_s.end_column = 0 + + code = hy_compile([hy_s]) + + # code == ast.Module(body=[ast.Expr(value=ast.Str(s=xxx))]) + return code.body[0].value.s + + assert _compile_string("test") == "test" + assert _compile_string("\u03b1\u03b2") == "\u03b1\u03b2" + assert _compile_string("\xc3\xa9") == "\xc3\xa9" From 007173301978b5fcbd704efb1011df574a045e7e Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Fri, 12 Apr 2013 23:00:54 -0400 Subject: [PATCH 41/62] I've moved site to https://github.com/hylang/shyte --- site/.gitignore | 1 - site/Makefile | 48 - site/app.hy | 33 - site/coffee/Makefile | 18 - site/coffee/main.coffee | 73 - site/css/codemirror.css | 240 -- site/css/pygments.css | 61 - site/css/themes/ambiance-mobile.css | 6 - site/css/themes/ambiance.css | 76 - site/css/themes/blackboard.css | 25 - site/css/themes/cobalt.css | 18 - site/css/themes/eclipse.css | 25 - site/css/themes/elegant.css | 10 - site/css/themes/erlang-dark.css | 21 - site/css/themes/lesser-dark.css | 44 - site/css/themes/monokai.css | 28 - site/css/themes/neat.css | 9 - site/css/themes/night.css | 21 - site/css/themes/rubyblue.css | 21 - site/css/themes/solarized.css | 207 - site/css/themes/twilight.css | 26 - site/css/themes/vibrant-ink.css | 27 - site/css/themes/xq-dark.css | 46 - site/dependencies | 4 - site/devel.sh | 13 - site/imgs/xkcd.png | Bin 264169 -> 0 bytes site/js/codemirror.js | 5452 --------------------------- site/js/date.js | 104 - site/js/jquery-1.9.1.min.js | 5 - site/js/mode/clojure/clojure.js | 206 - site/js/mode/clojure/index.html | 67 - site/js/mode/python/LICENSE.txt | 21 - site/js/mode/python/index.html | 135 - site/js/mode/python/python.js | 340 -- site/less/Makefile | 21 - site/less/github.less | 53 - site/less/hy.less | 5 - site/less/layout.less | 85 - site/shim.py | 7 - site/templates/base.html | 21 - site/templates/index.html | 25 - site/templates/repl.html | 51 - 42 files changed, 7699 deletions(-) delete mode 100644 site/.gitignore delete mode 100644 site/Makefile delete mode 100644 site/app.hy delete mode 100644 site/coffee/Makefile delete mode 100644 site/coffee/main.coffee delete mode 100644 site/css/codemirror.css delete mode 100644 site/css/pygments.css delete mode 100644 site/css/themes/ambiance-mobile.css delete mode 100644 site/css/themes/ambiance.css delete mode 100644 site/css/themes/blackboard.css delete mode 100644 site/css/themes/cobalt.css delete mode 100644 site/css/themes/eclipse.css delete mode 100644 site/css/themes/elegant.css delete mode 100644 site/css/themes/erlang-dark.css delete mode 100644 site/css/themes/lesser-dark.css delete mode 100644 site/css/themes/monokai.css delete mode 100644 site/css/themes/neat.css delete mode 100644 site/css/themes/night.css delete mode 100644 site/css/themes/rubyblue.css delete mode 100644 site/css/themes/solarized.css delete mode 100644 site/css/themes/twilight.css delete mode 100644 site/css/themes/vibrant-ink.css delete mode 100644 site/css/themes/xq-dark.css delete mode 100644 site/dependencies delete mode 100755 site/devel.sh delete mode 100644 site/imgs/xkcd.png delete mode 100644 site/js/codemirror.js delete mode 100644 site/js/date.js delete mode 100644 site/js/jquery-1.9.1.min.js delete mode 100644 site/js/mode/clojure/clojure.js delete mode 100644 site/js/mode/clojure/index.html delete mode 100644 site/js/mode/python/LICENSE.txt delete mode 100644 site/js/mode/python/index.html delete mode 100644 site/js/mode/python/python.js delete mode 100644 site/less/Makefile delete mode 100644 site/less/github.less delete mode 100644 site/less/hy.less delete mode 100644 site/less/layout.less delete mode 100644 site/shim.py delete mode 100644 site/templates/base.html delete mode 100644 site/templates/index.html delete mode 100644 site/templates/repl.html diff --git a/site/.gitignore b/site/.gitignore deleted file mode 100644 index 980c851..0000000 --- a/site/.gitignore +++ /dev/null @@ -1 +0,0 @@ -static/ diff --git a/site/Makefile b/site/Makefile deleted file mode 100644 index e043374..0000000 --- a/site/Makefile +++ /dev/null @@ -1,48 +0,0 @@ -STATIC = static -STATIC_CSS = $(STATIC)/css -STATIC_JS = $(STATIC)/js - - -all: hello deps build - - -hello: - @cowsay 'Welcome to Hy!' - - -build: clean css js - - -css: less - cp -rv css/* $(STATIC_CSS) - - -js: coffee - cp -rv js/* $(STATIC_JS) - - -less: - make -C less - mv -v less/*css $(STATIC_CSS) - - -coffee: - make -C coffee - mv -v coffee/*js $(STATIC_JS) - - -clean: - rm -fr $(STATIC_CSS) $(STATIC_JS) - mkdir -p $(STATIC_CSS) $(STATIC_JS) - - -devel: - @./devel.sh - -deps: - set -e; for x in $(shell cat dependencies); do \ - echo "Checking for dependency: $$x"; \ - dpkg-query -s $$x >/dev/null 2>&1; \ - done; - -.PHONY: build clean less coffee devel diff --git a/site/app.hy b/site/app.hy deleted file mode 100644 index 77ada57..0000000 --- a/site/app.hy +++ /dev/null @@ -1,33 +0,0 @@ -; Copyright (c) Paul R. Tagliamonte , 2013 under the terms of -; hy. - -(import-from flask - Flask render-template request make-response) - -(import-from hy.errors HyError) -(import-from hy.lex LexException) -(import-from hy.importer import-string-to-ast) - -(import astor.codegen) -(import autopep8) - - -(setv app (Flask "__main__")) ; long story, needed hack - - -(defn hy-to-py [hython] - (.fix-string autopep8 - (.to_source astor.codegen (import-string-to-ast hython)))) - -(defn err [msg] (make-response msg 500)) - - -; view routes -(route index "/" [] (render-template "repl.html")) - -(post-route hy2py "/hy2py" [] - (try - (hy-to-py (get request.form "code")) - (catch [e LexException] (err "Incomplete Code.")) - (catch [e HyError] (err "Generic error during processing.")) - (catch [e Exception] (err "Erm, you broke something.")))) diff --git a/site/coffee/Makefile b/site/coffee/Makefile deleted file mode 100644 index a276b08..0000000 --- a/site/coffee/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -.SUFFIXES: -.SUFFIXES: .coffee .js - -COFFEE_SCRIPTS = main.js - - -all: build - - -build: $(COFFEE_SCRIPTS) - - -.coffee.js: - coffee -c $< - uglifyjs --no-copyright --overwrite $@ - - -.PHONY: build diff --git a/site/coffee/main.coffee b/site/coffee/main.coffee deleted file mode 100644 index 4974df8..0000000 --- a/site/coffee/main.coffee +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright (c) 2012 Paul Tagliamonte -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the "Software"), -# to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, -# and/or sell copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -theme = "elegant" - -HyCodeMirror = CodeMirror.fromTextArea($('#hython-target')[0], { - mode: "clojure", - theme: theme, - autofocus: true, -}) - -PyCodeMirror = CodeMirror($('#python-repl')[0], { - mode: "python", - theme: theme, - readOnly: true, -}) - -PyCodeMirror.setSize("100%", "100%") -HyCodeMirror.setSize("100%", "100%") - -reload = -> - input = HyCodeMirror.getValue() - format = "h:mm:ss" - $.ajax({ - url: "/hy2py", - type: "POST", - data: {'code': input}, - success: (result) -> - PyCodeMirror.setValue(result) - now = Date.parse("now").toString(format) - $("#build-msgs").prepend(now + " updated.
") - $("#repl-root").removeClass("error") - $("#repl-root").addClass("ok") - statusCode: { - 500: (response) -> - now = Date.parse("now").toString(format) - $("#build-msgs").prepend(now + " " + response.responseText + "
") - $("#repl-root").removeClass("ok") - $("#repl-root").addClass("error") - } - }) - - -$(document).ready(-> - count = 0 - - HyCodeMirror.on("change", (instance, cob) -> - count += 1 - curcount = count - window.setTimeout(-> - if curcount == count - reload() - , 500) - ) - reload() -) diff --git a/site/css/codemirror.css b/site/css/codemirror.css deleted file mode 100644 index e36fbeb..0000000 --- a/site/css/codemirror.css +++ /dev/null @@ -1,240 +0,0 @@ -/* BASICS */ - -.CodeMirror { - /* Set height, width, borders, and global font properties here */ - font-family: monospace; - height: 300px; -} -.CodeMirror-scroll { - /* Set scrolling behaviour here */ - overflow: auto; -} - -/* PADDING */ - -.CodeMirror-lines { - padding: 4px 0; /* Vertical padding around content */ -} -.CodeMirror pre { - padding: 0 4px; /* Horizontal padding of content */ -} - -.CodeMirror-scrollbar-filler { - background-color: white; /* The little square between H and V scrollbars */ -} - -/* GUTTER */ - -.CodeMirror-gutters { - border-right: 1px solid #ddd; - background-color: #f7f7f7; -} -.CodeMirror-linenumbers {} -.CodeMirror-linenumber { - padding: 0 3px 0 5px; - min-width: 20px; - text-align: right; - color: #999; -} - -/* CURSOR */ - -.CodeMirror div.CodeMirror-cursor { - border-left: 1px solid black; - z-index: 3; -} -/* Shown when moving in bi-directional text */ -.CodeMirror div.CodeMirror-secondarycursor { - border-left: 1px solid silver; -} -.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor { - width: auto; - border: 0; - background: #7e7; - z-index: 1; -} -/* Can style cursor different in overwrite (non-insert) mode */ -.CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {} - -/* DEFAULT THEME */ - -.cm-s-default .cm-keyword {color: #708;} -.cm-s-default .cm-atom {color: #219;} -.cm-s-default .cm-number {color: #164;} -.cm-s-default .cm-def {color: #00f;} -.cm-s-default .cm-variable {color: black;} -.cm-s-default .cm-variable-2 {color: #05a;} -.cm-s-default .cm-variable-3 {color: #085;} -.cm-s-default .cm-property {color: black;} -.cm-s-default .cm-operator {color: black;} -.cm-s-default .cm-comment {color: #a50;} -.cm-s-default .cm-string {color: #a11;} -.cm-s-default .cm-string-2 {color: #f50;} -.cm-s-default .cm-meta {color: #555;} -.cm-s-default .cm-error {color: #f00;} -.cm-s-default .cm-qualifier {color: #555;} -.cm-s-default .cm-builtin {color: #30a;} -.cm-s-default .cm-bracket {color: #997;} -.cm-s-default .cm-tag {color: #170;} -.cm-s-default .cm-attribute {color: #00c;} -.cm-s-default .cm-header {color: blue;} -.cm-s-default .cm-quote {color: #090;} -.cm-s-default .cm-hr {color: #999;} -.cm-s-default .cm-link {color: #00c;} - -.cm-negative {color: #d44;} -.cm-positive {color: #292;} -.cm-header, .cm-strong {font-weight: bold;} -.cm-em {font-style: italic;} -.cm-link {text-decoration: underline;} - -.cm-invalidchar {color: #f00;} - -div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} -div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} - -/* STOP */ - -/* The rest of this file contains styles related to the mechanics of - the editor. You probably shouldn't touch them. */ - -.CodeMirror { - line-height: 1; - position: relative; - overflow: hidden; -} - -.CodeMirror-scroll { - /* 30px is the magic margin used to hide the element's real scrollbars */ - /* See overflow: hidden in .CodeMirror, and the paddings in .CodeMirror-sizer */ - margin-bottom: -30px; margin-right: -30px; - padding-bottom: 30px; padding-right: 30px; - height: 100%; - outline: none; /* Prevent dragging from highlighting the element */ - position: relative; -} -.CodeMirror-sizer { - position: relative; -} - -/* The fake, visible scrollbars. Used to force redraw during scrolling - before actuall scrolling happens, thus preventing shaking and - flickering artifacts. */ -.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler { - position: absolute; - z-index: 6; - display: none; -} -.CodeMirror-vscrollbar { - right: 0; top: 0; - overflow-x: hidden; - overflow-y: scroll; -} -.CodeMirror-hscrollbar { - bottom: 0; left: 0; - overflow-y: hidden; - overflow-x: scroll; -} -.CodeMirror-scrollbar-filler { - right: 0; bottom: 0; - z-index: 6; -} - -.CodeMirror-gutters { - position: absolute; left: 0; top: 0; - height: 100%; - padding-bottom: 30px; - z-index: 3; -} -.CodeMirror-gutter { - height: 100%; - display: inline-block; - /* Hack to make IE7 behave */ - *zoom:1; - *display:inline; -} -.CodeMirror-gutter-elt { - position: absolute; - cursor: default; - z-index: 4; -} - -.CodeMirror-lines { - cursor: text; -} -.CodeMirror pre { - /* Reset some styles that the rest of the page might have set */ - -moz-border-radius: 0; -webkit-border-radius: 0; -o-border-radius: 0; border-radius: 0; - border-width: 0; - background: transparent; - font-family: inherit; - font-size: inherit; - margin: 0; - white-space: pre; - word-wrap: normal; - line-height: inherit; - color: inherit; - z-index: 2; - position: relative; - overflow: visible; -} -.CodeMirror-wrap pre { - word-wrap: break-word; - white-space: pre-wrap; - word-break: normal; -} -.CodeMirror-linebackground { - position: absolute; - left: 0; right: 0; top: 0; bottom: 0; - z-index: 0; -} - -.CodeMirror-linewidget { - position: relative; - z-index: 2; - overflow: auto; -} - -.CodeMirror-widget { - display: inline-block; -} - -.CodeMirror-wrap .CodeMirror-scroll { - overflow-x: hidden; -} - -.CodeMirror-measure { - position: absolute; - width: 100%; height: 0px; - overflow: hidden; - visibility: hidden; -} -.CodeMirror-measure pre { position: static; } - -.CodeMirror div.CodeMirror-cursor { - position: absolute; - visibility: hidden; - border-right: none; - width: 0; -} -.CodeMirror-focused div.CodeMirror-cursor { - visibility: visible; -} - -.CodeMirror-selected { background: #d9d9d9; } -.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } - -.cm-searching { - background: #ffa; - background: rgba(255, 255, 0, .4); -} - -/* IE7 hack to prevent it from returning funny offsetTops on the spans */ -.CodeMirror span { *vertical-align: text-bottom; } - -@media print { - /* Hide the cursor when printing */ - .CodeMirror div.CodeMirror-cursor { - visibility: hidden; - } -} diff --git a/site/css/pygments.css b/site/css/pygments.css deleted file mode 100644 index 122b429..0000000 --- a/site/css/pygments.css +++ /dev/null @@ -1,61 +0,0 @@ -.hll { background-color: #ffffcc } -.c { color: #408080; font-style: italic } /* Comment */ -.err { border: 1px solid #FF0000 } /* Error */ -.k { color: #008000; font-weight: bold } /* Keyword */ -.o { color: #666666 } /* Operator */ -.cm { color: #408080; font-style: italic } /* Comment.Multiline */ -.cp { color: #BC7A00 } /* Comment.Preproc */ -.c1 { color: #408080; font-style: italic } /* Comment.Single */ -.cs { color: #408080; font-style: italic } /* Comment.Special */ -.gd { color: #A00000 } /* Generic.Deleted */ -.ge { font-style: italic } /* Generic.Emph */ -.gr { color: #FF0000 } /* Generic.Error */ -.gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.gi { color: #00A000 } /* Generic.Inserted */ -.go { color: #808080 } /* Generic.Output */ -.gp { color: #000080; font-weight: bold } /* Generic.Prompt */ -.gs { font-weight: bold } /* Generic.Strong */ -.gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.gt { color: #0040D0 } /* Generic.Traceback */ -.kc { color: #008000; font-weight: bold } /* Keyword.Constant */ -.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ -.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ -.kp { color: #008000 } /* Keyword.Pseudo */ -.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ -.kt { color: #B00040 } /* Keyword.Type */ -.m { color: #666666 } /* Literal.Number */ -.s { color: #BA2121 } /* Literal.String */ -.na { color: #7D9029 } /* Name.Attribute */ -.nb { color: #008000 } /* Name.Builtin */ -.nc { color: #0000FF; font-weight: bold } /* Name.Class */ -.no { color: #880000 } /* Name.Constant */ -.nd { color: #AA22FF } /* Name.Decorator */ -.ni { color: #999999; font-weight: bold } /* Name.Entity */ -.ne { color: #D2413A; font-weight: bold } /* Name.Exception */ -.nf { color: #0000FF } /* Name.Function */ -.nl { color: #A0A000 } /* Name.Label */ -.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ -.nt { color: #008000; font-weight: bold } /* Name.Tag */ -.nv { color: #19177C } /* Name.Variable */ -.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ -.w { color: #bbbbbb } /* Text.Whitespace */ -.mf { color: #666666 } /* Literal.Number.Float */ -.mh { color: #666666 } /* Literal.Number.Hex */ -.mi { color: #666666 } /* Literal.Number.Integer */ -.mo { color: #666666 } /* Literal.Number.Oct */ -.sb { color: #BA2121 } /* Literal.String.Backtick */ -.sc { color: #BA2121 } /* Literal.String.Char */ -.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ -.s2 { color: #BA2121 } /* Literal.String.Double */ -.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ -.sh { color: #BA2121 } /* Literal.String.Heredoc */ -.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ -.sx { color: #008000 } /* Literal.String.Other */ -.sr { color: #BB6688 } /* Literal.String.Regex */ -.s1 { color: #BA2121 } /* Literal.String.Single */ -.ss { color: #19177C } /* Literal.String.Symbol */ -.bp { color: #008000 } /* Name.Builtin.Pseudo */ -.vc { color: #19177C } /* Name.Variable.Class */ -.vg { color: #19177C } /* Name.Variable.Global */ -.vi { color: #19177C } /* Name.Variable.Instance */ -.il { color: #666666 } /* Literal.Number.Integer.Long */ diff --git a/site/css/themes/ambiance-mobile.css b/site/css/themes/ambiance-mobile.css deleted file mode 100644 index 35b3750..0000000 --- a/site/css/themes/ambiance-mobile.css +++ /dev/null @@ -1,6 +0,0 @@ -.cm-s-ambiance.CodeMirror { - -webkit-box-shadow: none; - -moz-box-shadow: none; - -o-box-shadow: none; - box-shadow: none; -} diff --git a/site/css/themes/ambiance.css b/site/css/themes/ambiance.css deleted file mode 100644 index beec553..0000000 --- a/site/css/themes/ambiance.css +++ /dev/null @@ -1,76 +0,0 @@ -/* ambiance theme for codemirror */ - -/* Color scheme */ - -.cm-s-ambiance .cm-keyword { color: #cda869; } -.cm-s-ambiance .cm-atom { color: #CF7EA9; } -.cm-s-ambiance .cm-number { color: #78CF8A; } -.cm-s-ambiance .cm-def { color: #aac6e3; } -.cm-s-ambiance .cm-variable { color: #ffb795; } -.cm-s-ambiance .cm-variable-2 { color: #eed1b3; } -.cm-s-ambiance .cm-variable-3 { color: #faded3; } -.cm-s-ambiance .cm-property { color: #eed1b3; } -.cm-s-ambiance .cm-operator {color: #fa8d6a;} -.cm-s-ambiance .cm-comment { color: #555; font-style:italic; } -.cm-s-ambiance .cm-string { color: #8f9d6a; } -.cm-s-ambiance .cm-string-2 { color: #9d937c; } -.cm-s-ambiance .cm-meta { color: #D2A8A1; } -.cm-s-ambiance .cm-error { color: #AF2018; } -.cm-s-ambiance .cm-qualifier { color: yellow; } -.cm-s-ambiance .cm-builtin { color: #9999cc; } -.cm-s-ambiance .cm-bracket { color: #24C2C7; } -.cm-s-ambiance .cm-tag { color: #fee4ff } -.cm-s-ambiance .cm-attribute { color: #9B859D; } -.cm-s-ambiance .cm-header {color: blue;} -.cm-s-ambiance .cm-quote { color: #24C2C7; } -.cm-s-ambiance .cm-hr { color: pink; } -.cm-s-ambiance .cm-link { color: #F4C20B; } -.cm-s-ambiance .cm-special { color: #FF9D00; } - -.cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; } -.cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; } - -.cm-s-ambiance .CodeMirror-selected { - background: rgba(255, 255, 255, 0.15); -} -.cm-s-ambiance .CodeMirror-focused .CodeMirror-selected { - background: rgba(255, 255, 255, 0.10); -} - -/* Editor styling */ - -.cm-s-ambiance.CodeMirror { - line-height: 1.40em; - font-family: Monaco, Menlo,"Andale Mono","lucida console","Courier New",monospace !important; - color: #E6E1DC; - background-color: #202020; - -webkit-box-shadow: inset 0 0 10px black; - -moz-box-shadow: inset 0 0 10px black; - -o-box-shadow: inset 0 0 10px black; - box-shadow: inset 0 0 10px black; -} - -.cm-s-ambiance .CodeMirror-gutters { - background: #3D3D3D; - border-right: 1px solid #4D4D4D; - box-shadow: 0 10px 20px black; -} - -.cm-s-ambiance .CodeMirror-linenumber { - text-shadow: 0px 1px 1px #4d4d4d; - color: #222; - padding: 0 5px; -} - -.cm-s-ambiance .CodeMirror-lines .CodeMirror-cursor { - border-left: 1px solid #7991E8; -} - -.cm-s-ambiance .activeline { - background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031); -} - -.cm-s-ambiance.CodeMirror, -.cm-s-ambiance .CodeMirror-gutters { - background-image: url("data:image/png;base64,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"); -} diff --git a/site/css/themes/blackboard.css b/site/css/themes/blackboard.css deleted file mode 100644 index f2bde69..0000000 --- a/site/css/themes/blackboard.css +++ /dev/null @@ -1,25 +0,0 @@ -/* Port of TextMate's Blackboard theme */ - -.cm-s-blackboard.CodeMirror { background: #0C1021; color: #F8F8F8; } -.cm-s-blackboard .CodeMirror-selected { background: #253B76 !important; } -.cm-s-blackboard .CodeMirror-gutters { background: #0C1021; border-right: 0; } -.cm-s-blackboard .CodeMirror-linenumber { color: #888; } -.cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; } - -.cm-s-blackboard .cm-keyword { color: #FBDE2D; } -.cm-s-blackboard .cm-atom { color: #D8FA3C; } -.cm-s-blackboard .cm-number { color: #D8FA3C; } -.cm-s-blackboard .cm-def { color: #8DA6CE; } -.cm-s-blackboard .cm-variable { color: #FF6400; } -.cm-s-blackboard .cm-operator { color: #FBDE2D;} -.cm-s-blackboard .cm-comment { color: #AEAEAE; } -.cm-s-blackboard .cm-string { color: #61CE3C; } -.cm-s-blackboard .cm-string-2 { color: #61CE3C; } -.cm-s-blackboard .cm-meta { color: #D8FA3C; } -.cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; } -.cm-s-blackboard .cm-builtin { color: #8DA6CE; } -.cm-s-blackboard .cm-tag { color: #8DA6CE; } -.cm-s-blackboard .cm-attribute { color: #8DA6CE; } -.cm-s-blackboard .cm-header { color: #FF6400; } -.cm-s-blackboard .cm-hr { color: #AEAEAE; } -.cm-s-blackboard .cm-link { color: #8DA6CE; } diff --git a/site/css/themes/cobalt.css b/site/css/themes/cobalt.css deleted file mode 100644 index 6095799..0000000 --- a/site/css/themes/cobalt.css +++ /dev/null @@ -1,18 +0,0 @@ -.cm-s-cobalt.CodeMirror { background: #002240; color: white; } -.cm-s-cobalt div.CodeMirror-selected { background: #b36539 !important; } -.cm-s-cobalt .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } -.cm-s-cobalt .CodeMirror-linenumber { color: #d0d0d0; } -.cm-s-cobalt .CodeMirror-cursor { border-left: 1px solid white !important; } - -.cm-s-cobalt span.cm-comment { color: #08f; } -.cm-s-cobalt span.cm-atom { color: #845dc4; } -.cm-s-cobalt span.cm-number, .cm-s-cobalt span.cm-attribute { color: #ff80e1; } -.cm-s-cobalt span.cm-keyword { color: #ffee80; } -.cm-s-cobalt span.cm-string { color: #3ad900; } -.cm-s-cobalt span.cm-meta { color: #ff9d00; } -.cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; } -.cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def { color: white; } -.cm-s-cobalt span.cm-error { color: #9d1e15; } -.cm-s-cobalt span.cm-bracket { color: #d8d8d8; } -.cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; } -.cm-s-cobalt span.cm-link { color: #845dc4; } diff --git a/site/css/themes/eclipse.css b/site/css/themes/eclipse.css deleted file mode 100644 index 4807e45..0000000 --- a/site/css/themes/eclipse.css +++ /dev/null @@ -1,25 +0,0 @@ -.cm-s-eclipse span.cm-meta {color: #FF1717;} -.cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; } -.cm-s-eclipse span.cm-atom {color: #219;} -.cm-s-eclipse span.cm-number {color: #164;} -.cm-s-eclipse span.cm-def {color: #00f;} -.cm-s-eclipse span.cm-variable {color: black;} -.cm-s-eclipse span.cm-variable-2 {color: #0000C0;} -.cm-s-eclipse span.cm-variable-3 {color: #0000C0;} -.cm-s-eclipse span.cm-property {color: black;} -.cm-s-eclipse span.cm-operator {color: black;} -.cm-s-eclipse span.cm-comment {color: #3F7F5F;} -.cm-s-eclipse span.cm-string {color: #2A00FF;} -.cm-s-eclipse span.cm-string-2 {color: #f50;} -.cm-s-eclipse span.cm-error {color: #f00;} -.cm-s-eclipse span.cm-qualifier {color: #555;} -.cm-s-eclipse span.cm-builtin {color: #30a;} -.cm-s-eclipse span.cm-bracket {color: #cc7;} -.cm-s-eclipse span.cm-tag {color: #170;} -.cm-s-eclipse span.cm-attribute {color: #00c;} -.cm-s-eclipse span.cm-link {color: #219;} - -.cm-s-eclipse .CodeMirror-matchingbracket { - outline:1px solid grey; - color:black !important;; -} diff --git a/site/css/themes/elegant.css b/site/css/themes/elegant.css deleted file mode 100644 index d0ce0cb..0000000 --- a/site/css/themes/elegant.css +++ /dev/null @@ -1,10 +0,0 @@ -.cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom {color: #762;} -.cm-s-elegant span.cm-comment {color: #262; font-style: italic; line-height: 1em;} -.cm-s-elegant span.cm-meta {color: #555; font-style: italic; line-height: 1em;} -.cm-s-elegant span.cm-variable {color: black;} -.cm-s-elegant span.cm-variable-2 {color: #b11;} -.cm-s-elegant span.cm-qualifier {color: #555;} -.cm-s-elegant span.cm-keyword {color: #730;} -.cm-s-elegant span.cm-builtin {color: #30a;} -.cm-s-elegant span.cm-error {background-color: #fdd;} -.cm-s-elegant span.cm-link {color: #762;} diff --git a/site/css/themes/erlang-dark.css b/site/css/themes/erlang-dark.css deleted file mode 100644 index ea9c26c..0000000 --- a/site/css/themes/erlang-dark.css +++ /dev/null @@ -1,21 +0,0 @@ -.cm-s-erlang-dark.CodeMirror { background: #002240; color: white; } -.cm-s-erlang-dark div.CodeMirror-selected { background: #b36539 !important; } -.cm-s-erlang-dark .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } -.cm-s-erlang-dark .CodeMirror-linenumber { color: #d0d0d0; } -.cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white !important; } - -.cm-s-erlang-dark span.cm-atom { color: #845dc4; } -.cm-s-erlang-dark span.cm-attribute { color: #ff80e1; } -.cm-s-erlang-dark span.cm-bracket { color: #ff9d00; } -.cm-s-erlang-dark span.cm-builtin { color: #eeaaaa; } -.cm-s-erlang-dark span.cm-comment { color: #7777ff; } -.cm-s-erlang-dark span.cm-def { color: #ee77aa; } -.cm-s-erlang-dark span.cm-error { color: #9d1e15; } -.cm-s-erlang-dark span.cm-keyword { color: #ffee80; } -.cm-s-erlang-dark span.cm-meta { color: #50fefe; } -.cm-s-erlang-dark span.cm-number { color: #ffd0d0; } -.cm-s-erlang-dark span.cm-operator { color: #dd1111; } -.cm-s-erlang-dark span.cm-string { color: #3ad900; } -.cm-s-erlang-dark span.cm-tag { color: #9effff; } -.cm-s-erlang-dark span.cm-variable { color: #50fe50; } -.cm-s-erlang-dark span.cm-variable-2 { color: #ee00ee; } diff --git a/site/css/themes/lesser-dark.css b/site/css/themes/lesser-dark.css deleted file mode 100644 index 67f71ad..0000000 --- a/site/css/themes/lesser-dark.css +++ /dev/null @@ -1,44 +0,0 @@ -/* -http://lesscss.org/ dark theme -Ported to CodeMirror by Peter Kroon -*/ -.cm-s-lesser-dark { - line-height: 1.3em; -} -.cm-s-lesser-dark { - font-family: 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Monaco', Courier, monospace !important; -} - -.cm-s-lesser-dark.CodeMirror { background: #262626; color: #EBEFE7; text-shadow: 0 -1px 1px #262626; } -.cm-s-lesser-dark div.CodeMirror-selected {background: #45443B !important;} /* 33322B*/ -.cm-s-lesser-dark .CodeMirror-cursor { border-left: 1px solid white !important; } -.cm-s-lesser-dark pre { padding: 0 8px; }/*editable code holder*/ - -div.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/ - -.cm-s-lesser-dark .CodeMirror-gutters { background: #262626; border-right:1px solid #aaa; } -.cm-s-lesser-dark .CodeMirror-linenumber { color: #777; } - -.cm-s-lesser-dark span.cm-keyword { color: #599eff; } -.cm-s-lesser-dark span.cm-atom { color: #C2B470; } -.cm-s-lesser-dark span.cm-number { color: #B35E4D; } -.cm-s-lesser-dark span.cm-def {color: white;} -.cm-s-lesser-dark span.cm-variable { color:#D9BF8C; } -.cm-s-lesser-dark span.cm-variable-2 { color: #669199; } -.cm-s-lesser-dark span.cm-variable-3 { color: white; } -.cm-s-lesser-dark span.cm-property {color: #92A75C;} -.cm-s-lesser-dark span.cm-operator {color: #92A75C;} -.cm-s-lesser-dark span.cm-comment { color: #666; } -.cm-s-lesser-dark span.cm-string { color: #BCD279; } -.cm-s-lesser-dark span.cm-string-2 {color: #f50;} -.cm-s-lesser-dark span.cm-meta { color: #738C73; } -.cm-s-lesser-dark span.cm-error { color: #9d1e15; } -.cm-s-lesser-dark span.cm-qualifier {color: #555;} -.cm-s-lesser-dark span.cm-builtin { color: #ff9e59; } -.cm-s-lesser-dark span.cm-bracket { color: #EBEFE7; } -.cm-s-lesser-dark span.cm-tag { color: #669199; } -.cm-s-lesser-dark span.cm-attribute {color: #00c;} -.cm-s-lesser-dark span.cm-header {color: #a0a;} -.cm-s-lesser-dark span.cm-quote {color: #090;} -.cm-s-lesser-dark span.cm-hr {color: #999;} -.cm-s-lesser-dark span.cm-link {color: #00c;} diff --git a/site/css/themes/monokai.css b/site/css/themes/monokai.css deleted file mode 100644 index a0b3c7c..0000000 --- a/site/css/themes/monokai.css +++ /dev/null @@ -1,28 +0,0 @@ -/* Based on Sublime Text's Monokai theme */ - -.cm-s-monokai.CodeMirror {background: #272822; color: #f8f8f2;} -.cm-s-monokai div.CodeMirror-selected {background: #49483E !important;} -.cm-s-monokai .CodeMirror-gutters {background: #272822; border-right: 0px;} -.cm-s-monokai .CodeMirror-linenumber {color: #d0d0d0;} -.cm-s-monokai .CodeMirror-cursor {border-left: 1px solid #f8f8f0 !important;} - -.cm-s-monokai span.cm-comment {color: #75715e;} -.cm-s-monokai span.cm-atom {color: #ae81ff;} -.cm-s-monokai span.cm-number {color: #ae81ff;} - -.cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute {color: #a6e22e;} -.cm-s-monokai span.cm-keyword {color: #f92672;} -.cm-s-monokai span.cm-string {color: #e6db74;} - -.cm-s-monokai span.cm-variable {color: #a6e22e;} -.cm-s-monokai span.cm-variable-2 {color: #9effff;} -.cm-s-monokai span.cm-def {color: #fd971f;} -.cm-s-monokai span.cm-error {background: #f92672; color: #f8f8f0;} -.cm-s-monokai span.cm-bracket {color: #f8f8f2;} -.cm-s-monokai span.cm-tag {color: #f92672;} -.cm-s-monokai span.cm-link {color: #ae81ff;} - -.cm-s-monokai .CodeMirror-matchingbracket { - text-decoration: underline; - color: white !important; -} diff --git a/site/css/themes/neat.css b/site/css/themes/neat.css deleted file mode 100644 index 8a307f8..0000000 --- a/site/css/themes/neat.css +++ /dev/null @@ -1,9 +0,0 @@ -.cm-s-neat span.cm-comment { color: #a86; } -.cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; } -.cm-s-neat span.cm-string { color: #a22; } -.cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; } -.cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; } -.cm-s-neat span.cm-variable { color: black; } -.cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; } -.cm-s-neat span.cm-meta {color: #555;} -.cm-s-neat span.cm-link { color: #3a3; } diff --git a/site/css/themes/night.css b/site/css/themes/night.css deleted file mode 100644 index 8804a39..0000000 --- a/site/css/themes/night.css +++ /dev/null @@ -1,21 +0,0 @@ -/* Loosely based on the Midnight Textmate theme */ - -.cm-s-night.CodeMirror { background: #0a001f; color: #f8f8f8; } -.cm-s-night div.CodeMirror-selected { background: #447 !important; } -.cm-s-night .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } -.cm-s-night .CodeMirror-linenumber { color: #f8f8f8; } -.cm-s-night .CodeMirror-cursor { border-left: 1px solid white !important; } - -.cm-s-night span.cm-comment { color: #6900a1; } -.cm-s-night span.cm-atom { color: #845dc4; } -.cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; } -.cm-s-night span.cm-keyword { color: #599eff; } -.cm-s-night span.cm-string { color: #37f14a; } -.cm-s-night span.cm-meta { color: #7678e2; } -.cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; } -.cm-s-night span.cm-variable-3, .cm-s-night span.cm-def { color: white; } -.cm-s-night span.cm-error { color: #9d1e15; } -.cm-s-night span.cm-bracket { color: #8da6ce; } -.cm-s-night span.cm-comment { color: #6900a1; } -.cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; } -.cm-s-night span.cm-link { color: #845dc4; } diff --git a/site/css/themes/rubyblue.css b/site/css/themes/rubyblue.css deleted file mode 100644 index 8817de0..0000000 --- a/site/css/themes/rubyblue.css +++ /dev/null @@ -1,21 +0,0 @@ -.cm-s-rubyblue { font:13px/1.4em Trebuchet, Verdana, sans-serif; } /* - customized editor font - */ - -.cm-s-rubyblue.CodeMirror { background: #112435; color: white; } -.cm-s-rubyblue div.CodeMirror-selected { background: #38566F !important; } -.cm-s-rubyblue .CodeMirror-gutters { background: #1F4661; border-right: 7px solid #3E7087; } -.cm-s-rubyblue .CodeMirror-linenumber { color: white; } -.cm-s-rubyblue .CodeMirror-cursor { border-left: 1px solid white !important; } - -.cm-s-rubyblue span.cm-comment { color: #999; font-style:italic; line-height: 1em; } -.cm-s-rubyblue span.cm-atom { color: #F4C20B; } -.cm-s-rubyblue span.cm-number, .cm-s-rubyblue span.cm-attribute { color: #82C6E0; } -.cm-s-rubyblue span.cm-keyword { color: #F0F; } -.cm-s-rubyblue span.cm-string { color: #F08047; } -.cm-s-rubyblue span.cm-meta { color: #F0F; } -.cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; } -.cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def { color: white; } -.cm-s-rubyblue span.cm-error { color: #AF2018; } -.cm-s-rubyblue span.cm-bracket { color: #F0F; } -.cm-s-rubyblue span.cm-link { color: #F4C20B; } -.cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; } -.cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; } diff --git a/site/css/themes/solarized.css b/site/css/themes/solarized.css deleted file mode 100644 index 06a6c7f..0000000 --- a/site/css/themes/solarized.css +++ /dev/null @@ -1,207 +0,0 @@ -/* -Solarized theme for code-mirror -http://ethanschoonover.com/solarized -*/ - -/* -Solarized color pallet -http://ethanschoonover.com/solarized/img/solarized-palette.png -*/ - -.solarized.base03 { color: #002b36; } -.solarized.base02 { color: #073642; } -.solarized.base01 { color: #586e75; } -.solarized.base00 { color: #657b83; } -.solarized.base0 { color: #839496; } -.solarized.base1 { color: #93a1a1; } -.solarized.base2 { color: #eee8d5; } -.solarized.base3 { color: #fdf6e3; } -.solarized.solar-yellow { color: #b58900; } -.solarized.solar-orange { color: #cb4b16; } -.solarized.solar-red { color: #dc322f; } -.solarized.solar-magenta { color: #d33682; } -.solarized.solar-violet { color: #6c71c4; } -.solarized.solar-blue { color: #268bd2; } -.solarized.solar-cyan { color: #2aa198; } -.solarized.solar-green { color: #859900; } - -/* Color scheme for code-mirror */ - -.cm-s-solarized { - line-height: 1.45em; - font-family: Menlo,Monaco,"Andale Mono","lucida console","Courier New",monospace !important; - color-profile: sRGB; - rendering-intent: auto; -} -.cm-s-solarized.cm-s-dark { - color: #839496; - background-color: #002b36; - text-shadow: #002b36 0 1px; -} -.cm-s-solarized.cm-s-light { - background-color: #fdf6e3; - color: #657b83; - text-shadow: #eee8d5 0 1px; -} - -.cm-s-solarized .CodeMirror-widget { - text-shadow: none; -} - - -.cm-s-solarized .cm-keyword { color: #cb4b16 } -.cm-s-solarized .cm-atom { color: #d33682; } -.cm-s-solarized .cm-number { color: #d33682; } -.cm-s-solarized .cm-def { color: #2aa198; } - -.cm-s-solarized .cm-variable { color: #268bd2; } -.cm-s-solarized .cm-variable-2 { color: #b58900; } -.cm-s-solarized .cm-variable-3 { color: #6c71c4; } - -.cm-s-solarized .cm-property { color: #2aa198; } -.cm-s-solarized .cm-operator {color: #6c71c4;} - -.cm-s-solarized .cm-comment { color: #586e75; font-style:italic; } - -.cm-s-solarized .cm-string { color: #859900; } -.cm-s-solarized .cm-string-2 { color: #b58900; } - -.cm-s-solarized .cm-meta { color: #859900; } -.cm-s-solarized .cm-error, -.cm-s-solarized .cm-invalidchar { - color: #586e75; - border-bottom: 1px dotted #dc322f; -} -.cm-s-solarized .cm-qualifier { color: #b58900; } -.cm-s-solarized .cm-builtin { color: #d33682; } -.cm-s-solarized .cm-bracket { color: #cb4b16; } -.cm-s-solarized .CodeMirror-matchingbracket { color: #859900; } -.cm-s-solarized .CodeMirror-nonmatchingbracket { color: #dc322f; } -.cm-s-solarized .cm-tag { color: #93a1a1 } -.cm-s-solarized .cm-attribute { color: #2aa198; } -.cm-s-solarized .cm-header { color: #586e75; } -.cm-s-solarized .cm-quote { color: #93a1a1; } -.cm-s-solarized .cm-hr { - color: transparent; - border-top: 1px solid #586e75; - display: block; -} -.cm-s-solarized .cm-link { color: #93a1a1; cursor: pointer; } -.cm-s-solarized .cm-special { color: #6c71c4; } -.cm-s-solarized .cm-em { - color: #999; - text-decoration: underline; - text-decoration-style: dotted; -} -.cm-s-solarized .cm-strong { color: #eee; } -.cm-s-solarized .cm-tab:before { - content: "➤"; /*visualize tab character*/ - color: #586e75; -} - -.cm-s-solarized.cm-s-dark .CodeMirror-focused .CodeMirror-selected { - background: #386774; - color: inherit; -} - -.cm-s-solarized.cm-s-dark ::selection { - background: #386774; - color: inherit; -} - -.cm-s-solarized.cm-s-dark .CodeMirror-selected { - background: #586e75; -} - -.cm-s-solarized.cm-s-light .CodeMirror-focused .CodeMirror-selected { - background: #eee8d5; - color: inherit; -} - -.cm-s-solarized.cm-s-light ::selection { - background: #eee8d5; - color: inherit; -} - -.cm-s-solarized.cm-s-light .CodeMirror-selected { - background: #93a1a1; -} - - - -/* Editor styling */ - - - -/* Little shadow on the view-port of the buffer view */ -.cm-s-solarized.CodeMirror { - -moz-box-shadow: inset 7px 0 12px -6px #000; - -webkit-box-shadow: inset 7px 0 12px -6px #000; - box-shadow: inset 7px 0 12px -6px #000; -} - -/* Gutter border and some shadow from it */ -.cm-s-solarized .CodeMirror-gutters { - padding: 0 15px 0 10px; - box-shadow: 0 10px 20px black; - border-right: 1px solid; -} - -/* Gutter colors and line number styling based of color scheme (dark / light) */ - -/* Dark */ -.cm-s-solarized.cm-s-dark .CodeMirror-gutters { - background-color: #073642; - border-color: #00232c; -} - -.cm-s-solarized.cm-s-dark .CodeMirror-linenumber { - text-shadow: #021014 0 -1px; -} - -/* Light */ -.cm-s-solarized.cm-s-light .CodeMirror-gutters { - background-color: #eee8d5; - border-color: #eee8d5; -} - -/* Common */ -.cm-s-solarized .CodeMirror-linenumber { - color: #586e75; -} - -.cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text { - color: #586e75; -} - -.cm-s-solarized .CodeMirror-lines { - padding-left: 5px; -} - -.cm-s-solarized .CodeMirror-lines .CodeMirror-cursor { - border-left: 1px solid #819090; -} - -/* -Active line. Negative margin compensates left padding of the text in the -view-port -*/ -.cm-s-solarized .activeline { - margin-left: -20px; -} - -.cm-s-solarized.cm-s-dark .activeline { - background: rgba(255, 255, 255, 0.05); - -} -.cm-s-solarized.cm-s-light .activeline { - background: rgba(0, 0, 0, 0.05); -} - -/* -View-port and gutter both get little noise background to give it a real feel. -*/ -.cm-s-solarized.CodeMirror, -.cm-s-solarized .CodeMirror-gutters { - background-image: url("data:image/png;base64,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"); -} diff --git a/site/css/themes/twilight.css b/site/css/themes/twilight.css deleted file mode 100644 index fd8944b..0000000 --- a/site/css/themes/twilight.css +++ /dev/null @@ -1,26 +0,0 @@ -.cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/ -.cm-s-twilight .CodeMirror-selected { background: #323232 !important; } /**/ - -.cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; } -.cm-s-twilight .CodeMirror-linenumber { color: #aaa; } -.cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white !important; } - -.cm-s-twilight .cm-keyword { color: #f9ee98; } /**/ -.cm-s-twilight .cm-atom { color: #FC0; } -.cm-s-twilight .cm-number { color: #ca7841; } /**/ -.cm-s-twilight .cm-def { color: #8DA6CE; } -.cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/ -.cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def { color: #607392; } /**/ -.cm-s-twilight .cm-operator { color: #cda869; } /**/ -.cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/ -.cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/ -.cm-s-twilight .cm-string-2 { color:#bd6b18 } /*?*/ -.cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/ -.cm-s-twilight .cm-error { border-bottom: 1px solid red; } -.cm-s-twilight .cm-builtin { color: #cda869; } /*?*/ -.cm-s-twilight .cm-tag { color: #997643; } /**/ -.cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/ -.cm-s-twilight .cm-header { color: #FF6400; } -.cm-s-twilight .cm-hr { color: #AEAEAE; } -.cm-s-twilight .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } /**/ - diff --git a/site/css/themes/vibrant-ink.css b/site/css/themes/vibrant-ink.css deleted file mode 100644 index 22024a4..0000000 --- a/site/css/themes/vibrant-ink.css +++ /dev/null @@ -1,27 +0,0 @@ -/* Taken from the popular Visual Studio Vibrant Ink Schema */ - -.cm-s-vibrant-ink.CodeMirror { background: black; color: white; } -.cm-s-vibrant-ink .CodeMirror-selected { background: #35493c !important; } - -.cm-s-vibrant-ink .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } -.cm-s-vibrant-ink .CodeMirror-linenumber { color: #d0d0d0; } -.cm-s-vibrant-ink .CodeMirror-cursor { border-left: 1px solid white !important; } - -.cm-s-vibrant-ink .cm-keyword { color: #CC7832; } -.cm-s-vibrant-ink .cm-atom { color: #FC0; } -.cm-s-vibrant-ink .cm-number { color: #FFEE98; } -.cm-s-vibrant-ink .cm-def { color: #8DA6CE; } -.cm-s-vibrant-ink span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #FFC66D } -.cm-s-vibrant-ink span.cm-variable-3, .cm-s-cobalt span.cm-def { color: #FFC66D } -.cm-s-vibrant-ink .cm-operator { color: #888; } -.cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; } -.cm-s-vibrant-ink .cm-string { color: #A5C25C } -.cm-s-vibrant-ink .cm-string-2 { color: red } -.cm-s-vibrant-ink .cm-meta { color: #D8FA3C; } -.cm-s-vibrant-ink .cm-error { border-bottom: 1px solid red; } -.cm-s-vibrant-ink .cm-builtin { color: #8DA6CE; } -.cm-s-vibrant-ink .cm-tag { color: #8DA6CE; } -.cm-s-vibrant-ink .cm-attribute { color: #8DA6CE; } -.cm-s-vibrant-ink .cm-header { color: #FF6400; } -.cm-s-vibrant-ink .cm-hr { color: #AEAEAE; } -.cm-s-vibrant-ink .cm-link { color: blue; } diff --git a/site/css/themes/xq-dark.css b/site/css/themes/xq-dark.css deleted file mode 100644 index fd9bb12..0000000 --- a/site/css/themes/xq-dark.css +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright (C) 2011 by MarkLogic Corporation -Author: Mike Brevoort - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ -.cm-s-xq-dark.CodeMirror { background: #0a001f; color: #f8f8f8; } -.cm-s-xq-dark span.CodeMirror-selected { background: #a8f !important; } -.cm-s-xq-dark .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } -.cm-s-xq-dark .CodeMirror-linenumber { color: #f8f8f8; } -.cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white !important; } - -.cm-s-xq-dark span.cm-keyword {color: #FFBD40;} -.cm-s-xq-dark span.cm-atom {color: #6C8CD5;} -.cm-s-xq-dark span.cm-number {color: #164;} -.cm-s-xq-dark span.cm-def {color: #FFF; text-decoration:underline;} -.cm-s-xq-dark span.cm-variable {color: #FFF;} -.cm-s-xq-dark span.cm-variable-2 {color: #EEE;} -.cm-s-xq-dark span.cm-variable-3 {color: #DDD;} -.cm-s-xq-dark span.cm-property {} -.cm-s-xq-dark span.cm-operator {} -.cm-s-xq-dark span.cm-comment {color: gray;} -.cm-s-xq-dark span.cm-string {color: #9FEE00;} -.cm-s-xq-dark span.cm-meta {color: yellow;} -.cm-s-xq-dark span.cm-error {color: #f00;} -.cm-s-xq-dark span.cm-qualifier {color: #FFF700;} -.cm-s-xq-dark span.cm-builtin {color: #30a;} -.cm-s-xq-dark span.cm-bracket {color: #cc7;} -.cm-s-xq-dark span.cm-tag {color: #FFBD40;} -.cm-s-xq-dark span.cm-attribute {color: #FFF700;} diff --git a/site/dependencies b/site/dependencies deleted file mode 100644 index 1573af0..0000000 --- a/site/dependencies +++ /dev/null @@ -1,4 +0,0 @@ -coffeescript -node-uglify -node-less -cowsay diff --git a/site/devel.sh b/site/devel.sh deleted file mode 100755 index fdddc18..0000000 --- a/site/devel.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -shopt -s extglob - -last="" -while [ true ]; do - now=$(find coffee less -type f -printf "%T@ %Tx %TX %p\n" | sort -n -r | head -1) - if [ "$last" != "$now" ]; then - make >/dev/null - echo "Updated." - fi - last=$now - sleep 1 -done diff --git a/site/imgs/xkcd.png b/site/imgs/xkcd.png deleted file mode 100644 index 14cc06b143fa124e37bc3e504bac5cd29ca689b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264169 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 P_@$|;r}9$CI_&=eP39bM diff --git a/site/js/codemirror.js b/site/js/codemirror.js deleted file mode 100644 index 336cffc..0000000 --- a/site/js/codemirror.js +++ /dev/null @@ -1,5452 +0,0 @@ -// CodeMirror is the only global var we claim -window.CodeMirror = (function() { - "use strict"; - - // BROWSER SNIFFING - - // Crude, but necessary to handle a number of hard-to-feature-detect - // bugs and behavior differences. - var gecko = /gecko\/\d/i.test(navigator.userAgent); - var ie = /MSIE \d/.test(navigator.userAgent); - var ie_lt8 = ie && (document.documentMode == null || document.documentMode < 8); - var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9); - var webkit = /WebKit\//.test(navigator.userAgent); - var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent); - var chrome = /Chrome\//.test(navigator.userAgent); - var opera = /Opera\//.test(navigator.userAgent); - var safari = /Apple Computer/.test(navigator.vendor); - var khtml = /KHTML\//.test(navigator.userAgent); - var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent); - var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent); - var phantom = /PhantomJS/.test(navigator.userAgent); - - var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent); - // This is woefully incomplete. Suggestions for alternative methods welcome. - var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent); - var mac = ios || /Mac/.test(navigator.platform); - var windows = /windows/i.test(navigator.platform); - - var opera_version = opera && navigator.userAgent.match(/Version\/(\d*\.\d*)/); - if (opera_version) opera_version = Number(opera_version[1]); - // Some browsers use the wrong event properties to signal cmd/ctrl on OS X - var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11)); - var captureMiddleClick = gecko || (ie && !ie_lt9); - - // Optimize some code when these features are not used - var sawReadOnlySpans = false, sawCollapsedSpans = false; - - // CONSTRUCTOR - - function CodeMirror(place, options) { - if (!(this instanceof CodeMirror)) return new CodeMirror(place, options); - - this.options = options = options || {}; - // Determine effective options based on given values and defaults. - for (var opt in defaults) if (!options.hasOwnProperty(opt) && defaults.hasOwnProperty(opt)) - options[opt] = defaults[opt]; - setGuttersForLineNumbers(options); - - var docStart = typeof options.value == "string" ? 0 : options.value.first; - var display = this.display = makeDisplay(place, docStart); - display.wrapper.CodeMirror = this; - updateGutters(this); - if (options.autofocus && !mobile) focusInput(this); - - this.state = {keyMaps: [], - overlays: [], - modeGen: 0, - overwrite: false, focused: false, - suppressEdits: false, pasteIncoming: false, - draggingText: false, - highlight: new Delayed()}; - - themeChanged(this); - if (options.lineWrapping) - this.display.wrapper.className += " CodeMirror-wrap"; - - var doc = options.value; - if (typeof doc == "string") doc = new Doc(options.value, options.mode); - operation(this, attachDoc)(this, doc); - - // Override magic textarea content restore that IE sometimes does - // on our hidden textarea on reload - if (ie) setTimeout(bind(resetInput, this, true), 20); - - registerEventHandlers(this); - // IE throws unspecified error in certain cases, when - // trying to access activeElement before onload - var hasFocus; try { hasFocus = (document.activeElement == display.input); } catch(e) { } - if (hasFocus || (options.autofocus && !mobile)) setTimeout(bind(onFocus, this), 20); - else onBlur(this); - - operation(this, function() { - for (var opt in optionHandlers) - if (optionHandlers.propertyIsEnumerable(opt)) - optionHandlers[opt](this, options[opt], Init); - for (var i = 0; i < initHooks.length; ++i) initHooks[i](this); - })(); - } - - // DISPLAY CONSTRUCTOR - - function makeDisplay(place, docStart) { - var d = {}; - - var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none;"); - if (webkit) input.style.width = "1000px"; - else input.setAttribute("wrap", "off"); - // if border: 0; -- iOS fails to open keyboard (issue #1287) - if (ios) input.style.border = "1px solid black"; - input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); - - // Wraps and hides input textarea - d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); - // The actual fake scrollbars. - d.scrollbarH = elt("div", [elt("div", null, null, "height: 1px")], "CodeMirror-hscrollbar"); - d.scrollbarV = elt("div", [elt("div", null, null, "width: 1px")], "CodeMirror-vscrollbar"); - d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); - // DIVs containing the selection and the actual code - d.lineDiv = elt("div"); - d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); - // Blinky cursor, and element used to ensure cursor fits at the end of a line - d.cursor = elt("div", "\u00a0", "CodeMirror-cursor"); - // Secondary cursor, shown when on a 'jump' in bi-directional text - d.otherCursor = elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"); - // Used to measure text size - d.measure = elt("div", null, "CodeMirror-measure"); - // Wraps everything that needs to exist inside the vertically-padded coordinate system - d.lineSpace = elt("div", [d.measure, d.selectionDiv, d.lineDiv, d.cursor, d.otherCursor], - null, "position: relative; outline: none"); - // Moved around its parent to cover visible view - d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative"); - // Set to the height of the text, causes scrolling - d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); - // D is needed because behavior of elts with overflow: auto and padding is inconsistent across browsers - d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerCutOff + "px; width: 1px;"); - // Will contain the gutters, if any - d.gutters = elt("div", null, "CodeMirror-gutters"); - d.lineGutter = null; - // Helper element to properly size the gutter backgrounds - var scrollerInner = elt("div", [d.sizer, d.heightForcer, d.gutters], null, "position: relative; min-height: 100%"); - // Provides scrolling - d.scroller = elt("div", [scrollerInner], "CodeMirror-scroll"); - d.scroller.setAttribute("tabIndex", "-1"); - // The element in which the editor lives. - d.wrapper = elt("div", [d.inputDiv, d.scrollbarH, d.scrollbarV, - d.scrollbarFiller, d.scroller], "CodeMirror"); - // Work around IE7 z-index bug - if (ie_lt8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } - if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper); - - // Needed to hide big blue blinking cursor on Mobile Safari - if (ios) input.style.width = "0px"; - if (!webkit) d.scroller.draggable = true; - // Needed to handle Tab key in KHTML - if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; } - // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). - else if (ie_lt8) d.scrollbarH.style.minWidth = d.scrollbarV.style.minWidth = "18px"; - - // Current visible range (may be bigger than the view window). - d.viewOffset = d.lastSizeC = 0; - d.showingFrom = d.showingTo = docStart; - - // Used to only resize the line number gutter when necessary (when - // the amount of lines crosses a boundary that makes its width change) - d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; - // See readInput and resetInput - d.prevInput = ""; - // Set to true when a non-horizontal-scrolling widget is added. As - // an optimization, widget aligning is skipped when d is false. - d.alignWidgets = false; - // Flag that indicates whether we currently expect input to appear - // (after some event like 'keypress' or 'input') and are polling - // intensively. - d.pollingFast = false; - // Self-resetting timeout for the poller - d.poll = new Delayed(); - // True when a drag from the editor is active - d.draggingText = false; - - d.cachedCharWidth = d.cachedTextHeight = null; - d.measureLineCache = []; - d.measureLineCachePos = 0; - - // Tracks when resetInput has punted to just putting a short - // string instead of the (large) selection. - d.inaccurateSelection = false; - - // Tracks the maximum line length so that the horizontal scrollbar - // can be kept static when scrolling. - d.maxLine = null; - d.maxLineLength = 0; - d.maxLineChanged = false; - - // Used for measuring wheel scrolling granularity - d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; - - return d; - } - - // STATE UPDATES - - // Used to get the editor into a consistent state again when options change. - - function loadMode(cm) { - cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption); - cm.doc.iter(function(line) { - if (line.stateAfter) line.stateAfter = null; - if (line.styles) line.styles = null; - }); - cm.doc.frontier = cm.doc.first; - startWorker(cm, 100); - cm.state.modeGen++; - if (cm.curOp) regChange(cm); - } - - function wrappingChanged(cm) { - if (cm.options.lineWrapping) { - cm.display.wrapper.className += " CodeMirror-wrap"; - cm.display.sizer.style.minWidth = ""; - } else { - cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-wrap", ""); - computeMaxLength(cm); - } - estimateLineHeights(cm); - regChange(cm); - clearCaches(cm); - setTimeout(function(){updateScrollbars(cm.display, cm.doc.height);}, 100); - } - - function estimateHeight(cm) { - var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; - var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); - return function(line) { - if (lineIsHidden(cm.doc, line)) - return 0; - else if (wrapping) - return (Math.ceil(line.text.length / perLine) || 1) * th; - else - return th; - }; - } - - function estimateLineHeights(cm) { - var doc = cm.doc, est = estimateHeight(cm); - doc.iter(function(line) { - var estHeight = est(line); - if (estHeight != line.height) updateLineHeight(line, estHeight); - }); - } - - function keyMapChanged(cm) { - var style = keyMap[cm.options.keyMap].style; - cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") + - (style ? " cm-keymap-" + style : ""); - } - - function themeChanged(cm) { - cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + - cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); - clearCaches(cm); - } - - function guttersChanged(cm) { - updateGutters(cm); - regChange(cm); - } - - function updateGutters(cm) { - var gutters = cm.display.gutters, specs = cm.options.gutters; - removeChildren(gutters); - for (var i = 0; i < specs.length; ++i) { - var gutterClass = specs[i]; - var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass)); - if (gutterClass == "CodeMirror-linenumbers") { - cm.display.lineGutter = gElt; - gElt.style.width = (cm.display.lineNumWidth || 1) + "px"; - } - } - gutters.style.display = i ? "" : "none"; - } - - function lineLength(doc, line) { - if (line.height == 0) return 0; - var len = line.text.length, merged, cur = line; - while (merged = collapsedSpanAtStart(cur)) { - var found = merged.find(); - cur = getLine(doc, found.from.line); - len += found.from.ch - found.to.ch; - } - cur = line; - while (merged = collapsedSpanAtEnd(cur)) { - var found = merged.find(); - len -= cur.text.length - found.from.ch; - cur = getLine(doc, found.to.line); - len += cur.text.length - found.to.ch; - } - return len; - } - - function computeMaxLength(cm) { - var d = cm.display, doc = cm.doc; - d.maxLine = getLine(doc, doc.first); - d.maxLineLength = lineLength(doc, d.maxLine); - d.maxLineChanged = true; - doc.iter(function(line) { - var len = lineLength(doc, line); - if (len > d.maxLineLength) { - d.maxLineLength = len; - d.maxLine = line; - } - }); - } - - // Make sure the gutters options contains the element - // "CodeMirror-linenumbers" when the lineNumbers option is true. - function setGuttersForLineNumbers(options) { - var found = false; - for (var i = 0; i < options.gutters.length; ++i) { - if (options.gutters[i] == "CodeMirror-linenumbers") { - if (options.lineNumbers) found = true; - else options.gutters.splice(i--, 1); - } - } - if (!found && options.lineNumbers) - options.gutters.push("CodeMirror-linenumbers"); - } - - // SCROLLBARS - - // Re-synchronize the fake scrollbars with the actual size of the - // content. Optionally force a scrollTop. - function updateScrollbars(d /* display */, docHeight) { - var totalHeight = docHeight + paddingVert(d); - d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px"; - var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight); - var needsH = d.scroller.scrollWidth > d.scroller.clientWidth; - var needsV = scrollHeight > d.scroller.clientHeight; - if (needsV) { - d.scrollbarV.style.display = "block"; - d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0"; - d.scrollbarV.firstChild.style.height = - (scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px"; - } else d.scrollbarV.style.display = ""; - if (needsH) { - d.scrollbarH.style.display = "block"; - d.scrollbarH.style.right = needsV ? scrollbarWidth(d.measure) + "px" : "0"; - d.scrollbarH.firstChild.style.width = - (d.scroller.scrollWidth - d.scroller.clientWidth + d.scrollbarH.clientWidth) + "px"; - } else d.scrollbarH.style.display = ""; - if (needsH && needsV) { - d.scrollbarFiller.style.display = "block"; - d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + "px"; - } else d.scrollbarFiller.style.display = ""; - - if (mac_geLion && scrollbarWidth(d.measure) === 0) - d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px"; - } - - function visibleLines(display, doc, viewPort) { - var top = display.scroller.scrollTop, height = display.wrapper.clientHeight; - if (typeof viewPort == "number") top = viewPort; - else if (viewPort) {top = viewPort.top; height = viewPort.bottom - viewPort.top;} - top = Math.floor(top - paddingTop(display)); - var bottom = Math.ceil(top + height); - return {from: lineAtHeight(doc, top), to: lineAtHeight(doc, bottom)}; - } - - // LINE NUMBERS - - function alignHorizontally(cm) { - var display = cm.display; - if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return; - var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; - var gutterW = display.gutters.offsetWidth, l = comp + "px"; - for (var n = display.lineDiv.firstChild; n; n = n.nextSibling) if (n.alignable) { - for (var i = 0, a = n.alignable; i < a.length; ++i) a[i].style.left = l; - } - if (cm.options.fixedGutter) - display.gutters.style.left = (comp + gutterW) + "px"; - } - - function maybeUpdateLineNumberWidth(cm) { - if (!cm.options.lineNumbers) return false; - var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; - if (last.length != display.lineNumChars) { - var test = display.measure.appendChild(elt("div", [elt("div", last)], - "CodeMirror-linenumber CodeMirror-gutter-elt")); - var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; - display.lineGutter.style.width = ""; - display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding); - display.lineNumWidth = display.lineNumInnerWidth + padding; - display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; - display.lineGutter.style.width = display.lineNumWidth + "px"; - return true; - } - return false; - } - - function lineNumberFor(options, i) { - return String(options.lineNumberFormatter(i + options.firstLineNumber)); - } - function compensateForHScroll(display) { - return getRect(display.scroller).left - getRect(display.sizer).left; - } - - // DISPLAY DRAWING - - function updateDisplay(cm, changes, viewPort) { - var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo; - var updated = updateDisplayInner(cm, changes, viewPort); - if (updated) { - signalLater(cm, "update", cm); - if (cm.display.showingFrom != oldFrom || cm.display.showingTo != oldTo) - signalLater(cm, "viewportChange", cm, cm.display.showingFrom, cm.display.showingTo); - } - updateSelection(cm); - updateScrollbars(cm.display, cm.doc.height); - - return updated; - } - - // Uses a set of changes plus the current scroll position to - // determine which DOM updates have to be made, and makes the - // updates. - function updateDisplayInner(cm, changes, viewPort) { - var display = cm.display, doc = cm.doc; - if (!display.wrapper.clientWidth) { - display.showingFrom = display.showingTo = doc.first; - display.viewOffset = 0; - return; - } - - // Compute the new visible window - // If scrollTop is specified, use that to determine which lines - // to render instead of the current scrollbar position. - var visible = visibleLines(display, doc, viewPort); - // Bail out if the visible area is already rendered and nothing changed. - if (changes.length == 0 && - visible.from > display.showingFrom && visible.to < display.showingTo) - return; - - if (maybeUpdateLineNumberWidth(cm)) - changes = [{from: doc.first, to: doc.first + doc.size}]; - var gutterW = display.sizer.style.marginLeft = display.gutters.offsetWidth + "px"; - display.scrollbarH.style.left = cm.options.fixedGutter ? gutterW : "0"; - - // Used to determine which lines need their line numbers updated - var positionsChangedFrom = Infinity; - if (cm.options.lineNumbers) - for (var i = 0; i < changes.length; ++i) - if (changes[i].diff) { positionsChangedFrom = changes[i].from; break; } - - var end = doc.first + doc.size; - var from = Math.max(visible.from - cm.options.viewportMargin, doc.first); - var to = Math.min(end, visible.to + cm.options.viewportMargin); - if (display.showingFrom < from && from - display.showingFrom < 20) from = Math.max(doc.first, display.showingFrom); - if (display.showingTo > to && display.showingTo - to < 20) to = Math.min(end, display.showingTo); - if (sawCollapsedSpans) { - from = lineNo(visualLine(doc, getLine(doc, from))); - while (to < end && lineIsHidden(doc, getLine(doc, to))) ++to; - } - - // Create a range of theoretically intact lines, and punch holes - // in that using the change info. - var intact = [{from: Math.max(display.showingFrom, doc.first), - to: Math.min(display.showingTo, end)}]; - if (intact[0].from >= intact[0].to) intact = []; - else intact = computeIntact(intact, changes); - // When merged lines are present, we might have to reduce the - // intact ranges because changes in continued fragments of the - // intact lines do require the lines to be redrawn. - if (sawCollapsedSpans) - for (var i = 0; i < intact.length; ++i) { - var range = intact[i], merged; - while (merged = collapsedSpanAtEnd(getLine(doc, range.to - 1))) { - var newTo = merged.find().from.line; - if (newTo > range.from) range.to = newTo; - else { intact.splice(i--, 1); break; } - } - } - - // Clip off the parts that won't be visible - var intactLines = 0; - for (var i = 0; i < intact.length; ++i) { - var range = intact[i]; - if (range.from < from) range.from = from; - if (range.to > to) range.to = to; - if (range.from >= range.to) intact.splice(i--, 1); - else intactLines += range.to - range.from; - } - if (intactLines == to - from && from == display.showingFrom && to == display.showingTo) { - updateViewOffset(cm); - return; - } - intact.sort(function(a, b) {return a.from - b.from;}); - - var focused = document.activeElement; - if (intactLines < (to - from) * .7) display.lineDiv.style.display = "none"; - patchDisplay(cm, from, to, intact, positionsChangedFrom); - display.lineDiv.style.display = ""; - if (document.activeElement != focused && focused.offsetHeight) focused.focus(); - - var different = from != display.showingFrom || to != display.showingTo || - display.lastSizeC != display.wrapper.clientHeight; - // This is just a bogus formula that detects when the editor is - // resized or the font size changes. - if (different) display.lastSizeC = display.wrapper.clientHeight; - display.showingFrom = from; display.showingTo = to; - startWorker(cm, 100); - - var prevBottom = display.lineDiv.offsetTop; - for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) { - if (ie_lt8) { - var bot = node.offsetTop + node.offsetHeight; - height = bot - prevBottom; - prevBottom = bot; - } else { - var box = getRect(node); - height = box.bottom - box.top; - } - var diff = node.lineObj.height - height; - if (height < 2) height = textHeight(display); - if (diff > .001 || diff < -.001) { - updateLineHeight(node.lineObj, height); - var widgets = node.lineObj.widgets; - if (widgets) for (var i = 0; i < widgets.length; ++i) - widgets[i].height = widgets[i].node.offsetHeight; - } - } - updateViewOffset(cm); - - if (visibleLines(display, doc, viewPort).to > to) - updateDisplayInner(cm, [], viewPort); - return true; - } - - function updateViewOffset(cm) { - var off = cm.display.viewOffset = heightAtLine(cm, getLine(cm.doc, cm.display.showingFrom)); - // Position the mover div to align with the current virtual scroll position - cm.display.mover.style.top = off + "px"; - } - - function computeIntact(intact, changes) { - for (var i = 0, l = changes.length || 0; i < l; ++i) { - var change = changes[i], intact2 = [], diff = change.diff || 0; - for (var j = 0, l2 = intact.length; j < l2; ++j) { - var range = intact[j]; - if (change.to <= range.from && change.diff) { - intact2.push({from: range.from + diff, to: range.to + diff}); - } else if (change.to <= range.from || change.from >= range.to) { - intact2.push(range); - } else { - if (change.from > range.from) - intact2.push({from: range.from, to: change.from}); - if (change.to < range.to) - intact2.push({from: change.to + diff, to: range.to + diff}); - } - } - intact = intact2; - } - return intact; - } - - function getDimensions(cm) { - var d = cm.display, left = {}, width = {}; - for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { - left[cm.options.gutters[i]] = n.offsetLeft; - width[cm.options.gutters[i]] = n.offsetWidth; - } - return {fixedPos: compensateForHScroll(d), - gutterTotalWidth: d.gutters.offsetWidth, - gutterLeft: left, - gutterWidth: width, - wrapperWidth: d.wrapper.clientWidth}; - } - - function patchDisplay(cm, from, to, intact, updateNumbersFrom) { - var dims = getDimensions(cm); - var display = cm.display, lineNumbers = cm.options.lineNumbers; - if (!intact.length && (!webkit || !cm.display.currentWheelTarget)) - removeChildren(display.lineDiv); - var container = display.lineDiv, cur = container.firstChild; - - function rm(node) { - var next = node.nextSibling; - if (webkit && mac && cm.display.currentWheelTarget == node) { - node.style.display = "none"; - node.lineObj = null; - } else { - node.parentNode.removeChild(node); - } - return next; - } - - var nextIntact = intact.shift(), lineN = from; - cm.doc.iter(from, to, function(line) { - if (nextIntact && nextIntact.to == lineN) nextIntact = intact.shift(); - if (lineIsHidden(cm.doc, line)) { - if (line.height != 0) updateLineHeight(line, 0); - if (line.widgets && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i) - if (line.widgets[i].showIfHidden) { - var prev = cur.previousSibling; - if (/pre/i.test(prev.nodeName)) { - var wrap = elt("div", null, null, "position: relative"); - prev.parentNode.replaceChild(wrap, prev); - wrap.appendChild(prev); - prev = wrap; - } - var wnode = prev.appendChild(elt("div", [line.widgets[i].node], "CodeMirror-linewidget")); - positionLineWidget(line.widgets[i], wnode, prev, dims); - } - } else if (nextIntact && nextIntact.from <= lineN && nextIntact.to > lineN) { - // This line is intact. Skip to the actual node. Update its - // line number if needed. - while (cur.lineObj != line) cur = rm(cur); - if (lineNumbers && updateNumbersFrom <= lineN && cur.lineNumber) - setTextContent(cur.lineNumber, lineNumberFor(cm.options, lineN)); - cur = cur.nextSibling; - } else { - // For lines with widgets, make an attempt to find and reuse - // the existing element, so that widgets aren't needlessly - // removed and re-inserted into the dom - if (line.widgets) for (var j = 0, search = cur, reuse; search && j < 20; ++j, search = search.nextSibling) - if (search.lineObj == line && /div/i.test(search.nodeName)) { reuse = search; break; } - // This line needs to be generated. - var lineNode = buildLineElement(cm, line, lineN, dims, reuse); - if (lineNode != reuse) { - container.insertBefore(lineNode, cur); - } else { - while (cur != reuse) cur = rm(cur); - cur = cur.nextSibling; - } - - lineNode.lineObj = line; - } - ++lineN; - }); - while (cur) cur = rm(cur); - } - - function buildLineElement(cm, line, lineNo, dims, reuse) { - var lineElement = lineContent(cm, line); - var markers = line.gutterMarkers, display = cm.display, wrap; - - if (!cm.options.lineNumbers && !markers && !line.bgClass && !line.wrapClass && !line.widgets) - return lineElement; - - // Lines with gutter elements, widgets or a background class need - // to be wrapped again, and have the extra elements added to the - // wrapper div - - if (reuse) { - reuse.alignable = null; - var isOk = true, widgetsSeen = 0; - for (var n = reuse.firstChild, next; n; n = next) { - next = n.nextSibling; - if (!/\bCodeMirror-linewidget\b/.test(n.className)) { - reuse.removeChild(n); - } else { - for (var i = 0, first = true; i < line.widgets.length; ++i) { - var widget = line.widgets[i], isFirst = false; - if (!widget.above) { isFirst = first; first = false; } - if (widget.node == n.firstChild) { - positionLineWidget(widget, n, reuse, dims); - ++widgetsSeen; - if (isFirst) reuse.insertBefore(lineElement, n); - break; - } - } - if (i == line.widgets.length) { isOk = false; break; } - } - } - if (isOk && widgetsSeen == line.widgets.length) { - wrap = reuse; - reuse.className = line.wrapClass || ""; - } - } - if (!wrap) { - wrap = elt("div", null, line.wrapClass, "position: relative"); - wrap.appendChild(lineElement); - } - // Kludge to make sure the styled element lies behind the selection (by z-index) - if (line.bgClass) - wrap.insertBefore(elt("div", null, line.bgClass + " CodeMirror-linebackground"), wrap.firstChild); - if (cm.options.lineNumbers || markers) { - var gutterWrap = wrap.insertBefore(elt("div", null, null, "position: absolute; left: " + - (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"), - wrap.firstChild); - if (cm.options.fixedGutter) (wrap.alignable || (wrap.alignable = [])).push(gutterWrap); - if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) - wrap.lineNumber = gutterWrap.appendChild( - elt("div", lineNumberFor(cm.options, lineNo), - "CodeMirror-linenumber CodeMirror-gutter-elt", - "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: " - + display.lineNumInnerWidth + "px")); - if (markers) - for (var k = 0; k < cm.options.gutters.length; ++k) { - var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id]; - if (found) - gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " + - dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px")); - } - } - if (ie_lt8) wrap.style.zIndex = 2; - if (line.widgets && wrap != reuse) for (var i = 0, ws = line.widgets; i < ws.length; ++i) { - var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget"); - positionLineWidget(widget, node, wrap, dims); - if (widget.above) - wrap.insertBefore(node, cm.options.lineNumbers && line.height != 0 ? gutterWrap : lineElement); - else - wrap.appendChild(node); - signalLater(widget, "redraw"); - } - return wrap; - } - - function positionLineWidget(widget, node, wrap, dims) { - if (widget.noHScroll) { - (wrap.alignable || (wrap.alignable = [])).push(node); - var width = dims.wrapperWidth; - node.style.left = dims.fixedPos + "px"; - if (!widget.coverGutter) { - width -= dims.gutterTotalWidth; - node.style.paddingLeft = dims.gutterTotalWidth + "px"; - } - node.style.width = width + "px"; - } - if (widget.coverGutter) { - node.style.zIndex = 5; - node.style.position = "relative"; - if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px"; - } - } - - // SELECTION / CURSOR - - function updateSelection(cm) { - var display = cm.display; - var collapsed = posEq(cm.doc.sel.from, cm.doc.sel.to); - if (collapsed || cm.options.showCursorWhenSelecting) - updateSelectionCursor(cm); - else - display.cursor.style.display = display.otherCursor.style.display = "none"; - if (!collapsed) - updateSelectionRange(cm); - else - display.selectionDiv.style.display = "none"; - - // Move the hidden textarea near the cursor to prevent scrolling artifacts - var headPos = cursorCoords(cm, cm.doc.sel.head, "div"); - var wrapOff = getRect(display.wrapper), lineOff = getRect(display.lineDiv); - display.inputDiv.style.top = Math.max(0, Math.min(display.wrapper.clientHeight - 10, - headPos.top + lineOff.top - wrapOff.top)) + "px"; - display.inputDiv.style.left = Math.max(0, Math.min(display.wrapper.clientWidth - 10, - headPos.left + lineOff.left - wrapOff.left)) + "px"; - } - - // No selection, plain cursor - function updateSelectionCursor(cm) { - var display = cm.display, pos = cursorCoords(cm, cm.doc.sel.head, "div"); - display.cursor.style.left = pos.left + "px"; - display.cursor.style.top = pos.top + "px"; - display.cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; - display.cursor.style.display = ""; - - if (pos.other) { - display.otherCursor.style.display = ""; - display.otherCursor.style.left = pos.other.left + "px"; - display.otherCursor.style.top = pos.other.top + "px"; - display.otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; - } else { display.otherCursor.style.display = "none"; } - } - - // Highlight selection - function updateSelectionRange(cm) { - var display = cm.display, doc = cm.doc, sel = cm.doc.sel; - var fragment = document.createDocumentFragment(); - var clientWidth = display.lineSpace.offsetWidth, pl = paddingLeft(cm.display); - - function add(left, top, width, bottom) { - if (top < 0) top = 0; - fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + - "px; top: " + top + "px; width: " + (width == null ? clientWidth - left : width) + - "px; height: " + (bottom - top) + "px")); - } - - function drawForLine(line, fromArg, toArg, retTop) { - var lineObj = getLine(doc, line); - var lineLen = lineObj.text.length, rVal = retTop ? Infinity : -Infinity; - function coords(ch) { - return charCoords(cm, Pos(line, ch), "div", lineObj); - } - - iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) { - var leftPos = coords(dir == "rtl" ? to - 1 : from); - var rightPos = coords(dir == "rtl" ? from : to - 1); - var left = leftPos.left, right = rightPos.right; - if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part - add(left, leftPos.top, null, leftPos.bottom); - left = pl; - if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top); - } - if (toArg == null && to == lineLen) right = clientWidth; - if (fromArg == null && from == 0) left = pl; - rVal = retTop ? Math.min(rightPos.top, rVal) : Math.max(rightPos.bottom, rVal); - if (left < pl + 1) left = pl; - add(left, rightPos.top, right - left, rightPos.bottom); - }); - return rVal; - } - - if (sel.from.line == sel.to.line) { - drawForLine(sel.from.line, sel.from.ch, sel.to.ch); - } else { - var fromObj = getLine(doc, sel.from.line); - var cur = fromObj, merged, path = [sel.from.line, sel.from.ch], singleLine; - while (merged = collapsedSpanAtEnd(cur)) { - var found = merged.find(); - path.push(found.from.ch, found.to.line, found.to.ch); - if (found.to.line == sel.to.line) { - path.push(sel.to.ch); - singleLine = true; - break; - } - cur = getLine(doc, found.to.line); - } - - // This is a single, merged line - if (singleLine) { - for (var i = 0; i < path.length; i += 3) - drawForLine(path[i], path[i+1], path[i+2]); - } else { - var middleTop, middleBot, toObj = getLine(doc, sel.to.line); - if (sel.from.ch) - // Draw the first line of selection. - middleTop = drawForLine(sel.from.line, sel.from.ch, null, false); - else - // Simply include it in the middle block. - middleTop = heightAtLine(cm, fromObj) - display.viewOffset; - - if (!sel.to.ch) - middleBot = heightAtLine(cm, toObj) - display.viewOffset; - else - middleBot = drawForLine(sel.to.line, collapsedSpanAtStart(toObj) ? null : 0, sel.to.ch, true); - - if (middleTop < middleBot) add(pl, middleTop, null, middleBot); - } - } - - removeChildrenAndAdd(display.selectionDiv, fragment); - display.selectionDiv.style.display = ""; - } - - // Cursor-blinking - function restartBlink(cm) { - var display = cm.display; - clearInterval(display.blinker); - var on = true; - display.cursor.style.visibility = display.otherCursor.style.visibility = ""; - display.blinker = setInterval(function() { - if (!display.cursor.offsetHeight) return; - display.cursor.style.visibility = display.otherCursor.style.visibility = (on = !on) ? "" : "hidden"; - }, cm.options.cursorBlinkRate); - } - - // HIGHLIGHT WORKER - - function startWorker(cm, time) { - if (cm.doc.mode.startState && cm.doc.frontier < cm.display.showingTo) - cm.state.highlight.set(time, bind(highlightWorker, cm)); - } - - function highlightWorker(cm) { - var doc = cm.doc; - if (doc.frontier < doc.first) doc.frontier = doc.first; - if (doc.frontier >= cm.display.showingTo) return; - var end = +new Date + cm.options.workTime; - var state = copyState(doc.mode, getStateBefore(cm, doc.frontier)); - var changed = [], prevChange; - doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.showingTo + 500), function(line) { - if (doc.frontier >= cm.display.showingFrom) { // Visible - var oldStyles = line.styles; - line.styles = highlightLine(cm, line, state); - var ischange = !oldStyles || oldStyles.length != line.styles.length; - for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i]; - if (ischange) { - if (prevChange && prevChange.end == doc.frontier) prevChange.end++; - else changed.push(prevChange = {start: doc.frontier, end: doc.frontier + 1}); - } - line.stateAfter = copyState(doc.mode, state); - } else { - processLine(cm, line, state); - line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null; - } - ++doc.frontier; - if (+new Date > end) { - startWorker(cm, cm.options.workDelay); - return true; - } - }); - if (changed.length) - operation(cm, function() { - for (var i = 0; i < changed.length; ++i) - regChange(this, changed[i].start, changed[i].end); - })(); - } - - // Finds the line to start with when starting a parse. Tries to - // find a line with a stateAfter, so that it can start with a - // valid state. If that fails, it returns the line with the - // smallest indentation, which tends to need the least context to - // parse correctly. - function findStartLine(cm, n) { - var minindent, minline, doc = cm.doc; - for (var search = n, lim = n - 100; search > lim; --search) { - if (search <= doc.first) return doc.first; - var line = getLine(doc, search - 1); - if (line.stateAfter) return search; - var indented = countColumn(line.text, null, cm.options.tabSize); - if (minline == null || minindent > indented) { - minline = search - 1; - minindent = indented; - } - } - return minline; - } - - function getStateBefore(cm, n) { - var doc = cm.doc, display = cm.display; - if (!doc.mode.startState) return true; - var pos = findStartLine(cm, n), state = pos > doc.first && getLine(doc, pos-1).stateAfter; - if (!state) state = startState(doc.mode); - else state = copyState(doc.mode, state); - doc.iter(pos, n, function(line) { - processLine(cm, line, state); - var save = pos == n - 1 || pos % 5 == 0 || pos >= display.showingFrom && pos < display.showingTo; - line.stateAfter = save ? copyState(doc.mode, state) : null; - ++pos; - }); - return state; - } - - // POSITION MEASUREMENT - - function paddingTop(display) {return display.lineSpace.offsetTop;} - function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;} - function paddingLeft(display) { - var e = removeChildrenAndAdd(display.measure, elt("pre", null, null, "text-align: left")).appendChild(elt("span", "x")); - return e.offsetLeft; - } - - function measureChar(cm, line, ch, data) { - var dir = -1; - data = data || measureLine(cm, line); - - for (var pos = ch;; pos += dir) { - var r = data[pos]; - if (r) break; - if (dir < 0 && pos == 0) dir = 1; - } - return {left: pos < ch ? r.right : r.left, - right: pos > ch ? r.left : r.right, - top: r.top, bottom: r.bottom}; - } - - function findCachedMeasurement(cm, line) { - var cache = cm.display.measureLineCache; - for (var i = 0; i < cache.length; ++i) { - var memo = cache[i]; - if (memo.text == line.text && memo.markedSpans == line.markedSpans && - cm.display.scroller.clientWidth == memo.width && - memo.classes == line.textClass + "|" + line.bgClass + "|" + line.wrapClass) - return memo.measure; - } - } - - function measureLine(cm, line) { - // First look in the cache - var measure = findCachedMeasurement(cm, line); - if (!measure) { - // Failing that, recompute and store result in cache - measure = measureLineInner(cm, line); - var cache = cm.display.measureLineCache; - var memo = {text: line.text, width: cm.display.scroller.clientWidth, - markedSpans: line.markedSpans, measure: measure, - classes: line.textClass + "|" + line.bgClass + "|" + line.wrapClass}; - if (cache.length == 16) cache[++cm.display.measureLineCachePos % 16] = memo; - else cache.push(memo); - } - return measure; - } - - function measureLineInner(cm, line) { - var display = cm.display, measure = emptyArray(line.text.length); - var pre = lineContent(cm, line, measure); - - // IE does not cache element positions of inline elements between - // calls to getBoundingClientRect. This makes the loop below, - // which gathers the positions of all the characters on the line, - // do an amount of layout work quadratic to the number of - // characters. When line wrapping is off, we try to improve things - // by first subdividing the line into a bunch of inline blocks, so - // that IE can reuse most of the layout information from caches - // for those blocks. This does interfere with line wrapping, so it - // doesn't work when wrapping is on, but in that case the - // situation is slightly better, since IE does cache line-wrapping - // information and only recomputes per-line. - if (ie && !ie_lt8 && !cm.options.lineWrapping && pre.childNodes.length > 100) { - var fragment = document.createDocumentFragment(); - var chunk = 10, n = pre.childNodes.length; - for (var i = 0, chunks = Math.ceil(n / chunk); i < chunks; ++i) { - var wrap = elt("div", null, null, "display: inline-block"); - for (var j = 0; j < chunk && n; ++j) { - wrap.appendChild(pre.firstChild); - --n; - } - fragment.appendChild(wrap); - } - pre.appendChild(fragment); - } - - removeChildrenAndAdd(display.measure, pre); - - var outer = getRect(display.lineDiv); - var vranges = [], data = emptyArray(line.text.length), maxBot = pre.offsetHeight; - // Work around an IE7/8 bug where it will sometimes have randomly - // replaced our pre with a clone at this point. - if (ie_lt9 && display.measure.first != pre) - removeChildrenAndAdd(display.measure, pre); - - for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) { - var size = getRect(cur); - var top = Math.max(0, size.top - outer.top), bot = Math.min(size.bottom - outer.top, maxBot); - for (var j = 0; j < vranges.length; j += 2) { - var rtop = vranges[j], rbot = vranges[j+1]; - if (rtop > bot || rbot < top) continue; - if (rtop <= top && rbot >= bot || - top <= rtop && bot >= rbot || - Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) { - vranges[j] = Math.min(top, rtop); - vranges[j+1] = Math.max(bot, rbot); - break; - } - } - if (j == vranges.length) vranges.push(top, bot); - var right = size.right; - if (cur.measureRight) right = getRect(cur.measureRight).left; - data[i] = {left: size.left - outer.left, right: right - outer.left, top: j}; - } - for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) { - var vr = cur.top; - cur.top = vranges[vr]; cur.bottom = vranges[vr+1]; - } - - return data; - } - - function measureLineWidth(cm, line) { - var hasBadSpan = false; - if (line.markedSpans) for (var i = 0; i < line.markedSpans; ++i) { - var sp = line.markedSpans[i]; - if (sp.collapsed && (sp.to == null || sp.to == line.text.length)) hasBadSpan = true; - } - var cached = !hasBadSpan && findCachedMeasurement(cm, line); - if (cached) return measureChar(cm, line, line.text.length, cached).right; - - var pre = lineContent(cm, line); - var end = pre.appendChild(zeroWidthElement(cm.display.measure)); - removeChildrenAndAdd(cm.display.measure, pre); - return getRect(end).right - getRect(cm.display.lineDiv).left; - } - - function clearCaches(cm) { - cm.display.measureLineCache.length = cm.display.measureLineCachePos = 0; - cm.display.cachedCharWidth = cm.display.cachedTextHeight = null; - cm.display.maxLineChanged = true; - cm.display.lineNumChars = null; - } - - // Context is one of "line", "div" (display.lineDiv), "local"/null (editor), or "page" - function intoCoordSystem(cm, lineObj, rect, context) { - if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) { - var size = widgetHeight(lineObj.widgets[i]); - rect.top += size; rect.bottom += size; - } - if (context == "line") return rect; - if (!context) context = "local"; - var yOff = heightAtLine(cm, lineObj); - if (context != "local") yOff -= cm.display.viewOffset; - if (context == "page") { - var lOff = getRect(cm.display.lineSpace); - yOff += lOff.top + (window.pageYOffset || (document.documentElement || document.body).scrollTop); - var xOff = lOff.left + (window.pageXOffset || (document.documentElement || document.body).scrollLeft); - rect.left += xOff; rect.right += xOff; - } - rect.top += yOff; rect.bottom += yOff; - return rect; - } - - function charCoords(cm, pos, context, lineObj) { - if (!lineObj) lineObj = getLine(cm.doc, pos.line); - return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch), context); - } - - function cursorCoords(cm, pos, context, lineObj, measurement) { - lineObj = lineObj || getLine(cm.doc, pos.line); - if (!measurement) measurement = measureLine(cm, lineObj); - function get(ch, right) { - var m = measureChar(cm, lineObj, ch, measurement); - if (right) m.left = m.right; else m.right = m.left; - return intoCoordSystem(cm, lineObj, m, context); - } - var order = getOrder(lineObj), ch = pos.ch; - if (!order) return get(ch); - var main, other, linedir = order[0].level; - for (var i = 0; i < order.length; ++i) { - var part = order[i], rtl = part.level % 2, nb, here; - if (part.from < ch && part.to > ch) return get(ch, rtl); - var left = rtl ? part.to : part.from, right = rtl ? part.from : part.to; - if (left == ch) { - // IE returns bogus offsets and widths for edges where the - // direction flips, but only for the side with the lower - // level. So we try to use the side with the higher level. - if (i && part.level < (nb = order[i-1]).level) here = get(nb.level % 2 ? nb.from : nb.to - 1, true); - else here = get(rtl && part.from != part.to ? ch - 1 : ch); - if (rtl == linedir) main = here; else other = here; - } else if (right == ch) { - var nb = i < order.length - 1 && order[i+1]; - if (!rtl && nb && nb.from == nb.to) continue; - if (nb && part.level < nb.level) here = get(nb.level % 2 ? nb.to - 1 : nb.from); - else here = get(rtl ? ch : ch - 1, true); - if (rtl == linedir) main = here; else other = here; - } - } - if (linedir && !ch) other = get(order[0].to - 1); - if (!main) return other; - if (other) main.other = other; - return main; - } - - function PosMaybeOutside(line, ch, outside) { - var pos = new Pos(line, ch); - if (outside) pos.outside = true; - return pos; - } - - // Coords must be lineSpace-local - function coordsChar(cm, x, y) { - var doc = cm.doc; - y += cm.display.viewOffset; - if (y < 0) return PosMaybeOutside(doc.first, 0, true); - var lineNo = lineAtHeight(doc, y), last = doc.first + doc.size - 1; - if (lineNo > last) - return PosMaybeOutside(doc.first + doc.size - 1, getLine(doc, last).text.length, true); - if (x < 0) x = 0; - - for (;;) { - var lineObj = getLine(doc, lineNo); - var found = coordsCharInner(cm, lineObj, lineNo, x, y); - var merged = collapsedSpanAtEnd(lineObj); - var mergedPos = merged && merged.find(); - if (merged && found.ch >= mergedPos.from.ch) - lineNo = mergedPos.to.line; - else - return found; - } - } - - function coordsCharInner(cm, lineObj, lineNo, x, y) { - var innerOff = y - heightAtLine(cm, lineObj); - var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth; - var measurement = measureLine(cm, lineObj); - - function getX(ch) { - var sp = cursorCoords(cm, Pos(lineNo, ch), "line", - lineObj, measurement); - wrongLine = true; - if (innerOff > sp.bottom) return sp.left - adjust; - else if (innerOff < sp.top) return sp.left + adjust; - else wrongLine = false; - return sp.left; - } - - var bidi = getOrder(lineObj), dist = lineObj.text.length; - var from = lineLeft(lineObj), to = lineRight(lineObj); - var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine; - - if (x > toX) return PosMaybeOutside(lineNo, to, toOutside); - // Do a binary search between these bounds. - for (;;) { - if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) { - var after = x - fromX < toX - x, ch = after ? from : to; - while (isExtendingChar.test(lineObj.text.charAt(ch))) ++ch; - var pos = PosMaybeOutside(lineNo, ch, after ? fromOutside : toOutside); - pos.after = after; - return pos; - } - var step = Math.ceil(dist / 2), middle = from + step; - if (bidi) { - middle = from; - for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1); - } - var middleX = getX(middle); - if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist -= step;} - else {from = middle; fromX = middleX; fromOutside = wrongLine; dist = step;} - } - } - - var measureText; - function textHeight(display) { - if (display.cachedTextHeight != null) return display.cachedTextHeight; - if (measureText == null) { - measureText = elt("pre"); - // Measure a bunch of lines, for browsers that compute - // fractional heights. - for (var i = 0; i < 49; ++i) { - measureText.appendChild(document.createTextNode("x")); - measureText.appendChild(elt("br")); - } - measureText.appendChild(document.createTextNode("x")); - } - removeChildrenAndAdd(display.measure, measureText); - var height = measureText.offsetHeight / 50; - if (height > 3) display.cachedTextHeight = height; - removeChildren(display.measure); - return height || 1; - } - - function charWidth(display) { - if (display.cachedCharWidth != null) return display.cachedCharWidth; - var anchor = elt("span", "x"); - var pre = elt("pre", [anchor]); - removeChildrenAndAdd(display.measure, pre); - var width = anchor.offsetWidth; - if (width > 2) display.cachedCharWidth = width; - return width || 10; - } - - // OPERATIONS - - // Operations are used to wrap changes in such a way that each - // change won't have to update the cursor and display (which would - // be awkward, slow, and error-prone), but instead updates are - // batched and then all combined and executed at once. - - var nextOpId = 0; - function startOperation(cm) { - cm.curOp = { - // An array of ranges of lines that have to be updated. See - // updateDisplay. - changes: [], - updateInput: null, - userSelChange: null, - textChanged: null, - selectionChanged: false, - updateMaxLine: false, - updateScrollPos: false, - id: ++nextOpId - }; - if (!delayedCallbackDepth++) delayedCallbacks = []; - } - - function endOperation(cm) { - var op = cm.curOp, doc = cm.doc, display = cm.display; - cm.curOp = null; - - if (op.updateMaxLine) computeMaxLength(cm); - if (display.maxLineChanged && !cm.options.lineWrapping) { - var width = measureLineWidth(cm, display.maxLine); - display.sizer.style.minWidth = Math.max(0, width + 3 + scrollerCutOff) + "px"; - display.maxLineChanged = false; - var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + display.sizer.offsetWidth - display.scroller.clientWidth); - if (maxScrollLeft < doc.scrollLeft && !op.updateScrollPos) - setScrollLeft(cm, Math.min(display.scroller.scrollLeft, maxScrollLeft), true); - } - var newScrollPos, updated; - if (op.updateScrollPos) { - newScrollPos = op.updateScrollPos; - } else if (op.selectionChanged && display.scroller.clientHeight) { // don't rescroll if not visible - var coords = cursorCoords(cm, doc.sel.head); - newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom); - } - if (op.changes.length || newScrollPos && newScrollPos.scrollTop != null) - updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop); - if (!updated && op.selectionChanged) updateSelection(cm); - if (op.updateScrollPos) { - display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = newScrollPos.scrollTop; - display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = newScrollPos.scrollLeft; - alignHorizontally(cm); - } else if (newScrollPos) { - scrollCursorIntoView(cm); - } - if (op.selectionChanged) restartBlink(cm); - - if (cm.state.focused && op.updateInput) - resetInput(cm, op.userSelChange); - - var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; - if (hidden) for (var i = 0; i < hidden.length; ++i) - if (!hidden[i].lines.length) signal(hidden[i], "hide"); - if (unhidden) for (var i = 0; i < unhidden.length; ++i) - if (unhidden[i].lines.length) signal(unhidden[i], "unhide"); - - var delayed; - if (!--delayedCallbackDepth) { - delayed = delayedCallbacks; - delayedCallbacks = null; - } - if (op.textChanged) - signal(cm, "change", cm, op.textChanged); - if (op.selectionChanged) signal(cm, "cursorActivity", cm); - if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i](); - } - - // Wraps a function in an operation. Returns the wrapped function. - function operation(cm1, f) { - return function() { - var cm = cm1 || this, withOp = !cm.curOp; - if (withOp) startOperation(cm); - try { var result = f.apply(cm, arguments); } - finally { if (withOp) endOperation(cm); } - return result; - }; - } - function docOperation(f) { - return function() { - var withOp = this.cm && !this.cm.curOp, result; - if (withOp) startOperation(this.cm); - try { result = f.apply(this, arguments); } - finally { if (withOp) endOperation(this.cm); } - return result; - }; - } - function runInOp(cm, f) { - var withOp = !cm.curOp, result; - if (withOp) startOperation(cm); - try { result = f(); } - finally { if (withOp) endOperation(cm); } - return result; - } - - function regChange(cm, from, to, lendiff) { - if (from == null) from = cm.doc.first; - if (to == null) to = cm.doc.first + cm.doc.size; - cm.curOp.changes.push({from: from, to: to, diff: lendiff}); - } - - // INPUT HANDLING - - function slowPoll(cm) { - if (cm.display.pollingFast) return; - cm.display.poll.set(cm.options.pollInterval, function() { - readInput(cm); - if (cm.state.focused) slowPoll(cm); - }); - } - - function fastPoll(cm) { - var missed = false; - cm.display.pollingFast = true; - function p() { - var changed = readInput(cm); - if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);} - else {cm.display.pollingFast = false; slowPoll(cm);} - } - cm.display.poll.set(20, p); - } - - // prevInput is a hack to work with IME. If we reset the textarea - // on every change, that breaks IME. So we look for changes - // compared to the previous content instead. (Modern browsers have - // events that indicate IME taking place, but these are not widely - // supported or compatible enough yet to rely on.) - function readInput(cm) { - var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc, sel = doc.sel; - if (!cm.state.focused || hasSelection(input) || isReadOnly(cm)) return false; - var text = input.value; - if (text == prevInput && posEq(sel.from, sel.to)) return false; - // IE enjoys randomly deselecting our input's text when - // re-focusing. If the selection is gone but the cursor is at the - // start of the input, that's probably what happened. - if (ie && text && input.selectionStart === 0) { - resetInput(cm, true); - return false; - } - var withOp = !cm.curOp; - if (withOp) startOperation(cm); - sel.shift = false; - var same = 0, l = Math.min(prevInput.length, text.length); - while (same < l && prevInput[same] == text[same]) ++same; - var from = sel.from, to = sel.to; - if (same < prevInput.length) - from = Pos(from.line, from.ch - (prevInput.length - same)); - else if (cm.state.overwrite && posEq(from, to) && !cm.state.pasteIncoming) - to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + (text.length - same))); - var updateInput = cm.curOp.updateInput; - makeChange(cm.doc, {from: from, to: to, text: splitLines(text.slice(same)), - origin: cm.state.pasteIncoming ? "paste" : "+input"}, "end"); - - cm.curOp.updateInput = updateInput; - if (text.length > 1000) input.value = cm.display.prevInput = ""; - else cm.display.prevInput = text; - if (withOp) endOperation(cm); - cm.state.pasteIncoming = false; - return true; - } - - function resetInput(cm, user) { - var minimal, selected, doc = cm.doc; - if (!posEq(doc.sel.from, doc.sel.to)) { - cm.display.prevInput = ""; - minimal = hasCopyEvent && - (doc.sel.to.line - doc.sel.from.line > 100 || (selected = cm.getSelection()).length > 1000); - if (minimal) cm.display.input.value = "-"; - else cm.display.input.value = selected || cm.getSelection(); - if (cm.state.focused) selectInput(cm.display.input); - } else if (user) cm.display.prevInput = cm.display.input.value = ""; - cm.display.inaccurateSelection = minimal; - } - - function focusInput(cm) { - if (cm.options.readOnly != "nocursor" && (!mobile || document.activeElement != cm.display.input)) - cm.display.input.focus(); - } - - function isReadOnly(cm) { - return cm.options.readOnly || cm.doc.cantEdit; - } - - // EVENT HANDLERS - - function registerEventHandlers(cm) { - var d = cm.display; - on(d.scroller, "mousedown", operation(cm, onMouseDown)); - on(d.scroller, "dblclick", operation(cm, e_preventDefault)); - on(d.lineSpace, "selectstart", function(e) { - if (!eventInWidget(d, e)) e_preventDefault(e); - }); - // Gecko browsers fire contextmenu *after* opening the menu, at - // which point we can't mess with it anymore. Context menu is - // handled in onMouseDown for Gecko. - if (!captureMiddleClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);}); - - on(d.scroller, "scroll", function() { - setScrollTop(cm, d.scroller.scrollTop); - setScrollLeft(cm, d.scroller.scrollLeft, true); - signal(cm, "scroll", cm); - }); - on(d.scrollbarV, "scroll", function() { - setScrollTop(cm, d.scrollbarV.scrollTop); - }); - on(d.scrollbarH, "scroll", function() { - setScrollLeft(cm, d.scrollbarH.scrollLeft); - }); - - on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);}); - on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);}); - - function reFocus() { if (cm.state.focused) setTimeout(bind(focusInput, cm), 0); } - on(d.scrollbarH, "mousedown", reFocus); - on(d.scrollbarV, "mousedown", reFocus); - // Prevent wrapper from ever scrolling - on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); - - function onResize() { - // Might be a text scaling operation, clear size caches. - d.cachedCharWidth = d.cachedTextHeight = null; - clearCaches(cm); - runInOp(cm, bind(regChange, cm)); - } - on(window, "resize", onResize); - // Above handler holds on to the editor and its data structures. - // Here we poll to unregister it when the editor is no longer in - // the document, so that it can be garbage-collected. - function unregister() { - for (var p = d.wrapper.parentNode; p && p != document.body; p = p.parentNode) {} - if (p) setTimeout(unregister, 5000); - else off(window, "resize", onResize); - } - setTimeout(unregister, 5000); - - on(d.input, "keyup", operation(cm, function(e) { - if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; - if (e.keyCode == 16) cm.doc.sel.shift = false; - })); - on(d.input, "input", bind(fastPoll, cm)); - on(d.input, "keydown", operation(cm, onKeyDown)); - on(d.input, "keypress", operation(cm, onKeyPress)); - on(d.input, "focus", bind(onFocus, cm)); - on(d.input, "blur", bind(onBlur, cm)); - - function drag_(e) { - if (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return; - e_stop(e); - } - if (cm.options.dragDrop) { - on(d.scroller, "dragstart", function(e){onDragStart(cm, e);}); - on(d.scroller, "dragenter", drag_); - on(d.scroller, "dragover", drag_); - on(d.scroller, "drop", operation(cm, onDrop)); - } - on(d.scroller, "paste", function(e){ - if (eventInWidget(d, e)) return; - focusInput(cm); - fastPoll(cm); - }); - on(d.input, "paste", function() { - cm.state.pasteIncoming = true; - fastPoll(cm); - }); - - function prepareCopy() { - if (d.inaccurateSelection) { - d.prevInput = ""; - d.inaccurateSelection = false; - d.input.value = cm.getSelection(); - selectInput(d.input); - } - } - on(d.input, "cut", prepareCopy); - on(d.input, "copy", prepareCopy); - - // Needed to handle Tab key in KHTML - if (khtml) on(d.sizer, "mouseup", function() { - if (document.activeElement == d.input) d.input.blur(); - focusInput(cm); - }); - } - - function eventInWidget(display, e) { - for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { - if (!n) return true; - if (/\bCodeMirror-(?:line)?widget\b/.test(n.className) || - n.parentNode == display.sizer && n != display.mover) return true; - } - } - - function posFromMouse(cm, e, liberal) { - var display = cm.display; - if (!liberal) { - var target = e_target(e); - if (target == display.scrollbarH || target == display.scrollbarH.firstChild || - target == display.scrollbarV || target == display.scrollbarV.firstChild || - target == display.scrollbarFiller) return null; - } - var x, y, space = getRect(display.lineSpace); - // Fails unpredictably on IE[67] when mouse is dragged around quickly. - try { x = e.clientX; y = e.clientY; } catch (e) { return null; } - return coordsChar(cm, x - space.left, y - space.top); - } - - var lastClick, lastDoubleClick; - function onMouseDown(e) { - var cm = this, display = cm.display, doc = cm.doc, sel = doc.sel; - sel.shift = e.shiftKey; - - if (eventInWidget(display, e)) { - if (!webkit) { - display.scroller.draggable = false; - setTimeout(function(){display.scroller.draggable = true;}, 100); - } - return; - } - if (clickInGutter(cm, e)) return; - var start = posFromMouse(cm, e); - - switch (e_button(e)) { - case 3: - if (captureMiddleClick) onContextMenu.call(cm, cm, e); - return; - case 2: - if (start) extendSelection(cm.doc, start); - setTimeout(bind(focusInput, cm), 20); - e_preventDefault(e); - return; - } - // For button 1, if it was clicked inside the editor - // (posFromMouse returning non-null), we have to adjust the - // selection. - if (!start) {if (e_target(e) == display.scroller) e_preventDefault(e); return;} - - if (!cm.state.focused) onFocus(cm); - - var now = +new Date, type = "single"; - if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) { - type = "triple"; - e_preventDefault(e); - setTimeout(bind(focusInput, cm), 20); - selectLine(cm, start.line); - } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) { - type = "double"; - lastDoubleClick = {time: now, pos: start}; - e_preventDefault(e); - var word = findWordAt(getLine(doc, start.line).text, start); - extendSelection(cm.doc, word.from, word.to); - } else { lastClick = {time: now, pos: start}; } - - var last = start; - if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) && !posEq(sel.from, sel.to) && - !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") { - var dragEnd = operation(cm, function(e2) { - if (webkit) display.scroller.draggable = false; - cm.state.draggingText = false; - off(document, "mouseup", dragEnd); - off(display.scroller, "drop", dragEnd); - if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) { - e_preventDefault(e2); - extendSelection(cm.doc, start); - focusInput(cm); - } - }); - // Let the drag handler handle this. - if (webkit) display.scroller.draggable = true; - cm.state.draggingText = dragEnd; - // IE's approach to draggable - if (display.scroller.dragDrop) display.scroller.dragDrop(); - on(document, "mouseup", dragEnd); - on(display.scroller, "drop", dragEnd); - return; - } - e_preventDefault(e); - if (type == "single") extendSelection(cm.doc, clipPos(doc, start)); - - var startstart = sel.from, startend = sel.to; - - function doSelect(cur) { - if (type == "single") { - extendSelection(cm.doc, clipPos(doc, start), cur); - return; - } - - startstart = clipPos(doc, startstart); - startend = clipPos(doc, startend); - if (type == "double") { - var word = findWordAt(getLine(doc, cur.line).text, cur); - if (posLess(cur, startstart)) extendSelection(cm.doc, word.from, startend); - else extendSelection(cm.doc, startstart, word.to); - } else if (type == "triple") { - if (posLess(cur, startstart)) extendSelection(cm.doc, startend, clipPos(doc, Pos(cur.line, 0))); - else extendSelection(cm.doc, startstart, clipPos(doc, Pos(cur.line + 1, 0))); - } - } - - var editorSize = getRect(display.wrapper); - // Used to ensure timeout re-tries don't fire when another extend - // happened in the meantime (clearTimeout isn't reliable -- at - // least on Chrome, the timeouts still happen even when cleared, - // if the clear happens after their scheduled firing time). - var counter = 0; - - function extend(e) { - var curCount = ++counter; - var cur = posFromMouse(cm, e, true); - if (!cur) return; - if (!posEq(cur, last)) { - if (!cm.state.focused) onFocus(cm); - last = cur; - doSelect(cur); - var visible = visibleLines(display, doc); - if (cur.line >= visible.to || cur.line < visible.from) - setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150); - } else { - var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; - if (outside) setTimeout(operation(cm, function() { - if (counter != curCount) return; - display.scroller.scrollTop += outside; - extend(e); - }), 50); - } - } - - function done(e) { - counter = Infinity; - var cur = posFromMouse(cm, e); - if (cur) doSelect(cur); - e_preventDefault(e); - focusInput(cm); - off(document, "mousemove", move); - off(document, "mouseup", up); - } - - var move = operation(cm, function(e) { - if (!ie && !e_button(e)) done(e); - else extend(e); - }); - var up = operation(cm, done); - on(document, "mousemove", move); - on(document, "mouseup", up); - } - - function onDrop(e) { - var cm = this; - if (eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e)))) - return; - e_preventDefault(e); - var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; - if (!pos || isReadOnly(cm)) return; - if (files && files.length && window.FileReader && window.File) { - var n = files.length, text = Array(n), read = 0; - var loadFile = function(file, i) { - var reader = new FileReader; - reader.onload = function() { - text[i] = reader.result; - if (++read == n) { - pos = clipPos(cm.doc, pos); - makeChange(cm.doc, {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"}, "around"); - } - }; - reader.readAsText(file); - }; - for (var i = 0; i < n; ++i) loadFile(files[i], i); - } else { - // Don't do a replace if the drop happened inside of the selected text. - if (cm.state.draggingText && !(posLess(pos, cm.doc.sel.from) || posLess(cm.doc.sel.to, pos))) { - cm.state.draggingText(e); - // Ensure the editor is re-focused - setTimeout(bind(focusInput, cm), 20); - return; - } - try { - var text = e.dataTransfer.getData("Text"); - if (text) { - var curFrom = cm.doc.sel.from, curTo = cm.doc.sel.to; - setSelection(cm.doc, pos, pos); - if (cm.state.draggingText) replaceRange(cm.doc, "", curFrom, curTo, "paste"); - cm.replaceSelection(text, null, "paste"); - focusInput(cm); - onFocus(cm); - } - } - catch(e){} - } - } - - function clickInGutter(cm, e) { - var display = cm.display; - try { var mX = e.clientX, mY = e.clientY; } - catch(e) { return false; } - - if (mX >= Math.floor(getRect(display.gutters).right)) return false; - e_preventDefault(e); - if (!hasHandler(cm, "gutterClick")) return true; - - var lineBox = getRect(display.lineDiv); - if (mY > lineBox.bottom) return true; - mY -= lineBox.top - display.viewOffset; - - for (var i = 0; i < cm.options.gutters.length; ++i) { - var g = display.gutters.childNodes[i]; - if (g && getRect(g).right >= mX) { - var line = lineAtHeight(cm.doc, mY); - var gutter = cm.options.gutters[i]; - signalLater(cm, "gutterClick", cm, line, gutter, e); - break; - } - } - return true; - } - - function onDragStart(cm, e) { - if (eventInWidget(cm.display, e)) return; - - var txt = cm.getSelection(); - e.dataTransfer.setData("Text", txt); - - // Use dummy image instead of default browsers image. - // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. - if (e.dataTransfer.setDragImage) { - var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); - if (opera) { - img.width = img.height = 1; - cm.display.wrapper.appendChild(img); - // Force a relayout, or Opera won't use our image for some obscure reason - img._top = img.offsetTop; - } - if (safari) { - if (cm.display.dragImg) { - img = cm.display.dragImg; - } else { - cm.display.dragImg = img; - img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; - cm.display.wrapper.appendChild(img); - } - } - e.dataTransfer.setDragImage(img, 0, 0); - if (opera) img.parentNode.removeChild(img); - } - } - - function setScrollTop(cm, val) { - if (Math.abs(cm.doc.scrollTop - val) < 2) return; - cm.doc.scrollTop = val; - if (!gecko) updateDisplay(cm, [], val); - if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val; - if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val; - if (gecko) updateDisplay(cm, []); - } - function setScrollLeft(cm, val, isScroller) { - if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return; - val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth); - cm.doc.scrollLeft = val; - alignHorizontally(cm); - if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val; - if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val; - } - - // Since the delta values reported on mouse wheel events are - // unstandardized between browsers and even browser versions, and - // generally horribly unpredictable, this code starts by measuring - // the scroll effect that the first few mouse wheel events have, - // and, from that, detects the way it can convert deltas to pixel - // offsets afterwards. - // - // The reason we want to know the amount a wheel event will scroll - // is that it gives us a chance to update the display before the - // actual scrolling happens, reducing flickering. - - var wheelSamples = 0, wheelPixelsPerUnit = null; - // Fill in a browser-detected starting value on browsers where we - // know one. These don't have to be accurate -- the result of them - // being wrong would just be a slight flicker on the first wheel - // scroll (if it is large enough). - if (ie) wheelPixelsPerUnit = -.53; - else if (gecko) wheelPixelsPerUnit = 15; - else if (chrome) wheelPixelsPerUnit = -.7; - else if (safari) wheelPixelsPerUnit = -1/3; - - function onScrollWheel(cm, e) { - var dx = e.wheelDeltaX, dy = e.wheelDeltaY; - if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail; - if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail; - else if (dy == null) dy = e.wheelDelta; - - // Webkit browsers on OS X abort momentum scrolls when the target - // of the scroll event is removed from the scrollable element. - // This hack (see related code in patchDisplay) makes sure the - // element is kept around. - if (dy && mac && webkit) { - for (var cur = e.target; cur != scroll; cur = cur.parentNode) { - if (cur.lineObj) { - cm.display.currentWheelTarget = cur; - break; - } - } - } - - var display = cm.display, scroll = display.scroller; - // On some browsers, horizontal scrolling will cause redraws to - // happen before the gutter has been realigned, causing it to - // wriggle around in a most unseemly way. When we have an - // estimated pixels/delta value, we just handle horizontal - // scrolling entirely here. It'll be slightly off from native, but - // better than glitching out. - if (dx && !gecko && !opera && wheelPixelsPerUnit != null) { - if (dy) - setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight))); - setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth))); - e_preventDefault(e); - display.wheelStartX = null; // Abort measurement, if in progress - return; - } - - if (dy && wheelPixelsPerUnit != null) { - var pixels = dy * wheelPixelsPerUnit; - var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; - if (pixels < 0) top = Math.max(0, top + pixels - 50); - else bot = Math.min(cm.doc.height, bot + pixels + 50); - updateDisplay(cm, [], {top: top, bottom: bot}); - } - - if (wheelSamples < 20) { - if (display.wheelStartX == null) { - display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; - display.wheelDX = dx; display.wheelDY = dy; - setTimeout(function() { - if (display.wheelStartX == null) return; - var movedX = scroll.scrollLeft - display.wheelStartX; - var movedY = scroll.scrollTop - display.wheelStartY; - var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || - (movedX && display.wheelDX && movedX / display.wheelDX); - display.wheelStartX = display.wheelStartY = null; - if (!sample) return; - wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); - ++wheelSamples; - }, 200); - } else { - display.wheelDX += dx; display.wheelDY += dy; - } - } - } - - function doHandleBinding(cm, bound, dropShift) { - if (typeof bound == "string") { - bound = commands[bound]; - if (!bound) return false; - } - // Ensure previous input has been read, so that the handler sees a - // consistent view of the document - if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false; - var doc = cm.doc, prevShift = doc.sel.shift, done = false; - try { - if (isReadOnly(cm)) cm.state.suppressEdits = true; - if (dropShift) doc.sel.shift = false; - done = bound(cm) != Pass; - } finally { - doc.sel.shift = prevShift; - cm.state.suppressEdits = false; - } - return done; - } - - function allKeyMaps(cm) { - var maps = cm.state.keyMaps.slice(0); - maps.push(cm.options.keyMap); - if (cm.options.extraKeys) maps.unshift(cm.options.extraKeys); - return maps; - } - - var maybeTransition; - function handleKeyBinding(cm, e) { - // Handle auto keymap transitions - var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto; - clearTimeout(maybeTransition); - if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() { - if (getKeyMap(cm.options.keyMap) == startMap) - cm.options.keyMap = (next.call ? next.call(null, cm) : next); - }, 50); - - var name = keyName(e, true), handled = false; - if (!name) return false; - var keymaps = allKeyMaps(cm); - - if (e.shiftKey) { - // First try to resolve full name (including 'Shift-'). Failing - // that, see if there is a cursor-motion command (starting with - // 'go') bound to the keyname without 'Shift-'. - handled = lookupKey("Shift-" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);}) - || lookupKey(name, keymaps, function(b) { - if (typeof b == "string" && /^go[A-Z]/.test(b)) return doHandleBinding(cm, b); - }); - } else { - handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); }); - } - if (handled == "stop") handled = false; - - if (handled) { - e_preventDefault(e); - restartBlink(cm); - if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; } - } - return handled; - } - - function handleCharBinding(cm, e, ch) { - var handled = lookupKey("'" + ch + "'", allKeyMaps(cm), - function(b) { return doHandleBinding(cm, b, true); }); - if (handled) { - e_preventDefault(e); - restartBlink(cm); - } - return handled; - } - - var lastStoppedKey = null; - function onKeyDown(e) { - var cm = this; - if (!cm.state.focused) onFocus(cm); - if (ie && e.keyCode == 27) { e.returnValue = false; } - if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; - var code = e.keyCode; - // IE does strange things with escape. - cm.doc.sel.shift = code == 16 || e.shiftKey; - // First give onKeyEvent option a chance to handle this. - var handled = handleKeyBinding(cm, e); - if (opera) { - lastStoppedKey = handled ? code : null; - // Opera has no cut event... we try to at least catch the key combo - if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) - cm.replaceSelection(""); - } - } - - function onKeyPress(e) { - var cm = this; - if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; - var keyCode = e.keyCode, charCode = e.charCode; - if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;} - if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return; - var ch = String.fromCharCode(charCode == null ? keyCode : charCode); - if (this.options.electricChars && this.doc.mode.electricChars && - this.options.smartIndent && !isReadOnly(this) && - this.doc.mode.electricChars.indexOf(ch) > -1) - setTimeout(operation(cm, function() {indentLine(cm, cm.doc.sel.to.line, "smart");}), 75); - if (handleCharBinding(cm, e, ch)) return; - fastPoll(cm); - } - - function onFocus(cm) { - if (cm.options.readOnly == "nocursor") return; - if (!cm.state.focused) { - signal(cm, "focus", cm); - cm.state.focused = true; - if (cm.display.wrapper.className.search(/\bCodeMirror-focused\b/) == -1) - cm.display.wrapper.className += " CodeMirror-focused"; - resetInput(cm, true); - } - slowPoll(cm); - restartBlink(cm); - } - function onBlur(cm) { - if (cm.state.focused) { - signal(cm, "blur", cm); - cm.state.focused = false; - cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-focused", ""); - } - clearInterval(cm.display.blinker); - setTimeout(function() {if (!cm.state.focused) cm.doc.sel.shift = false;}, 150); - } - - var detectingSelectAll; - function onContextMenu(cm, e) { - var display = cm.display, sel = cm.doc.sel; - if (eventInWidget(display, e)) return; - - var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; - if (!pos || opera) return; // Opera is difficult. - if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to)) - operation(cm, setSelection)(cm.doc, pos, pos); - - var oldCSS = display.input.style.cssText; - display.inputDiv.style.position = "absolute"; - display.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) + - "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; outline: none;" + - "border-width: 0; outline: none; overflow: hidden; opacity: .05; -ms-opacity: .05; filter: alpha(opacity=5);"; - focusInput(cm); - resetInput(cm, true); - // Adds "Select all" to context menu in FF - if (posEq(sel.from, sel.to)) display.input.value = display.prevInput = " "; - - function rehide() { - display.inputDiv.style.position = "relative"; - display.input.style.cssText = oldCSS; - if (ie_lt9) display.scrollbarV.scrollTop = display.scroller.scrollTop = scrollPos; - slowPoll(cm); - - // Try to detect the user choosing select-all - if (display.input.selectionStart != null && (!ie || ie_lt9)) { - clearTimeout(detectingSelectAll); - var extval = display.input.value = " " + (posEq(sel.from, sel.to) ? "" : display.input.value), i = 0; - display.prevInput = " "; - display.input.selectionStart = 1; display.input.selectionEnd = extval.length; - var poll = function(){ - if (display.prevInput == " " && display.input.selectionStart == 0) - operation(cm, commands.selectAll)(cm); - else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500); - else resetInput(cm); - }; - detectingSelectAll = setTimeout(poll, 200); - } - } - - if (captureMiddleClick) { - e_stop(e); - var mouseup = function() { - off(window, "mouseup", mouseup); - setTimeout(rehide, 20); - }; - on(window, "mouseup", mouseup); - } else { - setTimeout(rehide, 50); - } - } - - // UPDATING - - function changeEnd(change) { - return Pos(change.from.line + change.text.length - 1, - lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)); - } - - // Make sure a position will be valid after the given change. - function clipPostChange(doc, change, pos) { - if (!posLess(change.from, pos)) return clipPos(doc, pos); - var diff = (change.text.length - 1) - (change.to.line - change.from.line); - if (pos.line > change.to.line + diff) { - var preLine = pos.line - diff, lastLine = doc.first + doc.size - 1; - if (preLine > lastLine) return Pos(lastLine, getLine(doc, lastLine).text.length); - return clipToLen(pos, getLine(doc, preLine).text.length); - } - if (pos.line == change.to.line + diff) - return clipToLen(pos, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0) + - getLine(doc, change.to.line).text.length - change.to.ch); - var inside = pos.line - change.from.line; - return clipToLen(pos, change.text[inside].length + (inside ? 0 : change.from.ch)); - } - - // Hint can be null|"end"|"start"|"around"|{anchor,head} - function computeSelAfterChange(doc, change, hint) { - if (hint && typeof hint == "object") // Assumed to be {anchor, head} object - return {anchor: clipPostChange(doc, change, hint.anchor), - head: clipPostChange(doc, change, hint.head)}; - - if (hint == "start") return {anchor: change.from, head: change.from}; - - var end = changeEnd(change); - if (hint == "around") return {anchor: change.from, head: end}; - if (hint == "end") return {anchor: end, head: end}; - - // hint is null, leave the selection alone as much as possible - var adjustPos = function(pos) { - if (posLess(pos, change.from)) return pos; - if (!posLess(change.to, pos)) return end; - - var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; - if (pos.line == change.to.line) ch += end.ch - change.to.ch; - return Pos(line, ch); - }; - return {anchor: adjustPos(doc.sel.anchor), head: adjustPos(doc.sel.head)}; - } - - function filterChange(doc, change) { - var obj = { - canceled: false, - from: change.from, - to: change.to, - text: change.text, - origin: change.origin, - update: function(from, to, text, origin) { - if (from) this.from = clipPos(doc, from); - if (to) this.to = clipPos(doc, to); - if (text) this.text = text; - if (origin !== undefined) this.origin = origin; - }, - cancel: function() { this.canceled = true; } - }; - signal(doc, "beforeChange", doc, obj); - if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj); - - if (obj.canceled) return null; - return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}; - } - - // Replace the range from from to to by the strings in replacement. - // change is a {from, to, text [, origin]} object - function makeChange(doc, change, selUpdate, ignoreReadOnly) { - if (doc.cm) { - if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, selUpdate, ignoreReadOnly); - if (doc.cm.state.suppressEdits) return; - } - - if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { - change = filterChange(doc, change); - if (!change) return; - } - - // Possibly split or suppress the update based on the presence - // of read-only spans in its range. - var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); - if (split) { - for (var i = split.length - 1; i >= 1; --i) - makeChangeNoReadonly(doc, {from: split[i].from, to: split[i].to, text: [""]}); - if (split.length) - makeChangeNoReadonly(doc, {from: split[0].from, to: split[0].to, text: change.text}, selUpdate); - } else { - makeChangeNoReadonly(doc, change, selUpdate); - } - } - - function makeChangeNoReadonly(doc, change, selUpdate) { - var selAfter = computeSelAfterChange(doc, change, selUpdate); - addToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); - - makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); - var rebased = []; - - linkedDocs(doc, function(doc, sharedHist) { - if (!sharedHist && indexOf(rebased, doc.history) == -1) { - rebaseHist(doc.history, change); - rebased.push(doc.history); - } - makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); - }); - } - - function makeChangeFromHistory(doc, type) { - var hist = doc.history; - var event = (type == "undo" ? hist.done : hist.undone).pop(); - if (!event) return; - hist.dirtyCounter += type == "undo" ? -1 : 1; - - var anti = {changes: [], anchorBefore: event.anchorAfter, headBefore: event.headAfter, - anchorAfter: event.anchorBefore, headAfter: event.headBefore}; - (type == "undo" ? hist.undone : hist.done).push(anti); - - for (var i = event.changes.length - 1; i >= 0; --i) { - var change = event.changes[i]; - change.origin = type; - anti.changes.push(historyChangeFromChange(doc, change)); - - var after = i ? computeSelAfterChange(doc, change, null) - : {anchor: event.anchorBefore, head: event.headBefore}; - makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); - var rebased = []; - - linkedDocs(doc, function(doc, sharedHist) { - if (!sharedHist && indexOf(rebased, doc.history) == -1) { - rebaseHist(doc.history, change); - rebased.push(doc.history); - } - makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); - }); - } - } - - function shiftDoc(doc, distance) { - function shiftPos(pos) {return Pos(pos.line + distance, pos.ch);} - doc.first += distance; - if (doc.cm) regChange(doc.cm, doc.first, doc.first, distance); - doc.sel.head = shiftPos(doc.sel.head); doc.sel.anchor = shiftPos(doc.sel.anchor); - doc.sel.from = shiftPos(doc.sel.from); doc.sel.to = shiftPos(doc.sel.to); - } - - function makeChangeSingleDoc(doc, change, selAfter, spans) { - if (doc.cm && !doc.cm.curOp) - return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans); - - if (change.to.line < doc.first) { - shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); - return; - } - if (change.from.line > doc.lastLine()) return; - - // Clip the change to the size of this doc - if (change.from.line < doc.first) { - var shift = change.text.length - 1 - (doc.first - change.from.line); - shiftDoc(doc, shift); - change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), - text: [lst(change.text)], origin: change.origin}; - } - var last = doc.lastLine(); - if (change.to.line > last) { - change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), - text: [change.text[0]], origin: change.origin}; - } - - if (!selAfter) selAfter = computeSelAfterChange(doc, change, null); - if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans, selAfter); - else updateDoc(doc, change, spans, selAfter); - } - - function makeChangeSingleDocInEditor(cm, change, spans, selAfter) { - var doc = cm.doc, display = cm.display, from = change.from, to = change.to; - - var recomputeMaxLength = false, checkWidthStart = from.line; - if (!cm.options.lineWrapping) { - checkWidthStart = lineNo(visualLine(doc, getLine(doc, from.line))); - doc.iter(checkWidthStart, to.line + 1, function(line) { - if (line == display.maxLine) { - recomputeMaxLength = true; - return true; - } - }); - } - - updateDoc(doc, change, spans, selAfter, estimateHeight(cm)); - - if (!cm.options.lineWrapping) { - doc.iter(checkWidthStart, from.line + change.text.length, function(line) { - var len = lineLength(doc, line); - if (len > display.maxLineLength) { - display.maxLine = line; - display.maxLineLength = len; - display.maxLineChanged = true; - recomputeMaxLength = false; - } - }); - if (recomputeMaxLength) cm.curOp.updateMaxLine = true; - } - - // Adjust frontier, schedule worker - doc.frontier = Math.min(doc.frontier, from.line); - startWorker(cm, 400); - - var lendiff = change.text.length - (to.line - from.line) - 1; - // Remember that these lines changed, for updating the display - regChange(cm, from.line, to.line + 1, lendiff); - if (hasHandler(cm, "change")) { - var changeObj = {from: from, to: to, text: change.text, origin: change.origin}; - if (cm.curOp.textChanged) { - for (var cur = cm.curOp.textChanged; cur.next; cur = cur.next) {} - cur.next = changeObj; - } else cm.curOp.textChanged = changeObj; - } - } - - function replaceRange(doc, code, from, to, origin) { - if (!to) to = from; - if (posLess(to, from)) { var tmp = to; to = from; from = tmp; } - if (typeof code == "string") code = splitLines(code); - makeChange(doc, {from: from, to: to, text: code, origin: origin}, null); - } - - // POSITION OBJECT - - function Pos(line, ch) { - if (!(this instanceof Pos)) return new Pos(line, ch); - this.line = line; this.ch = ch; - } - CodeMirror.Pos = Pos; - - function posEq(a, b) {return a.line == b.line && a.ch == b.ch;} - function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);} - function copyPos(x) {return Pos(x.line, x.ch);} - - // SELECTION - - function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));} - function clipPos(doc, pos) { - if (pos.line < doc.first) return Pos(doc.first, 0); - var last = doc.first + doc.size - 1; - if (pos.line > last) return Pos(last, getLine(doc, last).text.length); - return clipToLen(pos, getLine(doc, pos.line).text.length); - } - function clipToLen(pos, linelen) { - var ch = pos.ch; - if (ch == null || ch > linelen) return Pos(pos.line, linelen); - else if (ch < 0) return Pos(pos.line, 0); - else return pos; - } - function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;} - - // If shift is held, this will move the selection anchor. Otherwise, - // it'll set the whole selection. - function extendSelection(doc, pos, other, bias) { - if (doc.sel.shift || doc.sel.extend) { - var anchor = doc.sel.anchor; - if (other) { - var posBefore = posLess(pos, anchor); - if (posBefore != posLess(other, anchor)) { - anchor = pos; - pos = other; - } else if (posBefore != posLess(pos, other)) { - pos = other; - } - } - setSelection(doc, anchor, pos, bias); - } else { - setSelection(doc, pos, other || pos, bias); - } - if (doc.cm) doc.cm.curOp.userSelChange = true; - } - - function filterSelectionChange(doc, anchor, head) { - var obj = {anchor: anchor, head: head}; - signal(doc, "beforeSelectionChange", doc, obj); - if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj); - obj.anchor = clipPos(doc, obj.anchor); obj.head = clipPos(doc, obj.head); - return obj; - } - - // Update the selection. Last two args are only used by - // updateDoc, since they have to be expressed in the line - // numbers before the update. - function setSelection(doc, anchor, head, bias, checkAtomic) { - if (!checkAtomic && hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) { - var filtered = filterSelectionChange(doc, anchor, head); - head = filtered.head; - anchor = filtered.anchor; - } - - var sel = doc.sel; - sel.goalColumn = null; - // Skip over atomic spans. - if (checkAtomic || !posEq(anchor, sel.anchor)) - anchor = skipAtomic(doc, anchor, bias, checkAtomic != "push"); - if (checkAtomic || !posEq(head, sel.head)) - head = skipAtomic(doc, head, bias, checkAtomic != "push"); - - if (posEq(sel.anchor, anchor) && posEq(sel.head, head)) return; - - sel.anchor = anchor; sel.head = head; - var inv = posLess(head, anchor); - sel.from = inv ? head : anchor; - sel.to = inv ? anchor : head; - - if (doc.cm) - doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true; - - signalLater(doc, "cursorActivity", doc); - } - - function reCheckSelection(cm) { - setSelection(cm.doc, cm.doc.sel.from, cm.doc.sel.to, null, "push"); - } - - function skipAtomic(doc, pos, bias, mayClear) { - var flipped = false, curPos = pos; - var dir = bias || 1; - doc.cantEdit = false; - search: for (;;) { - var line = getLine(doc, curPos.line), toClear; - if (line.markedSpans) { - for (var i = 0; i < line.markedSpans.length; ++i) { - var sp = line.markedSpans[i], m = sp.marker; - if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) && - (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) { - if (mayClear && m.clearOnEnter) { - (toClear || (toClear = [])).push(m); - continue; - } else if (!m.atomic) continue; - var newPos = m.find()[dir < 0 ? "from" : "to"]; - if (posEq(newPos, curPos)) { - newPos.ch += dir; - if (newPos.ch < 0) { - if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1)); - else newPos = null; - } else if (newPos.ch > line.text.length) { - if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0); - else newPos = null; - } - if (!newPos) { - if (flipped) { - // Driven in a corner -- no valid cursor position found at all - // -- try again *with* clearing, if we didn't already - if (!mayClear) return skipAtomic(doc, pos, bias, true); - // Otherwise, turn off editing until further notice, and return the start of the doc - doc.cantEdit = true; - return Pos(doc.first, 0); - } - flipped = true; newPos = pos; dir = -dir; - } - } - curPos = newPos; - continue search; - } - } - if (toClear) for (var i = 0; i < toClear.length; ++i) toClear[i].clear(); - } - return curPos; - } - } - - // SCROLLING - - function scrollCursorIntoView(cm) { - var coords = scrollPosIntoView(cm, cm.doc.sel.head); - if (!cm.state.focused) return; - var display = cm.display, box = getRect(display.sizer), doScroll = null, pTop = paddingTop(cm.display); - if (coords.top + pTop + box.top < 0) doScroll = true; - else if (coords.bottom + pTop + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false; - if (doScroll != null && !phantom) { - var hidden = display.cursor.style.display == "none"; - if (hidden) { - display.cursor.style.display = ""; - display.cursor.style.left = coords.left + "px"; - display.cursor.style.top = (coords.top - display.viewOffset) + "px"; - } - display.cursor.scrollIntoView(doScroll); - if (hidden) display.cursor.style.display = "none"; - } - } - - function scrollPosIntoView(cm, pos, margin) { - if (margin == null) margin = 0; - for (;;) { - var changed = false, coords = cursorCoords(cm, pos); - var scrollPos = calculateScrollPos(cm, coords.left, coords.top - margin, coords.left, coords.bottom + margin); - var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; - if (scrollPos.scrollTop != null) { - setScrollTop(cm, scrollPos.scrollTop); - if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true; - } - if (scrollPos.scrollLeft != null) { - setScrollLeft(cm, scrollPos.scrollLeft); - if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true; - } - if (!changed) return coords; - } - } - - function scrollIntoView(cm, x1, y1, x2, y2) { - var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2); - if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop); - if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft); - } - - function calculateScrollPos(cm, x1, y1, x2, y2) { - var display = cm.display, pt = paddingTop(display); - y1 += pt; y2 += pt; - var screen = display.scroller.clientHeight - scrollerCutOff, screentop = display.scroller.scrollTop, result = {}; - var docBottom = cm.doc.height + paddingVert(display); - var atTop = y1 < pt + 10, atBottom = y2 + pt > docBottom - 10; - if (y1 < screentop) result.scrollTop = atTop ? 0 : Math.max(0, y1); - else if (y2 > screentop + screen) result.scrollTop = (atBottom ? docBottom : y2) - screen; - - var screenw = display.scroller.clientWidth - scrollerCutOff, screenleft = display.scroller.scrollLeft; - x1 += display.gutters.offsetWidth; x2 += display.gutters.offsetWidth; - var gutterw = display.gutters.offsetWidth; - var atLeft = x1 < gutterw + 10; - if (x1 < screenleft + gutterw || atLeft) { - if (atLeft) x1 = 0; - result.scrollLeft = Math.max(0, x1 - 10 - gutterw); - } else if (x2 > screenw + screenleft - 3) { - result.scrollLeft = x2 + 10 - screenw; - } - return result; - } - - function updateScrollPos(cm, left, top) { - cm.curOp.updateScrollPos = {scrollLeft: left, scrollTop: top}; - } - - function addToScrollPos(cm, left, top) { - var pos = cm.curOp.updateScrollPos || (cm.curOp.updateScrollPos = {scrollLeft: cm.doc.scrollLeft, scrollTop: cm.doc.scrollTop}); - var scroll = cm.display.scroller; - pos.scrollTop = Math.max(0, Math.min(scroll.scrollHeight - scroll.clientHeight, pos.scrollTop + top)); - pos.scrollLeft = Math.max(0, Math.min(scroll.scrollWidth - scroll.clientWidth, pos.scrollLeft + left)); - } - - // API UTILITIES - - function indentLine(cm, n, how, aggressive) { - var doc = cm.doc; - if (!how) how = "add"; - if (how == "smart") { - if (!cm.doc.mode.indent) how = "prev"; - else var state = getStateBefore(cm, n); - } - - var tabSize = cm.options.tabSize; - var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); - var curSpaceString = line.text.match(/^\s*/)[0], indentation; - if (how == "smart") { - indentation = cm.doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); - if (indentation == Pass) { - if (!aggressive) return; - how = "prev"; - } - } - if (how == "prev") { - if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize); - else indentation = 0; - } else if (how == "add") { - indentation = curSpace + cm.options.indentUnit; - } else if (how == "subtract") { - indentation = curSpace - cm.options.indentUnit; - } - indentation = Math.max(0, indentation); - - var indentString = "", pos = 0; - if (cm.options.indentWithTabs) - for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} - if (pos < indentation) indentString += spaceStr(indentation - pos); - - if (indentString != curSpaceString) - replaceRange(cm.doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); - line.stateAfter = null; - } - - function changeLine(cm, handle, op) { - var no = handle, line = handle, doc = cm.doc; - if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle)); - else no = lineNo(handle); - if (no == null) return null; - if (op(line, no)) regChange(cm, no, no + 1); - else return null; - return line; - } - - function findPosH(doc, pos, dir, unit, visually) { - var line = pos.line, ch = pos.ch; - var lineObj = getLine(doc, line); - var possible = true; - function findNextLine() { - var l = line + dir; - if (l < doc.first || l >= doc.first + doc.size) return (possible = false); - line = l; - return lineObj = getLine(doc, l); - } - function moveOnce(boundToLine) { - var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true); - if (next == null) { - if (!boundToLine && findNextLine()) { - if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj); - else ch = dir < 0 ? lineObj.text.length : 0; - } else return (possible = false); - } else ch = next; - return true; - } - - if (unit == "char") moveOnce(); - else if (unit == "column") moveOnce(true); - else if (unit == "word" || unit == "wordBoundary") { - var sawWord = false, boundary = unit == "wordBoundary", cur = null; - for (;;) { - if (dir < 0 && !moveOnce()) break; - var wordChar = isWordChar(lineObj.text.charAt(ch)), done = false; - if (boundary) { - if (cur == null) cur = wordChar; - else done = cur != wordChar; - } else { - if (wordChar) sawWord = true; - else done = sawWord; - } - if (done) {if (dir < 0) {dir = 1; moveOnce();} break;} - if (dir > 0 && !moveOnce()) break; - } - } - var result = skipAtomic(doc, Pos(line, ch), dir, true); - if (!possible) result.hitSide = true; - return result; - } - - function findPosV(cm, pos, dir, unit) { - var doc = cm.doc, x = pos.left, y; - if (unit == "page") { - var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); - y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display)); - } else if (unit == "line") { - y = dir > 0 ? pos.bottom + 3 : pos.top - 3; - } - for (;;) { - var target = coordsChar(cm, x, y); - if (!target.outside) break; - if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; } - y += dir * 5; - } - return target; - } - - function findWordAt(line, pos) { - var start = pos.ch, end = pos.ch; - if (line) { - if (pos.after === false || end == line.length) --start; else ++end; - var startChar = line.charAt(start); - var check = isWordChar(startChar) ? isWordChar : - /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);} : - function(ch) {return !/\s/.test(ch) && !isWordChar(ch);}; - while (start > 0 && check(line.charAt(start - 1))) --start; - while (end < line.length && check(line.charAt(end))) ++end; - } - return {from: Pos(pos.line, start), to: Pos(pos.line, end)}; - } - - function selectLine(cm, line) { - extendSelection(cm.doc, Pos(line, 0), clipPos(cm.doc, Pos(line + 1, 0))); - } - - // PROTOTYPE - - // The publicly visible API. Note that operation(null, f) means - // 'wrap f in an operation, performed on its `this` parameter' - - CodeMirror.prototype = { - focus: function(){window.focus(); focusInput(this); onFocus(this); fastPoll(this);}, - - setOption: function(option, value) { - var options = this.options, old = options[option]; - if (options[option] == value && option != "mode") return; - options[option] = value; - if (optionHandlers.hasOwnProperty(option)) - operation(this, optionHandlers[option])(this, value, old); - }, - - getOption: function(option) {return this.options[option];}, - getDoc: function() {return this.doc;}, - - addKeyMap: function(map) { - this.state.keyMaps.push(map); - }, - removeKeyMap: function(map) { - var maps = this.state.keyMaps; - for (var i = 0; i < maps.length; ++i) - if ((typeof map == "string" ? maps[i].name : maps[i]) == map) { - maps.splice(i, 1); - return true; - } - }, - - addOverlay: operation(null, function(spec, options) { - var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); - if (mode.startState) throw new Error("Overlays may not be stateful."); - this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque}); - this.state.modeGen++; - regChange(this); - }), - removeOverlay: operation(null, function(spec) { - var overlays = this.state.overlays; - for (var i = 0; i < overlays.length; ++i) { - if (overlays[i].modeSpec == spec) { - overlays.splice(i, 1); - this.state.modeGen++; - regChange(this); - return; - } - } - }), - - indentLine: operation(null, function(n, dir, aggressive) { - if (typeof dir != "string") { - if (dir == null) dir = this.options.smartIndent ? "smart" : "prev"; - else dir = dir ? "add" : "subtract"; - } - if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive); - }), - indentSelection: operation(null, function(how) { - var sel = this.doc.sel; - if (posEq(sel.from, sel.to)) return indentLine(this, sel.from.line, how); - var e = sel.to.line - (sel.to.ch ? 0 : 1); - for (var i = sel.from.line; i <= e; ++i) indentLine(this, i, how); - }), - - // Fetch the parser token for a given character. Useful for hacks - // that want to inspect the mode state (say, for completion). - getTokenAt: function(pos) { - var doc = this.doc; - pos = clipPos(doc, pos); - var state = getStateBefore(this, pos.line), mode = this.doc.mode; - var line = getLine(doc, pos.line); - var stream = new StringStream(line.text, this.options.tabSize); - while (stream.pos < pos.ch && !stream.eol()) { - stream.start = stream.pos; - var style = mode.token(stream, state); - } - return {start: stream.start, - end: stream.pos, - string: stream.current(), - className: style || null, // Deprecated, use 'type' instead - type: style || null, - state: state}; - }, - - getStateAfter: function(line) { - var doc = this.doc; - line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); - return getStateBefore(this, line + 1); - }, - - cursorCoords: function(start, mode) { - var pos, sel = this.doc.sel; - if (start == null) pos = sel.head; - else if (typeof start == "object") pos = clipPos(this.doc, start); - else pos = start ? sel.from : sel.to; - return cursorCoords(this, pos, mode || "page"); - }, - - charCoords: function(pos, mode) { - return charCoords(this, clipPos(this.doc, pos), mode || "page"); - }, - - coordsChar: function(coords) { - var off = getRect(this.display.lineSpace); - var scrollY = window.pageYOffset || (document.documentElement || document.body).scrollTop; - var scrollX = window.pageXOffset || (document.documentElement || document.body).scrollLeft; - return coordsChar(this, coords.left - off.left - scrollX, coords.top - off.top - scrollY); - }, - - defaultTextHeight: function() { return textHeight(this.display); }, - defaultCharWidth: function() { return charWidth(this.display); }, - - setGutterMarker: operation(null, function(line, gutterID, value) { - return changeLine(this, line, function(line) { - var markers = line.gutterMarkers || (line.gutterMarkers = {}); - markers[gutterID] = value; - if (!value && isEmpty(markers)) line.gutterMarkers = null; - return true; - }); - }), - - clearGutter: operation(null, function(gutterID) { - var cm = this, doc = cm.doc, i = doc.first; - doc.iter(function(line) { - if (line.gutterMarkers && line.gutterMarkers[gutterID]) { - line.gutterMarkers[gutterID] = null; - regChange(cm, i, i + 1); - if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null; - } - ++i; - }); - }), - - addLineClass: operation(null, function(handle, where, cls) { - return changeLine(this, handle, function(line) { - var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass"; - if (!line[prop]) line[prop] = cls; - else if (new RegExp("\\b" + cls + "\\b").test(line[prop])) return false; - else line[prop] += " " + cls; - return true; - }); - }), - - removeLineClass: operation(null, function(handle, where, cls) { - return changeLine(this, handle, function(line) { - var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass"; - var cur = line[prop]; - if (!cur) return false; - else if (cls == null) line[prop] = null; - else { - var upd = cur.replace(new RegExp("^" + cls + "\\b\\s*|\\s*\\b" + cls + "\\b"), ""); - if (upd == cur) return false; - line[prop] = upd || null; - } - return true; - }); - }), - - addLineWidget: operation(null, function(handle, node, options) { - return addLineWidget(this, handle, node, options); - }), - - removeLineWidget: function(widget) { widget.clear(); }, - - lineInfo: function(line) { - if (typeof line == "number") { - if (!isLine(this.doc, line)) return null; - var n = line; - line = getLine(this.doc, line); - if (!line) return null; - } else { - var n = lineNo(line); - if (n == null) return null; - } - return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, - textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, - widgets: line.widgets}; - }, - - getViewport: function() { return {from: this.display.showingFrom, to: this.display.showingTo};}, - - addWidget: function(pos, node, scroll, vert, horiz) { - var display = this.display; - pos = cursorCoords(this, clipPos(this.doc, pos)); - var top = pos.bottom, left = pos.left; - node.style.position = "absolute"; - display.sizer.appendChild(node); - if (vert == "over") { - top = pos.top; - } else if (vert == "above" || vert == "near") { - var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), - hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); - // Default to positioning above (if specified and possible); otherwise default to positioning below - if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) - top = pos.top - node.offsetHeight; - else if (pos.bottom + node.offsetHeight <= vspace) - top = pos.bottom; - if (left + node.offsetWidth > hspace) - left = hspace - node.offsetWidth; - } - node.style.top = (top + paddingTop(display)) + "px"; - node.style.left = node.style.right = ""; - if (horiz == "right") { - left = display.sizer.clientWidth - node.offsetWidth; - node.style.right = "0px"; - } else { - if (horiz == "left") left = 0; - else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2; - node.style.left = left + "px"; - } - if (scroll) - scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight); - }, - - triggerOnKeyDown: operation(null, onKeyDown), - - execCommand: function(cmd) {return commands[cmd](this);}, - - findPosH: function(from, amount, unit, visually) { - var dir = 1; - if (amount < 0) { dir = -1; amount = -amount; } - for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) { - cur = findPosH(this.doc, cur, dir, unit, visually); - if (cur.hitSide) break; - } - return cur; - }, - - moveH: operation(null, function(dir, unit) { - var sel = this.doc.sel, pos; - if (sel.shift || sel.extend || posEq(sel.from, sel.to)) - pos = findPosH(this.doc, sel.head, dir, unit, this.options.rtlMoveVisually); - else - pos = dir < 0 ? sel.from : sel.to; - extendSelection(this.doc, pos, pos, dir); - }), - - deleteH: operation(null, function(dir, unit) { - var sel = this.doc.sel; - if (!posEq(sel.from, sel.to)) replaceRange(this.doc, "", sel.from, sel.to, "+delete"); - else replaceRange(this.doc, "", sel.from, findPosH(this.doc, sel.head, dir, unit, false), "+delete"); - this.curOp.userSelChange = true; - }), - - findPosV: function(from, amount, unit, goalColumn) { - var dir = 1, x = goalColumn; - if (amount < 0) { dir = -1; amount = -amount; } - for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) { - var coords = cursorCoords(this, cur, "div"); - if (x == null) x = coords.left; - else coords.left = x; - cur = findPosV(this, coords, dir, unit); - if (cur.hitSide) break; - } - return cur; - }, - - moveV: operation(null, function(dir, unit) { - var sel = this.doc.sel; - var pos = cursorCoords(this, sel.head, "div"); - if (sel.goalColumn != null) pos.left = sel.goalColumn; - var target = findPosV(this, pos, dir, unit); - - if (unit == "page") addToScrollPos(this, 0, charCoords(this, target, "div").top - pos.top); - extendSelection(this.doc, target, target, dir); - sel.goalColumn = pos.left; - }), - - toggleOverwrite: function() { - if (this.state.overwrite = !this.state.overwrite) - this.display.cursor.className += " CodeMirror-overwrite"; - else - this.display.cursor.className = this.display.cursor.className.replace(" CodeMirror-overwrite", ""); - }, - - scrollTo: operation(null, function(x, y) { - updateScrollPos(this, x, y); - }), - getScrollInfo: function() { - var scroller = this.display.scroller, co = scrollerCutOff; - return {left: scroller.scrollLeft, top: scroller.scrollTop, - height: scroller.scrollHeight - co, width: scroller.scrollWidth - co, - clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co}; - }, - - scrollIntoView: function(pos, margin) { - if (typeof pos == "number") pos = Pos(pos, 0); - if (!pos || pos.line != null) { - pos = pos ? clipPos(this.doc, pos) : this.doc.sel.head; - scrollPosIntoView(this, pos, margin); - } else { - scrollIntoView(this, pos.left, pos.top - margin, pos.right, pos.bottom + margin); - } - }, - - setSize: function(width, height) { - function interpret(val) { - return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; - } - if (width != null) this.display.wrapper.style.width = interpret(width); - if (height != null) this.display.wrapper.style.height = interpret(height); - this.refresh(); - }, - - on: function(type, f) {on(this, type, f);}, - off: function(type, f) {off(this, type, f);}, - - operation: function(f){return runInOp(this, f);}, - - refresh: operation(null, function() { - clearCaches(this); - updateScrollPos(this, this.doc.scrollLeft, this.doc.scrollTop); - regChange(this); - }), - - swapDoc: operation(null, function(doc) { - var old = this.doc; - old.cm = null; - attachDoc(this, doc); - clearCaches(this); - updateScrollPos(this, doc.scrollLeft, doc.scrollTop); - return old; - }), - - getInputField: function(){return this.display.input;}, - getWrapperElement: function(){return this.display.wrapper;}, - getScrollerElement: function(){return this.display.scroller;}, - getGutterElement: function(){return this.display.gutters;} - }; - - // OPTION DEFAULTS - - var optionHandlers = CodeMirror.optionHandlers = {}; - - // The default configuration options. - var defaults = CodeMirror.defaults = {}; - - function option(name, deflt, handle, notOnInit) { - CodeMirror.defaults[name] = deflt; - if (handle) optionHandlers[name] = - notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle; - } - - var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}}; - - // These two are, on init, called from the constructor because they - // have to be initialized before the editor can start at all. - option("value", "", function(cm, val) { - cm.setValue(val); - }, true); - option("mode", null, function(cm, val) { - cm.doc.modeOption = val; - loadMode(cm); - }, true); - - option("indentUnit", 2, loadMode, true); - option("indentWithTabs", false); - option("smartIndent", true); - option("tabSize", 4, function(cm) { - loadMode(cm); - clearCaches(cm); - regChange(cm); - }, true); - option("electricChars", true); - option("rtlMoveVisually", !windows); - - option("theme", "default", function(cm) { - themeChanged(cm); - guttersChanged(cm); - }, true); - option("keyMap", "default", keyMapChanged); - option("extraKeys", null); - - option("onKeyEvent", null); - option("onDragEvent", null); - - option("lineWrapping", false, wrappingChanged, true); - option("gutters", [], function(cm) { - setGuttersForLineNumbers(cm.options); - guttersChanged(cm); - }, true); - option("fixedGutter", true, function(cm, val) { - cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; - cm.refresh(); - }, true); - option("lineNumbers", false, function(cm) { - setGuttersForLineNumbers(cm.options); - guttersChanged(cm); - }, true); - option("firstLineNumber", 1, guttersChanged, true); - option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true); - option("showCursorWhenSelecting", false, updateSelection, true); - - option("readOnly", false, function(cm, val) { - if (val == "nocursor") {onBlur(cm); cm.display.input.blur();} - else if (!val) resetInput(cm, true); - }); - option("dragDrop", true); - - option("cursorBlinkRate", 530); - option("cursorHeight", 1); - option("workTime", 100); - option("workDelay", 100); - option("flattenSpans", true); - option("pollInterval", 100); - option("undoDepth", 40, function(cm, val){cm.doc.history.undoDepth = val;}); - option("viewportMargin", 10, function(cm){cm.refresh();}, true); - - option("tabindex", null, function(cm, val) { - cm.display.input.tabIndex = val || ""; - }); - option("autofocus", null); - - // MODE DEFINITION AND QUERYING - - // Known modes, by name and by MIME - var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; - - CodeMirror.defineMode = function(name, mode) { - if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name; - if (arguments.length > 2) { - mode.dependencies = []; - for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]); - } - modes[name] = mode; - }; - - CodeMirror.defineMIME = function(mime, spec) { - mimeModes[mime] = spec; - }; - - CodeMirror.resolveMode = function(spec) { - if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) - spec = mimeModes[spec]; - else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) - return CodeMirror.resolveMode("application/xml"); - if (typeof spec == "string") return {name: spec}; - else return spec || {name: "null"}; - }; - - CodeMirror.getMode = function(options, spec) { - spec = CodeMirror.resolveMode(spec); - var mfactory = modes[spec.name]; - if (!mfactory) return CodeMirror.getMode(options, "text/plain"); - var modeObj = mfactory(options, spec); - if (modeExtensions.hasOwnProperty(spec.name)) { - var exts = modeExtensions[spec.name]; - for (var prop in exts) { - if (!exts.hasOwnProperty(prop)) continue; - if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop]; - modeObj[prop] = exts[prop]; - } - } - modeObj.name = spec.name; - return modeObj; - }; - - CodeMirror.defineMode("null", function() { - return {token: function(stream) {stream.skipToEnd();}}; - }); - CodeMirror.defineMIME("text/plain", "null"); - - var modeExtensions = CodeMirror.modeExtensions = {}; - CodeMirror.extendMode = function(mode, properties) { - var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); - copyObj(properties, exts); - }; - - // EXTENSIONS - - CodeMirror.defineExtension = function(name, func) { - CodeMirror.prototype[name] = func; - }; - - CodeMirror.defineOption = option; - - var initHooks = []; - CodeMirror.defineInitHook = function(f) {initHooks.push(f);}; - - // MODE STATE HANDLING - - // Utility functions for working with state. Exported because modes - // sometimes need to do this. - function copyState(mode, state) { - if (state === true) return state; - if (mode.copyState) return mode.copyState(state); - var nstate = {}; - for (var n in state) { - var val = state[n]; - if (val instanceof Array) val = val.concat([]); - nstate[n] = val; - } - return nstate; - } - CodeMirror.copyState = copyState; - - function startState(mode, a1, a2) { - return mode.startState ? mode.startState(a1, a2) : true; - } - CodeMirror.startState = startState; - - CodeMirror.innerMode = function(mode, state) { - while (mode.innerMode) { - var info = mode.innerMode(state); - state = info.state; - mode = info.mode; - } - return info || {mode: mode, state: state}; - }; - - // STANDARD COMMANDS - - var commands = CodeMirror.commands = { - selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()));}, - killLine: function(cm) { - var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to); - if (!sel && cm.getLine(from.line).length == from.ch) - cm.replaceRange("", from, Pos(from.line + 1, 0), "+delete"); - else cm.replaceRange("", from, sel ? to : Pos(from.line), "+delete"); - }, - deleteLine: function(cm) { - var l = cm.getCursor().line; - cm.replaceRange("", Pos(l, 0), Pos(l), "+delete"); - }, - undo: function(cm) {cm.undo();}, - redo: function(cm) {cm.redo();}, - goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));}, - goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));}, - goLineStart: function(cm) { - cm.extendSelection(lineStart(cm, cm.getCursor().line)); - }, - goLineStartSmart: function(cm) { - var cur = cm.getCursor(), start = lineStart(cm, cur.line); - var line = cm.getLineHandle(start.line); - var order = getOrder(line); - if (!order || order[0].level == 0) { - var firstNonWS = Math.max(0, line.text.search(/\S/)); - var inWS = cur.line == start.line && cur.ch <= firstNonWS && cur.ch; - cm.extendSelection(Pos(start.line, inWS ? 0 : firstNonWS)); - } else cm.extendSelection(start); - }, - goLineEnd: function(cm) { - cm.extendSelection(lineEnd(cm, cm.getCursor().line)); - }, - goLineUp: function(cm) {cm.moveV(-1, "line");}, - goLineDown: function(cm) {cm.moveV(1, "line");}, - goPageUp: function(cm) {cm.moveV(-1, "page");}, - goPageDown: function(cm) {cm.moveV(1, "page");}, - goCharLeft: function(cm) {cm.moveH(-1, "char");}, - goCharRight: function(cm) {cm.moveH(1, "char");}, - goColumnLeft: function(cm) {cm.moveH(-1, "column");}, - goColumnRight: function(cm) {cm.moveH(1, "column");}, - goWordLeft: function(cm) {cm.moveH(-1, "word");}, - goWordRight: function(cm) {cm.moveH(1, "word");}, - goWordBoundaryLeft: function(cm) {cm.moveH(-1, "wordBoundary");}, - goWordBoundaryRight: function(cm) {cm.moveH(1, "wordBoundary");}, - delCharBefore: function(cm) {cm.deleteH(-1, "char");}, - delCharAfter: function(cm) {cm.deleteH(1, "char");}, - delWordBefore: function(cm) {cm.deleteH(-1, "word");}, - delWordAfter: function(cm) {cm.deleteH(1, "word");}, - indentAuto: function(cm) {cm.indentSelection("smart");}, - indentMore: function(cm) {cm.indentSelection("add");}, - indentLess: function(cm) {cm.indentSelection("subtract");}, - insertTab: function(cm) {cm.replaceSelection("\t", "end", "+input");}, - defaultTab: function(cm) { - if (cm.somethingSelected()) cm.indentSelection("add"); - else cm.replaceSelection("\t", "end", "+input"); - }, - transposeChars: function(cm) { - var cur = cm.getCursor(), line = cm.getLine(cur.line); - if (cur.ch > 0 && cur.ch < line.length - 1) - cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1), - Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1)); - }, - newlineAndIndent: function(cm) { - operation(cm, function() { - cm.replaceSelection("\n", "end", "+input"); - cm.indentLine(cm.getCursor().line, null, true); - })(); - }, - toggleOverwrite: function(cm) {cm.toggleOverwrite();} - }; - - // STANDARD KEYMAPS - - var keyMap = CodeMirror.keyMap = {}; - keyMap.basic = { - "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", - "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", - "Delete": "delCharAfter", "Backspace": "delCharBefore", "Tab": "defaultTab", "Shift-Tab": "indentAuto", - "Enter": "newlineAndIndent", "Insert": "toggleOverwrite" - }; - // Note that the save and find-related commands aren't defined by - // default. Unknown commands are simply ignored. - keyMap.pcDefault = { - "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", - "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd", - "Ctrl-Left": "goWordBoundaryLeft", "Ctrl-Right": "goWordBoundaryRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", - "Ctrl-Backspace": "delWordBefore", "Ctrl-Delete": "delWordAfter", "Ctrl-S": "save", "Ctrl-F": "find", - "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", - "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", - fallthrough: "basic" - }; - keyMap.macDefault = { - "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", - "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goWordBoundaryLeft", - "Alt-Right": "goWordBoundaryRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delWordBefore", - "Ctrl-Alt-Backspace": "delWordAfter", "Alt-Delete": "delWordAfter", "Cmd-S": "save", "Cmd-F": "find", - "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", - "Cmd-[": "indentLess", "Cmd-]": "indentMore", - fallthrough: ["basic", "emacsy"] - }; - keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; - keyMap.emacsy = { - "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", - "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", - "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", - "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars" - }; - - // KEYMAP DISPATCH - - function getKeyMap(val) { - if (typeof val == "string") return keyMap[val]; - else return val; - } - - function lookupKey(name, maps, handle) { - function lookup(map) { - map = getKeyMap(map); - var found = map[name]; - if (found === false) return "stop"; - if (found != null && handle(found)) return true; - if (map.nofallthrough) return "stop"; - - var fallthrough = map.fallthrough; - if (fallthrough == null) return false; - if (Object.prototype.toString.call(fallthrough) != "[object Array]") - return lookup(fallthrough); - for (var i = 0, e = fallthrough.length; i < e; ++i) { - var done = lookup(fallthrough[i]); - if (done) return done; - } - return false; - } - - for (var i = 0; i < maps.length; ++i) { - var done = lookup(maps[i]); - if (done) return done; - } - } - function isModifierKey(event) { - var name = keyNames[event.keyCode]; - return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; - } - function keyName(event, noShift) { - var name = keyNames[event.keyCode]; - if (name == null || event.altGraphKey) return false; - if (event.altKey) name = "Alt-" + name; - if (flipCtrlCmd ? event.metaKey : event.ctrlKey) name = "Ctrl-" + name; - if (flipCtrlCmd ? event.ctrlKey : event.metaKey) name = "Cmd-" + name; - if (!noShift && event.shiftKey) name = "Shift-" + name; - return name; - } - CodeMirror.lookupKey = lookupKey; - CodeMirror.isModifierKey = isModifierKey; - CodeMirror.keyName = keyName; - - // FROMTEXTAREA - - CodeMirror.fromTextArea = function(textarea, options) { - if (!options) options = {}; - options.value = textarea.value; - if (!options.tabindex && textarea.tabindex) - options.tabindex = textarea.tabindex; - // Set autofocus to true if this textarea is focused, or if it has - // autofocus and no other element is focused. - if (options.autofocus == null) { - var hasFocus = document.body; - // doc.activeElement occasionally throws on IE - try { hasFocus = document.activeElement; } catch(e) {} - options.autofocus = hasFocus == textarea || - textarea.getAttribute("autofocus") != null && hasFocus == document.body; - } - - function save() {textarea.value = cm.getValue();} - if (textarea.form) { - on(textarea.form, "submit", save); - // Deplorable hack to make the submit method do the right thing. - if (!options.leaveSubmitMethodAlone) { - var form = textarea.form, realSubmit = form.submit; - try { - var wrappedSubmit = form.submit = function() { - save(); - form.submit = realSubmit; - form.submit(); - form.submit = wrappedSubmit; - }; - } catch(e) {} - } - } - - textarea.style.display = "none"; - var cm = CodeMirror(function(node) { - textarea.parentNode.insertBefore(node, textarea.nextSibling); - }, options); - cm.save = save; - cm.getTextArea = function() { return textarea; }; - cm.toTextArea = function() { - save(); - textarea.parentNode.removeChild(cm.getWrapperElement()); - textarea.style.display = ""; - if (textarea.form) { - off(textarea.form, "submit", save); - if (typeof textarea.form.submit == "function") - textarea.form.submit = realSubmit; - } - }; - return cm; - }; - - // STRING STREAM - - // Fed to the mode parsers, provides helper functions to make - // parsers more succinct. - - // The character stream used by a mode's parser. - function StringStream(string, tabSize) { - this.pos = this.start = 0; - this.string = string; - this.tabSize = tabSize || 8; - this.lastColumnPos = this.lastColumnValue = 0; - } - - StringStream.prototype = { - eol: function() {return this.pos >= this.string.length;}, - sol: function() {return this.pos == 0;}, - peek: function() {return this.string.charAt(this.pos) || undefined;}, - next: function() { - if (this.pos < this.string.length) - return this.string.charAt(this.pos++); - }, - eat: function(match) { - var ch = this.string.charAt(this.pos); - if (typeof match == "string") var ok = ch == match; - else var ok = ch && (match.test ? match.test(ch) : match(ch)); - if (ok) {++this.pos; return ch;} - }, - eatWhile: function(match) { - var start = this.pos; - while (this.eat(match)){} - return this.pos > start; - }, - eatSpace: function() { - var start = this.pos; - while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; - return this.pos > start; - }, - skipToEnd: function() {this.pos = this.string.length;}, - skipTo: function(ch) { - var found = this.string.indexOf(ch, this.pos); - if (found > -1) {this.pos = found; return true;} - }, - backUp: function(n) {this.pos -= n;}, - column: function() { - if (this.lastColumnPos < this.start) { - this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); - this.lastColumnPos = this.start; - } - return this.lastColumnValue; - }, - indentation: function() {return countColumn(this.string, null, this.tabSize);}, - match: function(pattern, consume, caseInsensitive) { - if (typeof pattern == "string") { - var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; - var substr = this.string.substr(this.pos, pattern.length); - if (cased(substr) == cased(pattern)) { - if (consume !== false) this.pos += pattern.length; - return true; - } - } else { - var match = this.string.slice(this.pos).match(pattern); - if (match && match.index > 0) return null; - if (match && consume !== false) this.pos += match[0].length; - return match; - } - }, - current: function(){return this.string.slice(this.start, this.pos);} - }; - CodeMirror.StringStream = StringStream; - - // TEXTMARKERS - - function TextMarker(doc, type) { - this.lines = []; - this.type = type; - this.doc = doc; - } - CodeMirror.TextMarker = TextMarker; - - TextMarker.prototype.clear = function() { - if (this.explicitlyCleared) return; - var cm = this.doc.cm, withOp = cm && !cm.curOp; - if (withOp) startOperation(cm); - var min = null, max = null; - for (var i = 0; i < this.lines.length; ++i) { - var line = this.lines[i]; - var span = getMarkedSpanFor(line.markedSpans, this); - if (span.to != null) max = lineNo(line); - line.markedSpans = removeMarkedSpan(line.markedSpans, span); - if (span.from != null) - min = lineNo(line); - else if (this.collapsed && !lineIsHidden(this.doc, line) && cm) - updateLineHeight(line, textHeight(cm.display)); - } - if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) { - var visual = visualLine(cm.doc, this.lines[i]), len = lineLength(cm.doc, visual); - if (len > cm.display.maxLineLength) { - cm.display.maxLine = visual; - cm.display.maxLineLength = len; - cm.display.maxLineChanged = true; - } - } - - if (min != null && cm) regChange(cm, min, max + 1); - this.lines.length = 0; - this.explicitlyCleared = true; - if (this.collapsed && this.doc.cantEdit) { - this.doc.cantEdit = false; - if (cm) reCheckSelection(cm); - } - if (withOp) endOperation(cm); - signalLater(this, "clear"); - }; - - TextMarker.prototype.find = function() { - var from, to; - for (var i = 0; i < this.lines.length; ++i) { - var line = this.lines[i]; - var span = getMarkedSpanFor(line.markedSpans, this); - if (span.from != null || span.to != null) { - var found = lineNo(line); - if (span.from != null) from = Pos(found, span.from); - if (span.to != null) to = Pos(found, span.to); - } - } - if (this.type == "bookmark") return from; - return from && {from: from, to: to}; - }; - - TextMarker.prototype.getOptions = function(copyWidget) { - var repl = this.replacedWith; - return {className: this.className, - inclusiveLeft: this.inclusiveLeft, inclusiveRight: this.inclusiveRight, - atomic: this.atomic, - collapsed: this.collapsed, - clearOnEnter: this.clearOnEnter, - replacedWith: copyWidget ? repl && repl.cloneNode(true) : repl, - readOnly: this.readOnly, - startStyle: this.startStyle, endStyle: this.endStyle}; - }; - - TextMarker.prototype.attachLine = function(line) { - if (!this.lines.length && this.doc.cm) { - var op = this.doc.cm.curOp; - if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) - (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); - } - this.lines.push(line); - }; - TextMarker.prototype.detachLine = function(line) { - this.lines.splice(indexOf(this.lines, line), 1); - if (!this.lines.length && this.doc.cm) { - var op = this.doc.cm.curOp; - (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); - } - }; - - function markText(doc, from, to, options, type) { - if (options && options.shared) return markTextShared(doc, from, to, options, type); - if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type); - - var marker = new TextMarker(doc, type); - if (type == "range" && !posLess(from, to)) return marker; - if (options) copyObj(options, marker); - if (marker.replacedWith) { - marker.collapsed = true; - marker.replacedWith = elt("span", [marker.replacedWith], "CodeMirror-widget"); - } - if (marker.collapsed) sawCollapsedSpans = true; - - var curLine = from.line, size = 0, collapsedAtStart, collapsedAtEnd, cm = doc.cm, updateMaxLine; - doc.iter(curLine, to.line + 1, function(line) { - if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(doc, line) == cm.display.maxLine) - updateMaxLine = true; - var span = {from: null, to: null, marker: marker}; - size += line.text.length; - if (curLine == from.line) {span.from = from.ch; size -= from.ch;} - if (curLine == to.line) {span.to = to.ch; size -= line.text.length - to.ch;} - if (marker.collapsed) { - if (curLine == to.line) collapsedAtEnd = collapsedSpanAt(line, to.ch); - if (curLine == from.line) collapsedAtStart = collapsedSpanAt(line, from.ch); - else updateLineHeight(line, 0); - } - addMarkedSpan(line, span); - ++curLine; - }); - if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) { - if (lineIsHidden(doc, line)) updateLineHeight(line, 0); - }); - - if (marker.readOnly) { - sawReadOnlySpans = true; - if (doc.history.done.length || doc.history.undone.length) - doc.clearHistory(); - } - if (marker.collapsed) { - if (collapsedAtStart != collapsedAtEnd) - throw new Error("Inserting collapsed marker overlapping an existing one"); - marker.size = size; - marker.atomic = true; - } - if (cm) { - if (updateMaxLine) cm.curOp.updateMaxLine = true; - if (marker.className || marker.startStyle || marker.endStyle || marker.collapsed) - regChange(cm, from.line, to.line + 1); - if (marker.atomic) reCheckSelection(cm); - } - return marker; - } - - // SHARED TEXTMARKERS - - function SharedTextMarker(markers, primary) { - this.markers = markers; - this.primary = primary; - for (var i = 0, me = this; i < markers.length; ++i) { - markers[i].parent = this; - on(markers[i], "clear", function(){me.clear();}); - } - } - CodeMirror.SharedTextMarker = SharedTextMarker; - - SharedTextMarker.prototype.clear = function() { - if (this.explicitlyCleared) return; - this.explicitlyCleared = true; - for (var i = 0; i < this.markers.length; ++i) - this.markers[i].clear(); - signalLater(this, "clear"); - }; - SharedTextMarker.prototype.find = function() { - return this.primary.find(); - }; - SharedTextMarker.prototype.getOptions = function(copyWidget) { - var inner = this.primary.getOptions(copyWidget); - inner.shared = true; - return inner; - }; - - function markTextShared(doc, from, to, options, type) { - options = copyObj(options); - options.shared = false; - var markers = [markText(doc, from, to, options, type)], primary = markers[0]; - var widget = options.replacedWith; - linkedDocs(doc, function(doc) { - if (widget) options.replacedWith = widget.cloneNode(true); - markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); - for (var i = 0; i < doc.linked.length; ++i) - if (doc.linked[i].isParent) return; - primary = lst(markers); - }); - return new SharedTextMarker(markers, primary); - } - - // TEXTMARKER SPANS - - function getMarkedSpanFor(spans, marker) { - if (spans) for (var i = 0; i < spans.length; ++i) { - var span = spans[i]; - if (span.marker == marker) return span; - } - } - function removeMarkedSpan(spans, span) { - for (var r, i = 0; i < spans.length; ++i) - if (spans[i] != span) (r || (r = [])).push(spans[i]); - return r; - } - function addMarkedSpan(line, span) { - line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; - span.marker.attachLine(line); - } - - function markedSpansBefore(old, startCh, isInsert) { - if (old) for (var i = 0, nw; i < old.length; ++i) { - var span = old[i], marker = span.marker; - var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); - if (startsBefore || marker.type == "bookmark" && span.from == startCh && (!isInsert || !span.marker.insertLeft)) { - var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); - (nw || (nw = [])).push({from: span.from, - to: endsAfter ? null : span.to, - marker: marker}); - } - } - return nw; - } - - function markedSpansAfter(old, endCh, isInsert) { - if (old) for (var i = 0, nw; i < old.length; ++i) { - var span = old[i], marker = span.marker; - var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); - if (endsAfter || marker.type == "bookmark" && span.from == endCh && (!isInsert || span.marker.insertLeft)) { - var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); - (nw || (nw = [])).push({from: startsBefore ? null : span.from - endCh, - to: span.to == null ? null : span.to - endCh, - marker: marker}); - } - } - return nw; - } - - function stretchSpansOverChange(doc, change) { - var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; - var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; - if (!oldFirst && !oldLast) return null; - - var startCh = change.from.ch, endCh = change.to.ch, isInsert = posEq(change.from, change.to); - // Get the spans that 'stick out' on both sides - var first = markedSpansBefore(oldFirst, startCh, isInsert); - var last = markedSpansAfter(oldLast, endCh, isInsert); - - // Next, merge those two ends - var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); - if (first) { - // Fix up .to properties of first - for (var i = 0; i < first.length; ++i) { - var span = first[i]; - if (span.to == null) { - var found = getMarkedSpanFor(last, span.marker); - if (!found) span.to = startCh; - else if (sameLine) span.to = found.to == null ? null : found.to + offset; - } - } - } - if (last) { - // Fix up .from in last (or move them into first in case of sameLine) - for (var i = 0; i < last.length; ++i) { - var span = last[i]; - if (span.to != null) span.to += offset; - if (span.from == null) { - var found = getMarkedSpanFor(first, span.marker); - if (!found) { - span.from = offset; - if (sameLine) (first || (first = [])).push(span); - } - } else { - span.from += offset; - if (sameLine) (first || (first = [])).push(span); - } - } - } - - var newMarkers = [first]; - if (!sameLine) { - // Fill gap with whole-line-spans - var gap = change.text.length - 2, gapMarkers; - if (gap > 0 && first) - for (var i = 0; i < first.length; ++i) - if (first[i].to == null) - (gapMarkers || (gapMarkers = [])).push({from: null, to: null, marker: first[i].marker}); - for (var i = 0; i < gap; ++i) - newMarkers.push(gapMarkers); - newMarkers.push(last); - } - return newMarkers; - } - - function mergeOldSpans(doc, change) { - var old = getOldSpans(doc, change); - var stretched = stretchSpansOverChange(doc, change); - if (!old) return stretched; - if (!stretched) return old; - - for (var i = 0; i < old.length; ++i) { - var oldCur = old[i], stretchCur = stretched[i]; - if (oldCur && stretchCur) { - spans: for (var j = 0; j < stretchCur.length; ++j) { - var span = stretchCur[j]; - for (var k = 0; k < oldCur.length; ++k) - if (oldCur[k].marker == span.marker) continue spans; - oldCur.push(span); - } - } else if (stretchCur) { - old[i] = stretchCur; - } - } - return old; - } - - function removeReadOnlyRanges(doc, from, to) { - var markers = null; - doc.iter(from.line, to.line + 1, function(line) { - if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) { - var mark = line.markedSpans[i].marker; - if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) - (markers || (markers = [])).push(mark); - } - }); - if (!markers) return null; - var parts = [{from: from, to: to}]; - for (var i = 0; i < markers.length; ++i) { - var mk = markers[i], m = mk.find(); - for (var j = 0; j < parts.length; ++j) { - var p = parts[j]; - if (posLess(p.to, m.from) || posLess(m.to, p.from)) continue; - var newParts = [j, 1]; - if (posLess(p.from, m.from) || !mk.inclusiveLeft && posEq(p.from, m.from)) - newParts.push({from: p.from, to: m.from}); - if (posLess(m.to, p.to) || !mk.inclusiveRight && posEq(p.to, m.to)) - newParts.push({from: m.to, to: p.to}); - parts.splice.apply(parts, newParts); - j += newParts.length - 1; - } - } - return parts; - } - - function collapsedSpanAt(line, ch) { - var sps = sawCollapsedSpans && line.markedSpans, found; - if (sps) for (var sp, i = 0; i < sps.length; ++i) { - sp = sps[i]; - if (!sp.marker.collapsed) continue; - if ((sp.from == null || sp.from < ch) && - (sp.to == null || sp.to > ch) && - (!found || found.width < sp.marker.width)) - found = sp.marker; - } - return found; - } - function collapsedSpanAtStart(line) { return collapsedSpanAt(line, -1); } - function collapsedSpanAtEnd(line) { return collapsedSpanAt(line, line.text.length + 1); } - - function visualLine(doc, line) { - var merged; - while (merged = collapsedSpanAtStart(line)) - line = getLine(doc, merged.find().from.line); - return line; - } - - function lineIsHidden(doc, line) { - var sps = sawCollapsedSpans && line.markedSpans; - if (sps) for (var sp, i = 0; i < sps.length; ++i) { - sp = sps[i]; - if (!sp.marker.collapsed) continue; - if (sp.from == null) return true; - if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) - return true; - } - } - function lineIsHiddenInner(doc, line, span) { - if (span.to == null) { - var end = span.marker.find().to, endLine = getLine(doc, end.line); - return lineIsHiddenInner(doc, endLine, getMarkedSpanFor(endLine.markedSpans, span.marker)); - } - if (span.marker.inclusiveRight && span.to == line.text.length) - return true; - for (var sp, i = 0; i < line.markedSpans.length; ++i) { - sp = line.markedSpans[i]; - if (sp.marker.collapsed && sp.from == span.to && - (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && - lineIsHiddenInner(doc, line, sp)) return true; - } - } - - function detachMarkedSpans(line) { - var spans = line.markedSpans; - if (!spans) return; - for (var i = 0; i < spans.length; ++i) - spans[i].marker.detachLine(line); - line.markedSpans = null; - } - - function attachMarkedSpans(line, spans) { - if (!spans) return; - for (var i = 0; i < spans.length; ++i) - spans[i].marker.attachLine(line); - line.markedSpans = spans; - } - - // LINE WIDGETS - - var LineWidget = CodeMirror.LineWidget = function(cm, node, options) { - for (var opt in options) if (options.hasOwnProperty(opt)) - this[opt] = options[opt]; - this.cm = cm; - this.node = node; - }; - function widgetOperation(f) { - return function() { - var withOp = !this.cm.curOp; - if (withOp) startOperation(this.cm); - try {var result = f.apply(this, arguments);} - finally {if (withOp) endOperation(this.cm);} - return result; - }; - } - LineWidget.prototype.clear = widgetOperation(function() { - var ws = this.line.widgets, no = lineNo(this.line); - if (no == null || !ws) return; - for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1); - if (!ws.length) this.line.widgets = null; - updateLineHeight(this.line, Math.max(0, this.line.height - widgetHeight(this))); - regChange(this.cm, no, no + 1); - }); - LineWidget.prototype.changed = widgetOperation(function() { - var oldH = this.height; - this.height = null; - var diff = widgetHeight(this) - oldH; - if (!diff) return; - updateLineHeight(this.line, this.line.height + diff); - var no = lineNo(this.line); - regChange(this.cm, no, no + 1); - }); - - function widgetHeight(widget) { - if (widget.height != null) return widget.height; - if (!widget.node.parentNode || widget.node.parentNode.nodeType != 1) - removeChildrenAndAdd(widget.cm.display.measure, elt("div", [widget.node], null, "position: relative")); - return widget.height = widget.node.offsetHeight; - } - - function addLineWidget(cm, handle, node, options) { - var widget = new LineWidget(cm, node, options); - if (widget.noHScroll) cm.display.alignWidgets = true; - changeLine(cm, handle, function(line) { - (line.widgets || (line.widgets = [])).push(widget); - widget.line = line; - if (!lineIsHidden(cm.doc, line) || widget.showIfHidden) { - var aboveVisible = heightAtLine(cm, line) < cm.display.scroller.scrollTop; - updateLineHeight(line, line.height + widgetHeight(widget)); - if (aboveVisible) addToScrollPos(cm, 0, widget.height); - } - return true; - }); - return widget; - } - - // LINE DATA STRUCTURE - - // Line objects. These hold state related to a line, including - // highlighting info (the styles array). - function makeLine(text, markedSpans, estimateHeight) { - var line = {text: text}; - attachMarkedSpans(line, markedSpans); - line.height = estimateHeight ? estimateHeight(line) : 1; - return line; - } - - function updateLine(line, text, markedSpans, estimateHeight) { - line.text = text; - if (line.stateAfter) line.stateAfter = null; - if (line.styles) line.styles = null; - if (line.order != null) line.order = null; - detachMarkedSpans(line); - attachMarkedSpans(line, markedSpans); - var estHeight = estimateHeight ? estimateHeight(line) : 1; - if (estHeight != line.height) updateLineHeight(line, estHeight); - signalLater(line, "change"); - } - - function cleanUpLine(line) { - line.parent = null; - detachMarkedSpans(line); - } - - // Run the given mode's parser over a line, update the styles - // array, which contains alternating fragments of text and CSS - // classes. - function runMode(cm, text, mode, state, f) { - var flattenSpans = mode.flattenSpans; - if (flattenSpans == null) flattenSpans = cm.options.flattenSpans; - var curText = "", curStyle = null; - var stream = new StringStream(text, cm.options.tabSize); - if (text == "" && mode.blankLine) mode.blankLine(state); - while (!stream.eol()) { - var style = mode.token(stream, state); - if (stream.pos > 5000) { - flattenSpans = false; - // Webkit seems to refuse to render text nodes longer than 57444 characters - stream.pos = Math.min(text.length, stream.start + 50000); - style = null; - } - var substr = stream.current(); - stream.start = stream.pos; - if (!flattenSpans || curStyle != style) { - if (curText) f(curText, curStyle); - curText = substr; curStyle = style; - } else curText = curText + substr; - } - if (curText) f(curText, curStyle); - } - - function highlightLine(cm, line, state) { - // A styles array always starts with a number identifying the - // mode/overlays that it is based on (for easy invalidation). - var st = [cm.state.modeGen]; - // Compute the base array of styles - runMode(cm, line.text, cm.doc.mode, state, function(txt, style) {st.push(txt, style);}); - - // Run overlays, adjust style array. - for (var o = 0; o < cm.state.overlays.length; ++o) { - var overlay = cm.state.overlays[o], i = 1; - runMode(cm, line.text, overlay.mode, true, function(txt, style) { - var start = i, len = txt.length; - // Ensure there's a token end at the current position, and that i points at it - while (len) { - var cur = st[i], len_ = cur.length; - if (len_ <= len) { - len -= len_; - } else { - st.splice(i, 1, cur.slice(0, len), st[i+1], cur.slice(len)); - len = 0; - } - i += 2; - } - if (!style) return; - if (overlay.opaque) { - st.splice(start, i - start, txt, style); - i = start + 2; - } else { - for (; start < i; start += 2) { - var cur = st[start+1]; - st[start+1] = cur ? cur + " " + style : style; - } - } - }); - } - - return st; - } - - function getLineStyles(cm, line) { - if (!line.styles || line.styles[0] != cm.state.modeGen) - line.styles = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line))); - return line.styles; - } - - // Lightweight form of highlight -- proceed over this line and - // update state, but don't save a style array. - function processLine(cm, line, state) { - var mode = cm.doc.mode; - var stream = new StringStream(line.text, cm.options.tabSize); - if (line.text == "" && mode.blankLine) mode.blankLine(state); - while (!stream.eol() && stream.pos <= 5000) { - mode.token(stream, state); - stream.start = stream.pos; - } - } - - var styleToClassCache = {}; - function styleToClass(style) { - if (!style) return null; - return styleToClassCache[style] || - (styleToClassCache[style] = "cm-" + style.replace(/ +/g, " cm-")); - } - - function lineContent(cm, realLine, measure) { - var merged, line = realLine, lineBefore, sawBefore, simple = true; - while (merged = collapsedSpanAtStart(line)) { - simple = false; - line = getLine(cm.doc, merged.find().from.line); - if (!lineBefore) lineBefore = line; - } - - var builder = {pre: elt("pre"), col: 0, pos: 0, display: !measure, - measure: null, addedOne: false, cm: cm}; - if (line.textClass) builder.pre.className = line.textClass; - - do { - builder.measure = line == realLine && measure; - builder.pos = 0; - builder.addToken = builder.measure ? buildTokenMeasure : buildToken; - if (measure && sawBefore && line != realLine && !builder.addedOne) { - measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure)); - builder.addedOne = true; - } - var next = insertLineContent(line, builder, getLineStyles(cm, line)); - sawBefore = line == lineBefore; - if (next) { - line = getLine(cm.doc, next.to.line); - simple = false; - } - } while (next); - - if (measure && !builder.addedOne) - measure[0] = builder.pre.appendChild(simple ? elt("span", "\u00a0") : zeroWidthElement(cm.display.measure)); - if (!builder.pre.firstChild && !lineIsHidden(cm.doc, realLine)) - builder.pre.appendChild(document.createTextNode("\u00a0")); - - var order; - // Work around problem with the reported dimensions of single-char - // direction spans on IE (issue #1129). See also the comment in - // cursorCoords. - if (measure && ie && (order = getOrder(line))) { - var l = order.length - 1; - if (order[l].from == order[l].to) --l; - var last = order[l], prev = order[l - 1]; - if (last.from + 1 == last.to && prev && last.level < prev.level) { - var span = measure[builder.pos - 1]; - if (span) span.parentNode.insertBefore(span.measureRight = zeroWidthElement(cm.display.measure), - span.nextSibling); - } - } - - signal(cm, "renderLine", cm, realLine, builder.pre); - return builder.pre; - } - - var tokenSpecialChars = /[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\uFEFF]/g; - function buildToken(builder, text, style, startStyle, endStyle) { - if (!text) return; - if (!tokenSpecialChars.test(text)) { - builder.col += text.length; - var content = document.createTextNode(text); - } else { - var content = document.createDocumentFragment(), pos = 0; - while (true) { - tokenSpecialChars.lastIndex = pos; - var m = tokenSpecialChars.exec(text); - var skipped = m ? m.index - pos : text.length - pos; - if (skipped) { - content.appendChild(document.createTextNode(text.slice(pos, pos + skipped))); - builder.col += skipped; - } - if (!m) break; - pos += skipped + 1; - if (m[0] == "\t") { - var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; - content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); - builder.col += tabWidth; - } else { - var token = elt("span", "\u2022", "cm-invalidchar"); - token.title = "\\u" + m[0].charCodeAt(0).toString(16); - content.appendChild(token); - builder.col += 1; - } - } - } - if (style || startStyle || endStyle || builder.measure) { - var fullStyle = style || ""; - if (startStyle) fullStyle += startStyle; - if (endStyle) fullStyle += endStyle; - return builder.pre.appendChild(elt("span", [content], fullStyle)); - } - builder.pre.appendChild(content); - } - - function buildTokenMeasure(builder, text, style, startStyle, endStyle) { - var wrapping = builder.cm.options.lineWrapping; - for (var i = 0; i < text.length; ++i) { - var ch = text.charAt(i), start = i == 0; - if (ch >= "\ud800" && ch < "\udbff" && i < text.length - 1) { - ch = text.slice(i, i + 2); - ++i; - } else if (i && wrapping && - spanAffectsWrapping.test(text.slice(i - 1, i + 1))) { - builder.pre.appendChild(elt("wbr")); - } - var span = builder.measure[builder.pos] = - buildToken(builder, ch, style, - start && startStyle, i == text.length - 1 && endStyle); - // In IE single-space nodes wrap differently than spaces - // embedded in larger text nodes, except when set to - // white-space: normal (issue #1268). - if (ie && wrapping && ch == " " && i && !/\s/.test(text.charAt(i - 1)) && - i < text.length - 1 && !/\s/.test(text.charAt(i + 1))) - span.style.whiteSpace = "normal"; - builder.pos += ch.length; - } - if (text.length) builder.addedOne = true; - } - - function buildCollapsedSpan(builder, size, widget) { - if (widget) { - if (!builder.display) widget = widget.cloneNode(true); - builder.pre.appendChild(widget); - if (builder.measure && size) { - builder.measure[builder.pos] = widget; - builder.addedOne = true; - } - } - builder.pos += size; - } - - // Outputs a number of spans to make up a line, taking highlighting - // and marked text into account. - function insertLineContent(line, builder, styles) { - var spans = line.markedSpans; - if (!spans) { - for (var i = 1; i < styles.length; i+=2) - builder.addToken(builder, styles[i], styleToClass(styles[i+1])); - return; - } - - var allText = line.text, len = allText.length; - var pos = 0, i = 1, text = "", style; - var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed; - for (;;) { - if (nextChange == pos) { // Update current marker set - spanStyle = spanEndStyle = spanStartStyle = ""; - collapsed = null; nextChange = Infinity; - var foundBookmark = null; - for (var j = 0; j < spans.length; ++j) { - var sp = spans[j], m = sp.marker; - if (sp.from <= pos && (sp.to == null || sp.to > pos)) { - if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; } - if (m.className) spanStyle += " " + m.className; - if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle; - if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle; - if (m.collapsed && (!collapsed || collapsed.marker.width < m.width)) - collapsed = sp; - } else if (sp.from > pos && nextChange > sp.from) { - nextChange = sp.from; - } - if (m.type == "bookmark" && sp.from == pos && m.replacedWith) - foundBookmark = m.replacedWith; - } - if (collapsed && (collapsed.from || 0) == pos) { - buildCollapsedSpan(builder, (collapsed.to == null ? len : collapsed.to) - pos, - collapsed.from != null && collapsed.marker.replacedWith); - if (collapsed.to == null) return collapsed.marker.find(); - } - if (foundBookmark && !collapsed) buildCollapsedSpan(builder, 0, foundBookmark); - } - if (pos >= len) break; - - var upto = Math.min(len, nextChange); - while (true) { - if (text) { - var end = pos + text.length; - if (!collapsed) { - var tokenText = end > upto ? text.slice(0, upto - pos) : text; - builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, - spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : ""); - } - if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;} - pos = end; - spanStartStyle = ""; - } - text = styles[i++]; style = styleToClass(styles[i++]); - } - } - } - - // DOCUMENT DATA STRUCTURE - - function updateDoc(doc, change, markedSpans, selAfter, estimateHeight) { - function spansFor(n) {return markedSpans ? markedSpans[n] : null;} - - var from = change.from, to = change.to, text = change.text; - var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); - var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; - - // First adjust the line structure - if (from.ch == 0 && to.ch == 0 && lastText == "") { - // This is a whole-line replace. Treated specially to make - // sure line objects move the way they are supposed to. - for (var i = 0, e = text.length - 1, added = []; i < e; ++i) - added.push(makeLine(text[i], spansFor(i), estimateHeight)); - updateLine(lastLine, lastLine.text, lastSpans, estimateHeight); - if (nlines) doc.remove(from.line, nlines); - if (added.length) doc.insert(from.line, added); - } else if (firstLine == lastLine) { - if (text.length == 1) { - updateLine(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), - lastSpans, estimateHeight); - } else { - for (var added = [], i = 1, e = text.length - 1; i < e; ++i) - added.push(makeLine(text[i], spansFor(i), estimateHeight)); - added.push(makeLine(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); - updateLine(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0), estimateHeight); - doc.insert(from.line + 1, added); - } - } else if (text.length == 1) { - updateLine(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), - spansFor(0), estimateHeight); - doc.remove(from.line + 1, nlines); - } else { - updateLine(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0), estimateHeight); - updateLine(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans, estimateHeight); - for (var i = 1, e = text.length - 1, added = []; i < e; ++i) - added.push(makeLine(text[i], spansFor(i), estimateHeight)); - if (nlines > 1) doc.remove(from.line + 1, nlines - 1); - doc.insert(from.line + 1, added); - } - - signalLater(doc, "change", doc, change); - setSelection(doc, selAfter.anchor, selAfter.head, null, true); - } - - function LeafChunk(lines) { - this.lines = lines; - this.parent = null; - for (var i = 0, e = lines.length, height = 0; i < e; ++i) { - lines[i].parent = this; - height += lines[i].height; - } - this.height = height; - } - - LeafChunk.prototype = { - chunkSize: function() { return this.lines.length; }, - removeInner: function(at, n) { - for (var i = at, e = at + n; i < e; ++i) { - var line = this.lines[i]; - this.height -= line.height; - cleanUpLine(line); - signalLater(line, "delete"); - } - this.lines.splice(at, n); - }, - collapse: function(lines) { - lines.splice.apply(lines, [lines.length, 0].concat(this.lines)); - }, - insertInner: function(at, lines, height) { - this.height += height; - this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); - for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this; - }, - iterN: function(at, n, op) { - for (var e = at + n; at < e; ++at) - if (op(this.lines[at])) return true; - } - }; - - function BranchChunk(children) { - this.children = children; - var size = 0, height = 0; - for (var i = 0, e = children.length; i < e; ++i) { - var ch = children[i]; - size += ch.chunkSize(); height += ch.height; - ch.parent = this; - } - this.size = size; - this.height = height; - this.parent = null; - } - - BranchChunk.prototype = { - chunkSize: function() { return this.size; }, - removeInner: function(at, n) { - this.size -= n; - for (var i = 0; i < this.children.length; ++i) { - var child = this.children[i], sz = child.chunkSize(); - if (at < sz) { - var rm = Math.min(n, sz - at), oldHeight = child.height; - child.removeInner(at, rm); - this.height -= oldHeight - child.height; - if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } - if ((n -= rm) == 0) break; - at = 0; - } else at -= sz; - } - if (this.size - n < 25) { - var lines = []; - this.collapse(lines); - this.children = [new LeafChunk(lines)]; - this.children[0].parent = this; - } - }, - collapse: function(lines) { - for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines); - }, - insertInner: function(at, lines, height) { - this.size += lines.length; - this.height += height; - for (var i = 0, e = this.children.length; i < e; ++i) { - var child = this.children[i], sz = child.chunkSize(); - if (at <= sz) { - child.insertInner(at, lines, height); - if (child.lines && child.lines.length > 50) { - while (child.lines.length > 50) { - var spilled = child.lines.splice(child.lines.length - 25, 25); - var newleaf = new LeafChunk(spilled); - child.height -= newleaf.height; - this.children.splice(i + 1, 0, newleaf); - newleaf.parent = this; - } - this.maybeSpill(); - } - break; - } - at -= sz; - } - }, - maybeSpill: function() { - if (this.children.length <= 10) return; - var me = this; - do { - var spilled = me.children.splice(me.children.length - 5, 5); - var sibling = new BranchChunk(spilled); - if (!me.parent) { // Become the parent node - var copy = new BranchChunk(me.children); - copy.parent = me; - me.children = [copy, sibling]; - me = copy; - } else { - me.size -= sibling.size; - me.height -= sibling.height; - var myIndex = indexOf(me.parent.children, me); - me.parent.children.splice(myIndex + 1, 0, sibling); - } - sibling.parent = me.parent; - } while (me.children.length > 10); - me.parent.maybeSpill(); - }, - iterN: function(at, n, op) { - for (var i = 0, e = this.children.length; i < e; ++i) { - var child = this.children[i], sz = child.chunkSize(); - if (at < sz) { - var used = Math.min(n, sz - at); - if (child.iterN(at, used, op)) return true; - if ((n -= used) == 0) break; - at = 0; - } else at -= sz; - } - } - }; - - var nextDocId = 0; - var Doc = CodeMirror.Doc = function(text, mode, firstLine) { - if (!(this instanceof Doc)) return new Doc(text, mode, firstLine); - if (firstLine == null) firstLine = 0; - - BranchChunk.call(this, [new LeafChunk([makeLine("", null)])]); - this.first = firstLine; - this.scrollTop = this.scrollLeft = 0; - this.cantEdit = false; - this.history = makeHistory(); - this.frontier = firstLine; - var start = Pos(firstLine, 0); - this.sel = {from: start, to: start, head: start, anchor: start, shift: false, extend: false, goalColumn: null}; - this.id = ++nextDocId; - this.modeOption = mode; - - if (typeof text == "string") text = splitLines(text); - updateDoc(this, {from: start, to: start, text: text}, null, {head: start, anchor: start}); - }; - - Doc.prototype = createObj(BranchChunk.prototype, { - iter: function(from, to, op) { - if (op) this.iterN(from - this.first, to - from, op); - else this.iterN(this.first, this.first + this.size, from); - }, - - insert: function(at, lines) { - var height = 0; - for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height; - this.insertInner(at - this.first, lines, height); - }, - remove: function(at, n) { this.removeInner(at - this.first, n); }, - - getValue: function(lineSep) { - var lines = getLines(this, this.first, this.first + this.size); - if (lineSep === false) return lines; - return lines.join(lineSep || "\n"); - }, - setValue: function(code) { - var top = Pos(this.first, 0), last = this.first + this.size - 1; - makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), - text: splitLines(code), origin: "setValue"}, - {head: top, anchor: top}, true); - }, - replaceRange: function(code, from, to, origin) { - from = clipPos(this, from); - to = to ? clipPos(this, to) : from; - replaceRange(this, code, from, to, origin); - }, - getRange: function(from, to, lineSep) { - var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); - if (lineSep === false) return lines; - return lines.join(lineSep || "\n"); - }, - - getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;}, - setLine: function(line, text) { - if (isLine(this, line)) - replaceRange(this, text, Pos(line, 0), clipPos(this, Pos(line))); - }, - removeLine: function(line) { - if (isLine(this, line)) - replaceRange(this, "", Pos(line, 0), clipPos(this, Pos(line + 1, 0))); - }, - - getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);}, - getLineNumber: function(line) {return lineNo(line);}, - - lineCount: function() {return this.size;}, - firstLine: function() {return this.first;}, - lastLine: function() {return this.first + this.size - 1;}, - - clipPos: function(pos) {return clipPos(this, pos);}, - - getCursor: function(start) { - var sel = this.sel, pos; - if (start == null || start == "head") pos = sel.head; - else if (start == "anchor") pos = sel.anchor; - else if (start == "end" || start === false) pos = sel.to; - else pos = sel.from; - return copyPos(pos); - }, - somethingSelected: function() {return !posEq(this.sel.head, this.sel.anchor);}, - - setCursor: docOperation(function(line, ch, extend) { - var pos = clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line); - if (extend) extendSelection(this, pos); - else setSelection(this, pos, pos); - }), - setSelection: docOperation(function(anchor, head) { - setSelection(this, clipPos(this, anchor), clipPos(this, head || anchor)); - }), - extendSelection: docOperation(function(from, to) { - extendSelection(this, clipPos(this, from), to && clipPos(this, to)); - }), - - getSelection: function(lineSep) {return this.getRange(this.sel.from, this.sel.to, lineSep);}, - replaceSelection: function(code, collapse, origin) { - makeChange(this, {from: this.sel.from, to: this.sel.to, text: splitLines(code), origin: origin}, collapse || "around"); - }, - undo: docOperation(function() {makeChangeFromHistory(this, "undo");}), - redo: docOperation(function() {makeChangeFromHistory(this, "redo");}), - - setExtending: function(val) {this.sel.extend = val;}, - - historySize: function() { - var hist = this.history; - return {undo: hist.done.length, redo: hist.undone.length}; - }, - clearHistory: function() {this.history = makeHistory();}, - - markClean: function() { - this.history.dirtyCounter = 0; - this.history.lastOp = this.history.lastOrigin = null; - }, - isClean: function () {return this.history.dirtyCounter == 0;}, - - getHistory: function() { - return {done: copyHistoryArray(this.history.done), - undone: copyHistoryArray(this.history.undone)}; - }, - setHistory: function(histData) { - var hist = this.history = makeHistory(); - hist.done = histData.done.slice(0); - hist.undone = histData.undone.slice(0); - }, - - markText: function(from, to, options) { - return markText(this, clipPos(this, from), clipPos(this, to), options, "range"); - }, - setBookmark: function(pos, options) { - var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), - insertLeft: options && options.insertLeft}; - pos = clipPos(this, pos); - return markText(this, pos, pos, realOpts, "bookmark"); - }, - findMarksAt: function(pos) { - pos = clipPos(this, pos); - var markers = [], spans = getLine(this, pos.line).markedSpans; - if (spans) for (var i = 0; i < spans.length; ++i) { - var span = spans[i]; - if ((span.from == null || span.from <= pos.ch) && - (span.to == null || span.to >= pos.ch)) - markers.push(span.marker.parent || span.marker); - } - return markers; - }, - getAllMarks: function() { - var markers = []; - this.iter(function(line) { - var sps = line.markedSpans; - if (sps) for (var i = 0; i < sps.length; ++i) - if (sps[i].from != null) markers.push(sps[i].marker); - }); - return markers; - }, - - posFromIndex: function(off) { - var ch, lineNo = this.first; - this.iter(function(line) { - var sz = line.text.length + 1; - if (sz > off) { ch = off; return true; } - off -= sz; - ++lineNo; - }); - return clipPos(this, Pos(lineNo, ch)); - }, - indexFromPos: function (coords) { - coords = clipPos(this, coords); - var index = coords.ch; - if (coords.line < this.first || coords.ch < 0) return 0; - this.iter(this.first, coords.line, function (line) { - index += line.text.length + 1; - }); - return index; - }, - - copy: function(copyHistory) { - var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first); - doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; - doc.sel = {from: this.sel.from, to: this.sel.to, head: this.sel.head, anchor: this.sel.anchor, - shift: this.sel.shift, extend: false, goalColumn: this.sel.goalColumn}; - if (copyHistory) { - doc.history.undoDepth = this.history.undoDepth; - doc.setHistory(this.getHistory()); - } - return doc; - }, - - linkedDoc: function(options) { - if (!options) options = {}; - var from = this.first, to = this.first + this.size; - if (options.from != null && options.from > from) from = options.from; - if (options.to != null && options.to < to) to = options.to; - var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from); - if (options.sharedHist) copy.history = this.history; - (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); - copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; - return copy; - }, - unlinkDoc: function(other) { - if (other instanceof CodeMirror) other = other.doc; - if (this.linked) for (var i = 0; i < this.linked.length; ++i) { - var link = this.linked[i]; - if (link.doc != other) continue; - this.linked.splice(i, 1); - other.unlinkDoc(this); - break; - } - // If the histories were shared, split them again - if (other.history == this.history) { - var splitIds = [other.id]; - linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true); - other.history = makeHistory(); - other.history.done = copyHistoryArray(this.history.done, splitIds); - other.history.undone = copyHistoryArray(this.history.undone, splitIds); - } - }, - iterLinkedDocs: function(f) {linkedDocs(this, f);}, - - getMode: function() {return this.mode;}, - getEditor: function() {return this.cm;} - }); - - Doc.prototype.eachLine = Doc.prototype.iter; - - // The Doc methods that should be available on CodeMirror instances - var dontDelegate = "iter insert remove copy getEditor".split(" "); - for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) - CodeMirror.prototype[prop] = (function(method) { - return function() {return method.apply(this.doc, arguments);}; - })(Doc.prototype[prop]); - - function linkedDocs(doc, f, sharedHistOnly) { - function propagate(doc, skip, sharedHist) { - if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) { - var rel = doc.linked[i]; - if (rel.doc == skip) continue; - var shared = sharedHist && rel.sharedHist; - if (sharedHistOnly && !shared) continue; - f(rel.doc, shared); - propagate(rel.doc, doc, shared); - } - } - propagate(doc, null, true); - } - - function attachDoc(cm, doc) { - if (doc.cm) throw new Error("This document is already in use."); - cm.doc = doc; - doc.cm = cm; - estimateLineHeights(cm); - loadMode(cm); - if (!cm.options.lineWrapping) computeMaxLength(cm); - cm.options.mode = doc.modeOption; - regChange(cm); - } - - // LINE UTILITIES - - function getLine(chunk, n) { - n -= chunk.first; - while (!chunk.lines) { - for (var i = 0;; ++i) { - var child = chunk.children[i], sz = child.chunkSize(); - if (n < sz) { chunk = child; break; } - n -= sz; - } - } - return chunk.lines[n]; - } - - function getBetween(doc, start, end) { - var out = [], n = start.line; - doc.iter(start.line, end.line + 1, function(line) { - var text = line.text; - if (n == end.line) text = text.slice(0, end.ch); - if (n == start.line) text = text.slice(start.ch); - out.push(text); - ++n; - }); - return out; - } - function getLines(doc, from, to) { - var out = []; - doc.iter(from, to, function(line) { out.push(line.text); }); - return out; - } - - function updateLineHeight(line, height) { - var diff = height - line.height; - for (var n = line; n; n = n.parent) n.height += diff; - } - - function lineNo(line) { - if (line.parent == null) return null; - var cur = line.parent, no = indexOf(cur.lines, line); - for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { - for (var i = 0;; ++i) { - if (chunk.children[i] == cur) break; - no += chunk.children[i].chunkSize(); - } - } - return no + cur.first; - } - - function lineAtHeight(chunk, h) { - var n = chunk.first; - outer: do { - for (var i = 0, e = chunk.children.length; i < e; ++i) { - var child = chunk.children[i], ch = child.height; - if (h < ch) { chunk = child; continue outer; } - h -= ch; - n += child.chunkSize(); - } - return n; - } while (!chunk.lines); - for (var i = 0, e = chunk.lines.length; i < e; ++i) { - var line = chunk.lines[i], lh = line.height; - if (h < lh) break; - h -= lh; - } - return n + i; - } - - function heightAtLine(cm, lineObj) { - lineObj = visualLine(cm.doc, lineObj); - - var h = 0, chunk = lineObj.parent; - for (var i = 0; i < chunk.lines.length; ++i) { - var line = chunk.lines[i]; - if (line == lineObj) break; - else h += line.height; - } - for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { - for (var i = 0; i < p.children.length; ++i) { - var cur = p.children[i]; - if (cur == chunk) break; - else h += cur.height; - } - } - return h; - } - - function getOrder(line) { - var order = line.order; - if (order == null) order = line.order = bidiOrdering(line.text); - return order; - } - - // HISTORY - - function makeHistory() { - return { - // Arrays of history events. Doing something adds an event to - // done and clears undo. Undoing moves events from done to - // undone, redoing moves them in the other direction. - done: [], undone: [], undoDepth: Infinity, - // Used to track when changes can be merged into a single undo - // event - lastTime: 0, lastOp: null, lastOrigin: null, - // Used by the isClean() method - dirtyCounter: 0 - }; - } - - function attachLocalSpans(doc, change, from, to) { - var existing = change["spans_" + doc.id], n = 0; - doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) { - if (line.markedSpans) - (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; - ++n; - }); - } - - function historyChangeFromChange(doc, change) { - var histChange = {from: change.from, to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; - attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); - linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true); - return histChange; - } - - function addToHistory(doc, change, selAfter, opId) { - var hist = doc.history; - hist.undone.length = 0; - var time = +new Date, cur = lst(hist.done); - - if (cur && - (hist.lastOp == opId || - hist.lastOrigin == change.origin && change.origin && - ((change.origin.charAt(0) == "+" && hist.lastTime > time - 600) || change.origin.charAt(0) == "*"))) { - // Merge this change into the last event - var last = lst(cur.changes); - if (posEq(change.from, change.to) && posEq(change.from, last.to)) { - // Optimized case for simple insertion -- don't want to add - // new changesets for every character typed - last.to = changeEnd(change); - } else { - // Add new sub-event - cur.changes.push(historyChangeFromChange(doc, change)); - } - cur.anchorAfter = selAfter.anchor; cur.headAfter = selAfter.head; - } else { - // Can not be merged, start a new event. - cur = {changes: [historyChangeFromChange(doc, change)], - anchorBefore: doc.sel.anchor, headBefore: doc.sel.head, - anchorAfter: selAfter.anchor, headAfter: selAfter.head}; - hist.done.push(cur); - while (hist.done.length > hist.undoDepth) - hist.done.shift(); - if (hist.dirtyCounter < 0) - // The user has made a change after undoing past the last clean state. - // We can never get back to a clean state now until markClean() is called. - hist.dirtyCounter = NaN; - else - hist.dirtyCounter++; - } - hist.lastTime = time; - hist.lastOp = opId; - hist.lastOrigin = change.origin; - } - - function removeClearedSpans(spans) { - if (!spans) return null; - for (var i = 0, out; i < spans.length; ++i) { - if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); } - else if (out) out.push(spans[i]); - } - return !out ? spans : out.length ? out : null; - } - - function getOldSpans(doc, change) { - var found = change["spans_" + doc.id]; - if (!found) return null; - for (var i = 0, nw = []; i < change.text.length; ++i) - nw.push(removeClearedSpans(found[i])); - return nw; - } - - // Used both to provide a JSON-safe object in .getHistory, and, when - // detaching a document, to split the history in two - function copyHistoryArray(events, newGroup) { - for (var i = 0, copy = []; i < events.length; ++i) { - var event = events[i], changes = event.changes, newChanges = []; - copy.push({changes: newChanges, anchorBefore: event.anchorBefore, headBefore: event.headBefore, - anchorAfter: event.anchorAfter, headAfter: event.headAfter}); - for (var j = 0; j < changes.length; ++j) { - var change = changes[j], m; - newChanges.push({from: change.from, to: change.to, text: change.text}); - if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) { - if (indexOf(newGroup, Number(m[1])) > -1) { - lst(newChanges)[prop] = change[prop]; - delete change[prop]; - } - } - } - } - return copy; - } - - // Rebasing/resetting history to deal with externally-sourced changes - - function rebaseHistSel(pos, from, to, diff) { - if (to < pos.line) { - pos.line += diff; - } else if (from < pos.line) { - pos.line = from; - pos.ch = 0; - } - } - - // Tries to rebase an array of history events given a change in the - // document. If the change touches the same lines as the event, the - // event, and everything 'behind' it, is discarded. If the change is - // before the event, the event's positions are updated. Uses a - // copy-on-write scheme for the positions, to avoid having to - // reallocate them all on every rebase, but also avoid problems with - // shared position objects being unsafely updated. - function rebaseHistArray(array, from, to, diff) { - for (var i = 0; i < array.length; ++i) { - var sub = array[i], ok = true; - for (var j = 0; j < sub.changes.length; ++j) { - var cur = sub.changes[j]; - if (!sub.copied) { cur.from = copyPos(cur.from); cur.to = copyPos(cur.to); } - if (to < cur.from.line) { - cur.from.line += diff; - cur.to.line += diff; - } else if (from <= cur.to.line) { - ok = false; - break; - } - } - if (!sub.copied) { - sub.anchorBefore = copyPos(sub.anchorBefore); sub.headBefore = copyPos(sub.headBefore); - sub.anchorAfter = copyPos(sub.anchorAfter); sub.readAfter = copyPos(sub.headAfter); - sub.copied = true; - } - if (!ok) { - array.splice(0, i + 1); - i = 0; - } else { - rebaseHistSel(sub.anchorBefore); rebaseHistSel(sub.headBefore); - rebaseHistSel(sub.anchorAfter); rebaseHistSel(sub.headAfter); - } - } - } - - function rebaseHist(hist, change) { - var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; - rebaseHistArray(hist.done, from, to, diff); - rebaseHistArray(hist.undone, from, to, diff); - } - - // EVENT OPERATORS - - function stopMethod() {e_stop(this);} - // Ensure an event has a stop method. - function addStop(event) { - if (!event.stop) event.stop = stopMethod; - return event; - } - - function e_preventDefault(e) { - if (e.preventDefault) e.preventDefault(); - else e.returnValue = false; - } - function e_stopPropagation(e) { - if (e.stopPropagation) e.stopPropagation(); - else e.cancelBubble = true; - } - function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} - CodeMirror.e_stop = e_stop; - CodeMirror.e_preventDefault = e_preventDefault; - CodeMirror.e_stopPropagation = e_stopPropagation; - - function e_target(e) {return e.target || e.srcElement;} - function e_button(e) { - var b = e.which; - if (b == null) { - if (e.button & 1) b = 1; - else if (e.button & 2) b = 3; - else if (e.button & 4) b = 2; - } - if (mac && e.ctrlKey && b == 1) b = 3; - return b; - } - - // EVENT HANDLING - - function on(emitter, type, f) { - if (emitter.addEventListener) - emitter.addEventListener(type, f, false); - else if (emitter.attachEvent) - emitter.attachEvent("on" + type, f); - else { - var map = emitter._handlers || (emitter._handlers = {}); - var arr = map[type] || (map[type] = []); - arr.push(f); - } - } - - function off(emitter, type, f) { - if (emitter.removeEventListener) - emitter.removeEventListener(type, f, false); - else if (emitter.detachEvent) - emitter.detachEvent("on" + type, f); - else { - var arr = emitter._handlers && emitter._handlers[type]; - if (!arr) return; - for (var i = 0; i < arr.length; ++i) - if (arr[i] == f) { arr.splice(i, 1); break; } - } - } - - function signal(emitter, type /*, values...*/) { - var arr = emitter._handlers && emitter._handlers[type]; - if (!arr) return; - var args = Array.prototype.slice.call(arguments, 2); - for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args); - } - - var delayedCallbacks, delayedCallbackDepth = 0; - function signalLater(emitter, type /*, values...*/) { - var arr = emitter._handlers && emitter._handlers[type]; - if (!arr) return; - var args = Array.prototype.slice.call(arguments, 2); - if (!delayedCallbacks) { - ++delayedCallbackDepth; - delayedCallbacks = []; - setTimeout(fireDelayed, 0); - } - function bnd(f) {return function(){f.apply(null, args);};}; - for (var i = 0; i < arr.length; ++i) - delayedCallbacks.push(bnd(arr[i])); - } - - function fireDelayed() { - --delayedCallbackDepth; - var delayed = delayedCallbacks; - delayedCallbacks = null; - for (var i = 0; i < delayed.length; ++i) delayed[i](); - } - - function hasHandler(emitter, type) { - var arr = emitter._handlers && emitter._handlers[type]; - return arr && arr.length > 0; - } - - CodeMirror.on = on; CodeMirror.off = off; CodeMirror.signal = signal; - - // MISC UTILITIES - - // Number of pixels added to scroller and sizer to hide scrollbar - var scrollerCutOff = 30; - - // Returned or thrown by various protocols to signal 'I'm not - // handling this'. - var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}}; - - function Delayed() {this.id = null;} - Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}}; - - // Counts the column offset in a string, taking tabs into account. - // Used mostly to find indentation. - function countColumn(string, end, tabSize, startIndex, startValue) { - if (end == null) { - end = string.search(/[^\s\u00a0]/); - if (end == -1) end = string.length; - } - for (var i = startIndex || 0, n = startValue || 0; i < end; ++i) { - if (string.charAt(i) == "\t") n += tabSize - (n % tabSize); - else ++n; - } - return n; - } - CodeMirror.countColumn = countColumn; - - var spaceStrs = [""]; - function spaceStr(n) { - while (spaceStrs.length <= n) - spaceStrs.push(lst(spaceStrs) + " "); - return spaceStrs[n]; - } - - function lst(arr) { return arr[arr.length-1]; } - - function selectInput(node) { - if (ios) { // Mobile Safari apparently has a bug where select() is broken. - node.selectionStart = 0; - node.selectionEnd = node.value.length; - } else node.select(); - } - - function indexOf(collection, elt) { - if (collection.indexOf) return collection.indexOf(elt); - for (var i = 0, e = collection.length; i < e; ++i) - if (collection[i] == elt) return i; - return -1; - } - - function createObj(base, props) { - function Obj() {} - Obj.prototype = base; - var inst = new Obj(); - if (props) copyObj(props, inst); - return inst; - } - - function copyObj(obj, target) { - if (!target) target = {}; - for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop]; - return target; - } - - function emptyArray(size) { - for (var a = [], i = 0; i < size; ++i) a.push(undefined); - return a; - } - - function bind(f) { - var args = Array.prototype.slice.call(arguments, 1); - return function(){return f.apply(null, args);}; - } - - var nonASCIISingleCaseWordChar = /[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc]/; - function isWordChar(ch) { - return /\w/.test(ch) || ch > "\x80" && - (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)); - } - - function isEmpty(obj) { - for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false; - return true; - } - - var isExtendingChar = /[\u0300-\u036F\u0483-\u0487\u0488-\u0489\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\uA66F\uA670-\uA672\uA674-\uA67D\uA69F\udc00-\udfff]/; - - // DOM UTILITIES - - function elt(tag, content, className, style) { - var e = document.createElement(tag); - if (className) e.className = className; - if (style) e.style.cssText = style; - if (typeof content == "string") setTextContent(e, content); - else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); - return e; - } - - function removeChildren(e) { - // IE will break all parent-child relations in subnodes when setting innerHTML - if (!ie) e.innerHTML = ""; - else while (e.firstChild) e.removeChild(e.firstChild); - return e; - } - - function removeChildrenAndAdd(parent, e) { - return removeChildren(parent).appendChild(e); - } - - function setTextContent(e, str) { - if (ie_lt9) { - e.innerHTML = ""; - e.appendChild(document.createTextNode(str)); - } else e.textContent = str; - } - - function getRect(node) { - return node.getBoundingClientRect(); - } - CodeMirror.replaceGetRect = function(f) { getRect = f; }; - - // FEATURE DETECTION - - // Detect drag-and-drop - var dragAndDrop = function() { - // There is *some* kind of drag-and-drop support in IE6-8, but I - // couldn't get it to work yet. - if (ie_lt9) return false; - var div = elt('div'); - return "draggable" in div || "dragDrop" in div; - }(); - - // For a reason I have yet to figure out, some browsers disallow - // word wrapping between certain characters *only* if a new inline - // element is started between them. This makes it hard to reliably - // measure the position of things, since that requires inserting an - // extra span. This terribly fragile set of regexps matches the - // character combinations that suffer from this phenomenon on the - // various browsers. - var spanAffectsWrapping = /^$/; // Won't match any two-character string - if (gecko) spanAffectsWrapping = /$'/; - else if (safari && !/Version\/([6-9]|\d\d)\b/.test(navigator.userAgent)) spanAffectsWrapping = /\-[^ \-?]|\?[^ !'\"\),.\-\/:;\?\]\}]/; - else if (webkit) spanAffectsWrapping = /[~!#%&*)=+}\]|\"\.>,:;][({[<]|-[^\-?\.]|\?[\w~`@#$%\^&*(_=+{[|><]/; - - var knownScrollbarWidth; - function scrollbarWidth(measure) { - if (knownScrollbarWidth != null) return knownScrollbarWidth; - var test = elt("div", null, null, "width: 50px; height: 50px; overflow-x: scroll"); - removeChildrenAndAdd(measure, test); - if (test.offsetWidth) - knownScrollbarWidth = test.offsetHeight - test.clientHeight; - return knownScrollbarWidth || 0; - } - - var zwspSupported; - function zeroWidthElement(measure) { - if (zwspSupported == null) { - var test = elt("span", "\u200b"); - removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); - if (measure.firstChild.offsetHeight != 0) - zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !ie_lt8; - } - if (zwspSupported) return elt("span", "\u200b"); - else return elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); - } - - // See if "".split is the broken IE version, if so, provide an - // alternative way to split lines. - var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) { - var pos = 0, result = [], l = string.length; - while (pos <= l) { - var nl = string.indexOf("\n", pos); - if (nl == -1) nl = string.length; - var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); - var rt = line.indexOf("\r"); - if (rt != -1) { - result.push(line.slice(0, rt)); - pos += rt + 1; - } else { - result.push(line); - pos = nl + 1; - } - } - return result; - } : function(string){return string.split(/\r\n?|\n/);}; - CodeMirror.splitLines = splitLines; - - var hasSelection = window.getSelection ? function(te) { - try { return te.selectionStart != te.selectionEnd; } - catch(e) { return false; } - } : function(te) { - try {var range = te.ownerDocument.selection.createRange();} - catch(e) {} - if (!range || range.parentElement() != te) return false; - return range.compareEndPoints("StartToEnd", range) != 0; - }; - - var hasCopyEvent = (function() { - var e = elt("div"); - if ("oncopy" in e) return true; - e.setAttribute("oncopy", "return;"); - return typeof e.oncopy == 'function'; - })(); - - // KEY NAMING - - var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", - 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", - 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", - 46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 109: "-", 107: "=", 127: "Delete", - 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", - 221: "]", 222: "'", 63276: "PageUp", 63277: "PageDown", 63275: "End", 63273: "Home", - 63234: "Left", 63232: "Up", 63235: "Right", 63233: "Down", 63302: "Insert", 63272: "Delete"}; - CodeMirror.keyNames = keyNames; - (function() { - // Number keys - for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i); - // Alphabetic keys - for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i); - // Function keys - for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i; - })(); - - // BIDI HELPERS - - function iterateBidiSections(order, from, to, f) { - if (!order) return f(from, to, "ltr"); - for (var i = 0; i < order.length; ++i) { - var part = order[i]; - if (part.from < to && part.to > from || from == to && part.to == from) - f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr"); - } - } - - function bidiLeft(part) { return part.level % 2 ? part.to : part.from; } - function bidiRight(part) { return part.level % 2 ? part.from : part.to; } - - function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; } - function lineRight(line) { - var order = getOrder(line); - if (!order) return line.text.length; - return bidiRight(lst(order)); - } - - function lineStart(cm, lineN) { - var line = getLine(cm.doc, lineN); - var visual = visualLine(cm.doc, line); - if (visual != line) lineN = lineNo(visual); - var order = getOrder(visual); - var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual); - return Pos(lineN, ch); - } - function lineEnd(cm, lineN) { - var merged, line; - while (merged = collapsedSpanAtEnd(line = getLine(cm.doc, lineN))) - lineN = merged.find().to.line; - var order = getOrder(line); - var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line); - return Pos(lineN, ch); - } - - // This is somewhat involved. It is needed in order to move - // 'visually' through bi-directional text -- i.e., pressing left - // should make the cursor go left, even when in RTL text. The - // tricky part is the 'jumps', where RTL and LTR text touch each - // other. This often requires the cursor offset to move more than - // one unit, in order to visually move one unit. - function moveVisually(line, start, dir, byUnit) { - var bidi = getOrder(line); - if (!bidi) return moveLogically(line, start, dir, byUnit); - var moveOneUnit = byUnit ? function(pos, dir) { - do pos += dir; - while (pos > 0 && isExtendingChar.test(line.text.charAt(pos))); - return pos; - } : function(pos, dir) { return pos + dir; }; - var linedir = bidi[0].level; - for (var i = 0; i < bidi.length; ++i) { - var part = bidi[i], sticky = part.level % 2 == linedir; - if ((part.from < start && part.to > start) || - (sticky && (part.from == start || part.to == start))) break; - } - var target = moveOneUnit(start, part.level % 2 ? -dir : dir); - - while (target != null) { - if (part.level % 2 == linedir) { - if (target < part.from || target > part.to) { - part = bidi[i += dir]; - target = part && (dir > 0 == part.level % 2 ? moveOneUnit(part.to, -1) : moveOneUnit(part.from, 1)); - } else break; - } else { - if (target == bidiLeft(part)) { - part = bidi[--i]; - target = part && bidiRight(part); - } else if (target == bidiRight(part)) { - part = bidi[++i]; - target = part && bidiLeft(part); - } else break; - } - } - - return target < 0 || target > line.text.length ? null : target; - } - - function moveLogically(line, start, dir, byUnit) { - var target = start + dir; - if (byUnit) while (target > 0 && isExtendingChar.test(line.text.charAt(target))) target += dir; - return target < 0 || target > line.text.length ? null : target; - } - - // Bidirectional ordering algorithm - // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm - // that this (partially) implements. - - // One-char codes used for character types: - // L (L): Left-to-Right - // R (R): Right-to-Left - // r (AL): Right-to-Left Arabic - // 1 (EN): European Number - // + (ES): European Number Separator - // % (ET): European Number Terminator - // n (AN): Arabic Number - // , (CS): Common Number Separator - // m (NSM): Non-Spacing Mark - // b (BN): Boundary Neutral - // s (B): Paragraph Separator - // t (S): Segment Separator - // w (WS): Whitespace - // N (ON): Other Neutrals - - // Returns null if characters are ordered as they appear - // (left-to-right), or an array of sections ({from, to, level} - // objects) in the order in which they occur visually. - var bidiOrdering = (function() { - // Character types for codepoints 0 to 0xff - var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL"; - // Character types for codepoints 0x600 to 0x6ff - var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmmrrrrrrrrrrrrrrrrrr"; - function charType(code) { - if (code <= 0xff) return lowTypes.charAt(code); - else if (0x590 <= code && code <= 0x5f4) return "R"; - else if (0x600 <= code && code <= 0x6ff) return arabicTypes.charAt(code - 0x600); - else if (0x700 <= code && code <= 0x8ac) return "r"; - else return "L"; - } - - var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; - var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; - // Browsers seem to always treat the boundaries of block elements as being L. - var outerType = "L"; - - return function(str) { - if (!bidiRE.test(str)) return false; - var len = str.length, types = []; - for (var i = 0, type; i < len; ++i) - types.push(type = charType(str.charCodeAt(i))); - - // W1. Examine each non-spacing mark (NSM) in the level run, and - // change the type of the NSM to the type of the previous - // character. If the NSM is at the start of the level run, it will - // get the type of sor. - for (var i = 0, prev = outerType; i < len; ++i) { - var type = types[i]; - if (type == "m") types[i] = prev; - else prev = type; - } - - // W2. Search backwards from each instance of a European number - // until the first strong type (R, L, AL, or sor) is found. If an - // AL is found, change the type of the European number to Arabic - // number. - // W3. Change all ALs to R. - for (var i = 0, cur = outerType; i < len; ++i) { - var type = types[i]; - if (type == "1" && cur == "r") types[i] = "n"; - else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; } - } - - // W4. A single European separator between two European numbers - // changes to a European number. A single common separator between - // two numbers of the same type changes to that type. - for (var i = 1, prev = types[0]; i < len - 1; ++i) { - var type = types[i]; - if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1"; - else if (type == "," && prev == types[i+1] && - (prev == "1" || prev == "n")) types[i] = prev; - prev = type; - } - - // W5. A sequence of European terminators adjacent to European - // numbers changes to all European numbers. - // W6. Otherwise, separators and terminators change to Other - // Neutral. - for (var i = 0; i < len; ++i) { - var type = types[i]; - if (type == ",") types[i] = "N"; - else if (type == "%") { - for (var end = i + 1; end < len && types[end] == "%"; ++end) {} - var replace = (i && types[i-1] == "!") || (end < len - 1 && types[end] == "1") ? "1" : "N"; - for (var j = i; j < end; ++j) types[j] = replace; - i = end - 1; - } - } - - // W7. Search backwards from each instance of a European number - // until the first strong type (R, L, or sor) is found. If an L is - // found, then change the type of the European number to L. - for (var i = 0, cur = outerType; i < len; ++i) { - var type = types[i]; - if (cur == "L" && type == "1") types[i] = "L"; - else if (isStrong.test(type)) cur = type; - } - - // N1. A sequence of neutrals takes the direction of the - // surrounding strong text if the text on both sides has the same - // direction. European and Arabic numbers act as if they were R in - // terms of their influence on neutrals. Start-of-level-run (sor) - // and end-of-level-run (eor) are used at level run boundaries. - // N2. Any remaining neutrals take the embedding direction. - for (var i = 0; i < len; ++i) { - if (isNeutral.test(types[i])) { - for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {} - var before = (i ? types[i-1] : outerType) == "L"; - var after = (end < len - 1 ? types[end] : outerType) == "L"; - var replace = before || after ? "L" : "R"; - for (var j = i; j < end; ++j) types[j] = replace; - i = end - 1; - } - } - - // Here we depart from the documented algorithm, in order to avoid - // building up an actual levels array. Since there are only three - // levels (0, 1, 2) in an implementation that doesn't take - // explicit embedding into account, we can build up the order on - // the fly, without following the level-based algorithm. - var order = [], m; - for (var i = 0; i < len;) { - if (countsAsLeft.test(types[i])) { - var start = i; - for (++i; i < len && countsAsLeft.test(types[i]); ++i) {} - order.push({from: start, to: i, level: 0}); - } else { - var pos = i, at = order.length; - for (++i; i < len && types[i] != "L"; ++i) {} - for (var j = pos; j < i;) { - if (countsAsNum.test(types[j])) { - if (pos < j) order.splice(at, 0, {from: pos, to: j, level: 1}); - var nstart = j; - for (++j; j < i && countsAsNum.test(types[j]); ++j) {} - order.splice(at, 0, {from: nstart, to: j, level: 2}); - pos = j; - } else ++j; - } - if (pos < i) order.splice(at, 0, {from: pos, to: i, level: 1}); - } - } - if (order[0].level == 1 && (m = str.match(/^\s+/))) { - order[0].from = m[0].length; - order.unshift({from: 0, to: m[0].length, level: 0}); - } - if (lst(order).level == 1 && (m = str.match(/\s+$/))) { - lst(order).to -= m[0].length; - order.push({from: len - m[0].length, to: len, level: 0}); - } - if (order[0].level != lst(order).level) - order.push({from: len, to: len, level: order[0].level}); - - return order; - }; - })(); - - // THE END - - CodeMirror.version = "3.1 +"; - - return CodeMirror; -})(); diff --git a/site/js/date.js b/site/js/date.js deleted file mode 100644 index 77f4986..0000000 --- a/site/js/date.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Version: 1.0 Alpha-1 - * Build Date: 13-Nov-2007 - * Copyright (c) 2006-2007, Coolite Inc. (http://www.coolite.com/). All rights reserved. - * License: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/. - * Website: http://www.datejs.com/ or http://www.coolite.com/datejs/ - */ -Date.CultureInfo={name:"en-US",englishName:"English (United States)",nativeName:"English (United States)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"M/d/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\+|after|from)/i,subtract:/^(\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\.?m?\.?|p\.?m?\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\s*(\+|\-)\s*\d\d\d\d?)|gmt)/i,ordinalSuffix:/^\s*(st|nd|rd|th)/i,timeContext:/^\s*(\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; -Date.getMonthNumberFromName=function(name){var n=Date.CultureInfo.monthNames,m=Date.CultureInfo.abbreviatedMonthNames,s=name.toLowerCase();for(var i=0;idate)?1:(this=start.getTime()&&t<=end.getTime();};Date.prototype.addMilliseconds=function(value){this.setMilliseconds(this.getMilliseconds()+value);return this;};Date.prototype.addSeconds=function(value){return this.addMilliseconds(value*1000);};Date.prototype.addMinutes=function(value){return this.addMilliseconds(value*60000);};Date.prototype.addHours=function(value){return this.addMilliseconds(value*3600000);};Date.prototype.addDays=function(value){return this.addMilliseconds(value*86400000);};Date.prototype.addWeeks=function(value){return this.addMilliseconds(value*604800000);};Date.prototype.addMonths=function(value){var n=this.getDate();this.setDate(1);this.setMonth(this.getMonth()+value);this.setDate(Math.min(n,this.getDaysInMonth()));return this;};Date.prototype.addYears=function(value){return this.addMonths(value*12);};Date.prototype.add=function(config){if(typeof config=="number"){this._orient=config;return this;} -var x=config;if(x.millisecond||x.milliseconds){this.addMilliseconds(x.millisecond||x.milliseconds);} -if(x.second||x.seconds){this.addSeconds(x.second||x.seconds);} -if(x.minute||x.minutes){this.addMinutes(x.minute||x.minutes);} -if(x.hour||x.hours){this.addHours(x.hour||x.hours);} -if(x.month||x.months){this.addMonths(x.month||x.months);} -if(x.year||x.years){this.addYears(x.year||x.years);} -if(x.day||x.days){this.addDays(x.day||x.days);} -return this;};Date._validate=function(value,min,max,name){if(typeof value!="number"){throw new TypeError(value+" is not a Number.");}else if(valuemax){throw new RangeError(value+" is not a valid value for "+name+".");} -return true;};Date.validateMillisecond=function(n){return Date._validate(n,0,999,"milliseconds");};Date.validateSecond=function(n){return Date._validate(n,0,59,"seconds");};Date.validateMinute=function(n){return Date._validate(n,0,59,"minutes");};Date.validateHour=function(n){return Date._validate(n,0,23,"hours");};Date.validateDay=function(n,year,month){return Date._validate(n,1,Date.getDaysInMonth(year,month),"days");};Date.validateMonth=function(n){return Date._validate(n,0,11,"months");};Date.validateYear=function(n){return Date._validate(n,1,9999,"seconds");};Date.prototype.set=function(config){var x=config;if(!x.millisecond&&x.millisecond!==0){x.millisecond=-1;} -if(!x.second&&x.second!==0){x.second=-1;} -if(!x.minute&&x.minute!==0){x.minute=-1;} -if(!x.hour&&x.hour!==0){x.hour=-1;} -if(!x.day&&x.day!==0){x.day=-1;} -if(!x.month&&x.month!==0){x.month=-1;} -if(!x.year&&x.year!==0){x.year=-1;} -if(x.millisecond!=-1&&Date.validateMillisecond(x.millisecond)){this.addMilliseconds(x.millisecond-this.getMilliseconds());} -if(x.second!=-1&&Date.validateSecond(x.second)){this.addSeconds(x.second-this.getSeconds());} -if(x.minute!=-1&&Date.validateMinute(x.minute)){this.addMinutes(x.minute-this.getMinutes());} -if(x.hour!=-1&&Date.validateHour(x.hour)){this.addHours(x.hour-this.getHours());} -if(x.month!==-1&&Date.validateMonth(x.month)){this.addMonths(x.month-this.getMonth());} -if(x.year!=-1&&Date.validateYear(x.year)){this.addYears(x.year-this.getFullYear());} -if(x.day!=-1&&Date.validateDay(x.day,this.getFullYear(),this.getMonth())){this.addDays(x.day-this.getDate());} -if(x.timezone){this.setTimezone(x.timezone);} -if(x.timezoneOffset){this.setTimezoneOffset(x.timezoneOffset);} -return this;};Date.prototype.clearTime=function(){this.setHours(0);this.setMinutes(0);this.setSeconds(0);this.setMilliseconds(0);return this;};Date.prototype.isLeapYear=function(){var y=this.getFullYear();return(((y%4===0)&&(y%100!==0))||(y%400===0));};Date.prototype.isWeekday=function(){return!(this.is().sat()||this.is().sun());};Date.prototype.getDaysInMonth=function(){return Date.getDaysInMonth(this.getFullYear(),this.getMonth());};Date.prototype.moveToFirstDayOfMonth=function(){return this.set({day:1});};Date.prototype.moveToLastDayOfMonth=function(){return this.set({day:this.getDaysInMonth()});};Date.prototype.moveToDayOfWeek=function(day,orient){var diff=(day-this.getDay()+7*(orient||+1))%7;return this.addDays((diff===0)?diff+=7*(orient||+1):diff);};Date.prototype.moveToMonth=function(month,orient){var diff=(month-this.getMonth()+12*(orient||+1))%12;return this.addMonths((diff===0)?diff+=12*(orient||+1):diff);};Date.prototype.getDayOfYear=function(){return Math.floor((this-new Date(this.getFullYear(),0,1))/86400000);};Date.prototype.getWeekOfYear=function(firstDayOfWeek){var y=this.getFullYear(),m=this.getMonth(),d=this.getDate();var dow=firstDayOfWeek||Date.CultureInfo.firstDayOfWeek;var offset=7+1-new Date(y,0,1).getDay();if(offset==8){offset=1;} -var daynum=((Date.UTC(y,m,d,0,0,0)-Date.UTC(y,0,1,0,0,0))/86400000)+1;var w=Math.floor((daynum-offset+7)/7);if(w===dow){y--;var prevOffset=7+1-new Date(y,0,1).getDay();if(prevOffset==2||prevOffset==8){w=53;}else{w=52;}} -return w;};Date.prototype.isDST=function(){console.log('isDST');return this.toString().match(/(E|C|M|P)(S|D)T/)[2]=="D";};Date.prototype.getTimezone=function(){return Date.getTimezoneAbbreviation(this.getUTCOffset,this.isDST());};Date.prototype.setTimezoneOffset=function(s){var here=this.getTimezoneOffset(),there=Number(s)*-6/10;this.addMinutes(there-here);return this;};Date.prototype.setTimezone=function(s){return this.setTimezoneOffset(Date.getTimezoneOffset(s));};Date.prototype.getUTCOffset=function(){var n=this.getTimezoneOffset()*-10/6,r;if(n<0){r=(n-10000).toString();return r[0]+r.substr(2);}else{r=(n+10000).toString();return"+"+r.substr(1);}};Date.prototype.getDayName=function(abbrev){return abbrev?Date.CultureInfo.abbreviatedDayNames[this.getDay()]:Date.CultureInfo.dayNames[this.getDay()];};Date.prototype.getMonthName=function(abbrev){return abbrev?Date.CultureInfo.abbreviatedMonthNames[this.getMonth()]:Date.CultureInfo.monthNames[this.getMonth()];};Date.prototype._toString=Date.prototype.toString;Date.prototype.toString=function(format){var self=this;var p=function p(s){return(s.toString().length==1)?"0"+s:s;};return format?format.replace(/dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?/g,function(format){switch(format){case"hh":return p(self.getHours()<13?self.getHours():(self.getHours()-12));case"h":return self.getHours()<13?self.getHours():(self.getHours()-12);case"HH":return p(self.getHours());case"H":return self.getHours();case"mm":return p(self.getMinutes());case"m":return self.getMinutes();case"ss":return p(self.getSeconds());case"s":return self.getSeconds();case"yyyy":return self.getFullYear();case"yy":return self.getFullYear().toString().substring(2,4);case"dddd":return self.getDayName();case"ddd":return self.getDayName(true);case"dd":return p(self.getDate());case"d":return self.getDate().toString();case"MMMM":return self.getMonthName();case"MMM":return self.getMonthName(true);case"MM":return p((self.getMonth()+1));case"M":return self.getMonth()+1;case"t":return self.getHours()<12?Date.CultureInfo.amDesignator.substring(0,1):Date.CultureInfo.pmDesignator.substring(0,1);case"tt":return self.getHours()<12?Date.CultureInfo.amDesignator:Date.CultureInfo.pmDesignator;case"zzz":case"zz":case"z":return"";}}):this._toString();}; -Date.now=function(){return new Date();};Date.today=function(){return Date.now().clearTime();};Date.prototype._orient=+1;Date.prototype.next=function(){this._orient=+1;return this;};Date.prototype.last=Date.prototype.prev=Date.prototype.previous=function(){this._orient=-1;return this;};Date.prototype._is=false;Date.prototype.is=function(){this._is=true;return this;};Number.prototype._dateElement="day";Number.prototype.fromNow=function(){var c={};c[this._dateElement]=this;return Date.now().add(c);};Number.prototype.ago=function(){var c={};c[this._dateElement]=this*-1;return Date.now().add(c);};(function(){var $D=Date.prototype,$N=Number.prototype;var dx=("sunday monday tuesday wednesday thursday friday saturday").split(/\s/),mx=("january february march april may june july august september october november december").split(/\s/),px=("Millisecond Second Minute Hour Day Week Month Year").split(/\s/),de;var df=function(n){return function(){if(this._is){this._is=false;return this.getDay()==n;} -return this.moveToDayOfWeek(n,this._orient);};};for(var i=0;i0&&!last){try{q=d.call(this,r[1]);}catch(ex){last=true;}}else{last=true;} -if(!last&&q[1].length===0){last=true;} -if(!last){var qx=[];for(var j=0;j0){rx[0]=rx[0].concat(p[0]);rx[1]=p[1];}} -if(rx[1].length1){args=Array.prototype.slice.call(arguments);}else if(arguments[0]instanceof Array){args=arguments[0];} -if(args){for(var i=0,px=args.shift();i2)?n:(n+(((n+2000)Date.getDaysInMonth(this.year,this.month)){throw new RangeError(this.day+" is not a valid value for days.");} -var r=new Date(this.year,this.month,this.day,this.hour,this.minute,this.second);if(this.timezone){r.set({timezone:this.timezone});}else if(this.timezoneOffset){r.set({timezoneOffset:this.timezoneOffset});} -return r;},finish:function(x){x=(x instanceof Array)?flattenAndCompact(x):[x];if(x.length===0){return null;} -for(var i=0;i)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
t
",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; -return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) -}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("