diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 77ac5b37..2d5a4d55 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,14 +13,22 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 - - name: Run Tests + - name: Install build dependencies + run: pip3 install -U pip wheel twine build setuptools + + - name: Install PlotDevice and run tests run: | - pip3 install -U pip wheel twine - python3 setup.py test + pip3 install . + python3 -m tests + + - name: Build Wheels + uses: pypa/cibuildwheel@v4 + with: + output-dir: dist - - name: Build sdist + - name: Build Source Distribution run: | - python3 setup.py sdist + python3 -m build --sdist - name: Upload to PyPI env: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fc27eb77..f1a082d1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,13 +38,17 @@ jobs: # collect notarization credentials xcrun notarytool store-credentials "AC_NOTARY" --apple-id "$AC_ID" --team-id "$AC_TEAM" --password "${{ secrets.AC_PASSWORD }}" - - name: Run Tests + - name: Install build dependencies + run: pip3 install -U pip wheel setuptools + + - name: Install PlotDevice and run tests run: | - python3 setup.py test + pip3 install . + python3 -m tests - name: Build & Notarize App run: | - python3 setup.py dist + python3 make.py dist - name: Create Draft Release uses: softprops/action-gh-release@v1 @@ -55,7 +59,7 @@ jobs: files: | dist/*.zip - sdist: + packages: name: Post to test.pypi.org runs-on: macos-latest @@ -63,13 +67,22 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 - - name: Run Tests + - name: Install build dependencies + run: pip3 install -U pip wheel twine build setuptools + + - name: Install PlotDevice and run tests run: | - python3 setup.py test + pip3 install . + python3 -m tests + + - name: Build Wheels + uses: pypa/cibuildwheel@v4 + with: + output-dir: dist - name: Build Source Distribution run: | - python3 setup.py sdist + python3 -m build --sdist - name: Upload to test.pypi.org env: @@ -78,6 +91,5 @@ jobs: TWINE_REPOSITORY: https://test.pypi.org/legacy/ TWINE_NON_INTERACTIVE: 1 run: | - pip3 install twine twine check dist/* twine upload -r testpypi dist/* diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e051121b..74dd839d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,4 +19,4 @@ jobs: run: brew install python-setuptools - name: Run tests - run: python3 setup.py test + run: python3 -m tests diff --git a/.gitignore b/.gitignore index 6da63f06..28ab5c4d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,8 @@ build/ dist/ plotdevice.egg-info app/Resources/viewer.nib -Manifest.in +plotdevice/rsrc +MANIFEST.in # local development deps/local diff --git a/BUILDING.md b/BUILDING.md new file mode 100644 index 00000000..14bec026 --- /dev/null +++ b/BUILDING.md @@ -0,0 +1,158 @@ +# Building PlotDevice from Source + +If you’re interested in unreleased code from the repository (or doing development work on the +library/app itself), there are a few different ways to build it. + +## Requirements + +- macOS 11+ and Xcode or the Xcode command line tools (`xcode-select --install`) +- A Python 3.9+ interpreter with wheel availability for `pyobjc-core==11.1` + (i.e. not a brand-new Python release that predates PyObjC’s own support for it) + + +## Setting up Python + +By default, macOS 12.3 and later only include a `python3` interpreter if you install Xcode (or its command line tools). +There are a few other ways to get a usable Python setup worth considering if you're interested in using +PlotDevice from the command line. A key feature distinguishing the different options is whether they +install Python as a ‘framework’ or ‘stand-alone’: + +> A **framework** Python installation allows PlotDevice to give you access to a GUI interface for +> running scripts via the `python3 -m plotdevice` command. **Stand-alone** Python is slightly more limited: +> it supports ‘headless’ use (via the command line tool’s [`--export`](#imageanimation-export) option) and +> can open a window displaying your canvas, but it will not show an icon in the Dock or give you access to +> commands in the menu bar. + +### Xcode + +The [Xcode command line tools](https://developer.apple.com/documentation/xcode/installing-the-command-line-tools/) provide a +**framework** build of the (now somewhat long in the tooth) 3.9 release of Python. If you're okay running such an old interpreter, +you can install the tools with the command: +```console +xcode-select --install +``` + +### Homebrew + +The [Homebrew](https://docs.brew.sh/Homebrew-and-Python) package manager provides a **framework** build via its more up-to-date `python3` package. You can install it and run `plotdevice` with: +```console +brew install python3 +``` + +### `pyenv` + +The [pyenv](https://github.com/pyenv/pyenv) version manager lets you easily switch between multiple python versions on the same system. +You can install a new **stand-alone** interpreter by specifying the version number: +```console +pyenv install 3.14.6 +``` + +If you want a **framework** install, you need to pass a custom option via environment variables: +```console +env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.14.6 +``` + +### `uv` + +A newer alternative is [`uv`](https://docs.astral.sh/uv/), which uses its own prebuilt interpreters (but currently does not provide +**framework** builds). If you're okay with the limitations of a **stand-alone** interpreter (see above), `uv` gives you a number of +ways to run PlotDevice. + +Run a script without permanently installing `plotdevice`: +```console +uvx --from plotdevice plotdevice +``` + +Install `plotdevice` as a standalone CLI tool: +```console +uv tool install plotdevice +plotdevice +``` + +Add `plotdevice` as a dependency in a `uv`-managed project: +```console +uv python install 3.14 +uv init myproject && cd myproject +uv add plotdevice +uv run plotdevice +``` + +## Local dev environment + +`python3 make.py dev` sets up a self-contained virtualenv at `deps/local//` +and ensures PlotDevice’s dependencies (including its native-code extensions) are installed. +Once this environment has been set up you can use `python3 -m plotdevice ` or +`app/plotdevice ` to run scripts directly from the repo. + +The dev environment is also useful for doing local builds of the app (since it has all the +necessary dependencies pre-installed), so be sure to ‘activate’ it via the correct invocation +for your shell before running one of the build commands: + +```sh +source ./deps/local//bin/activate # bash, zsh, etc. +source ./deps/local//bin/activate.fish # fish +source ./deps/local//bin/activate.csh # tcsh +``` + +To stop using the dev environment and return to your global python interpreter run: +```sh +deactivate +``` + +## Application builds + +The application can be built and debugged in Xcode with the `PlotDevice.xcodeproj` project. + +The `make.py` script contains additional utilities for building **PlotDevice.app** (i.e., the full GUI application) +from the command line. If you have the full Xcode installed on your system, you can build the app +(including its own embedded copy of Python) with: +```sh +python3 make.py app +``` + +Alternatively (if you only have the Xcode command line tools installed) you can use `py2app`, which can +be especially useful for quick, local tests: +```sh +python3 make.py py2app +``` + +The resulting binary will appear in the `dist` subdirectory and can be moved to your +Applications folder or any other fixed directory. To install a symlink to the command +line tool, launch the app from its installed location and click the Install button in +the Preferences window. + +## Module builds + +PlotDevice can also be built as a Python module, allowing you to rely on an external editor +and launch scripts from the command line (or from a ‘shebang’ line at the top of your +script invoking the `plotdevice` tool). + +The `plotdevice` Python module requires the compilation of native code in the `deps/extensions` directory +but can be installed like any other `pyproject.toml`-based package. From the repo root, type one of: +```sh +pip3 install . # for a regular install +pip3 install -e . # editable install, for dev work on plotdevice/*.py +``` +You can run the test suite with: +```sh +python3 -m tests +``` + +Redistributable `sdists` and wheels can be built via: +```sh +python3 -m build --sdist +python3 -m build --wheel +``` + +## Utilities + +The `make.py` script contains other subcommands that are primarily useful for packaging: +```sh +python3 make.py clean # remove build artifacts +python3 make.py distclean # also remove the embedded Python.framework and deps/local +python3 make.py icon # regenerate app/Resources/Assets.car from app/art/PlotDevice-app.icon +python3 make.py dist # build app (codesigned, notarized, and zipped) and update release.json +``` + +Note that `dist` requires a "Developer ID Application" signing identity and a `notarytool` keychain profile +named `AC_NOTARY`, and is intended for release builds only. diff --git a/CHANGES.md b/CHANGES.md index 4cd9fdb0..2108ec8d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,23 @@ +PlotDevice 1.1.0 +---------------- + +##### Misc. Improvements +* Upgraded bundled Python to 3.14 in app +* Added precompiled wheels for module installs (supporting Python 3.9–3.14) +* No longer requires Xcode command line tools in order to install +* `plotdevice` command's exit code now reflects script errors +* Added support for running under `uv` +* Editor now uses a `WKWebView` (replacing the deprecated `WebView`) +* Added new default editor theme +* New app icon should avoid "squircle jail" on macOS 26+ + +##### Bugfixes +* `ordered()` now works correctly and no longer causes the `Advanced/Sorting.pv` example to crash +* `Text.flow()` will now invoke user-provided callbacks to determine layout of multi-column runs +* Command line tool now parses `{4}`-style padded number blocks in exported filenames correctly +* Silenced a console error by fixing `super()` use in command line tool +* Restorable state in the app now uses the newer 'secure' api + PlotDevice 1.0.0 ----------------- @@ -24,7 +44,7 @@ PlotDevice 1.0.0 * arguments defined using the command line tool's `--args` options are now passed to the script's `sys.argv` ##### Misc. Improvements -* the command line tool can be exited via ctrl-c in addtion to being Quit from the menu bar +* the command line tool can be exited via ctrl-c in addition to being Quit from the menu bar * simplified unicode handling (and improved support for normalization of user-provided strings) * building the module now only requires Xcode command line tools—not a full Xcode.app installation * the `text()` command will always treat its first argument as content (even if it's not a string) unless a `str`, `xml`, or `src` keyword argument is provided @@ -224,7 +244,7 @@ NodeBox 1.8.3 NodeBox 1.8.2 ------------- -* Direct view is turned of because it broke vector output. +* Direct view is turned off because it broke vector output. * AppleScripting is back. NodeBox 1.8.1 @@ -267,8 +287,8 @@ NodeBox 1.0rc4 * Uses a scene graph internally for speeding things up. All objects now have an inheritFromContext that copies all state out of the context and into the objects. * Added animation. Adding a speed method indicates that the script is an animation. Animation scripts have a setup() method that does initial setup, and a draw() method that is called for each frame. You can use the throttle to change parameters while the animation is running. * Removed document properties and variables. NodeBox doesn't touch the code anymore. -* Added measurements for centimeters, milimeters and inches. Just use 5*cm for 5 centimeters. -* All drawing commands are now methods of the Context object. This makes sure that canvases don't interfere with eachother. NOTE: This will have some problems when drawing from libraries. Most notably, "from DrawingPrimitives import *" doesn't work anymore. However, libraries that do drawing can be imported with ximport("mylibrary") to automatically gain access to the _ctx global that has all drawing methods. +* Added measurements for centimeters, millimeters and inches. Just use 5*cm for 5 centimeters. +* All drawing commands are now methods of the Context object. This makes sure that canvases don't interfere with each other. NOTE: This will have some problems when drawing from libraries. Most notably, "from DrawingPrimitives import *" doesn't work anymore. However, libraries that do drawing can be imported with ximport("mylibrary") to automatically gain access to the _ctx global that has all drawing methods. * BezierPaths are no longer lists internally. They can still be accessed as a sequence, but the returned PathElements are not bound to the path. To manipulate the PathElements, iterate over the sequence, do the changes and use the BezierPath constructor with a list of PathElements as argument. NodeBox 1.0rc3 @@ -304,15 +324,15 @@ Version 1.0rc1 * The BezierPath object got a major overhaul: it now integrates nicely with the state model (using the transformedpath method) and is actually a list containing PathElement objects that contain a command, x and y coordinates and (optionally) control points. * All 'w' and 'h' parameters were changed to 'width' and 'height' (image, strokewidth) * All of the major state change commands return their state: font, fontsize, lineheight, align, colormode, fill, stroke, strokewidth, transform. -* Documentation is user-friendler and inside of the DrawBot application, so that it can be accessed through Apple's Help system. +* Documentation is user-friendlier and inside of the DrawBot application, so that it can be accessed through Apple's Help system. Version 0.9b9 ------------- * ValueLadder now respects type of original value: if the original is an integer, the new value will be an integer as well. * Fixed booleans in variables interface. -* Shift-dragging the value ladder now adds hundreths of a number instead of tenths. +* Shift-dragging the value ladder now adds hundredths of a number instead of tenths. * Fixed an obscure bug when using CMYK color objects to set the fill (they used the infamous "DrawBot-black" because the converted from the RGB system instead of CMYK) -* Turned of line highlighting on error because of bugs in PyDETextView. +* Turned off line highlighting on error because of bugs in PyDETextView. Version 0.9b8 ------------- @@ -345,7 +365,7 @@ Version 0.9b6 * text() command returns the text bounds. (In the same way as textmetrics() would do) * size, width and height property for the Image object. You can use imagewidth() and imageheight() also. * Fixed a bug where outlined text could not be stroked when the fill color was not set. -* The drawing region (DrawBotGraphicsView, a subclass of NSView) is acccessible using the graphicsView variable. This is only intented for hackers and will remain undocumented. +* The drawing region (DrawBotGraphicsView, a subclass of NSView) is accessible using the graphicsView variable. This is only intended for hackers and will remain undocumented. * Added the 'New with code' command which invokes OttoBot. Version 0.9b5 @@ -384,4 +404,4 @@ Version 0.9b1 Version 0.9a1 ------------- -* Just's first public release of DrawBot. \ No newline at end of file +* Just's first public release of DrawBot. diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 1464ae4a..3a4d221d 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -11,6 +11,8 @@ 2A15C45018A329BD006BDFF0 /* editor.html in Copy Editor Assets */ = {isa = PBXBuildFile; fileRef = 2A15C44418A329AE006BDFF0 /* editor.html */; }; 2A15C45218A329BD006BDFF0 /* themes.json in Copy Editor Assets */ = {isa = PBXBuildFile; fileRef = 2A15C44618A329AE006BDFF0 /* themes.json */; }; 2A15C45618A48770006BDFF0 /* autocomplete.css in Copy Editor Assets */ = {isa = PBXBuildFile; fileRef = 2A15C45418A48765006BDFF0 /* autocomplete.css */; }; + 2A2EFF223005C16B000B4593 /* Assets.car in Resources */ = {isa = PBXBuildFile; fileRef = 2A2EFF213005C16B000B4593 /* Assets.car */; }; + 2A2EFF2430073AE1000B4593 /* symbols.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A2EFF2330073AE1000B4593 /* symbols.js */; }; 2A36AE2D2868B4E50088976E /* Python.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A36AE2C2868B4E50088976E /* Python.framework */; }; 2A36AE2E2868B4F30088976E /* Python.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2A36AE2C2868B4E50088976E /* Python.framework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 2A36AE58286CA75B0088976E /* placeholder-light.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 2A36AE54286CA75B0088976E /* placeholder-light.pdf */; }; @@ -61,6 +63,7 @@ 2A36AE5E287210C70088976E /* ace in Copy Editor Scripts */, 2A66ECEC18A99328002903DE /* editor.js in Copy Editor Scripts */, 2A66ECEE18A99328002903DE /* keybindings.js in Copy Editor Scripts */, + 2A2EFF2430073AE1000B4593 /* symbols.js in Copy Editor Scripts */, ); name = "Copy Editor Scripts"; runOnlyForDeploymentPostprocessing = 0; @@ -90,6 +93,8 @@ 2A294464185E575F00E9F650 /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; 2A294467185E575F00E9F650 /* document.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = document.py; sourceTree = ""; }; 2A294468185E575F00E9F650 /* preferences.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = preferences.py; sourceTree = ""; }; + 2A2EFF213005C16B000B4593 /* Assets.car */ = {isa = PBXFileReference; lastKnownFileType = file; name = Assets.car; path = Resources/Assets.car; sourceTree = ""; }; + 2A2EFF2330073AE1000B4593 /* symbols.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = symbols.js; path = Resources/ui/js/symbols.js; sourceTree = ""; }; 2A32957218C59D0A00EEDD1C /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; 2A32957718C59D0A00EEDD1C /* io.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = io.py; sourceTree = ""; }; 2A32957918C59D0A00EEDD1C /* pathmatics.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pathmatics.py; sourceTree = ""; }; @@ -270,6 +275,7 @@ 2AD0A9B5186E552700D1F6DE /* PlotDeviceScript.xib */, 611CC48110BA8B9E00B55455 /* Credits.rtf */, 611CC48910BA8B9E00B55455 /* InfoPlist.strings */, + 2A2EFF213005C16B000B4593 /* Assets.car */, 611CC49310BA8B9E00B55455 /* PlotDevice.icns */, 611CC49410BA8B9E00B55455 /* PlotDeviceFile.icns */, 2A36AE56286CA75B0088976E /* placeholder-dark.pdf */, @@ -303,6 +309,7 @@ 2A36AE5D287210C70088976E /* ace */, 2A66ECDF18A992BD002903DE /* editor.js */, 2A66ECE118A992BD002903DE /* keybindings.js */, + 2A2EFF2330073AE1000B4593 /* symbols.js */, ); name = js; sourceTree = ""; @@ -428,6 +435,7 @@ 2A36AE59286CA75B0088976E /* placeholder-dark.pdf in Resources */, 611CC4A210BA8B9E00B55455 /* PlotDeviceFile.icns in Resources */, 611CC5A010BA908C00B55455 /* PlotDeviceDocument.xib in Resources */, + 2A2EFF223005C16B000B4593 /* Assets.car in Resources */, 611CC5A810BA919A00B55455 /* PlotDevicePreferences.xib in Resources */, 611CC68010BAA08300B55455 /* MainMenu.xib in Resources */, 611CC68710BAA0A600B55455 /* AskString.xib in Resources */, diff --git a/README.md b/README.md index d12a29af..4bd2c683 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,18 @@ -PlotDevice -========== +
+ +![PlotDevice: A Python-based graphics language for designers, developers, and tinkerers](app/art/hero@2x.png) + +
+ +
+ Website   ·   + Download   ·   + Docs   ·   + Discussion Forum +
+ +--- + PlotDevice is a Macintosh application used for computational graphic design. It provides an interactive Python environment where you can create two-dimensional graphics and output them in a variety of vector, bitmap, and animation formats. @@ -13,103 +26,58 @@ of 2D imagery and powerful compositing operations. #### Requirements -The PlotDevice application requires macOS 11 or greater (either on Intel or Apple Silicon) -and comes bundled with a Python 3.10 distribution. The module can be installed via `pip3` -on Python versions ≥3.6 (including the interpreter from the Xcode -[command line tools](https://developer.apple.com/download/all/?q=command%20line%20tools%20for%20xcode) -and those [installed through Homebrew](https://docs.brew.sh/Homebrew-and-Python)). - -#### Latest changes (July 2022) - -Over the years since the last release, progress in both macOS and Python itself led to quite -a bit of breakage. Some of the highlights of this maintenance release include: - -###### New Features -- Runs natively on Intel and Apple Silicon and supports retina displays -- Python 3 support (including a bundled 3.10 installation in the app) -- images can now be exported in HEIC format and videos support H.265 (HEVC) -- SVG files can now be drawn to the canvas using the `image()` command (thanks to the magical [SwiftDraw](https://github.com/swhitty/SwiftDraw) library) -- image exports have a configurable `zoom` to create 2x/3x/etc ‘retina’ images -- revamped `var()` command for creating GUIs to modify values via sliders, buttons, toggles, etc. -- updated text editor with multiple tabs, new themes, and additional key-binding modes emulating Sublime Text and VS Code -- the module's command line interface is now accessible through `python3 -m plotdevice` -- the command line tool has a new `--install` option to download [PyPI](https://pypi.org) packages for use within the app -- document autosaving is now user-configurable - -###### Bugfixes -- exported images generated on retina machines now have the proper dimensions -- hex colors can now use lowercase letters -- automatic variables like `WIDTH` & `HEIGHT` correctly support the `/` operator -- the Color object's `.blend()` method is working again -- the `read()` command can now handle csv files with spaces in their header row names -- the `translate()` command now incorporates non-pixel grid units set via the `size()` command -- cmyk exports are working reliably for command line `--export` and via the `export(cmyk=True)` method -- arguments defined using the command line tool's `--args` options are now passed to the script's `sys.argv` - -###### Misc. Improvements -- the command line tool can be exited via ctrl-c in addtion to being Quit from the menu bar -- simplified unicode handling (and improved support for normalization of user-provided strings) -- building the module now only requires Xcode command line tools—not a full Xcode.app installation -- the `text()` command will always treat its first argument as content (even if it's not a string) unless a `str`, `xml`, or `src` keyword argument is provided -- the mouse pointer is now visible in full-screen mode (and will auto-hide when inactive) - -###### Unfortunate Casualties -- The NodeBox Libraries (`coreimage`, `colors`, and friends) would require quite a bit of attention to get working properly again. - A first pass can be found in the [`plotdevice-libs` repository](https://github.com/plotdevice/plotdevice-libs) but they're not - ready for prime-time. If you're interested in contributing, this would be a terrific place to start! +The PlotDevice application requires macOS 11 or greater (either on Intel or Apple Silicon). +Installing the `plotdevice` python module and command line tool via `pip3` require you to +have Python version ≥3.9 on your system. -Installation ------------- +See the [build instructions](BUILDING.md) for details on setting up Python locally using +one of the recommended interpreters: +- [Homebrew](BUILDING.md#homebrew) (recommended) +- [Xcode command line tools](BUILDING.md#xcode) (stuck at version 3.9) +- [`pyenv`](BUILDING.md#pyenv) +- [`uv`](BUILDING.md#uv) -PlotDevice supports being built as either a full-fledged Cocoa application, or as -a standard Python module to be installed into a virtualenv alongside your source files. -In both cases it now includes a command line tool called [`plotdevice`](#running-scripts) allowing you to run -scripts and perform batch exports from the console. +#### Latest changes -#### Application builds +Version 1.1 adds compatibility for more recent Python 3 versions and no longer requires +the C & Swift extensions to be compiled when installing via `pip3` (since they're now +included in binary wheels). The app’s text editor has been updated to version 1.44 of +[Ace](https://ace.c9.io) and has an updated default theme. The module now installs cleanly +using [`uv`](https://docs.astral.sh/uv/) and the command line tool can be [run via `uvx`](BUILDING.md#uv). -The application can be built in Xcode with the `PlotDevice.xcodeproj` project. It can also -be built from the command line by using `python3 setup.py app` (which uses Xcode) or -`python3 setup.py py2app` (which uses setuptools). +See the [changelog](CHANGES.md) for additional details. -The resulting binary will appear in the `dist` subdirectory and can be moved to your -Applications folder or any other fixed directory. To install a symlink to the command -line tool, launch the app from its installed location and click the Install button in -the Preferences window. - -Prebuilt application binaries can be downloaded from the [PlotDevice site](https://plotdevice.io). - -#### Module builds +Installation +------------ -PlotDevice can also be built as a Python module, allowing you to rely on an external editor -and launch scripts from the command line (or from a ‘shebang’ line at the top of your -script invoking the `plotdevice` tool). To install the module and command line tool use -`python3 setup.py install` +PlotDevice can be used as either a full-fledged Cocoa application or +a standard Python module installed into a virtualenv alongside your source files. +In both cases, it includes a command line tool called [`plotdevice`](#running-scripts) +allowing you to run scripts and perform batch exports from the console. -Easier still, you can install the module directly from PyPI with a simple `pip3 install plotdevice`. -It's a good idea to install the `wheel` module first since it greatly speeds up installation of the -PyObjC libraries PlotDevice depends on. +#### Application -#### Alternative Python Interpreters +You can download a copy of the GUI app from the [PlotDevice website](https://plotdevice.io) or the most recent +[release](https://github.com/plotdevice/plotdevice/releases) on GitHub. The app has a built-in code editor and +is bundled with a copy of Python 3.14, so it's everything you need to write and run scripts. Open the app's +Preferences window to [set up the command line tool](https://plotdevice.io/tut/Console) if you'd like to +[run scripts](#running-scripts) from the terminal as well. -When using [pyenv](https://github.com/pyenv/pyenv) (or compiling Python from source) you have the -option of building the interpreter as a **Framework**. This gives you access to a GUI interface for -running PlotDevice scripts via the `python3 -m plotdevice` command. Non-framework builds support the -command line's `--export` functionality and will open a viewer window, but will not show an icon in -the Dock or give you access to the menu bar. +#### Python module & terminal command -To set up and run a script using a Framework build, do something along the lines of: +To install the module for use in your own Python scripts, you can use the command: ```console -env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.10.4 -pyenv shell 3.10.4 pip3 install plotdevice -python3 -m plotdevice -``` +``` + +This will also install the `plotdevice` command line tool, which you can use to [run `.pv` scripts](#running-scripts). +See the note below about [using a virtual environment](#installing-python-modules) if you don't want to install `plotdevice` +globally for your whole system. -#### Building from source +#### Build from source -You can also clone the git repository and build PlotDevice as a module or application from scratch. -Consult the [build instructions](https://github.com/plotdevice/plotdevice/discussions/59) for details. +If you're interested in doing development work on the library itself, take a look at the full +[build instructions](BUILDING.md). Documentation ------------- @@ -310,7 +278,7 @@ use of a nested `with` statement in the final example): ```python # export a 100-frame movie movie = export('anim.mov', fps=50, bitrate=1.8) -for i in xrange(100): +for i in range(100): clear(all) # erase the previous frame from the canvas ... # (do some drawing) movie.add() # add the canvas to the movie @@ -319,7 +287,7 @@ movie.finish() # wait for i/o to complete ```python # export a movie (with the context manager finishing the file when done) with export('anim.mov', fps=50, bitrate=1.8) as movie: - for i in xrange(100): + for i in range(100): clear(all) # erase the previous frame from the canvas ... # (do some drawing) movie.add() # add the canvas to the movie @@ -328,7 +296,7 @@ with export('anim.mov', fps=50, bitrate=1.8) as movie: # export a movie (with the context manager finishing the file when done) # let the movie.frame context manager call clear() and add() for us with export('anim.mov', fps=50, bitrate=1.8) as movie: - for i in xrange(100): + for i in range(100): with movie.frame: ... # draw the next frame ``` @@ -341,7 +309,7 @@ use the `page` attribute rather than `frame`: ```python # export a five-page pdf document pdf = export('multipage.pdf') -for i in xrange(5): +for i in range(5): clear(all) # erase the previous page's graphics from the canvas ... # (do some drawing) pdf.add() # add the canvas to the pdf as a new page @@ -350,7 +318,7 @@ pdf.finish() # write the pdf document to disk ```python # export a pdf document more succinctly with export('multipage.pdf') as pdf: - for i in xrange(5): + for i in range(5): with pdf.page: ... # draw the next page ``` @@ -367,7 +335,7 @@ If the filename contains a number between curly braces (e.g., `"name-{4}.ext"`), # export a sequence of images to output-0001.png, output-0002.png, ... # output-0099.png, output-0100.png with export('output.png') as img: - for i in xrange(100): + for i in range(100): with img.frame: ... # draw the next image in the sequence ``` @@ -375,7 +343,7 @@ with export('output.png') as img: # export a sequence of images to 01-img.png, 02-img.png, ... # 99-img.png, 100-img.png with export('{2}-img.png') as img: - for i in xrange(100): + for i in range(100): with img.frame: ... # draw the next image in the sequence ``` diff --git a/app/Resources/Assets.car b/app/Resources/Assets.car new file mode 100644 index 00000000..dc3c8a27 Binary files /dev/null and b/app/Resources/Assets.car differ diff --git a/app/Resources/ui/autocomplete.css b/app/Resources/ui/autocomplete.css index dfaba7ae..f7303dc1 100644 --- a/app/Resources/ui/autocomplete.css +++ b/app/Resources/ui/autocomplete.css @@ -402,4 +402,13 @@ #editor.ace-cloud9-day ~ div.ace_autocomplete {background-color:rgba(251, 251, 251, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} #editor.ace-cloud9-day ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(251, 251, 251, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(76, 136, 107, 1.0); border-style: dotted; } #editor.ace-cloud9-day ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(0, 0, 0, 1.0); } -#editor.ace-cloud9-day ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } \ No newline at end of file +#editor.ace-cloud9-day ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-samizdat ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(55, 55, 61, 1.0); background-color:rgba(55, 55, 61, 0.7);} +#editor.ace-samizdat ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(235, 219, 178, 1.0);} +#editor.ace-samizdat ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(78, 78, 78, 1.0); background-color:rgba(78, 78, 78, 0.7);} +#editor.ace-samizdat ~ div.ace_rightAlignedText {color:rgba(133, 133, 133, 1.0);} +#editor.ace-samizdat ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(251, 82, 69, 1.0);} +#editor.ace-samizdat ~ div.ace_autocomplete {background-color:rgba(24, 25, 32, 1.0); color:rgba(235, 219, 178, 1.0); border-color:rgba(235, 219, 178, 1.0);} +#editor.ace-samizdat ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(24, 25, 32, 1.0); color:rgba(235, 219, 178, 1.0); border-color:rgba(235, 219, 178, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(133, 133, 133, 1.0); border-style: dotted; } +#editor.ace-samizdat ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(235, 219, 178, 1.0); } +#editor.ace-samizdat ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } \ No newline at end of file diff --git a/app/Resources/ui/editor.html b/app/Resources/ui/editor.html index 17611f21..088a3204 100644 --- a/app/Resources/ui/editor.html +++ b/app/Resources/ui/editor.html @@ -43,11 +43,45 @@ box-shadow: inset 0 0 6px rgba(255, 255, 255, 0.3); } + /* italicize kwarg names */ + .ace_variable.ace_parameter { font-style: italic; } + + /* allow the max tooltip width to be a little bigger than default */ + #editor .ace_tooltip { + max-width: min(48em, 66vw); + } + /* the "read mode…" link in tooltips */ + .ace_symbol-doc-more { + margin-top: 4px; + cursor: pointer; + font-family: system-ui; + font-style: italic; + } + + .ace_symbol-doc-more::before{ + content:""; + display:block; + border-top: 1px solid currentColor; + opacity: 0.6; + } + .ace_symbol-doc-more span{ + opacity: .6; + padding: 4px 0 2px 0; + display:inline-block; + } + .ace_symbol-doc-more:hover span { + text-decoration: underline; + opacity:1; + } + + + + @@ -74,4 +108,4 @@ - \ No newline at end of file + diff --git a/app/Resources/ui/js/ace/ace.js b/app/Resources/ui/js/ace/ace.js index b71c2820..bdf4607b 100644 --- a/app/Resources/ui/js/ace/ace.js +++ b/app/Resources/ui/js/ace/ace.js @@ -173,202 +173,361 @@ exportAce(ACE_NAMESPACE); })(); -define("ace/lib/es6-shim",["require","exports","module"], function (require, exports, module) { - function defineProp(obj, name, val) { +define("ace/lib/es6-shim",["require","exports","module"], function(require, exports, module){function defineProp(obj, name, val) { Object.defineProperty(obj, name, { - value: val, - enumerable: false, - writable: true, - configurable: true + value: val, + enumerable: false, + writable: true, + configurable: true }); - } - if (!String.prototype.startsWith) { - defineProp( - String.prototype, - "startsWith", - function (searchString, position) { +} +if (!String.prototype.startsWith) { + defineProp(String.prototype, "startsWith", function (searchString, position) { position = position || 0; return this.lastIndexOf(searchString, position) === position; - } - ); - } - if (!String.prototype.endsWith) { + }); +} +if (!String.prototype.endsWith) { defineProp(String.prototype, "endsWith", function (searchString, position) { - var subjectString = this; - if (position === undefined || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - var lastIndex = subjectString.indexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; + var subjectString = this; + if (position === undefined || position > subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + var lastIndex = subjectString.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; }); - } - if (!String.prototype.repeat) { +} +if (!String.prototype.repeat) { defineProp(String.prototype, "repeat", function (count) { - var result = ""; - var string = this; - while (count > 0) { - if (count & 1) result += string; - - if ((count >>= 1)) string += string; - } - return result; + var result = ""; + var string = this; + while (count > 0) { + if (count & 1) + result += string; + if ((count >>= 1)) + string += string; + } + return result; }); - } - if (!String.prototype.includes) { +} +if (!String.prototype.includes) { defineProp(String.prototype, "includes", function (str, position) { - return this.indexOf(str, position) != -1; + return this.indexOf(str, position) != -1; }); - } - if (!Object.assign) { +} +if (!Object.assign) { Object.assign = function (target) { - if (target === undefined || target === null) { - throw new TypeError("Cannot convert undefined or null to object"); - } - - var output = Object(target); - for (var index = 1; index < arguments.length; index++) { - var source = arguments[index]; - if (source !== undefined && source !== null) { - Object.keys(source).forEach(function (key) { - output[key] = source[key]; - }); - } - } - return output; - }; - } - if (!Object.values) { + if (target === undefined || target === null) { + throw new TypeError("Cannot convert undefined or null to object"); + } + var output = Object(target); + for (var index = 1; index < arguments.length; index++) { + var source = arguments[index]; + if (source !== undefined && source !== null) { + Object.keys(source).forEach(function (key) { + output[key] = source[key]; + }); + } + } + return output; + }; +} +if (!Object.values) { Object.values = function (o) { - return Object.keys(o).map(function (k) { - return o[k]; - }); + return Object.keys(o).map(function (k) { + return o[k]; + }); }; - } - if (!Array.prototype.find) { +} +if (!Array.prototype.find) { defineProp(Array.prototype, "find", function (predicate) { - var len = this.length; - var thisArg = arguments[1]; - for (var k = 0; k < len; k++) { - var kValue = this[k]; - if (predicate.call(thisArg, kValue, k, this)) { - return kValue; - } - } + var len = this.length; + var thisArg = arguments[1]; + for (var k = 0; k < len; k++) { + var kValue = this[k]; + if (predicate.call(thisArg, kValue, k, this)) { + return kValue; + } + } }); - } - if (!Array.prototype.findIndex) { +} +if (!Array.prototype.findIndex) { defineProp(Array.prototype, "findIndex", function (predicate) { - var len = this.length; - var thisArg = arguments[1]; - for (var k = 0; k < len; k++) { - var kValue = this[k]; - if (predicate.call(thisArg, kValue, k, this)) { - return k; - } - } + var len = this.length; + var thisArg = arguments[1]; + for (var k = 0; k < len; k++) { + var kValue = this[k]; + if (predicate.call(thisArg, kValue, k, this)) { + return k; + } + } }); - } - if (!Array.prototype.includes) { +} +if (!Array.prototype.includes) { defineProp(Array.prototype, "includes", function (item, position) { - return this.indexOf(item, position) != -1; + return this.indexOf(item, position) != -1; }); - } - if (!Array.prototype.fill) { +} +if (!Array.prototype.fill) { defineProp(Array.prototype, "fill", function (value) { - var O = this; - var len = O.length >>> 0; - var start = arguments[1]; - var relativeStart = start >> 0; - var k = - relativeStart < 0 - ? Math.max(len + relativeStart, 0) - : Math.min(relativeStart, len); - var end = arguments[2]; - var relativeEnd = end === undefined ? len : end >> 0; - var final = - relativeEnd < 0 - ? Math.max(len + relativeEnd, 0) - : Math.min(relativeEnd, len); - while (k < final) { - O[k] = value; - k++; - } - return O; + var O = this; + var len = O.length >>> 0; + var start = arguments[1]; + var relativeStart = start >> 0; + var k = relativeStart < 0 + ? Math.max(len + relativeStart, 0) + : Math.min(relativeStart, len); + var end = arguments[2]; + var relativeEnd = end === undefined ? len : end >> 0; + var final = relativeEnd < 0 + ? Math.max(len + relativeEnd, 0) + : Math.min(relativeEnd, len); + while (k < final) { + O[k] = value; + k++; + } + return O; }); - } - if (!Array.of) { +} +if (!Array.of) { defineProp(Array, "of", function () { - return Array.prototype.slice.call(arguments); + return Array.prototype.slice.call(arguments); }); - } +} + }); -define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/es6-shim"], function(require, exports, module) { +define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/es6-shim"], function(require, exports, module){// vim:set ts=4 sts=4 sw=4 st: "use strict"; - require("./es6-shim"); }); -define("ace/lib/useragent",["require","exports","module"], function(require, exports, module) { -"use strict"; +define("ace/lib/deep_copy",["require","exports","module"], function(require, exports, module){exports.deepCopy = function deepCopy(obj) { + if (typeof obj !== "object" || !obj) + return obj; + var copy; + if (Array.isArray(obj)) { + copy = []; + for (var key = 0; key < obj.length; key++) { + copy[key] = deepCopy(obj[key]); + } + return copy; + } + if (Object.prototype.toString.call(obj) !== "[object Object]") + return obj; + copy = {}; + for (var key in obj) + copy[key] = deepCopy(obj[key]); + return copy; +}; + +}); + +define("ace/lib/lang",["require","exports","module","ace/lib/deep_copy"], function(require, exports, module){"use strict"; +exports.last = function (a) { + return a[a.length - 1]; +}; +exports.stringReverse = function (string) { + return string.split("").reverse().join(""); +}; +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + if (count >>= 1) + string += string; + } + return result; +}; +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; +exports.copyObject = function (obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; +exports.copyArray = function (array) { + var copy = []; + for (var i = 0, l = array.length; i < l; i++) { + if (array[i] && typeof array[i] == "object") + copy[i] = this.copyObject(array[i]); + else + copy[i] = array[i]; + } + return copy; +}; +exports.deepCopy = require("./deep_copy").deepCopy; +exports.arrayToMap = function (arr) { + var map = {}; + for (var i = 0; i < arr.length; i++) { + map[arr[i]] = 1; + } + return map; +}; +exports.createMap = function (props) { + var map = Object.create(null); + for (var i in props) { + map[i] = props[i]; + } + return map; +}; +exports.arrayRemove = function (array, value) { + for (var i = 0; i <= array.length; i++) { + if (value === array[i]) { + array.splice(i, 1); + } + } +}; +exports.escapeRegExp = function (str) { + return str.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1'); +}; +exports.escapeHTML = function (str) { + return ("" + str).replace(/&/g, "&").replace(/"/g, """).replace(/'/g, "'").replace(/ 0xffff ? 2 : 1; +}; + +}); + +define("ace/lib/useragent",["require","exports","module"], function(require, exports, module){"use strict"; exports.OS = { LINUX: "LINUX", MAC: "MAC", WINDOWS: "WINDOWS" }; -exports.getOS = function() { +exports.getOS = function () { if (exports.isMac) { return exports.OS.MAC; - } else if (exports.isLinux) { + } + else if (exports.isLinux) { return exports.OS.LINUX; - } else { + } + else { return exports.OS.WINDOWS; } }; var _navigator = typeof navigator == "object" ? navigator : {}; - var os = (/mac|win|linux/i.exec(_navigator.platform) || ["other"])[0].toLowerCase(); var ua = _navigator.userAgent || ""; var appName = _navigator.appName || ""; exports.isWin = (os == "win"); exports.isMac = (os == "mac"); exports.isLinux = (os == "linux"); -exports.isIE = +exports.isIE = (appName == "Microsoft Internet Explorer" || appName.indexOf("MSAppHost") >= 0) - ? parseFloat((ua.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]) - : parseFloat((ua.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]); // for ie - + ? parseFloat((ua.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/) || [])[1]) + : parseFloat((ua.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/) || [])[1]); // for ie exports.isOldIE = exports.isIE && exports.isIE < 9; exports.isGecko = exports.isMozilla = ua.match(/ Gecko\/\d+/); -exports.isOpera = typeof opera == "object" && Object.prototype.toString.call(window.opera) == "[object Opera]"; +exports.isOpera = typeof opera == "object" && Object.prototype.toString.call(window["opera"]) == "[object Opera]"; exports.isWebKit = parseFloat(ua.split("WebKit/")[1]) || undefined; - exports.isChrome = parseFloat(ua.split(" Chrome/")[1]) || undefined; - +exports.isSafari = parseFloat(ua.split(" Safari/")[1]) && !exports.isChrome || undefined; exports.isEdge = parseFloat(ua.split(" Edge/")[1]) || undefined; - exports.isAIR = ua.indexOf("AdobeAIR") >= 0; - exports.isAndroid = ua.indexOf("Android") >= 0; - exports.isChromeOS = ua.indexOf(" CrOS ") >= 0; - -exports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream; - -if (exports.isIOS) exports.isMac = true; - +exports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window["MSStream"]; +if (exports.isIOS) + exports.isMac = true; exports.isMobile = exports.isIOS || exports.isAndroid; }); -define("ace/lib/dom",["require","exports","module","ace/lib/useragent"], function(require, exports, module) { -"use strict"; - -var useragent = require("./useragent"); +define("ace/lib/dom",["require","exports","module","ace/lib/useragent"], function(require, exports, module){"use strict"; +var useragent = require("./useragent"); var XHTML_NS = "http://www.w3.org/1999/xhtml"; - exports.buildDom = function buildDom(arr, parent, refs) { if (typeof arr == "string" && arr) { var txt = document.createTextNode(arr); @@ -376,7 +535,6 @@ exports.buildDom = function buildDom(arr, parent, refs) { parent.appendChild(txt); return txt; } - if (!Array.isArray(arr)) { if (arr && arr.appendChild && parent) parent.appendChild(arr); @@ -390,7 +548,6 @@ exports.buildDom = function buildDom(arr, parent, refs) { } return els; } - var el = document.createElement(arr[0]); var options = arr[1]; var childIndex = 1; @@ -399,17 +556,23 @@ exports.buildDom = function buildDom(arr, parent, refs) { for (var i = childIndex; i < arr.length; i++) buildDom(arr[i], el, refs); if (childIndex == 2) { - Object.keys(options).forEach(function(n) { + Object.keys(options).forEach(function (n) { var val = options[n]; if (n === "class") { el.className = Array.isArray(val) ? val.join(" ") : val; - } else if (typeof val == "function" || n == "value" || n[0] == "$") { + } + else if (typeof val == "function" || n == "value" || n[0] == "$") { el[n] = val; - } else if (n === "ref") { - if (refs) refs[val] = el; - } else if (n === "style") { - if (typeof val == "string") el.style.cssText = val; - } else if (val != null) { + } + else if (n === "ref") { + if (refs) + refs[val] = el; + } + else if (n === "style") { + if (typeof val == "string") + el.style.cssText = val; + } + else if (val != null) { el.setAttribute(n, val); } }); @@ -418,43 +581,35 @@ exports.buildDom = function buildDom(arr, parent, refs) { parent.appendChild(el); return el; }; - -exports.getDocumentHead = function(doc) { +exports.getDocumentHead = function (doc) { if (!doc) doc = document; return doc.head || doc.getElementsByTagName("head")[0] || doc.documentElement; }; - -exports.createElement = function(tag, ns) { - return document.createElementNS ? - document.createElementNS(ns || XHTML_NS, tag) : - document.createElement(tag); +exports.createElement = function (tag, ns) { + return document.createElementNS ? document.createElementNS(ns || XHTML_NS, tag) : document.createElement(tag); }; - -exports.removeChildren = function(element) { +exports.removeChildren = function (element) { element.innerHTML = ""; }; - -exports.createTextNode = function(textContent, element) { +exports.createTextNode = function (textContent, element) { var doc = element ? element.ownerDocument : document; return doc.createTextNode(textContent); }; - -exports.createFragment = function(element) { +exports.createFragment = function (element) { var doc = element ? element.ownerDocument : document; return doc.createDocumentFragment(); }; - -exports.hasCssClass = function(el, name) { +exports.hasCssClass = function (el, name) { var classes = (el.className + "").split(/\s+/g); return classes.indexOf(name) !== -1; }; -exports.addCssClass = function(el, name) { +exports.addCssClass = function (el, name) { if (!exports.hasCssClass(el, name)) { el.className += " " + name; } }; -exports.removeCssClass = function(el, name) { +exports.removeCssClass = function (el, name) { var classes = el.className.split(/\s+/g); while (true) { var index = classes.indexOf(name); @@ -465,8 +620,7 @@ exports.removeCssClass = function(el, name) { } el.className = classes.join(" "); }; - -exports.toggleCssClass = function(el, name) { +exports.toggleCssClass = function (el, name) { var classes = el.className.split(/\s+/g), add = true; while (true) { var index = classes.indexOf(name); @@ -478,19 +632,18 @@ exports.toggleCssClass = function(el, name) { } if (add) classes.push(name); - el.className = classes.join(" "); return add; }; -exports.setCssClass = function(node, className, include) { +exports.setCssClass = function (node, className, include) { if (include) { exports.addCssClass(node, className); - } else { + } + else { exports.removeCssClass(node, className); } }; - -exports.hasCssString = function(id, doc) { +exports.hasCssString = function (id, doc) { var index = 0, sheets; doc = doc || document; if ((sheets = doc.querySelectorAll("style"))) { @@ -501,82 +654,106 @@ exports.hasCssString = function(id, doc) { } } }; - -exports.removeElementById = function(id, doc) { +exports.removeElementById = function (id, doc) { doc = doc || document; - if(doc.getElementById(id)) { + if (doc.getElementById(id)) { doc.getElementById(id).remove(); } }; - var strictCSP; var cssCache = []; -exports.useStrictCSP = function(value) { +exports.useStrictCSP = function (value) { strictCSP = value; - if (value == false) insertPendingStyles(); - else if (!cssCache) cssCache = []; + if (value == false) + insertPendingStyles(); + else if (!cssCache) + cssCache = []; }; - function insertPendingStyles() { var cache = cssCache; cssCache = null; - cache && cache.forEach(function(item) { + cache && cache.forEach(function (item) { importCssString(item[0], item[1]); }); } - function importCssString(cssText, id, target) { if (typeof document == "undefined") return; if (cssCache) { if (target) { insertPendingStyles(); - } else if (target === false) { + } + else if (target === false) { return cssCache.push([cssText, id]); } } - if (strictCSP) return; - + if (strictCSP) + return; var container = target; if (!target || !target.getRootNode) { container = document; - } else { + } + else { container = target.getRootNode(); if (!container || container == target) container = document; } - var doc = container.ownerDocument || container; if (id && exports.hasCssString(id, container)) return null; - if (id) cssText += "\n/*# sourceURL=ace/css/" + id + " */"; - var style = exports.createElement("style"); style.appendChild(doc.createTextNode(cssText)); if (id) style.id = id; - if (container == doc) container = exports.getDocumentHead(doc); container.insertBefore(style, container.firstChild); } exports.importCssString = importCssString; - -exports.importCssStylsheet = function(uri, doc) { - exports.buildDom(["link", {rel: "stylesheet", href: uri}], exports.getDocumentHead(doc)); +exports.importCssStylsheet = function (uri, doc) { + exports.buildDom(["link", { rel: "stylesheet", href: uri }], exports.getDocumentHead(doc)); +}; +exports.$fixPositionBug = function (el) { + var rect = el.getBoundingClientRect(); + if (el.style.left) { + var target = parseFloat(el.style.left); + var result = +rect.left; + if (Math.abs(target - result) > 1) { + el.style.left = 2 * target - result + "px"; + } + } + if (el.style.right) { + var target = parseFloat(el.style.right); + var result = window.innerWidth - rect.right; + if (Math.abs(target - result) > 1) { + el.style.right = 2 * target - result + "px"; + } + } + if (el.style.top) { + var target = parseFloat(el.style.top); + var result = +rect.top; + if (Math.abs(target - result) > 1) { + el.style.top = 2 * target - result + "px"; + } + } + if (el.style.bottom) { + var target = parseFloat(el.style.bottom); + var result = window.innerHeight - rect.bottom; + if (Math.abs(target - result) > 1) { + el.style.bottom = 2 * target - result + "px"; + } + } }; -exports.scrollbarWidth = function(document) { +exports.scrollbarWidth = function (doc) { var inner = exports.createElement("ace_inner"); inner.style.width = "100%"; inner.style.minWidth = "0px"; inner.style.height = "200px"; inner.style.display = "block"; - var outer = exports.createElement("ace_outer"); var style = outer.style; - style.position = "absolute"; style.left = "-10000px"; style.overflow = "hidden"; @@ -584,59 +761,50 @@ exports.scrollbarWidth = function(document) { style.minWidth = "0px"; style.height = "150px"; style.display = "block"; - outer.appendChild(inner); - - var body = document.documentElement; + var body = (doc && doc.documentElement) || (document && document.documentElement); + if (!body) + return 0; body.appendChild(outer); - var noScrollbar = inner.offsetWidth; - style.overflow = "scroll"; var withScrollbar = inner.offsetWidth; - - if (noScrollbar == withScrollbar) { + if (noScrollbar === withScrollbar) { withScrollbar = outer.clientWidth; } - body.removeChild(outer); - - return noScrollbar-withScrollbar; + return noScrollbar - withScrollbar; }; - -exports.computedStyle = function(element, style) { +exports.computedStyle = function (element, style) { return window.getComputedStyle(element, "") || {}; }; - -exports.setStyle = function(styles, property, value) { +exports.setStyle = function (styles, property, value) { if (styles[property] !== value) { styles[property] = value; } }; - exports.HAS_CSS_ANIMATION = false; exports.HAS_CSS_TRANSFORMS = false; exports.HI_DPI = useragent.isWin ? typeof window !== "undefined" && window.devicePixelRatio >= 1.5 : true; - -if (useragent.isChromeOS) exports.HI_DPI = false; - +if (useragent.isChromeOS) + exports.HI_DPI = false; if (typeof document !== "undefined") { var div = document.createElement("div"); - if (exports.HI_DPI && div.style.transform !== undefined) + if (exports.HI_DPI && div.style.transform !== undefined) exports.HAS_CSS_TRANSFORMS = true; if (!useragent.isEdge && typeof div.style.animationName !== "undefined") exports.HAS_CSS_ANIMATION = true; div = null; } - if (exports.HAS_CSS_TRANSFORMS) { - exports.translate = function(element, tx, ty) { - element.style.transform = "translate(" + Math.round(tx) + "px, " + Math.round(ty) +"px)"; + exports.translate = function (element, tx, ty) { + element.style.transform = "translate(" + Math.round(tx) + "px, " + Math.round(ty) + "px)"; }; -} else { - exports.translate = function(element, tx, ty) { +} +else { + exports.translate = function (element, tx, ty) { element.style.top = Math.round(ty) + "px"; element.style.left = Math.round(tx) + "px"; }; @@ -644,1645 +812,2047 @@ if (exports.HAS_CSS_TRANSFORMS) { }); -define("ace/lib/oop",["require","exports","module"], function(require, exports, module) { +define("ace/lib/net",["require","exports","module","ace/lib/dom"], function(require, exports, module){/* + * based on code from: + * + * @license RequireJS text 0.25.0 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/jrburke/requirejs for details + */ "use strict"; - -exports.inherits = function(ctor, superCtor) { - ctor.super_ = superCtor; - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true +var dom = require("./dom"); +exports.get = function (url, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + callback(xhr.responseText); } - }); + }; + xhr.send(null); }; - -exports.mixin = function(obj, mixin) { +exports.loadScript = function (path, callback) { + var head = dom.getDocumentHead(); + var s = document.createElement('script'); + s.src = path; + head.appendChild(s); + s.onload = s.onreadystatechange = function (_, isAbort) { + if (isAbort || !s.readyState || s.readyState == "loaded" || s.readyState == "complete") { + s = s.onload = s.onreadystatechange = null; + if (!isAbort) + callback(); + } + }; +}; +exports.qualifyURL = function (url) { + var a = document.createElement('a'); + a.href = url; + return a.href; +}; + +}); + +define("ace/lib/oop",["require","exports","module"], function(require, exports, module){"use strict"; +exports.inherits = function (ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; +exports.mixin = function (obj, mixin) { for (var key in mixin) { obj[key] = mixin[key]; } return obj; }; - -exports.implement = function(proto, mixin) { +exports.implement = function (proto, mixin) { exports.mixin(proto, mixin); }; }); -define("ace/lib/keys",["require","exports","module","ace/lib/oop"], function(require, exports, module) { -"use strict"; - -var oop = require("./oop"); -var Keys = (function() { - var ret = { - MODIFIER_KEYS: { - 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta', - 91: 'MetaLeft', 92: 'MetaRight', 93: 'ContextMenu' - }, - - KEY_MODS: { - "ctrl": 1, "alt": 2, "option" : 2, "shift": 4, - "super": 8, "meta": 8, "command": 8, "cmd": 8, - "control": 1 - }, - - FUNCTION_KEYS : { - 8 : "Backspace", - 9 : "Tab", - 13 : "Return", - 19 : "Pause", - 27 : "Esc", - 32 : "Space", - 33 : "PageUp", - 34 : "PageDown", - 35 : "End", - 36 : "Home", - 37 : "Left", - 38 : "Up", - 39 : "Right", - 40 : "Down", - 44 : "Print", - 45 : "Insert", - 46 : "Delete", - 96 : "Numpad0", - 97 : "Numpad1", - 98 : "Numpad2", - 99 : "Numpad3", - 100: "Numpad4", - 101: "Numpad5", - 102: "Numpad6", - 103: "Numpad7", - 104: "Numpad8", - 105: "Numpad9", - '-13': "NumpadEnter", - 112: "F1", - 113: "F2", - 114: "F3", - 115: "F4", - 116: "F5", - 117: "F6", - 118: "F7", - 119: "F8", - 120: "F9", - 121: "F10", - 122: "F11", - 123: "F12", - 144: "Numlock", - 145: "Scrolllock" - }, - - PRINTABLE_KEYS: { - 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5', - 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a', - 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h', - 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', - 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v', - 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.', - 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', - 219: '[', 220: '\\',221: ']', 222: "'", 111: '/', 106: '*' - } - }; - var name, i; - for (i in ret.FUNCTION_KEYS) { - name = ret.FUNCTION_KEYS[i].toLowerCase(); - ret[name] = parseInt(i, 10); +define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module){"use strict"; +var EventEmitter = {}; +var stopPropagation = function () { this.propagationStopped = true; }; +var preventDefault = function () { this.defaultPrevented = true; }; +EventEmitter._emit = + EventEmitter._dispatchEvent = function (eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + if (typeof e != "object" || !e) + e = {}; + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + listeners = listeners.slice(); + for (var i = 0; i < listeners.length; i++) { + listeners[i](e, this); + if (e.propagationStopped) + break; + } + if (defaultHandler && !e.defaultPrevented) + return defaultHandler(e, this); + }; +EventEmitter._signal = function (eventName, e) { + var listeners = (this._eventRegistry || {})[eventName]; + if (!listeners) + return; + listeners = listeners.slice(); + for (var i = 0; i < listeners.length; i++) + listeners[i](e, this); +}; +EventEmitter.once = function (eventName, callback) { + var _self = this; + this.on(eventName, function newCallback() { + _self.off(eventName, newCallback); + callback.apply(null, arguments); + }); + if (!callback) { + return new Promise(function (resolve) { + callback = resolve; + }); + } +}; +EventEmitter.setDefaultHandler = function (eventName, callback) { + var handlers = this._defaultHandlers; + if (!handlers) + handlers = this._defaultHandlers = { _disabled_: {} }; + if (handlers[eventName]) { + var old = handlers[eventName]; + var disabled = handlers._disabled_[eventName]; + if (!disabled) + handlers._disabled_[eventName] = disabled = []; + disabled.push(old); + var i = disabled.indexOf(callback); + if (i != -1) + disabled.splice(i, 1); + } + handlers[eventName] = callback; +}; +EventEmitter.removeDefaultHandler = function (eventName, callback) { + var handlers = this._defaultHandlers; + if (!handlers) + return; + var disabled = handlers._disabled_[eventName]; + if (handlers[eventName] == callback) { + if (disabled) + this.setDefaultHandler(eventName, disabled.pop()); } - for (i in ret.PRINTABLE_KEYS) { - name = ret.PRINTABLE_KEYS[i].toLowerCase(); - ret[name] = parseInt(i, 10); + else if (disabled) { + var i = disabled.indexOf(callback); + if (i != -1) + disabled.splice(i, 1); } - oop.mixin(ret, ret.MODIFIER_KEYS); - oop.mixin(ret, ret.PRINTABLE_KEYS); - oop.mixin(ret, ret.FUNCTION_KEYS); - ret.enter = ret["return"]; - ret.escape = ret.esc; - ret.del = ret["delete"]; - ret[173] = '-'; - - (function() { - var mods = ["cmd", "ctrl", "alt", "shift"]; - for (var i = Math.pow(2, mods.length); i--;) { - ret.KEY_MODS[i] = mods.filter(function(x) { - return i & ret.KEY_MODS[x]; - }).join("-") + "-"; - } - })(); - - ret.KEY_MODS[0] = ""; - ret.KEY_MODS[-1] = "input-"; - - return ret; -})(); -oop.mixin(exports, Keys); - -exports.keyCodeToString = function(keyCode) { - var keyString = Keys[keyCode]; - if (typeof keyString != "string") - keyString = String.fromCharCode(keyCode); - return keyString.toLowerCase(); }; +EventEmitter.on = + EventEmitter.addEventListener = function (eventName, callback, capturing) { + this._eventRegistry = this._eventRegistry || {}; + var listeners = this._eventRegistry[eventName]; + if (!listeners) + listeners = this._eventRegistry[eventName] = []; + if (listeners.indexOf(callback) == -1) + listeners[capturing ? "unshift" : "push"](callback); + return callback; + }; +EventEmitter.off = + EventEmitter.removeListener = + EventEmitter.removeEventListener = function (eventName, callback) { + this._eventRegistry = this._eventRegistry || {}; + var listeners = this._eventRegistry[eventName]; + if (!listeners) + return; + var index = listeners.indexOf(callback); + if (index !== -1) + listeners.splice(index, 1); + }; +EventEmitter.removeAllListeners = function (eventName) { + if (!eventName) + this._eventRegistry = this._defaultHandlers = undefined; + if (this._eventRegistry) + this._eventRegistry[eventName] = undefined; + if (this._defaultHandlers) + this._defaultHandlers[eventName] = undefined; +}; +exports.EventEmitter = EventEmitter; }); -define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) { -"use strict"; - -var keys = require("./keys"); -var useragent = require("./useragent"); +define("ace/lib/report_error",["require","exports","module"], function(require, exports, module){exports.reportError = function reportError(msg, data) { + var e = new Error(msg); + e["data"] = data; + if (typeof console == "object" && console.error) + console.error(e); + setTimeout(function () { throw e; }); +}; -var pressedKeys = null; -var ts = 0; +}); -var activeListenerOptions; -function detectListenerOptionsSupport() { - activeListenerOptions = false; - try { - document.createComment("").addEventListener("test", function() {}, { - get passive() { - activeListenerOptions = {passive: false}; - } - }); - } catch(e) {} -} +define("ace/lib/default_english_messages",["require","exports","module"], function(require, exports, module){var defaultEnglishMessages = { + "autocomplete.popup.aria-roledescription": "Autocomplete suggestions", + "autocomplete.popup.aria-label": "Autocomplete suggestions", + "autocomplete.popup.item.aria-roledescription": "item", + "autocomplete.loading": "Loading...", + "editor.scroller.aria-roledescription": "editor", + "editor.scroller.aria-label": "Editor content, press Enter to start editing, press Escape to exit", + "editor.gutter.aria-roledescription": "editor gutter", + "editor.gutter.aria-label": "Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit", + "error-marker.good-state": "Looks good!", + "prompt.recently-used": "Recently used", + "prompt.other-commands": "Other commands", + "prompt.no-matching-commands": "No matching commands", + "search-box.find.placeholder": "Search for", + "search-box.find-all.text": "All", + "search-box.replace.placeholder": "Replace with", + "search-box.replace-next.text": "Replace", + "search-box.replace-all.text": "All", + "search-box.toggle-replace.title": "Toggle Replace mode", + "search-box.toggle-regexp.title": "RegExp Search", + "search-box.toggle-case.title": "CaseSensitive Search", + "search-box.toggle-whole-word.title": "Whole Word Search", + "search-box.toggle-in-selection.title": "Search In Selection", + "search-box.search-counter": "$0 of $1", + "text-input.aria-roledescription": "editor", + "text-input.aria-label": "Cursor at row $0", + "gutter.code-folding.range.aria-label": "Toggle code folding, rows $0 through $1", + "gutter.code-folding.closed.aria-label": "Toggle code folding, rows $0 through $1", + "gutter.code-folding.open.aria-label": "Toggle code folding, row $0", + "gutter.code-folding.closed.title": "Unfold code", + "gutter.code-folding.open.title": "Fold code", + "gutter.annotation.aria-label.error": "Error, read annotations row $0", + "gutter.annotation.aria-label.warning": "Warning, read annotations row $0", + "gutter.annotation.aria-label.info": "Info, read annotations row $0", + "inline-fold.closed.title": "Unfold code", + "gutter-tooltip.aria-label.error.singular": "error", + "gutter-tooltip.aria-label.error.plural": "errors", + "gutter-tooltip.aria-label.warning.singular": "warning", + "gutter-tooltip.aria-label.warning.plural": "warnings", + "gutter-tooltip.aria-label.info.singular": "information message", + "gutter-tooltip.aria-label.info.plural": "information messages", + "gutter.annotation.aria-label.security": "Security finding, read annotations row $0", + "gutter.annotation.aria-label.hint": "Suggestion, read annotations row $0", + "gutter-tooltip.aria-label.security.singular": "security finding", + "gutter-tooltip.aria-label.security.plural": "security findings", + "gutter-tooltip.aria-label.hint.singular": "suggestion", + "gutter-tooltip.aria-label.hint.plural": "suggestions", + "editor.tooltip.disable-editing": "Editing is disabled" +}; +exports.defaultEnglishMessages = defaultEnglishMessages; -function getListenerOptions() { - if (activeListenerOptions == undefined) - detectListenerOptionsSupport(); - return activeListenerOptions; -} +}); -function EventListener(elem, type, callback) { - this.elem = elem; - this.type = type; - this.callback = callback; -} -EventListener.prototype.destroy = function() { - removeListener(this.elem, this.type, this.callback); - this.elem = this.type = this.callback = undefined; +define("ace/lib/app_config",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/report_error","ace/lib/default_english_messages"], function(require, exports, module){"no use strict"; +var oop = require("./oop"); +var EventEmitter = require("./event_emitter").EventEmitter; +var reportError = require("./report_error").reportError; +var defaultEnglishMessages = require("./default_english_messages").defaultEnglishMessages; +var optionsProvider = { + setOptions: function (optList) { + Object.keys(optList).forEach(function (key) { + this.setOption(key, optList[key]); + }, this); + }, + getOptions: function (optionNames) { + var result = {}; + if (!optionNames) { + var options = this.$options; + optionNames = Object.keys(options).filter(function (key) { + return !options[key].hidden; + }); + } + else if (!Array.isArray(optionNames)) { + optionNames = Object.keys(optionNames); + } + optionNames.forEach(function (key) { + result[key] = this.getOption(key); + }, this); + return result; + }, + setOption: function (name, value) { + if (this["$" + name] === value) + return; + var opt = this.$options[name]; + if (!opt) { + return warn('misspelled option "' + name + '"'); + } + if (opt.forwardTo) + return this[opt.forwardTo] && this[opt.forwardTo].setOption(name, value); + if (!opt.handlesSet) + this["$" + name] = value; + if (opt && opt.set) + opt.set.call(this, value); + }, + getOption: function (name) { + var opt = this.$options[name]; + if (!opt) { + return warn('misspelled option "' + name + '"'); + } + if (opt.forwardTo) + return this[opt.forwardTo] && this[opt.forwardTo].getOption(name); + return opt && opt.get ? opt.get.call(this) : this["$" + name]; + } }; +function warn(message) { + if (typeof console != "undefined" && console.warn) + console.warn.apply(console, arguments); +} +var messages; +var nlsPlaceholders; +var AppConfig = /** @class */ (function () { + function AppConfig() { + this.$defaultOptions = {}; + messages = defaultEnglishMessages; + nlsPlaceholders = "dollarSigns"; + } + AppConfig.prototype.defineOptions = function (obj, path, options) { + if (!obj.$options) + this.$defaultOptions[path] = obj.$options = {}; + Object.keys(options).forEach(function (key) { + var opt = options[key]; + if (typeof opt == "string") + opt = { forwardTo: opt }; + opt.name || (opt.name = key); + obj.$options[opt.name] = opt; + if ("initialValue" in opt) + obj["$" + opt.name] = opt.initialValue; + }); + oop.implement(obj, optionsProvider); + return this; + }; + AppConfig.prototype.resetOptions = function (obj) { + Object.keys(obj.$options).forEach(function (key) { + var opt = obj.$options[key]; + if ("value" in opt) + obj.setOption(key, opt.value); + }); + }; + AppConfig.prototype.setDefaultValue = function (path, name, value) { + if (!path) { + for (path in this.$defaultOptions) + if (this.$defaultOptions[path][name]) + break; + if (!this.$defaultOptions[path][name]) + return false; + } + var opts = this.$defaultOptions[path] || (this.$defaultOptions[path] = {}); + if (opts[name]) { + if (opts.forwardTo) + this.setDefaultValue(opts.forwardTo, name, value); + else + opts[name].value = value; + } + }; + AppConfig.prototype.setDefaultValues = function (path, optionHash) { + Object.keys(optionHash).forEach(function (key) { + this.setDefaultValue(path, key, optionHash[key]); + }, this); + }; + AppConfig.prototype.setMessages = function (value, options) { + messages = value; + if (options && options.placeholders) { + nlsPlaceholders = options.placeholders; + } + }; + AppConfig.prototype.nls = function (key, defaultString, params) { + if (!messages[key]) { + warn("No message found for the key '" + key + "' in messages with id " + messages.$id + ", trying to find a translation for the default string '" + defaultString + "'."); + if (!messages[defaultString]) { + warn("No message found for the default string '" + defaultString + "' in the provided messages. Falling back to the default English message."); + } + } + var translated = messages[key] || messages[defaultString] || defaultString; + if (params) { + if (nlsPlaceholders === "dollarSigns") { + translated = translated.replace(/\$(\$|[\d]+)/g, function (_, dollarMatch) { + if (dollarMatch == "$") + return "$"; + return params[dollarMatch]; + }); + } + if (nlsPlaceholders === "curlyBrackets") { + translated = translated.replace(/\{([^\}]+)\}/g, function (_, curlyBracketMatch) { + return params[curlyBracketMatch]; + }); + } + } + return translated; + }; + return AppConfig; +}()); +AppConfig.prototype.warn = warn; +AppConfig.prototype.reportError = reportError; +oop.implement(AppConfig.prototype, EventEmitter); +exports.AppConfig = AppConfig; -var addListener = exports.addListener = function(elem, type, callback, destroyer) { - elem.addEventListener(type, callback, getListenerOptions()); - if (destroyer) - destroyer.$toDestroy.push(new EventListener(elem, type, callback)); -}; +}); -var removeListener = exports.removeListener = function(elem, type, callback) { - elem.removeEventListener(type, callback, getListenerOptions()); -}; -exports.stopEvent = function(e) { - exports.stopPropagation(e); - exports.preventDefault(e); - return false; -}; +define("ace/theme/textmate-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tm .ace_gutter {\n background: #f0f0f0;\n color: #333;\n}\n\n.ace-tm .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-tm .ace_fold {\n background-color: #6B72E6;\n}\n\n.ace-tm {\n background-color: #FFFFFF;\n color: black;\n}\n\n.ace-tm .ace_cursor {\n color: black;\n}\n \n.ace-tm .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-tm .ace_storage,\n.ace-tm .ace_keyword {\n color: blue;\n}\n\n.ace-tm .ace_constant {\n color: rgb(197, 6, 11);\n}\n\n.ace-tm .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-tm .ace_constant.ace_language {\n color: rgb(88, 92, 246);\n}\n\n.ace-tm .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-tm .ace_invalid {\n background-color: rgba(255, 0, 0, 0.1);\n color: red;\n}\n\n.ace-tm .ace_support.ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-tm .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-tm .ace_support.ace_type,\n.ace-tm .ace_support.ace_class {\n color: rgb(109, 121, 222);\n}\n\n.ace-tm .ace_keyword.ace_operator {\n color: rgb(104, 118, 135);\n}\n\n.ace-tm .ace_string {\n color: rgb(3, 106, 7);\n}\n\n.ace-tm .ace_comment {\n color: rgb(76, 136, 107);\n}\n\n.ace-tm .ace_comment.ace_doc {\n color: rgb(0, 102, 255);\n}\n\n.ace-tm .ace_comment.ace_doc.ace_tag {\n color: rgb(128, 159, 191);\n}\n\n.ace-tm .ace_constant.ace_numeric {\n color: rgb(0, 0, 205);\n}\n\n.ace-tm .ace_variable {\n color: rgb(49, 132, 149);\n}\n\n.ace-tm .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-tm .ace_entity.ace_name.ace_function {\n color: #0000A2;\n}\n\n\n.ace-tm .ace_heading {\n color: rgb(12, 7, 255);\n}\n\n.ace-tm .ace_list {\n color:rgb(185, 6, 144);\n}\n\n.ace-tm .ace_meta.ace_tag {\n color:rgb(0, 22, 142);\n}\n\n.ace-tm .ace_string.ace_regex {\n color: rgb(255, 0, 0)\n}\n\n.ace-tm .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n.ace-tm.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px white;\n}\n.ace-tm .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-tm .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-tm .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-tm .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.07);\n}\n\n.ace-tm .ace_gutter-active-line {\n background-color : #dcdcdc;\n}\n\n.ace-tm .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-tm .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-tm .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n}\n"; -exports.stopPropagation = function(e) { - if (e.stopPropagation) - e.stopPropagation(); -}; +}); -exports.preventDefault = function(e) { - if (e.preventDefault) - e.preventDefault(); -}; -exports.getButton = function(e) { - if (e.type == "dblclick") - return 0; - if (e.type == "contextmenu" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey))) - return 2; - return e.button; -}; +define("ace/theme/textmate",["require","exports","module","ace/theme/textmate-css","ace/lib/dom"], function(require, exports, module){"use strict"; +exports.isDark = false; +exports.cssClass = "ace-tm"; +exports.cssText = require("./textmate-css"); +exports.$id = "ace/theme/textmate"; +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); -exports.capture = function(el, eventHandler, releaseCaptureHandler) { - var ownerDocument = el && el.ownerDocument || document; - function onMouseUp(e) { - eventHandler && eventHandler(e); - releaseCaptureHandler && releaseCaptureHandler(e); +}); - removeListener(ownerDocument, "mousemove", eventHandler); - removeListener(ownerDocument, "mouseup", onMouseUp); - removeListener(ownerDocument, "dragstart", onMouseUp); +define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/net","ace/lib/dom","ace/lib/app_config","ace/theme/textmate"], function(require, exports, module){"no use strict"; +var lang = require("./lib/lang"); +var net = require("./lib/net"); +var dom = require("./lib/dom"); +var AppConfig = require("./lib/app_config").AppConfig; +module.exports = exports = new AppConfig(); +var options = { + packaged: false, + workerPath: null, + modePath: null, + themePath: null, + basePath: "", + suffix: ".js", + $moduleUrls: {}, + loadWorkerFromBlob: true, + sharedPopups: false, + useStrictCSP: null +}; +exports.get = function (key) { + if (!options.hasOwnProperty(key)) + throw new Error("Unknown config key: " + key); + return options[key]; +}; +exports.set = function (key, value) { + if (options.hasOwnProperty(key)) + options[key] = value; + else if (this.setDefaultValue("", key, value) == false) + throw new Error("Unknown config key: " + key); + if (key == "useStrictCSP") + dom.useStrictCSP(value); +}; +exports.all = function () { + return lang.copyObject(options); +}; +exports.$modes = {}; +exports.moduleUrl = function (name, component) { + if (options.$moduleUrls[name]) + return options.$moduleUrls[name]; + var parts = name.split("/"); + component = component || parts[parts.length - 2] || ""; + var sep = component == "snippets" ? "/" : "-"; + var base = parts[parts.length - 1]; + if (component == "worker" && sep == "-") { + var re = new RegExp("^" + component + "[\\-_]|[\\-_]" + component + "$", "g"); + base = base.replace(re, ""); } - - addListener(ownerDocument, "mousemove", eventHandler); - addListener(ownerDocument, "mouseup", onMouseUp); - addListener(ownerDocument, "dragstart", onMouseUp); - - return onMouseUp; + if ((!base || base == component) && parts.length > 1) + base = parts[parts.length - 2]; + var path = options[component + "Path"]; + if (path == null) { + path = options.basePath; + } + else if (sep == "/") { + component = sep = ""; + } + if (path && path.slice(-1) != "/") + path += "/"; + return path + component + sep + base + this.get("suffix"); }; - -exports.addMouseWheelListener = function(el, callback, destroyer) { - addListener(el, "wheel", function(e) { - var factor = 0.15; - var deltaX = e.deltaX || 0; - var deltaY = e.deltaY || 0; - switch (e.deltaMode) { - case e.DOM_DELTA_PIXEL: - e.wheelX = deltaX * factor; - e.wheelY = deltaY * factor; - break; - case e.DOM_DELTA_LINE: - var linePixels = 15; - e.wheelX = deltaX * linePixels; - e.wheelY = deltaY * linePixels; - break; - case e.DOM_DELTA_PAGE: - var pagePixels = 150; - e.wheelX = deltaX * pagePixels; - e.wheelY = deltaY * pagePixels; - break; - } - callback(e); - }, destroyer); +exports.setModuleUrl = function (name, subst) { + return options.$moduleUrls[name] = subst; }; - -exports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName, destroyer) { - var clicks = 0; - var startX, startY, timer; - var eventNames = { - 2: "dblclick", - 3: "tripleclick", - 4: "quadclick" +var loader = function (moduleName, cb) { + if (moduleName === "ace/theme/textmate" || moduleName === "./theme/textmate") + return cb(null, require("./theme/textmate")); + if (customLoader) + return customLoader(moduleName, cb); + console.error("loader is not configured"); +}; +var customLoader; +exports.setLoader = function (cb) { + customLoader = cb; +}; +exports.dynamicModules = Object.create(null); +exports.$loading = {}; +exports.$loaded = {}; +exports.loadModule = function (moduleId, onLoad) { + var loadedModule; + if (Array.isArray(moduleId)) { + var moduleType = moduleId[0]; + var moduleName = moduleId[1]; + } + else if (typeof moduleId == "string") { + var moduleName = moduleId; + } + var load = function (module) { + if (module && !exports.$loading[moduleName]) + return onLoad && onLoad(module); + if (!exports.$loading[moduleName]) + exports.$loading[moduleName] = []; + exports.$loading[moduleName].push(onLoad); + if (exports.$loading[moduleName].length > 1) + return; + var afterLoad = function () { + loader(moduleName, function (err, module) { + if (module) + exports.$loaded[moduleName] = module; + exports._emit("load.module", { name: moduleName, module: module }); + var listeners = exports.$loading[moduleName]; + exports.$loading[moduleName] = null; + listeners.forEach(function (onLoad) { + onLoad && onLoad(module); + }); + }); + }; + if (!exports.get("packaged")) + return afterLoad(); + net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); + reportErrorIfPathIsNotConfigured(); }; - - function onMousedown(e) { - if (exports.getButton(e) !== 0) { - clicks = 0; - } else if (e.detail > 1) { - clicks++; - if (clicks > 4) - clicks = 1; - } else { - clicks = 1; - } - if (useragent.isIE) { - var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; - if (!timer || isNewClick) - clicks = 1; - if (timer) - clearTimeout(timer); - timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600); - - if (clicks == 1) { - startX = e.clientX; - startY = e.clientY; + if (exports.dynamicModules[moduleName]) { + exports.dynamicModules[moduleName]().then(function (module) { + if (module.default) { + load(module.default); + } + else { + load(module); } + }); + } + else { + try { + loadedModule = this.$require(moduleName); } - - e._clicks = clicks; + catch (e) { } + load(loadedModule || exports.$loaded[moduleName]); + } +}; +exports.$require = function (moduleName) { + if (typeof module["require"] == "function") { + var req = "require"; + return module[req](moduleName); + } +}; +exports.setModuleLoader = function (moduleName, onLoad) { + exports.dynamicModules[moduleName] = onLoad; +}; +var reportErrorIfPathIsNotConfigured = function () { + if (!options.basePath && !options.workerPath + && !options.modePath && !options.themePath + && !Object.keys(options.$moduleUrls).length) { + console.error("Unable to infer path to ace from script src,", "use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes", "or with webpack use ace/webpack-resolver"); + reportErrorIfPathIsNotConfigured = function () { }; + } +}; +exports.version = "1.44.0"; - eventHandler[callbackName]("mousedown", e); +}); - if (clicks > 4) - clicks = 0; - else if (clicks > 1) - return eventHandler[callbackName](eventNames[clicks], e); - } - if (!Array.isArray(elements)) - elements = [elements]; - elements.forEach(function(el) { - addListener(el, "mousedown", onMousedown, destroyer); +define("ace/loader_build",["require","exports","module","ace/lib/fixoldbrowsers","ace/config"], function(require, exports, module) { +"use strict"; + +require("./lib/fixoldbrowsers"); +var config = require("./config"); +config.setLoader(function(moduleName, cb) { + require([moduleName], function(module) { + cb(null, module); }); -}; +}); -var getModifierHash = function(e) { - return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0); -}; +var global = (function() { + return this || typeof window != "undefined" && window; +})(); -exports.getModifierString = function(e) { - return keys.KEY_MODS[getModifierHash(e)]; -}; +module.exports = function(ace) { + config.init = init; + config.$require = require; + ace.require = require; -function normalizeCommandKeys(callback, e, keyCode) { - var hashId = getModifierHash(e); + if (typeof define === "function") + ace.define = define; +}; +init(true);function init(packaged) { - if (!useragent.isMac && pressedKeys) { - if (e.getModifierState && (e.getModifierState("OS") || e.getModifierState("Win"))) - hashId |= 8; - if (pressedKeys.altGr) { - if ((3 & hashId) != 3) - pressedKeys.altGr = 0; - else - return; - } - if (keyCode === 18 || keyCode === 17) { - var location = "location" in e ? e.location : e.keyLocation; - if (keyCode === 17 && location === 1) { - if (pressedKeys[keyCode] == 1) - ts = e.timeStamp; - } else if (keyCode === 18 && hashId === 3 && location === 2) { - var dt = e.timeStamp - ts; - if (dt < 50) - pressedKeys.altGr = true; - } - } - } - - if (keyCode in keys.MODIFIER_KEYS) { - keyCode = -1; - } + if (!global || !global.document) + return; - if (!hashId && keyCode === 13) { - var location = "location" in e ? e.location : e.keyLocation; - if (location === 3) { - callback(e, hashId, -keyCode); - if (e.defaultPrevented) - return; - } - } + config.set("packaged", packaged || require.packaged || module.packaged || (global.define && define.packaged)); + + var scriptOptions = {}; + var scriptUrl = ""; + var currentScript = (document.currentScript || document._currentScript ); // native or polyfill + var currentDocument = currentScript && currentScript.ownerDocument || document; - if (useragent.isChromeOS && hashId & 8) { - callback(e, hashId, keyCode); - if (e.defaultPrevented) - return; - else - hashId &= ~8; - } - if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) { - return false; + if (currentScript && currentScript.src) { + scriptUrl = currentScript.src.split(/[?#]/)[0].split("/").slice(0, -1).join("/") || ""; } - return callback(e, hashId, keyCode); -} - - -exports.addCommandKeyListener = function(el, callback, destroyer) { - if (useragent.isOldGecko || (useragent.isOpera && !("KeyboardEvent" in window))) { - var lastKeyDownKeyCode = null; - addListener(el, "keydown", function(e) { - lastKeyDownKeyCode = e.keyCode; - }, destroyer); - addListener(el, "keypress", function(e) { - return normalizeCommandKeys(callback, e, lastKeyDownKeyCode); - }, destroyer); - } else { - var lastDefaultPrevented = null; + var scripts = currentDocument.getElementsByTagName("script"); + for (var i=0; i [" + this.end.row + "/" + this.end.column + "]"); }; - - this.contains = function(row, column) { + Range.prototype.contains = function (row, column) { return this.compare(row, column) == 0; }; - this.compareRange = function(range) { - var cmp, - end = range.end, - start = range.start; - + Range.prototype.compareRange = function (range) { + var cmp, end = range.end, start = range.start; cmp = this.compare(end.row, end.column); if (cmp == 1) { cmp = this.compare(start.row, start.column); if (cmp == 1) { return 2; - } else if (cmp == 0) { + } + else if (cmp == 0) { return 1; - } else { + } + else { return 0; } - } else if (cmp == -1) { + } + else if (cmp == -1) { return -2; - } else { + } + else { cmp = this.compare(start.row, start.column); if (cmp == -1) { return -1; - } else if (cmp == 1) { + } + else if (cmp == 1) { return 42; - } else { + } + else { return 0; } } }; - this.comparePoint = function(p) { + Range.prototype.comparePoint = function (p) { return this.compare(p.row, p.column); }; - this.containsRange = function(range) { + Range.prototype.containsRange = function (range) { return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; }; - this.intersects = function(range) { + Range.prototype.intersects = function (range) { var cmp = this.compareRange(range); return (cmp == -1 || cmp == 0 || cmp == 1); }; - this.isEnd = function(row, column) { + Range.prototype.isEnd = function (row, column) { return this.end.row == row && this.end.column == column; }; - this.isStart = function(row, column) { + Range.prototype.isStart = function (row, column) { return this.start.row == row && this.start.column == column; }; - this.setStart = function(row, column) { + Range.prototype.setStart = function (row, column) { if (typeof row == "object") { this.start.column = row.column; this.start.row = row.row; - } else { + } + else { this.start.row = row; this.start.column = column; } }; - this.setEnd = function(row, column) { + Range.prototype.setEnd = function (row, column) { if (typeof row == "object") { this.end.column = row.column; this.end.row = row.row; - } else { + } + else { this.end.row = row; this.end.column = column; } }; - this.inside = function(row, column) { + Range.prototype.inside = function (row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column) || this.isStart(row, column)) { return false; - } else { + } + else { return true; } } return false; }; - this.insideStart = function(row, column) { + Range.prototype.insideStart = function (row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column)) { return false; - } else { + } + else { return true; } } return false; }; - this.insideEnd = function(row, column) { + Range.prototype.insideEnd = function (row, column) { if (this.compare(row, column) == 0) { if (this.isStart(row, column)) { return false; - } else { + } + else { return true; } } return false; }; - this.compare = function(row, column) { + Range.prototype.compare = function (row, column) { if (!this.isMultiLine()) { if (row === this.start.row) { return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); } } - if (row < this.start.row) return -1; - if (row > this.end.row) return 1; - if (this.start.row === row) return column >= this.start.column ? 0 : -1; - if (this.end.row === row) return column <= this.end.column ? 0 : 1; - return 0; }; - this.compareStart = function(row, column) { + Range.prototype.compareStart = function (row, column) { if (this.start.row == row && this.start.column == column) { return -1; - } else { + } + else { return this.compare(row, column); } }; - this.compareEnd = function(row, column) { + Range.prototype.compareEnd = function (row, column) { if (this.end.row == row && this.end.column == column) { return 1; - } else { + } + else { return this.compare(row, column); } }; - this.compareInside = function(row, column) { + Range.prototype.compareInside = function (row, column) { if (this.end.row == row && this.end.column == column) { return 1; - } else if (this.start.row == row && this.start.column == column) { + } + else if (this.start.row == row && this.start.column == column) { return -1; - } else { + } + else { return this.compare(row, column); } }; - this.clipRows = function(firstRow, lastRow) { + Range.prototype.clipRows = function (firstRow, lastRow) { if (this.end.row > lastRow) - var end = {row: lastRow + 1, column: 0}; + var end = { row: lastRow + 1, column: 0 }; else if (this.end.row < firstRow) - var end = {row: firstRow, column: 0}; - + var end = { row: firstRow, column: 0 }; if (this.start.row > lastRow) - var start = {row: lastRow + 1, column: 0}; + var start = { row: lastRow + 1, column: 0 }; else if (this.start.row < firstRow) - var start = {row: firstRow, column: 0}; - + var start = { row: firstRow, column: 0 }; return Range.fromPoints(start || this.start, end || this.end); }; - this.extend = function(row, column) { + Range.prototype.extend = function (row, column) { var cmp = this.compare(row, column); - if (cmp == 0) return this; else if (cmp == -1) - var start = {row: row, column: column}; + var start = { row: row, column: column }; else - var end = {row: row, column: column}; - + var end = { row: row, column: column }; return Range.fromPoints(start || this.start, end || this.end); }; - - this.isEmpty = function() { + Range.prototype.isEmpty = function () { return (this.start.row === this.end.row && this.start.column === this.end.column); }; - this.isMultiLine = function() { + Range.prototype.isMultiLine = function () { return (this.start.row !== this.end.row); }; - this.clone = function() { + Range.prototype.clone = function () { return Range.fromPoints(this.start, this.end); }; - this.collapseRows = function() { + Range.prototype.collapseRows = function () { if (this.end.column == 0) - return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0); + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row - 1), 0); else return new Range(this.start.row, 0, this.end.row, 0); }; - this.toScreenRange = function(session) { + Range.prototype.toScreenRange = function (session) { var screenPosStart = session.documentToScreenPosition(this.start); var screenPosEnd = session.documentToScreenPosition(this.end); - - return new Range( - screenPosStart.row, screenPosStart.column, - screenPosEnd.row, screenPosEnd.column - ); + return new Range(screenPosStart.row, screenPosStart.column, screenPosEnd.row, screenPosEnd.column); }; - this.moveBy = function(row, column) { + Range.prototype.moveBy = function (row, column) { this.start.row += row; this.start.column += column; this.end.row += row; this.end.column += column; }; - -}).call(Range.prototype); -Range.fromPoints = function(start, end) { + return Range; +}()); +Range.fromPoints = function (start, end) { return new Range(start.row, start.column, end.row, end.column); }; -Range.comparePoints = comparePoints; - -Range.comparePoints = function(p1, p2) { +Range.comparePoints = function (p1, p2) { return p1.row - p2.row || p1.column - p2.column; }; - - exports.Range = Range; -}); - -define("ace/lib/lang",["require","exports","module"], function(require, exports, module) { -"use strict"; - -exports.last = function(a) { - return a[a.length - 1]; -}; - -exports.stringReverse = function(string) { - return string.split("").reverse().join(""); -}; -exports.stringRepeat = function (string, count) { - var result = ''; - while (count > 0) { - if (count & 1) - result += string; +}); - if (count >>= 1) - string += string; +define("ace/lib/keys",["require","exports","module","ace/lib/oop"], function(require, exports, module){"use strict"; +var oop = require("./oop"); +var Keys = { + MODIFIER_KEYS: { + 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta', + 91: 'MetaLeft', 92: 'MetaRight', 93: 'ContextMenu' + }, + KEY_MODS: { + "ctrl": 1, "alt": 2, "option": 2, "shift": 4, + "super": 8, "meta": 8, "command": 8, "cmd": 8, + "control": 1 + }, + FUNCTION_KEYS: { + 8: "Backspace", + 9: "Tab", + 13: "Return", + 19: "Pause", + 27: "Esc", + 32: "Space", + 33: "PageUp", + 34: "PageDown", + 35: "End", + 36: "Home", + 37: "Left", + 38: "Up", + 39: "Right", + 40: "Down", + 44: "Print", + 45: "Insert", + 46: "Delete", + '-13': "NumpadEnter", + 144: "Numlock", + 145: "Scrolllock" + }, + PRINTABLE_KEYS: { + 32: ' ', 59: ';', 61: '=', 107: '+', 109: '-', 110: '.', + 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', + 219: '[', 220: '\\', 221: ']', 222: "'", 111: '/', 106: '*' } - return result; -}; - -var trimBeginRegexp = /^\s\s*/; -var trimEndRegexp = /\s\s*$/; - -exports.stringTrimLeft = function (string) { - return string.replace(trimBeginRegexp, ''); }; - -exports.stringTrimRight = function (string) { - return string.replace(trimEndRegexp, ''); +var codeToKeyCode = { + Command: 224, + Backspace: 8, + Tab: 9, + Return: 13, + Enter: 13, + Pause: 19, + Escape: 27, + PageUp: 33, + PageDown: 34, + End: 35, + Home: 36, + Insert: 45, + Delete: 46, + ArrowLeft: 37, + ArrowUp: 38, + ArrowRight: 39, + ArrowDown: 40, + Backquote: 192, + Minus: 189, + Equal: 187, + BracketLeft: 219, + Backslash: 220, + BracketRight: 221, + Semicolon: 186, + Quote: 222, + Comma: 188, + Period: 190, + Slash: 191, + Space: 32, + NumpadAdd: 107, + NumpadDecimal: 110, + NumpadSubtract: 109, + NumpadDivide: 111, + NumpadMultiply: 106 }; - -exports.copyObject = function(obj) { - var copy = {}; - for (var key in obj) { - copy[key] = obj[key]; - } - return copy; +for (var i = 0; i < 10; i++) { + codeToKeyCode["Digit" + i] = 48 + i; + codeToKeyCode["Numpad" + i] = 96 + i; + Keys.PRINTABLE_KEYS[48 + i] = "" + i; + Keys.FUNCTION_KEYS[96 + i] = "Numpad" + i; +} +for (var i = 65; i < 91; i++) { + var chr = String.fromCharCode(i + 32); + codeToKeyCode["Key" + chr.toUpperCase()] = i; + Keys.PRINTABLE_KEYS[i] = chr; +} +for (var i = 1; i < 13; i++) { + codeToKeyCode["F" + i] = 111 + i; + Keys.FUNCTION_KEYS[111 + i] = "F" + i; +} +var modifiers = { + Shift: 16, + Control: 17, + Alt: 18, + Meta: 224 }; - -exports.copyArray = function(array){ - var copy = []; - for (var i=0, l=array.length; i 1) { + clicks++; + if (clicks > 4) + clicks = 1; + } + else { + clicks = 1; + } + if (useragent.isIE) { + var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; + if (!timer || isNewClick) + clicks = 1; + if (timer) + clearTimeout(timer); + timer = setTimeout(function () { timer = null; }, timeouts[clicks - 1] || 600); + if (clicks == 1) { + startX = e.clientX; + startY = e.clientY; + } + } + e._clicks = clicks; + eventHandler[callbackName]("mousedown", e); + if (clicks > 4) + clicks = 0; + else if (clicks > 1) + return eventHandler[callbackName](eventNames[clicks], e); + } + if (!Array.isArray(elements)) + elements = [elements]; + elements.forEach(function (el) { + addListener(el, "mousedown", onMousedown, destroyer); + }); +}; +function getModifierHash(e) { + return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0); +} +exports.getModifierString = function (e) { + return keys.KEY_MODS[getModifierHash(e)]; +}; +function normalizeCommandKeys(callback, e, keyCode) { + var hashId = getModifierHash(e); + if (!keyCode && e.code) { + keyCode = keys.$codeToKeyCode[e.code] || keyCode; + } + if (!useragent.isMac && pressedKeys) { + if (e.getModifierState && (e.getModifierState("OS") || e.getModifierState("Win"))) + hashId |= 8; + if (pressedKeys.altGr) { + if ((3 & hashId) != 3) + pressedKeys.altGr = 0; + else + return; + } + if (keyCode === 18 || keyCode === 17) { + var location = e.location; + if (keyCode === 17 && location === 1) { + if (pressedKeys[keyCode] == 1) + ts = e.timeStamp; + } + else if (keyCode === 18 && hashId === 3 && location === 2) { + var dt = e.timeStamp - ts; + if (dt < 50) + pressedKeys.altGr = true; + } + } + } + if (keyCode in keys.MODIFIER_KEYS) { + keyCode = -1; + } + if (!hashId && keyCode === 13) { + if (e.location === 3) { + callback(e, hashId, -keyCode); + if (e.defaultPrevented) + return; + } + } + if (useragent.isChromeOS && hashId & 8) { + callback(e, hashId, keyCode); + if (e.defaultPrevented) + return; + else + hashId &= ~8; + } + if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) { + return false; + } + return callback(e, hashId, keyCode); +} +exports.addCommandKeyListener = function (el, callback, destroyer) { + var lastDefaultPrevented = null; + addListener(el, "keydown", function (e) { + pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1; + var result = normalizeCommandKeys(callback, e, e.keyCode); + lastDefaultPrevented = e.defaultPrevented; + return result; + }, destroyer); + addListener(el, "keypress", function (e) { + if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) { + exports.stopEvent(e); + lastDefaultPrevented = null; + } + }, destroyer); + addListener(el, "keyup", function (e) { + pressedKeys[e.keyCode] = null; + }, destroyer); + if (!pressedKeys) { + resetPressedKeys(); + addListener(window, "focus", resetPressedKeys); + } +}; +function resetPressedKeys() { + pressedKeys = Object.create(null); +} +if (typeof window == "object" && window.postMessage && !useragent.isOldIE) { + var postMessageId = 1; + exports.nextTick = function (callback, win) { + win = win || window; + var messageName = "zero-timeout-message-" + (postMessageId++); + var listener = function (e) { + if (e.data == messageName) { + exports.stopPropagation(e); + removeListener(win, "message", listener); + callback(); + } + }; + addListener(win, "message", listener); + win.postMessage(messageName, "*"); }; - - _self.isPending = function() { - return timer; +} +exports.$idleBlocked = false; +exports.onIdle = function (cb, timeout) { + return setTimeout(function handler() { + if (!exports.$idleBlocked) { + cb(); + } + else { + setTimeout(handler, 100); + } + }, timeout); +}; +exports.$idleBlockId = null; +exports.blockIdle = function (delay) { + if (exports.$idleBlockId) + clearTimeout(exports.$idleBlockId); + exports.$idleBlocked = true; + exports.$idleBlockId = setTimeout(function () { + exports.$idleBlocked = false; + }, delay || 100); +}; +exports.nextFrame = typeof window == "object" && (window.requestAnimationFrame + || window["mozRequestAnimationFrame"] + || window["webkitRequestAnimationFrame"] + || window["msRequestAnimationFrame"] + || window["oRequestAnimationFrame"]); +if (exports.nextFrame) + exports.nextFrame = exports.nextFrame.bind(window); +else + exports.nextFrame = function (callback) { + setTimeout(callback, 17); }; - return _self; -}; }); -define("ace/clipboard",["require","exports","module"], function(require, exports, module) { -"use strict"; - +define("ace/clipboard",["require","exports","module"], function(require, exports, module){"use strict"; var $cancelT; -module.exports = { +module.exports = { lineMode: false, - pasteCancelled: function() { + pasteCancelled: function () { if ($cancelT && $cancelT > Date.now() - 50) return true; return $cancelT = false; }, - cancel: function() { + cancel: function () { $cancelT = Date.now(); } }; }); -define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/clipboard","ace/lib/keys"], function(require, exports, module) { -"use strict"; - +define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/config","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/clipboard","ace/lib/keys"], function(require, exports, module){"use strict"; var event = require("../lib/event"); +var nls = require("../config").nls; var useragent = require("../lib/useragent"); var dom = require("../lib/dom"); var lang = require("../lib/lang"); var clipboard = require("../clipboard"); var BROKEN_SETDATA = useragent.isChrome < 18; -var USE_IE_MIME_TYPE = useragent.isIE; +var USE_IE_MIME_TYPE = useragent.isIE; var HAS_FOCUS_ARGS = useragent.isChrome > 63; var MAX_LINE_LENGTH = 400; - var KEYS = require("../lib/keys"); var MODS = KEYS.KEY_MODS; var isIOS = useragent.isIOS; var valueResetRegex = isIOS ? /\s/ : /\n/; var isMobile = useragent.isMobile; - -var TextInput = function(parentNode, host) { - var text = dom.createElement("textarea"); - text.className = "ace_text-input"; - - text.setAttribute("wrap", "off"); - text.setAttribute("autocorrect", "off"); - text.setAttribute("autocapitalize", "off"); - text.setAttribute("spellcheck", false); - - text.style.opacity = "0"; - parentNode.insertBefore(text, parentNode.firstChild); - - var copied = false; - var pasted = false; - var inComposition = false; - var sendingText = false; - var tempStyle = ''; - - if (!isMobile) - text.style.fontSize = "1px"; - - var commandMode = false; - var ignoreFocusEvents = false; - - var lastValue = ""; - var lastSelectionStart = 0; - var lastSelectionEnd = 0; - var lastRestoreEnd = 0; - try { var isFocused = document.activeElement === text; } catch(e) {} - - event.addListener(text, "blur", function(e) { - if (ignoreFocusEvents) return; - host.onBlur(e); - isFocused = false; - }, host); - event.addListener(text, "focus", function(e) { - if (ignoreFocusEvents) return; - isFocused = true; - if (useragent.isEdge) { - try { - if (!document.hasFocus()) - return; - } catch(e) {} - } - host.onFocus(e); - if (useragent.isEdge) - setTimeout(resetSelection); - else - resetSelection(); - }, host); - this.$focusScroll = false; - this.focus = function() { - if (tempStyle || HAS_FOCUS_ARGS || this.$focusScroll == "browser") - return text.focus({ preventScroll: true }); - - var top = text.style.top; - text.style.position = "fixed"; - text.style.top = "0px"; +var TextInput = /** @class */ (function () { + function TextInput(parentNode, host) { + var _this = this; + this.host = host; + this.text = dom.createElement("textarea"); + this.text.className = "ace_text-input"; + this.text.setAttribute("wrap", "off"); + this.text.setAttribute("autocomplete", "off"); + this.text.setAttribute("autocorrect", "off"); + this.text.setAttribute("autocapitalize", "off"); + this.text.setAttribute("spellcheck", "false"); + this.text.style.opacity = "0"; + parentNode.insertBefore(this.text, parentNode.firstChild); this.copied = false; + this.pasted = false; + this.inComposition = false; + this.sendingText = false; + this.tempStyle = ''; + if (!isMobile) + this.text.style.fontSize = "1px"; + this.commandMode = false; + this.ignoreFocusEvents = false; + this.lastValue = ""; + this.lastSelectionStart = 0; + this.lastSelectionEnd = 0; + this.lastRestoreEnd = 0; + this.rowStart = Number.MAX_SAFE_INTEGER; + this.rowEnd = Number.MIN_SAFE_INTEGER; + this.numberOfExtraLines = 0; try { - var isTransformed = text.getBoundingClientRect().top != 0; - } catch(e) { - return; - } - var ancestors = []; - if (isTransformed) { - var t = text.parentElement; - while (t && t.nodeType == 1) { - ancestors.push(t); - t.setAttribute("ace_nocontext", true); - if (!t.parentElement && t.getRootNode) - t = t.getRootNode().host; - else - t = t.parentElement; - } - } - text.focus({ preventScroll: true }); - if (isTransformed) { - ancestors.forEach(function(p) { - p.removeAttribute("ace_nocontext"); - }); - } - setTimeout(function() { - text.style.position = ""; - if (text.style.top == "0px") - text.style.top = top; - }, 0); - }; - this.blur = function() { - text.blur(); - }; - this.isFocused = function() { - return isFocused; - }; - - host.on("beforeEndOperation", function() { - var curOp = host.curOp; - var commandName = curOp && curOp.command && curOp.command.name; - if (commandName == "insertstring") - return; - var isUserAction = commandName && (curOp.docChanged || curOp.selectionChanged); - if (inComposition && isUserAction) { - lastValue = text.value = ""; - onCompositionEnd(); + this.$isFocused = document.activeElement === this.text; } - resetSelection(); - }); - - var resetSelection = isIOS - ? function(value) { - if (!isFocused || (copied && !value) || sendingText) return; - if (!value) - value = ""; - var newValue = "\n ab" + value + "cde fg\n"; - if (newValue != text.value) - text.value = lastValue = newValue; - - var selectionStart = 4; - var selectionEnd = 4 + (value.length || (host.selection.isEmpty() ? 0 : 1)); - - if (lastSelectionStart != selectionStart || lastSelectionEnd != selectionEnd) { - text.setSelectionRange(selectionStart, selectionEnd); + catch (e) { } - lastSelectionStart = selectionStart; - lastSelectionEnd = selectionEnd; - } - : function() { - if (inComposition || sendingText) - return; - if (!isFocused && !afterContextMenu) - return; - inComposition = true; - - var selectionStart = 0; - var selectionEnd = 0; - var line = ""; - - if (host.session) { - var selection = host.selection; - var range = selection.getRange(); - var row = selection.cursor.row; - selectionStart = range.start.column; - selectionEnd = range.end.column; - line = host.session.getLine(row); - - if (range.start.row != row) { - var prevLine = host.session.getLine(row - 1); - selectionStart = range.start.row < row - 1 ? 0 : selectionStart; - selectionEnd += prevLine.length + 1; - line = prevLine + "\n" + line; + this.cancelComposition = this.cancelComposition.bind(this); + this.setAriaOptions({ role: "textbox" }); + event.addListener(this.text, "blur", function (e) { + if (_this.ignoreFocusEvents) + return; + host.onBlur(e); + _this.$isFocused = false; + }, host); + event.addListener(this.text, "focus", function (e) { + if (_this.ignoreFocusEvents) + return; + _this.$isFocused = true; + if (useragent.isEdge) { + try { + if (!document.hasFocus()) + return; + } + catch (e) { + } } - else if (range.end.row != row) { - var nextLine = host.session.getLine(row + 1); - selectionEnd = range.end.row > row + 1 ? nextLine.length : selectionEnd; - selectionEnd += line.length + 1; - line = line + "\n" + nextLine; + host.onFocus(e); + if (useragent.isEdge) + setTimeout(_this.resetSelection.bind(_this)); + else + _this.resetSelection(); + }, host); this.$focusScroll = false; + host.on("beforeEndOperation", function () { + var curOp = host.curOp; + var commandName = curOp && curOp.command && curOp.command.name; + if (commandName == "insertstring") + return; + var isUserAction = commandName && (curOp.docChanged || curOp.selectionChanged); + if (_this.inComposition && isUserAction) { + _this.lastValue = _this.text.value = ""; + _this.onCompositionEnd(); } - else if (isMobile && row > 0) { - line = "\n" + line; - selectionEnd += 1; - selectionStart += 1; + _this.resetSelection(); + }); + host.on("changeSelection", this.setAriaLabel.bind(this)); + this.resetSelection = isIOS ? this.$resetSelectionIOS : this.$resetSelection; + if (this.$isFocused) + host.onFocus(); + this.inputHandler = null; + this.afterContextMenu = false; + event.addCommandKeyListener(this.text, function (e, hashId, keyCode) { + if (_this.inComposition) + return; + return host.onCommandKey(e, hashId, keyCode); + }, host); + event.addListener(this.text, "select", this.onSelect.bind(this), host); + event.addListener(this.text, "input", this.onInput.bind(this), host); + event.addListener(this.text, "cut", this.onCut.bind(this), host); + event.addListener(this.text, "copy", this.onCopy.bind(this), host); + event.addListener(this.text, "paste", this.onPaste.bind(this), host); + if (!('oncut' in this.text) || !('oncopy' in this.text) || !('onpaste' in this.text)) { + event.addListener(parentNode, "keydown", function (e) { + if ((useragent.isMac && !e.metaKey) || !e.ctrlKey) + return; + switch (e.keyCode) { + case 67: + _this.onCopy(e); + break; + case 86: + _this.onPaste(e); + break; + case 88: + _this.onCut(e); + break; + } + }, host); + } + this.syncComposition = lang.delayedCall(this.onCompositionUpdate.bind(this), 50).schedule.bind(null, null); //TODO: check this + event.addListener(this.text, "compositionstart", this.onCompositionStart.bind(this), host); + event.addListener(this.text, "compositionupdate", this.onCompositionUpdate.bind(this), host); + event.addListener(this.text, "keyup", this.onKeyup.bind(this), host); + event.addListener(this.text, "keydown", this.syncComposition.bind(this), host); + event.addListener(this.text, "compositionend", this.onCompositionEnd.bind(this), host); + this.closeTimeout; + event.addListener(this.text, "mouseup", this.$onContextMenu.bind(this), host); + event.addListener(this.text, "mousedown", function (e) { + e.preventDefault(); + _this.onContextMenuClose(); + }, host); + event.addListener(host.renderer.scroller, "contextmenu", this.$onContextMenu.bind(this), host); + event.addListener(this.text, "contextmenu", this.$onContextMenu.bind(this), host); + if (isIOS) + this.addIosSelectionHandler(parentNode, host, this.text); + } + TextInput.prototype.addIosSelectionHandler = function (parentNode, host, text) { + var _this = this; + var typingResetTimeout = null; + var typing = false; + text.addEventListener("keydown", function (e) { + if (typingResetTimeout) + clearTimeout(typingResetTimeout); + typing = true; + }, true); + text.addEventListener("keyup", function (e) { + typingResetTimeout = setTimeout(function () { + typing = false; + }, 100); + }, true); + var detectArrowKeys = function (e) { + if (document.activeElement !== text) + return; + if (typing || _this.inComposition || host.$mouseHandler.isMousePressed) + return; + if (_this.copied) { + return; } - - if (line.length > MAX_LINE_LENGTH) { - if (selectionStart < MAX_LINE_LENGTH && selectionEnd < MAX_LINE_LENGTH) { - line = line.slice(0, MAX_LINE_LENGTH); - } else { - line = "\n"; - if (selectionStart == selectionEnd) { - selectionStart = selectionEnd = 0; - } - else { - selectionStart = 0; - selectionEnd = 1; - } + var selectionStart = text.selectionStart; + var selectionEnd = text.selectionEnd; + var key = null; + var modifier = 0; + if (selectionStart == 0) { + key = KEYS.up; + } + else if (selectionStart == 1) { + key = KEYS.home; + } + else if (selectionEnd > _this.lastSelectionEnd && _this.lastValue[selectionEnd] == "\n") { + key = KEYS.end; + } + else if (selectionStart < _this.lastSelectionStart && _this.lastValue[selectionStart - 1] == " ") { + key = KEYS.left; + modifier = MODS.option; + } + else if (selectionStart < _this.lastSelectionStart || (selectionStart == _this.lastSelectionStart + && _this.lastSelectionEnd != _this.lastSelectionStart && selectionStart == selectionEnd)) { + key = KEYS.left; + } + else if (selectionEnd > _this.lastSelectionEnd && _this.lastValue.slice(0, selectionEnd).split("\n").length > 2) { + key = KEYS.down; + } + else if (selectionEnd > _this.lastSelectionEnd && _this.lastValue[selectionEnd - 1] == " ") { + key = KEYS.right; + modifier = MODS.option; + } + else if (selectionEnd > _this.lastSelectionEnd || (selectionEnd == _this.lastSelectionEnd + && _this.lastSelectionEnd != _this.lastSelectionStart && selectionStart == selectionEnd)) { + key = KEYS.right; + } + if (selectionStart !== selectionEnd) + modifier |= MODS.shift; + if (key) { + var result = host.onCommandKey({}, modifier, key); + if (!result && host.commands) { + key = KEYS.keyCodeToString(key); + var command = host.commands.findKeyCommand(modifier, key); + if (command) + host.execCommand(command); } + _this.lastSelectionStart = selectionStart; + _this.lastSelectionEnd = selectionEnd; + _this.resetSelection(""); } + }; + document.addEventListener("selectionchange", detectArrowKeys); + host.on("destroy", function () { + document.removeEventListener("selectionchange", detectArrowKeys); + }); + }; + TextInput.prototype.onContextMenuClose = function () { + var _this = this; + clearTimeout(this.closeTimeout); + this.closeTimeout = setTimeout(function () { + if (_this.tempStyle) { + _this.text.style.cssText = _this.tempStyle; + _this.tempStyle = ''; + } + _this.host.renderer.$isMousePressed = false; + if (_this.host.renderer.$keepTextAreaAtCursor) + _this.host.renderer.$moveTextAreaToCursor(); + }, 0); + }; + TextInput.prototype.$onContextMenu = function (e) { + this.host.textInput.onContextMenu(e); + this.onContextMenuClose(); + }; + TextInput.prototype.onKeyup = function (e) { + if (e.keyCode == 27 && this.text.value.length < this.text.selectionStart) { + if (!this.inComposition) + this.lastValue = this.text.value; + this.lastSelectionStart = this.lastSelectionEnd = -1; + this.resetSelection(); } - - var newValue = line + "\n\n"; - if (newValue != lastValue) { - text.value = lastValue = newValue; - lastSelectionStart = lastSelectionEnd = newValue.length; - } - if (afterContextMenu) { - lastSelectionStart = text.selectionStart; - lastSelectionEnd = text.selectionEnd; - } - if ( - lastSelectionEnd != selectionEnd - || lastSelectionStart != selectionStart - || text.selectionEnd != lastSelectionEnd // on ie edge selectionEnd changes silently after the initialization - ) { - try { - text.setSelectionRange(selectionStart, selectionEnd); - lastSelectionStart = selectionStart; - lastSelectionEnd = selectionEnd; - } catch(e){} + this.syncComposition(); + }; + TextInput.prototype.cancelComposition = function () { + this.ignoreFocusEvents = true; + this.text.blur(); + this.text.focus(); + this.ignoreFocusEvents = false; + }; + TextInput.prototype.onCompositionStart = function (e) { + if (this.inComposition || !this.host.onCompositionStart || this.host.$readOnly) + return; + this.inComposition = {}; + if (this.commandMode) + return; + if (e.data) + this.inComposition.useTextareaForIME = false; + setTimeout(this.onCompositionUpdate.bind(this), 0); + this.host._signal("compositionStart"); + this.host.on("mousedown", this.cancelComposition); //TODO: + var range = this.host.getSelectionRange(); + range.end.row = range.start.row; + range.end.column = range.start.column; + this.inComposition.markerRange = range; + this.inComposition.selectionStart = this.lastSelectionStart; + this.host.onCompositionStart(this.inComposition); + if (this.inComposition.useTextareaForIME) { + this.lastValue = this.text.value = ""; + this.lastSelectionStart = 0; + this.lastSelectionEnd = 0; + } + else { + if (this.text.msGetInputContext) + this.inComposition.context = this.text.msGetInputContext(); + if (this.text.getInputContext) + this.inComposition.context = this.text.getInputContext(); } - inComposition = false; }; - this.resetSelection = resetSelection; - - if (isFocused) - host.onFocus(); - - - var isAllSelected = function(text) { - return text.selectionStart === 0 && text.selectionEnd >= lastValue.length - && text.value === lastValue && lastValue - && text.selectionEnd !== lastSelectionEnd; + TextInput.prototype.onCompositionUpdate = function () { + if (!this.inComposition || !this.host.onCompositionUpdate || this.host.$readOnly) + return; + if (this.commandMode) + return this.cancelComposition(); + if (this.inComposition.useTextareaForIME) { + this.host.onCompositionUpdate(this.text.value); + } + else { + var data = this.text.value; + this.sendText(data); + if (this.inComposition.markerRange) { + if (this.inComposition.context) { + this.inComposition.markerRange.start.column = this.inComposition.selectionStart = this.inComposition.context.compositionStartOffset; + } + this.inComposition.markerRange.end.column = this.inComposition.markerRange.start.column + + this.lastSelectionEnd - this.inComposition.selectionStart + this.lastRestoreEnd; + } + } }; - - var onSelect = function(e) { - if (inComposition) + TextInput.prototype.onCompositionEnd = function (e) { + if (!this.host.onCompositionEnd || this.host.$readOnly) + return; + this.inComposition = false; + this.host.onCompositionEnd(); + this.host.off("mousedown", this.cancelComposition); + if (e) + this.onInput(); + }; + TextInput.prototype.onCut = function (e) { + this.doCopy(e, true); + }; + TextInput.prototype.onCopy = function (e) { + this.doCopy(e, false); + }; + TextInput.prototype.onPaste = function (e) { + var data = this.handleClipboardData(e); + if (clipboard.pasteCancelled()) return; - if (copied) { - copied = false; - } else if (isAllSelected(text)) { - host.selectAll(); - resetSelection(); - } else if (isMobile && text.selectionStart != lastSelectionStart) { - resetSelection(); + if (typeof data == "string") { + if (data) + this.host.onPaste(data, e); + if (useragent.isIE) + setTimeout(this.resetSelection); + event.preventDefault(e); + } + else { + this.text.value = ""; + this.pasted = true; } }; - - var inputHandler = null; - this.setInputHandler = function(cb) {inputHandler = cb;}; - this.getInputHandler = function() {return inputHandler;}; - var afterContextMenu = false; - - var sendText = function(value, fromInput) { - if (afterContextMenu) - afterContextMenu = false; - if (pasted) { - resetSelection(); + TextInput.prototype.doCopy = function (e, isCut) { + var _this = this; + var data = this.host.getCopyText(); + if (!data) + return event.preventDefault(e); + if (this.handleClipboardData(e, data)) { + if (isIOS) { + this.resetSelection(data); + this.copied = data; + setTimeout(function () { + _this.copied = false; + }, 10); + } + isCut ? this.host.onCut() : this.host.onCopy(); + event.preventDefault(e); + } + else { + this.copied = true; + this.text.value = data; + this.text.select(); + setTimeout(function () { + _this.copied = false; + _this.resetSelection(); + isCut ? _this.host.onCut() : _this.host.onCopy(); + }); + } + }; + TextInput.prototype.handleClipboardData = function (e, data, forceIEMime) { + var clipboardData = e.clipboardData || window["clipboardData"]; + if (!clipboardData || BROKEN_SETDATA) + return; + var mime = USE_IE_MIME_TYPE || forceIEMime ? "Text" : "text/plain"; + try { + if (data) { + return clipboardData.setData(mime, data) !== false; + } + else { + return clipboardData.getData(mime); + } + } + catch (e) { + if (!forceIEMime) + return this.handleClipboardData(e, data, true); + } + }; + TextInput.prototype.onInput = function (e) { + if (this.inComposition) + return this.onCompositionUpdate(); + if (e && e.inputType) { + if (e.inputType == "historyUndo") + return this.host.execCommand("undo"); + if (e.inputType == "historyRedo") + return this.host.execCommand("redo"); + } + var data = this.text.value; + var inserted = this.sendText(data, true); + if (data.length > MAX_LINE_LENGTH + 100 || valueResetRegex.test(inserted) || isMobile && this.lastSelectionStart + < 1 && this.lastSelectionStart == this.lastSelectionEnd) { + this.resetSelection(); + } + }; + TextInput.prototype.sendText = function (value, fromInput) { + if (this.afterContextMenu) + this.afterContextMenu = false; + if (this.pasted) { + this.resetSelection(); if (value) - host.onPaste(value); - pasted = false; + this.host.onPaste(value); + this.pasted = false; return ""; - } else { - var selectionStart = text.selectionStart; - var selectionEnd = text.selectionEnd; - - var extendLeft = lastSelectionStart; - var extendRight = lastValue.length - lastSelectionEnd; - + } + else { + var selectionStart = this.text.selectionStart; + var selectionEnd = this.text.selectionEnd; + var extendLeft = this.lastSelectionStart; + var extendRight = this.lastValue.length - this.lastSelectionEnd; var inserted = value; var restoreStart = value.length - selectionStart; var restoreEnd = value.length - selectionEnd; - var i = 0; - while (extendLeft > 0 && lastValue[i] == value[i]) { + while (extendLeft > 0 && this.lastValue[i] == value[i]) { i++; extendLeft--; } inserted = inserted.slice(i); i = 1; - while (extendRight > 0 && lastValue.length - i > lastSelectionStart - 1 && lastValue[lastValue.length - i] == value[value.length - i]) { + while (extendRight > 0 && this.lastValue.length - i > this.lastSelectionStart - 1 + && this.lastValue[this.lastValue.length - i] == value[value.length - i]) { i++; extendRight--; } - restoreStart -= i-1; - restoreEnd -= i-1; + restoreStart -= i - 1; + restoreEnd -= i - 1; var endIndex = inserted.length - i + 1; if (endIndex < 0) { extendLeft = -endIndex; endIndex = 0; - } + } inserted = inserted.slice(0, endIndex); if (!fromInput && !inserted && !restoreStart && !extendLeft && !extendRight && !restoreEnd) return ""; - sendingText = true; + this.sendingText = true; var shouldReset = false; if (useragent.isAndroid && inserted == ". ") { inserted = " "; shouldReset = true; } - - if (inserted && !extendLeft && !extendRight && !restoreStart && !restoreEnd || commandMode) { - host.onTextInput(inserted); - } else { - host.onTextInput(inserted, { + if (inserted && !extendLeft && !extendRight && !restoreStart && !restoreEnd || this.commandMode) { + this.host.onTextInput(inserted); + } + else { + this.host.onTextInput(inserted, { extendLeft: extendLeft, extendRight: extendRight, restoreStart: restoreStart, restoreEnd: restoreEnd }); } - sendingText = false; - - lastValue = value; - lastSelectionStart = selectionStart; - lastSelectionEnd = selectionEnd; - lastRestoreEnd = restoreEnd; + this.sendingText = false; + this.lastValue = value; + this.lastSelectionStart = selectionStart; + this.lastSelectionEnd = selectionEnd; + this.lastRestoreEnd = restoreEnd; return shouldReset ? "\n" : inserted; } }; - var onInput = function(e) { - if (inComposition) - return onCompositionUpdate(); - if (e && e.inputType) { - if (e.inputType == "historyUndo") return host.execCommand("undo"); - if (e.inputType == "historyRedo") return host.execCommand("redo"); - } - var data = text.value; - var inserted = sendText(data, true); - if ( - data.length > MAX_LINE_LENGTH + 100 - || valueResetRegex.test(inserted) - || isMobile && lastSelectionStart < 1 && lastSelectionStart == lastSelectionEnd - ) { - resetSelection(); + TextInput.prototype.onSelect = function (e) { + var _this = this; + if (this.inComposition) + return; + var isAllSelected = function (text) { + return text.selectionStart === 0 && text.selectionEnd >= _this.lastValue.length && text.value + === _this.lastValue && _this.lastValue && text.selectionEnd !== _this.lastSelectionEnd; + }; + if (this.copied) { + this.copied = false; + } + else if (isAllSelected(this.text)) { + this.host.selectAll(); + this.resetSelection(); + } + else if (isMobile && this.text.selectionStart != this.lastSelectionStart) { + this.resetSelection(); } }; - - var handleClipboardData = function(e, data, forceIEMime) { - var clipboardData = e.clipboardData || window.clipboardData; - if (!clipboardData || BROKEN_SETDATA) + TextInput.prototype.$resetSelectionIOS = function (value) { + if (!this.$isFocused || (this.copied && !value) || this.sendingText) return; - var mime = USE_IE_MIME_TYPE || forceIEMime ? "Text" : "text/plain"; - try { - if (data) { - return clipboardData.setData(mime, data) !== false; - } else { - return clipboardData.getData(mime); - } - } catch(e) { - if (!forceIEMime) - return handleClipboardData(e, data, true); + if (!value) + value = ""; + var newValue = "\n ab" + value + "cde fg\n"; + if (newValue != this.text.value) + this.text.value = this.lastValue = newValue; + var selectionStart = 4; + var selectionEnd = 4 + (value.length || (this.host.selection.isEmpty() ? 0 : 1)); + if (this.lastSelectionStart != selectionStart || this.lastSelectionEnd != selectionEnd) { + this.text.setSelectionRange(selectionStart, selectionEnd); } + this.lastSelectionStart = selectionStart; + this.lastSelectionEnd = selectionEnd; }; - - var doCopy = function(e, isCut) { - var data = host.getCopyText(); - if (!data) - return event.preventDefault(e); - - if (handleClipboardData(e, data)) { - if (isIOS) { - resetSelection(data); - copied = data; - setTimeout(function () { - copied = false; - }, 10); + TextInput.prototype.$resetSelection = function () { + var _this = this; + if (this.inComposition || this.sendingText) + return; + if (!this.$isFocused && !this.afterContextMenu) + return; + this.inComposition = true; + var selectionStart = 0; + var selectionEnd = 0; + var line = ""; + var positionToSelection = function (row, column) { + var selection = column; + for (var i = 1; i <= row - _this.rowStart && i < 2 * _this.numberOfExtraLines + 1; i++) { + selection += _this.host.session.getLine(row - i).length + 1; + } + return selection; + }; + if (this.host.session) { + var selection = this.host.selection; + var range = selection.getRange(); + var row = selection.cursor.row; + if (row === this.rowEnd + 1) { + this.rowStart = this.rowEnd + 1; + this.rowEnd = this.rowStart + 2 * this.numberOfExtraLines; + } + else if (row === this.rowStart - 1) { + this.rowEnd = this.rowStart - 1; + this.rowStart = this.rowEnd - 2 * this.numberOfExtraLines; + } + else if (row < this.rowStart - 1 || row > this.rowEnd + 1) { + this.rowStart = row > this.numberOfExtraLines ? row - this.numberOfExtraLines : 0; + this.rowEnd = row > this.numberOfExtraLines ? row + this.numberOfExtraLines : 2 + * this.numberOfExtraLines; + } + var lines = []; + for (var i = this.rowStart; i <= this.rowEnd; i++) { + lines.push(this.host.session.getLine(i)); + } + line = lines.join('\n'); + selectionStart = positionToSelection(range.start.row, range.start.column); + selectionEnd = positionToSelection(range.end.row, range.end.column); + if (range.start.row < this.rowStart) { + var prevLine = this.host.session.getLine(this.rowStart - 1); + selectionStart = range.start.row < this.rowStart - 1 ? 0 : selectionStart; + selectionEnd += prevLine.length + 1; + line = prevLine + "\n" + line; + } + else if (range.end.row > this.rowEnd) { + var nextLine = this.host.session.getLine(this.rowEnd + 1); + selectionEnd = range.end.row > this.rowEnd + 1 ? nextLine.length : range.end.column; + selectionEnd += line.length + 1; + line = line + "\n" + nextLine; + } + else if (isMobile && row > 0) { + line = "\n" + line; + selectionEnd += 1; + selectionStart += 1; + } + if (line.length > MAX_LINE_LENGTH) { + if (selectionStart < MAX_LINE_LENGTH && selectionEnd < MAX_LINE_LENGTH) { + line = line.slice(0, MAX_LINE_LENGTH); + } + else { + line = "\n"; + if (selectionStart == selectionEnd) { + selectionStart = selectionEnd = 0; + } + else { + selectionStart = 0; + selectionEnd = 1; + } + } + } + var newValue = line + "\n\n"; + if (newValue != this.lastValue) { + this.text.value = this.lastValue = newValue; + this.lastSelectionStart = this.lastSelectionEnd = newValue.length; } - isCut ? host.onCut() : host.onCopy(); - event.preventDefault(e); - } else { - copied = true; - text.value = data; - text.select(); - setTimeout(function(){ - copied = false; - resetSelection(); - isCut ? host.onCut() : host.onCopy(); - }); } + if (this.afterContextMenu) { + this.lastSelectionStart = this.text.selectionStart; + this.lastSelectionEnd = this.text.selectionEnd; + } + if (this.lastSelectionEnd != selectionEnd || this.lastSelectionStart != selectionStart || this.text.selectionEnd + != this.lastSelectionEnd // on ie edge selectionEnd changes silently after the initialization + ) { + try { + this.text.setSelectionRange(selectionStart, selectionEnd); + this.lastSelectionStart = selectionStart; + this.lastSelectionEnd = selectionEnd; + } + catch (e) { + } + } + this.inComposition = false; }; - - var onCut = function(e) { - doCopy(e, true); - }; - - var onCopy = function(e) { - doCopy(e, false); + TextInput.prototype.setHost = function (newHost) { + this.host = newHost; }; - - var onPaste = function(e) { - var data = handleClipboardData(e); - if (clipboard.pasteCancelled()) + TextInput.prototype.setNumberOfExtraLines = function (number) { + this.rowStart = Number.MAX_SAFE_INTEGER; + this.rowEnd = Number.MIN_SAFE_INTEGER; + if (number < 0) { + this.numberOfExtraLines = 0; return; - if (typeof data == "string") { - if (data) - host.onPaste(data, e); - if (useragent.isIE) - setTimeout(resetSelection); - event.preventDefault(e); - } - else { - text.value = ""; - pasted = true; } + this.numberOfExtraLines = number; }; - - event.addCommandKeyListener(text, host.onCommandKey.bind(host), host); - - event.addListener(text, "select", onSelect, host); - event.addListener(text, "input", onInput, host); - - event.addListener(text, "cut", onCut, host); - event.addListener(text, "copy", onCopy, host); - event.addListener(text, "paste", onPaste, host); - if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) { - event.addListener(parentNode, "keydown", function(e) { - if ((useragent.isMac && !e.metaKey) || !e.ctrlKey) - return; - - switch (e.keyCode) { - case 67: - onCopy(e); - break; - case 86: - onPaste(e); - break; - case 88: - onCut(e); - break; - } - }, host); - } - var onCompositionStart = function(e) { - if (inComposition || !host.onCompositionStart || host.$readOnly) - return; - - inComposition = {}; - - if (commandMode) - return; - - if (e.data) - inComposition.useTextareaForIME = false; - - setTimeout(onCompositionUpdate, 0); - host._signal("compositionStart"); - host.on("mousedown", cancelComposition); - - var range = host.getSelectionRange(); - range.end.row = range.start.row; - range.end.column = range.start.column; - inComposition.markerRange = range; - inComposition.selectionStart = lastSelectionStart; - host.onCompositionStart(inComposition); - - if (inComposition.useTextareaForIME) { - lastValue = text.value = ""; - lastSelectionStart = 0; - lastSelectionEnd = 0; + TextInput.prototype.setAriaLabel = function () { + var ariaLabel = ""; + if (this.host.$textInputAriaLabel) { + ariaLabel += "".concat(this.host.$textInputAriaLabel, ", "); } - else { - if (text.msGetInputContext) - inComposition.context = text.msGetInputContext(); - if (text.getInputContext) - inComposition.context = text.getInputContext(); + if (this.host.session) { + var row = this.host.session.selection.cursor.row; + ariaLabel += nls("text-input.aria-label", "Cursor at row $0", [row + 1]); } + this.text.setAttribute("aria-label", ariaLabel); }; - - var onCompositionUpdate = function() { - if (!inComposition || !host.onCompositionUpdate || host.$readOnly) - return; - if (commandMode) - return cancelComposition(); - - if (inComposition.useTextareaForIME) { - host.onCompositionUpdate(text.value); + TextInput.prototype.setAriaOptions = function (options) { + if (options.activeDescendant) { + this.text.setAttribute("aria-haspopup", "true"); + this.text.setAttribute("aria-autocomplete", options.inline ? "both" : "list"); + this.text.setAttribute("aria-activedescendant", options.activeDescendant); } else { - var data = text.value; - sendText(data); - if (inComposition.markerRange) { - if (inComposition.context) { - inComposition.markerRange.start.column = inComposition.selectionStart - = inComposition.context.compositionStartOffset; - } - inComposition.markerRange.end.column = inComposition.markerRange.start.column - + lastSelectionEnd - inComposition.selectionStart + lastRestoreEnd; - } + this.text.setAttribute("aria-haspopup", "false"); + this.text.setAttribute("aria-autocomplete", "both"); + this.text.removeAttribute("aria-activedescendant"); + } + if (options.role) { + this.text.setAttribute("role", options.role); + } + if (options.setLabel) { + this.text.setAttribute("aria-roledescription", nls("text-input.aria-roledescription", "editor")); + this.setAriaLabel(); } }; - - var onCompositionEnd = function(e) { - if (!host.onCompositionEnd || host.$readOnly) return; - inComposition = false; - host.onCompositionEnd(); - host.off("mousedown", cancelComposition); - if (e) onInput(); + TextInput.prototype.focus = function () { + var _this = this; + this.setAriaOptions({ + setLabel: this.host.renderer.enableKeyboardAccessibility + }); + if (this.tempStyle || HAS_FOCUS_ARGS || this.$focusScroll == "browser") + return this.text.focus({ preventScroll: true }); + var top = this.text.style.top; + this.text.style.position = "fixed"; + this.text.style.top = "0px"; + try { + var isTransformed = this.text.getBoundingClientRect().top != 0; + } + catch (e) { + return; + } + var ancestors = []; + if (isTransformed) { + var t = this.text.parentElement; + while (t && t.nodeType == 1) { + ancestors.push(t); + t.setAttribute("ace_nocontext", "true"); + if (!t.parentElement && t.getRootNode) + t = t.getRootNode()["host"]; + else + t = t.parentElement; + } + } + this.text.focus({ preventScroll: true }); + if (isTransformed) { + ancestors.forEach(function (p) { + p.removeAttribute("ace_nocontext"); + }); + } + setTimeout(function () { + _this.text.style.position = ""; + if (_this.text.style.top == "0px") + _this.text.style.top = top; + }, 0); }; - - - function cancelComposition() { - ignoreFocusEvents = true; - text.blur(); - text.focus(); - ignoreFocusEvents = false; - } - - var syncComposition = lang.delayedCall(onCompositionUpdate, 50).schedule.bind(null, null); - - function onKeyup(e) { - if (e.keyCode == 27 && text.value.length < text.selectionStart) { - if (!inComposition) - lastValue = text.value; - lastSelectionStart = lastSelectionEnd = -1; - resetSelection(); - } - syncComposition(); - } - - event.addListener(text, "compositionstart", onCompositionStart, host); - event.addListener(text, "compositionupdate", onCompositionUpdate, host); - event.addListener(text, "keyup", onKeyup, host); - event.addListener(text, "keydown", syncComposition, host); - event.addListener(text, "compositionend", onCompositionEnd, host); - - this.getElement = function() { - return text; + TextInput.prototype.blur = function () { + this.text.blur(); }; - this.setCommandMode = function(value) { - commandMode = value; - text.readOnly = false; + TextInput.prototype.isFocused = function () { + return this.$isFocused; }; - - this.setReadOnly = function(readOnly) { - if (!commandMode) - text.readOnly = readOnly; + TextInput.prototype.setInputHandler = function (cb) { + this.inputHandler = cb; }; - - this.setCopyWithEmptySelection = function(value) { + TextInput.prototype.getInputHandler = function () { + return this.inputHandler; }; - - this.onContextMenu = function(e) { - afterContextMenu = true; - resetSelection(); - host._emit("nativecontextmenu", {target: host, domEvent: e}); + TextInput.prototype.getElement = function () { + return this.text; + }; + TextInput.prototype.setCommandMode = function (value) { + this.commandMode = value; + this.text.readOnly = false; + }; + TextInput.prototype.setReadOnly = function (readOnly) { + if (!this.commandMode) + this.text.readOnly = readOnly; + }; + TextInput.prototype.setCopyWithEmptySelection = function (value) { + }; + TextInput.prototype.onContextMenu = function (e) { + this.afterContextMenu = true; + this.resetSelection(); + this.host._emit("nativecontextmenu", { + target: this.host, + domEvent: e + }); this.moveToMouse(e, true); }; - - this.moveToMouse = function(e, bringToFront) { - if (!tempStyle) - tempStyle = text.style.cssText; - text.style.cssText = (bringToFront ? "z-index:100000;" : "") - + (useragent.isIE ? "opacity:0.1;" : "") - + "text-indent: -" + (lastSelectionStart + lastSelectionEnd) * host.renderer.characterWidth * 0.5 + "px;"; - - var rect = host.container.getBoundingClientRect(); - var style = dom.computedStyle(host.container); + TextInput.prototype.moveToMouse = function (e, bringToFront) { + var _this = this; + if (!this.tempStyle) + this.tempStyle = this.text.style.cssText; + this.text.style.cssText = (bringToFront ? "z-index:100000;" : "") + (useragent.isIE ? "opacity:0.1;" : "") + + "text-indent: -" + (this.lastSelectionStart + this.lastSelectionEnd) * this.host.renderer.characterWidth + * 0.5 + "px;"; + var rect = this.host.container.getBoundingClientRect(); + var style = dom.computedStyle(this.host.container); var top = rect.top + (parseInt(style.borderTopWidth) || 0); - var left = rect.left + (parseInt(rect.borderLeftWidth) || 0); - var maxTop = rect.bottom - top - text.clientHeight -2; - var move = function(e) { - dom.translate(text, e.clientX - left - 2, Math.min(e.clientY - top - 2, maxTop)); - }; + var left = rect.left + (parseInt(style.borderLeftWidth) || 0); + var maxTop = rect.bottom - top - this.text.clientHeight - 2; + var move = function (e) { + dom.translate(_this.text, e.clientX - left - 2, Math.min(e.clientY - top - 2, maxTop)); + }; move(e); - if (e.type != "mousedown") return; - - host.renderer.$isMousePressed = true; - - clearTimeout(closeTimeout); + this.host.renderer.$isMousePressed = true; + clearTimeout(this.closeTimeout); if (useragent.isWin) - event.capture(host.container, move, onContextMenuClose); - }; - - this.onContextMenuClose = onContextMenuClose; - var closeTimeout; - function onContextMenuClose() { - clearTimeout(closeTimeout); - closeTimeout = setTimeout(function () { - if (tempStyle) { - text.style.cssText = tempStyle; - tempStyle = ''; - } - host.renderer.$isMousePressed = false; - if (host.renderer.$keepTextAreaAtCursor) - host.renderer.$moveTextAreaToCursor(); - }, 0); - } - - var onContextMenu = function(e) { - host.textInput.onContextMenu(e); - onContextMenuClose(); + event.capture(this.host.container, move, this.onContextMenuClose.bind(this)); }; - event.addListener(text, "mouseup", onContextMenu, host); - event.addListener(text, "mousedown", function(e) { - e.preventDefault(); - onContextMenuClose(); - }, host); - event.addListener(host.renderer.scroller, "contextmenu", onContextMenu, host); - event.addListener(text, "contextmenu", onContextMenu, host); - - if (isIOS) - addIosSelectionHandler(parentNode, host, text); - - function addIosSelectionHandler(parentNode, host, text) { - var typingResetTimeout = null; - var typing = false; - - text.addEventListener("keydown", function (e) { - if (typingResetTimeout) clearTimeout(typingResetTimeout); - typing = true; - }, true); - - text.addEventListener("keyup", function (e) { - typingResetTimeout = setTimeout(function () { - typing = false; - }, 100); - }, true); - var detectArrowKeys = function(e) { - if (document.activeElement !== text) return; - if (typing || inComposition || host.$mouseHandler.isMousePressed) return; - - if (copied) { - return; - } - var selectionStart = text.selectionStart; - var selectionEnd = text.selectionEnd; - - var key = null; - var modifier = 0; - if (selectionStart == 0) { - key = KEYS.up; - } else if (selectionStart == 1) { - key = KEYS.home; - } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd] == "\n") { - key = KEYS.end; - } else if (selectionStart < lastSelectionStart && lastValue[selectionStart - 1] == " ") { - key = KEYS.left; - modifier = MODS.option; - } else if ( - selectionStart < lastSelectionStart - || ( - selectionStart == lastSelectionStart - && lastSelectionEnd != lastSelectionStart - && selectionStart == selectionEnd - ) - ) { - key = KEYS.left; - } else if (selectionEnd > lastSelectionEnd && lastValue.slice(0, selectionEnd).split("\n").length > 2) { - key = KEYS.down; - } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd - 1] == " ") { - key = KEYS.right; - modifier = MODS.option; - } else if ( - selectionEnd > lastSelectionEnd - || ( - selectionEnd == lastSelectionEnd - && lastSelectionEnd != lastSelectionStart - && selectionStart == selectionEnd - ) - ) { - key = KEYS.right; - } - - if (selectionStart !== selectionEnd) - modifier |= MODS.shift; - - if (key) { - var result = host.onCommandKey({}, modifier, key); - if (!result && host.commands) { - key = KEYS.keyCodeToString(key); - var command = host.commands.findKeyCommand(modifier, key); - if (command) - host.execCommand(command); - } - lastSelectionStart = selectionStart; - lastSelectionEnd = selectionEnd; - resetSelection(""); - } - }; - document.addEventListener("selectionchange", detectArrowKeys); - host.on("destroy", function() { - document.removeEventListener("selectionchange", detectArrowKeys); - }); - } - - this.destroy = function() { - if (text.parentElement) - text.parentElement.removeChild(text); + TextInput.prototype.destroy = function () { + if (this.text.parentElement) + this.text.parentElement.removeChild(this.text); }; -}; - + return TextInput; +}()); exports.TextInput = TextInput; -exports.$setUserAgentForTests = function(_isMobile, _isIOS) { +exports.$setUserAgentForTests = function (_isMobile, _isIOS) { isMobile = _isMobile; isIOS = _isIOS; }; -}); -define("ace/mouse/default_handlers",["require","exports","module","ace/lib/useragent"], function(require, exports, module) { -"use strict"; +}); +define("ace/mouse/default_handlers",["require","exports","module","ace/lib/useragent"], function(require, exports, module){"use strict"; var useragent = require("../lib/useragent"); - var DRAG_OFFSET = 0; // pixels var SCROLL_COOLDOWN_T = 550; // milliseconds - -function DefaultHandlers(mouseHandler) { - mouseHandler.$clickSelection = null; - - var editor = mouseHandler.editor; - editor.setDefaultHandler("mousedown", this.onMouseDown.bind(mouseHandler)); - editor.setDefaultHandler("dblclick", this.onDoubleClick.bind(mouseHandler)); - editor.setDefaultHandler("tripleclick", this.onTripleClick.bind(mouseHandler)); - editor.setDefaultHandler("quadclick", this.onQuadClick.bind(mouseHandler)); - editor.setDefaultHandler("mousewheel", this.onMouseWheel.bind(mouseHandler)); - - var exports = ["select", "startSelect", "selectEnd", "selectAllEnd", "selectByWordsEnd", - "selectByLinesEnd", "dragWait", "dragWaitEnd", "focusWait"]; - - exports.forEach(function(x) { - mouseHandler[x] = this[x]; - }, this); - - mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, "getLineRange"); - mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, "getWordRange"); -} - -(function() { - - this.onMouseDown = function(ev) { +var DefaultHandlers = /** @class */ (function () { + function DefaultHandlers(mouseHandler) { + mouseHandler.$clickSelection = null; + var editor = mouseHandler.editor; + editor.setDefaultHandler("mousedown", this.onMouseDown.bind(mouseHandler)); + editor.setDefaultHandler("dblclick", this.onDoubleClick.bind(mouseHandler)); + editor.setDefaultHandler("tripleclick", this.onTripleClick.bind(mouseHandler)); + editor.setDefaultHandler("quadclick", this.onQuadClick.bind(mouseHandler)); + editor.setDefaultHandler("mousewheel", this.onMouseWheel.bind(mouseHandler)); + var exports = ["select", "startSelect", "selectEnd", "selectAllEnd", "selectByWordsEnd", + "selectByLinesEnd", "dragWait", "dragWaitEnd", "focusWait"]; + exports.forEach(function (x) { + mouseHandler[x] = this[x]; + }, this); + mouseHandler["selectByLines"] = this.extendSelectionBy.bind(mouseHandler, "getLineRange"); + mouseHandler["selectByWords"] = this.extendSelectionBy.bind(mouseHandler, "getWordRange"); + } + DefaultHandlers.prototype.onMouseDown = function (ev) { var inSelection = ev.inSelection(); var pos = ev.getDocumentPosition(); this.mousedownEvent = ev; var editor = this.editor; - var button = ev.getButton(); if (button !== 0) { var selectionRange = editor.getSelectionRange(); @@ -2296,7 +2866,6 @@ function DefaultHandlers(mouseHandler) { } return; } - this.mousedownEvent.time = Date.now(); if (inSelection && !editor.isFocused()) { editor.focus(); @@ -2306,41 +2875,37 @@ function DefaultHandlers(mouseHandler) { return; } } - this.captureMouse(ev); this.startSelect(pos, ev.domEvent._clicks > 1); return ev.preventDefault(); }; - - this.startSelect = function(pos, waitForClickSelection) { + DefaultHandlers.prototype.startSelect = function (pos, waitForClickSelection) { pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y); var editor = this.editor; - if (!this.mousedownEvent) return; + if (!this.mousedownEvent) + return; if (this.mousedownEvent.getShiftKey()) editor.selection.selectToPosition(pos); else if (!waitForClickSelection) editor.selection.moveToPosition(pos); if (!waitForClickSelection) this.select(); - if (editor.renderer.scroller.setCapture) { - editor.renderer.scroller.setCapture(); - } editor.setStyle("ace_selecting"); this.setState("select"); }; - - this.select = function() { + DefaultHandlers.prototype.select = function () { var anchor, editor = this.editor; var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); if (this.$clickSelection) { var cmp = this.$clickSelection.comparePoint(cursor); - if (cmp == -1) { anchor = this.$clickSelection.end; - } else if (cmp == 1) { + } + else if (cmp == 1) { anchor = this.$clickSelection.start; - } else { - var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + } + else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor, editor.session); cursor = orientedRange.cursor; anchor = orientedRange.anchor; } @@ -2349,28 +2914,29 @@ function DefaultHandlers(mouseHandler) { editor.selection.selectToPosition(cursor); editor.renderer.scrollCursorIntoView(); }; - - this.extendSelectionBy = function(unitName) { + DefaultHandlers.prototype.extendSelectionBy = function (unitName) { var anchor, editor = this.editor; var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); var range = editor.selection[unitName](cursor.row, cursor.column); if (this.$clickSelection) { var cmpStart = this.$clickSelection.comparePoint(range.start); var cmpEnd = this.$clickSelection.comparePoint(range.end); - if (cmpStart == -1 && cmpEnd <= 0) { anchor = this.$clickSelection.end; if (range.end.row != cursor.row || range.end.column != cursor.column) cursor = range.start; - } else if (cmpEnd == 1 && cmpStart >= 0) { + } + else if (cmpEnd == 1 && cmpStart >= 0) { anchor = this.$clickSelection.start; if (range.start.row != cursor.row || range.start.column != cursor.column) cursor = range.end; - } else if (cmpStart == -1 && cmpEnd == 1) { + } + else if (cmpStart == -1 && cmpEnd == 1) { cursor = range.end; anchor = range.start; - } else { - var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + } + else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor, editor.session); cursor = orientedRange.cursor; anchor = orientedRange.anchor; } @@ -2379,31 +2945,20 @@ function DefaultHandlers(mouseHandler) { editor.selection.selectToPosition(cursor); editor.renderer.scrollCursorIntoView(); }; - - this.selectEnd = - this.selectAllEnd = - this.selectByWordsEnd = - this.selectByLinesEnd = function() { + DefaultHandlers.prototype.selectByLinesEnd = function () { this.$clickSelection = null; this.editor.unsetStyle("ace_selecting"); - if (this.editor.renderer.scroller.releaseCapture) { - this.editor.renderer.scroller.releaseCapture(); - } }; - - this.focusWait = function() { + DefaultHandlers.prototype.focusWait = function () { var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); var time = Date.now(); - if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimeout) this.startSelect(this.mousedownEvent.getDocumentPosition()); }; - - this.onDoubleClick = function(ev) { + DefaultHandlers.prototype.onDoubleClick = function (ev) { var pos = ev.getDocumentPosition(); var editor = this.editor; var session = editor.session; - var range = session.getBracketRange(pos); if (range) { if (range.isEmpty()) { @@ -2411,50 +2966,44 @@ function DefaultHandlers(mouseHandler) { range.end.column++; } this.setState("select"); - } else { + } + else { range = editor.selection.getWordRange(pos.row, pos.column); this.setState("selectByWords"); } this.$clickSelection = range; this.select(); }; - - this.onTripleClick = function(ev) { + DefaultHandlers.prototype.onTripleClick = function (ev) { var pos = ev.getDocumentPosition(); var editor = this.editor; - this.setState("selectByLines"); var range = editor.getSelectionRange(); if (range.isMultiLine() && range.contains(pos.row, pos.column)) { this.$clickSelection = editor.selection.getLineRange(range.start.row); this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end; - } else { + } + else { this.$clickSelection = editor.selection.getLineRange(pos.row); } this.select(); }; - - this.onQuadClick = function(ev) { + DefaultHandlers.prototype.onQuadClick = function (ev) { var editor = this.editor; - editor.selectAll(); this.$clickSelection = editor.getSelectionRange(); this.setState("selectAll"); }; - - this.onMouseWheel = function(ev) { + DefaultHandlers.prototype.onMouseWheel = function (ev) { if (ev.getAccelKey()) return; if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) { ev.wheelX = ev.wheelY; ev.wheelY = 0; } - var editor = this.editor; - if (!this.$lastScroll) this.$lastScroll = { t: 0, vx: 0, vy: 0, allowed: 0 }; - var prevScroll = this.$lastScroll; var t = ev.domEvent.timeStamp; var dt = t - prevScroll.t; @@ -2464,18 +3013,16 @@ function DefaultHandlers(mouseHandler) { vx = (vx + prevScroll.vx) / 2; vy = (vy + prevScroll.vy) / 2; } - var direction = Math.abs(vx / vy); - var canScroll = false; if (direction >= 1 && editor.renderer.isScrollableBy(ev.wheelX * ev.speed, 0)) canScroll = true; if (direction <= 1 && editor.renderer.isScrollableBy(0, ev.wheelY * ev.speed)) canScroll = true; - if (canScroll) { prevScroll.allowed = t; - } else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) { + } + else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) { var isSlower = Math.abs(vx) <= 1.5 * Math.abs(prevScroll.vx) && Math.abs(vy) <= 1.5 * Math.abs(prevScroll.vy); if (isSlower) { @@ -2486,79 +3033,193 @@ function DefaultHandlers(mouseHandler) { prevScroll.allowed = 0; } } - prevScroll.t = t; prevScroll.vx = vx; prevScroll.vy = vy; - if (canScroll) { editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); return ev.stop(); } }; - -}).call(DefaultHandlers.prototype); - + return DefaultHandlers; +}()); +DefaultHandlers.prototype.selectEnd = DefaultHandlers.prototype.selectByLinesEnd; +DefaultHandlers.prototype.selectAllEnd = DefaultHandlers.prototype.selectByLinesEnd; +DefaultHandlers.prototype.selectByWordsEnd = DefaultHandlers.prototype.selectByLinesEnd; exports.DefaultHandlers = DefaultHandlers; - function calcDistance(ax, ay, bx, by) { return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); } - -function calcRangeOrientation(range, cursor) { +function calcRangeOrientation(range, cursor, session) { if (range.start.row == range.end.row) var cmp = 2 * cursor.column - range.start.column - range.end.column; else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column) - var cmp = cursor.column - 4; + var cmp = 3 * cursor.column - 2 * session.getLine(range.start.row).length; else var cmp = 2 * cursor.row - range.start.row - range.end.row; - if (cmp < 0) - return {cursor: range.start, anchor: range.end}; + return { cursor: range.start, anchor: range.end }; else - return {cursor: range.end, anchor: range.start}; + return { cursor: range.end, anchor: range.start }; } }); -define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"], function(require, exports, module) { -"use strict"; +define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module){"use strict"; +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var MouseEvent = /** @class */ (function () { + function MouseEvent(domEvent, editor) { this.speed; this.wheelX; this.wheelY; + this.domEvent = domEvent; + this.editor = editor; + this.x = this.clientX = domEvent.clientX; + this.y = this.clientY = domEvent.clientY; + this.$pos = null; + this.$inSelection = null; + this.propagationStopped = false; + this.defaultPrevented = false; + } + MouseEvent.prototype.stopPropagation = function () { + event.stopPropagation(this.domEvent); + this.propagationStopped = true; + }; + MouseEvent.prototype.preventDefault = function () { + event.preventDefault(this.domEvent); + this.defaultPrevented = true; + }; + MouseEvent.prototype.stop = function () { + this.stopPropagation(); + this.preventDefault(); + }; + MouseEvent.prototype.getDocumentPosition = function () { + if (this.$pos) + return this.$pos; + this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY); + return this.$pos; + }; + MouseEvent.prototype.getGutterRow = function () { + var documentRow = this.getDocumentPosition().row; + var screenRow = this.editor.session.documentToScreenRow(documentRow, 0); + var screenTopRow = this.editor.session.documentToScreenRow(this.editor.renderer.$gutterLayer.$lines.get(0).row, 0); + return screenRow - screenTopRow; + }; + MouseEvent.prototype.inSelection = function () { + if (this.$inSelection !== null) + return this.$inSelection; + var editor = this.editor; + var selectionRange = editor.getSelectionRange(); + if (selectionRange.isEmpty()) + this.$inSelection = false; + else { + var pos = this.getDocumentPosition(); + this.$inSelection = selectionRange.contains(pos.row, pos.column); + } + return this.$inSelection; + }; + MouseEvent.prototype.getButton = function () { + return event.getButton(this.domEvent); + }; + MouseEvent.prototype.getShiftKey = function () { + return this.domEvent.shiftKey; + }; + MouseEvent.prototype.getAccelKey = function () { + return useragent.isMac ? this.domEvent.metaKey : this.domEvent.ctrlKey; + }; + return MouseEvent; +}()); +exports.MouseEvent = MouseEvent; -var oop = require("./lib/oop"); -var dom = require("./lib/dom"); +}); -var CLASSNAME = "ace_tooltip"; -function Tooltip (parentNode) { - this.isOpen = false; - this.$element = null; - this.$parentNode = parentNode; -} +define("ace/lib/scroll",["require","exports","module"], function(require, exports, module){exports.preventParentScroll = function preventParentScroll(event) { + event.stopPropagation(); + var target = event.currentTarget; + var contentOverflows = target.scrollHeight > target.clientHeight; + if (!contentOverflows) { + event.preventDefault(); + } +}; -(function() { - this.$init = function() { +}); + +define("ace/tooltip",["require","exports","module","ace/lib/dom","ace/lib/event","ace/range","ace/lib/scroll"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var dom = require("./lib/dom"); +var event = require("./lib/event"); +var Range = require("./range").Range; +var preventParentScroll = require("./lib/scroll").preventParentScroll; +var CLASSNAME = "ace_tooltip"; +var Tooltip = /** @class */ (function () { + function Tooltip(parentNode) { + this.isOpen = false; + this.$element = null; + this.$parentNode = parentNode; + } + Tooltip.prototype.$init = function () { this.$element = dom.createElement("div"); this.$element.className = CLASSNAME; this.$element.style.display = "none"; this.$parentNode.appendChild(this.$element); return this.$element; }; - this.getElement = function() { + Tooltip.prototype.getElement = function () { return this.$element || this.$init(); }; - this.setText = function(text) { + Tooltip.prototype.setText = function (text) { this.getElement().textContent = text; }; - this.setHtml = function(html) { + Tooltip.prototype.setHtml = function (html) { this.getElement().innerHTML = html; }; - this.setPosition = function(x, y) { + Tooltip.prototype.setPosition = function (x, y) { this.getElement().style.left = x + "px"; this.getElement().style.top = y + "px"; }; - this.setClassName = function(className) { + Tooltip.prototype.setClassName = function (className) { dom.addCssClass(this.getElement(), className); }; - this.show = function(text, x, y) { + Tooltip.prototype.setTheme = function (theme) { + if (this.theme) { + this.theme.isDark && dom.removeCssClass(this.getElement(), "ace_dark"); + this.theme.cssClass && dom.removeCssClass(this.getElement(), this.theme.cssClass); + } + if (theme.isDark) { + dom.addCssClass(this.getElement(), "ace_dark"); + } + if (theme.cssClass) { + dom.addCssClass(this.getElement(), theme.cssClass); + } + this.theme = { + isDark: theme.isDark, + cssClass: theme.cssClass + }; + }; + Tooltip.prototype.show = function (text, x, y) { if (text != null) this.setText(text); if (x != null && y != null) @@ -2568,56 +3229,340 @@ function Tooltip (parentNode) { this.isOpen = true; } }; - - this.hide = function() { + Tooltip.prototype.hide = function (e) { if (this.isOpen) { this.getElement().style.display = "none"; this.getElement().className = CLASSNAME; this.isOpen = false; } }; - this.getHeight = function() { + Tooltip.prototype.getHeight = function () { return this.getElement().offsetHeight; }; - this.getWidth = function() { + Tooltip.prototype.getWidth = function () { return this.getElement().offsetWidth; }; - - this.destroy = function() { + Tooltip.prototype.destroy = function () { this.isOpen = false; if (this.$element && this.$element.parentNode) { this.$element.parentNode.removeChild(this.$element); } }; - -}).call(Tooltip.prototype); - + return Tooltip; +}()); +var PopupManager = /** @class */ (function () { + function PopupManager() { + this.popups = []; + } + PopupManager.prototype.addPopup = function (popup) { + this.popups.push(popup); + this.updatePopups(); + }; + PopupManager.prototype.removePopup = function (popup) { + var index = this.popups.indexOf(popup); + if (index !== -1) { + this.popups.splice(index, 1); + this.updatePopups(); + } + }; + PopupManager.prototype.updatePopups = function () { + var e_1, _a, e_2, _b; + this.popups.sort(function (a, b) { return b.priority - a.priority; }); + var visiblepopups = []; + try { + for (var _c = __values(this.popups), _d = _c.next(); !_d.done; _d = _c.next()) { + var popup = _d.value; + var shouldDisplay = true; + try { + for (var visiblepopups_1 = (e_2 = void 0, __values(visiblepopups)), visiblepopups_1_1 = visiblepopups_1.next(); !visiblepopups_1_1.done; visiblepopups_1_1 = visiblepopups_1.next()) { + var visiblePopup = visiblepopups_1_1.value; + if (this.doPopupsOverlap(visiblePopup, popup)) { + shouldDisplay = false; + break; + } + } + } + catch (e_2_1) { e_2 = { error: e_2_1 }; } + finally { + try { + if (visiblepopups_1_1 && !visiblepopups_1_1.done && (_b = visiblepopups_1.return)) _b.call(visiblepopups_1); + } + finally { if (e_2) throw e_2.error; } + } + if (shouldDisplay) { + visiblepopups.push(popup); + } + else { + popup.hide(); + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_d && !_d.done && (_a = _c.return)) _a.call(_c); + } + finally { if (e_1) throw e_1.error; } + } + }; + PopupManager.prototype.doPopupsOverlap = function (popupA, popupB) { + var rectA = popupA.getElement().getBoundingClientRect(); + var rectB = popupB.getElement().getBoundingClientRect(); + return (rectA.left < rectB.right && rectA.right > rectB.left && rectA.top < rectB.bottom && rectA.bottom + > rectB.top); + }; + return PopupManager; +}()); +var popupManager = new PopupManager(); +exports.popupManager = popupManager; exports.Tooltip = Tooltip; -}); - -define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"], function(require, exports, module) { -"use strict"; -var dom = require("../lib/dom"); -var oop = require("../lib/oop"); -var event = require("../lib/event"); -var Tooltip = require("../tooltip").Tooltip; - +var HoverTooltip = /** @class */ (function (_super) { + __extends(HoverTooltip, _super); + function HoverTooltip(parentNode) { + if (parentNode === void 0) { parentNode = document.body; } + var _this = _super.call(this, parentNode) || this; + _this.timeout = undefined; + _this.lastT = 0; + _this.idleTime = 350; + _this.lastEvent = undefined; + _this.onMouseOut = _this.onMouseOut.bind(_this); + _this.onMouseMove = _this.onMouseMove.bind(_this); + _this.waitForHover = _this.waitForHover.bind(_this); + _this.hide = _this.hide.bind(_this); + var el = _this.getElement(); + el.style.whiteSpace = "pre-wrap"; + el.style.pointerEvents = "auto"; + el.addEventListener("mouseout", _this.onMouseOut); + el.tabIndex = -1; + el.addEventListener("blur", function () { + if (!el.contains(document.activeElement)) + this.hide(); + }.bind(_this)); + el.addEventListener("wheel", preventParentScroll); + return _this; + } + HoverTooltip.prototype.addToEditor = function (editor) { + editor.on("mousemove", this.onMouseMove); + editor.on("mousedown", this.hide); + var target = editor.renderer.getMouseEventTarget(); + if (target && typeof target.removeEventListener === "function") { + target.addEventListener("mouseout", this.onMouseOut, true); + } + }; + HoverTooltip.prototype.removeFromEditor = function (editor) { + editor.off("mousemove", this.onMouseMove); + editor.off("mousedown", this.hide); + var target = editor.renderer.getMouseEventTarget(); + if (target && typeof target.removeEventListener === "function") { + target.removeEventListener("mouseout", this.onMouseOut, true); + } + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } + }; + HoverTooltip.prototype.onMouseMove = function (e, editor) { + this.lastEvent = e; + this.lastT = Date.now(); + var isMousePressed = editor.$mouseHandler.isMousePressed; + if (this.isOpen) { + var pos = this.lastEvent && this.lastEvent.getDocumentPosition(); + if (!this.range + || !this.range.contains(pos.row, pos.column) + || isMousePressed + || this.isOutsideOfText(this.lastEvent)) { + this.hide(); + } + } + if (this.timeout || isMousePressed) + return; + this.lastEvent = e; + this.timeout = setTimeout(this.waitForHover, this.idleTime); + }; + HoverTooltip.prototype.waitForHover = function () { + if (this.timeout) + clearTimeout(this.timeout); + var dt = Date.now() - this.lastT; + if (this.idleTime - dt > 10) { + this.timeout = setTimeout(this.waitForHover, this.idleTime - dt); + return; + } + this.timeout = null; + if (this.lastEvent && !this.isOutsideOfText(this.lastEvent)) { + this.$gatherData(this.lastEvent, this.lastEvent.editor); + } + }; + HoverTooltip.prototype.isOutsideOfText = function (e) { + var editor = e.editor; + var docPos = e.getDocumentPosition(); + var line = editor.session.getLine(docPos.row); + if (docPos.column == line.length) { + var screenPos = editor.renderer.pixelToScreenCoordinates(e.clientX, e.clientY); + var clippedPos = editor.session.documentToScreenPosition(docPos.row, docPos.column); + if (clippedPos.column != screenPos.column + || clippedPos.row != screenPos.row) { + return true; + } + } + return false; + }; + HoverTooltip.prototype.setDataProvider = function (value) { + this.$gatherData = value; + }; + HoverTooltip.prototype.showForRange = function (editor, range, domNode, startingEvent) { + if (startingEvent && startingEvent != this.lastEvent) + return; + if (this.isOpen && document.activeElement == this.getElement()) + return; + var renderer = editor.renderer; + if (!this.isOpen) { + popupManager.addPopup(this); + this.$registerCloseEvents(); + this.setTheme(renderer.theme); + } + this.isOpen = true; + this.range = Range.fromPoints(range.start, range.end); + var position = renderer.textToScreenCoordinates(range.start.row, range.start.column); + var rect = renderer.scroller.getBoundingClientRect(); + if (position.pageX < rect.left) + position.pageX = rect.left; + var element = this.getElement(); + element.innerHTML = ""; + element.appendChild(domNode); + element.style.maxHeight = ""; + element.style.display = "block"; + this.$setPosition(editor, position, true, range); + dom.$fixPositionBug(element); + }; + HoverTooltip.prototype.$setPosition = function (editor, position, withMarker, range) { + var MARGIN = 10; + withMarker && this.addMarker(range, editor.session); + var renderer = editor.renderer; + var element = this.getElement(); + var labelHeight = element.offsetHeight; + var labelWidth = element.offsetWidth; + var anchorTop = position.pageY; + var anchorLeft = position.pageX; + var spaceBelow = window.innerHeight - anchorTop - renderer.lineHeight; + var isAbove = this.$shouldPlaceAbove(labelHeight, anchorTop, spaceBelow - MARGIN); + element.style.maxHeight = (isAbove ? anchorTop : spaceBelow) - MARGIN + "px"; + element.style.top = isAbove ? "" : anchorTop + renderer.lineHeight + "px"; + element.style.bottom = isAbove ? window.innerHeight - anchorTop + "px" : ""; + element.style.left = Math.min(anchorLeft, window.innerWidth - labelWidth - MARGIN) + "px"; + }; + HoverTooltip.prototype.$shouldPlaceAbove = function (labelHeight, anchorTop, spaceBelow) { + return !(anchorTop - labelHeight < 0 && anchorTop < spaceBelow); + }; + HoverTooltip.prototype.addMarker = function (range, session) { + if (this.marker) { + this.$markerSession.removeMarker(this.marker); + } + this.$markerSession = session; + this.marker = session && session.addMarker(range, "ace_highlight-marker", "text"); + }; + HoverTooltip.prototype.hide = function (e) { + if (e && this.$fromKeyboard && e.type == "keydown") { + if (e.code == "Escape") { + return; + } + } + if (!e && document.activeElement == this.getElement()) + return; + if (e && e.target && (e.type != "keydown" || e.ctrlKey || e.metaKey) && this.$element.contains(e.target)) + return; + this.lastEvent = null; + if (this.timeout) + clearTimeout(this.timeout); + this.timeout = null; + this.addMarker(null); + if (this.isOpen) { + this.$fromKeyboard = false; + this.$removeCloseEvents(); + this.getElement().style.display = "none"; + this.isOpen = false; + popupManager.removePopup(this); + } + }; + HoverTooltip.prototype.$registerCloseEvents = function () { + window.addEventListener("keydown", this.hide, true); + window.addEventListener("wheel", this.hide, true); + window.addEventListener("mousedown", this.hide, true); + }; + HoverTooltip.prototype.$removeCloseEvents = function () { + window.removeEventListener("keydown", this.hide, true); + window.removeEventListener("wheel", this.hide, true); + window.removeEventListener("mousedown", this.hide, true); + }; + HoverTooltip.prototype.onMouseOut = function (e) { + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } + this.lastEvent = null; + if (!this.isOpen) + return; + if (!e.relatedTarget || this.getElement().contains(e.relatedTarget)) + return; + if (e && e.currentTarget.contains(e.relatedTarget)) + return; + if (!e.relatedTarget.classList.contains("ace_content")) + this.hide(); + }; + return HoverTooltip; +}(Tooltip)); +exports.HoverTooltip = HoverTooltip; + +}); + +define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/mouse/mouse_event","ace/tooltip","ace/config","ace/range"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var dom = require("../lib/dom"); +var MouseEvent = require("./mouse_event").MouseEvent; +var HoverTooltip = require("../tooltip").HoverTooltip; +var nls = require("../config").nls; +var Range = require("../range").Range; function GutterHandler(mouseHandler) { var editor = mouseHandler.editor; var gutter = editor.renderer.$gutterLayer; - var tooltip = new GutterTooltip(editor.container); - - mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) { + mouseHandler.$tooltip = new GutterTooltip(editor); + mouseHandler.$tooltip.addToEditor(editor); + mouseHandler.$tooltip.setDataProvider(function (e, editor) { + var row = e.getDocumentPosition().row; + mouseHandler.$tooltip.showTooltip(row); + }); + mouseHandler.editor.setDefaultHandler("guttermousedown", function (e) { if (!editor.isFocused() || e.getButton() != 0) return; var gutterRegion = gutter.getRegion(e); - if (gutterRegion == "foldWidgets") return; - var row = e.getDocumentPosition().row; var selection = editor.session.selection; - if (e.getShiftKey()) selection.selectTo(row, 0); else { @@ -2631,232 +3576,245 @@ function GutterHandler(mouseHandler) { mouseHandler.captureMouse(e); return e.preventDefault(); }); - - - var tooltipTimeout, mouseEvent, tooltipAnnotation; - - function showTooltip() { - var row = mouseEvent.getDocumentPosition().row; - var annotation = gutter.$annotations[row]; - if (!annotation) - return hideTooltip(); - - var maxRow = editor.session.getLength(); - if (row == maxRow) { - var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row; - var pos = mouseEvent.$pos; - if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column)) - return hideTooltip(); - } - - - if (tooltipAnnotation == annotation) - return; - tooltipAnnotation = annotation.text.join("
"); - if (!tooltipAnnotation.length) return - - tooltip.setHtml(tooltipAnnotation); - var annotationClassName = annotation.className; - if (annotationClassName) { - tooltip.setClassName(annotationClassName.trim()); - } - - tooltip.show(); - editor._signal("showGutterTooltip", tooltip); - - editor.on("mousewheel", hideTooltip); - - if (mouseHandler.$tooltipFollowsMouse) { - moveTooltip(mouseEvent); - } else { - var gutterElement = mouseEvent.domEvent.target; - var rect = gutterElement.getBoundingClientRect(); - var style = tooltip.getElement().style; - style.left = rect.right + "px"; - style.top = rect.bottom + "px"; - } - } - - function hideTooltip() { - if (tooltipTimeout) - tooltipTimeout = clearTimeout(tooltipTimeout); - if (tooltipAnnotation) { - tooltip.hide(); - tooltipAnnotation = null; - editor._signal("hideGutterTooltip", tooltip); - editor.off("mousewheel", hideTooltip); - } - } - - function moveTooltip(e) { - tooltip.setPosition(e.x, e.y); +} +exports.GutterHandler = GutterHandler; +var GutterTooltip = /** @class */ (function (_super) { + __extends(GutterTooltip, _super); + function GutterTooltip(editor) { + var _this = _super.call(this, editor.container) || this; + _this.id = "gt" + (++GutterTooltip.$uid); + _this.editor = editor; + _this.visibleTooltipRow; + var el = _this.getElement(); + el.setAttribute("role", "tooltip"); + el.setAttribute("id", _this.id); + el.style.pointerEvents = "auto"; + _this.idleTime = 50; + _this.onDomMouseMove = _this.onDomMouseMove.bind(_this); + _this.onDomMouseOut = _this.onDomMouseOut.bind(_this); + _this.setClassName("ace_gutter-tooltip"); + return _this; } - - mouseHandler.editor.setDefaultHandler("guttermousemove", function(e) { - var target = e.domEvent.target || e.domEvent.srcElement; - if (dom.hasCssClass(target, "ace_fold-widget")) - return hideTooltip(); - - if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse) - moveTooltip(e); - - mouseEvent = e; - if (tooltipTimeout) - return; - tooltipTimeout = setTimeout(function() { - tooltipTimeout = null; - if (mouseEvent && !mouseHandler.isMousePressed) - showTooltip(); - else - hideTooltip(); - }, 50); + GutterTooltip.prototype.onDomMouseMove = function (domEvent) { + var aceEvent = new MouseEvent(domEvent, this.editor); + this.onMouseMove(aceEvent, this.editor); + }; + GutterTooltip.prototype.onDomMouseOut = function (domEvent) { + var aceEvent = new MouseEvent(domEvent, this.editor); + this.onMouseOut(aceEvent); + }; + GutterTooltip.prototype.addToEditor = function (editor) { + var gutter = editor.renderer.$gutter; + gutter.addEventListener("mousemove", this.onDomMouseMove); + gutter.addEventListener("mouseout", this.onDomMouseOut); + _super.prototype.addToEditor.call(this, editor); + }; + GutterTooltip.prototype.removeFromEditor = function (editor) { + var gutter = editor.renderer.$gutter; + gutter.removeEventListener("mousemove", this.onDomMouseMove); + gutter.removeEventListener("mouseout", this.onDomMouseOut); + _super.prototype.removeFromEditor.call(this, editor); + }; + GutterTooltip.prototype.destroy = function () { + if (this.editor) { + this.removeFromEditor(this.editor); + } + _super.prototype.destroy.call(this); + }; + Object.defineProperty(GutterTooltip, "annotationLabels", { + get: function () { + return { + error: { + singular: nls("gutter-tooltip.aria-label.error.singular", "error"), + plural: nls("gutter-tooltip.aria-label.error.plural", "errors") + }, + security: { + singular: nls("gutter-tooltip.aria-label.security.singular", "security finding"), + plural: nls("gutter-tooltip.aria-label.security.plural", "security findings") + }, + warning: { + singular: nls("gutter-tooltip.aria-label.warning.singular", "warning"), + plural: nls("gutter-tooltip.aria-label.warning.plural", "warnings") + }, + info: { + singular: nls("gutter-tooltip.aria-label.info.singular", "information message"), + plural: nls("gutter-tooltip.aria-label.info.plural", "information messages") + }, + hint: { + singular: nls("gutter-tooltip.aria-label.hint.singular", "suggestion"), + plural: nls("gutter-tooltip.aria-label.hint.plural", "suggestions") + } + }; + }, + enumerable: false, + configurable: true }); - - event.addListener(editor.renderer.$gutter, "mouseout", function(e) { - mouseEvent = null; - if (!tooltipAnnotation || tooltipTimeout) + GutterTooltip.prototype.showTooltip = function (row) { + var _a; + var gutter = this.editor.renderer.$gutterLayer; + var annotationsInRow = gutter.$annotations[row]; + var annotation; + if (annotationsInRow) + annotation = { + displayText: Array.from(annotationsInRow.displayText), + type: Array.from(annotationsInRow.type) + }; + else + annotation = { displayText: [], type: [] }; + var fold = gutter.session.getFoldLine(row); + if (fold && gutter.$showFoldedAnnotations) { + var annotationsInFold = { error: [], security: [], warning: [], info: [], hint: [] }; + var severityRank = { error: 1, security: 2, warning: 3, info: 4, hint: 5 }; + var mostSevereAnnotationTypeInFold; + for (var i = row + 1; i <= fold.end.row; i++) { + if (!gutter.$annotations[i]) + continue; + for (var j = 0; j < gutter.$annotations[i].text.length; j++) { + var annotationType = gutter.$annotations[i].type[j]; + annotationsInFold[annotationType].push(gutter.$annotations[i].text[j]); + if (!mostSevereAnnotationTypeInFold || + severityRank[annotationType] < severityRank[mostSevereAnnotationTypeInFold]) { + mostSevereAnnotationTypeInFold = annotationType; + } + } + } + if (["error", "security", "warning"].includes(mostSevereAnnotationTypeInFold)) { + var summaryFoldedAnnotations = "".concat(GutterTooltip.annotationsToSummaryString(annotationsInFold), " in folded code."); + annotation.displayText.push(summaryFoldedAnnotations); + annotation.type.push(mostSevereAnnotationTypeInFold + "_fold"); + } + } + if (annotation.displayText.length === 0) + return this.hide(); + var annotationMessages = { error: [], security: [], warning: [], info: [], hint: [] }; + var iconClassName = gutter.$useSvgGutterIcons ? "ace_icon_svg" : "ace_icon"; + for (var i = 0; i < annotation.displayText.length; i++) { + var lineElement = dom.createElement("span"); + var iconElement = dom.createElement("span"); + (_a = iconElement.classList).add.apply(_a, ["ace_".concat(annotation.type[i]), iconClassName]); + iconElement.setAttribute("aria-label", "".concat(GutterTooltip.annotationLabels[annotation.type[i].replace("_fold", "")].singular)); + iconElement.setAttribute("role", "img"); + iconElement.appendChild(dom.createTextNode(" ")); + lineElement.appendChild(iconElement); + lineElement.appendChild(dom.createTextNode(annotation.displayText[i])); + lineElement.appendChild(dom.createElement("br")); + annotationMessages[annotation.type[i].replace("_fold", "")].push(lineElement); + } + var tooltipElement = dom.createElement("span"); + annotationMessages.error.forEach(function (el) { return tooltipElement.appendChild(el); }); + annotationMessages.security.forEach(function (el) { return tooltipElement.appendChild(el); }); + annotationMessages.warning.forEach(function (el) { return tooltipElement.appendChild(el); }); + annotationMessages.info.forEach(function (el) { return tooltipElement.appendChild(el); }); + annotationMessages.hint.forEach(function (el) { return tooltipElement.appendChild(el); }); + tooltipElement.setAttribute("aria-live", "polite"); + var annotationNode = this.$findLinkedAnnotationNode(row); + if (annotationNode) { + annotationNode.setAttribute("aria-describedby", this.id); + } + var range = Range.fromPoints({ row: row, column: 0 }, { row: row, column: 0 }); + this.showForRange(this.editor, range, tooltipElement); + this.visibleTooltipRow = row; + this.editor._signal("showGutterTooltip", this); + }; + GutterTooltip.prototype.$setPosition = function (editor, _ignoredPosition, _withMarker, range) { + var gutterCell = this.$findCellByRow(range.start.row); + if (!gutterCell) return; - - tooltipTimeout = setTimeout(function() { - tooltipTimeout = null; - hideTooltip(); - }, 50); - }, editor); - - editor.on("changeSession", hideTooltip); -} - -function GutterTooltip(parentNode) { - Tooltip.call(this, parentNode); -} - -oop.inherits(GutterTooltip, Tooltip); - -(function(){ - this.setPosition = function(x, y) { - var windowWidth = window.innerWidth || document.documentElement.clientWidth; - var windowHeight = window.innerHeight || document.documentElement.clientHeight; - var width = this.getWidth(); - var height = this.getHeight(); - x += 15; - y += 15; - if (x + width > windowWidth) { - x -= (x + width) - windowWidth; - } - if (y + height > windowHeight) { - y -= 20 + height; - } - Tooltip.prototype.setPosition.call(this, x, y); - }; - -}).call(GutterTooltip.prototype); - - - -exports.GutterHandler = GutterHandler; - -}); - -define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { -"use strict"; - -var event = require("../lib/event"); -var useragent = require("../lib/useragent"); -var MouseEvent = exports.MouseEvent = function(domEvent, editor) { - this.domEvent = domEvent; - this.editor = editor; - - this.x = this.clientX = domEvent.clientX; - this.y = this.clientY = domEvent.clientY; - - this.$pos = null; - this.$inSelection = null; - - this.propagationStopped = false; - this.defaultPrevented = false; -}; - -(function() { - - this.stopPropagation = function() { - event.stopPropagation(this.domEvent); - this.propagationStopped = true; + var el = gutterCell && gutterCell.element; + var anchorEl = el && (el.querySelector(".ace_gutter_annotation")); + if (!anchorEl) + return; + var r = anchorEl.getBoundingClientRect(); + if (!r) + return; + var position = { + pageX: r.right, + pageY: r.top + }; + return _super.prototype.$setPosition.call(this, editor, position, false, range); }; - - this.preventDefault = function() { - event.preventDefault(this.domEvent); - this.defaultPrevented = true; + GutterTooltip.prototype.$shouldPlaceAbove = function (labelHeight, anchorTop, spaceBelow) { + return spaceBelow < labelHeight; }; - - this.stop = function() { - this.stopPropagation(); - this.preventDefault(); + GutterTooltip.prototype.$findLinkedAnnotationNode = function (row) { + var cell = this.$findCellByRow(row); + if (cell) { + var element = cell.element; + if (element.childNodes.length > 2) { + return element.childNodes[2]; + } + } }; - this.getDocumentPosition = function() { - if (this.$pos) - return this.$pos; - - this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY); - return this.$pos; + GutterTooltip.prototype.$findCellByRow = function (row) { + return this.editor.renderer.$gutterLayer.$lines.cells.find(function (el) { return el.row === row; }); }; - this.inSelection = function() { - if (this.$inSelection !== null) - return this.$inSelection; - - var editor = this.editor; - - - var selectionRange = editor.getSelectionRange(); - if (selectionRange.isEmpty()) - this.$inSelection = false; - else { - var pos = this.getDocumentPosition(); - this.$inSelection = selectionRange.contains(pos.row, pos.column); + GutterTooltip.prototype.hide = function (e) { + if (!this.isOpen) { + return; } - - return this.$inSelection; + this.$element.removeAttribute("aria-live"); + if (this.visibleTooltipRow != undefined) { + var annotationNode = this.$findLinkedAnnotationNode(this.visibleTooltipRow); + if (annotationNode) { + annotationNode.removeAttribute("aria-describedby"); + } + } + this.visibleTooltipRow = undefined; + this.editor._signal("hideGutterTooltip", this); + _super.prototype.hide.call(this, e); }; - this.getButton = function() { - return event.getButton(this.domEvent); + GutterTooltip.annotationsToSummaryString = function (annotations) { + var e_1, _a; + var summary = []; + var annotationTypes = ["error", "security", "warning", "info", "hint"]; + try { + for (var annotationTypes_1 = __values(annotationTypes), annotationTypes_1_1 = annotationTypes_1.next(); !annotationTypes_1_1.done; annotationTypes_1_1 = annotationTypes_1.next()) { + var annotationType = annotationTypes_1_1.value; + if (!annotations[annotationType].length) + continue; + var label = annotations[annotationType].length === 1 ? GutterTooltip.annotationLabels[annotationType].singular : GutterTooltip.annotationLabels[annotationType].plural; + summary.push("".concat(annotations[annotationType].length, " ").concat(label)); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (annotationTypes_1_1 && !annotationTypes_1_1.done && (_a = annotationTypes_1.return)) _a.call(annotationTypes_1); + } + finally { if (e_1) throw e_1.error; } + } + return summary.join(", "); }; - this.getShiftKey = function() { - return this.domEvent.shiftKey; + GutterTooltip.prototype.isOutsideOfText = function (e) { + var editor = e.editor; + var rect = editor.renderer.$gutter.getBoundingClientRect(); + return !(e.clientX >= rect.left && e.clientX <= rect.right && + e.clientY >= rect.top && e.clientY <= rect.bottom); }; - - this.getAccelKey = useragent.isMac - ? function() { return this.domEvent.metaKey; } - : function() { return this.domEvent.ctrlKey; }; - -}).call(MouseEvent.prototype); + return GutterTooltip; +}(HoverTooltip)); +GutterTooltip.$uid = 0; +exports.GutterTooltip = GutterTooltip; }); -define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { -"use strict"; - +define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module){"use strict"; var dom = require("../lib/dom"); var event = require("../lib/event"); var useragent = require("../lib/useragent"); - var AUTOSCROLL_DELAY = 200; var SCROLL_CURSOR_DELAY = 200; var SCROLL_CURSOR_HYSTERESIS = 5; - function DragdropHandler(mouseHandler) { - var editor = mouseHandler.editor; - var dragImage = dom.createElement("div"); dragImage.style.cssText = "top:-100px;position:absolute;z-index:2147483647;opacity:0.5"; dragImage.textContent = "\xa0"; - var exports = ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"]; - - exports.forEach(function(x) { + exports.forEach(function (x) { mouseHandler[x] = this[x]; }, this); editor.on("mousedown", this.onMouseDown.bind(mouseHandler)); - var mouseTarget = editor.container; var dragSelectionMarker, x, y; var timerId, range; @@ -2866,34 +3824,29 @@ function DragdropHandler(mouseHandler) { var autoScrollStartTime; var cursorMovedTime; var cursorPointOnCaretMoved; - - this.onDragStart = function(e) { + this.onDragStart = function (e) { if (this.cancelDrag || !mouseTarget.draggable) { var self = this; - setTimeout(function(){ + setTimeout(function () { self.startSelect(); self.captureMouse(e); }, 0); return e.preventDefault(); } range = editor.getSelectionRange(); - var dataTransfer = e.dataTransfer; dataTransfer.effectAllowed = editor.getReadOnly() ? "copy" : "copyMove"; editor.container.appendChild(dragImage); - dataTransfer.setDragImage && dataTransfer.setDragImage(dragImage, 0, 0); - setTimeout(function() { + setTimeout(function () { editor.container.removeChild(dragImage); }); dataTransfer.clearData(); dataTransfer.setData("Text", editor.session.getTextRange()); - isInternal = true; this.setState("drag"); }; - - this.onDragEnd = function(e) { + this.onDragEnd = function (e) { mouseTarget.draggable = false; isInternal = false; this.setState(null); @@ -2906,8 +3859,7 @@ function DragdropHandler(mouseHandler) { this.editor.unsetStyle("ace_dragging"); this.editor.renderer.setCursorStyle(""); }; - - this.onDragEnter = function(e) { + this.onDragEnter = function (e) { if (editor.getReadOnly() || !canAccept(e.dataTransfer)) return; x = e.clientX; @@ -2918,8 +3870,7 @@ function DragdropHandler(mouseHandler) { e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); return event.preventDefault(e); }; - - this.onDragOver = function(e) { + this.onDragOver = function (e) { if (editor.getReadOnly() || !canAccept(e.dataTransfer)) return; x = e.clientX; @@ -2930,12 +3881,10 @@ function DragdropHandler(mouseHandler) { } if (onMouseMoveTimer !== null) onMouseMoveTimer = null; - e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); return event.preventDefault(e); }; - - this.onDragLeave = function(e) { + this.onDragLeave = function (e) { counter--; if (counter <= 0 && dragSelectionMarker) { clearDragMarker(); @@ -2943,8 +3892,7 @@ function DragdropHandler(mouseHandler) { return event.preventDefault(e); } }; - - this.onDrop = function(e) { + this.onDrop = function (e) { if (!dragCursor) return; var dataTransfer = e.dataTransfer; @@ -2956,7 +3904,8 @@ function DragdropHandler(mouseHandler) { start: dragCursor, end: dragCursor }; - } else { + } + else { range = editor.moveText(range, dragCursor); } break; @@ -2964,7 +3913,8 @@ function DragdropHandler(mouseHandler) { range = editor.moveText(range, dragCursor, true); break; } - } else { + } + else { var dropData = dataTransfer.getData('Text'); range = { start: dragCursor, @@ -2976,14 +3926,12 @@ function DragdropHandler(mouseHandler) { clearDragMarker(); return event.preventDefault(e); }; - event.addListener(mouseTarget, "dragstart", this.onDragStart.bind(mouseHandler), editor); event.addListener(mouseTarget, "dragend", this.onDragEnd.bind(mouseHandler), editor); event.addListener(mouseTarget, "dragenter", this.onDragEnter.bind(mouseHandler), editor); event.addListener(mouseTarget, "dragover", this.onDragOver.bind(mouseHandler), editor); event.addListener(mouseTarget, "dragleave", this.onDragLeave.bind(mouseHandler), editor); event.addListener(mouseTarget, "drop", this.onDrop.bind(mouseHandler), editor); - function scrollCursorIntoView(cursor, prevCursor) { var now = Date.now(); var vMovement = !prevCursor || cursor.row != prevCursor.row; @@ -2991,36 +3939,37 @@ function DragdropHandler(mouseHandler) { if (!cursorMovedTime || vMovement || hMovement) { editor.moveCursorToPosition(cursor); cursorMovedTime = now; - cursorPointOnCaretMoved = {x: x, y: y}; - } else { + cursorPointOnCaretMoved = { x: x, y: y }; + } + else { var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y); if (distance > SCROLL_CURSOR_HYSTERESIS) { cursorMovedTime = null; - } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) { + } + else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) { editor.renderer.scrollCursorIntoView(); cursorMovedTime = null; } } } - function autoScroll(cursor, prevCursor) { var now = Date.now(); var lineHeight = editor.renderer.layerConfig.lineHeight; var characterWidth = editor.renderer.layerConfig.characterWidth; var editorRect = editor.renderer.scroller.getBoundingClientRect(); var offsets = { - x: { - left: x - editorRect.left, - right: editorRect.right - x - }, - y: { - top: y - editorRect.top, - bottom: editorRect.bottom - y - } + x: { + left: x - editorRect.left, + right: editorRect.right - x + }, + y: { + top: y - editorRect.top, + bottom: editorRect.bottom - y + } }; var nearestXOffset = Math.min(offsets.x.left, offsets.x.right); var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom); - var scrollCursor = {row: cursor.row, column: cursor.column}; + var scrollCursor = { row: cursor.row, column: cursor.column }; if (nearestXOffset / characterWidth <= 2) { scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2); } @@ -3035,18 +3984,17 @@ function DragdropHandler(mouseHandler) { autoScrollStartTime = now; else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY) editor.renderer.scrollCursorIntoView(scrollCursor); - } else { + } + else { autoScrollStartTime = null; } } - function onDragInterval() { var prevCursor = dragCursor; dragCursor = editor.renderer.screenToTextCoordinates(x, y); scrollCursorIntoView(dragCursor, prevCursor); autoScroll(dragCursor, prevCursor); } - function addDragMarker() { range = editor.selection.toOrientedRange(); dragSelectionMarker = editor.session.addMarker(range, "ace_selection", editor.getSelectionStyle()); @@ -3059,7 +4007,6 @@ function DragdropHandler(mouseHandler) { counter = 0; event.addListener(document, "mousemove", onMouseMove); } - function clearDragMarker() { clearInterval(timerId); editor.session.removeMarker(dragSelectionMarker); @@ -3077,65 +4024,56 @@ function DragdropHandler(mouseHandler) { var onMouseMoveTimer = null; function onMouseMove() { if (onMouseMoveTimer == null) { - onMouseMoveTimer = setTimeout(function() { + onMouseMoveTimer = setTimeout(function () { if (onMouseMoveTimer != null && dragSelectionMarker) clearDragMarker(); }, 20); } } - function canAccept(dataTransfer) { var types = dataTransfer.types; - return !types || Array.prototype.some.call(types, function(type) { + return !types || Array.prototype.some.call(types, function (type) { return type == 'text/plain' || type == 'Text'; }); } - function getDropEffect(e) { var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized']; var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized']; - var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey; var effectAllowed = "uninitialized"; try { effectAllowed = e.dataTransfer.effectAllowed.toLowerCase(); - } catch (e) {} + } + catch (e) { } var dropEffect = "none"; - if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0) dropEffect = "copy"; else if (moveAllowed.indexOf(effectAllowed) >= 0) dropEffect = "move"; else if (copyAllowed.indexOf(effectAllowed) >= 0) dropEffect = "copy"; - return dropEffect; } } - -(function() { - - this.dragWait = function() { +(function () { + this.dragWait = function () { var interval = Date.now() - this.mousedownEvent.time; if (interval > this.editor.getDragDelay()) this.startDrag(); }; - - this.dragWaitEnd = function() { + this.dragWaitEnd = function () { var target = this.editor.container; target.draggable = false; this.startSelect(this.mousedownEvent.getDocumentPosition()); this.selectEnd(); }; - - this.dragReadyEnd = function(e) { + this.dragReadyEnd = function (e) { this.editor.$resetCursorStyle(); this.editor.unsetStyle("ace_dragging"); this.editor.renderer.setCursorStyle(""); this.dragWaitEnd(); }; - - this.startDrag = function(){ + this.startDrag = function () { this.cancelDrag = false; var editor = this.editor; var target = editor.container; @@ -3146,8 +4084,7 @@ function DragdropHandler(mouseHandler) { editor.renderer.setCursorStyle(cursorStyle); this.setState("dragReady"); }; - - this.onMouseDrag = function(e) { + this.onMouseDrag = function (e) { var target = this.editor.container; if (useragent.isIE && this.state == "dragReady") { var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); @@ -3162,13 +4099,11 @@ function DragdropHandler(mouseHandler) { } } }; - - this.onMouseDown = function(e) { + this.onMouseDown = function (e) { if (!this.$dragEnabled) return; this.mousedownEvent = e; var editor = this.editor; - var inSelection = e.inSelection(); var button = e.getButton(); var clickCount = e.domEvent.detail || 1; @@ -3186,33 +4121,27 @@ function DragdropHandler(mouseHandler) { mouseTarget.draggable = true; } this.setState("dragWait"); - } else { + } + else { this.startDrag(); } this.captureMouse(e, this.onMouseDrag.bind(this)); e.defaultPrevented = true; } }; - }).call(DragdropHandler.prototype); - - function calcDistance(ax, ay, bx, by) { return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); } - exports.DragdropHandler = DragdropHandler; }); -define("ace/mouse/touch_handler",["require","exports","module","ace/mouse/mouse_event","ace/lib/event","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/mouse/touch_handler",["require","exports","module","ace/mouse/mouse_event","ace/lib/event","ace/lib/dom"], function(require, exports, module){"use strict"; var MouseEvent = require("./mouse_event").MouseEvent; var event = require("../lib/event"); var dom = require("../lib/dom"); - -exports.addTouchListeners = function(el, editor) { +exports.addTouchListeners = function (el, editor) { var mode = "scroll"; var startX; var startY; @@ -3227,29 +4156,27 @@ exports.addTouchListeners = function(el, editor) { var vY = 0; var pressed; var contextMenu; - function createContextMenu() { var clipboard = window.navigator && window.navigator.clipboard; var isOpen = false; - var updateMenu = function() { + var updateMenu = function () { var selected = editor.getCopyText(); var hasUndo = editor.session.getUndoManager().hasUndo(); - contextMenu.replaceChild( - dom.buildDom(isOpen ? ["span", - !selected && ["span", { class: "ace_mobile-button", action: "selectall" }, "Select All"], - selected && ["span", { class: "ace_mobile-button", action: "copy" }, "Copy"], - selected && ["span", { class: "ace_mobile-button", action: "cut" }, "Cut"], - clipboard && ["span", { class: "ace_mobile-button", action: "paste" }, "Paste"], - hasUndo && ["span", { class: "ace_mobile-button", action: "undo" }, "Undo"], - ["span", { class: "ace_mobile-button", action: "find" }, "Find"], - ["span", { class: "ace_mobile-button", action: "openCommandPallete" }, "Pallete"] - ] : ["span"]), - contextMenu.firstChild - ); + contextMenu.replaceChild(dom.buildDom(isOpen ? ["span", + !selected && canExecuteCommand("selectall") && ["span", { class: "ace_mobile-button", action: "selectall" }, "Select All"], + selected && canExecuteCommand("copy") && ["span", { class: "ace_mobile-button", action: "copy" }, "Copy"], + selected && canExecuteCommand("cut") && ["span", { class: "ace_mobile-button", action: "cut" }, "Cut"], + clipboard && canExecuteCommand("paste") && ["span", { class: "ace_mobile-button", action: "paste" }, "Paste"], + hasUndo && canExecuteCommand("undo") && ["span", { class: "ace_mobile-button", action: "undo" }, "Undo"], + canExecuteCommand("find") && ["span", { class: "ace_mobile-button", action: "find" }, "Find"], + canExecuteCommand("openCommandPalette") && ["span", { class: "ace_mobile-button", action: "openCommandPalette" }, "Palette"] + ] : ["span"]), contextMenu.firstChild); + }; + var canExecuteCommand = function (/** @type {string} */ cmd) { + return editor.commands.canExecute(cmd, editor); }; - var handleClick = function(e) { + var handleClick = function (e) { var action = e.target.getAttribute("action"); - if (action == "more" || !isOpen) { isOpen = !isOpen; return updateMenu(); @@ -3270,31 +4197,38 @@ exports.addTouchListeners = function(el, editor) { } contextMenu.firstChild.style.display = "none"; isOpen = false; - if (action != "openCommandPallete") + if (action != "openCommandPalette") editor.focus(); }; contextMenu = dom.buildDom(["div", { class: "ace_mobile-menu", - ontouchstart: function(e) { - mode = "menu"; - e.stopPropagation(); - e.preventDefault(); - editor.textInput.focus(); - }, - ontouchend: function(e) { - e.stopPropagation(); - e.preventDefault(); - handleClick(e); - }, onclick: handleClick }, ["span"], ["span", { class: "ace_mobile-button", action: "more" }, "..."] ], editor.container); + contextMenu.addEventListener("touchstart", function (e) { + mode = "menu"; + e.stopPropagation(); + e.preventDefault(); + editor.textInput.focus(); + }); + contextMenu.addEventListener("touchend", function (e) { + e.stopPropagation(); + e.preventDefault(); + handleClick(e); + }); } function showContextMenu() { - if (!contextMenu) createContextMenu(); + if (!editor.getOption("enableMobileMenu")) { + if (contextMenu) { + hideContextMenu(); + } + return; + } + if (!contextMenu) + createContextMenu(); var cursor = editor.selection.cursor; var pagePos = editor.renderer.textToScreenCoordinates(cursor.row, cursor.column); var leftOffset = editor.renderer.textToScreenCoordinates(0, 0).pageX; @@ -3304,7 +4238,8 @@ exports.addTouchListeners = function(el, editor) { if (pagePos.pageX - rect.left < rect.width - 70) { contextMenu.style.left = ""; contextMenu.style.right = "10px"; - } else { + } + else { contextMenu.style.right = ""; contextMenu.style.left = leftOffset + scrollLeft - rect.left + "px"; } @@ -3317,7 +4252,6 @@ exports.addTouchListeners = function(el, editor) { contextMenu.style.display = "none"; editor.off("input", hideContextMenu); } - function handleLongTap() { longTouchTimer = null; clearTimeout(longTouchTimer); @@ -3339,13 +4273,15 @@ exports.addTouchListeners = function(el, editor) { : editor.session.getBracketRange(pos); if (range && !range.isEmpty()) { editor.selection.setRange(range); - } else { + } + else { editor.selection.selectWord(); } mode = "wait"; } - event.addListener(el, "contextmenu", function(e) { - if (!pressed) return; + event.addListener(el, "contextmenu", function (e) { + if (!pressed) + return; var textarea = editor.textInput.getElement(); textarea.focus(); }, editor); @@ -3358,7 +4294,6 @@ exports.addTouchListeners = function(el, editor) { mode = "zoom"; return; } - pressed = editor.$mouseHandler.isMousePressed = true; var h = editor.renderer.layerConfig.lineHeight; var w = editor.renderer.layerConfig.lineHeight; @@ -3369,51 +4304,39 @@ exports.addTouchListeners = function(el, editor) { var y = touchObj.clientY; if (Math.abs(startX - x) + Math.abs(startY - y) > h) touchStartT = -1; - startX = e.clientX = x; startY = e.clientY = y; vX = vY = 0; - var ev = new MouseEvent(e, editor); pos = ev.getDocumentPosition(); - if (t - touchStartT < 500 && touches.length == 1 && !animationSteps) { clickCount++; e.preventDefault(); e.button = 0; switchToSelectionMode(); - } else { + } + else { clickCount = 0; var cursor = editor.selection.cursor; var anchor = editor.selection.isEmpty() ? cursor : editor.selection.anchor; - var cursorPos = editor.renderer.$cursorLayer.getPixelPosition(cursor, true); var anchorPos = editor.renderer.$cursorLayer.getPixelPosition(anchor, true); var rect = editor.renderer.scroller.getBoundingClientRect(); var offsetTop = editor.renderer.layerConfig.offset; var offsetLeft = editor.renderer.scrollLeft; - var weightedDistance = function(x, y) { + var weightedDistance = function (x, y) { x = x / w; y = y / h - 0.75; return x * x + y * y; }; - if (e.clientX < rect.left) { mode = "zoom"; return; } - - var diff1 = weightedDistance( - e.clientX - rect.left - cursorPos.left + offsetLeft, - e.clientY - rect.top - cursorPos.top + offsetTop - ); - var diff2 = weightedDistance( - e.clientX - rect.left - anchorPos.left + offsetLeft, - e.clientY - rect.top - anchorPos.top + offsetTop - ); + var diff1 = weightedDistance(e.clientX - rect.left - cursorPos.left + offsetLeft, e.clientY - rect.top - cursorPos.top + offsetTop); + var diff2 = weightedDistance(e.clientX - rect.left - anchorPos.left + offsetLeft, e.clientY - rect.top - anchorPos.top + offsetTop); if (diff1 < 3.5 && diff2 < 3.5) mode = diff1 > diff2 ? "cursor" : "anchor"; - if (diff2 < 3.5) mode = "anchor"; else if (diff1 < 3.5) @@ -3424,21 +4347,24 @@ exports.addTouchListeners = function(el, editor) { } touchStartT = t; }, editor); - event.addListener(el, "touchend", function (e) { pressed = editor.$mouseHandler.isMousePressed = false; - if (animationTimer) clearInterval(animationTimer); + if (animationTimer) + clearInterval(animationTimer); if (mode == "zoom") { mode = ""; animationSteps = 0; - } else if (longTouchTimer) { + } + else if (longTouchTimer) { editor.selection.moveToPosition(pos); animationSteps = 0; showContextMenu(); - } else if (mode == "scroll") { + } + else if (mode == "scroll") { animate(); hideContextMenu(); - } else { + } + else { showContextMenu(); } clearTimeout(longTouchTimer); @@ -3450,26 +4376,21 @@ exports.addTouchListeners = function(el, editor) { longTouchTimer = null; } var touches = e.touches; - if (touches.length > 1 || mode == "zoom") return; - + if (touches.length > 1 || mode == "zoom") + return; var touchObj = touches[0]; - var wheelX = startX - touchObj.clientX; var wheelY = startY - touchObj.clientY; - if (mode == "wait") { if (wheelX * wheelX + wheelY * wheelY > 4) mode = "cursor"; else return e.preventDefault(); } - startX = touchObj.clientX; startY = touchObj.clientY; - e.clientX = touchObj.clientX; e.clientY = touchObj.clientY; - var t = e.timeStamp; var dt = t - lastT; lastT = t; @@ -3478,8 +4399,10 @@ exports.addTouchListeners = function(el, editor) { mouseEvent.speed = 1; mouseEvent.wheelX = wheelX; mouseEvent.wheelY = wheelY; - if (10 * Math.abs(wheelX) < Math.abs(wheelY)) wheelX = 0; - if (10 * Math.abs(wheelY) < Math.abs(wheelX)) wheelY = 0; + if (10 * Math.abs(wheelX) < Math.abs(wheelY)) + wheelX = 0; + if (10 * Math.abs(wheelY) < Math.abs(wheelX)) + wheelY = 0; if (dt != 0) { vX = wheelX / dt; vY = wheelY / dt; @@ -3500,18 +4423,21 @@ exports.addTouchListeners = function(el, editor) { e.preventDefault(); } }, editor); - function animate() { animationSteps += 60; - animationTimer = setInterval(function() { + animationTimer = setInterval(function () { if (animationSteps-- <= 0) { clearInterval(animationTimer); animationTimer = null; } - if (Math.abs(vX) < 0.01) vX = 0; - if (Math.abs(vY) < 0.01) vY = 0; - if (animationSteps < 20) vX = 0.9 * vX; - if (animationSteps < 20) vY = 0.9 * vY; + if (Math.abs(vX) < 0.01) + vX = 0; + if (Math.abs(vY) < 0.01) + vY = 0; + if (animationSteps < 20) + vX = 0.9 * vX; + if (animationSteps < 20) + vY = 0.9 * vY; var oldScrollTop = editor.session.getScrollTop(); editor.renderer.scrollBy(10 * vX, 10 * vY); if (oldScrollTop == editor.session.getScrollTop()) @@ -3522,1674 +4448,1067 @@ exports.addTouchListeners = function(el, editor) { }); -define("ace/lib/net",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; -var dom = require("./dom"); - -exports.get = function (url, callback) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - callback(xhr.responseText); - } +define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/mouse/touch_handler","ace/config"], function(require, exports, module){"use strict"; +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var DefaultHandlers = require("./default_handlers").DefaultHandlers; +var DefaultGutterHandler = require("./default_gutter_handler").GutterHandler; +var MouseEvent = require("./mouse_event").MouseEvent; +var DragdropHandler = require("./dragdrop_handler").DragdropHandler; +var addTouchListeners = require("./touch_handler").addTouchListeners; +var config = require("../config"); +var MouseHandler = /** @class */ (function () { + function MouseHandler(editor) { this.$dragDelay; this.$dragEnabled; this.$mouseMoved; this.mouseEvent; this.$focusTimeout; + var _self = this; + this.editor = editor; + new DefaultHandlers(this); + new DefaultGutterHandler(this); + new DragdropHandler(this); + var focusEditor = function (e) { + var windowBlurred = !document.hasFocus || !document.hasFocus() + || !editor.isFocused() && document.activeElement == (editor.textInput && editor.textInput.getElement()); + if (windowBlurred) + window.focus(); + editor.focus(); + setTimeout(function () { + if (!editor.isFocused()) + editor.focus(); + }); + }; + var mouseTarget = editor.renderer.getMouseEventTarget(); + event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click"), editor); + event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove"), editor); + event.addMultiMouseDownListener([ + mouseTarget, + editor.renderer.scrollBarV && editor.renderer.scrollBarV.inner, + editor.renderer.scrollBarH && editor.renderer.scrollBarH.inner, + editor.textInput && editor.textInput.getElement() + ].filter(Boolean), [400, 300, 250], this, "onMouseEvent", editor); + event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel"), editor); + addTouchListeners(editor.container, editor); + var gutterEl = editor.renderer.$gutter; + event.addListener(gutterEl, "mousedown", this.onMouseEvent.bind(this, "guttermousedown"), editor); + event.addListener(gutterEl, "click", this.onMouseEvent.bind(this, "gutterclick"), editor); + event.addListener(gutterEl, "dblclick", this.onMouseEvent.bind(this, "gutterdblclick"), editor); + event.addListener(gutterEl, "mousemove", this.onMouseEvent.bind(this, "guttermousemove"), editor); + event.addListener(mouseTarget, "mousedown", focusEditor, editor); + event.addListener(gutterEl, "mousedown", focusEditor, editor); + if (useragent.isIE && editor.renderer.scrollBarV) { + event.addListener(editor.renderer.scrollBarV.element, "mousedown", focusEditor, editor); + event.addListener(editor.renderer.scrollBarH.element, "mousedown", focusEditor, editor); + } + editor.on("mousemove", function (e) { + if (_self.state || _self.$dragDelay || !_self.$dragEnabled) + return; + var character = editor.renderer.screenToTextCoordinates(e.x, e.y); + var range = editor.session.selection.getRange(); + var renderer = editor.renderer; + if (!range.isEmpty() && range.insideStart(character.row, character.column)) { + renderer.setCursorStyle("default"); + } + else { + renderer.setCursorStyle(""); + } + }, //@ts-expect-error TODO: seems mistyping - should be boolean + editor); + } + MouseHandler.prototype.onMouseEvent = function (name, e) { + if (!this.editor.session) + return; + this.editor._emit(name, new MouseEvent(e, this.editor)); }; - xhr.send(null); -}; - -exports.loadScript = function(path, callback) { - var head = dom.getDocumentHead(); - var s = document.createElement('script'); - - s.src = path; - head.appendChild(s); - - s.onload = s.onreadystatechange = function(_, isAbort) { - if (isAbort || !s.readyState || s.readyState == "loaded" || s.readyState == "complete") { - s = s.onload = s.onreadystatechange = null; - if (!isAbort) - callback(); + MouseHandler.prototype.onMouseMove = function (name, e) { + var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove; + if (!listeners || !listeners.length) + return; + this.editor._emit(name, new MouseEvent(e, this.editor)); + }; + MouseHandler.prototype.onMouseWheel = function (name, e) { + var mouseEvent = new MouseEvent(e, this.editor); + mouseEvent.speed = this.$scrollSpeed * 2; + mouseEvent.wheelX = e.wheelX; + mouseEvent.wheelY = e.wheelY; + this.editor._emit(name, mouseEvent); + }; + MouseHandler.prototype.setState = function (state) { + this.state = state; + }; + MouseHandler.prototype.captureMouse = function (ev, mouseMoveHandler) { + this.x = ev.x; + this.y = ev.y; + this.isMousePressed = true; + var editor = this.editor; + var renderer = this.editor.renderer; + renderer.$isMousePressed = true; + var self = this; + var continueCapture = true; + var onMouseMove = function (e) { + if (!e) + return; + if (useragent.isWebKit && !e.which && self.releaseMouse) + return self.releaseMouse(); + self.x = e.clientX; + self.y = e.clientY; + mouseMoveHandler && mouseMoveHandler(e); + self.mouseEvent = new MouseEvent(e, self.editor); + self.$mouseMoved = true; + }; + var onCaptureEnd = function (e) { + editor.off("beforeEndOperation", onOperationEnd); + continueCapture = false; + if (editor.session) + onCaptureUpdate(); + self[self.state + "End"] && self[self.state + "End"](e); + self.state = ""; + self.isMousePressed = renderer.$isMousePressed = false; + if (renderer.$keepTextAreaAtCursor) + renderer.$moveTextAreaToCursor(); + self.$onCaptureMouseMove = self.releaseMouse = null; + e && self.onMouseEvent("mouseup", e); + editor.endOperation(); + }; + var onCaptureUpdate = function () { + self[self.state] && self[self.state](); + self.$mouseMoved = false; + }; + var onCaptureInterval = function () { + if (continueCapture) { + onCaptureUpdate(); + event.nextFrame(onCaptureInterval); + } + }; + if (useragent.isOldIE && ev.domEvent.type == "dblclick") { + return setTimeout(function () { onCaptureEnd(ev); }); } + var onOperationEnd = function (e) { + if (!self.releaseMouse) + return; + if (editor.curOp.command.name && editor.curOp.selectionChanged) { + self[self.state + "End"] && self[self.state + "End"](); + self.state = ""; + self.releaseMouse(); + } + }; + editor.on("beforeEndOperation", onOperationEnd); + editor.startOperation({ command: { name: "mouse" } }); + self.$onCaptureMouseMove = onMouseMove; + self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd); + onCaptureInterval(); }; -}; -exports.qualifyURL = function(url) { - var a = document.createElement('a'); - a.href = url; - return a.href; -}; - + MouseHandler.prototype.cancelContextMenu = function () { + var stop = function (e) { + if (e && e.domEvent && e.domEvent.type != "contextmenu") + return; + this.editor.off("nativecontextmenu", stop); + if (e && e.domEvent) + event.stopEvent(e.domEvent); + }.bind(this); + setTimeout(stop, 10); + this.editor.on("nativecontextmenu", stop); + }; + MouseHandler.prototype.destroy = function () { + if (this.releaseMouse) + this.releaseMouse(); + if (this.$tooltip) + this.$tooltip.destroy(); + }; + return MouseHandler; +}()); +MouseHandler.prototype.releaseMouse = null; +config.defineOptions(MouseHandler.prototype, "mouseHandler", { + scrollSpeed: { initialValue: 2 }, + dragDelay: { initialValue: (useragent.isMac ? 150 : 0) }, + dragEnabled: { initialValue: true }, + focusTimeout: { initialValue: 0 }, }); +exports.MouseHandler = MouseHandler; -define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) { -"use strict"; - -var EventEmitter = {}; -var stopPropagation = function() { this.propagationStopped = true; }; -var preventDefault = function() { this.defaultPrevented = true; }; - -EventEmitter._emit = -EventEmitter._dispatchEvent = function(eventName, e) { - this._eventRegistry || (this._eventRegistry = {}); - this._defaultHandlers || (this._defaultHandlers = {}); - - var listeners = this._eventRegistry[eventName] || []; - var defaultHandler = this._defaultHandlers[eventName]; - if (!listeners.length && !defaultHandler) - return; - - if (typeof e != "object" || !e) - e = {}; - - if (!e.type) - e.type = eventName; - if (!e.stopPropagation) - e.stopPropagation = stopPropagation; - if (!e.preventDefault) - e.preventDefault = preventDefault; - - listeners = listeners.slice(); - for (var i=0; i 0) { + if (action == 0x10) { + for (i = condPos; i < ix; i++) { + levels[i] = 1; + } + condPos = -1; + } + else { + condPos = -1; + } + } + cond = impTab[newState][6]; + if (cond) { + if (condPos == -1) { + condPos = ix; + } + } + else { + if (condPos > -1) { + for (i = condPos; i < ix; i++) { + levels[i] = newLevel; + } + condPos = -1; + } + } + if (charTypes[ix] == B) { + levels[ix] = 0; + } + hiLevel |= newLevel; + } + if (hasUBAT_S) { + for (i = 0; i < len; i++) { + if (charTypes[i] == S) { + levels[i] = dir; + for (var j = i - 1; j >= 0; j--) { + if (charTypes[j] == WS) { + levels[j] = dir; + } + else { + break; + } + } + } } - if (opt.forwardTo) - return this[opt.forwardTo] && this[opt.forwardTo].getOption(name); - return opt && opt.get ? opt.get.call(this) : this["$" + name]; } -}; - -function warn(message) { - if (typeof console != "undefined" && console.warn) - console.warn.apply(console, arguments); } - -function reportError(msg, data) { - var e = new Error(msg); - e.data = data; - if (typeof console == "object" && console.error) - console.error(e); - setTimeout(function() { throw e; }); +function _invertLevel(lev, levels, _array) { + if (hiLevel < lev) { + return; + } + if (lev == 1 && dir == RTL && !hasUBAT_B) { + _array.reverse(); + return; + } + var len = _array.length, start = 0, end, lo, hi, tmp; + while (start < len) { + if (levels[start] >= lev) { + end = start + 1; + while (end < len && levels[end] >= lev) { + end++; + } + for (lo = start, hi = end - 1; lo < hi; lo++, hi--) { + tmp = _array[lo]; + _array[lo] = _array[hi]; + _array[hi] = tmp; + } + start = end; + } + start++; + } } - -var AppConfig = function() { - this.$defaultOptions = {}; +function _getCharClass(chars, types, classes, ix) { + var cType = types[ix], wType, nType, len, i; + switch (cType) { + case L: + case R: + lastArabic = false; + case ON: + case AN: + return cType; + case EN: + return lastArabic ? AN : EN; + case AL: + lastArabic = true; + hasUBAT_AL = true; + return R; + case WS: + return ON; + case CS: + if (ix < 1 || (ix + 1) >= types.length || + ((wType = classes[ix - 1]) != EN && wType != AN) || + ((nType = types[ix + 1]) != EN && nType != AN)) { + return ON; + } + if (lastArabic) { + nType = AN; + } + return nType == wType ? nType : ON; + case ES: + wType = ix > 0 ? classes[ix - 1] : B; + if (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN) { + return EN; + } + return ON; + case ET: + if (ix > 0 && classes[ix - 1] == EN) { + return EN; + } + if (lastArabic) { + return ON; + } + i = ix + 1; + len = types.length; + while (i < len && types[i] == ET) { + i++; + } + if (i < len && types[i] == EN) { + return EN; + } + return ON; + case NSM: + len = types.length; + i = ix + 1; + while (i < len && types[i] == NSM) { + i++; + } + if (i < len) { + var c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E; + wType = types[i]; + if (rtlCandidate && (wType == R || wType == AL)) { + return R; + } + } + if (ix < 1 || (wType = types[ix - 1]) == B) { + return ON; + } + return classes[ix - 1]; + case B: + lastArabic = false; + hasUBAT_B = true; + return dir; + case S: + hasUBAT_S = true; + return ON; + case LRE: + case RLE: + case LRO: + case RLO: + case PDF: + lastArabic = false; + case BN: + return ON; + } +} +function _getCharacterType(ch) { + var uc = ch.charCodeAt(0), hi = uc >> 8; + if (hi == 0) { + return ((uc > 0x00BF) ? L : UnicodeTBL00[uc]); + } + else if (hi == 5) { + return (/[\u0591-\u05f4]/.test(ch) ? R : L); + } + else if (hi == 6) { + if (/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(ch)) + return NSM; + else if (/[\u0660-\u0669\u066b-\u066c]/.test(ch)) + return AN; + else if (uc == 0x066A) + return ET; + else if (/[\u06f0-\u06f9]/.test(ch)) + return EN; + else + return AL; + } + else if (hi == 0x20 && uc <= 0x205F) { + return UnicodeTBL20[uc & 0xFF]; + } + else if (hi == 0xFE) { + return (uc >= 0xFE70 ? AL : ON); + } + return ON; +} +function _isArabicDiacritics(ch) { + return (ch >= '\u064b' && ch <= '\u0655'); +} +exports.L = L; +exports.R = R; +exports.EN = EN; +exports.ON_R = 3; +exports.AN = 4; +exports.R_H = 5; +exports.B = 6; +exports.RLE = 7; +exports.DOT = "\xB7"; +exports.doBidiReorder = function (text, textCharTypes, isRtl) { + if (text.length < 2) + return {}; + var chars = text.split(""), logicalFromVisual = new Array(chars.length), bidiLevels = new Array(chars.length), levels = []; + dir = isRtl ? RTL : LTR; + _computeLevels(chars, levels, chars.length, textCharTypes); + for (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++) + ; + _invertLevel(2, levels, logicalFromVisual); + _invertLevel(1, levels, logicalFromVisual); + for (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width + if (textCharTypes[i] === AN) { + levels[i] = exports.AN; + } + else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE) + || textCharTypes[i] === ON || textCharTypes[i] === BN)) { + levels[i] = exports.ON_R; + } + else if ((i > 0 && chars[i - 1] === '\u0644') && /\u0622|\u0623|\u0625|\u0627/.test(chars[i])) { + levels[i - 1] = levels[i] = exports.R_H; + i++; + } + } + if (chars[chars.length - 1] === exports.DOT) + levels[chars.length - 1] = exports.B; + if (chars[0] === '\u202B') + levels[0] = exports.RLE; + for (var i = 0; i < logicalFromVisual.length; i++) { + bidiLevels[i] = levels[logicalFromVisual[i]]; + } + return { 'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels }; +}; +exports.hasBidiCharacters = function (text, textCharTypes) { + var ret = false; + for (var i = 0; i < text.length; i++) { + textCharTypes[i] = _getCharacterType(text.charAt(i)); + if (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL || textCharTypes[i] == AN)) + ret = true; + } + return ret; +}; +exports.getVisualFromLogicalIdx = function (logIdx, rowMap) { + for (var i = 0; i < rowMap.logicalFromVisual.length; i++) { + if (rowMap.logicalFromVisual[i] == logIdx) + return i; + } + return 0; }; -(function() { - oop.implement(this, EventEmitter); - this.defineOptions = function(obj, path, options) { - if (!obj.$options) - this.$defaultOptions[path] = obj.$options = {}; - - Object.keys(options).forEach(function(key) { - var opt = options[key]; - if (typeof opt == "string") - opt = {forwardTo: opt}; - - opt.name || (opt.name = key); - obj.$options[opt.name] = opt; - if ("initialValue" in opt) - obj["$" + opt.name] = opt.initialValue; - }); - oop.implement(obj, optionsProvider); - - return this; - }; +}); - this.resetOptions = function(obj) { - Object.keys(obj.$options).forEach(function(key) { - var opt = obj.$options[key]; - if ("value" in opt) - obj.setOption(key, opt.value); - }); +define("ace/bidihandler",["require","exports","module","ace/lib/bidiutil","ace/lib/lang"], function(require, exports, module){"use strict"; +var bidiUtil = require("./lib/bidiutil"); +var lang = require("./lib/lang"); +var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\u202B]/; +var BidiHandler = /** @class */ (function () { + function BidiHandler(session) { + this.session = session; + this.bidiMap = {}; + this.currentRow = null; + this.bidiUtil = bidiUtil; + this.charWidths = []; + this.EOL = "\xAC"; + this.showInvisibles = true; + this.isRtlDir = false; + this.$isRtl = false; + this.line = ""; + this.wrapIndent = 0; + this.EOF = "\xB6"; + this.RLE = "\u202B"; + this.contentWidth = 0; + this.fontMetrics = null; + this.rtlLineOffset = 0; + this.wrapOffset = 0; + this.isMoveLeftOperation = false; + this.seenBidi = bidiRE.test(session.getValue()); + } + BidiHandler.prototype.isBidiRow = function (screenRow, docRow, splitIndex) { + if (!this.seenBidi) + return false; + if (screenRow !== this.currentRow) { + this.currentRow = screenRow; + this.updateRowLine(docRow, splitIndex); + this.updateBidiMap(); + } + return this.bidiMap.bidiLevels; }; - - this.setDefaultValue = function(path, name, value) { - if (!path) { - for (path in this.$defaultOptions) - if (this.$defaultOptions[path][name]) - break; - if (!this.$defaultOptions[path][name]) - return false; + BidiHandler.prototype.onChange = function (delta) { + if (!this.seenBidi) { + if (delta.action == "insert" && bidiRE.test(delta.lines.join("\n"))) { + this.seenBidi = true; + this.currentRow = null; + } } - var opts = this.$defaultOptions[path] || (this.$defaultOptions[path] = {}); - if (opts[name]) { - if (opts.forwardTo) - this.setDefaultValue(opts.forwardTo, name, value); - else - opts[name].value = value; + else { + this.currentRow = null; } }; - - this.setDefaultValues = function(path, optionHash) { - Object.keys(optionHash).forEach(function(key) { - this.setDefaultValue(path, key, optionHash[key]); - }, this); - }; - - this.warn = warn; - this.reportError = reportError; - -}).call(AppConfig.prototype); - -exports.AppConfig = AppConfig; - -}); - -define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/lib/net","ace/lib/dom","ace/lib/app_config"], function(require, exports, module) { -"no use strict"; - -var lang = require("./lib/lang"); -var oop = require("./lib/oop"); -var net = require("./lib/net"); -var dom = require("./lib/dom"); -var AppConfig = require("./lib/app_config").AppConfig; - -module.exports = exports = new AppConfig(); - -var global = (function() { - return this || typeof window != "undefined" && window; -})(); - -var options = { - packaged: false, - workerPath: null, - modePath: null, - themePath: null, - basePath: "", - suffix: ".js", - $moduleUrls: {}, - loadWorkerFromBlob: true, - sharedPopups: false, - useStrictCSP: null -}; - -exports.get = function(key) { - if (!options.hasOwnProperty(key)) - throw new Error("Unknown config key: " + key); - return options[key]; -}; - -exports.set = function(key, value) { - if (options.hasOwnProperty(key)) - options[key] = value; - else if (this.setDefaultValue("", key, value) == false) - throw new Error("Unknown config key: " + key); - if (key == "useStrictCSP") - dom.useStrictCSP(value); -}; - -exports.all = function() { - return lang.copyObject(options); -}; - -exports.$modes = {}; -exports.moduleUrl = function(name, component) { - if (options.$moduleUrls[name]) - return options.$moduleUrls[name]; - - var parts = name.split("/"); - component = component || parts[parts.length - 2] || ""; - var sep = component == "snippets" ? "/" : "-"; - var base = parts[parts.length - 1]; - if (component == "worker" && sep == "-") { - var re = new RegExp("^" + component + "[\\-_]|[\\-_]" + component + "$", "g"); - base = base.replace(re, ""); - } - - if ((!base || base == component) && parts.length > 1) - base = parts[parts.length - 2]; - var path = options[component + "Path"]; - if (path == null) { - path = options.basePath; - } else if (sep == "/") { - component = sep = ""; - } - if (path && path.slice(-1) != "/") - path += "/"; - return path + component + sep + base + this.get("suffix"); -}; - -exports.setModuleUrl = function(name, subst) { - return options.$moduleUrls[name] = subst; -}; - -exports.$loading = {}; -exports.loadModule = function(moduleName, onLoad) { - var module, moduleType; - if (Array.isArray(moduleName)) { - moduleType = moduleName[0]; - moduleName = moduleName[1]; - } - - try { - module = require(moduleName); - } catch (e) {} - if (module && !exports.$loading[moduleName]) - return onLoad && onLoad(module); - - if (!exports.$loading[moduleName]) - exports.$loading[moduleName] = []; - - exports.$loading[moduleName].push(onLoad); - - if (exports.$loading[moduleName].length > 1) - return; - - var afterLoad = function() { - require([moduleName], function(module) { - exports._emit("load.module", {name: moduleName, module: module}); - var listeners = exports.$loading[moduleName]; - exports.$loading[moduleName] = null; - listeners.forEach(function(onLoad) { - onLoad && onLoad(module); - }); - }); + BidiHandler.prototype.getDocumentRow = function () { + var docRow = 0; + var rowCache = this.session.$screenRowCache; + if (rowCache.length) { + var index = this.session.$getRowCacheIndex(rowCache, this.currentRow); + if (index >= 0) + docRow = this.session.$docRowCache[index]; + } + return docRow; }; - - if (!exports.get("packaged")) - return afterLoad(); - - net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); - reportErrorIfPathIsNotConfigured(); -}; - -var reportErrorIfPathIsNotConfigured = function() { - if ( - !options.basePath && !options.workerPath - && !options.modePath && !options.themePath - && !Object.keys(options.$moduleUrls).length - ) { - console.error( - "Unable to infer path to ace from script src,", - "use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes", - "or with webpack use ace/webpack-resolver" - ); - reportErrorIfPathIsNotConfigured = function() {}; - } -}; -init(true);function init(packaged) { - - if (!global || !global.document) - return; - - options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged); - - var scriptOptions = {}; - var scriptUrl = ""; - var currentScript = (document.currentScript || document._currentScript ); // native or polyfill - var currentDocument = currentScript && currentScript.ownerDocument || document; - - var scripts = currentDocument.getElementsByTagName("script"); - for (var i=0; i 0) { + currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1); + if (currentIndex !== prevIndex) + break; + prevIndex = currentIndex; + splitIndex++; } } - - var m = src.match(/^(.*)\/ace(\-\w+)?\.js(\?|$)/); - if (m) - scriptUrl = m[1]; - } - - if (scriptUrl) { - scriptOptions.base = scriptOptions.base || scriptUrl; - scriptOptions.packaged = true; - } - - scriptOptions.basePath = scriptOptions.base; - scriptOptions.workerPath = scriptOptions.workerPath || scriptOptions.base; - scriptOptions.modePath = scriptOptions.modePath || scriptOptions.base; - scriptOptions.themePath = scriptOptions.themePath || scriptOptions.base; - delete scriptOptions.base; - - for (var key in scriptOptions) - if (typeof scriptOptions[key] !== "undefined") - exports.set(key, scriptOptions[key]); -} - -exports.init = init; - -function deHyphenate(str) { - return str.replace(/-(.)/g, function(m, m1) { return m1.toUpperCase(); }); -} - -exports.version = "1.7.1"; - -}); - -define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/mouse/touch_handler","ace/config"], function(require, exports, module) { -"use strict"; - -var event = require("../lib/event"); -var useragent = require("../lib/useragent"); -var DefaultHandlers = require("./default_handlers").DefaultHandlers; -var DefaultGutterHandler = require("./default_gutter_handler").GutterHandler; -var MouseEvent = require("./mouse_event").MouseEvent; -var DragdropHandler = require("./dragdrop_handler").DragdropHandler; -var addTouchListeners = require("./touch_handler").addTouchListeners; -var config = require("../config"); - -var MouseHandler = function(editor) { - var _self = this; - this.editor = editor; - - new DefaultHandlers(this); - new DefaultGutterHandler(this); - new DragdropHandler(this); - - var focusEditor = function(e) { - var windowBlurred = !document.hasFocus || !document.hasFocus() - || !editor.isFocused() && document.activeElement == (editor.textInput && editor.textInput.getElement()); - if (windowBlurred) - window.focus(); - editor.focus(); - setTimeout(function () { - if (!editor.isFocused()) editor.focus(); + else { + splitIndex = this.currentRow; + } + return splitIndex; + }; + BidiHandler.prototype.updateRowLine = function (docRow, splitIndex) { + if (docRow === undefined) + docRow = this.getDocumentRow(); + var isLastRow = (docRow === this.session.getLength() - 1), endOfLine = isLastRow ? this.EOF : this.EOL; + this.wrapIndent = 0; + this.line = this.session.getLine(docRow); + this.isRtlDir = this.$isRtl || this.line.charAt(0) === this.RLE; + if (this.session.$useWrapMode) { + var splits = this.session.$wrapData[docRow]; + if (splits) { + if (splitIndex === undefined) + splitIndex = this.getSplitIndex(); + if (splitIndex > 0 && splits.length) { + this.wrapIndent = splits.indent; + this.wrapOffset = this.wrapIndent * this.charWidths[bidiUtil.L]; + this.line = (splitIndex < splits.length) ? + this.line.substring(splits[splitIndex - 1], splits[splitIndex]) : + this.line.substring(splits[splits.length - 1]); + } + else { + this.line = this.line.substring(0, splits[splitIndex]); + } + if (splitIndex == splits.length) { + this.line += (this.showInvisibles) ? endOfLine : bidiUtil.DOT; + } + } + } + else { + this.line += this.showInvisibles ? endOfLine : bidiUtil.DOT; + } + var session = this.session, shift = 0, size; + this.line = this.line.replace(/\t|[\u1100-\u2029, \u202F-\uFFE6]/g, function (ch, i) { + if (ch === '\t' || session.isFullWidth(ch.charCodeAt(0))) { + size = (ch === '\t') ? session.getScreenTabSize(i + shift) : 2; + shift += size - 1; + return lang.stringRepeat(bidiUtil.DOT, size); + } + return ch; }); + if (this.isRtlDir) { + this.fontMetrics.$main.textContent = (this.line.charAt(this.line.length - 1) == bidiUtil.DOT) ? this.line.substr(0, this.line.length - 1) : this.line; + this.rtlLineOffset = this.contentWidth - this.fontMetrics.$main.getBoundingClientRect().width; + } }; - - var mouseTarget = editor.renderer.getMouseEventTarget(); - event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click"), editor); - event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove"), editor); - event.addMultiMouseDownListener([ - mouseTarget, - editor.renderer.scrollBarV && editor.renderer.scrollBarV.inner, - editor.renderer.scrollBarH && editor.renderer.scrollBarH.inner, - editor.textInput && editor.textInput.getElement() - ].filter(Boolean), [400, 300, 250], this, "onMouseEvent", editor); - event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel"), editor); - addTouchListeners(editor.container, editor); - - var gutterEl = editor.renderer.$gutter; - event.addListener(gutterEl, "mousedown", this.onMouseEvent.bind(this, "guttermousedown"), editor); - event.addListener(gutterEl, "click", this.onMouseEvent.bind(this, "gutterclick"), editor); - event.addListener(gutterEl, "dblclick", this.onMouseEvent.bind(this, "gutterdblclick"), editor); - event.addListener(gutterEl, "mousemove", this.onMouseEvent.bind(this, "guttermousemove"), editor); - - event.addListener(mouseTarget, "mousedown", focusEditor, editor); - event.addListener(gutterEl, "mousedown", focusEditor, editor); - if (useragent.isIE && editor.renderer.scrollBarV) { - event.addListener(editor.renderer.scrollBarV.element, "mousedown", focusEditor, editor); - event.addListener(editor.renderer.scrollBarH.element, "mousedown", focusEditor, editor); - } - - editor.on("mousemove", function(e){ - if (_self.state || _self.$dragDelay || !_self.$dragEnabled) - return; - - var character = editor.renderer.screenToTextCoordinates(e.x, e.y); - var range = editor.session.selection.getRange(); - var renderer = editor.renderer; - - if (!range.isEmpty() && range.insideStart(character.row, character.column)) { - renderer.setCursorStyle("default"); - } else { - renderer.setCursorStyle(""); + BidiHandler.prototype.updateBidiMap = function () { + var textCharTypes = []; + if (bidiUtil.hasBidiCharacters(this.line, textCharTypes) || this.isRtlDir) { + this.bidiMap = bidiUtil.doBidiReorder(this.line, textCharTypes, this.isRtlDir); + } + else { + this.bidiMap = {}; } - }, editor); -}; - -(function() { - this.onMouseEvent = function(name, e) { - if (!this.editor.session) return; - this.editor._emit(name, new MouseEvent(e, this.editor)); }; - - this.onMouseMove = function(name, e) { - var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove; - if (!listeners || !listeners.length) + BidiHandler.prototype.markAsDirty = function () { + this.currentRow = null; + }; + BidiHandler.prototype.updateCharacterWidths = function (fontMetrics) { + if (this.characterWidth === fontMetrics.$characterSize.width) return; - - this.editor._emit(name, new MouseEvent(e, this.editor)); + this.fontMetrics = fontMetrics; + var characterWidth = this.characterWidth = fontMetrics.$characterSize.width; + var bidiCharWidth = fontMetrics.$measureCharWidth("\u05d4"); + this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth; + this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth; + this.charWidths[bidiUtil.R_H] = bidiCharWidth * 0.45; + this.charWidths[bidiUtil.B] = this.charWidths[bidiUtil.RLE] = 0; + this.currentRow = null; }; - - this.onMouseWheel = function(name, e) { - var mouseEvent = new MouseEvent(e, this.editor); - mouseEvent.speed = this.$scrollSpeed * 2; - mouseEvent.wheelX = e.wheelX; - mouseEvent.wheelY = e.wheelY; - - this.editor._emit(name, mouseEvent); + BidiHandler.prototype.setShowInvisibles = function (showInvisibles) { + this.showInvisibles = showInvisibles; + this.currentRow = null; }; - - this.setState = function(state) { - this.state = state; + BidiHandler.prototype.setEolChar = function (eolChar) { + this.EOL = eolChar; }; - - this.captureMouse = function(ev, mouseMoveHandler) { - this.x = ev.x; - this.y = ev.y; - - this.isMousePressed = true; - var editor = this.editor; - var renderer = this.editor.renderer; - renderer.$isMousePressed = true; - - var self = this; - var onMouseMove = function(e) { - if (!e) return; - if (useragent.isWebKit && !e.which && self.releaseMouse) - return self.releaseMouse(); - - self.x = e.clientX; - self.y = e.clientY; - mouseMoveHandler && mouseMoveHandler(e); - self.mouseEvent = new MouseEvent(e, self.editor); - self.$mouseMoved = true; - }; - - var onCaptureEnd = function(e) { - editor.off("beforeEndOperation", onOperationEnd); - clearInterval(timerId); - if (editor.session) onCaptureInterval(); - self[self.state + "End"] && self[self.state + "End"](e); - self.state = ""; - self.isMousePressed = renderer.$isMousePressed = false; - if (renderer.$keepTextAreaAtCursor) - renderer.$moveTextAreaToCursor(); - self.$onCaptureMouseMove = self.releaseMouse = null; - e && self.onMouseEvent("mouseup", e); - editor.endOperation(); - }; - - var onCaptureInterval = function() { - self[self.state] && self[self.state](); - self.$mouseMoved = false; - }; - - if (useragent.isOldIE && ev.domEvent.type == "dblclick") { - return setTimeout(function() {onCaptureEnd(ev);}); - } - - var onOperationEnd = function(e) { - if (!self.releaseMouse) return; - if (editor.curOp.command.name && editor.curOp.selectionChanged) { - self[self.state + "End"] && self[self.state + "End"](); - self.state = ""; - self.releaseMouse(); - } - }; - - editor.on("beforeEndOperation", onOperationEnd); - editor.startOperation({command: {name: "mouse"}}); - - self.$onCaptureMouseMove = onMouseMove; - self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd); - var timerId = setInterval(onCaptureInterval, 20); + BidiHandler.prototype.setContentWidth = function (width) { + this.contentWidth = width; }; - this.releaseMouse = null; - this.cancelContextMenu = function() { - var stop = function(e) { - if (e && e.domEvent && e.domEvent.type != "contextmenu") - return; - this.editor.off("nativecontextmenu", stop); - if (e && e.domEvent) - event.stopEvent(e.domEvent); - }.bind(this); - setTimeout(stop, 10); - this.editor.on("nativecontextmenu", stop); + BidiHandler.prototype.isRtlLine = function (row) { + if (this.$isRtl) + return true; + if (row != undefined) + return (this.session.getLine(row).charAt(0) == this.RLE); + else + return this.isRtlDir; }; - this.destroy = function() { - if (this.releaseMouse) this.releaseMouse(); + BidiHandler.prototype.setRtlDirection = function (editor, isRtlDir) { + var cursor = editor.getCursorPosition(); + for (var row = editor.selection.getSelectionAnchor().row; row <= cursor.row; row++) { + if (!isRtlDir && editor.session.getLine(row).charAt(0) === editor.session.$bidiHandler.RLE) + editor.session.doc.removeInLine(row, 0, 1); + else if (isRtlDir && editor.session.getLine(row).charAt(0) !== editor.session.$bidiHandler.RLE) + editor.session.doc.insert({ column: 0, row: row }, editor.session.$bidiHandler.RLE); + } }; -}).call(MouseHandler.prototype); - -config.defineOptions(MouseHandler.prototype, "mouseHandler", { - scrollSpeed: {initialValue: 2}, - dragDelay: {initialValue: (useragent.isMac ? 150 : 0)}, - dragEnabled: {initialValue: true}, - focusTimeout: {initialValue: 0}, - tooltipFollowsMouse: {initialValue: true} -}); - - -exports.MouseHandler = MouseHandler; -}); - -define("ace/mouse/fold_handler",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; -var dom = require("../lib/dom"); - -function FoldHandler(editor) { - - editor.on("click", function(e) { - var position = e.getDocumentPosition(); - var session = editor.session; - var fold = session.getFoldAt(position.row, position.column, 1); - if (fold) { - if (e.getAccelKey()) - session.removeFold(fold); - else - session.expandFold(fold); - - e.stop(); + BidiHandler.prototype.getPosLeft = function (col) { + col -= this.wrapIndent; + var leftBoundary = (this.line.charAt(0) === this.RLE) ? 1 : 0; + var logicalIdx = (col > leftBoundary) ? (this.session.getOverwrite() ? col : col - 1) : leftBoundary; + var visualIdx = bidiUtil.getVisualFromLogicalIdx(logicalIdx, this.bidiMap), levels = this.bidiMap.bidiLevels, left = 0; + if (!this.session.getOverwrite() && col <= leftBoundary && levels[visualIdx] % 2 !== 0) + visualIdx++; + for (var i = 0; i < visualIdx; i++) { + left += this.charWidths[levels[i]]; } - - var target = e.domEvent && e.domEvent.target; - if (target && dom.hasCssClass(target, "ace_inline_button")) { - if (dom.hasCssClass(target, "ace_toggle_wrap")) { - session.setOption("wrap", !session.getUseWrapMode()); - editor.renderer.scrollCursorIntoView(); + if (!this.session.getOverwrite() && (col > leftBoundary) && (levels[visualIdx] % 2 === 0)) + left += this.charWidths[levels[visualIdx]]; + if (this.wrapIndent) + left += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; + if (this.isRtlDir) + left += this.rtlLineOffset; + return left; + }; + BidiHandler.prototype.getSelections = function (startCol, endCol) { + var map = this.bidiMap, levels = map.bidiLevels, level, selections = [], offset = 0, selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent, isSelected = false, isSelectedPrev = false, selectionStart = 0; + if (this.wrapIndent) + offset += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; + for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) { + logIdx = map.logicalFromVisual[visIdx]; + level = levels[visIdx]; + isSelected = (logIdx >= selColMin) && (logIdx < selColMax); + if (isSelected && !isSelectedPrev) { + selectionStart = offset; } + else if (!isSelected && isSelectedPrev) { + selections.push({ left: selectionStart, width: offset - selectionStart }); + } + offset += this.charWidths[level]; + isSelectedPrev = isSelected; } - }); - - editor.on("gutterclick", function(e) { - var gutterRegion = editor.renderer.$gutterLayer.getRegion(e); - - if (gutterRegion == "foldWidgets") { - var row = e.getDocumentPosition().row; - var session = editor.session; - if (session.foldWidgets && session.foldWidgets[row]) - editor.session.onFoldWidgetClick(row, e); - if (!editor.isFocused()) - editor.focus(); - e.stop(); + if (isSelected && (visIdx === levels.length)) { + selections.push({ left: selectionStart, width: offset - selectionStart }); } - }); - - editor.on("gutterdblclick", function(e) { - var gutterRegion = editor.renderer.$gutterLayer.getRegion(e); - - if (gutterRegion == "foldWidgets") { - var row = e.getDocumentPosition().row; - var session = editor.session; - var data = session.getParentFoldRangeData(row, true); - var range = data.range || data.firstRange; - - if (range) { - row = range.start.row; - var fold = session.getFoldAt(row, session.getLine(row).length, 1); - - if (fold) { - session.removeFold(fold); - } else { - session.addFold("...", range); - editor.renderer.scrollCursorIntoView({row: range.start.row, column: 0}); - } + if (this.isRtlDir) { + for (var i = 0; i < selections.length; i++) { + selections[i].left += this.rtlLineOffset; } - e.stop(); } - }); -} - -exports.FoldHandler = FoldHandler; + return selections; + }; + BidiHandler.prototype.offsetToCol = function (posX) { + if (this.isRtlDir) + posX -= this.rtlLineOffset; + var logicalIdx = 0, posX = Math.max(posX, 0), offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels, charWidth = this.charWidths[levels[visualIdx]]; + if (this.wrapIndent) + posX -= this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; + while (posX > offset + charWidth / 2) { + offset += charWidth; + if (visualIdx === levels.length - 1) { + charWidth = 0; + break; + } + charWidth = this.charWidths[levels[++visualIdx]]; + } + if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)) { + if (posX < offset) + visualIdx--; + logicalIdx = this.bidiMap.logicalFromVisual[visualIdx]; + } + else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)) { + logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx] + : this.bidiMap.logicalFromVisual[visualIdx - 1]); + } + else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0)) + || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))) { + logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx]; + } + else { + if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0) + visualIdx--; + logicalIdx = this.bidiMap.logicalFromVisual[visualIdx]; + } + if (logicalIdx === 0 && this.isRtlDir) + logicalIdx++; + return (logicalIdx + this.wrapIndent); + }; + return BidiHandler; +}()); +exports.BidiHandler = BidiHandler; }); -define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"], function(require, exports, module) { -"use strict"; - -var keyUtil = require("../lib/keys"); -var event = require("../lib/event"); - -var KeyBinding = function(editor) { - this.$editor = editor; - this.$data = {editor: editor}; - this.$handlers = []; - this.setDefaultHandler(editor.commands); -}; - -(function() { - this.setDefaultHandler = function(kb) { - this.removeKeyboardHandler(this.$defaultHandler); - this.$defaultHandler = kb; - this.addKeyboardHandler(kb, 0); +define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Selection = /** @class */ (function () { + function Selection(session) { + this.session = session; + this.doc = session.getDocument(); + this.clearSelection(); + this.cursor = this.lead = this.doc.createAnchor(0, 0); + this.anchor = this.doc.createAnchor(0, 0); + this.$silent = false; + var self = this; + this.cursor.on("change", function (e) { + self.$cursorChanged = true; + if (!self.$silent) + self._emit("changeCursor"); + if (!self.$isEmpty && !self.$silent) + self._emit("changeSelection"); + if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column) + self.$desiredColumn = null; + }); + this.anchor.on("change", function () { + self.$anchorChanged = true; + if (!self.$isEmpty && !self.$silent) + self._emit("changeSelection"); + }); + } + Selection.prototype.isEmpty = function () { + return this.$isEmpty || (this.anchor.row == this.lead.row && + this.anchor.column == this.lead.column); }; - - this.setKeyboardHandler = function(kb) { - var h = this.$handlers; - if (h[h.length - 1] == kb) - return; - - while (h[h.length - 1] && h[h.length - 1] != this.$defaultHandler) - this.removeKeyboardHandler(h[h.length - 1]); - - this.addKeyboardHandler(kb, 1); + Selection.prototype.isMultiLine = function () { + return !this.$isEmpty && this.anchor.row != this.cursor.row; }; - - this.addKeyboardHandler = function(kb, pos) { - if (!kb) - return; - if (typeof kb == "function" && !kb.handleKeyboard) - kb.handleKeyboard = kb; - var i = this.$handlers.indexOf(kb); - if (i != -1) - this.$handlers.splice(i, 1); - - if (pos == undefined) - this.$handlers.push(kb); - else - this.$handlers.splice(pos, 0, kb); - - if (i == -1 && kb.attach) - kb.attach(this.$editor); + Selection.prototype.getCursor = function () { + return this.lead.getPosition(); }; - - this.removeKeyboardHandler = function(kb) { - var i = this.$handlers.indexOf(kb); - if (i == -1) - return false; - this.$handlers.splice(i, 1); - kb.detach && kb.detach(this.$editor); - return true; + Selection.prototype.setAnchor = function (row, column) { + this.$isEmpty = false; + this.anchor.setPosition(row, column); }; - - this.getKeyboardHandler = function() { - return this.$handlers[this.$handlers.length - 1]; + Selection.prototype.getAnchor = function () { + if (this.$isEmpty) + return this.getSelectionLead(); + return this.anchor.getPosition(); }; - - this.getStatusText = function() { - var data = this.$data; - var editor = data.editor; - return this.$handlers.map(function(h) { - return h.getStatusText && h.getStatusText(editor, data) || ""; - }).filter(Boolean).join(" "); + Selection.prototype.getSelectionLead = function () { + return this.lead.getPosition(); }; - - this.$callKeyboardHandlers = function(hashId, keyString, keyCode, e) { - var toExecute; - var success = false; - var commands = this.$editor.commands; - - for (var i = this.$handlers.length; i--;) { - toExecute = this.$handlers[i].handleKeyboard( - this.$data, hashId, keyString, keyCode, e - ); - if (!toExecute || !toExecute.command) - continue; - if (toExecute.command == "null") { - success = true; - } else { - success = commands.exec(toExecute.command, this.$editor, toExecute.args, e); - } - if (success && e && hashId != -1 && - toExecute.passEvent != true && toExecute.command.passEvent != true - ) { - event.stopEvent(e); - } - if (success) - break; - } - - if (!success && hashId == -1) { - toExecute = {command: "insertstring"}; - success = commands.exec("insertstring", this.$editor, keyString); - } - - if (success && this.$editor._signal) - this.$editor._signal("keyboardActivity", toExecute); - - return success; - }; - - this.onCommandKey = function(e, hashId, keyCode) { - var keyString = keyUtil.keyCodeToString(keyCode); - return this.$callKeyboardHandlers(hashId, keyString, keyCode, e); + Selection.prototype.isBackwards = function () { + var anchor = this.anchor; + var lead = this.lead; + return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); }; - - this.onTextInput = function(text) { - return this.$callKeyboardHandlers(-1, text); + Selection.prototype.getRange = function () { + var anchor = this.anchor; + var lead = this.lead; + if (this.$isEmpty) + return Range.fromPoints(lead, lead); + return this.isBackwards() + ? Range.fromPoints(lead, anchor) + : Range.fromPoints(anchor, lead); }; - -}).call(KeyBinding.prototype); - -exports.KeyBinding = KeyBinding; -}); - -define("ace/lib/bidiutil",["require","exports","module"], function(require, exports, module) { -"use strict"; - -var ArabicAlefBetIntervalsBegine = ['\u0621', '\u0641']; -var ArabicAlefBetIntervalsEnd = ['\u063A', '\u064a']; -var dir = 0, hiLevel = 0; -var lastArabic = false, hasUBAT_AL = false, hasUBAT_B = false, hasUBAT_S = false, hasBlockSep = false, hasSegSep = false; - -var impTab_LTR = [ [ 0, 3, 0, 1, 0, 0, 0 ], [ 0, 3, 0, 1, 2, 2, 0 ], [ 0, 3, 0, 0x11, 2, 0, 1 ], [ 0, 3, 5, 5, 4, 1, 0 ], [ 0, 3, 0x15, 0x15, 4, 0, 1 ], [ 0, 3, 5, 5, 4, 2, 0 ] -]; - -var impTab_RTL = [ [ 2, 0, 1, 1, 0, 1, 0 ], [ 2, 0, 1, 1, 0, 2, 0 ], [ 2, 0, 2, 1, 3, 2, 0 ], [ 2, 0, 2, 0x21, 3, 1, 1 ] -]; - -var LTR = 0, RTL = 1; - -var L = 0; -var R = 1; -var EN = 2; -var AN = 3; -var ON = 4; -var B = 5; -var S = 6; -var AL = 7; -var WS = 8; -var CS = 9; -var ES = 10; -var ET = 11; -var NSM = 12; -var LRE = 13; -var RLE = 14; -var PDF = 15; -var LRO = 16; -var RLO = 17; -var BN = 18; - -var UnicodeTBL00 = [ -BN,BN,BN,BN,BN,BN,BN,BN,BN,S,B,S,WS,B,BN,BN, -BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,B,B,B,S, -WS,ON,ON,ET,ET,ET,ON,ON,ON,ON,ON,ES,CS,ES,CS,CS, -EN,EN,EN,EN,EN,EN,EN,EN,EN,EN,CS,ON,ON,ON,ON,ON, -ON,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L, -L,L,L,L,L,L,L,L,L,L,L,ON,ON,ON,ON,ON, -ON,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L, -L,L,L,L,L,L,L,L,L,L,L,ON,ON,ON,ON,BN, -BN,BN,BN,BN,BN,B,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN, -BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN, -CS,ON,ET,ET,ET,ET,ON,ON,ON,ON,L,ON,ON,BN,ON,ON, -ET,ET,EN,EN,ON,L,ON,ON,ON,EN,L,ON,ON,ON,ON,ON -]; - -var UnicodeTBL20 = [ -WS,WS,WS,WS,WS,WS,WS,WS,WS,WS,WS,BN,BN,BN,L,R , -ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON, -ON,ON,ON,ON,ON,ON,ON,ON,WS,B,LRE,RLE,PDF,LRO,RLO,CS, -ET,ET,ET,ET,ET,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON, -ON,ON,ON,ON,CS,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON, -ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,WS -]; - -function _computeLevels(chars, levels, len, charTypes) { - var impTab = dir ? impTab_RTL : impTab_LTR - , prevState = null, newClass = null, newLevel = null, newState = 0 - , action = null, cond = null, condPos = -1, i = null, ix = null, classes = []; - - if (!charTypes) { - for (i = 0, charTypes = []; i < len; i++) { - charTypes[i] = _getCharacterType(chars[i]); - } - } - hiLevel = dir; - lastArabic = false; - hasUBAT_AL = false; - hasUBAT_B = false; - hasUBAT_S = false; - for (ix = 0; ix < len; ix++){ - prevState = newState; - classes[ix] = newClass = _getCharClass(chars, charTypes, classes, ix); - newState = impTab[prevState][newClass]; - action = newState & 0xF0; - newState &= 0x0F; - levels[ix] = newLevel = impTab[newState][5]; - if (action > 0){ - if (action == 0x10){ - for(i = condPos; i < ix; i++){ - levels[i] = 1; - } - condPos = -1; - } else { - condPos = -1; - } - } - cond = impTab[newState][6]; - if (cond){ - if(condPos == -1){ - condPos = ix; - } - }else{ - if (condPos > -1){ - for(i = condPos; i < ix; i++){ - levels[i] = newLevel; - } - condPos = -1; - } - } - if (charTypes[ix] == B){ - levels[ix] = 0; - } - hiLevel |= newLevel; - } - if (hasUBAT_S){ - for(i = 0; i < len; i++){ - if(charTypes[i] == S){ - levels[i] = dir; - for(var j = i - 1; j >= 0; j--){ - if(charTypes[j] == WS){ - levels[j] = dir; - }else{ - break; - } - } - } - } - } -} - -function _invertLevel(lev, levels, _array) { - if (hiLevel < lev){ - return; - } - if (lev == 1 && dir == RTL && !hasUBAT_B){ - _array.reverse(); - return; - } - var len = _array.length, start = 0, end, lo, hi, tmp; - while(start < len){ - if (levels[start] >= lev){ - end = start + 1; - while(end < len && levels[end] >= lev){ - end++; - } - for(lo = start, hi = end - 1 ; lo < hi; lo++, hi--){ - tmp = _array[lo]; - _array[lo] = _array[hi]; - _array[hi] = tmp; - } - start = end; - } - start++; - } -} - -function _getCharClass(chars, types, classes, ix) { - var cType = types[ix], wType, nType, len, i; - switch(cType){ - case L: - case R: - lastArabic = false; - case ON: - case AN: - return cType; - case EN: - return lastArabic ? AN : EN; - case AL: - lastArabic = true; - hasUBAT_AL = true; - return R; - case WS: - return ON; - case CS: - if (ix < 1 || (ix + 1) >= types.length || - ((wType = classes[ix - 1]) != EN && wType != AN) || - ((nType = types[ix + 1]) != EN && nType != AN)){ - return ON; - } - if (lastArabic){nType = AN;} - return nType == wType ? nType : ON; - case ES: - wType = ix > 0 ? classes[ix - 1] : B; - if (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN){ - return EN; - } - return ON; - case ET: - if (ix > 0 && classes[ix - 1] == EN){ - return EN; - } - if (lastArabic){ - return ON; - } - i = ix + 1; - len = types.length; - while (i < len && types[i] == ET){ - i++; - } - if (i < len && types[i] == EN){ - return EN; - } - return ON; - case NSM: - len = types.length; - i = ix + 1; - while (i < len && types[i] == NSM){ - i++; - } - if (i < len){ - var c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E; - - wType = types[i]; - if (rtlCandidate && (wType == R || wType == AL)){ - return R; - } - } - - if (ix < 1 || (wType = types[ix - 1]) == B){ - return ON; - } - return classes[ix - 1]; - case B: - lastArabic = false; - hasUBAT_B = true; - return dir; - case S: - hasUBAT_S = true; - return ON; - case LRE: - case RLE: - case LRO: - case RLO: - case PDF: - lastArabic = false; - case BN: - return ON; - } -} - -function _getCharacterType( ch ) { - var uc = ch.charCodeAt(0), hi = uc >> 8; - - if (hi == 0) { - return ((uc > 0x00BF) ? L : UnicodeTBL00[uc]); - } else if (hi == 5) { - return (/[\u0591-\u05f4]/.test(ch) ? R : L); - } else if (hi == 6) { - if (/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(ch)) - return NSM; - else if (/[\u0660-\u0669\u066b-\u066c]/.test(ch)) - return AN; - else if (uc == 0x066A) - return ET; - else if (/[\u06f0-\u06f9]/.test(ch)) - return EN; - else - return AL; - } else if (hi == 0x20 && uc <= 0x205F) { - return UnicodeTBL20[uc & 0xFF]; - } else if (hi == 0xFE) { - return (uc >= 0xFE70 ? AL : ON); - } - return ON; -} - -function _isArabicDiacritics( ch ) { - return (ch >= '\u064b' && ch <= '\u0655'); -} -exports.L = L; -exports.R = R; -exports.EN = EN; -exports.ON_R = 3; -exports.AN = 4; -exports.R_H = 5; -exports.B = 6; -exports.RLE = 7; - -exports.DOT = "\xB7"; -exports.doBidiReorder = function(text, textCharTypes, isRtl) { - if (text.length < 2) - return {}; - - var chars = text.split(""), logicalFromVisual = new Array(chars.length), - bidiLevels = new Array(chars.length), levels = []; - - dir = isRtl ? RTL : LTR; - - _computeLevels(chars, levels, chars.length, textCharTypes); - - for (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++); - - _invertLevel(2, levels, logicalFromVisual); - _invertLevel(1, levels, logicalFromVisual); - - for (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width - if (textCharTypes[i] === AN) { - levels[i] = exports.AN; - } else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE) - || textCharTypes[i] === ON || textCharTypes[i] === BN)) { - levels[i] = exports.ON_R; - } else if ((i > 0 && chars[i - 1] === '\u0644') && /\u0622|\u0623|\u0625|\u0627/.test(chars[i])) { - levels[i - 1] = levels[i] = exports.R_H; - i++; - } - } - if (chars[chars.length - 1] === exports.DOT) - levels[chars.length - 1] = exports.B; - - if (chars[0] === '\u202B') - levels[0] = exports.RLE; - - for (var i = 0; i < logicalFromVisual.length; i++) { - bidiLevels[i] = levels[logicalFromVisual[i]]; - } - - return {'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels}; -}; -exports.hasBidiCharacters = function(text, textCharTypes){ - var ret = false; - for (var i = 0; i < text.length; i++){ - textCharTypes[i] = _getCharacterType(text.charAt(i)); - if (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL || textCharTypes[i] == AN)) - ret = true; - } - return ret; -}; -exports.getVisualFromLogicalIdx = function(logIdx, rowMap) { - for (var i = 0; i < rowMap.logicalFromVisual.length; i++) { - if (rowMap.logicalFromVisual[i] == logIdx) - return i; - } - return 0; -}; - -}); - -define("ace/bidihandler",["require","exports","module","ace/lib/bidiutil","ace/lib/lang"], function(require, exports, module) { -"use strict"; - -var bidiUtil = require("./lib/bidiutil"); -var lang = require("./lib/lang"); -var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\u202B]/; -var BidiHandler = function(session) { - this.session = session; - this.bidiMap = {}; - this.currentRow = null; - this.bidiUtil = bidiUtil; - this.charWidths = []; - this.EOL = "\xAC"; - this.showInvisibles = true; - this.isRtlDir = false; - this.$isRtl = false; - this.line = ""; - this.wrapIndent = 0; - this.EOF = "\xB6"; - this.RLE = "\u202B"; - this.contentWidth = 0; - this.fontMetrics = null; - this.rtlLineOffset = 0; - this.wrapOffset = 0; - this.isMoveLeftOperation = false; - this.seenBidi = bidiRE.test(session.getValue()); -}; - -(function() { - this.isBidiRow = function(screenRow, docRow, splitIndex) { - if (!this.seenBidi) - return false; - if (screenRow !== this.currentRow) { - this.currentRow = screenRow; - this.updateRowLine(docRow, splitIndex); - this.updateBidiMap(); + Selection.prototype.clearSelection = function () { + if (!this.$isEmpty) { + this.$isEmpty = true; + this._emit("changeSelection"); } - return this.bidiMap.bidiLevels; }; - - this.onChange = function(delta) { - if (!this.seenBidi) { - if (delta.action == "insert" && bidiRE.test(delta.lines.join("\n"))) { - this.seenBidi = true; - this.currentRow = null; - } - } - else { - this.currentRow = null; - } + Selection.prototype.selectAll = function () { + this.$setSelection(0, 0, Number.MAX_VALUE, Number.MAX_VALUE); }; - - this.getDocumentRow = function() { - var docRow = 0; - var rowCache = this.session.$screenRowCache; - if (rowCache.length) { - var index = this.session.$getRowCacheIndex(rowCache, this.currentRow); - if (index >= 0) - docRow = this.session.$docRowCache[index]; - } - - return docRow; + Selection.prototype.setRange = function (range, reverse) { + var start = reverse ? range.end : range.start; + var end = reverse ? range.start : range.end; + this.$setSelection(start.row, start.column, end.row, end.column); }; - - this.getSplitIndex = function() { - var splitIndex = 0; - var rowCache = this.session.$screenRowCache; - if (rowCache.length) { - var currentIndex, prevIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow); - while (this.currentRow - splitIndex > 0) { - currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1); - if (currentIndex !== prevIndex) - break; - - prevIndex = currentIndex; - splitIndex++; - } - } else { - splitIndex = this.currentRow; - } - - return splitIndex; + Selection.prototype.$setSelection = function (anchorRow, anchorColumn, cursorRow, cursorColumn) { + if (this.$silent) + return; + var wasEmpty = this.$isEmpty; + var wasMultiselect = this.inMultiSelectMode; + this.$silent = true; + this.$cursorChanged = this.$anchorChanged = false; + this.anchor.setPosition(anchorRow, anchorColumn); + this.cursor.setPosition(cursorRow, cursorColumn); + this.$isEmpty = !Range.comparePoints(this.anchor, this.cursor); + this.$silent = false; + if (this.$cursorChanged) + this._emit("changeCursor"); + if (this.$cursorChanged || this.$anchorChanged || wasEmpty != this.$isEmpty || wasMultiselect) + this._emit("changeSelection"); }; - - this.updateRowLine = function(docRow, splitIndex) { - if (docRow === undefined) - docRow = this.getDocumentRow(); - - var isLastRow = (docRow === this.session.getLength() - 1), - endOfLine = isLastRow ? this.EOF : this.EOL; - - this.wrapIndent = 0; - this.line = this.session.getLine(docRow); - this.isRtlDir = this.$isRtl || this.line.charAt(0) === this.RLE; - if (this.session.$useWrapMode) { - var splits = this.session.$wrapData[docRow]; - if (splits) { - if (splitIndex === undefined) - splitIndex = this.getSplitIndex(); - - if(splitIndex > 0 && splits.length) { - this.wrapIndent = splits.indent; - this.wrapOffset = this.wrapIndent * this.charWidths[bidiUtil.L]; - this.line = (splitIndex < splits.length) ? - this.line.substring(splits[splitIndex - 1], splits[splitIndex]) : - this.line.substring(splits[splits.length - 1]); - } else { - this.line = this.line.substring(0, splits[splitIndex]); - } - } - if (splitIndex == splits.length) - this.line += (this.showInvisibles) ? endOfLine : bidiUtil.DOT; - } else { - this.line += this.showInvisibles ? endOfLine : bidiUtil.DOT; - } - var session = this.session, shift = 0, size; - this.line = this.line.replace(/\t|[\u1100-\u2029, \u202F-\uFFE6]/g, function(ch, i){ - if (ch === '\t' || session.isFullWidth(ch.charCodeAt(0))) { - size = (ch === '\t') ? session.getScreenTabSize(i + shift) : 2; - shift += size - 1; - return lang.stringRepeat(bidiUtil.DOT, size); - } - return ch; + Selection.prototype.$moveSelection = function (mover) { + var lead = this.lead; + if (this.$isEmpty) + this.setSelectionAnchor(lead.row, lead.column); + mover.call(this); + }; + Selection.prototype.selectTo = function (row, column) { + this.$moveSelection(function () { + this.moveCursorTo(row, column); }); - - if (this.isRtlDir) { - this.fontMetrics.$main.textContent = (this.line.charAt(this.line.length - 1) == bidiUtil.DOT) ? this.line.substr(0, this.line.length - 1) : this.line; - this.rtlLineOffset = this.contentWidth - this.fontMetrics.$main.getBoundingClientRect().width; - } }; - - this.updateBidiMap = function() { - var textCharTypes = []; - if (bidiUtil.hasBidiCharacters(this.line, textCharTypes) || this.isRtlDir) { - this.bidiMap = bidiUtil.doBidiReorder(this.line, textCharTypes, this.isRtlDir); - } else { - this.bidiMap = {}; - } + Selection.prototype.selectToPosition = function (pos) { + this.$moveSelection(function () { + this.moveCursorToPosition(pos); + }); }; - this.markAsDirty = function() { - this.currentRow = null; + Selection.prototype.moveTo = function (row, column) { + this.clearSelection(); + this.moveCursorTo(row, column); }; - this.updateCharacterWidths = function(fontMetrics) { - if (this.characterWidth === fontMetrics.$characterSize.width) - return; - - this.fontMetrics = fontMetrics; - var characterWidth = this.characterWidth = fontMetrics.$characterSize.width; - var bidiCharWidth = fontMetrics.$measureCharWidth("\u05d4"); - - this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth; - this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth; - this.charWidths[bidiUtil.R_H] = bidiCharWidth * 0.45; - this.charWidths[bidiUtil.B] = this.charWidths[bidiUtil.RLE] = 0; - - this.currentRow = null; + Selection.prototype.moveToPosition = function (pos) { + this.clearSelection(); + this.moveCursorToPosition(pos); }; - - this.setShowInvisibles = function(showInvisibles) { - this.showInvisibles = showInvisibles; - this.currentRow = null; + Selection.prototype.selectUp = function () { + this.$moveSelection(this.moveCursorUp); }; - - this.setEolChar = function(eolChar) { - this.EOL = eolChar; + Selection.prototype.selectDown = function () { + this.$moveSelection(this.moveCursorDown); }; - - this.setContentWidth = function(width) { - this.contentWidth = width; + Selection.prototype.selectRight = function () { + this.$moveSelection(this.moveCursorRight); }; - - this.isRtlLine = function(row) { - if (this.$isRtl) return true; - if (row != undefined) - return (this.session.getLine(row).charAt(0) == this.RLE); - else - return this.isRtlDir; + Selection.prototype.selectLeft = function () { + this.$moveSelection(this.moveCursorLeft); }; - - this.setRtlDirection = function(editor, isRtlDir) { - var cursor = editor.getCursorPosition(); - for (var row = editor.selection.getSelectionAnchor().row; row <= cursor.row; row++) { - if (!isRtlDir && editor.session.getLine(row).charAt(0) === editor.session.$bidiHandler.RLE) - editor.session.doc.removeInLine(row, 0, 1); - else if (isRtlDir && editor.session.getLine(row).charAt(0) !== editor.session.$bidiHandler.RLE) - editor.session.doc.insert({column: 0, row: row}, editor.session.$bidiHandler.RLE); - } - }; - this.getPosLeft = function(col) { - col -= this.wrapIndent; - var leftBoundary = (this.line.charAt(0) === this.RLE) ? 1 : 0; - var logicalIdx = (col > leftBoundary) ? (this.session.getOverwrite() ? col : col - 1) : leftBoundary; - var visualIdx = bidiUtil.getVisualFromLogicalIdx(logicalIdx, this.bidiMap), - levels = this.bidiMap.bidiLevels, left = 0; - - if (!this.session.getOverwrite() && col <= leftBoundary && levels[visualIdx] % 2 !== 0) - visualIdx++; - - for (var i = 0; i < visualIdx; i++) { - left += this.charWidths[levels[i]]; - } - - if (!this.session.getOverwrite() && (col > leftBoundary) && (levels[visualIdx] % 2 === 0)) - left += this.charWidths[levels[visualIdx]]; - - if (this.wrapIndent) - left += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; - - if (this.isRtlDir) - left += this.rtlLineOffset; - - return left; - }; - this.getSelections = function(startCol, endCol) { - var map = this.bidiMap, levels = map.bidiLevels, level, selections = [], offset = 0, - selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent, - isSelected = false, isSelectedPrev = false, selectionStart = 0; - - if (this.wrapIndent) - offset += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; - - for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) { - logIdx = map.logicalFromVisual[visIdx]; - level = levels[visIdx]; - isSelected = (logIdx >= selColMin) && (logIdx < selColMax); - if (isSelected && !isSelectedPrev) { - selectionStart = offset; - } else if (!isSelected && isSelectedPrev) { - selections.push({left: selectionStart, width: offset - selectionStart}); - } - offset += this.charWidths[level]; - isSelectedPrev = isSelected; - } - - if (isSelected && (visIdx === levels.length)) { - selections.push({left: selectionStart, width: offset - selectionStart}); - } - - if(this.isRtlDir) { - for (var i = 0; i < selections.length; i++) { - selections[i].left += this.rtlLineOffset; - } - } - return selections; - }; - this.offsetToCol = function(posX) { - if(this.isRtlDir) - posX -= this.rtlLineOffset; - - var logicalIdx = 0, posX = Math.max(posX, 0), - offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels, - charWidth = this.charWidths[levels[visualIdx]]; - - if (this.wrapIndent) - posX -= this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; - - while(posX > offset + charWidth/2) { - offset += charWidth; - if(visualIdx === levels.length - 1) { - charWidth = 0; - break; - } - charWidth = this.charWidths[levels[++visualIdx]]; - } - - if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)){ - if(posX < offset) - visualIdx--; - logicalIdx = this.bidiMap.logicalFromVisual[visualIdx]; - - } else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)){ - logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx] - : this.bidiMap.logicalFromVisual[visualIdx - 1]); - - } else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0)) - || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))){ - logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx]; - } else { - if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0) - visualIdx--; - logicalIdx = this.bidiMap.logicalFromVisual[visualIdx]; - } - - if (logicalIdx === 0 && this.isRtlDir) - logicalIdx++; - - return (logicalIdx + this.wrapIndent); - }; - -}).call(BidiHandler.prototype); - -exports.BidiHandler = BidiHandler; -}); - -define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"], function(require, exports, module) { -"use strict"; - -var oop = require("./lib/oop"); -var lang = require("./lib/lang"); -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var Range = require("./range").Range; -var Selection = function(session) { - this.session = session; - this.doc = session.getDocument(); - - this.clearSelection(); - this.cursor = this.lead = this.doc.createAnchor(0, 0); - this.anchor = this.doc.createAnchor(0, 0); - this.$silent = false; - - var self = this; - this.cursor.on("change", function(e) { - self.$cursorChanged = true; - if (!self.$silent) - self._emit("changeCursor"); - if (!self.$isEmpty && !self.$silent) - self._emit("changeSelection"); - if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column) - self.$desiredColumn = null; - }); - - this.anchor.on("change", function() { - self.$anchorChanged = true; - if (!self.$isEmpty && !self.$silent) - self._emit("changeSelection"); - }); -}; - -(function() { - - oop.implement(this, EventEmitter); - this.isEmpty = function() { - return this.$isEmpty || ( - this.anchor.row == this.lead.row && - this.anchor.column == this.lead.column - ); - }; - this.isMultiLine = function() { - return !this.$isEmpty && this.anchor.row != this.cursor.row; - }; - this.getCursor = function() { - return this.lead.getPosition(); - }; - this.setSelectionAnchor = function(row, column) { - this.$isEmpty = false; - this.anchor.setPosition(row, column); - }; - this.getAnchor = - this.getSelectionAnchor = function() { - if (this.$isEmpty) - return this.getSelectionLead(); - - return this.anchor.getPosition(); - }; - this.getSelectionLead = function() { - return this.lead.getPosition(); - }; - this.isBackwards = function() { - var anchor = this.anchor; - var lead = this.lead; - return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); - }; - this.getRange = function() { - var anchor = this.anchor; - var lead = this.lead; - - if (this.$isEmpty) - return Range.fromPoints(lead, lead); - - return this.isBackwards() - ? Range.fromPoints(lead, anchor) - : Range.fromPoints(anchor, lead); - }; - this.clearSelection = function() { - if (!this.$isEmpty) { - this.$isEmpty = true; - this._emit("changeSelection"); - } - }; - this.selectAll = function() { - this.$setSelection(0, 0, Number.MAX_VALUE, Number.MAX_VALUE); - }; - this.setRange = - this.setSelectionRange = function(range, reverse) { - var start = reverse ? range.end : range.start; - var end = reverse ? range.start : range.end; - this.$setSelection(start.row, start.column, end.row, end.column); - }; - - this.$setSelection = function(anchorRow, anchorColumn, cursorRow, cursorColumn) { - if (this.$silent) - return; - var wasEmpty = this.$isEmpty; - var wasMultiselect = this.inMultiSelectMode; - this.$silent = true; - this.$cursorChanged = this.$anchorChanged = false; - this.anchor.setPosition(anchorRow, anchorColumn); - this.cursor.setPosition(cursorRow, cursorColumn); - this.$isEmpty = !Range.comparePoints(this.anchor, this.cursor); - this.$silent = false; - if (this.$cursorChanged) - this._emit("changeCursor"); - if (this.$cursorChanged || this.$anchorChanged || wasEmpty != this.$isEmpty || wasMultiselect) - this._emit("changeSelection"); - }; - - this.$moveSelection = function(mover) { - var lead = this.lead; - if (this.$isEmpty) - this.setSelectionAnchor(lead.row, lead.column); - - mover.call(this); - }; - this.selectTo = function(row, column) { - this.$moveSelection(function() { - this.moveCursorTo(row, column); - }); - }; - this.selectToPosition = function(pos) { - this.$moveSelection(function() { - this.moveCursorToPosition(pos); - }); - }; - this.moveTo = function(row, column) { - this.clearSelection(); - this.moveCursorTo(row, column); - }; - this.moveToPosition = function(pos) { - this.clearSelection(); - this.moveCursorToPosition(pos); - }; - this.selectUp = function() { - this.$moveSelection(this.moveCursorUp); - }; - this.selectDown = function() { - this.$moveSelection(this.moveCursorDown); - }; - this.selectRight = function() { - this.$moveSelection(this.moveCursorRight); - }; - this.selectLeft = function() { - this.$moveSelection(this.moveCursorLeft); - }; - this.selectLineStart = function() { + Selection.prototype.selectLineStart = function () { this.$moveSelection(this.moveCursorLineStart); }; - this.selectLineEnd = function() { + Selection.prototype.selectLineEnd = function () { this.$moveSelection(this.moveCursorLineEnd); }; - this.selectFileEnd = function() { + Selection.prototype.selectFileEnd = function () { this.$moveSelection(this.moveCursorFileEnd); }; - this.selectFileStart = function() { + Selection.prototype.selectFileStart = function () { this.$moveSelection(this.moveCursorFileStart); }; - this.selectWordRight = function() { + Selection.prototype.selectWordRight = function () { this.$moveSelection(this.moveCursorWordRight); }; - this.selectWordLeft = function() { + Selection.prototype.selectWordLeft = function () { this.$moveSelection(this.moveCursorWordLeft); }; - this.getWordRange = function(row, column) { + Selection.prototype.getWordRange = function (row, column) { if (typeof column == "undefined") { var cursor = row || this.lead; row = cursor.row; @@ -5197,24 +5516,23 @@ var Selection = function(session) { } return this.session.getWordRange(row, column); }; - this.selectWord = function() { + Selection.prototype.selectWord = function () { this.setSelectionRange(this.getWordRange()); }; - this.selectAWord = function() { + Selection.prototype.selectAWord = function () { var cursor = this.getCursor(); var range = this.session.getAWordRange(cursor.row, cursor.column); this.setSelectionRange(range); }; - - this.getLineRange = function(row, excludeLastChar) { + Selection.prototype.getLineRange = function (row, excludeLastChar) { var rowStart = typeof row == "number" ? row : this.lead.row; var rowEnd; - var foldLine = this.session.getFoldLine(rowStart); if (foldLine) { rowStart = foldLine.start.row; rowEnd = foldLine.end.row; - } else { + } + else { rowEnd = rowStart; } if (excludeLastChar === true) @@ -5222,32 +5540,30 @@ var Selection = function(session) { else return new Range(rowStart, 0, rowEnd + 1, 0); }; - this.selectLine = function() { + Selection.prototype.selectLine = function () { this.setSelectionRange(this.getLineRange()); }; - this.moveCursorUp = function() { + Selection.prototype.moveCursorUp = function () { this.moveCursorBy(-1, 0); }; - this.moveCursorDown = function() { + Selection.prototype.moveCursorDown = function () { this.moveCursorBy(1, 0); }; - this.wouldMoveIntoSoftTab = function(cursor, tabSize, direction) { + Selection.prototype.wouldMoveIntoSoftTab = function (cursor, tabSize, direction) { var start = cursor.column; var end = cursor.column + tabSize; - if (direction < 0) { start = cursor.column - tabSize; end = cursor.column; } - return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(" ").length-1 == tabSize; + return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(" ").length - 1 == tabSize; }; - this.moveCursorLeft = function() { - var cursor = this.lead.getPosition(), - fold; - + Selection.prototype.moveCursorLeft = function () { + var cursor = this.lead.getPosition(), fold; if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) { this.moveCursorTo(fold.start.row, fold.start.column); - } else if (cursor.column === 0) { + } + else if (cursor.column === 0) { if (cursor.row > 0) { this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length); } @@ -5256,14 +5572,14 @@ var Selection = function(session) { var tabSize = this.session.getTabSize(); if (this.wouldMoveIntoSoftTab(cursor, tabSize, -1) && !this.session.getNavigateWithinSoftTabs()) { this.moveCursorBy(0, -tabSize); - } else { + } + else { this.moveCursorBy(0, -1); } } }; - this.moveCursorRight = function() { - var cursor = this.lead.getPosition(), - fold; + Selection.prototype.moveCursorRight = function () { + var cursor = this.lead.getPosition(), fold; if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) { this.moveCursorTo(fold.end.row, fold.end.column); } @@ -5277,27 +5593,24 @@ var Selection = function(session) { var cursor = this.lead; if (this.wouldMoveIntoSoftTab(cursor, tabSize, 1) && !this.session.getNavigateWithinSoftTabs()) { this.moveCursorBy(0, tabSize); - } else { + } + else { this.moveCursorBy(0, 1); } } }; - this.moveCursorLineStart = function() { + Selection.prototype.moveCursorLineStart = function () { var row = this.lead.row; var column = this.lead.column; var screenRow = this.session.documentToScreenRow(row, column); var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0); - var beforeCursor = this.session.getDisplayLine( - row, null, firstColumnPosition.row, - firstColumnPosition.column - ); - + var beforeCursor = this.session.getDisplayLine(row, null, firstColumnPosition.row, firstColumnPosition.column); var leadingSpace = beforeCursor.match(/^\s*/); if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart) firstColumnPosition.column += leadingSpace[0].length; this.moveCursorToPosition(firstColumnPosition); }; - this.moveCursorLineEnd = function() { + Selection.prototype.moveCursorLineEnd = function () { var lead = this.lead; var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column); if (this.lead.column == lineEnd.column) { @@ -5308,23 +5621,21 @@ var Selection = function(session) { lineEnd.column = textEnd; } } - this.moveCursorTo(lineEnd.row, lineEnd.column); }; - this.moveCursorFileEnd = function() { + Selection.prototype.moveCursorFileEnd = function () { var row = this.doc.getLength() - 1; var column = this.doc.getLine(row).length; this.moveCursorTo(row, column); }; - this.moveCursorFileStart = function() { + Selection.prototype.moveCursorFileStart = function () { this.moveCursorTo(0, 0); }; - this.moveCursorLongWordRight = function() { + Selection.prototype.moveCursorLongWordRight = function () { var row = this.lead.row; var column = this.lead.column; var line = this.doc.getLine(row); var rightOfCursor = line.substring(column); - this.session.nonTokenRe.lastIndex = 0; this.session.tokenRe.lastIndex = 0; var fold = this.session.getFoldAt(row, column, 1); @@ -5348,10 +5659,9 @@ var Selection = function(session) { column += this.session.tokenRe.lastIndex; this.session.tokenRe.lastIndex = 0; } - this.moveCursorTo(row, column); }; - this.moveCursorLongWordLeft = function() { + Selection.prototype.moveCursorLongWordLeft = function () { var row = this.lead.row; var column = this.lead.column; var fold; @@ -5359,12 +5669,10 @@ var Selection = function(session) { this.moveCursorTo(fold.start.row, fold.start.column); return; } - var str = this.session.getFoldStringAt(row, column, -1); if (str == null) { str = this.doc.getLine(row).substring(0, column); } - var leftOfCursor = lang.stringReverse(str); this.session.nonTokenRe.lastIndex = 0; this.session.tokenRe.lastIndex = 0; @@ -5384,34 +5692,32 @@ var Selection = function(session) { column -= this.session.tokenRe.lastIndex; this.session.tokenRe.lastIndex = 0; } - this.moveCursorTo(row, column); }; - - this.$shortWordEndIndex = function(rightOfCursor) { + Selection.prototype.$shortWordEndIndex = function (rightOfCursor) { var index = 0, ch; var whitespaceRe = /\s/; var tokenRe = this.session.tokenRe; - tokenRe.lastIndex = 0; if (this.session.tokenRe.exec(rightOfCursor)) { index = this.session.tokenRe.lastIndex; - } else { + } + else { while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) - index ++; - + index++; if (index < 1) { tokenRe.lastIndex = 0; - while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { + while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { tokenRe.lastIndex = 0; - index ++; + index++; if (whitespaceRe.test(ch)) { if (index > 2) { index--; break; - } else { + } + else { while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) - index ++; + index++; if (index > 2) break; } @@ -5420,100 +5726,79 @@ var Selection = function(session) { } } tokenRe.lastIndex = 0; - return index; }; - - this.moveCursorShortWordRight = function() { + Selection.prototype.moveCursorShortWordRight = function () { var row = this.lead.row; var column = this.lead.column; var line = this.doc.getLine(row); var rightOfCursor = line.substring(column); - var fold = this.session.getFoldAt(row, column, 1); if (fold) return this.moveCursorTo(fold.end.row, fold.end.column); - if (column == line.length) { var l = this.doc.getLength(); do { row++; rightOfCursor = this.doc.getLine(row); } while (row < l && /^\s*$/.test(rightOfCursor)); - if (!/^\s+/.test(rightOfCursor)) rightOfCursor = ""; column = 0; } - var index = this.$shortWordEndIndex(rightOfCursor); - this.moveCursorTo(row, column + index); }; - - this.moveCursorShortWordLeft = function() { + Selection.prototype.moveCursorShortWordLeft = function () { var row = this.lead.row; var column = this.lead.column; - var fold; if (fold = this.session.getFoldAt(row, column, -1)) return this.moveCursorTo(fold.start.row, fold.start.column); - var line = this.session.getLine(row).substring(0, column); if (column === 0) { do { row--; line = this.doc.getLine(row); } while (row > 0 && /^\s*$/.test(line)); - column = line.length; if (!/\s+$/.test(line)) line = ""; } - var leftOfCursor = lang.stringReverse(line); var index = this.$shortWordEndIndex(leftOfCursor); - return this.moveCursorTo(row, column - index); }; - - this.moveCursorWordRight = function() { + Selection.prototype.moveCursorWordRight = function () { if (this.session.$selectLongWords) this.moveCursorLongWordRight(); else this.moveCursorShortWordRight(); }; - - this.moveCursorWordLeft = function() { + Selection.prototype.moveCursorWordLeft = function () { if (this.session.$selectLongWords) this.moveCursorLongWordLeft(); else this.moveCursorShortWordLeft(); }; - this.moveCursorBy = function(rows, chars) { - var screenPos = this.session.documentToScreenPosition( - this.lead.row, - this.lead.column - ); - + Selection.prototype.moveCursorBy = function (rows, chars) { + var screenPos = this.session.documentToScreenPosition(this.lead.row, this.lead.column); var offsetX; - if (chars === 0) { if (rows !== 0) { if (this.session.$bidiHandler.isBidiRow(screenPos.row, this.lead.row)) { offsetX = this.session.$bidiHandler.getPosLeft(screenPos.column); screenPos.column = Math.round(offsetX / this.session.$bidiHandler.charWidths[0]); - } else { + } + else { offsetX = screenPos.column * this.session.$bidiHandler.charWidths[0]; } } - if (this.$desiredColumn) screenPos.column = this.$desiredColumn; else this.$desiredColumn = screenPos.column; } - if (rows != 0 && this.session.lineWidgets && this.session.lineWidgets[this.lead.row]) { var widget = this.session.lineWidgets[this.lead.row]; if (rows < 0) @@ -5521,24 +5806,20 @@ var Selection = function(session) { else if (rows > 0) rows += widget.rowCount - (widget.rowsAbove || 0); } - var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column, offsetX); - if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) { - } this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0); }; - this.moveCursorToPosition = function(position) { + Selection.prototype.moveCursorToPosition = function (position) { this.moveCursorTo(position.row, position.column); }; - this.moveCursorTo = function(row, column, keepDesiredColumn) { + Selection.prototype.moveCursorTo = function (row, column, keepDesiredColumn) { var fold = this.session.getFoldAt(row, column, 1); if (fold) { row = fold.start.row; column = fold.start.column; } - this.$keepDesiredColumnOnChange = true; var line = this.session.getLine(row); if (/[\uDC00-\uDFFF]/.test(line.charAt(column)) && line.charAt(column - 1)) { @@ -5549,78 +5830,75 @@ var Selection = function(session) { } this.lead.setPosition(row, column); this.$keepDesiredColumnOnChange = false; - if (!keepDesiredColumn) this.$desiredColumn = null; }; - this.moveCursorToScreen = function(row, column, keepDesiredColumn) { + Selection.prototype.moveCursorToScreen = function (row, column, keepDesiredColumn) { var pos = this.session.screenToDocumentPosition(row, column); this.moveCursorTo(pos.row, pos.column, keepDesiredColumn); }; - this.detach = function() { + Selection.prototype.detach = function () { this.lead.detach(); this.anchor.detach(); }; - - this.fromOrientedRange = function(range) { + Selection.prototype.fromOrientedRange = function (range) { this.setSelectionRange(range, range.cursor == range.start); this.$desiredColumn = range.desiredColumn || this.$desiredColumn; }; - - this.toOrientedRange = function(range) { + Selection.prototype.toOrientedRange = function (range) { var r = this.getRange(); if (range) { range.start.column = r.start.column; range.start.row = r.start.row; range.end.column = r.end.column; range.end.row = r.end.row; - } else { + } + else { range = r; } - range.cursor = this.isBackwards() ? range.start : range.end; range.desiredColumn = this.$desiredColumn; return range; }; - this.getRangeOfMovements = function(func) { + Selection.prototype.getRangeOfMovements = function (func) { var start = this.getCursor(); try { func(this); var end = this.getCursor(); return Range.fromPoints(start, end); - } catch(e) { + } + catch (e) { return Range.fromPoints(start, start); - } finally { + } + finally { this.moveCursorToPosition(start); } }; - - this.toJSON = function() { - if (this.rangeCount) { - var data = this.ranges.map(function(r) { + Selection.prototype.toJSON = function () { + if (this.rangeCount) { var data = this.ranges.map(function (r) { var r1 = r.clone(); r1.isBackwards = r.cursor == r.start; return r1; }); - } else { - var data = this.getRange(); + } + else { var data = this.getRange(); data.isBackwards = this.isBackwards(); } return data; }; - - this.fromJSON = function(data) { + Selection.prototype.fromJSON = function (data) { if (data.start == undefined) { if (this.rangeList && data.length > 1) { this.toSingleRange(data[0]); - for (var i = data.length; i--; ) { + for (var i = data.length; i--;) { var r = Range.fromPoints(data[i].start, data[i].end); if (data[i].isBackwards) r.cursor = r.start; this.addRange(r, true); } return; - } else { + } + else { data = data[0]; } } @@ -5628,124 +5906,117 @@ var Selection = function(session) { this.toSingleRange(data); this.setSelectionRange(data, data.isBackwards); }; - - this.isEqual = function(data) { + Selection.prototype.isEqual = function (data) { if ((data.length || this.rangeCount) && data.length != this.rangeCount) return false; if (!data.length || !this.ranges) return this.getRange().isEqual(data); - - for (var i = this.ranges.length; i--; ) { + for (var i = this.ranges.length; i--;) { if (!this.ranges[i].isEqual(data[i])) return false; } return true; }; - -}).call(Selection.prototype); - + return Selection; +}()); +Selection.prototype.setSelectionAnchor = Selection.prototype.setAnchor; +Selection.prototype.getSelectionAnchor = Selection.prototype.getAnchor; +Selection.prototype.setSelectionRange = Selection.prototype.setRange; +oop.implement(Selection.prototype, EventEmitter); exports.Selection = Selection; -}); -define("ace/tokenizer",["require","exports","module","ace/config"], function(require, exports, module) { -"use strict"; +}); -var config = require("./config"); +define("ace/tokenizer",["require","exports","module","ace/lib/report_error"], function(require, exports, module){"use strict"; +var reportError = require("./lib/report_error").reportError; var MAX_TOKEN_COUNT = 2000; -var Tokenizer = function(rules) { - this.states = rules; - - this.regExps = {}; - this.matchMappings = {}; - for (var key in this.states) { - var state = this.states[key]; - var ruleRegExps = []; - var matchTotal = 0; - var mapping = this.matchMappings[key] = {defaultToken: "text"}; - var flag = "g"; - - var splitterRurles = []; - for (var i = 0; i < state.length; i++) { - var rule = state[i]; - if (rule.defaultToken) - mapping.defaultToken = rule.defaultToken; - if (rule.caseInsensitive && flag.indexOf("i") === -1) - flag += "i"; - if (rule.unicode && flag.indexOf("u") === -1) - flag += "u"; - if (rule.regex == null) - continue; - - if (rule.regex instanceof RegExp) - rule.regex = rule.regex.toString().slice(1, -1); - var adjustedregex = rule.regex; - var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2; - if (Array.isArray(rule.token)) { - if (rule.token.length == 1 || matchcount == 1) { - rule.token = rule.token[0]; - } else if (matchcount - 1 != rule.token.length) { - this.reportError("number of classes and regexp groups doesn't match", { - rule: rule, - groupCount: matchcount - 1 - }); - rule.token = rule.token[0]; - } else { - rule.tokenArray = rule.token; - rule.token = null; - rule.onMatch = this.$arrayTokens; - } - } else if (typeof rule.token == "function" && !rule.onMatch) { - if (matchcount > 1) - rule.onMatch = this.$applyToken; - else - rule.onMatch = rule.token; - } - - if (matchcount > 1) { - if (/\\\d/.test(rule.regex)) { - adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function(match, digit) { - return "\\" + (parseInt(digit, 10) + matchTotal + 1); - }); - } else { - matchcount = 1; - adjustedregex = this.removeCapturingGroups(rule.regex); +var Tokenizer = /** @class */ (function () { + function Tokenizer(rules) { + this.splitRegex; + this.states = rules; + this.regExps = {}; + this.matchMappings = {}; + for (var key in this.states) { + var state = this.states[key]; + var ruleRegExps = []; + var matchTotal = 0; + var mapping = this.matchMappings[key] = { defaultToken: "text" }; + var flag = "g"; + var splitterRurles = []; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.defaultToken) + mapping.defaultToken = rule.defaultToken; + if (rule.caseInsensitive && flag.indexOf("i") === -1) + flag += "i"; + if (rule.unicode && flag.indexOf("u") === -1) + flag += "u"; + if (rule.regex == null) + continue; + if (rule.regex instanceof RegExp) + rule.regex = rule.regex.toString().slice(1, -1); + var adjustedregex = rule.regex; + var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2; + if (Array.isArray(rule.token)) { + if (rule.token.length == 1 || matchcount == 1) { + rule.token = rule.token[0]; + } + else if (matchcount - 1 != rule.token.length) { + this.reportError("number of classes and regexp groups doesn't match", { + rule: rule, + groupCount: matchcount - 1 + }); + rule.token = rule.token[0]; + } + else { + rule.tokenArray = rule.token; + rule.token = null; + rule.onMatch = this.$arrayTokens; + } } - if (!rule.splitRegex && typeof rule.token != "string") - splitterRurles.push(rule); // flag will be known only at the very end - } - - mapping[matchTotal] = i; - matchTotal += matchcount; - - ruleRegExps.push(adjustedregex); - if (!rule.onMatch) - rule.onMatch = null; - } - - if (!ruleRegExps.length) { - mapping[0] = 0; - ruleRegExps.push("$"); - } - - splitterRurles.forEach(function(rule) { - rule.splitRegex = this.createSplitterRegexp(rule.regex, flag); - }, this); - - this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag); + else if (typeof rule.token == "function" && !rule.onMatch) { + if (matchcount > 1) + rule.onMatch = this.$applyToken; + else + rule.onMatch = rule.token; + } + if (matchcount > 1) { + if (/\\\d/.test(rule.regex)) { + adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function (match, digit) { + return "\\" + (parseInt(digit, 10) + matchTotal + 1); + }); + } + else { + matchcount = 1; + adjustedregex = this.removeCapturingGroups(rule.regex); + } + if (!rule.splitRegex && typeof rule.token != "string") + splitterRurles.push(rule); // flag will be known only at the very end + } + mapping[matchTotal] = i; + matchTotal += matchcount; + ruleRegExps.push(adjustedregex); + if (!rule.onMatch) + rule.onMatch = null; + } + if (!ruleRegExps.length) { + mapping[0] = 0; + ruleRegExps.push("$"); + } + splitterRurles.forEach(function (rule) { + rule.splitRegex = this.createSplitterRegexp(rule.regex, flag); + }, this); + this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag); + } } -}; - -(function() { - this.$setMaxTokenCount = function(m) { + Tokenizer.prototype.$setMaxTokenCount = function (m) { MAX_TOKEN_COUNT = m | 0; }; - - this.$applyToken = function(str) { + Tokenizer.prototype.$applyToken = function (str) { var values = this.splitRegex.exec(str).slice(1); var types = this.token.apply(this, values); if (typeof types === "string") - return [{type: types, value: str}]; - + return [{ type: types, value: str }]; var tokens = []; for (var i = 0, l = types.length; i < l; i++) { if (values[i]) @@ -5756,8 +6027,7 @@ var Tokenizer = function(rules) { } return tokens; }; - - this.$arrayTokens = function(str) { + Tokenizer.prototype.$arrayTokens = function (str) { if (!str) return []; var values = this.splitRegex.exec(str); @@ -5774,34 +6044,30 @@ var Tokenizer = function(rules) { } return tokens; }; - - this.removeCapturingGroups = function(src) { - var r = src.replace( - /\\.|\[(?:\\.|[^\\\]])*|\(\?[:=!<]|(\()/g, - function(x, y) {return y ? "(?:" : x;} - ); + Tokenizer.prototype.removeCapturingGroups = function (src) { + var r = src.replace(/\\.|\[(?:\\.|[^\\\]])*|\(\?[:=!<]|(\()/g, function (x, y) { return y ? "(?:" : x; }); return r; }; - - this.createSplitterRegexp = function(src, flag) { + Tokenizer.prototype.createSplitterRegexp = function (src, flag) { if (src.indexOf("(?=") != -1) { var stack = 0; var inChClass = false; var lastCapture = {}; - src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function( - m, esc, parenOpen, parenClose, square, index - ) { + src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function (m, esc, parenOpen, parenClose, square, index) { if (inChClass) { inChClass = square != "]"; - } else if (square) { + } + else if (square) { inChClass = true; - } else if (parenClose) { + } + else if (parenClose) { if (stack == lastCapture.stack) { - lastCapture.end = index+1; + lastCapture.end = index + 1; lastCapture.stack = -1; } stack--; - } else if (parenOpen) { + } + else if (parenOpen) { stack++; if (parenOpen.length != 1) { lastCapture.stack = stack; @@ -5810,16 +6076,16 @@ var Tokenizer = function(rules) { } return m; }); - if (lastCapture.end != null && /^\)*$/.test(src.substr(lastCapture.end))) src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end); } - if (src.charAt(0) != "^") src = "^" + src; - if (src.charAt(src.length - 1) != "$") src += "$"; - - return new RegExp(src, (flag||"").replace("g", "")); + if (src.charAt(0) != "^") + src = "^" + src; + if (src.charAt(src.length - 1) != "$") + src += "$"; + return new RegExp(src, (flag || "").replace("g", "")); }; - this.getLineTokens = function(line, startState) { + Tokenizer.prototype.getLineTokens = function (line, startState) { if (startState && typeof startState != "string") { var stack = startState.slice(0); startState = stack[0]; @@ -5827,10 +6093,10 @@ var Tokenizer = function(rules) { stack.shift(); startState = stack.shift(); } - } else + } + else var stack = []; - - var currentState = startState || "start"; + var currentState = /**@type{string}*/ (startState) || "start"; var state = this.states[currentState]; if (!state) { currentState = "start"; @@ -5839,48 +6105,41 @@ var Tokenizer = function(rules) { var mapping = this.matchMappings[currentState]; var re = this.regExps[currentState]; re.lastIndex = 0; - var match, tokens = []; var lastIndex = 0; var matchAttempts = 0; - - var token = {type: null, value: ""}; - + var token = { type: null, value: "" }; while (match = re.exec(line)) { var type = mapping.defaultToken; var rule = null; var value = match[0]; var index = re.lastIndex; - if (index - value.length > lastIndex) { var skipped = line.substring(lastIndex, index - value.length); if (token.type == type) { token.value += skipped; - } else { + } + else { if (token.type) tokens.push(token); - token = {type: type, value: skipped}; + token = { type: type, value: skipped }; } } - - for (var i = 0; i < match.length-2; i++) { + for (var i = 0; i < match.length - 2; i++) { if (match[i + 1] === undefined) continue; - rule = state[mapping[i]]; - if (rule.onMatch) type = rule.onMatch(value, currentState, stack, line); else type = rule.token; - if (rule.next) { if (typeof rule.next == "string") { currentState = rule.next; - } else { + } + else { currentState = rule.next(currentState, stack); } - state = this.states[currentState]; if (!state) { this.reportError("state doesn't exist", currentState); @@ -5896,30 +6155,28 @@ var Tokenizer = function(rules) { lastIndex = index; break; } - if (value) { if (typeof type === "string") { if ((!rule || rule.merge !== false) && token.type === type) { token.value += value; - } else { + } + else { if (token.type) tokens.push(token); - token = {type: type, value: value}; + token = { type: type, value: value }; } - } else if (type) { + } + else if (type) { if (token.type) tokens.push(token); - token = {type: null, value: ""}; + token = { type: null, value: "" }; for (var i = 0; i < type.length; i++) tokens.push(type[i]); } } - if (lastIndex == line.length) break; - lastIndex = index; - if (matchAttempts++ > MAX_TOKEN_COUNT) { if (matchAttempts > 2 * line.length) { this.reportError("infinite loop with in ace tokenizer", { @@ -5940,47 +6197,39 @@ var Tokenizer = function(rules) { break; } } - if (token.type) tokens.push(token); - if (stack.length > 1) { if (stack[0] !== currentState) stack.unshift("#tmp", currentState); } return { - tokens : tokens, - state : stack.length ? stack : currentState + tokens: tokens, + state: stack.length ? stack : currentState }; }; - - this.reportError = config.reportError; - -}).call(Tokenizer.prototype); - + return Tokenizer; +}()); +Tokenizer.prototype.reportError = reportError; exports.Tokenizer = Tokenizer; -}); - -define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"], function(require, exports, module) { -"use strict"; -var lang = require("../lib/lang"); - -var TextHighlightRules = function() { +}); +define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/deep_copy"], function(require, exports, module){"use strict"; +var deepCopy = require("../lib/deep_copy").deepCopy; +var TextHighlightRules; +TextHighlightRules = function () { this.$rules = { - "start" : [{ - token : "empty_line", - regex : '^$' - }, { - defaultToken : "text" - }] + "start": [{ + token: "empty_line", + regex: '^$' + }, { + defaultToken: "text" + }] }; }; - -(function() { - - this.addRules = function(rules, prefix) { +(function () { + this.addRules = function (rules, prefix) { if (!prefix) { for (var key in rules) this.$rules[key] = rules[key]; @@ -6002,11 +6251,9 @@ var TextHighlightRules = function() { this.$rules[prefix + key] = state; } }; - - this.getRules = function() { + this.getRules = function () { return this.$rules; }; - this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) { var embedRules = typeof HighlightRules == "function" ? new HighlightRules().getRules() @@ -6014,45 +6261,40 @@ var TextHighlightRules = function() { if (states) { for (var i = 0; i < states.length; i++) states[i] = prefix + states[i]; - } else { + } + else { states = []; for (var key in embedRules) states.push(prefix + key); } - this.addRules(embedRules, prefix); - if (escapeRules) { var addRules = Array.prototype[append ? "push" : "unshift"]; for (var i = 0; i < states.length; i++) - addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules)); + addRules.apply(this.$rules[states[i]], deepCopy(escapeRules)); } - if (!this.$embeds) this.$embeds = []; this.$embeds.push(prefix); }; - - this.getEmbeds = function() { + this.getEmbeds = function () { return this.$embeds; }; - - var pushState = function(currentState, stack) { + var pushState = function (currentState, stack) { if (currentState != "start" || stack.length) stack.unshift(this.nextState, currentState); return this.nextState; }; - var popState = function(currentState, stack) { + var popState = function (currentState, stack) { stack.shift(); return stack.shift() || "start"; }; - - this.normalizeRules = function() { + this.normalizeRules = function () { var id = 0; var rules = this.$rules; function processState(key) { var state = rules[key]; - state.processed = true; + state["processed"] = true; for (var i = 0; i < state.length; i++) { var rule = state[i]; var toInsert = null; @@ -6077,7 +6319,7 @@ var TextHighlightRules = function() { var next = rule.next || rule.push; if (next && Array.isArray(next)) { var stateName = rule.stateName; - if (!stateName) { + if (!stateName) { stateName = rule.token; if (typeof stateName != "string") stateName = stateName[0] || ""; @@ -6087,101 +6329,92 @@ var TextHighlightRules = function() { rules[stateName] = next; rule.next = stateName; processState(stateName); - } else if (next == "pop") { + } + else if (next == "pop") { rule.next = popState; } - if (rule.push) { rule.nextState = rule.next || rule.push; rule.next = pushState; delete rule.push; } - if (rule.rules) { for (var r in rule.rules) { if (rules[r]) { if (rules[r].push) rules[r].push.apply(rules[r], rule.rules[r]); - } else { + } + else { rules[r] = rule.rules[r]; } } } var includeName = typeof rule == "string" ? rule : rule.include; if (includeName) { + if (includeName === "$self") + includeName = "start"; if (Array.isArray(includeName)) - toInsert = includeName.map(function(x) { return rules[x]; }); + toInsert = includeName.map(function (x) { return rules[x]; }); else toInsert = rules[includeName]; } - if (toInsert) { var args = [i, 1].concat(toInsert); if (rule.noEscape) - args = args.filter(function(x) {return !x.next;}); + args = args.filter(function (x) { return !x.next; }); state.splice.apply(state, args); i--; } - if (rule.keywordMap) { - rule.token = this.createKeywordMapper( - rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive - ); + rule.token = this.createKeywordMapper(rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive); delete rule.defaultToken; } } } Object.keys(rules).forEach(processState, this); }; - - this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) { + this.createKeywordMapper = function (map, defaultToken, ignoreCase, splitChar) { var keywords = Object.create(null); this.$keywordList = []; - Object.keys(map).forEach(function(className) { + Object.keys(map).forEach(function (className) { var a = map[className]; var list = a.split(splitChar || "|"); - for (var i = list.length; i--; ) { + for (var i = list.length; i--;) { var word = list[i]; this.$keywordList.push(word); if (ignoreCase) - word = word.toLowerCase(); + word = word.toLowerCase(); keywords[word] = className; } }, this); map = null; return ignoreCase - ? function(value) {return keywords[value.toLowerCase()] || defaultToken; } - : function(value) {return keywords[value] || defaultToken; }; + ? function (value) { return keywords[value.toLowerCase()] || defaultToken; } + : function (value) { return keywords[value] || defaultToken; }; }; - - this.getKeywords = function() { + this.getKeywords = function () { return this.$keywords; }; - }).call(TextHighlightRules.prototype); - exports.TextHighlightRules = TextHighlightRules; -}); -define("ace/mode/behaviour",["require","exports","module"], function(require, exports, module) { -"use strict"; +}); -var Behaviour = function() { - this.$behaviours = {}; +define("ace/mode/behaviour",["require","exports","module"], function(require, exports, module){"use strict"; +var Behaviour; +Behaviour = function () { + this.$behaviours = {}; }; - (function () { - this.add = function (name, action, callback) { switch (undefined) { - case this.$behaviours: - this.$behaviours = {}; - case this.$behaviours[name]: - this.$behaviours[name] = {}; + case this.$behaviours: + this.$behaviours = {}; + case this.$behaviours[name]: + this.$behaviours[name] = {}; } this.$behaviours[name][action] = callback; }; - this.addBehaviours = function (behaviours) { for (var key in behaviours) { for (var action in behaviours[key]) { @@ -6189,26 +6422,25 @@ var Behaviour = function() { } } }; - this.remove = function (name) { if (this.$behaviours && this.$behaviours[name]) { delete this.$behaviours[name]; } }; - this.inherit = function (mode, filter) { if (typeof mode === "function") { var behaviours = new mode().getBehaviours(filter); - } else { + } + else { var behaviours = mode.getBehaviours(filter); } this.addBehaviours(behaviours); }; - this.getBehaviours = function (filter) { if (!filter) { return this.$behaviours; - } else { + } + else { var ret = {}; for (var i = 0; i < filter.length; i++) { if (this.$behaviours[filter[i]]) { @@ -6218,43 +6450,35 @@ var Behaviour = function() { return ret; } }; - }).call(Behaviour.prototype); - exports.Behaviour = Behaviour; -}); -define("ace/token_iterator",["require","exports","module","ace/range"], function(require, exports, module) { -"use strict"; +}); +define("ace/token_iterator",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; var Range = require("./range").Range; -var TokenIterator = function(session, initialRow, initialColumn) { - this.$session = session; - this.$row = initialRow; - this.$rowTokens = session.getTokens(initialRow); - - var token = session.getTokenAt(initialRow, initialColumn); - this.$tokenIndex = token ? token.index : -1; -}; - -(function() { - this.stepBackward = function() { +var TokenIterator = /** @class */ (function () { + function TokenIterator(session, initialRow, initialColumn) { + this.$session = session; + this.$row = initialRow; + this.$rowTokens = session.getTokens(initialRow); + var token = session.getTokenAt(initialRow, initialColumn); + this.$tokenIndex = token ? token.index : -1; + } + TokenIterator.prototype.stepBackward = function () { this.$tokenIndex -= 1; - while (this.$tokenIndex < 0) { this.$row -= 1; if (this.$row < 0) { this.$row = 0; return null; } - this.$rowTokens = this.$session.getTokens(this.$row); this.$tokenIndex = this.$rowTokens.length - 1; } - return this.$rowTokens[this.$tokenIndex]; - }; - this.stepForward = function() { + }; + TokenIterator.prototype.stepForward = function () { this.$tokenIndex += 1; var rowCount; while (this.$tokenIndex >= this.$rowTokens.length) { @@ -6265,71 +6489,60 @@ var TokenIterator = function(session, initialRow, initialColumn) { this.$row = rowCount - 1; return null; } - this.$rowTokens = this.$session.getTokens(this.$row); this.$tokenIndex = 0; } - return this.$rowTokens[this.$tokenIndex]; - }; - this.getCurrentToken = function () { + }; + TokenIterator.prototype.getCurrentToken = function () { return this.$rowTokens[this.$tokenIndex]; - }; - this.getCurrentTokenRow = function () { + }; + TokenIterator.prototype.getCurrentTokenRow = function () { return this.$row; - }; - this.getCurrentTokenColumn = function() { + }; + TokenIterator.prototype.getCurrentTokenColumn = function () { var rowTokens = this.$rowTokens; var tokenIndex = this.$tokenIndex; var column = rowTokens[tokenIndex].start; if (column !== undefined) return column; - column = 0; while (tokenIndex > 0) { tokenIndex -= 1; column += rowTokens[tokenIndex].value.length; } - - return column; + return column; }; - this.getCurrentTokenPosition = function() { - return {row: this.$row, column: this.getCurrentTokenColumn()}; + TokenIterator.prototype.getCurrentTokenPosition = function () { + return { row: this.$row, column: this.getCurrentTokenColumn() }; }; - this.getCurrentTokenRange = function() { + TokenIterator.prototype.getCurrentTokenRange = function () { var token = this.$rowTokens[this.$tokenIndex]; var column = this.getCurrentTokenColumn(); return new Range(this.$row, column, this.$row, column + token.value.length); }; - -}).call(TokenIterator.prototype); - + return TokenIterator; +}()); exports.TokenIterator = TokenIterator; -}); -define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { -"use strict"; +}); +define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module){"use strict"; var oop = require("../../lib/oop"); var Behaviour = require("../behaviour").Behaviour; var TokenIterator = require("../../token_iterator").TokenIterator; var lang = require("../../lib/lang"); - -var SAFE_INSERT_IN_TOKENS = - ["text", "paren.rparen", "rparen", "paren", "punctuation.operator"]; -var SAFE_INSERT_BEFORE_TOKENS = - ["text", "paren.rparen", "rparen", "paren", "punctuation.operator", "comment"]; - +var SAFE_INSERT_IN_TOKENS = ["text", "paren.rparen", "rparen", "paren", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = ["text", "paren.rparen", "rparen", "paren", "punctuation.operator", "comment"]; var context; var contextCache = {}; -var defaultQuotes = {'"' : '"', "'" : "'"}; - -var initContext = function(editor) { +var defaultQuotes = { '"': '"', "'": "'" }; +var initContext = function (editor) { var id = -1; if (editor.multiSelect) { id = editor.selection.index; if (contextCache.rangeCount != editor.multiSelect.rangeCount) - contextCache = {rangeCount: editor.multiSelect.rangeCount}; + contextCache = { rangeCount: editor.multiSelect.rangeCount }; } if (contextCache[id]) return context = contextCache[id]; @@ -6343,38 +6556,54 @@ var initContext = function(editor) { maybeInsertedLineEnd: "" }; }; - -var getWrapped = function(selection, selected, opening, closing) { +var getWrapped = function (selection, selected, opening, closing) { var rowDiff = selection.end.row - selection.start.row; return { text: opening + selected + closing, selection: [ - 0, - selection.start.column + 1, - rowDiff, - selection.end.column + (rowDiff ? 0 : 1) - ] + 0, + selection.start.column + 1, + rowDiff, + selection.end.column + (rowDiff ? 0 : 1) + ] }; }; - -var CstyleBehaviour = function(options) { - this.add("braces", "insertion", function(state, action, editor, session, text) { +var CstyleBehaviour; +CstyleBehaviour = function (options) { + options = options || {}; + this.add("braces", "insertion", function (state, action, editor, session, text) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); if (text == '{') { initContext(editor); var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); + var token = session.getTokenAt(cursor.row, cursor.column); if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { return getWrapped(selection, selected, '{', '}'); - } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { - if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options && options.braces) { + } + else if (token && /(?:string)\.quasi|\.xml/.test(token.type)) { + var excludeTokens = [ + /tag\-(?:open|name)/, /attribute\-name/ + ]; + if (excludeTokens.some(function (el) { return el.test(token.type); }) || /(string)\.quasi/.test(token.type) + && token.value[cursor.column - token.start - 1] !== '$') + return; + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } + else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options.braces) { CstyleBehaviour.recordAutoInsert(editor, session, "}"); return { text: '{}', selection: [1, 1] }; - } else { + } + else { CstyleBehaviour.recordMaybeInsert(editor, session, "{"); return { text: '{', @@ -6382,11 +6611,12 @@ var CstyleBehaviour = function(options) { }; } } - } else if (text == '}') { + } + else if (text == '}') { initContext(editor); var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == '}') { - var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + var matching = session.$findOpeningBracket('}', { column: cursor.column + 1, row: cursor.row }); if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { CstyleBehaviour.popAutoInsertedClosing(); return { @@ -6395,7 +6625,8 @@ var CstyleBehaviour = function(options) { }; } } - } else if (text == "\n" || text == "\r\n") { + } + else if (text == "\n" || text == "\r\n") { initContext(editor); var closing = ""; if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { @@ -6404,28 +6635,29 @@ var CstyleBehaviour = function(options) { } var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar === '}') { - var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}'); + var openBracePos = session.findMatchingBracket({ row: cursor.row, column: cursor.column + 1 }, '}'); if (!openBracePos) - return null; + return null; var next_indent = this.$getIndent(session.getLine(openBracePos.row)); - } else if (closing) { + } + else if (closing) { var next_indent = this.$getIndent(line); - } else { + } + else { CstyleBehaviour.clearMaybeInsertedClosing(); return; } var indent = next_indent + session.getTabString(); - return { text: '\n' + indent + '\n' + next_indent + closing, selection: [1, indent.length, 1, indent.length] }; - } else { + } + else { CstyleBehaviour.clearMaybeInsertedClosing(); } }); - - this.add("braces", "deletion", function(state, action, editor, session, range) { + this.add("braces", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && selected == '{') { initContext(editor); @@ -6434,33 +6666,35 @@ var CstyleBehaviour = function(options) { if (rightChar == '}') { range.end.column++; return range; - } else { + } + else { context.maybeInsertedBrackets--; } } }); - - this.add("parens", "insertion", function(state, action, editor, session, text) { + this.add("parens", "insertion", function (state, action, editor, session, text) { if (text == '(') { initContext(editor); var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); if (selected !== "" && editor.getWrapBehavioursEnabled()) { return getWrapped(selection, selected, '(', ')'); - } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + } + else if (CstyleBehaviour.isSaneInsertion(editor, session)) { CstyleBehaviour.recordAutoInsert(editor, session, ")"); return { text: '()', selection: [1, 1] }; } - } else if (text == ')') { + } + else if (text == ')') { initContext(editor); var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == ')') { - var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + var matching = session.$findOpeningBracket(')', { column: cursor.column + 1, row: cursor.row }); if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { CstyleBehaviour.popAutoInsertedClosing(); return { @@ -6471,8 +6705,7 @@ var CstyleBehaviour = function(options) { } } }); - - this.add("parens", "deletion", function(state, action, editor, session, range) { + this.add("parens", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && selected == '(') { initContext(editor); @@ -6484,28 +6717,29 @@ var CstyleBehaviour = function(options) { } } }); - - this.add("brackets", "insertion", function(state, action, editor, session, text) { + this.add("brackets", "insertion", function (state, action, editor, session, text) { if (text == '[') { initContext(editor); var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); if (selected !== "" && editor.getWrapBehavioursEnabled()) { return getWrapped(selection, selected, '[', ']'); - } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + } + else if (CstyleBehaviour.isSaneInsertion(editor, session)) { CstyleBehaviour.recordAutoInsert(editor, session, "]"); return { text: '[]', selection: [1, 1] }; } - } else if (text == ']') { + } + else if (text == ']') { initContext(editor); var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == ']') { - var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + var matching = session.$findOpeningBracket(']', { column: cursor.column + 1, row: cursor.row }); if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { CstyleBehaviour.popAutoInsertedClosing(); return { @@ -6516,8 +6750,7 @@ var CstyleBehaviour = function(options) { } } }); - - this.add("brackets", "deletion", function(state, action, editor, session, range) { + this.add("brackets", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && selected == '[') { initContext(editor); @@ -6529,11 +6762,10 @@ var CstyleBehaviour = function(options) { } } }); - - this.add("string_dquotes", "insertion", function(state, action, editor, session, text) { + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { var quotes = session.$mode.$quotes || defaultQuotes; if (text.length == 1 && quotes[text]) { - if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1) + if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1) return; initContext(editor); var quote = text; @@ -6541,26 +6773,25 @@ var CstyleBehaviour = function(options) { var selected = session.doc.getTextRange(selection); if (selected !== "" && (selected.length != 1 || !quotes[selected]) && editor.getWrapBehavioursEnabled()) { return getWrapped(selection, selected, quote, quote); - } else if (!selected) { + } + else if (!selected) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); - var leftChar = line.substring(cursor.column-1, cursor.column); + var leftChar = line.substring(cursor.column - 1, cursor.column); var rightChar = line.substring(cursor.column, cursor.column + 1); - var token = session.getTokenAt(cursor.row, cursor.column); var rightToken = session.getTokenAt(cursor.row, cursor.column + 1); if (leftChar == "\\" && token && /escape/.test(token.type)) return null; - var stringBefore = token && /string|escape/.test(token.type); var stringAfter = !rightToken || /string|escape/.test(rightToken.type); - var pair; if (rightChar == quote) { pair = stringBefore !== stringAfter; if (pair && /string\.end/.test(rightToken.type)) pair = false; - } else { + } + else { if (stringBefore && !stringAfter) return null; // wrap string with different quote if (stringBefore && stringAfter) @@ -6569,27 +6800,27 @@ var CstyleBehaviour = function(options) { wordRe.lastIndex = 0; var isWordBefore = wordRe.test(leftChar); wordRe.lastIndex = 0; - var isWordAfter = wordRe.test(leftChar); - if (isWordBefore || isWordAfter) + var isWordAfter = wordRe.test(rightChar); + var pairQuotesAfter = session.$mode.$pairQuotesAfter; + var shouldPairQuotes = pairQuotesAfter && pairQuotesAfter[quote] && pairQuotesAfter[quote].test(leftChar); + if ((!shouldPairQuotes && isWordBefore) || isWordAfter) return null; // before or after alphanumeric if (rightChar && !/[\s;,.})\]\\]/.test(rightChar)) return null; // there is rightChar and it isn't closing var charBefore = line[cursor.column - 2]; - if (leftChar == quote && (charBefore == quote || wordRe.test(charBefore))) + if (leftChar == quote && (charBefore == quote || wordRe.test(charBefore))) return null; pair = true; } return { text: pair ? quote + quote : "", - selection: [1,1] + selection: [1, 1] }; } } }); - - this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { var quotes = session.$mode.$quotes || defaultQuotes; - var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && quotes.hasOwnProperty(selected)) { initContext(editor); @@ -6601,11 +6832,71 @@ var CstyleBehaviour = function(options) { } } }); - + if (options.closeDocComment !== false) { + this.add("doc comment end", "insertion", function (state, action, editor, session, text) { + if (state === "doc-start" && (text === "\n" || text === "\r\n") && editor.selection.isEmpty()) { + var cursor = editor.getCursorPosition(); + if (cursor.column === 0) { + return; + } + var line = session.doc.getLine(cursor.row); + var nextLine = session.doc.getLine(cursor.row + 1); + var tokens = session.getTokens(cursor.row); + var index = 0; + for (var i = 0; i < tokens.length; i++) { + index += tokens[i].value.length; + var currentToken = tokens[i]; + if (index >= cursor.column) { + if (index === cursor.column) { + if (!/\.doc/.test(currentToken.type)) { + return; + } + if (/\*\//.test(currentToken.value)) { + var nextToken = tokens[i + 1]; + if (!nextToken || !/\.doc/.test(nextToken.type)) { + return; + } + } + } + var cursorPosInToken = cursor.column - (index - currentToken.value.length); + var closeDocPos = currentToken.value.indexOf("*/"); + var openDocPos = currentToken.value.indexOf("/**", closeDocPos > -1 ? closeDocPos + 2 : 0); + if (openDocPos !== -1 && cursorPosInToken > openDocPos && cursorPosInToken < openDocPos + 3) { + return; + } + if (closeDocPos !== -1 && openDocPos !== -1 && cursorPosInToken >= closeDocPos + && cursorPosInToken <= openDocPos || !/\.doc/.test(currentToken.type)) { + return; + } + break; + } + } + var indent = this.$getIndent(line); + if (/\s*\*/.test(nextLine)) { + if (/^\s*\*/.test(line)) { + return { + text: text + indent + "* ", + selection: [1, 2 + indent.length, 1, 2 + indent.length] + }; + } + else { + return { + text: text + indent + " * ", + selection: [1, 3 + indent.length, 1, 3 + indent.length] + }; + } + } + if (/\/\*\*/.test(line.substring(0, cursor.column))) { + return { + text: text + indent + " * " + text + " " + indent + "*/", + selection: [1, 4 + indent.length, 1, 4 + indent.length] + }; + } + } + }); + } }; - - -CstyleBehaviour.isSaneInsertion = function(editor, session) { +CstyleBehaviour.isSaneInsertion = function (editor, session) { var cursor = editor.getCursorPosition(); var iterator = new TokenIterator(session, cursor.row, cursor.column); if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { @@ -6619,69 +6910,57 @@ CstyleBehaviour.isSaneInsertion = function(editor, session) { return iterator.getCurrentTokenRow() !== cursor.row || this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); }; - -CstyleBehaviour.$matchTokenType = function(token, types) { +CstyleBehaviour["$matchTokenType"] = function (token, types) { return types.indexOf(token.type || token) > -1; }; - -CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { +CstyleBehaviour["recordAutoInsert"] = function (editor, session, bracket) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); - if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0])) + if (!this["isAutoInsertedClosing"](cursor, line, context.autoInsertedLineEnd[0])) context.autoInsertedBrackets = 0; context.autoInsertedRow = cursor.row; context.autoInsertedLineEnd = bracket + line.substr(cursor.column); context.autoInsertedBrackets++; }; - -CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { +CstyleBehaviour["recordMaybeInsert"] = function (editor, session, bracket) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); - if (!this.isMaybeInsertedClosing(cursor, line)) + if (!this["isMaybeInsertedClosing"](cursor, line)) context.maybeInsertedBrackets = 0; context.maybeInsertedRow = cursor.row; context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; context.maybeInsertedLineEnd = line.substr(cursor.column); context.maybeInsertedBrackets++; }; - -CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { +CstyleBehaviour["isAutoInsertedClosing"] = function (cursor, line, bracket) { return context.autoInsertedBrackets > 0 && cursor.row === context.autoInsertedRow && bracket === context.autoInsertedLineEnd[0] && line.substr(cursor.column) === context.autoInsertedLineEnd; }; - -CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { +CstyleBehaviour["isMaybeInsertedClosing"] = function (cursor, line) { return context.maybeInsertedBrackets > 0 && cursor.row === context.maybeInsertedRow && line.substr(cursor.column) === context.maybeInsertedLineEnd && line.substr(0, cursor.column) == context.maybeInsertedLineStart; }; - -CstyleBehaviour.popAutoInsertedClosing = function() { +CstyleBehaviour["popAutoInsertedClosing"] = function () { context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1); context.autoInsertedBrackets--; }; - -CstyleBehaviour.clearMaybeInsertedClosing = function() { +CstyleBehaviour["clearMaybeInsertedClosing"] = function () { if (context) { context.maybeInsertedBrackets = 0; context.maybeInsertedRow = -1; } }; - - - oop.inherits(CstyleBehaviour, Behaviour); - exports.CstyleBehaviour = CstyleBehaviour; -}); -define("ace/unicode",["require","exports","module"], function(require, exports, module) { -"use strict"; -var wordChars = [48,9,8,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,18,116,2,1,3,3,9,0,2,2,2,0,2,19,2,82,2,138,2,4,3,155,12,37,3,0,8,38,10,44,2,0,2,1,2,1,2,0,9,26,6,2,30,10,7,61,2,9,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,6,45,211,57,3,18,2,5,3,11,3,9,2,1,7,6,2,2,2,7,3,1,3,21,2,6,2,0,4,3,3,8,3,1,3,3,9,0,5,1,2,4,3,11,16,2,2,5,5,1,3,21,2,6,2,1,2,1,2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,3,9,2,2,2,2,3,0,16,3,3,9,18,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,3,2,9,1,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,5,4,4,2,2,3,3,0,7,0,15,9,18,2,2,7,2,2,2,22,2,9,2,4,4,7,2,2,2,3,8,1,2,1,7,3,3,9,19,1,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,8,0,2,3,3,9,19,1,2,7,2,2,2,22,2,15,4,7,2,2,2,3,10,0,9,3,3,9,11,5,3,1,2,17,4,23,2,8,2,0,3,6,4,0,5,5,2,0,2,7,19,1,14,57,6,14,2,9,40,1,2,0,3,1,2,0,3,0,7,3,2,6,2,2,2,0,2,0,3,1,2,12,2,2,3,4,2,0,2,5,3,9,3,1,35,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,5,5,7,2,35,10,0,58,73,7,77,3,37,11,42,2,0,4,328,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,5,0,33,15,17,84,13,619,3,16,2,25,6,74,22,12,2,6,12,20,12,19,13,12,2,2,2,1,13,51,3,29,4,0,5,1,3,9,34,2,3,9,7,87,9,42,6,69,11,28,4,11,5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,89,75,5,9,18,8,13,42,4,11,71,55,9,9,4,48,83,2,2,30,14,230,23,280,3,5,3,37,3,5,3,7,2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,67,1,20,0,29,0,14,0,17,4,60,12,5,0,4,11,18,0,5,0,3,9,2,0,4,4,7,0,2,0,2,0,2,3,2,10,3,3,6,4,5,0,53,1,2684,46,2,46,2,132,7,6,15,37,11,53,10,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,2,31,48,0,470,1,36,5,2,4,6,1,5,85,3,1,3,2,2,89,2,3,6,40,4,93,18,23,57,15,513,6581,75,20939,53,1164,68,45,3,268,4,27,21,31,3,13,13,1,2,24,9,69,11,1,38,8,3,102,3,1,111,44,25,51,13,68,12,9,7,23,4,0,5,45,3,35,13,28,4,64,15,10,39,54,10,13,3,9,7,22,4,1,5,66,25,2,227,42,2,1,3,9,7,11171,13,22,5,48,8453,301,3,61,3,105,39,6,13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,6,13,1,25,2,33,4,2,134,20,9,8,25,5,0,2,25,12,88,4,5,3,5,3,5,3,2]; +}); +define("ace/unicode",["require","exports","module"], function(require, exports, module){"use strict"; +var wordChars = [48, 9, 8, 25, 5, 0, 2, 25, 48, 0, 11, 0, 5, 0, 6, 22, 2, 30, 2, 457, 5, 11, 15, 4, 8, 0, 2, 0, 18, 116, 2, 1, 3, 3, 9, 0, 2, 2, 2, 0, 2, 19, 2, 82, 2, 138, 2, 4, 3, 155, 12, 37, 3, 0, 8, 38, 10, 44, 2, 0, 2, 1, 2, 1, 2, 0, 9, 26, 6, 2, 30, 10, 7, 61, 2, 9, 5, 101, 2, 7, 3, 9, 2, 18, 3, 0, 17, 58, 3, 100, 15, 53, 5, 0, 6, 45, 211, 57, 3, 18, 2, 5, 3, 11, 3, 9, 2, 1, 7, 6, 2, 2, 2, 7, 3, 1, 3, 21, 2, 6, 2, 0, 4, 3, 3, 8, 3, 1, 3, 3, 9, 0, 5, 1, 2, 4, 3, 11, 16, 2, 2, 5, 5, 1, 3, 21, 2, 6, 2, 1, 2, 1, 2, 1, 3, 0, 2, 4, 5, 1, 3, 2, 4, 0, 8, 3, 2, 0, 8, 15, 12, 2, 2, 8, 2, 2, 2, 21, 2, 6, 2, 1, 2, 4, 3, 9, 2, 2, 2, 2, 3, 0, 16, 3, 3, 9, 18, 2, 2, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 3, 8, 3, 1, 3, 2, 9, 1, 5, 1, 2, 4, 3, 9, 2, 0, 17, 1, 2, 5, 4, 2, 2, 3, 4, 1, 2, 0, 2, 1, 4, 1, 4, 2, 4, 11, 5, 4, 4, 2, 2, 3, 3, 0, 7, 0, 15, 9, 18, 2, 2, 7, 2, 2, 2, 22, 2, 9, 2, 4, 4, 7, 2, 2, 2, 3, 8, 1, 2, 1, 7, 3, 3, 9, 19, 1, 2, 7, 2, 2, 2, 22, 2, 9, 2, 4, 3, 8, 2, 2, 2, 3, 8, 1, 8, 0, 2, 3, 3, 9, 19, 1, 2, 7, 2, 2, 2, 22, 2, 15, 4, 7, 2, 2, 2, 3, 10, 0, 9, 3, 3, 9, 11, 5, 3, 1, 2, 17, 4, 23, 2, 8, 2, 0, 3, 6, 4, 0, 5, 5, 2, 0, 2, 7, 19, 1, 14, 57, 6, 14, 2, 9, 40, 1, 2, 0, 3, 1, 2, 0, 3, 0, 7, 3, 2, 6, 2, 2, 2, 0, 2, 0, 3, 1, 2, 12, 2, 2, 3, 4, 2, 0, 2, 5, 3, 9, 3, 1, 35, 0, 24, 1, 7, 9, 12, 0, 2, 0, 2, 0, 5, 9, 2, 35, 5, 19, 2, 5, 5, 7, 2, 35, 10, 0, 58, 73, 7, 77, 3, 37, 11, 42, 2, 0, 4, 328, 2, 3, 3, 6, 2, 0, 2, 3, 3, 40, 2, 3, 3, 32, 2, 3, 3, 6, 2, 0, 2, 3, 3, 14, 2, 56, 2, 3, 3, 66, 5, 0, 33, 15, 17, 84, 13, 619, 3, 16, 2, 25, 6, 74, 22, 12, 2, 6, 12, 20, 12, 19, 13, 12, 2, 2, 2, 1, 13, 51, 3, 29, 4, 0, 5, 1, 3, 9, 34, 2, 3, 9, 7, 87, 9, 42, 6, 69, 11, 28, 4, 11, 5, 11, 11, 39, 3, 4, 12, 43, 5, 25, 7, 10, 38, 27, 5, 62, 2, 28, 3, 10, 7, 9, 14, 0, 89, 75, 5, 9, 18, 8, 13, 42, 4, 11, 71, 55, 9, 9, 4, 48, 83, 2, 2, 30, 14, 230, 23, 280, 3, 5, 3, 37, 3, 5, 3, 7, 2, 0, 2, 0, 2, 0, 2, 30, 3, 52, 2, 6, 2, 0, 4, 2, 2, 6, 4, 3, 3, 5, 5, 12, 6, 2, 2, 6, 67, 1, 20, 0, 29, 0, 14, 0, 17, 4, 60, 12, 5, 0, 4, 11, 18, 0, 5, 0, 3, 9, 2, 0, 4, 4, 7, 0, 2, 0, 2, 0, 2, 3, 2, 10, 3, 3, 6, 4, 5, 0, 53, 1, 2684, 46, 2, 46, 2, 132, 7, 6, 15, 37, 11, 53, 10, 0, 17, 22, 10, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 31, 48, 0, 470, 1, 36, 5, 2, 4, 6, 1, 5, 85, 3, 1, 3, 2, 2, 89, 2, 3, 6, 40, 4, 93, 18, 23, 57, 15, 513, 6581, 75, 20939, 53, 1164, 68, 45, 3, 268, 4, 27, 21, 31, 3, 13, 13, 1, 2, 24, 9, 69, 11, 1, 38, 8, 3, 102, 3, 1, 111, 44, 25, 51, 13, 68, 12, 9, 7, 23, 4, 0, 5, 45, 3, 35, 13, 28, 4, 64, 15, 10, 39, 54, 10, 13, 3, 9, 7, 22, 4, 1, 5, 66, 25, 2, 227, 42, 2, 1, 3, 9, 7, 11171, 13, 22, 5, 48, 8453, 301, 3, 61, 3, 105, 39, 6, 13, 4, 6, 11, 2, 12, 2, 4, 2, 0, 2, 1, 2, 1, 2, 107, 34, 362, 19, 63, 3, 53, 41, 11, 5, 15, 17, 6, 13, 1, 25, 2, 33, 4, 2, 134, 20, 9, 8, 25, 5, 0, 2, 25, 12, 88, 4, 5, 3, 5, 3, 5, 3, 2]; var code = 0; var str = []; for (var i = 0; i < wordChars.length; i += 2) { @@ -6689,15 +6968,12 @@ for (var i = 0; i < wordChars.length; i += 2) { if (wordChars[i + 1]) str.push(45, code += wordChars[i + 1]); } - exports.wordChars = String.fromCharCode.apply(null, str); }); -define("ace/mode/text",["require","exports","module","ace/config","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"], function(require, exports, module) { -"use strict"; +define("ace/mode/text",["require","exports","module","ace/config","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"], function(require, exports, module){"use strict"; var config = require("../config"); - var Tokenizer = require("../tokenizer").Tokenizer; var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; @@ -6705,38 +6981,30 @@ var unicode = require("../unicode"); var lang = require("../lib/lang"); var TokenIterator = require("../token_iterator").TokenIterator; var Range = require("../range").Range; - -var Mode = function() { +var Mode; +Mode = function () { this.HighlightRules = TextHighlightRules; }; - -(function() { +(function () { this.$defaultBehaviour = new CstyleBehaviour(); - this.tokenRe = new RegExp("^[" + unicode.wordChars + "\\$_]+", "g"); - this.nonTokenRe = new RegExp("^(?:[^" + unicode.wordChars + "\\$_]|\\s])+", "g"); - - this.getTokenizer = function() { + this.getTokenizer = function () { if (!this.$tokenizer) { this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig); this.$tokenizer = new Tokenizer(this.$highlightRules.getRules()); } return this.$tokenizer; }; - this.lineCommentStart = ""; this.blockComment = ""; - - this.toggleCommentLines = function(state, session, startRow, endRow) { + this.toggleCommentLines = function (state, session, startRow, endRow) { var doc = session.doc; - var ignoreBlankLines = true; var shouldRemove = true; var minIndent = Infinity; var tabSize = session.getTabSize(); var insertAtTabStop = false; - if (!this.lineCommentStart) { if (!this.blockComment) return false; @@ -6744,25 +7012,22 @@ var Mode = function() { var lineCommentEnd = this.blockComment.end; var regexpStart = new RegExp("^(\\s*)(?:" + lang.escapeRegExp(lineCommentStart) + ")"); var regexpEnd = new RegExp("(?:" + lang.escapeRegExp(lineCommentEnd) + ")\\s*$"); - - var comment = function(line, i) { + var comment = function (line, i) { if (testRemove(line, i)) return; if (!ignoreBlankLines || /\S/.test(line)) { - doc.insertInLine({row: i, column: line.length}, lineCommentEnd); - doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + doc.insertInLine({ row: i, column: line.length }, lineCommentEnd); + doc.insertInLine({ row: i, column: minIndent }, lineCommentStart); } }; - - var uncomment = function(line, i) { + var uncomment = function (line, i) { var m; if (m = line.match(regexpEnd)) doc.removeInLine(i, line.length - m[0].length, line.length); if (m = line.match(regexpStart)) doc.removeInLine(i, m[1].length, m[0].length); }; - - var testRemove = function(line, row) { + var testRemove = function (line, row) { if (regexpStart.test(line)) return true; var tokens = session.getTokens(row); @@ -6771,40 +7036,40 @@ var Mode = function() { return true; } }; - } else { + } + else { if (Array.isArray(this.lineCommentStart)) { var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|"); var lineCommentStart = this.lineCommentStart[0]; - } else { + } + else { var regexpStart = lang.escapeRegExp(this.lineCommentStart); var lineCommentStart = this.lineCommentStart; } regexpStart = new RegExp("^(\\s*)(?:" + regexpStart + ") ?"); - insertAtTabStop = session.getUseSoftTabs(); - - var uncomment = function(line, i) { + var uncomment = function (line, i) { var m = line.match(regexpStart); - if (!m) return; + if (!m) + return; var start = m[1].length, end = m[0].length; if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == " ") end--; doc.removeInLine(i, start, end); }; var commentWithSpace = lineCommentStart + " "; - var comment = function(line, i) { + var comment = function (line, i) { if (!ignoreBlankLines || /\S/.test(line)) { if (shouldInsertSpace(line, minIndent, minIndent)) - doc.insertInLine({row: i, column: minIndent}, commentWithSpace); + doc.insertInLine({ row: i, column: minIndent }, commentWithSpace); else - doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + doc.insertInLine({ row: i, column: minIndent }, lineCommentStart); } }; - var testRemove = function(line, i) { + var testRemove = function (line, i) { return regexpStart.test(line); }; - - var shouldInsertSpace = function(line, before, after) { + var shouldInsertSpace = function (line, before, after) { var spaces = 0; while (before-- && line.charAt(before) == " ") spaces++; @@ -6819,52 +7084,43 @@ var Mode = function() { return spaces % tabSize == 0; }; } - function iter(fun) { for (var i = startRow; i <= endRow; i++) fun(doc.getLine(i), i); } - - var minEmptyLength = Infinity; - iter(function(line, i) { + iter(function (line, i) { var indent = line.search(/\S/); if (indent !== -1) { if (indent < minIndent) minIndent = indent; if (shouldRemove && !testRemove(line, i)) shouldRemove = false; - } else if (minEmptyLength > line.length) { + } + else if (minEmptyLength > line.length) { minEmptyLength = line.length; } }); - if (minIndent == Infinity) { minIndent = minEmptyLength; ignoreBlankLines = false; shouldRemove = false; } - if (insertAtTabStop && minIndent % tabSize != 0) minIndent = Math.floor(minIndent / tabSize) * tabSize; - iter(shouldRemove ? uncomment : comment); }; - - this.toggleBlockComment = function(state, session, range, cursor) { + this.toggleBlockComment = function (state, session, range, cursor) { var comment = this.blockComment; if (!comment) return; if (!comment.start && comment[0]) comment = comment[0]; - var iterator = new TokenIterator(session, cursor.row, cursor.column); var token = iterator.getCurrentToken(); - var sel = session.selection; var initialRange = session.selection.toOrientedRange(); var startRow, colDiff; - if (token && /comment/.test(token.type)) { var startRange, endRange; while (token && /comment/.test(token.type)) { @@ -6877,7 +7133,6 @@ var Mode = function() { } token = iterator.stepBackward(); } - var iterator = new TokenIterator(session, cursor.row, cursor.column); var token = iterator.getCurrentToken(); while (token && /comment/.test(token.type)) { @@ -6897,7 +7152,8 @@ var Mode = function() { startRow = startRange.start.row; colDiff = -comment.start.length; } - } else { + } + else { colDiff = comment.start.length; startRow = range.start.row; session.insert(range.end, comment.end); @@ -6909,26 +7165,20 @@ var Mode = function() { initialRange.end.column += colDiff; session.selection.fromOrientedRange(initialRange); }; - - this.getNextLineIndent = function(state, line, tab) { + this.getNextLineIndent = function (state, line, tab) { return this.$getIndent(line); }; - - this.checkOutdent = function(state, line, input) { + this.checkOutdent = function (state, line, input) { return false; }; - - this.autoOutdent = function(state, doc, row) { + this.autoOutdent = function (state, doc, row) { }; - - this.$getIndent = function(line) { + this.$getIndent = function (line) { return line.match(/^\s*/)[0]; }; - - this.createWorker = function(session) { + this.createWorker = function (session) { return null; }; - this.createModeDelegates = function (mapping) { this.$embeds = []; this.$modes = {}; @@ -6945,22 +7195,24 @@ var Mode = function() { this.$modes[i] = mode; } } - - var delegations = ["toggleBlockComment", "toggleCommentLines", "getNextLineIndent", + var delegations = ["toggleBlockComment", "toggleCommentLines", "getNextLineIndent", "checkOutdent", "autoOutdent", "transformAction", "getCompletions"]; - + var _loop_1 = function (i) { + (function (scope) { + var functionName = delegations[i]; + var defaultHandler = scope[functionName]; + scope[delegations[i]] = + function () { + return this.$delegator(functionName, arguments, defaultHandler); + }; + }(this_1)); + }; + var this_1 = this; for (var i = 0; i < delegations.length; i++) { - (function(scope) { - var functionName = delegations[i]; - var defaultHandler = scope[functionName]; - scope[delegations[i]] = function() { - return this.$delegator(functionName, arguments, defaultHandler); - }; - }(this)); + _loop_1(i); } }; - - this.$delegator = function(method, args, defaultHandler) { + this.$delegator = function (method, args, defaultHandler) { var state = args[0] || "start"; if (typeof state != "string") { if (Array.isArray(state[2])) { @@ -6971,10 +7223,9 @@ var Mode = function() { } state = state[0] || "start"; } - for (var i = 0; i < this.$embeds.length; i++) { - if (!this.$modes[this.$embeds[i]]) continue; - + if (!this.$modes[this.$embeds[i]]) + continue; var split = state.split(this.$embeds[i]); if (!split[0] && split[1]) { args[0] = split[1]; @@ -6985,8 +7236,7 @@ var Mode = function() { var ret = defaultHandler.apply(this, args); return defaultHandler ? ret : undefined; }; - - this.transformAction = function(state, action, editor, session, param) { + this.transformAction = function (state, action, editor, session, param) { if (this.$behaviour) { var behaviours = this.$behaviour.getBehaviours(); for (var key in behaviours) { @@ -6999,10 +7249,9 @@ var Mode = function() { } } }; - - this.getKeywords = function(append) { + this.getKeywords = function (append) { if (!this.completionKeywords) { - var rules = this.$tokenizer.rules; + var rules = this.$tokenizer["rules"]; var completionKeywords = []; for (var rule in rules) { var ruleItr = rules[rule]; @@ -7012,7 +7261,7 @@ var Mode = function() { completionKeywords.push(ruleItr[r].regex); } else if (typeof ruleItr[r].token === "object") { - for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { + for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { if (/keyword|support|storage/.test(ruleItr[r].token[a])) { var rule = ruleItr[r].regex.match(/\(.+?\)/g)[a]; completionKeywords.push(rule.substr(1, rule.length - 2)); @@ -7027,16 +7276,14 @@ var Mode = function() { return this.$keywordList; return completionKeywords.concat(this.$keywordList || []); }; - - this.$createKeywordList = function() { + this.$createKeywordList = function () { if (!this.$highlightRules) this.getTokenizer(); return this.$keywordList = this.$highlightRules.$keywordList || []; }; - - this.getCompletions = function(state, session, pos, prefix) { + this.getCompletions = function (state, session, pos, prefix) { var keywords = this.$keywordList || this.$createKeywordList(); - return keywords.map(function(word) { + return keywords.map(function (word) { return { name: word, value: word, @@ -7045,303 +7292,598 @@ var Mode = function() { }; }); }; - this.$id = "ace/mode/text"; }).call(Mode.prototype); - exports.Mode = Mode; -}); - -define("ace/apply_delta",["require","exports","module"], function(require, exports, module) { -"use strict"; - -function throwDeltaError(delta, errorText){ - console.log("Invalid Delta:", delta); - throw "Invalid Delta: " + errorText; -} - -function positionInDocument(docLines, position) { - return position.row >= 0 && position.row < docLines.length && - position.column >= 0 && position.column <= docLines[position.row].length; -} - -function validateDelta(docLines, delta) { - if (delta.action != "insert" && delta.action != "remove") - throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); - if (!(delta.lines instanceof Array)) - throwDeltaError(delta, "delta.lines must be an Array"); - if (!delta.start || !delta.end) - throwDeltaError(delta, "delta.start/end must be an present"); - var start = delta.start; - if (!positionInDocument(docLines, delta.start)) - throwDeltaError(delta, "delta.start must be contained in document"); - var end = delta.end; - if (delta.action == "remove" && !positionInDocument(docLines, end)) - throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); - var numRangeRows = end.row - start.row; - var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); - if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) - throwDeltaError(delta, "delta.range must match delta lines"); -} -exports.applyDelta = function(docLines, delta, doNotValidate) { - - var row = delta.start.row; - var startColumn = delta.start.column; - var line = docLines[row] || ""; - switch (delta.action) { - case "insert": - var lines = delta.lines; - if (lines.length === 1) { - docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); - } else { - var args = [row, 1].concat(delta.lines); - docLines.splice.apply(docLines, args); - docLines[row] = line.substring(0, startColumn) + docLines[row]; - docLines[row + delta.lines.length - 1] += line.substring(startColumn); - } - break; - case "remove": - var endColumn = delta.end.column; - var endRow = delta.end.row; - if (row === endRow) { - docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); - } else { - docLines.splice( - row, endRow - row + 1, - line.substring(0, startColumn) + docLines[endRow].substring(endColumn) - ); - } - break; - } -}; }); -define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) { -"use strict"; - -var oop = require("./lib/oop"); -var EventEmitter = require("./lib/event_emitter").EventEmitter; - -var Anchor = exports.Anchor = function(doc, row, column) { - this.$onChange = this.onChange.bind(this); - this.attach(doc); - - if (typeof column == "undefined") - this.setPosition(row.row, row.column); - else - this.setPosition(row, column); -}; - -(function() { - - oop.implement(this, EventEmitter); - this.getPosition = function() { - return this.$clipPositionToDocument(this.row, this.column); +define("ace/line_widgets",["require","exports","module","ace/lib/dom"], function(require, exports, module){"use strict"; +var dom = require("./lib/dom"); +var LineWidgets = /** @class */ (function () { + function LineWidgets(session) { + this.session = session; + this.session.widgetManager = this; + this.session.getRowLength = this.getRowLength; + this.session.$getWidgetScreenLength = this.$getWidgetScreenLength; + this.updateOnChange = this.updateOnChange.bind(this); + this.renderWidgets = this.renderWidgets.bind(this); + this.measureWidgets = this.measureWidgets.bind(this); + this.session._changedWidgets = []; + this.$onChangeEditor = this.$onChangeEditor.bind(this); + this.session.on("change", this.updateOnChange); + this.session.on("changeFold", this.updateOnFold); + this.session.on("changeEditor", this.$onChangeEditor); + } + LineWidgets.prototype.getRowLength = function (row) { + var h; + if (this.lineWidgets) + h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + else + h = 0; + if (!this["$useWrapMode"] || !this["$wrapData"][row]) { + return 1 + h; + } + else { + return this["$wrapData"][row].length + 1 + h; + } }; - this.getDocument = function() { - return this.document; + LineWidgets.prototype.$getWidgetScreenLength = function () { + var screenRows = 0; + this.lineWidgets.forEach(function (w) { + if (w && w.rowCount && !w.hidden) + screenRows += w.rowCount; + }); + return screenRows; }; - this.$insertRight = false; - this.onChange = function(delta) { - if (delta.start.row == delta.end.row && delta.start.row != this.row) + LineWidgets.prototype.$onChangeEditor = function (e) { + this.attach(e.editor); + }; + LineWidgets.prototype.attach = function (editor) { + if (editor && editor.widgetManager && editor.widgetManager != this) + editor.widgetManager.detach(); + if (this.editor == editor) return; - - if (delta.start.row > this.row) + this.detach(); + this.editor = editor; + if (editor) { + editor.widgetManager = this; + editor.renderer.on("beforeRender", this.measureWidgets); + editor.renderer.on("afterRender", this.renderWidgets); + } + }; + LineWidgets.prototype.detach = function (e) { + var editor = this.editor; + if (!editor) return; - - var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); - this.setPosition(point.row, point.column, true); + this.editor = null; + editor.widgetManager = null; + editor.renderer.off("beforeRender", this.measureWidgets); + editor.renderer.off("afterRender", this.renderWidgets); + var lineWidgets = this.session.lineWidgets; + lineWidgets && lineWidgets.forEach(function (w) { + if (w && w.el && w.el.parentNode) { + w._inDocument = false; + w.el.parentNode.removeChild(w.el); + } + }); }; - - function $pointsInOrder(point1, point2, equalPointsInOrder) { - var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; - return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); - } - - function $getTransformedPoint(delta, point, moveIfEqual) { - var deltaIsInsert = delta.action == "insert"; - var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); - var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); - var deltaStart = delta.start; - var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. - if ($pointsInOrder(point, deltaStart, moveIfEqual)) { - return { - row: point.row, - column: point.column - }; + LineWidgets.prototype.updateOnFold = function (e, session) { + var lineWidgets = session.lineWidgets; + if (!lineWidgets || !e.action) + return; + var fold = e.data; + var start = fold.start.row; + var end = fold.end.row; + var hide = e.action == "add"; + for (var i = start + 1; i < end; i++) { + if (lineWidgets[i]) + lineWidgets[i].hidden = hide; } - if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { - return { - row: point.row + deltaRowShift, - column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) - }; + if (lineWidgets[end]) { + if (hide) { + if (!lineWidgets[start]) + lineWidgets[start] = lineWidgets[end]; + else + lineWidgets[end].hidden = hide; + } + else { + if (lineWidgets[start] == lineWidgets[end]) + lineWidgets[start] = undefined; + lineWidgets[end].hidden = hide; + } } - - return { - row: deltaStart.row, - column: deltaStart.column - }; - } - this.setPosition = function(row, column, noClip) { - var pos; - if (noClip) { - pos = { - row: row, - column: column - }; - } else { - pos = this.$clipPositionToDocument(row, column); + }; + LineWidgets.prototype.updateOnChange = function (delta) { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) + return; + var startRow = delta.start.row; + var len = delta.end.row - startRow; + if (len === 0) { } - - if (this.row == pos.row && this.column == pos.column) + else if (delta.action == "remove") { + var removed = lineWidgets.splice(startRow + 1, len); + if (!lineWidgets[startRow] && removed[removed.length - 1]) { + lineWidgets[startRow] = removed.pop(); + } + removed.forEach(function (w) { + w && this.removeLineWidget(w); + }, this); + this.$updateRows(); + } + else { + var args = new Array(len); + if (lineWidgets[startRow] && lineWidgets[startRow].column != null) { + if (delta.start.column > lineWidgets[startRow].column) + startRow++; + } + args.unshift(startRow, 0); + lineWidgets.splice.apply(lineWidgets, args); + this.$updateRows(); + } + }; + LineWidgets.prototype.$updateRows = function () { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) return; - - var old = { - row: this.row, - column: this.column - }; - - this.row = pos.row; - this.column = pos.column; - this._signal("change", { - old: old, - value: pos + var noWidgets = true; + lineWidgets.forEach(function (w, i) { + if (w) { + noWidgets = false; + w.row = i; + while (w.$oldWidget) { + w.$oldWidget.row = i; + w = w.$oldWidget; + } + } }); + if (noWidgets) + this.session.lineWidgets = null; }; - this.detach = function() { - this.document.off("change", this.$onChange); - }; - this.attach = function(doc) { - this.document = doc || this.document; - this.document.on("change", this.$onChange); - }; - this.$clipPositionToDocument = function(row, column) { - var pos = {}; - - if (row >= this.document.getLength()) { - pos.row = Math.max(0, this.document.getLength() - 1); - pos.column = this.document.getLine(pos.row).length; + LineWidgets.prototype.$registerLineWidget = function (w) { + if (!this.session.lineWidgets) + this.session.lineWidgets = new Array(this.session.getLength()); + var old = this.session.lineWidgets[w.row]; + if (old) { + w.$oldWidget = old; + if (old.el && old.el.parentNode) { + old.el.parentNode.removeChild(old.el); + old._inDocument = false; + } } - else if (row < 0) { - pos.row = 0; - pos.column = 0; + this.session.lineWidgets[w.row] = w; + return w; + }; + LineWidgets.prototype.addLineWidget = function (w) { + this.$registerLineWidget(w); + w.session = this.session; + if (!this.editor) + return w; + var renderer = this.editor.renderer; + if (w.html && !w.el) { + w.el = dom.createElement("div"); + w.el.innerHTML = w.html; } - else { - pos.row = row; - pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + if (w.text && !w.el) { + w.el = dom.createElement("div"); + w.el.textContent = w.text; } - - if (column < 0) - pos.column = 0; - - return pos; + if (w.el) { + dom.addCssClass(w.el, "ace_lineWidgetContainer"); + if (w.className) { + dom.addCssClass(w.el, w.className); + } + w.el.style.position = "absolute"; + w.el.style.zIndex = "5"; + renderer.container.appendChild(w.el); + w._inDocument = true; + if (!w.coverGutter) { + w.el.style.zIndex = "3"; + } + if (w.pixelHeight == null) { + w.pixelHeight = w.el.offsetHeight; + } + } + if (w.rowCount == null) { + w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight; + } + var fold = this.session.getFoldAt(w.row, 0); + w.$fold = fold; + if (fold) { + var lineWidgets = this.session.lineWidgets; + if (w.row == fold.end.row && !lineWidgets[fold.start.row]) + lineWidgets[fold.start.row] = w; + else + w.hidden = true; + } + this.session._emit("changeFold", { data: { start: { row: w.row } } }); + this.$updateRows(); + this.renderWidgets(null, renderer); + this.onWidgetChanged(w); + return w; }; - -}).call(Anchor.prototype); + LineWidgets.prototype.removeLineWidget = function (w) { + w._inDocument = false; + w.session = null; + if (w.el && w.el.parentNode) + w.el.parentNode.removeChild(w.el); + if (w.editor && w.editor.destroy) + try { + w.editor.destroy(); + } + catch (e) { } + if (this.session.lineWidgets) { + var w1 = this.session.lineWidgets[w.row]; + if (w1 == w) { + this.session.lineWidgets[w.row] = w.$oldWidget; + if (w.$oldWidget) + this.onWidgetChanged(w.$oldWidget); + } + else { + while (w1) { + if (w1.$oldWidget == w) { + w1.$oldWidget = w.$oldWidget; + break; + } + w1 = w1.$oldWidget; + } + } + } + this.session._emit("changeFold", { data: { start: { row: w.row } } }); + this.$updateRows(); + }; + LineWidgets.prototype.getWidgetsAtRow = function (row) { + var lineWidgets = this.session.lineWidgets; + var w = lineWidgets && lineWidgets[row]; + var list = []; + while (w) { + list.push(w); + w = w.$oldWidget; + } + return list; + }; + LineWidgets.prototype.onWidgetChanged = function (w) { + this.session._changedWidgets.push(w); + this.editor && this.editor.renderer.updateFull(); + }; + LineWidgets.prototype.measureWidgets = function (e, renderer) { + var changedWidgets = this.session._changedWidgets; + var config = renderer.layerConfig; + if (!changedWidgets || !changedWidgets.length) + return; + var min = Infinity; + for (var i = 0; i < changedWidgets.length; i++) { + var w = changedWidgets[i]; + if (!w || !w.el) + continue; + if (w.session != this.session) + continue; + if (!w._inDocument) { + if (this.session.lineWidgets[w.row] != w) + continue; + w._inDocument = true; + renderer.container.appendChild(w.el); + } + w.h = w.el.offsetHeight; + if (!w.fixedWidth) { + w.w = w.el.offsetWidth; + w.screenWidth = Math.ceil(w.w / config.characterWidth); + } + var rowCount = w.h / config.lineHeight; + if (w.coverLine) { + rowCount -= this.session.getRowLineCount(w.row); + if (rowCount < 0) + rowCount = 0; + } + if (w.rowCount != rowCount) { + w.rowCount = rowCount; + if (w.row < min) + min = w.row; + } + } + if (min != Infinity) { + this.session._emit("changeFold", { data: { start: { row: min } } }); + this.session.lineWidgetWidth = null; + } + this.session._changedWidgets = []; + }; + LineWidgets.prototype.renderWidgets = function (e, renderer) { + var config = renderer.layerConfig; + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) + return; + var first = Math.min(this.firstRow, config.firstRow); + var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length); + while (first > 0 && !lineWidgets[first]) + first--; + this.firstRow = config.firstRow; + this.lastRow = config.lastRow; + renderer.$cursorLayer.config = config; + for (var i = first; i <= last; i++) { + var w = lineWidgets[i]; + if (!w || !w.el) + continue; + if (w.hidden) { + w.el.style.top = -100 - (w.pixelHeight || 0) + "px"; + continue; + } + if (!w._inDocument) { + w._inDocument = true; + renderer.container.appendChild(w.el); + } + var top = renderer.$cursorLayer.getPixelPosition({ row: i, column: 0 }, true).top; + if (!w.coverLine) + top += config.lineHeight * this.session.getRowLineCount(w.row); + w.el.style.top = top - config.offset + "px"; + var left = w.coverGutter ? 0 : renderer.gutterWidth; + if (!w.fixedWidth) + left -= renderer.scrollLeft; + w.el.style.left = left + "px"; + if (w.fullWidth && w.screenWidth) { + w.el.style.minWidth = config.width + 2 * config.padding + "px"; + } + if (w.fixedWidth) { + w.el.style.right = renderer.scrollBar.getWidth() + "px"; + } + else { + w.el.style.right = ""; + } + } + }; + return LineWidgets; +}()); +exports.LineWidgets = LineWidgets; }); -define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) { -"use strict"; - -var oop = require("./lib/oop"); -var applyDelta = require("./apply_delta").applyDelta; -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var Range = require("./range").Range; -var Anchor = require("./anchor").Anchor; - -var Document = function(textOrLines) { - this.$lines = [""]; - if (textOrLines.length === 0) { - this.$lines = [""]; - } else if (Array.isArray(textOrLines)) { - this.insertMergedLines({row: 0, column: 0}, textOrLines); - } else { - this.insert({row: 0, column:0}, textOrLines); +define("ace/apply_delta",["require","exports","module"], function(require, exports, module){"use strict"; +function throwDeltaError(delta, errorText) { + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} +exports.applyDelta = function (docLines, delta, doNotValidate) { + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } + else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } + else { + docLines.splice(row, endRow - row + 1, line.substring(0, startColumn) + docLines[endRow].substring(endColumn)); + } + break; } }; -(function() { - - oop.implement(this, EventEmitter); +}); - this.initialize = function(text) { - this.refresh(text); - }; - this.setValue = function(text) { - var len = this.getLength() - 1; - this.remove(new Range(0, 0, len, this.getLine(len).length)); - this.insert({row: 0, column: 0}, text); +define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Anchor = /** @class */ (function () { + function Anchor(doc, row, column) { + this.$onChange = this.onChange.bind(this); + this.attach(doc); + if (typeof row != "number") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); + } + Anchor.prototype.getPosition = function () { + return this.$clipPositionToDocument(this.row, this.column); }; - this.getValue = function() { - return this.getAllLines().join(this.getNewLineCharacter()); + Anchor.prototype.getDocument = function () { + return this.document; }; - this.createAnchor = function(row, column) { - return new Anchor(this, row, column); + Anchor.prototype.onChange = function (delta) { + if (delta.start.row == delta.end.row && delta.start.row != this.row) + return; + if (delta.start.row > this.row) + return; + var point = $getTransformedPoint(delta, { row: this.row, column: this.column }, this.$insertRight); + this.setPosition(point.row, point.column, true); }; - if ("aaa".split(/a/).length === 0) { - this.$split = function(text) { - return text.replace(/\r\n|\r/g, "\n").split("\n"); - }; - } else { - this.$split = function(text) { - return text.split(/\r\n|\r|\n/); + Anchor.prototype.setPosition = function (row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } + else { + pos = this.$clipPositionToDocument(row, column); + } + if (this.row == pos.row && this.column == pos.column) + return; + var old = { + row: this.row, + column: this.column }; - } - - - this.$detectNewLine = function(text) { - var match = text.match(/^.*?(\r\n|\r|\n)/m); - this.$autoNewLine = match ? match[1] : "\n"; - this._signal("changeNewLineMode"); + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); }; - this.getNewLineCharacter = function() { - switch (this.$newLineMode) { - case "windows": - return "\r\n"; - case "unix": - return "\n"; - default: - return this.$autoNewLine || "\n"; - } + Anchor.prototype.detach = function () { + this.document.off("change", this.$onChange); }; + Anchor.prototype.attach = function (doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + Anchor.prototype.$clipPositionToDocument = function (row, column) { + var pos = {}; + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + if (column < 0) + pos.column = 0; + return pos; + }; + return Anchor; +}()); +Anchor.prototype.$insertRight = false; +oop.implement(Anchor.prototype, EventEmitter); +function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); +} +function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + return { + row: deltaStart.row, + column: deltaStart.column + }; +} +exports.Anchor = Anchor; + +}); - this.$autoNewLine = ""; - this.$newLineMode = "auto"; - this.setNewLineMode = function(newLineMode) { - if (this.$newLineMode === newLineMode) - return; - +define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; +var Document = /** @class */ (function () { + function Document(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } + else if (Array.isArray(textOrLines)) { + this.insertMergedLines({ row: 0, column: 0 }, textOrLines); + } + else { + this.insert({ row: 0, column: 0 }, textOrLines); + } + } + Document.prototype.setValue = function (text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({ row: 0, column: 0 }, text || ""); + }; + Document.prototype.getValue = function () { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + Document.prototype.createAnchor = function (row, column) { + return new Anchor(this, row, column); + }; + Document.prototype.$detectNewLine = function (text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + Document.prototype.getNewLineCharacter = function () { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + Document.prototype.setNewLineMode = function (newLineMode) { + if (this.$newLineMode === newLineMode) + return; this.$newLineMode = newLineMode; this._signal("changeNewLineMode"); }; - this.getNewLineMode = function() { + Document.prototype.getNewLineMode = function () { return this.$newLineMode; }; - this.isNewLine = function(text) { + Document.prototype.isNewLine = function (text) { return (text == "\r\n" || text == "\r" || text == "\n"); }; - this.getLine = function(row) { + Document.prototype.getLine = function (row) { return this.$lines[row] || ""; }; - this.getLines = function(firstRow, lastRow) { + Document.prototype.getLines = function (firstRow, lastRow) { return this.$lines.slice(firstRow, lastRow + 1); }; - this.getAllLines = function() { + Document.prototype.getAllLines = function () { return this.getLines(0, this.getLength()); }; - this.getLength = function() { + Document.prototype.getLength = function () { return this.$lines.length; }; - this.getTextRange = function(range) { + Document.prototype.getTextRange = function (range) { return this.getLinesForRange(range).join(this.getNewLineCharacter()); }; - this.getLinesForRange = function(range) { + Document.prototype.getLinesForRange = function (range) { var lines; if (range.start.row === range.end.row) { lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; - } else { + } + else { lines = this.getLines(range.start.row, range.end.row); lines[0] = (lines[0] || "").substring(range.start.column); var l = lines.length - 1; @@ -7350,45 +7892,43 @@ var Document = function(textOrLines) { } return lines; }; - this.insertLines = function(row, lines) { + Document.prototype.insertLines = function (row, lines) { console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); return this.insertFullLines(row, lines); }; - this.removeLines = function(firstRow, lastRow) { + Document.prototype.removeLines = function (firstRow, lastRow) { console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); return this.removeFullLines(firstRow, lastRow); }; - this.insertNewLine = function(position) { + Document.prototype.insertNewLine = function (position) { console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); return this.insertMergedLines(position, ["", ""]); }; - this.insert = function(position, text) { + Document.prototype.insert = function (position, text) { if (this.getLength() <= 1) this.$detectNewLine(text); - return this.insertMergedLines(position, this.$split(text)); }; - this.insertInLine = function(position, text) { + Document.prototype.insertInLine = function (position, text) { var start = this.clippedPos(position.row, position.column); var end = this.pos(position.row, position.column + text.length); - this.applyDelta({ start: start, end: end, action: "insert", lines: [text] }, true); - return this.clonePos(end); }; - - this.clippedPos = function(row, column) { + Document.prototype.clippedPos = function (row, column) { var length = this.getLength(); if (row === undefined) { row = length; - } else if (row < 0) { + } + else if (row < 0) { row = 0; - } else if (row >= length) { + } + else if (row >= length) { row = length - 1; column = undefined; } @@ -7396,115 +7936,87 @@ var Document = function(textOrLines) { if (column == undefined) column = line.length; column = Math.min(Math.max(column, 0), line.length); - return {row: row, column: column}; + return { row: row, column: column }; }; - - this.clonePos = function(pos) { - return {row: pos.row, column: pos.column}; + Document.prototype.clonePos = function (pos) { + return { row: pos.row, column: pos.column }; }; - - this.pos = function(row, column) { - return {row: row, column: column}; + Document.prototype.pos = function (row, column) { + return { row: row, column: column }; }; - - this.$clipPosition = function(position) { + Document.prototype.$clipPosition = function (position) { var length = this.getLength(); if (position.row >= length) { position.row = Math.max(0, length - 1); position.column = this.getLine(length - 1).length; - } else { + } + else { position.row = Math.max(0, position.row); position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); } return position; }; - - this.refresh = function(text, row){ - var row = row || 0 - var lines = this.$split(text); - if (lines.length > 0xFFFF) { - var end = this.refresh(row, lines.slice(0xFFFF)); - lines = lines.slice(0, 0xFFFF); - } - - var args = [row, 0]; - args.push.apply(args, lines); - this.$lines.splice.apply(this.$lines, args); - var range = new Range(row, 0, row + lines.length, 0); - var delta = { - action: "insertLines", - context: 'refresh', - range: range, - lines: lines - }; - this._emit("change", { data: delta }); - return {row:0, column:0}; - } - this.insertFullLines = function(row, lines) { + Document.prototype.insertFullLines = function (row, lines) { row = Math.min(Math.max(row, 0), this.getLength()); var column = 0; if (row < this.getLength()) { lines = lines.concat([""]); column = 0; - } else { + } + else { lines = [""].concat(lines); row--; column = this.$lines[row].length; } - this.insertMergedLines({row: row, column: column}, lines); + this.insertMergedLines({ row: row, column: column }, lines); }; - this.insertMergedLines = function(position, lines) { + Document.prototype.insertMergedLines = function (position, lines) { var start = this.clippedPos(position.row, position.column); var end = { row: start.row + lines.length - 1, column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length }; - this.applyDelta({ start: start, end: end, action: "insert", lines: lines }); - return this.clonePos(end); }; - this.remove = function(range) { + Document.prototype.remove = function (range) { var start = this.clippedPos(range.start.row, range.start.column); var end = this.clippedPos(range.end.row, range.end.column); this.applyDelta({ start: start, end: end, action: "remove", - lines: this.getLinesForRange({start: start, end: end}) + lines: this.getLinesForRange({ start: start, end: end }) }); return this.clonePos(start); }; - this.removeInLine = function(row, startColumn, endColumn) { + Document.prototype.removeInLine = function (row, startColumn, endColumn) { var start = this.clippedPos(row, startColumn); var end = this.clippedPos(row, endColumn); - this.applyDelta({ start: start, end: end, action: "remove", - lines: this.getLinesForRange({start: start, end: end}) + lines: this.getLinesForRange({ start: start, end: end }) }, true); - return this.clonePos(start); }; - this.removeFullLines = function(firstRow, lastRow) { + Document.prototype.removeFullLines = function (firstRow, lastRow) { firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); - lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow), this.getLength() - 1); var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; - var deleteLastNewLine = lastRow < this.getLength() - 1; - var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); - var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); - var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); - var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = (deleteFirstNewLine ? firstRow - 1 : firstRow); + var startCol = (deleteFirstNewLine ? this.getLine(startRow).length : 0); + var endRow = (deleteLastNewLine ? lastRow + 1 : lastRow); + var endCol = (deleteLastNewLine ? 0 : this.getLine(endRow).length); var range = new Range(startRow, startCol, endRow, endCol); var deletedLines = this.$lines.slice(firstRow, lastRow + 1); - this.applyDelta({ start: range.start, end: range.end, @@ -7513,7 +8025,7 @@ var Document = function(textOrLines) { }); return deletedLines; }; - this.removeNewLine = function(row) { + Document.prototype.removeNewLine = function (row) { if (row < this.getLength() - 1 && row >= 0) { this.applyDelta({ start: this.pos(row, this.getLine(row).length), @@ -7523,14 +8035,13 @@ var Document = function(textOrLines) { }); } }; - this.replace = function(range, text) { + Document.prototype.replace = function (range, text) { if (!(range instanceof Range)) range = Range.fromPoints(range.start, range.end); if (text.length === 0 && range.isEmpty()) return range.start; if (text == this.getTextRange(range)) return range.end; - this.remove(range); var end; if (text) { @@ -7539,26 +8050,24 @@ var Document = function(textOrLines) { else { end = range.start; } - return end; }; - this.applyDeltas = function(deltas) { - for (var i=0; i=0; i--) { + Document.prototype.revertDeltas = function (deltas) { + for (var i = deltas.length - 1; i >= 0; i--) { this.revertDelta(deltas[i]); } }; - this.applyDelta = function(delta, doNotValidate) { + Document.prototype.applyDelta = function (delta, doNotValidate) { var isInsert = delta.action == "insert"; if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] : !Range.comparePoints(delta.start, delta.end)) { return; } - if (isInsert && delta.lines.length > 20000) { this.$splitAndapplyLargeDelta(delta, 20000); } @@ -7567,18 +8076,14 @@ var Document = function(textOrLines) { this._signal("change", delta); } }; - - this.$safeApplyDelta = function(delta) { + Document.prototype.$safeApplyDelta = function (delta) { var docLength = this.$lines.length; - if ( - delta.action == "remove" && delta.start.row < docLength && delta.end.row < docLength - || delta.action == "insert" && delta.start.row <= docLength - ) { + if (delta.action == "remove" && delta.start.row < docLength && delta.end.row < docLength + || delta.action == "insert" && delta.start.row <= docLength) { this.applyDelta(delta); } }; - - this.$splitAndapplyLargeDelta = function(delta, MAX) { + Document.prototype.$splitAndapplyLargeDelta = function (delta, MAX) { var lines = delta.lines; var l = lines.length - MAX + 1; var row = delta.start.row; @@ -7599,7 +8104,7 @@ var Document = function(textOrLines) { delta.start.column = column; this.applyDelta(delta, true); }; - this.revertDelta = function(delta) { + Document.prototype.revertDelta = function (delta) { this.$safeApplyDelta({ start: this.clonePos(delta.start), end: this.clonePos(delta.end), @@ -7607,7836 +8112,8343 @@ var Document = function(textOrLines) { lines: delta.lines.slice() }); }; - this.indexToPosition = function(index, startRow) { + Document.prototype.indexToPosition = function (index, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; for (var i = startRow || 0, l = lines.length; i < l; i++) { index -= lines[i].length + newlineLength; if (index < 0) - return {row: i, column: index + lines[i].length + newlineLength}; + return { row: i, column: index + lines[i].length + newlineLength }; } - return {row: l-1, column: index + lines[l-1].length + newlineLength}; + return { row: l - 1, column: index + lines[l - 1].length + newlineLength }; }; - this.positionToIndex = function(pos, startRow) { + Document.prototype.positionToIndex = function (pos, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; var index = 0; var row = Math.min(pos.row, lines.length); for (var i = startRow || 0; i < row; ++i) index += lines[i].length + newlineLength; - return index + pos.column; }; - -}).call(Document.prototype); - + Document.prototype.$split = function (text) { + return text.split(/\r\n|\r|\n/); + }; + return Document; +}()); +Document.prototype.$autoNewLine = ""; +Document.prototype.$newLineMode = "auto"; +oop.implement(Document.prototype, EventEmitter); exports.Document = Document; -}); -define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) { -"use strict"; +}); +define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module){"use strict"; var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; - -var BackgroundTokenizer = function(tokenizer, editor) { - this.running = false; - this.lines = []; - this.states = []; - this.currentLine = 0; - this.tokenizer = tokenizer; - - var self = this; - - this.$worker = function() { - if (!self.running) { return; } - - var workerStart = new Date(); - var currentLine = self.currentLine; - var endLine = -1; - var doc = self.doc; - - var startLine = currentLine; - while (self.lines[currentLine]) - currentLine++; - - var len = doc.getLength(); - var processedLines = 0; - self.running = false; - while (currentLine < len) { - self.$tokenizeRow(currentLine); - endLine = currentLine; - do { +var BackgroundTokenizer = /** @class */ (function () { + function BackgroundTokenizer(tokenizer, session) { + this.running = false; + this.lines = []; + this.states = []; + this.currentLine = 0; + this.tokenizer = tokenizer; + var self = this; + this.$worker = function () { + if (!self.running) { + return; + } + var workerStart = new Date(); + var currentLine = self.currentLine; + var endLine = -1; + var doc = self.doc; + var startLine = currentLine; + while (self.lines[currentLine]) currentLine++; - } while (self.lines[currentLine]); - processedLines ++; - if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { - self.running = setTimeout(self.$worker, 20); - break; + var len = doc.getLength(); + var processedLines = 0; + self.running = false; + while (currentLine < len) { + self.$tokenizeRow(currentLine); + endLine = currentLine; + do { + currentLine++; + } while (self.lines[currentLine]); + processedLines++; + if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { + self.running = setTimeout(self.$worker, 20); + break; + } } - } - self.currentLine = currentLine; - - if (endLine == -1) - endLine = currentLine; - - if (startLine <= endLine) - self.fireUpdateEvent(startLine, endLine); - }; -}; - -(function(){ - - oop.implement(this, EventEmitter); - this.setTokenizer = function(tokenizer) { + self.currentLine = currentLine; + if (endLine == -1) + endLine = currentLine; + if (startLine <= endLine) + self.fireUpdateEvent(startLine, endLine); + }; + } + BackgroundTokenizer.prototype.setTokenizer = function (tokenizer) { this.tokenizer = tokenizer; this.lines = []; this.states = []; - this.start(0); }; - this.setDocument = function(doc) { + BackgroundTokenizer.prototype.setDocument = function (doc) { this.doc = doc; this.lines = []; this.states = []; - this.stop(); }; - this.fireUpdateEvent = function(firstRow, lastRow) { + BackgroundTokenizer.prototype.fireUpdateEvent = function (firstRow, lastRow) { var data = { first: firstRow, last: lastRow }; - this._signal("update", {data: data}); + this._signal("update", { data: data }); }; - this.start = function(startRow) { + BackgroundTokenizer.prototype.start = function (startRow) { this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength()); this.lines.splice(this.currentLine, this.lines.length); this.states.splice(this.currentLine, this.states.length); - this.stop(); this.running = setTimeout(this.$worker, 700); }; - - this.scheduleStart = function() { + BackgroundTokenizer.prototype.scheduleStart = function () { if (!this.running) this.running = setTimeout(this.$worker, 700); }; - - this.$updateOnChange = function(delta) { + BackgroundTokenizer.prototype.$updateOnChange = function (delta) { var startRow = delta.start.row; var len = delta.end.row - startRow; - if (len === 0) { this.lines[startRow] = null; - } else if (delta.action == "remove") { + } + else if (delta.action == "remove") { this.lines.splice(startRow, len + 1, null); this.states.splice(startRow, len + 1, null); - } else { + } + else { var args = Array(len + 1); args.unshift(startRow, 1); this.lines.splice.apply(this.lines, args); this.states.splice.apply(this.states, args); } - this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength()); - this.stop(); }; - this.stop = function() { + BackgroundTokenizer.prototype.stop = function () { if (this.running) clearTimeout(this.running); this.running = false; }; - this.getTokens = function(row) { + BackgroundTokenizer.prototype.getTokens = function (row) { return this.lines[row] || this.$tokenizeRow(row); }; - this.getState = function(row) { + BackgroundTokenizer.prototype.getState = function (row) { if (this.currentLine == row) this.$tokenizeRow(row); return this.states[row] || "start"; }; - - this.$tokenizeRow = function(row) { + BackgroundTokenizer.prototype.$tokenizeRow = function (row) { var line = this.doc.getLine(row); var state = this.states[row - 1]; - var data = this.tokenizer.getLineTokens(line, state, row); - if (this.states[row] + "" !== data.state + "") { this.states[row] = data.state; this.lines[row + 1] = null; if (this.currentLine > row + 1) this.currentLine = row + 1; - } else if (this.currentLine == row) { + } + else if (this.currentLine == row) { this.currentLine = row + 1; } - return this.lines[row] = data.tokens; }; - - this.cleanup = function() { + BackgroundTokenizer.prototype.cleanup = function () { this.running = false; this.lines = []; this.states = []; this.currentLine = 0; this.removeAllListeners(); }; - -}).call(BackgroundTokenizer.prototype); - + return BackgroundTokenizer; +}()); +oop.implement(BackgroundTokenizer.prototype, EventEmitter); exports.BackgroundTokenizer = BackgroundTokenizer; -}); -define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) { -"use strict"; +}); +define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/range"], function(require, exports, module){"use strict"; var lang = require("./lib/lang"); -var oop = require("./lib/oop"); var Range = require("./range").Range; - -var SearchHighlight = function(regExp, clazz, type) { - this.setRegexp(regExp); - this.clazz = clazz; - this.type = type || "text"; -}; - -(function() { - this.MAX_RANGES = 500; - - this.setRegexp = function(regExp) { - if (this.regExp+"" == regExp+"") +var SearchHighlight = /** @class */ (function () { + function SearchHighlight(regExp, clazz, type) { + if (type === void 0) { type = "text"; } + this.setRegexp(regExp); + this.clazz = clazz; + this.type = type; + this.docLen = 0; + } + SearchHighlight.prototype.setRegexp = function (regExp) { + if (this.regExp + "" == regExp + "") return; this.regExp = regExp; this.cache = []; }; - - this.update = function(html, markerLayer, session, config) { + SearchHighlight.prototype.update = function (html, markerLayer, session, config) { if (!this.regExp) return; - var start = config.firstRow, end = config.lastRow; + var start = config.firstRow; + var end = config.lastRow; var renderedMarkerRanges = {}; - + var _search = session.$editor && session.$editor.$search; + var mtSearch = _search && _search.$isMultilineSearch(session.$editor.getLastSearchOptions()); for (var i = start; i <= end; i++) { var ranges = this.cache[i]; - if (ranges == null) { - ranges = lang.getMatchOffsets(session.getLine(i), this.regExp); - if (ranges.length > this.MAX_RANGES) - ranges = ranges.slice(0, this.MAX_RANGES); - ranges = ranges.map(function(match) { - return new Range(i, match.offset, i, match.offset + match.length); - }); + if (ranges == null || session.getValue().length != this.docLen) { + if (mtSearch) { + ranges = []; + var match = _search.$multiLineForward(session, this.regExp, i, end); + if (match) { + var end_row = match.endRow <= end ? match.endRow - 1 : end; + if (end_row > i) + i = end_row; + ranges.push(new Range(match.startRow, match.startCol, match.endRow, match.endCol)); + } + if (ranges.length > this.MAX_RANGES) + ranges = ranges.slice(0, this.MAX_RANGES); + } + else { + ranges = lang.getMatchOffsets(session.getLine(i), this.regExp); + if (ranges.length > this.MAX_RANGES) + ranges = ranges.slice(0, this.MAX_RANGES); + ranges = ranges.map(function (match) { + return new Range(i, match.offset, i, match.offset + match.length); + }); + } this.cache[i] = ranges.length ? ranges : ""; } - - for (var j = ranges.length; j --; ) { + if (ranges.length === 0) + continue; + for (var j = ranges.length; j--;) { var rangeToAddMarkerTo = ranges[j].toScreenRange(session); var rangeAsString = rangeToAddMarkerTo.toString(); - if (renderedMarkerRanges[rangeAsString]) continue; - + if (renderedMarkerRanges[rangeAsString]) + continue; renderedMarkerRanges[rangeAsString] = true; - markerLayer.drawSingleLineMarker( - html, rangeToAddMarkerTo, this.clazz, config); + markerLayer.drawSingleLineMarker(html, rangeToAddMarkerTo, this.clazz, config); } } + this.docLen = session.getValue().length; }; - -}).call(SearchHighlight.prototype); - + return SearchHighlight; +}()); +SearchHighlight.prototype.MAX_RANGES = 500; exports.SearchHighlight = SearchHighlight; -}); -define("ace/edit_session/fold_line",["require","exports","module","ace/range"], function(require, exports, module) { -"use strict"; +}); -var Range = require("../range").Range; -function FoldLine(foldData, folds) { - this.foldData = foldData; - if (Array.isArray(folds)) { - this.folds = folds; - } else { - folds = this.folds = [ folds ]; +define("ace/undomanager",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var UndoManager = /** @class */ (function () { + function UndoManager() { + this.$keepRedoStack; + this.$maxRev = 0; + this.$fromUndo = false; + this.$undoDepth = Infinity; + this.reset(); } - - var last = folds[folds.length - 1]; - this.range = new Range(folds[0].start.row, folds[0].start.column, - last.end.row, last.end.column); - this.start = this.range.start; - this.end = this.range.end; - - this.folds.forEach(function(fold) { - fold.setFoldLine(this); - }, this); -} - -(function() { - this.shiftRow = function(shift) { - this.start.row += shift; - this.end.row += shift; - this.folds.forEach(function(fold) { - fold.start.row += shift; - fold.end.row += shift; - }); + UndoManager.prototype.addSession = function (session) { + this.$session = session; }; - - this.addFold = function(fold) { - if (fold.sameRow) { - if (fold.start.row < this.startRow || fold.endRow > this.endRow) { - throw new Error("Can't add a fold to this FoldLine as it has no connection"); - } - this.folds.push(fold); - this.folds.sort(function(a, b) { - return -a.range.compareEnd(b.start.row, b.start.column); - }); - if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { - this.end.row = fold.end.row; - this.end.column = fold.end.column; - } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { - this.start.row = fold.start.row; - this.start.column = fold.start.column; + UndoManager.prototype.add = function (delta, allowMerge, session) { + if (this.$fromUndo) + return; + if (delta == this.$lastDelta) + return; + if (!this.$keepRedoStack) + this.$redoStack.length = 0; + if (allowMerge === false || !this.lastDeltas) { + this.lastDeltas = []; + var undoStackLength = this.$undoStack.length; + if (undoStackLength > this.$undoDepth - 1) { + this.$undoStack.splice(0, undoStackLength - this.$undoDepth + 1); } - } else if (fold.start.row == this.end.row) { - this.folds.push(fold); - this.end.row = fold.end.row; - this.end.column = fold.end.column; - } else if (fold.end.row == this.start.row) { - this.folds.unshift(fold); - this.start.row = fold.start.row; - this.start.column = fold.start.column; - } else { - throw new Error("Trying to add fold to FoldRow that doesn't have a matching row"); + this.$undoStack.push(this.lastDeltas); + delta.id = this.$rev = ++this.$maxRev; } - fold.foldLine = this; + if (delta.action == "remove" || delta.action == "insert") + this.$lastDelta = delta; + this.lastDeltas.push(delta); }; - - this.containsRow = function(row) { - return row >= this.start.row && row <= this.end.row; + UndoManager.prototype.addSelection = function (selection, rev) { + this.selections.push({ + value: selection, + rev: rev || this.$rev + }); }; - - this.walk = function(callback, endRow, endColumn) { - var lastEnd = 0, - folds = this.folds, - fold, - cmp, stop, isNewRow = true; - - if (endRow == null) { - endRow = this.end.row; - endColumn = this.end.column; - } - - for (var i = 0; i < folds.length; i++) { - fold = folds[i]; - - cmp = fold.range.compareStart(endRow, endColumn); - if (cmp == -1) { - callback(null, endRow, endColumn, lastEnd, isNewRow); - return; - } - - stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); - stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); - if (stop || cmp === 0) { - return; - } - isNewRow = !fold.sameRow; - lastEnd = fold.end.column; - } - callback(null, endRow, endColumn, lastEnd, isNewRow); + UndoManager.prototype.startNewGroup = function () { + this.lastDeltas = null; + return this.$rev; }; - - this.getNextFoldTo = function(row, column) { - var fold, cmp; - for (var i = 0; i < this.folds.length; i++) { - fold = this.folds[i]; - cmp = fold.range.compareEnd(row, column); - if (cmp == -1) { - return { - fold: fold, - kind: "after" - }; - } else if (cmp === 0) { - return { - fold: fold, - kind: "inside" - }; - } + UndoManager.prototype.markIgnored = function (from, to) { + if (to == null) + to = this.$rev + 1; + var stack = this.$undoStack; + for (var i = stack.length; i--;) { + var delta = stack[i][0]; + if (delta.id <= from) + break; + if (delta.id < to) + delta.ignore = true; } - return null; + this.lastDeltas = null; }; - - this.addRemoveChars = function(row, column, len) { - var ret = this.getNextFoldTo(row, column), - fold, folds; - if (ret) { - fold = ret.fold; - if (ret.kind == "inside" - && fold.start.column != column - && fold.start.row != row) - { - window.console && window.console.log(row, column, fold); - } else if (fold.start.row == row) { - folds = this.folds; - var i = folds.indexOf(fold); - if (i === 0) { - this.start.column += len; - } - for (i; i < folds.length; i++) { - fold = folds[i]; - fold.start.column += len; - if (!fold.sameRow) { - return; - } - fold.end.column += len; - } - this.end.column += len; + UndoManager.prototype.getSelection = function (rev, after) { + var stack = this.selections; + for (var i = stack.length; i--;) { + var selection = stack[i]; + if (selection.rev < rev) { + if (after) + selection = stack[i + 1]; + return selection; } } }; - - this.split = function(row, column) { - var pos = this.getNextFoldTo(row, column); - - if (!pos || pos.kind == "inside") - return null; - - var fold = pos.fold; - var folds = this.folds; - var foldData = this.foldData; - - var i = folds.indexOf(fold); - var foldBefore = folds[i - 1]; - this.end.row = foldBefore.end.row; - this.end.column = foldBefore.end.column; - folds = folds.splice(i, folds.length - i); - - var newFoldLine = new FoldLine(foldData, folds); - foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine); - return newFoldLine; + UndoManager.prototype.getRevision = function () { + return this.$rev; }; - - this.merge = function(foldLineNext) { - var folds = foldLineNext.folds; - for (var i = 0; i < folds.length; i++) { - this.addFold(folds[i]); + UndoManager.prototype.getDeltas = function (from, to) { + if (to == null) + to = this.$rev + 1; + var stack = this.$undoStack; + var end = null, start = 0; + for (var i = stack.length; i--;) { + var delta = stack[i][0]; + if (delta.id < to && !end) + end = i + 1; + if (delta.id <= from) { + start = i + 1; + break; + } } - var foldData = this.foldData; - foldData.splice(foldData.indexOf(foldLineNext), 1); + return stack.slice(start, end); }; - - this.toString = function() { - var ret = [this.range.toString() + ": [" ]; - - this.folds.forEach(function(fold) { - ret.push(" " + fold.toString()); - }); - ret.push("]"); - return ret.join("\n"); + UndoManager.prototype.getChangedRanges = function (from, to) { + if (to == null) + to = this.$rev + 1; }; - - this.idxToPosition = function(idx) { - var lastFoldEndColumn = 0; - - for (var i = 0; i < this.folds.length; i++) { - var fold = this.folds[i]; - - idx -= fold.start.column - lastFoldEndColumn; - if (idx < 0) { - return { - row: fold.start.row, - column: fold.start.column + idx - }; - } - - idx -= fold.placeholder.length; - if (idx < 0) { - return fold.start; - } - - lastFoldEndColumn = fold.end.column; + UndoManager.prototype.getChangedLines = function (from, to) { + if (to == null) + to = this.$rev + 1; + }; + UndoManager.prototype.undo = function (session, dontSelect) { + this.lastDeltas = null; + var stack = this.$undoStack; + if (!rearrangeUndoStack(stack, stack.length)) + return; + if (!session) + session = this.$session; + if (this.$redoStackBaseRev !== this.$rev && this.$redoStack.length) + this.$redoStack = []; + this.$fromUndo = true; + var deltaSet = stack.pop(); + var undoSelectionRange = null; + if (deltaSet) { + undoSelectionRange = session.undoChanges(deltaSet, dontSelect); + this.$redoStack.push(deltaSet); + this.$syncRev(); } - - return { - row: this.end.row, - column: this.end.column + idx - }; + this.$fromUndo = false; + return undoSelectionRange; }; -}).call(FoldLine.prototype); - -exports.FoldLine = FoldLine; -}); - -define("ace/range_list",["require","exports","module","ace/range"], function(require, exports, module) { -"use strict"; -var Range = require("./range").Range; -var comparePoints = Range.comparePoints; - -var RangeList = function() { - this.ranges = []; - this.$bias = 1; -}; - -(function() { - this.comparePoints = comparePoints; - - this.pointIndex = function(pos, excludeEdges, startIndex) { - var list = this.ranges; - - for (var i = startIndex || 0; i < list.length; i++) { - var range = list[i]; - var cmpEnd = comparePoints(pos, range.end); - if (cmpEnd > 0) - continue; - var cmpStart = comparePoints(pos, range.start); - if (cmpEnd === 0) - return excludeEdges && cmpStart !== 0 ? -i-2 : i; - if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) - return i; - - return -i-1; + UndoManager.prototype.redo = function (session, dontSelect) { + this.lastDeltas = null; + if (!session) + session = this.$session; + this.$fromUndo = true; + if (this.$redoStackBaseRev != this.$rev) { + var diff = this.getDeltas(this.$redoStackBaseRev, this.$rev + 1); + rebaseRedoStack(this.$redoStack, diff); + this.$redoStackBaseRev = this.$rev; + this.$redoStack.forEach(function (x) { + x[0].id = ++this.$maxRev; + }, this); } - return -i - 1; + var deltaSet = this.$redoStack.pop(); + var redoSelectionRange = null; + if (deltaSet) { + redoSelectionRange = session.redoChanges(deltaSet, dontSelect); + this.$undoStack.push(deltaSet); + this.$syncRev(); + } + this.$fromUndo = false; + return redoSelectionRange; }; - - this.add = function(range) { - var excludeEdges = !range.isEmpty(); - var startIndex = this.pointIndex(range.start, excludeEdges); - if (startIndex < 0) - startIndex = -startIndex - 1; - - var endIndex = this.pointIndex(range.end, excludeEdges, startIndex); - - if (endIndex < 0) - endIndex = -endIndex - 1; - else - endIndex++; - return this.ranges.splice(startIndex, endIndex - startIndex, range); + UndoManager.prototype.$syncRev = function () { + var stack = this.$undoStack; + var nextDelta = stack[stack.length - 1]; + var id = nextDelta && nextDelta[0].id || 0; + this.$redoStackBaseRev = id; + this.$rev = id; }; - - this.addList = function(list) { - var removed = []; - for (var i = list.length; i--; ) { - removed.push.apply(removed, this.add(list[i])); - } - return removed; + UndoManager.prototype.reset = function () { + this.lastDeltas = null; + this.$lastDelta = null; + this.$undoStack = []; + this.$redoStack = []; + this.$rev = 0; + this.mark = 0; + this.$redoStackBaseRev = this.$rev; + this.selections = []; }; - - this.substractPoint = function(pos) { - var i = this.pointIndex(pos); - - if (i >= 0) - return this.ranges.splice(i, 1); + UndoManager.prototype.canUndo = function () { + return this.$undoStack.length > 0; }; - this.merge = function() { - var removed = []; - var list = this.ranges; - - list = list.sort(function(a, b) { - return comparePoints(a.start, b.start); - }); - - var next = list[0], range; - for (var i = 1; i < list.length; i++) { - range = next; - next = list[i]; - var cmp = comparePoints(range.end, next.start); - if (cmp < 0) - continue; - - if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) - continue; - - if (comparePoints(range.end, next.end) < 0) { - range.end.row = next.end.row; - range.end.column = next.end.column; - } - - list.splice(i, 1); - removed.push(next); - next = range; - i--; - } - - this.ranges = list; - - return removed; + UndoManager.prototype.canRedo = function () { + return this.$redoStack.length > 0; }; - - this.contains = function(row, column) { - return this.pointIndex({row: row, column: column}) >= 0; + UndoManager.prototype.bookmark = function (rev) { + if (rev == undefined) + rev = this.$rev; + this.mark = rev; }; - - this.containsPoint = function(pos) { - return this.pointIndex(pos) >= 0; + UndoManager.prototype.isAtBookmark = function () { + return this.$rev === this.mark; }; - - this.rangeAtPoint = function(pos) { - var i = this.pointIndex(pos); - if (i >= 0) - return this.ranges[i]; + UndoManager.prototype.toJSON = function () { + return { + $redoStack: this.$redoStack, + $undoStack: this.$undoStack + }; }; - - - this.clipRows = function(startRow, endRow) { - var list = this.ranges; - if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow) - return []; - - var startIndex = this.pointIndex({row: startRow, column: 0}); - if (startIndex < 0) - startIndex = -startIndex - 1; - var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex); - if (endIndex < 0) - endIndex = -endIndex - 1; - - var clipped = []; - for (var i = startIndex; i < endIndex; i++) { - clipped.push(list[i]); - } - return clipped; + UndoManager.prototype.fromJSON = function (json) { + this.reset(); + this.$undoStack = json.$undoStack; + this.$redoStack = json.$redoStack; }; - - this.removeAll = function() { - return this.ranges.splice(0, this.ranges.length); - }; - - this.attach = function(session) { - if (this.session) - this.detach(); - - this.session = session; - this.onChange = this.$onChange.bind(this); - - this.session.on('change', this.onChange); - }; - - this.detach = function() { - if (!this.session) - return; - this.session.removeListener('change', this.onChange); - this.session = null; + UndoManager.prototype.$prettyPrint = function (delta) { + if (delta) + return stringifyDelta(delta); + return stringifyDelta(this.$undoStack) + "\n---\n" + stringifyDelta(this.$redoStack); }; - - this.$onChange = function(delta) { - var start = delta.start; - var end = delta.end; - var startRow = start.row; - var endRow = end.row; - var ranges = this.ranges; - for (var i = 0, n = ranges.length; i < n; i++) { - var r = ranges[i]; - if (r.end.row >= startRow) - break; - } - - if (delta.action == "insert") { - var lineDif = endRow - startRow; - var colDiff = -start.column + end.column; - for (; i < n; i++) { - var r = ranges[i]; - if (r.start.row > startRow) - break; - - if (r.start.row == startRow && r.start.column >= start.column) { - if (r.start.column == start.column && this.$bias <= 0) { - } else { - r.start.column += colDiff; - r.start.row += lineDif; - } - } - if (r.end.row == startRow && r.end.column >= start.column) { - if (r.end.column == start.column && this.$bias < 0) { - continue; - } - if (r.end.column == start.column && colDiff > 0 && i < n - 1) { - if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column) - r.end.column -= colDiff; - } - r.end.column += colDiff; - r.end.row += lineDif; - } + return UndoManager; +}()); +UndoManager.prototype.hasUndo = UndoManager.prototype.canUndo; +UndoManager.prototype.hasRedo = UndoManager.prototype.canRedo; +UndoManager.prototype.isClean = UndoManager.prototype.isAtBookmark; +UndoManager.prototype.markClean = UndoManager.prototype.bookmark; +function rearrangeUndoStack(stack, pos) { + for (var i = pos; i--;) { + var deltaSet = stack[i]; + if (deltaSet && !deltaSet[0].ignore) { + while (i < pos - 1) { + var swapped = swapGroups(stack[i], stack[i + 1]); + stack[i] = swapped[0]; + stack[i + 1] = swapped[1]; + i++; } - } else { - var lineDif = startRow - endRow; - var colDiff = start.column - end.column; - for (; i < n; i++) { - var r = ranges[i]; - - if (r.start.row > endRow) - break; - - if (r.end.row < endRow - && ( - startRow < r.end.row - || startRow == r.end.row && start.column < r.end.column - ) - ) { - r.end.row = startRow; - r.end.column = start.column; - } - else if (r.end.row == endRow) { - if (r.end.column <= end.column) { - if (lineDif || r.end.column > start.column) { - r.end.column = start.column; - r.end.row = start.row; - } - } - else { - r.end.column += colDiff; - r.end.row += lineDif; - } - } - else if (r.end.row > endRow) { - r.end.row += lineDif; - } - - if (r.start.row < endRow - && ( - startRow < r.start.row - || startRow == r.start.row && start.column < r.start.column - ) - ) { - r.start.row = startRow; - r.start.column = start.column; - } - else if (r.start.row == endRow) { - if (r.start.column <= end.column) { - if (lineDif || r.start.column > start.column) { - r.start.column = start.column; - r.start.row = start.row; - } - } - else { - r.start.column += colDiff; - r.start.row += lineDif; - } + return true; + } + } +} +var Range = require("./range").Range; +var cmp = Range.comparePoints; +var comparePoints = Range.comparePoints; +function $updateMarkers(delta) { + var isInsert = delta.action == "insert"; + var start = delta.start; + var end = delta.end; + var rowShift = (end.row - start.row) * (isInsert ? 1 : -1); + var colShift = (end.column - start.column) * (isInsert ? 1 : -1); + if (isInsert) + end = start; + for (var i in this.marks) { + var point = this.marks[i]; + var cmp = comparePoints(point, start); + if (cmp < 0) { + continue; // delta starts after the range + } + if (cmp === 0) { + if (isInsert) { + if (point.bias == 1) { + cmp = 1; } - else if (r.start.row > endRow) { - r.start.row += lineDif; + else { + point.bias == -1; + continue; } } } - - if (lineDif != 0 && i < n) { - for (; i < n; i++) { - var r = ranges[i]; - r.start.row += lineDif; - r.end.row += lineDif; - } - } - }; - -}).call(RangeList.prototype); - -exports.RangeList = RangeList; -}); - -define("ace/edit_session/fold",["require","exports","module","ace/range_list","ace/lib/oop"], function(require, exports, module) { -"use strict"; - -var RangeList = require("../range_list").RangeList; -var oop = require("../lib/oop"); -var Fold = exports.Fold = function(range, placeholder) { - this.foldLine = null; - this.placeholder = placeholder; - this.range = range; - this.start = range.start; - this.end = range.end; - - this.sameRow = range.start.row == range.end.row; - this.subFolds = this.ranges = []; -}; - -oop.inherits(Fold, RangeList); - -(function() { - - this.toString = function() { - return '"' + this.placeholder + '" ' + this.range.toString(); - }; - - this.setFoldLine = function(foldLine) { - this.foldLine = foldLine; - this.subFolds.forEach(function(fold) { - fold.setFoldLine(foldLine); - }); - }; - - this.clone = function() { - var range = this.range.clone(); - var fold = new Fold(range, this.placeholder); - this.subFolds.forEach(function(subFold) { - fold.subFolds.push(subFold.clone()); - }); - fold.collapseChildren = this.collapseChildren; - return fold; - }; - - this.addSubFold = function(fold) { - if (this.range.isEqual(fold)) - return; - consumeRange(fold, this.start); - - var row = fold.start.row, column = fold.start.column; - for (var i = 0, cmp = -1; i < this.subFolds.length; i++) { - cmp = this.subFolds[i].range.compare(row, column); - if (cmp != 1) - break; - } - var afterStart = this.subFolds[i]; - var firstConsumed = 0; - - if (cmp == 0) { - if (afterStart.range.containsRange(fold)) - return afterStart.addSubFold(fold); - else - firstConsumed = 1; - } - var row = fold.range.end.row, column = fold.range.end.column; - for (var j = i, cmp = -1; j < this.subFolds.length; j++) { - cmp = this.subFolds[j].range.compare(row, column); - if (cmp != 1) - break; + var cmp2 = isInsert ? cmp : comparePoints(point, end); + if (cmp2 > 0) { + point.row += rowShift; + point.column += point.row == end.row ? colShift : 0; + continue; } - if (cmp == 0) j++; - var consumedFolds = this.subFolds.splice(i, j - i, fold); - var last = cmp == 0 ? consumedFolds.length - 1 : consumedFolds.length; - for (var k = firstConsumed; k < last; k++) { - fold.addSubFold(consumedFolds[k]); + if (!isInsert && cmp2 <= 0) { + point.row = start.row; + point.column = start.column; + if (cmp2 === 0) + point.bias = 1; } - fold.setFoldLine(this.foldLine); - - return fold; - }; - - this.restoreRange = function(range) { - return restoreRange(range, this.start); - }; - -}).call(Fold.prototype); - -function consumePoint(point, anchor) { - point.row -= anchor.row; - if (point.row == 0) - point.column -= anchor.column; + } } -function consumeRange(range, anchor) { - consumePoint(range.start, anchor); - consumePoint(range.end, anchor); +function clonePos(pos) { + return { row: pos.row, column: pos.column }; } -function restorePoint(point, anchor) { - if (point.row == 0) - point.column += anchor.column; - point.row += anchor.row; +function cloneDelta(d) { + return { + start: clonePos(d.start), + end: clonePos(d.end), + action: d.action, + lines: d.lines.slice() + }; } -function restoreRange(range, anchor) { - restorePoint(range.start, anchor); - restorePoint(range.end, anchor); +function stringifyDelta(d) { + d = d || this; + if (Array.isArray(d)) { + return d.map(stringifyDelta).join("\n"); + } + var type = ""; + if (d.action) { + type = d.action == "insert" ? "+" : "-"; + type += "[" + d.lines + "]"; + } + else if (d.value) { + if (Array.isArray(d.value)) { + type = d.value.map(stringifyRange).join("\n"); + } + else { + type = stringifyRange(d.value); + } + } + if (d.start) { + type += stringifyRange(d); + } + if (d.id || d.rev) { + type += "\t(" + (d.id || d.rev) + ")"; + } + return type; } - -}); - -define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"], function(require, exports, module) { -"use strict"; - -var Range = require("../range").Range; -var FoldLine = require("./fold_line").FoldLine; -var Fold = require("./fold").Fold; -var TokenIterator = require("../token_iterator").TokenIterator; - -function Folding() { - this.getFoldAt = function(row, column, side) { - var foldLine = this.getFoldLine(row); - if (!foldLine) +function stringifyRange(r) { + return r.start.row + ":" + r.start.column + + "=>" + r.end.row + ":" + r.end.column; +} +function swap(d1, d2) { + var i1 = d1.action == "insert"; + var i2 = d2.action == "insert"; + if (i1 && i2) { + if (cmp(d2.start, d1.end) >= 0) { + shift(d2, d1, -1); + } + else if (cmp(d2.start, d1.start) <= 0) { + shift(d1, d2, +1); + } + else { return null; - - var folds = foldLine.folds; - for (var i = 0; i < folds.length; i++) { - var range = folds[i].range; - if (range.contains(row, column)) { - if (side == 1 && range.isEnd(row, column) && !range.isEmpty()) { - continue; - } else if (side == -1 && range.isStart(row, column) && !range.isEmpty()) { - continue; - } - return folds[i]; - } } - }; - this.getFoldsInRange = function(range) { - var start = range.start; - var end = range.end; - var foldLines = this.$foldData; - var foundFolds = []; - - start.column += 1; - end.column -= 1; - - for (var i = 0; i < foldLines.length; i++) { - var cmp = foldLines[i].range.compareRange(range); - if (cmp == 2) { - continue; - } - else if (cmp == -2) { - break; - } - - var folds = foldLines[i].folds; - for (var j = 0; j < folds.length; j++) { - var fold = folds[j]; - cmp = fold.range.compareRange(range); - if (cmp == -2) { - break; - } else if (cmp == 2) { - continue; - } else - if (cmp == 42) { - break; - } - foundFolds.push(fold); - } + } + else if (i1 && !i2) { + if (cmp(d2.start, d1.end) >= 0) { + shift(d2, d1, -1); } - start.column -= 1; - end.column += 1; - - return foundFolds; - }; - - this.getFoldsInRangeList = function(ranges) { - if (Array.isArray(ranges)) { - var folds = []; - ranges.forEach(function(range) { - folds = folds.concat(this.getFoldsInRange(range)); - }, this); - } else { - var folds = this.getFoldsInRange(ranges); + else if (cmp(d2.end, d1.start) <= 0) { + shift(d1, d2, -1); } - return folds; - }; - this.getAllFolds = function() { - var folds = []; - var foldLines = this.$foldData; - - for (var i = 0; i < foldLines.length; i++) - for (var j = 0; j < foldLines[i].folds.length; j++) - folds.push(foldLines[i].folds[j]); - - return folds; - }; - this.getFoldStringAt = function(row, column, trim, foldLine) { - foldLine = foldLine || this.getFoldLine(row); - if (!foldLine) + else { return null; - - var lastFold = { - end: { column: 0 } - }; - var str, fold; - for (var i = 0; i < foldLine.folds.length; i++) { - fold = foldLine.folds[i]; - var cmp = fold.range.compareEnd(row, column); - if (cmp == -1) { - str = this - .getLine(fold.start.row) - .substring(lastFold.end.column, fold.start.column); - break; - } - else if (cmp === 0) { - return null; - } - lastFold = fold; } - if (!str) - str = this.getLine(fold.start.row).substring(lastFold.end.column); - - if (trim == -1) - return str.substring(0, column - lastFold.end.column); - else if (trim == 1) - return str.substring(column - lastFold.end.column); - else - return str; - }; - - this.getFoldLine = function(docRow, startFoldLine) { - var foldData = this.$foldData; - var i = 0; - if (startFoldLine) - i = foldData.indexOf(startFoldLine); - if (i == -1) - i = 0; - for (i; i < foldData.length; i++) { - var foldLine = foldData[i]; - if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) { - return foldLine; - } else if (foldLine.end.row > docRow) { - return null; - } + } + else if (!i1 && i2) { + if (cmp(d2.start, d1.start) >= 0) { + shift(d2, d1, +1); } - return null; - }; - this.getNextFoldLine = function(docRow, startFoldLine) { - var foldData = this.$foldData; - var i = 0; - if (startFoldLine) - i = foldData.indexOf(startFoldLine); - if (i == -1) - i = 0; - for (i; i < foldData.length; i++) { - var foldLine = foldData[i]; - if (foldLine.end.row >= docRow) { - return foldLine; - } + else if (cmp(d2.start, d1.start) <= 0) { + shift(d1, d2, +1); } - return null; - }; - - this.getFoldedRowCount = function(first, last) { - var foldData = this.$foldData, rowCount = last-first+1; - for (var i = 0; i < foldData.length; i++) { - var foldLine = foldData[i], - end = foldLine.end.row, - start = foldLine.start.row; - if (end >= last) { - if (start < last) { - if (start >= first) - rowCount -= last-start; - else - rowCount = 0; // in one fold - } - break; - } else if (end >= first){ - if (start >= first) // fold inside range - rowCount -= end-start; - else - rowCount -= end-first+1; - } + else { + return null; + } + } + else if (!i1 && !i2) { + if (cmp(d2.start, d1.start) >= 0) { + shift(d2, d1, +1); + } + else if (cmp(d2.end, d1.start) <= 0) { + shift(d1, d2, -1); } - return rowCount; - }; - - this.$addFoldLine = function(foldLine) { - this.$foldData.push(foldLine); - this.$foldData.sort(function(a, b) { - return a.start.row - b.start.row; - }); - return foldLine; - }; - this.addFold = function(placeholder, range) { - var foldData = this.$foldData; - var added = false; - var fold; - - if (placeholder instanceof Fold) - fold = placeholder; else { - fold = new Fold(range, placeholder); - fold.collapseChildren = range.collapseChildren; + return null; } - this.$clipRangeToDocument(fold.range); - - var startRow = fold.start.row; - var startColumn = fold.start.column; - var endRow = fold.end.row; - var endColumn = fold.end.column; - - var startFold = this.getFoldAt(startRow, startColumn, 1); - var endFold = this.getFoldAt(endRow, endColumn, -1); - if (startFold && endFold == startFold) - return startFold.addSubFold(fold); - - if (startFold && !startFold.range.isStart(startRow, startColumn)) - this.removeFold(startFold); - - if (endFold && !endFold.range.isEnd(endRow, endColumn)) - this.removeFold(endFold); - var folds = this.getFoldsInRange(fold.range); - if (folds.length > 0) { - this.removeFolds(folds); - if (!fold.collapseChildren) { - folds.forEach(function(subFold) { - fold.addSubFold(subFold); - }); + } + return [d2, d1]; +} +function swapGroups(ds1, ds2) { + for (var i = ds1.length; i--;) { + for (var j = 0; j < ds2.length; j++) { + if (!swap(ds1[i], ds2[j])) { + while (i < ds1.length) { + while (j--) { + swap(ds2[j], ds1[i]); + } + j = ds2.length; + i++; + } + return [ds1, ds2]; } } - - for (var i = 0; i < foldData.length; i++) { - var foldLine = foldData[i]; - if (endRow == foldLine.start.row) { - foldLine.addFold(fold); - added = true; - break; - } else if (startRow == foldLine.end.row) { - foldLine.addFold(fold); - added = true; - if (!fold.sameRow) { - var foldLineNext = foldData[i + 1]; - if (foldLineNext && foldLineNext.start.row == endRow) { - foldLine.merge(foldLineNext); - break; - } - } - break; - } else if (endRow <= foldLine.start.row) { - break; + } + ds1.selectionBefore = ds2.selectionBefore = + ds1.selectionAfter = ds2.selectionAfter = null; + return [ds2, ds1]; +} +function xform(d1, c1) { + var i1 = d1.action == "insert"; + var i2 = c1.action == "insert"; + if (i1 && i2) { + if (cmp(d1.start, c1.start) < 0) { + shift(c1, d1, 1); + } + else { + shift(d1, c1, 1); + } + } + else if (i1 && !i2) { + if (cmp(d1.start, c1.end) >= 0) { + shift(d1, c1, -1); + } + else if (cmp(d1.start, c1.start) <= 0) { + shift(c1, d1, +1); + } + else { + shift(d1, Range.fromPoints(c1.start, d1.start), -1); + shift(c1, d1, +1); + } + } + else if (!i1 && i2) { + if (cmp(c1.start, d1.end) >= 0) { + shift(c1, d1, -1); + } + else if (cmp(c1.start, d1.start) <= 0) { + shift(d1, c1, +1); + } + else { + shift(c1, Range.fromPoints(d1.start, c1.start), -1); + shift(d1, c1, +1); + } + } + else if (!i1 && !i2) { + if (cmp(c1.start, d1.end) >= 0) { + shift(c1, d1, -1); + } + else if (cmp(c1.end, d1.start) <= 0) { + shift(d1, c1, -1); + } + else { + var before, after; + if (cmp(d1.start, c1.start) < 0) { + before = d1; + d1 = splitDelta(d1, c1.start); + } + if (cmp(d1.end, c1.end) > 0) { + after = splitDelta(d1, c1.end); + } + shiftPos(c1.end, d1.start, d1.end, -1); + if (after && !before) { + d1.lines = after.lines; + d1.start = after.start; + d1.end = after.end; + after = d1; } + return [c1, before, after].filter(Boolean); } - - if (!added) - foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold)); - - if (this.$useWrapMode) - this.$updateWrapData(foldLine.start.row, foldLine.start.row); - else - this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row); - this.$modified = true; - this._signal("changeFold", { data: fold, action: "add" }); - - return fold; - }; - - this.addFolds = function(folds) { - folds.forEach(function(fold) { - this.addFold(fold); - }, this); + } + return [c1, d1]; +} +function shift(d1, d2, dir) { + shiftPos(d1.start, d2.start, d2.end, dir); + shiftPos(d1.end, d2.start, d2.end, dir); +} +function shiftPos(pos, start, end, dir) { + if (pos.row == (dir == 1 ? start : end).row) { + pos.column += dir * (end.column - start.column); + } + pos.row += dir * (end.row - start.row); +} +function splitDelta(c, pos) { + var lines = c.lines; + var end = c.end; + c.end = clonePos(pos); + var rowsBefore = c.end.row - c.start.row; + var otherLines = lines.splice(rowsBefore, lines.length); + var col = rowsBefore ? pos.column : pos.column - c.start.column; + lines.push(otherLines[0].substring(0, col)); + otherLines[0] = otherLines[0].substr(col); + var rest = { + start: clonePos(pos), + end: end, + lines: otherLines, + action: c.action }; - - this.removeFold = function(fold) { - var foldLine = fold.foldLine; - var startRow = foldLine.start.row; - var endRow = foldLine.end.row; - - var foldLines = this.$foldData; - var folds = foldLine.folds; - if (folds.length == 1) { - foldLines.splice(foldLines.indexOf(foldLine), 1); - } else - if (foldLine.range.isEnd(fold.end.row, fold.end.column)) { - folds.pop(); - foldLine.end.row = folds[folds.length - 1].end.row; - foldLine.end.column = folds[folds.length - 1].end.column; - } else - if (foldLine.range.isStart(fold.start.row, fold.start.column)) { - folds.shift(); - foldLine.start.row = folds[0].start.row; - foldLine.start.column = folds[0].start.column; - } else - if (fold.sameRow) { - folds.splice(folds.indexOf(fold), 1); - } else - { - var newFoldLine = foldLine.split(fold.start.row, fold.start.column); - folds = newFoldLine.folds; - folds.shift(); - newFoldLine.start.row = folds[0].start.row; - newFoldLine.start.column = folds[0].start.column; + return rest; +} +function moveDeltasByOne(redoStack, d) { + d = cloneDelta(d); + for (var j = redoStack.length; j--;) { + var deltaSet = redoStack[j]; + for (var i = 0; i < deltaSet.length; i++) { + var x = deltaSet[i]; + var xformed = xform(x, d); + d = xformed[0]; + if (xformed.length != 2) { + if (xformed[2]) { + deltaSet.splice(i + 1, 1, xformed[1], xformed[2]); + i++; + } + else if (!xformed[1]) { + deltaSet.splice(i, 1); + i--; + } + } } - - if (!this.$updating) { - if (this.$useWrapMode) - this.$updateWrapData(startRow, endRow); - else - this.$updateRowLengthCache(startRow, endRow); + if (!deltaSet.length) { + redoStack.splice(j, 1); } - this.$modified = true; - this._signal("changeFold", { data: fold, action: "remove" }); - }; - - this.removeFolds = function(folds) { - var cloneFolds = []; - for (var i = 0; i < folds.length; i++) { - cloneFolds.push(folds[i]); + } + return redoStack; +} +function rebaseRedoStack(redoStack, deltaSets) { + for (var i = 0; i < deltaSets.length; i++) { + var deltas = deltaSets[i]; + for (var j = 0; j < deltas.length; j++) { + moveDeltasByOne(redoStack, deltas[j]); } + } +} +exports.UndoManager = UndoManager; - cloneFolds.forEach(function(fold) { - this.removeFold(fold); - }, this); - this.$modified = true; - }; +}); - this.expandFold = function(fold) { - this.removeFold(fold); - fold.subFolds.forEach(function(subFold) { - fold.restoreRange(subFold); - this.addFold(subFold); - }, this); - if (fold.collapseChildren > 0) { - this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1); +define("ace/edit_session/fold_line",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var Range = require("../range").Range; +var FoldLine = /** @class */ (function () { + function FoldLine(foldData, folds) { + this.foldData = foldData; + if (Array.isArray(folds)) { + this.folds = folds; } - fold.subFolds = []; - }; - - this.expandFolds = function(folds) { - folds.forEach(function(fold) { - this.expandFold(fold); + else { + folds = this.folds = [folds]; + } + var last = folds[folds.length - 1]; + this.range = new Range(folds[0].start.row, folds[0].start.column, last.end.row, last.end.column); + this.start = this.range.start; + this.end = this.range.end; + this.folds.forEach(function (fold) { + fold.setFoldLine(this); }, this); + } + FoldLine.prototype.shiftRow = function (shift) { + this.start.row += shift; + this.end.row += shift; + this.folds.forEach(function (fold) { + fold.start.row += shift; + fold.end.row += shift; + }); }; - - this.unfold = function(location, expandInner) { - var range, folds; - if (location == null) { - range = new Range(0, 0, this.getLength(), 0); - if (expandInner == null) expandInner = true; - } else if (typeof location == "number") { - range = new Range(location, 0, location, this.getLine(location).length); - } else if ("row" in location) { - range = Range.fromPoints(location, location); - } else if (Array.isArray(location)) { - folds = []; - location.forEach(function(range) { - folds = folds.concat(this.unfold(range)); - }, this); - return folds; - } else { - range = location; + FoldLine.prototype.addFold = function (fold) { + if (fold.sameRow) { + if (fold.start.row < this.startRow || fold.endRow > this.endRow) { + throw new Error("Can't add a fold to this FoldLine as it has no connection"); + } + this.folds.push(fold); + this.folds.sort(function (a, b) { + return -a.range.compareEnd(b.start.row, b.start.column); + }); + if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } + else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } } - - folds = this.getFoldsInRangeList(range); - var outermostFolds = folds; - while ( - folds.length == 1 - && Range.comparePoints(folds[0].start, range.start) < 0 - && Range.comparePoints(folds[0].end, range.end) > 0 - ) { - this.expandFolds(folds); - folds = this.getFoldsInRangeList(range); + else if (fold.start.row == this.end.row) { + this.folds.push(fold); + this.end.row = fold.end.row; + this.end.column = fold.end.column; } - - if (expandInner != false) { - this.removeFolds(folds); - } else { - this.expandFolds(folds); + else if (fold.end.row == this.start.row) { + this.folds.unshift(fold); + this.start.row = fold.start.row; + this.start.column = fold.start.column; } - if (outermostFolds.length) - return outermostFolds; + else { + throw new Error("Trying to add fold to FoldRow that doesn't have a matching row"); + } + fold.foldLine = this; }; - this.isRowFolded = function(docRow, startFoldRow) { - return !!this.getFoldLine(docRow, startFoldRow); + FoldLine.prototype.containsRow = function (row) { + return row >= this.start.row && row <= this.end.row; }; - - this.getRowFoldEnd = function(docRow, startFoldRow) { - var foldLine = this.getFoldLine(docRow, startFoldRow); - return foldLine ? foldLine.end.row : docRow; - }; - - this.getRowFoldStart = function(docRow, startFoldRow) { - var foldLine = this.getFoldLine(docRow, startFoldRow); - return foldLine ? foldLine.start.row : docRow; - }; - - this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) { - if (startRow == null) - startRow = foldLine.start.row; - if (startColumn == null) - startColumn = 0; - if (endRow == null) - endRow = foldLine.end.row; - if (endColumn == null) - endColumn = this.getLine(endRow).length; - var doc = this.doc; - var textLine = ""; - - foldLine.walk(function(placeholder, row, column, lastColumn) { - if (row < startRow) + FoldLine.prototype.walk = function (callback, endRow, endColumn) { + var lastEnd = 0, folds = this.folds, fold, cmp, stop, isNewRow = true; + if (endRow == null) { + endRow = this.end.row; + endColumn = this.end.column; + } + for (var i = 0; i < folds.length; i++) { + fold = folds[i]; + cmp = fold.range.compareStart(endRow, endColumn); + if (cmp == -1) { + callback(null, endRow, endColumn, lastEnd, isNewRow); return; - if (row == startRow) { - if (column < startColumn) - return; - lastColumn = Math.max(startColumn, lastColumn); } - - if (placeholder != null) { - textLine += placeholder; - } else { - textLine += doc.getLine(row).substring(lastColumn, column); + stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); + stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); + if (stop || cmp === 0) { + return; } - }, endRow, endColumn); - return textLine; - }; - - this.getDisplayLine = function(row, endColumn, startRow, startColumn) { - var foldLine = this.getFoldLine(row); - - if (!foldLine) { - var line; - line = this.doc.getLine(row); - return line.substring(startColumn || 0, endColumn || line.length); - } else { - return this.getFoldDisplayLine( - foldLine, row, endColumn, startRow, startColumn); + isNewRow = !fold.sameRow; + lastEnd = fold.end.column; } + callback(null, endRow, endColumn, lastEnd, isNewRow); }; - - this.$cloneFoldData = function() { - var fd = []; - fd = this.$foldData.map(function(foldLine) { - var folds = foldLine.folds.map(function(fold) { - return fold.clone(); - }); - return new FoldLine(fd, folds); - }); - - return fd; - }; - - this.toggleFold = function(tryToUnfold) { - var selection = this.selection; - var range = selection.getRange(); - var fold; - var bracketPos; - - if (range.isEmpty()) { - var cursor = range.start; - fold = this.getFoldAt(cursor.row, cursor.column); - - if (fold) { - this.expandFold(fold); - return; - } else if (bracketPos = this.findMatchingBracket(cursor)) { - if (range.comparePoint(bracketPos) == 1) { - range.end = bracketPos; - } else { - range.start = bracketPos; - range.start.column++; - range.end.column--; - } - } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) { - if (range.comparePoint(bracketPos) == 1) - range.end = bracketPos; - else - range.start = bracketPos; - - range.start.column++; - } else { - range = this.getCommentFoldRange(cursor.row, cursor.column) || range; + FoldLine.prototype.getNextFoldTo = function (row, column) { + var fold, cmp; + for (var i = 0; i < this.folds.length; i++) { + fold = this.folds[i]; + cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + return { + fold: fold, + kind: "after" + }; } - } else { - var folds = this.getFoldsInRange(range); - if (tryToUnfold && folds.length) { - this.expandFolds(folds); - return; - } else if (folds.length == 1 ) { - fold = folds[0]; + else if (cmp === 0) { + return { + fold: fold, + kind: "inside" + }; } } - - if (!fold) - fold = this.getFoldAt(range.start.row, range.start.column); - - if (fold && fold.range.toString() == range.toString()) { - this.expandFold(fold); - return; - } - - var placeholder = "..."; - if (!range.isMultiLine()) { - placeholder = this.getTextRange(range); - if (placeholder.length < 4) - return; - placeholder = placeholder.trim().substring(0, 2) + ".."; - } - - this.addFold(placeholder, range); + return null; }; - - this.getCommentFoldRange = function(row, column, dir) { - var iterator = new TokenIterator(this, row, column); - var token = iterator.getCurrentToken(); - var type = token && token.type; - if (token && /^comment|string/.test(type)) { - type = type.match(/comment|string/)[0]; - if (type == "comment") - type += "|doc-start"; - var re = new RegExp(type); - var range = new Range(); - if (dir != 1) { - do { - token = iterator.stepBackward(); - } while (token && re.test(token.type)); - iterator.stepForward(); + FoldLine.prototype.addRemoveChars = function (row, column, len) { + var ret = this.getNextFoldTo(row, column), fold, folds; + if (ret) { + fold = ret.fold; + if (ret.kind == "inside" + && fold.start.column != column + && fold.start.row != row) { + window.console && window.console.log(row, column, fold); } - - range.start.row = iterator.getCurrentTokenRow(); - range.start.column = iterator.getCurrentTokenColumn() + 2; - - iterator = new TokenIterator(this, row, column); - - if (dir != -1) { - var lastRow = -1; - do { - token = iterator.stepForward(); - if (lastRow == -1) { - var state = this.getState(iterator.$row); - if (!re.test(state)) - lastRow = iterator.$row; - } else if (iterator.$row > lastRow) { - break; + else if (fold.start.row == row) { + folds = this.folds; + var i = folds.indexOf(fold); + if (i === 0) { + this.start.column += len; + } + for (i; i < folds.length; i++) { + fold = folds[i]; + fold.start.column += len; + if (!fold.sameRow) { + return; } - } while (token && re.test(token.type)); - token = iterator.stepBackward(); - } else - token = iterator.getCurrentToken(); - - range.end.row = iterator.getCurrentTokenRow(); - range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2; - return range; + fold.end.column += len; + } + this.end.column += len; + } } }; - - this.foldAll = function(startRow, endRow, depth, test) { - if (depth == undefined) - depth = 100000; // JSON.stringify doesn't hanle Infinity - var foldWidgets = this.foldWidgets; - if (!foldWidgets) - return; // mode doesn't support folding - endRow = endRow || this.getLength(); - startRow = startRow || 0; - for (var row = startRow; row < endRow; row++) { - if (foldWidgets[row] == null) - foldWidgets[row] = this.getFoldWidget(row); - if (foldWidgets[row] != "start") - continue; - - if (test && !test(row)) continue; - - var range = this.getFoldWidgetRange(row); - if (range && range.isMultiLine() - && range.end.row <= endRow - && range.start.row >= startRow - ) { - row = range.end.row; - range.collapseChildren = depth; - this.addFold("...", range); - } + FoldLine.prototype.split = function (row, column) { + var pos = this.getNextFoldTo(row, column); + if (!pos || pos.kind == "inside") + return null; + var fold = pos.fold; + var folds = this.folds; + var foldData = this.foldData; + var i = folds.indexOf(fold); + var foldBefore = folds[i - 1]; + this.end.row = foldBefore.end.row; + this.end.column = foldBefore.end.column; + folds = folds.splice(i, folds.length - i); + var newFoldLine = new FoldLine(foldData, folds); + foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine); + return newFoldLine; + }; + FoldLine.prototype.merge = function (foldLineNext) { + var folds = foldLineNext.folds; + for (var i = 0; i < folds.length; i++) { + this.addFold(folds[i]); } + var foldData = this.foldData; + foldData.splice(foldData.indexOf(foldLineNext), 1); }; - - this.foldToLevel = function(level) { - this.foldAll(); - while (level-- > 0) - this.unfold(null, false); + FoldLine.prototype.toString = function () { + var ret = [this.range.toString() + ": ["]; + this.folds.forEach(function (fold) { + ret.push(" " + fold.toString()); + }); + ret.push("]"); + return ret.join("\n"); }; - - this.foldAllComments = function() { - var session = this; - this.foldAll(null, null, null, function(row) { - var tokens = session.getTokens(row); - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - if (token.type == "text" && /^\s+$/.test(token.value)) - continue; - if (/comment/.test(token.type)) - return true; - return false; + FoldLine.prototype.idxToPosition = function (idx) { + var lastFoldEndColumn = 0; + for (var i = 0; i < this.folds.length; i++) { + var fold = this.folds[i]; + idx -= fold.start.column - lastFoldEndColumn; + if (idx < 0) { + return { + row: fold.start.row, + column: fold.start.column + idx + }; } - }); + idx -= fold.placeholder.length; + if (idx < 0) { + return fold.start; + } + lastFoldEndColumn = fold.end.column; + } + return { + row: this.end.row, + column: this.end.column + idx + }; }; - this.$foldStyles = { - "manual": 1, - "markbegin": 1, - "markbeginend": 1 - }; - this.$foldStyle = "markbegin"; - this.setFoldStyle = function(style) { - if (!this.$foldStyles[style]) - throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]"); - - if (this.$foldStyle == style) - return; + return FoldLine; +}()); +exports.FoldLine = FoldLine; - this.$foldStyle = style; - - if (style == "manual") - this.unfold(); - var mode = this.$foldMode; - this.$setFolding(null); - this.$setFolding(mode); - }; +}); - this.$setFolding = function(foldMode) { - if (this.$foldMode == foldMode) - return; - - this.$foldMode = foldMode; - - this.off('change', this.$updateFoldWidgets); - this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); - this._signal("changeAnnotation"); - - if (!foldMode || this.$foldStyle == "manual") { - this.foldWidgets = null; - return; +define("ace/range_list",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var Range = require("./range").Range; +var comparePoints = Range.comparePoints; +var RangeList = /** @class */ (function () { + function RangeList() { + this.ranges = []; + this.$bias = 1; + } + RangeList.prototype.pointIndex = function (pos, excludeEdges, startIndex) { + var list = this.ranges; + for (var i = startIndex || 0; i < list.length; i++) { + var range = list[i]; + var cmpEnd = comparePoints(pos, range.end); + if (cmpEnd > 0) + continue; + var cmpStart = comparePoints(pos, range.start); + if (cmpEnd === 0) + return excludeEdges && cmpStart !== 0 ? -i - 2 : i; + if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) + return i; + return -i - 1; } - - this.foldWidgets = []; - this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle); - this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); - - this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); - this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this); - this.on('change', this.$updateFoldWidgets); - this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + return -i - 1; }; - - this.getParentFoldRangeData = function (row, ignoreCurrent) { - var fw = this.foldWidgets; - if (!fw || (ignoreCurrent && fw[row])) - return {}; - - var i = row - 1, firstRange; - while (i >= 0) { - var c = fw[i]; - if (c == null) - c = fw[i] = this.getFoldWidget(i); - - if (c == "start") { - var range = this.getFoldWidgetRange(i); - if (!firstRange) - firstRange = range; - if (range && range.end.row >= row) - break; - } - i--; - } - - return { - range: i !== -1 && range, - firstRange: firstRange - }; + RangeList.prototype.add = function (range) { + var excludeEdges = !range.isEmpty(); + var startIndex = this.pointIndex(range.start, excludeEdges); + if (startIndex < 0) + startIndex = -startIndex - 1; + var endIndex = this.pointIndex(range.end, excludeEdges, startIndex); + if (endIndex < 0) + endIndex = -endIndex - 1; + else + endIndex++; + return this.ranges.splice(startIndex, endIndex - startIndex, range); }; - - this.onFoldWidgetClick = function(row, e) { - e = e.domEvent; - var options = { - children: e.shiftKey, - all: e.ctrlKey || e.metaKey, - siblings: e.altKey - }; - - var range = this.$toggleFoldWidget(row, options); - if (!range) { - var el = (e.target || e.srcElement); - if (el && /ace_fold-widget/.test(el.className)) - el.className += " ace_invalid"; + RangeList.prototype.addList = function (list) { + var removed = []; + for (var i = list.length; i--;) { + removed.push.apply(removed, this.add(list[i])); } + return removed; }; - - this.$toggleFoldWidget = function(row, options) { - if (!this.getFoldWidget) - return; - var type = this.getFoldWidget(row); - var line = this.getLine(row); - - var dir = type === "end" ? -1 : 1; - var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir); - - if (fold) { - if (options.children || options.all) - this.removeFold(fold); - else - this.expandFold(fold); - return fold; - } - - var range = this.getFoldWidgetRange(row, true); - if (range && !range.isMultiLine()) { - fold = this.getFoldAt(range.start.row, range.start.column, 1); - if (fold && range.isEqual(fold.range)) { - this.removeFold(fold); - return fold; - } - } - - if (options.siblings) { - var data = this.getParentFoldRangeData(row); - if (data.range) { - var startRow = data.range.start.row + 1; - var endRow = data.range.end.row; - } - this.foldAll(startRow, endRow, options.all ? 10000 : 0); - } else if (options.children) { - endRow = range ? range.end.row : this.getLength(); - this.foldAll(row + 1, endRow, options.all ? 10000 : 0); - } else if (range) { - if (options.all) - range.collapseChildren = 10000; - this.addFold("...", range); - } - - return range; + RangeList.prototype.substractPoint = function (pos) { + var i = this.pointIndex(pos); + if (i >= 0) + return this.ranges.splice(i, 1); }; - - - - this.toggleFoldWidget = function(toggleParent) { - var row = this.selection.getCursor().row; - row = this.getRowFoldStart(row); - var range = this.$toggleFoldWidget(row, {}); - - if (range) - return; - var data = this.getParentFoldRangeData(row, true); - range = data.range || data.firstRange; - - if (range) { - row = range.start.row; - var fold = this.getFoldAt(row, this.getLine(row).length, 1); - - if (fold) { - this.removeFold(fold); - } else { - this.addFold("...", range); + RangeList.prototype.merge = function () { + var removed = []; + var list = this.ranges; + list = list.sort(function (a, b) { + return comparePoints(a.start, b.start); + }); + var next = list[0], range; + for (var i = 1; i < list.length; i++) { + range = next; + next = list[i]; + var cmp = comparePoints(range.end, next.start); + if (cmp < 0) + continue; + if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) + continue; + if (comparePoints(range.end, next.end) < 0) { + range.end.row = next.end.row; + range.end.column = next.end.column; } + list.splice(i, 1); + removed.push(next); + next = range; + i--; } + this.ranges = list; + return removed; }; - - this.updateFoldWidgets = function(delta) { - var firstRow = delta.start.row; - var len = delta.end.row - firstRow; - - if (len === 0) { - this.foldWidgets[firstRow] = null; - } else if (delta.action == 'remove') { - this.foldWidgets.splice(firstRow, len + 1, null); - } else { - var args = Array(len + 1); - args.unshift(firstRow, 1); - this.foldWidgets.splice.apply(this.foldWidgets, args); - } + RangeList.prototype.contains = function (row, column) { + return this.pointIndex({ row: row, column: column }) >= 0; }; - this.tokenizerUpdateFoldWidgets = function(e) { - var rows = e.data; - if (rows.first != rows.last) { - if (this.foldWidgets.length > rows.first) - this.foldWidgets.splice(rows.first, this.foldWidgets.length); - } + RangeList.prototype.containsPoint = function (pos) { + return this.pointIndex(pos) >= 0; }; -} - -exports.Folding = Folding; - -}); - -define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"], function(require, exports, module) { -"use strict"; - -var TokenIterator = require("../token_iterator").TokenIterator; -var Range = require("../range").Range; - - -function BracketMatch() { - - this.findMatchingBracket = function(position, chr) { - if (position.column == 0) return null; - - var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1); - if (charBeforeCursor == "") return null; - - var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); - if (!match) - return null; - - if (match[1]) - return this.$findClosingBracket(match[1], position); - else - return this.$findOpeningBracket(match[2], position); + RangeList.prototype.rangeAtPoint = function (pos) { + var i = this.pointIndex(pos); + if (i >= 0) + return this.ranges[i]; }; - - this.getBracketRange = function(pos) { - var line = this.getLine(pos.row); - var before = true, range; - - var chr = line.charAt(pos.column - 1); - var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); - if (!match) { - chr = line.charAt(pos.column); - pos = {row: pos.row, column: pos.column + 1}; - match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); - before = false; + RangeList.prototype.clipRows = function (startRow, endRow) { + var list = this.ranges; + if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow) + return []; + var startIndex = this.pointIndex({ row: startRow, column: 0 }); + if (startIndex < 0) + startIndex = -startIndex - 1; + var endIndex = this.pointIndex({ row: endRow, column: 0 }, startIndex); + if (endIndex < 0) + endIndex = -endIndex - 1; + var clipped = []; + for (var i = startIndex; i < endIndex; i++) { + clipped.push(list[i]); } - if (!match) - return null; - - if (match[1]) { - var bracketPos = this.$findClosingBracket(match[1], pos); - if (!bracketPos) - return null; - range = Range.fromPoints(pos, bracketPos); - if (!before) { - range.end.column++; - range.start.column--; - } - range.cursor = range.end; - } else { - var bracketPos = this.$findOpeningBracket(match[2], pos); - if (!bracketPos) - return null; - range = Range.fromPoints(bracketPos, pos); - if (!before) { - range.start.column++; - range.end.column--; - } - range.cursor = range.start; - } - - return range; + return clipped; }; - this.getMatchingBracketRanges = function(pos) { - var line = this.getLine(pos.row); - - var chr = line.charAt(pos.column - 1); - var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); - if (!match) { - chr = line.charAt(pos.column); - pos = {row: pos.row, column: pos.column + 1}; - match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); - } - - if (!match) - return null; - - var startRange = new Range(pos.row, pos.column - 1, pos.row, pos.column); - var bracketPos = match[1] ? this.$findClosingBracket(match[1], pos) - : this.$findOpeningBracket(match[2], pos); - if (!bracketPos) - return [startRange]; - var endRange = new Range(bracketPos.row, bracketPos.column, bracketPos.row, bracketPos.column + 1); - - return [startRange, endRange]; + RangeList.prototype.removeAll = function () { + return this.ranges.splice(0, this.ranges.length); }; - - this.$brackets = { - ")": "(", - "(": ")", - "]": "[", - "[": "]", - "{": "}", - "}": "{", - "<": ">", - ">": "<" + RangeList.prototype.attach = function (session) { + if (this.session) + this.detach(); + this.session = session; + this.onChange = this.$onChange.bind(this); + this.session.on('change', this.onChange); }; - - this.$findOpeningBracket = function(bracket, position, typeRe) { - var openBracket = this.$brackets[bracket]; - var depth = 1; - - var iterator = new TokenIterator(this, position.row, position.column); - var token = iterator.getCurrentToken(); - if (!token) - token = iterator.stepForward(); - if (!token) + RangeList.prototype.detach = function () { + if (!this.session) return; - - if (!typeRe){ - typeRe = new RegExp( - "(\\.?" + - token.type.replace(".", "\\.").replace("rparen", ".paren") - .replace(/\b(?:end)\b/, "(?:start|begin|end)") - + ")+" - ); + this.session.removeListener('change', this.onChange); + this.session = null; + }; + RangeList.prototype.$onChange = function (delta) { + var start = delta.start; + var end = delta.end; + var startRow = start.row; + var endRow = end.row; + var ranges = this.ranges; + for (var i = 0, n = ranges.length; i < n; i++) { + var r = ranges[i]; + if (r.end.row >= startRow) + break; } - var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2; - var value = token.value; - - while (true) { - - while (valueIndex >= 0) { - var chr = value.charAt(valueIndex); - if (chr == openBracket) { - depth -= 1; - if (depth == 0) { - return {row: iterator.getCurrentTokenRow(), - column: valueIndex + iterator.getCurrentTokenColumn()}; + if (delta.action == "insert") { + var lineDif = endRow - startRow; + var colDiff = -start.column + end.column; + for (; i < n; i++) { + var r = ranges[i]; + if (r.start.row > startRow) + break; + if (r.start.row == startRow && r.start.column >= start.column) { + if (r.start.column == start.column && this.$bias <= 0) { + } + else { + r.start.column += colDiff; + r.start.row += lineDif; } } - else if (chr == bracket) { - depth += 1; + if (r.end.row == startRow && r.end.column >= start.column) { + if (r.end.column == start.column && this.$bias < 0) { + continue; + } + if (r.end.column == start.column && colDiff > 0 && i < n - 1) { + if (r.end.column > r.start.column && r.end.column == ranges[i + 1].start.column) + r.end.column -= colDiff; + } + r.end.column += colDiff; + r.end.row += lineDif; } - valueIndex -= 1; } - do { - token = iterator.stepBackward(); - } while (token && !typeRe.test(token.type)); - - if (token == null) - break; - - value = token.value; - valueIndex = value.length - 1; - } - - return null; - }; - - this.$findClosingBracket = function(bracket, position, typeRe) { - var closingBracket = this.$brackets[bracket]; - var depth = 1; - - var iterator = new TokenIterator(this, position.row, position.column); - var token = iterator.getCurrentToken(); - if (!token) - token = iterator.stepForward(); - if (!token) - return; - - if (!typeRe){ - typeRe = new RegExp( - "(\\.?" + - token.type.replace(".", "\\.").replace("lparen", ".paren") - .replace(/\b(?:start|begin)\b/, "(?:start|begin|end)") - + ")+" - ); } - var valueIndex = position.column - iterator.getCurrentTokenColumn(); - - while (true) { - - var value = token.value; - var valueLength = value.length; - while (valueIndex < valueLength) { - var chr = value.charAt(valueIndex); - if (chr == closingBracket) { - depth -= 1; - if (depth == 0) { - return {row: iterator.getCurrentTokenRow(), - column: valueIndex + iterator.getCurrentTokenColumn()}; + else { + var lineDif = startRow - endRow; + var colDiff = start.column - end.column; + for (; i < n; i++) { + var r = ranges[i]; + if (r.start.row > endRow) + break; + if (r.end.row < endRow + && (startRow < r.end.row + || startRow == r.end.row && start.column < r.end.column)) { + r.end.row = startRow; + r.end.column = start.column; + } + else if (r.end.row == endRow) { + if (r.end.column <= end.column) { + if (lineDif || r.end.column > start.column) { + r.end.column = start.column; + r.end.row = start.row; + } + } + else { + r.end.column += colDiff; + r.end.row += lineDif; } } - else if (chr == bracket) { - depth += 1; + else if (r.end.row > endRow) { + r.end.row += lineDif; + } + if (r.start.row < endRow + && (startRow < r.start.row + || startRow == r.start.row && start.column < r.start.column)) { + r.start.row = startRow; + r.start.column = start.column; + } + else if (r.start.row == endRow) { + if (r.start.column <= end.column) { + if (lineDif || r.start.column > start.column) { + r.start.column = start.column; + r.start.row = start.row; + } + } + else { + r.start.column += colDiff; + r.start.row += lineDif; + } + } + else if (r.start.row > endRow) { + r.start.row += lineDif; } - valueIndex += 1; } - do { - token = iterator.stepForward(); - } while (token && !typeRe.test(token.type)); - - if (token == null) - break; - - valueIndex = 0; } - - return null; + if (lineDif != 0 && i < n) { + for (; i < n; i++) { + var r = ranges[i]; + r.start.row += lineDif; + r.end.row += lineDif; + } + } }; -} -exports.BracketMatch = BracketMatch; + return RangeList; +}()); +RangeList.prototype.comparePoints = comparePoints; +exports.RangeList = RangeList; }); -define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/bidihandler","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/edit_session/folding","ace/edit_session/bracket_match"], function(require, exports, module) { -"use strict"; - -var oop = require("./lib/oop"); -var lang = require("./lib/lang"); -var BidiHandler = require("./bidihandler").BidiHandler; -var config = require("./config"); -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var Selection = require("./selection").Selection; -var TextMode = require("./mode/text").Mode; -var Range = require("./range").Range; -var Document = require("./document").Document; -var BackgroundTokenizer = require("./background_tokenizer").BackgroundTokenizer; -var SearchHighlight = require("./search_highlight").SearchHighlight; - -var EditSession = function(text, mode) { - this.$breakpoints = []; - this.$decorations = []; - this.$frontMarkers = {}; - this.$backMarkers = {}; - this.$markerId = 1; - this.$undoSelect = true; - - this.$foldData = []; - this.id = "session" + (++EditSession.$uid); - this.$foldData.toString = function() { - return this.join("\n"); +define("ace/edit_session/fold",["require","exports","module","ace/range_list"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - this.bgTokenizer = new BackgroundTokenizer((new TextMode()).getTokenizer(), this); - - var _self = this; - this.bgTokenizer.on("update", function(e) { - _self._signal("tokenizerUpdate", e); - }); - - this.on("changeFold", this.onChangeFold.bind(this)); - this.$onChange = this.onChange.bind(this); - - if (typeof text != "object" || !text.getLine) - text = new Document(text); - - this.setDocument(text); - this.selection = new Selection(this); - this.$bidiHandler = new BidiHandler(this); - - config.resetOptions(this); - this.setMode(mode); - config._signal("session", this); - - this.destroyed = false; -}; - - -EditSession.$uid = 0; - -(function() { - - oop.implement(this, EventEmitter); - this.setDocument = function(doc) { - if (this.doc) - this.doc.off("change", this.$onChange); - - this.doc = doc; - doc.on("change", this.$onChange, true); - - this.bgTokenizer.setDocument(this.getDocument()); - - this.resetCaches(); +})(); +var RangeList = require("../range_list").RangeList; +var Fold = /** @class */ (function (_super) { + __extends(Fold, _super); + function Fold(range, placeholder) { + var _this = _super.call(this) || this; + _this.foldLine = null; + _this.placeholder = placeholder; + _this.range = range; + _this.start = range.start; + _this.end = range.end; + _this.sameRow = range.start.row == range.end.row; + _this.subFolds = _this.ranges = []; + return _this; + } + Fold.prototype.toString = function () { + return '"' + this.placeholder + '" ' + this.range.toString(); }; - this.getDocument = function() { - return this.doc; + Fold.prototype.setFoldLine = function (foldLine) { + this.foldLine = foldLine; + this.subFolds.forEach(function (fold) { + fold.setFoldLine(foldLine); + }); }; - this.$resetRowCache = function(docRow) { - if (!docRow) { - this.$docRowCache = []; - this.$screenRowCache = []; + Fold.prototype.clone = function () { + var range = this.range.clone(); + var fold = new Fold(range, this.placeholder); + this.subFolds.forEach(function (subFold) { + fold.subFolds.push(subFold.clone()); + }); + fold.collapseChildren = this.collapseChildren; + return fold; + }; + Fold.prototype.addSubFold = function (fold) { + if (this.range.isEqual(fold)) return; + consumeRange(fold, this.start); + var row = fold.start.row, column = fold.start.column; + for (var i = 0, cmp = -1; i < this.subFolds.length; i++) { + cmp = this.subFolds[i].range.compare(row, column); + if (cmp != 1) + break; } - var l = this.$docRowCache.length; - var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1; - if (l > i) { - this.$docRowCache.splice(i, l); - this.$screenRowCache.splice(i, l); - } - }; - - this.$getRowCacheIndex = function(cacheArray, val) { - var low = 0; - var hi = cacheArray.length - 1; - - while (low <= hi) { - var mid = (low + hi) >> 1; - var c = cacheArray[mid]; - - if (val > c) - low = mid + 1; - else if (val < c) - hi = mid - 1; + var afterStart = this.subFolds[i]; + var firstConsumed = 0; + if (cmp == 0) { + if (afterStart.range.containsRange(fold)) + return afterStart.addSubFold(fold); else - return mid; + firstConsumed = 1; } - - return low -1; - }; - - this.resetCaches = function() { - this.$modified = true; - this.$wrapData = []; - this.$rowLengthCache = []; - this.$resetRowCache(0); - if (!this.destroyed) - this.bgTokenizer.start(0); + var row = fold.range.end.row, column = fold.range.end.column; + for (var j = i, cmp = -1; j < this.subFolds.length; j++) { + cmp = this.subFolds[j].range.compare(row, column); + if (cmp != 1) + break; + } + if (cmp == 0) + j++; + var consumedFolds = this.subFolds.splice(i, j - i, fold); + var last = cmp == 0 ? consumedFolds.length - 1 : consumedFolds.length; + for (var k = firstConsumed; k < last; k++) { + fold.addSubFold(consumedFolds[k]); + } + fold.setFoldLine(this.foldLine); + return fold; }; - - this.onChangeFold = function(e) { - var fold = e.data; - this.$resetRowCache(fold.start.row); + Fold.prototype.restoreRange = function (range) { + return restoreRange(range, this.start); }; + return Fold; +}(RangeList)); +function consumePoint(point, anchor) { + point.row -= anchor.row; + if (point.row == 0) + point.column -= anchor.column; +} +function consumeRange(range, anchor) { + consumePoint(range.start, anchor); + consumePoint(range.end, anchor); +} +function restorePoint(point, anchor) { + if (point.row == 0) + point.column += anchor.column; + point.row += anchor.row; +} +function restoreRange(range, anchor) { + restorePoint(range.start, anchor); + restorePoint(range.end, anchor); +} +exports.Fold = Fold; - this.onChange = function(delta) { - this.$modified = true; - this.$bidiHandler.onChange(delta); - this.$resetRowCache(delta.start.row); +}); - var removedFolds = this.$updateInternalDataOnChange(delta); - if (!this.$fromUndo && this.$undoManager) { - if (removedFolds && removedFolds.length) { - this.$undoManager.add({ - action: "removeFolds", - folds: removedFolds - }, this.mergeUndoDeltas); - this.mergeUndoDeltas = true; +define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator","ace/mouse/mouse_event"], function(require, exports, module){// @ts-nocheck +"use strict"; +var Range = require("../range").Range; +var FoldLine = require("./fold_line").FoldLine; +var Fold = require("./fold").Fold; +var TokenIterator = require("../token_iterator").TokenIterator; +var MouseEvent = require("../mouse/mouse_event").MouseEvent; +function Folding() { + this.getFoldAt = function (row, column, side) { + var foldLine = this.getFoldLine(row); + if (!foldLine) + return null; + var folds = foldLine.folds; + for (var i = 0; i < folds.length; i++) { + var range = folds[i].range; + if (range.contains(row, column)) { + if (side == 1 && range.isEnd(row, column) && !range.isEmpty()) { + continue; + } + else if (side == -1 && range.isStart(row, column) && !range.isEmpty()) { + continue; + } + return folds[i]; } - this.$undoManager.add(delta, this.mergeUndoDeltas); - this.mergeUndoDeltas = true; - - this.$informUndoManager.schedule(); } - - this.bgTokenizer.$updateOnChange(delta); - this._signal("change", delta); - }; - this.setValue = function(text) { - this.doc.setValue(text); - this.selection.moveTo(0, 0); - - this.$resetRowCache(0); - this.setUndoManager(this.$undoManager); - this.getUndoManager().reset(); - }; - this.getValue = - this.toString = function() { - return this.doc.getValue(); - }; - this.getSelection = function() { - return this.selection; - }; - this.getState = function(row) { - return this.bgTokenizer.getState(row); - }; - this.getTokens = function(row) { - return this.bgTokenizer.getTokens(row); }; - this.getTokenAt = function(row, column) { - var tokens = this.bgTokenizer.getTokens(row); - var token, c = 0; - if (column == null) { - var i = tokens.length - 1; - c = this.getLine(row).length; - } else { - for (var i = 0; i < tokens.length; i++) { - c += tokens[i].value.length; - if (c >= column) + this.getFoldsInRange = function (range) { + var start = range.start; + var end = range.end; + var foldLines = this.$foldData; + var foundFolds = []; + start.column += 1; + end.column -= 1; + for (var i = 0; i < foldLines.length; i++) { + var cmp = foldLines[i].range.compareRange(range); + if (cmp == 2) { + continue; + } + else if (cmp == -2) { + break; + } + var folds = foldLines[i].folds; + for (var j = 0; j < folds.length; j++) { + var fold = folds[j]; + cmp = fold.range.compareRange(range); + if (cmp == -2) { + break; + } + else if (cmp == 2) { + continue; + } + else + if (cmp == 42) { break; + } + foundFolds.push(fold); } } - token = tokens[i]; - if (!token) - return null; - token.index = i; - token.start = c - token.value.length; - return token; + start.column -= 1; + end.column += 1; + return foundFolds; }; - this.setUndoManager = function(undoManager) { - this.$undoManager = undoManager; - - if (this.$informUndoManager) - this.$informUndoManager.cancel(); - - if (undoManager) { - var self = this; - undoManager.addSession(this); - this.$syncInformUndoManager = function() { - self.$informUndoManager.cancel(); - self.mergeUndoDeltas = false; - }; - this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager); - } else { - this.$syncInformUndoManager = function() {}; + this.getFoldsInRangeList = function (ranges) { + if (Array.isArray(ranges)) { + var folds = []; + ranges.forEach(function (range) { + folds = folds.concat(this.getFoldsInRange(range)); + }, this); } - }; - this.markUndoGroup = function() { - if (this.$syncInformUndoManager) - this.$syncInformUndoManager(); - }; - - this.$defaultUndoManager = { - undo: function() {}, - redo: function() {}, - hasUndo: function() {}, - hasRedo: function() {}, - reset: function() {}, - add: function() {}, - addSelection: function() {}, - startNewGroup: function() {}, - addSession: function() {} - }; - this.getUndoManager = function() { - return this.$undoManager || this.$defaultUndoManager; - }; - this.getTabString = function() { - if (this.getUseSoftTabs()) { - return lang.stringRepeat(" ", this.getTabSize()); - } else { - return "\t"; + else { + var folds = this.getFoldsInRange(ranges); } + return folds; }; - this.setUseSoftTabs = function(val) { - this.setOption("useSoftTabs", val); - }; - this.getUseSoftTabs = function() { - return this.$useSoftTabs && !this.$mode.$indentWithTabs; - }; - this.setTabSize = function(tabSize) { - this.setOption("tabSize", tabSize); - }; - this.getTabSize = function() { - return this.$tabSize; - }; - this.isTabStop = function(position) { - return this.$useSoftTabs && (position.column % this.$tabSize === 0); + this.getAllFolds = function () { + var folds = []; + var foldLines = this.$foldData; + for (var i = 0; i < foldLines.length; i++) + for (var j = 0; j < foldLines[i].folds.length; j++) + folds.push(foldLines[i].folds[j]); + return folds; }; - this.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) { - this.setOption("navigateWithinSoftTabs", navigateWithinSoftTabs); + this.getFoldStringAt = function (row, column, trim, foldLine) { + foldLine = foldLine || this.getFoldLine(row); + if (!foldLine) + return null; + var lastFold = { + end: { column: 0 } + }; + var str, fold; + for (var i = 0; i < foldLine.folds.length; i++) { + fold = foldLine.folds[i]; + var cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + str = this + .getLine(fold.start.row) + .substring(lastFold.end.column, fold.start.column); + break; + } + else if (cmp === 0) { + return null; + } + lastFold = fold; + } + if (!str) + str = this.getLine(fold.start.row).substring(lastFold.end.column); + if (trim == -1) + return str.substring(0, column - lastFold.end.column); + else if (trim == 1) + return str.substring(column - lastFold.end.column); + else + return str; }; - this.getNavigateWithinSoftTabs = function() { - return this.$navigateWithinSoftTabs; - }; - - this.$overwrite = false; - this.setOverwrite = function(overwrite) { - this.setOption("overwrite", overwrite); - }; - this.getOverwrite = function() { - return this.$overwrite; - }; - this.toggleOverwrite = function() { - this.setOverwrite(!this.$overwrite); - }; - this.addGutterDecoration = function(row, className) { - if (!this.$decorations[row]) - this.$decorations[row] = ""; - this.$decorations[row] += " " + className; - this._signal("changeBreakpoint", {}); - }; - this.removeGutterDecoration = function(row, className) { - this.$decorations[row] = (this.$decorations[row] || "").replace(" " + className, ""); - this._signal("changeBreakpoint", {}); + this.getFoldLine = function (docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) { + return foldLine; + } + else if (foldLine.end.row > docRow) { + return null; + } + } + return null; }; - this.getBreakpoints = function() { - return this.$breakpoints; + this.getNextFoldLine = function (docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.end.row >= docRow) { + return foldLine; + } + } + return null; }; - this.setBreakpoints = function(rows) { - this.$breakpoints = []; - for (var i=0; i= last) { + if (start < last) { + if (start >= first) + rowCount -= last - start; + else + rowCount = 0; // in one fold + } + break; + } + else if (end >= first) { + if (start >= first) // fold inside range + rowCount -= end - start; + else + rowCount -= end - first + 1; + } } - this._signal("changeBreakpoint", {}); + return rowCount; }; - this.clearBreakpoints = function() { - this.$breakpoints = []; - this._signal("changeBreakpoint", {}); + this.$addFoldLine = function (foldLine) { + this.$foldData.push(foldLine); + this.$foldData.sort(function (a, b) { + return a.start.row - b.start.row; + }); + return foldLine; }; - this.setBreakpoint = function(row, className) { - if (className === undefined) - className = "ace_breakpoint"; - if (className) - this.$breakpoints[row] = className; + this.addFold = function (placeholder, range) { + var foldData = this.$foldData; + var added = false; + var fold; + if (placeholder instanceof Fold) + fold = placeholder; + else { + fold = new Fold(range, placeholder); + fold.collapseChildren = range.collapseChildren; + } + this.$clipRangeToDocument(fold.range); + var startRow = fold.start.row; + var startColumn = fold.start.column; + var endRow = fold.end.row; + var endColumn = fold.end.column; + var startFold = this.getFoldAt(startRow, startColumn, 1); + var endFold = this.getFoldAt(endRow, endColumn, -1); + if (startFold && endFold == startFold) + return startFold.addSubFold(fold); + if (startFold && !startFold.range.isStart(startRow, startColumn)) + this.removeFold(startFold); + if (endFold && !endFold.range.isEnd(endRow, endColumn)) + this.removeFold(endFold); + var folds = this.getFoldsInRange(fold.range); + if (folds.length > 0) { + this.removeFolds(folds); + if (!fold.collapseChildren) { + folds.forEach(function (subFold) { + fold.addSubFold(subFold); + }); + } + } + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (endRow == foldLine.start.row) { + foldLine.addFold(fold); + added = true; + break; + } + else if (startRow == foldLine.end.row) { + foldLine.addFold(fold); + added = true; + if (!fold.sameRow) { + var foldLineNext = foldData[i + 1]; + if (foldLineNext && foldLineNext.start.row == endRow) { + foldLine.merge(foldLineNext); + break; + } + } + break; + } + else if (endRow <= foldLine.start.row) { + break; + } + } + if (!added) + foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold)); + if (this.$useWrapMode) + this.$updateWrapData(foldLine.start.row, foldLine.start.row); else - delete this.$breakpoints[row]; - this._signal("changeBreakpoint", {}); + this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row); + this.$modified = true; + this._signal("changeFold", { data: fold, action: "add" }); + return fold; }; - this.clearBreakpoint = function(row) { - delete this.$breakpoints[row]; - this._signal("changeBreakpoint", {}); + this.addFolds = function (folds) { + folds.forEach(function (fold) { + this.addFold(fold); + }, this); }; - this.addMarker = function(range, clazz, type, inFront) { - var id = this.$markerId++; - - var marker = { - range : range, - type : type || "line", - renderer: typeof type == "function" ? type : null, - clazz : clazz, - inFront: !!inFront, - id: id - }; - - if (inFront) { - this.$frontMarkers[id] = marker; - this._signal("changeFrontMarker"); - } else { - this.$backMarkers[id] = marker; - this._signal("changeBackMarker"); + this.removeFold = function (fold) { + var foldLine = fold.foldLine; + var startRow = foldLine.start.row; + var endRow = foldLine.end.row; + var foldLines = this.$foldData; + var folds = foldLine.folds; + if (folds.length == 1) { + foldLines.splice(foldLines.indexOf(foldLine), 1); } - - return id; - }; - this.addDynamicMarker = function(marker, inFront) { - if (!marker.update) - return; - var id = this.$markerId++; - marker.id = id; - marker.inFront = !!inFront; - - if (inFront) { - this.$frontMarkers[id] = marker; - this._signal("changeFrontMarker"); - } else { - this.$backMarkers[id] = marker; - this._signal("changeBackMarker"); + else + if (foldLine.range.isEnd(fold.end.row, fold.end.column)) { + folds.pop(); + foldLine.end.row = folds[folds.length - 1].end.row; + foldLine.end.column = folds[folds.length - 1].end.column; } - - return marker; - }; - this.removeMarker = function(markerId) { - var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId]; - if (!marker) - return; - - var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers; - delete (markers[markerId]); - this._signal(marker.inFront ? "changeFrontMarker" : "changeBackMarker"); - }; - this.getMarkers = function(inFront) { - return inFront ? this.$frontMarkers : this.$backMarkers; - }; - - this.highlight = function(re) { - if (!this.$searchHighlight) { - var highlight = new SearchHighlight(null, "ace_selected-word", "text"); - this.$searchHighlight = this.addDynamicMarker(highlight); + else + if (foldLine.range.isStart(fold.start.row, fold.start.column)) { + folds.shift(); + foldLine.start.row = folds[0].start.row; + foldLine.start.column = folds[0].start.column; } - this.$searchHighlight.setRegexp(re); - }; - this.highlightLines = function(startRow, endRow, clazz, inFront) { - if (typeof endRow != "number") { - clazz = endRow; - endRow = startRow; + else + if (fold.sameRow) { + folds.splice(folds.indexOf(fold), 1); } - if (!clazz) - clazz = "ace_step"; - - var range = new Range(startRow, 0, endRow, Infinity); - range.id = this.addMarker(range, clazz, "fullLine", inFront); - return range; + else + { + var newFoldLine = foldLine.split(fold.start.row, fold.start.column); + folds = newFoldLine.folds; + folds.shift(); + newFoldLine.start.row = folds[0].start.row; + newFoldLine.start.column = folds[0].start.column; + } + if (!this.$updating) { + if (this.$useWrapMode) + this.$updateWrapData(startRow, endRow); + else + this.$updateRowLengthCache(startRow, endRow); + } + this.$modified = true; + this._signal("changeFold", { data: fold, action: "remove" }); }; - this.setAnnotations = function(annotations) { - this.$annotations = annotations; - this._signal("changeAnnotation", {}); + this.removeFolds = function (folds) { + var cloneFolds = []; + for (var i = 0; i < folds.length; i++) { + cloneFolds.push(folds[i]); + } + cloneFolds.forEach(function (fold) { + this.removeFold(fold); + }, this); + this.$modified = true; }; - this.getAnnotations = function() { - return this.$annotations || []; + this.expandFold = function (fold) { + this.removeFold(fold); + fold.subFolds.forEach(function (subFold) { + fold.restoreRange(subFold); + this.addFold(subFold); + }, this); + if (fold.collapseChildren > 0) { + this.foldAll(fold.start.row + 1, fold.end.row, fold.collapseChildren - 1); + } + fold.subFolds = []; }; - this.clearAnnotations = function() { - this.setAnnotations([]); + this.expandFolds = function (folds) { + folds.forEach(function (fold) { + this.expandFold(fold); + }, this); }; - this.$detectNewLine = function(text) { - var match = text.match(/^.*?(\r?\n)/m); - if (match) { - this.$autoNewLine = match[1]; - } else { - this.$autoNewLine = "\n"; + this.unfold = function (location, expandInner) { + var range, folds; + if (location == null) { + range = new Range(0, 0, this.getLength(), 0); + if (expandInner == null) + expandInner = true; } - }; - this.getWordRange = function(row, column) { - var line = this.getLine(row); - - var inToken = false; - if (column > 0) - inToken = !!line.charAt(column - 1).match(this.tokenRe); - - if (!inToken) - inToken = !!line.charAt(column).match(this.tokenRe); - - if (inToken) - var re = this.tokenRe; - else if (/^\s+$/.test(line.slice(column-1, column+1))) - var re = /\s/; - else - var re = this.nonTokenRe; - - var start = column; - if (start > 0) { - do { - start--; - } - while (start >= 0 && line.charAt(start).match(re)); - start++; - } - - var end = column; - while (end < line.length && line.charAt(end).match(re)) { - end++; - } - - return new Range(row, start, row, end); - }; - this.getAWordRange = function(row, column) { - var wordRange = this.getWordRange(row, column); - var line = this.getLine(wordRange.end.row); - - while (line.charAt(wordRange.end.column).match(/[ \t]/)) { - wordRange.end.column += 1; + else if (typeof location == "number") { + range = new Range(location, 0, location, this.getLine(location).length); } - return wordRange; - }; - this.setNewLineMode = function(newLineMode) { - this.doc.setNewLineMode(newLineMode); - }; - this.getNewLineMode = function() { - return this.doc.getNewLineMode(); - }; - this.setUseWorker = function(useWorker) { this.setOption("useWorker", useWorker); }; - this.getUseWorker = function() { return this.$useWorker; }; - this.onReloadTokenizer = function(e) { - var rows = e.data; - this.bgTokenizer.start(rows.first); - this._signal("tokenizerUpdate", e); - }; - - this.$modes = config.$modes; - this.$mode = null; - this.$modeId = null; - this.setMode = function(mode, cb) { - if (mode && typeof mode === "object") { - if (mode.getTokenizer) - return this.$onChangeMode(mode); - var options = mode; - var path = options.path; - } else { - path = mode || "ace/mode/text"; + else if ("row" in location) { + range = Range.fromPoints(location, location); } - if (!this.$modes["ace/mode/text"]) - this.$modes["ace/mode/text"] = new TextMode(); - - if (this.$modes[path] && !options) { - this.$onChangeMode(this.$modes[path]); - cb && cb(); - return; + else if (Array.isArray(location)) { + folds = []; + location.forEach(function (range) { + folds = folds.concat(this.unfold(range)); + }, this); + return folds; } - this.$modeId = path; - config.loadModule(["mode", path], function(m) { - if (this.$modeId !== path) - return cb && cb(); - if (this.$modes[path] && !options) { - this.$onChangeMode(this.$modes[path]); - } else if (m && m.Mode) { - m = new m.Mode(options); - if (!options) { - this.$modes[path] = m; - m.$id = path; - } - this.$onChangeMode(m); - } - cb && cb(); - }.bind(this)); - if (!this.$mode) - this.$onChangeMode(this.$modes["ace/mode/text"], true); - }; - - this.$onChangeMode = function(mode, $isPlaceholder) { - if (!$isPlaceholder) - this.$modeId = mode.$id; - if (this.$mode === mode) - return; - - var oldMode = this.$mode; - this.$mode = mode; - - this.$stopWorker(); - - if (this.$useWorker) - this.$startWorker(); - - var tokenizer = mode.getTokenizer(); - - if(tokenizer.on !== undefined) { - var onReloadTokenizer = this.onReloadTokenizer.bind(this); - tokenizer.on("update", onReloadTokenizer); + else { + range = location; } - - this.bgTokenizer.setTokenizer(tokenizer); - this.bgTokenizer.setDocument(this.getDocument()); - - this.tokenRe = mode.tokenRe; - this.nonTokenRe = mode.nonTokenRe; - - - if (!$isPlaceholder) { - if (mode.attachToSession) - mode.attachToSession(this); - this.$options.wrapMethod.set.call(this, this.$wrapMethod); - this.$setFolding(mode.foldingRules); - this.bgTokenizer.start(0); - this._emit("changeMode", {oldMode: oldMode, mode: mode}); + folds = this.getFoldsInRangeList(range); + var outermostFolds = folds; + while (folds.length == 1 + && Range.comparePoints(folds[0].start, range.start) < 0 + && Range.comparePoints(folds[0].end, range.end) > 0) { + this.expandFolds(folds); + folds = this.getFoldsInRangeList(range); } - }; - - this.$stopWorker = function() { - if (this.$worker) { - this.$worker.terminate(); - this.$worker = null; + if (expandInner != false) { + this.removeFolds(folds); } - }; - - this.$startWorker = function() { - try { - this.$worker = this.$mode.createWorker(this); - } catch (e) { - config.warn("Could not load worker", e); - this.$worker = null; + else { + this.expandFolds(folds); } + if (outermostFolds.length) + return outermostFolds; }; - this.getMode = function() { - return this.$mode; - }; - - this.$scrollTop = 0; - this.setScrollTop = function(scrollTop) { - if (this.$scrollTop === scrollTop || isNaN(scrollTop)) - return; - - this.$scrollTop = scrollTop; - this._signal("changeScrollTop", scrollTop); + this.isRowFolded = function (docRow, startFoldRow) { + return !!this.getFoldLine(docRow, startFoldRow); }; - this.getScrollTop = function() { - return this.$scrollTop; + this.getRowFoldEnd = function (docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.end.row : docRow; }; - - this.$scrollLeft = 0; - this.setScrollLeft = function(scrollLeft) { - if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft)) - return; - - this.$scrollLeft = scrollLeft; - this._signal("changeScrollLeft", scrollLeft); + this.getRowFoldStart = function (docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.start.row : docRow; }; - this.getScrollLeft = function() { - return this.$scrollLeft; + this.getFoldDisplayLine = function (foldLine, endRow, endColumn, startRow, startColumn) { + if (startRow == null) + startRow = foldLine.start.row; + if (startColumn == null) + startColumn = 0; + if (endRow == null) + endRow = foldLine.end.row; + if (endColumn == null) + endColumn = this.getLine(endRow).length; + var doc = this.doc; + var textLine = ""; + foldLine.walk(function (placeholder, row, column, lastColumn) { + if (row < startRow) + return; + if (row == startRow) { + if (column < startColumn) + return; + lastColumn = Math.max(startColumn, lastColumn); + } + if (placeholder != null) { + textLine += placeholder; + } + else { + textLine += doc.getLine(row).substring(lastColumn, column); + } + }, endRow, endColumn); + return textLine; }; - this.getScreenWidth = function() { - this.$computeWidth(); - if (this.lineWidgets) - return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth); - return this.screenWidth; + this.getDisplayLine = function (row, endColumn, startRow, startColumn) { + var foldLine = this.getFoldLine(row); + if (!foldLine) { + var line; + line = this.doc.getLine(row); + return line.substring(startColumn || 0, endColumn || line.length); + } + else { + return this.getFoldDisplayLine(foldLine, row, endColumn, startRow, startColumn); + } }; - - this.getLineWidgetMaxWidth = function() { - if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth; - var width = 0; - this.lineWidgets.forEach(function(w) { - if (w && w.screenWidth > width) - width = w.screenWidth; + this.$cloneFoldData = function () { + var fd = []; + fd = this.$foldData.map(function (foldLine) { + var folds = foldLine.folds.map(function (fold) { + return fold.clone(); + }); + return new FoldLine(fd, folds); }); - return this.lineWidgetWidth = width; + return fd; }; - - this.$computeWidth = function(force) { - if (this.$modified || force) { - this.$modified = false; - - if (this.$useWrapMode) - return this.screenWidth = this.$wrapLimit; - - var lines = this.doc.getAllLines(); - var cache = this.$rowLengthCache; - var longestScreenLine = 0; - var foldIndex = 0; - var foldLine = this.$foldData[foldIndex]; - var foldStart = foldLine ? foldLine.start.row : Infinity; - var len = lines.length; - - for (var i = 0; i < len; i++) { - if (i > foldStart) { - i = foldLine.end.row + 1; - if (i >= len) - break; - foldLine = this.$foldData[foldIndex++]; - foldStart = foldLine ? foldLine.start.row : Infinity; + this.toggleFold = function (tryToUnfold) { + var selection = this.selection; + var range = selection.getRange(); + var fold; + var bracketPos; + if (range.isEmpty()) { + var cursor = range.start; + fold = this.getFoldAt(cursor.row, cursor.column); + if (fold) { + this.expandFold(fold); + return; + } + else if (tryToUnfold) { + var foldLine = this.getFoldLine(cursor.row); + if (foldLine) + this.expandFolds(foldLine.folds); + return; + } + else if (bracketPos = this.findMatchingBracket(cursor)) { + if (range.comparePoint(bracketPos) == 1) { + range.end = bracketPos; + } + else { + range.start = bracketPos; + range.start.column++; + range.end.column--; } - - if (cache[i] == null) - cache[i] = this.$getStringScreenWidth(lines[i])[0]; - - if (cache[i] > longestScreenLine) - longestScreenLine = cache[i]; } - this.screenWidth = longestScreenLine; - } - }; - this.getLine = function(row) { - return this.doc.getLine(row); - }; - this.getLines = function(firstRow, lastRow) { - return this.doc.getLines(firstRow, lastRow); - }; - this.getLength = function() { - return this.doc.getLength(); - }; - this.getTextRange = function(range) { - return this.doc.getTextRange(range || this.selection.getRange()); - }; - this.insert = function(position, text) { - return this.doc.insert(position, text); - }; - this.remove = function(range) { - return this.doc.remove(range); - }; - this.removeFullLines = function(firstRow, lastRow){ - return this.doc.removeFullLines(firstRow, lastRow); - }; - this.undoChanges = function(deltas, dontSelect) { - if (!deltas.length) - return; - - this.$fromUndo = true; - for (var i = deltas.length - 1; i != -1; i--) { - var delta = deltas[i]; - if (delta.action == "insert" || delta.action == "remove") { - this.doc.revertDelta(delta); - } else if (delta.folds) { - this.addFolds(delta.folds); + else if (bracketPos = this.findMatchingBracket({ row: cursor.row, column: cursor.column + 1 })) { + if (range.comparePoint(bracketPos) == 1) + range.end = bracketPos; + else + range.start = bracketPos; + range.start.column++; + } + else { + range = this.getCommentFoldRange(cursor.row, cursor.column) || range; } } - if (!dontSelect && this.$undoSelect) { - if (deltas.selectionBefore) - this.selection.fromJSON(deltas.selectionBefore); - else - this.selection.setRange(this.$getUndoSelection(deltas, true)); + else { + var folds = this.getFoldsInRange(range); + if (tryToUnfold && folds.length) { + this.expandFolds(folds); + return; + } + else if (folds.length == 1) { + fold = folds[0]; + } } - this.$fromUndo = false; - }; - this.redoChanges = function(deltas, dontSelect) { - if (!deltas.length) + if (!fold) + fold = this.getFoldAt(range.start.row, range.start.column); + if (fold && fold.range.toString() == range.toString()) { + this.expandFold(fold); return; - - this.$fromUndo = true; - for (var i = 0; i < deltas.length; i++) { - var delta = deltas[i]; - if (delta.action == "insert" || delta.action == "remove") { - this.doc.$safeApplyDelta(delta); - } } - - if (!dontSelect && this.$undoSelect) { - if (deltas.selectionAfter) - this.selection.fromJSON(deltas.selectionAfter); - else - this.selection.setRange(this.$getUndoSelection(deltas, false)); + var placeholder = "..."; + if (!range.isMultiLine()) { + placeholder = this.getTextRange(range); + if (placeholder.length < 4) + return; + placeholder = placeholder.trim().substring(0, 2) + ".."; } - this.$fromUndo = false; - }; - this.setUndoSelect = function(enable) { - this.$undoSelect = enable; + this.addFold(placeholder, range); }; - - this.$getUndoSelection = function(deltas, isUndo) { - function isInsert(delta) { - return isUndo ? delta.action !== "insert" : delta.action === "insert"; - } - - var range, point; - - for (var i = 0; i < deltas.length; i++) { - var delta = deltas[i]; - if (!delta.start) continue; // skip folds - if (!range) { - if (isInsert(delta)) { - range = Range.fromPoints(delta.start, delta.end); - } else { - range = Range.fromPoints(delta.start, delta.start); - } - continue; + this.getCommentFoldRange = function (row, column, dir) { + var iterator = new TokenIterator(this, row, column); + var token = iterator.getCurrentToken(); + var type = token && token.type; + if (token && /^comment|string/.test(type)) { + type = type.match(/comment|string/)[0]; + if (type == "comment") + type += "|doc-start|\\.doc"; + var re = new RegExp(type); + var range = new Range(); + if (dir != 1) { + do { + token = iterator.stepBackward(); + } while (token && re.test(token.type)); + token = iterator.stepForward(); } - - if (isInsert(delta)) { - point = delta.start; - if (range.compare(point.row, point.column) == -1) { - range.setStart(point); - } - point = delta.end; - if (range.compare(point.row, point.column) == 1) { - range.setEnd(point); - } - } else { - point = delta.start; - if (range.compare(point.row, point.column) == -1) { - range = Range.fromPoints(delta.start, delta.start); - } + range.start.row = iterator.getCurrentTokenRow(); + range.start.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator = new TokenIterator(this, row, column); + var initState = this.getState(iterator.$row); + if (dir != -1) { + var lastRow = -1; + do { + token = iterator.stepForward(); + if (lastRow == -1) { + var state = this.getState(iterator.$row); + if (initState.toString() !== state.toString()) + lastRow = iterator.$row; + } + else if (iterator.$row > lastRow) { + break; + } + } while (token && re.test(token.type)); + token = iterator.stepBackward(); } + else + token = iterator.getCurrentToken(); + range.end.row = iterator.getCurrentTokenRow(); + range.end.column = iterator.getCurrentTokenColumn(); + if (range.start.row == range.end.row && range.start.column > range.end.column) + return; + return range; } - return range; }; - this.replace = function(range, text) { - return this.doc.replace(range, text); - }; - this.moveText = function(fromRange, toPosition, copy) { - var text = this.getTextRange(fromRange); - var folds = this.getFoldsInRange(fromRange); - - var toRange = Range.fromPoints(toPosition, toPosition); - if (!copy) { - this.remove(fromRange); - var rowDiff = fromRange.start.row - fromRange.end.row; - var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column; - if (collDiff) { - if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column) - toRange.start.column += collDiff; - if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column) - toRange.end.column += collDiff; - } - if (rowDiff && toRange.start.row >= fromRange.end.row) { - toRange.start.row += rowDiff; - toRange.end.row += rowDiff; + this.foldAll = function (startRow, endRow, depth, test) { + if (depth == undefined) + depth = 100000; // JSON.stringify doesn't hanle Infinity + var foldWidgets = this.foldWidgets; + if (!foldWidgets) + return; // mode doesn't support folding + endRow = endRow || this.getLength(); + startRow = startRow || 0; + for (var row = startRow; row < endRow; row++) { + if (foldWidgets[row] == null) + foldWidgets[row] = this.getFoldWidget(row); + if (foldWidgets[row] != "start") + continue; + if (test && !test(row)) + continue; + var range = this.getFoldWidgetRange(row); + if (range && range.isMultiLine() + && range.end.row <= endRow + && range.start.row >= startRow) { + row = range.end.row; + range.collapseChildren = depth; + this.addFold("...", range); } } - - toRange.end = this.insert(toRange.start, text); - if (folds.length) { - var oldStart = fromRange.start; - var newStart = toRange.start; - var rowDiff = newStart.row - oldStart.row; - var collDiff = newStart.column - oldStart.column; - this.addFolds(folds.map(function(x) { - x = x.clone(); - if (x.start.row == oldStart.row) - x.start.column += collDiff; - if (x.end.row == oldStart.row) - x.end.column += collDiff; - x.start.row += rowDiff; - x.end.row += rowDiff; - return x; - })); - } - - return toRange; }; - this.indentRows = function(startRow, endRow, indentString) { - indentString = indentString.replace(/\t/g, this.getTabString()); - for (var row=startRow; row<=endRow; row++) - this.doc.insertInLine({row: row, column: 0}, indentString); + this.foldToLevel = function (level) { + this.foldAll(); + while (level-- > 0) + this.unfold(null, false); }; - this.outdentRows = function (range) { - var rowRange = range.collapseRows(); - var deleteRange = new Range(0, 0, 0, 0); - var size = this.getTabSize(); - - for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) { - var line = this.getLine(i); - - deleteRange.start.row = i; - deleteRange.end.row = i; - for (var j = 0; j < size; ++j) - if (line.charAt(j) != ' ') - break; - if (j < size && line.charAt(j) == '\t') { - deleteRange.start.column = j; - deleteRange.end.column = j + 1; - } else { - deleteRange.start.column = 0; - deleteRange.end.column = j; + this.foldAllComments = function () { + var session = this; + this.foldAll(null, null, null, function (row) { + var tokens = session.getTokens(row); + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token.type == "text" && /^\s+$/.test(token.value)) + continue; + if (/comment/.test(token.type)) + return true; + return false; } - this.remove(deleteRange); - } - }; - - this.$moveLines = function(firstRow, lastRow, dir) { - firstRow = this.getRowFoldStart(firstRow); - lastRow = this.getRowFoldEnd(lastRow); - if (dir < 0) { - var row = this.getRowFoldStart(firstRow + dir); - if (row < 0) return 0; - var diff = row-firstRow; - } else if (dir > 0) { - var row = this.getRowFoldEnd(lastRow + dir); - if (row > this.doc.getLength()-1) return 0; - var diff = row-lastRow; - } else { - firstRow = this.$clipRowToDocument(firstRow); - lastRow = this.$clipRowToDocument(lastRow); - var diff = lastRow - firstRow + 1; - } - - var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE); - var folds = this.getFoldsInRange(range).map(function(x){ - x = x.clone(); - x.start.row += diff; - x.end.row += diff; - return x; }); - - var lines = dir == 0 - ? this.doc.getLines(firstRow, lastRow) - : this.doc.removeFullLines(firstRow, lastRow); - this.doc.insertFullLines(firstRow+diff, lines); - folds.length && this.addFolds(folds); - return diff; - }; - this.moveLinesUp = function(firstRow, lastRow) { - return this.$moveLines(firstRow, lastRow, -1); - }; - this.moveLinesDown = function(firstRow, lastRow) { - return this.$moveLines(firstRow, lastRow, 1); }; - this.duplicateLines = function(firstRow, lastRow) { - return this.$moveLines(firstRow, lastRow, 0); - }; - - - this.$clipRowToDocument = function(row) { - return Math.max(0, Math.min(row, this.doc.getLength()-1)); + this.$foldStyles = { + "manual": 1, + "markbegin": 1, + "markbeginend": 1 }; - - this.$clipColumnToRow = function(row, column) { - if (column < 0) - return 0; - return Math.min(this.doc.getLine(row).length, column); + this.$foldStyle = "markbegin"; + this.setFoldStyle = function (style) { + if (!this.$foldStyles[style]) + throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]"); + if (this.$foldStyle == style) + return; + this.$foldStyle = style; + if (style == "manual") + this.unfold(); + var mode = this.$foldMode; + this.$setFolding(null); + this.$setFolding(mode); }; - - - this.$clipPositionToDocument = function(row, column) { - column = Math.max(0, column); - - if (row < 0) { - row = 0; - column = 0; - } else { - var len = this.doc.getLength(); - if (row >= len) { - row = len - 1; - column = this.doc.getLine(len-1).length; - } else { - column = Math.min(this.doc.getLine(row).length, column); + this.$setFolding = function (foldMode) { + if (this.$foldMode == foldMode) + return; + this.$foldMode = foldMode; + this.off('change', this.$updateFoldWidgets); + this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + this._signal("changeAnnotation"); + if (!foldMode || this.$foldStyle == "manual") { + this.foldWidgets = null; + return; + } + this.foldWidgets = []; + this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle); + this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); + this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); + this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this); + this.on('change', this.$updateFoldWidgets); + this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + }; + this.getParentFoldRangeData = function (row, ignoreCurrent) { + var fw = this.foldWidgets; + if (!fw || (ignoreCurrent && fw[row])) + return {}; + var i = row - 1, firstRange; + while (i >= 0) { + var c = fw[i]; + if (c == null) + c = fw[i] = this.getFoldWidget(i); + if (c == "start") { + var range = this.getFoldWidgetRange(i); + if (!firstRange) + firstRange = range; + if (range && range.end.row >= row) + break; } + i--; } - return { - row: row, - column: column + range: i !== -1 && range, + firstRange: firstRange }; }; - - this.$clipRangeToDocument = function(range) { - if (range.start.row < 0) { - range.start.row = 0; - range.start.column = 0; - } else { - range.start.column = this.$clipColumnToRow( - range.start.row, - range.start.column - ); + this.onFoldWidgetClick = function (row, e) { + if (e instanceof MouseEvent) + e = e.domEvent; + var options = { + children: e.shiftKey, + all: e.ctrlKey || e.metaKey, + siblings: e.altKey + }; + var range = this.$toggleFoldWidget(row, options); + if (!range) { + var el = (e.target || e.srcElement); + if (el && /ace_fold-widget/.test(el.className)) + el.className += " ace_invalid"; } - - var len = this.doc.getLength() - 1; - if (range.end.row > len) { - range.end.row = len; - range.end.column = this.doc.getLine(len).length; - } else { - range.end.column = this.$clipColumnToRow( - range.end.row, - range.end.column - ); + }; + this.$toggleFoldWidget = function (row, options) { + if (!this.getFoldWidget) + return; + var type = this.getFoldWidget(row); + var line = this.getLine(row); + var dir = type === "end" ? -1 : 1; + var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir); + if (fold) { + if (options.children || options.all) + this.removeFold(fold); + else + this.expandFold(fold); + return fold; + } + var range = this.getFoldWidgetRange(row, true); + if (range && !range.isMultiLine()) { + fold = this.getFoldAt(range.start.row, range.start.column, 1); + if (fold && range.isEqual(fold.range)) { + this.removeFold(fold); + return fold; + } + } + if (options.siblings) { + var data = this.getParentFoldRangeData(row); + if (data.range) { + var startRow = data.range.start.row + 1; + var endRow = data.range.end.row; + } + this.foldAll(startRow, endRow, options.all ? 10000 : 0); + } + else if (options.children) { + endRow = range ? range.end.row : this.getLength(); + this.foldAll(row + 1, endRow, options.all ? 10000 : 0); + } + else if (range) { + if (options.all) + range.collapseChildren = 10000; + this.addFold("...", range); } return range; }; - this.$wrapLimit = 80; - this.$useWrapMode = false; - this.$wrapLimitRange = { - min : null, - max : null - }; - this.setUseWrapMode = function(useWrapMode) { - if (useWrapMode != this.$useWrapMode) { - this.$useWrapMode = useWrapMode; - this.$modified = true; - this.$resetRowCache(0); - if (useWrapMode) { - var len = this.getLength(); - this.$wrapData = Array(len); - this.$updateWrapData(0, len - 1); + this.toggleFoldWidget = function (toggleParent) { + var row = this.selection.getCursor().row; + row = this.getRowFoldStart(row); + var range = this.$toggleFoldWidget(row, {}); + if (range) + return; + var data = this.getParentFoldRangeData(row, true); + range = data.range || data.firstRange; + if (range) { + row = range.start.row; + var fold = this.getFoldAt(row, this.getLine(row).length, 1); + if (fold) { + this.removeFold(fold); + } + else { + this.addFold("...", range); } - - this._signal("changeWrapMode"); } }; - this.getUseWrapMode = function() { - return this.$useWrapMode; - }; - this.setWrapLimitRange = function(min, max) { - if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) { - this.$wrapLimitRange = { min: min, max: max }; - this.$modified = true; - this.$bidiHandler.markAsDirty(); - if (this.$useWrapMode) - this._signal("changeWrapMode"); + this.updateFoldWidgets = function (delta) { + var firstRow = delta.start.row; + var len = delta.end.row - firstRow; + if (len === 0) { + this.foldWidgets[firstRow] = null; + } + else if (delta.action == 'remove') { + this.foldWidgets.splice(firstRow, len + 1, null); + } + else { + var args = Array(len + 1); + args.unshift(firstRow, 1); + this.foldWidgets.splice.apply(this.foldWidgets, args); } }; - this.adjustWrapLimit = function(desiredLimit, $printMargin) { - var limits = this.$wrapLimitRange; - if (limits.max < 0) - limits = {min: $printMargin, max: $printMargin}; - var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max); - if (wrapLimit != this.$wrapLimit && wrapLimit > 1) { - this.$wrapLimit = wrapLimit; - this.$modified = true; - if (this.$useWrapMode) { - this.$updateWrapData(0, this.getLength() - 1); - this.$resetRowCache(0); - this._signal("changeWrapLimit"); - } - return true; + this.tokenizerUpdateFoldWidgets = function (e) { + var rows = e.data; + if (rows.first != rows.last) { + if (this.foldWidgets.length > rows.first) + this.foldWidgets.splice(rows.first, this.foldWidgets.length); } - return false; }; +} +exports.Folding = Folding; - this.$constrainWrapLimit = function(wrapLimit, min, max) { - if (min) - wrapLimit = Math.max(min, wrapLimit); - - if (max) - wrapLimit = Math.min(max, wrapLimit); +}); - return wrapLimit; +define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"], function(require, exports, module){"use strict"; +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; +function BracketMatch() { + this.findMatchingBracket = function (position, chr) { + if (position.column == 0) + return null; + var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column - 1); + if (charBeforeCursor == "") + return null; + var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); + if (!match) + return null; + if (match[1]) + return this.$findClosingBracket(match[1], position); + else + return this.$findOpeningBracket(match[2], position); }; - this.getWrapLimit = function() { - return this.$wrapLimit; + this.getBracketRange = function (pos) { + var line = this.getLine(pos.row); + var before = true, range; + var chr = line.charAt(pos.column - 1); + var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + if (!match) { + chr = line.charAt(pos.column); + pos = { row: pos.row, column: pos.column + 1 }; + match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + before = false; + } + if (!match) + return null; + if (match[1]) { + var bracketPos = this.$findClosingBracket(match[1], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(pos, bracketPos); + if (!before) { + range.end.column++; + range.start.column--; + } + range.cursor = range.end; + } + else { + var bracketPos = this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(bracketPos, pos); + if (!before) { + range.start.column++; + range.end.column--; + } + range.cursor = range.start; + } + return range; }; - this.setWrapLimit = function (limit) { - this.setWrapLimitRange(limit, limit); + this.getMatchingBracketRanges = function (pos, isBackwards) { + var line = this.getLine(pos.row); + var bracketsRegExp = /([\(\[\{])|([\)\]\}])/; + var chr = !isBackwards && line.charAt(pos.column - 1); + var match = chr && chr.match(bracketsRegExp); + if (!match) { + chr = (isBackwards === undefined || isBackwards) && line.charAt(pos.column); + pos = { + row: pos.row, + column: pos.column + 1 + }; + match = chr && chr.match(bracketsRegExp); + } + if (!match) + return null; + var startRange = new Range(pos.row, pos.column - 1, pos.row, pos.column); + var bracketPos = match[1] ? this.$findClosingBracket(match[1], pos) + : this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return [startRange]; + var endRange = new Range(bracketPos.row, bracketPos.column, bracketPos.row, bracketPos.column + 1); + return [startRange, endRange]; }; - this.getWrapLimitRange = function() { - return { - min : this.$wrapLimitRange.min, - max : this.$wrapLimitRange.max - }; + this.$brackets = { + ")": "(", + "(": ")", + "]": "[", + "[": "]", + "{": "}", + "}": "{", + "<": ">", + ">": "<" }; - - this.$updateInternalDataOnChange = function(delta) { - var useWrapMode = this.$useWrapMode; - var action = delta.action; - var start = delta.start; - var end = delta.end; - var firstRow = start.row; - var lastRow = end.row; - var len = lastRow - firstRow; - var removedFolds = null; - - this.$updating = true; - if (len != 0) { - if (action === "remove") { - this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len); - - var foldLines = this.$foldData; - removedFolds = this.getFoldsInRange(delta); - this.removeFolds(removedFolds); - - var foldLine = this.getFoldLine(end.row); - var idx = 0; - if (foldLine) { - foldLine.addRemoveChars(end.row, end.column, start.column - end.column); - foldLine.shiftRow(-len); - - var foldLineBefore = this.getFoldLine(firstRow); - if (foldLineBefore && foldLineBefore !== foldLine) { - foldLineBefore.merge(foldLine); - foldLine = foldLineBefore; + this.$findOpeningBracket = function (bracket, position, typeRe) { + var openBracket = this.$brackets[bracket]; + var depth = 1; + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + if (!typeRe) { + typeRe = new RegExp("(\\.?" + + token.type.replace(".", "\\.").replace("rparen", ".paren") + .replace(/\b(?:end)\b/, "(?:start|begin|end)") + .replace(/-close\b/, "-(close|open)") + + ")+"); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2; + var value = token.value; + while (true) { + while (valueIndex >= 0) { + var chr = value.charAt(valueIndex); + if (chr == openBracket) { + depth -= 1; + if (depth == 0) { + return { row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn() }; } - idx = foldLines.indexOf(foldLine) + 1; } - - for (idx; idx < foldLines.length; idx++) { - var foldLine = foldLines[idx]; - if (foldLine.start.row >= end.row) { - foldLine.shiftRow(-len); - } + else if (chr == bracket) { + depth += 1; } - - lastRow = firstRow; - } else { - var args = Array(len); - args.unshift(firstRow, 0); - var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache; - arr.splice.apply(arr, args); - var foldLines = this.$foldData; - var foldLine = this.getFoldLine(firstRow); - var idx = 0; - if (foldLine) { - var cmp = foldLine.range.compareInside(start.row, start.column); - if (cmp == 0) { - foldLine = foldLine.split(start.row, start.column); - if (foldLine) { - foldLine.shiftRow(len); - foldLine.addRemoveChars(lastRow, 0, end.column - start.column); - } - } else - if (cmp == -1) { - foldLine.addRemoveChars(firstRow, 0, end.column - start.column); - foldLine.shiftRow(len); + valueIndex -= 1; + } + do { + token = iterator.stepBackward(); + } while (token && !typeRe.test(token.type)); + if (token == null) + break; + value = token.value; + valueIndex = value.length - 1; + } + return null; + }; + this.$findClosingBracket = function (bracket, position, typeRe) { + var closingBracket = this.$brackets[bracket]; + var depth = 1; + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + if (!typeRe) { + typeRe = new RegExp("(\\.?" + + token.type.replace(".", "\\.").replace("lparen", ".paren") + .replace(/\b(?:start|begin)\b/, "(?:start|begin|end)") + .replace(/-open\b/, "-(close|open)") + + ")+"); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn(); + while (true) { + var value = token.value; + var valueLength = value.length; + while (valueIndex < valueLength) { + var chr = value.charAt(valueIndex); + if (chr == closingBracket) { + depth -= 1; + if (depth == 0) { + return { row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn() }; } - idx = foldLines.indexOf(foldLine) + 1; } - - for (idx; idx < foldLines.length; idx++) { - var foldLine = foldLines[idx]; - if (foldLine.start.row >= firstRow) { - foldLine.shiftRow(len); - } + else if (chr == bracket) { + depth += 1; } + valueIndex += 1; } - } else { - len = Math.abs(delta.start.column - delta.end.column); - if (action === "remove") { - removedFolds = this.getFoldsInRange(delta); - this.removeFolds(removedFolds); - - len = -len; - } - var foldLine = this.getFoldLine(firstRow); - if (foldLine) { - foldLine.addRemoveChars(firstRow, start.column, len); - } + do { + token = iterator.stepForward(); + } while (token && !typeRe.test(token.type)); + if (token == null) + break; + valueIndex = 0; } - - if (useWrapMode && this.$wrapData.length != this.doc.getLength()) { - console.error("doc.getLength() and $wrapData.length have to be the same!"); + return null; + }; + this.getMatchingTags = function (pos) { + var iterator = new TokenIterator(this, pos.row, pos.column); + var token = this.$findTagName(iterator); + if (!token) + return; + var prevToken = iterator.stepBackward(); + if (prevToken.value === '<') { + return this.$findClosingTag(iterator, token); + } + else { + return this.$findOpeningTag(iterator, token); } - this.$updating = false; - - if (useWrapMode) - this.$updateWrapData(firstRow, lastRow); - else - this.$updateRowLengthCache(firstRow, lastRow); - - return removedFolds; }; - - this.$updateRowLengthCache = function(firstRow, lastRow, b) { - this.$rowLengthCache[firstRow] = null; - this.$rowLengthCache[lastRow] = null; + this.$findTagName = function (iterator) { + var token = iterator.getCurrentToken(); + var found = false; + var backward = false; + if (token && token.type.indexOf('tag-name') === -1) { + do { + if (backward) + token = iterator.stepBackward(); + else + token = iterator.stepForward(); + if (token) { + if (token.value === "/>") { + backward = true; + } + else if (token.type.indexOf('tag-name') !== -1) { + found = true; + } + } + } while (token && !found); + } + return token; }; - - this.$updateWrapData = function(firstRow, lastRow) { - var lines = this.doc.getAllLines(); - var tabSize = this.getTabSize(); - var wrapData = this.$wrapData; - var wrapLimit = this.$wrapLimit; - var tokens; - var foldLine; - - var row = firstRow; - lastRow = Math.min(lastRow, lines.length - 1); - while (row <= lastRow) { - foldLine = this.getFoldLine(row, foldLine); - if (!foldLine) { - tokens = this.$getDisplayTokens(lines[row]); - wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); - row ++; - } else { - tokens = []; - foldLine.walk(function(placeholder, row, column, lastColumn) { - var walkTokens; - if (placeholder != null) { - walkTokens = this.$getDisplayTokens( - placeholder, tokens.length); - walkTokens[0] = PLACEHOLDER_START; - for (var i = 1; i < walkTokens.length; i++) { - walkTokens[i] = PLACEHOLDER_BODY; + this.$findClosingTag = function (iterator, token) { + var prevToken; + var currentTag = token.value; + var tag = token.value; + var depth = 0; + var openTagStart = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); + token = iterator.stepForward(); + var openTagName = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + token.value.length); + var foundOpenTagEnd = false; + do { + prevToken = token; + if (prevToken.type.indexOf('tag-close') !== -1 && !foundOpenTagEnd) { + var openTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for `>` + foundOpenTagEnd = true; + } + token = iterator.stepForward(); + if (token) { + if (token.value === '>' && !foundOpenTagEnd) { + var openTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for `>` + foundOpenTagEnd = true; + } + if (token.type.indexOf('tag-name') !== -1) { + currentTag = token.value; + if (tag === currentTag) { + if (prevToken.value === '<') { + depth++; + } + else if (prevToken.value === '') { + var closeTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for > + } + else { + return; + } } - } else { - walkTokens = this.$getDisplayTokens( - lines[row].substring(lastColumn, column), - tokens.length); } - tokens = tokens.concat(walkTokens); - }.bind(this), - foldLine.end.row, - lines[foldLine.end.row].length + 1 - ); - - wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); - row = foldLine.end.row + 1; + } + } + else if (tag === currentTag && token.value === '/>') { // self-closing tag + depth--; + if (depth < 0) { //found self-closing tag end + var closeTagStart = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 2); + var closeTagName = closeTagStart; + var closeTagEnd = closeTagName; + var openTagEnd = new Range(openTagName.end.row, openTagName.end.column, openTagName.end.row, openTagName.end.column + 1); + } + } } + } while (token && depth >= 0); + if (openTagStart && openTagEnd && closeTagStart && closeTagEnd && openTagName && closeTagName) { + return { + openTag: new Range(openTagStart.start.row, openTagStart.start.column, openTagEnd.end.row, openTagEnd.end.column), + closeTag: new Range(closeTagStart.start.row, closeTagStart.start.column, closeTagEnd.end.row, closeTagEnd.end.column), + openTagName: openTagName, + closeTagName: closeTagName + }; } }; - var CHAR = 1, - CHAR_EXT = 2, - PLACEHOLDER_START = 3, - PLACEHOLDER_BODY = 4, - PUNCTUATION = 9, - SPACE = 10, - TAB = 11, - TAB_SPACE = 12; - - - this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) { - if (tokens.length == 0) { - return []; + this.$findOpeningTag = function (iterator, token) { + var prevToken = iterator.getCurrentToken(); + var tag = token.value; + var depth = 0; + var startRow = iterator.getCurrentTokenRow(); + var startColumn = iterator.getCurrentTokenColumn(); + var endColumn = startColumn + 2; + var closeTagStart = new Range(startRow, startColumn, startRow, endColumn); //Range for ") + return; + var closeTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for > + iterator.stepBackward(); + iterator.stepBackward(); + do { + token = prevToken; + startRow = iterator.getCurrentTokenRow(); + startColumn = iterator.getCurrentTokenColumn(); + endColumn = startColumn + token.value.length; + prevToken = iterator.stepBackward(); + if (token) { + if (token.type.indexOf('tag-name') !== -1) { + if (tag === token.value) { + if (prevToken.value === '<') { + depth++; + if (depth > 0) { //found opening tag + var openTagName = new Range(startRow, startColumn, startRow, endColumn); + var openTagStart = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for < + do { + token = iterator.stepForward(); + } while (token && token.value !== '>'); + var openTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for > + } + } + else if (prevToken.value === '') { // self-closing tag + var stepCount = 0; + var tmpToken = prevToken; + while (tmpToken) { + if (tmpToken.type.indexOf('tag-name') !== -1 && tmpToken.value === tag) { + depth--; + break; + } + else if (tmpToken.value === '<') { + break; + } + tmpToken = iterator.stepBackward(); + stepCount++; + } + for (var i = 0; i < stepCount; i++) { + iterator.stepForward(); + } + } + } + } while (prevToken && depth <= 0); + if (openTagStart && openTagEnd && closeTagStart && closeTagEnd && openTagName && closeTagName) { + return { + openTag: new Range(openTagStart.start.row, openTagStart.start.column, openTagEnd.end.row, openTagEnd.end.column), + closeTag: new Range(closeTagStart.start.row, closeTagStart.start.column, closeTagEnd.end.row, closeTagEnd.end.column), + openTagName: openTagName, + closeTagName: closeTagName + }; + } + }; +} +exports.BracketMatch = BracketMatch; - var splits = []; - var displayLength = tokens.length; - var lastSplit = 0, lastDocSplit = 0; - - var isCode = this.$wrapAsCode; - - var indentedSoftWrap = this.$indentedSoftWrap; - var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8) - || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2); +}); - function getWrapIndent() { - var indentation = 0; - if (maxIndent === 0) - return indentation; - if (indentedSoftWrap) { - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - if (token == SPACE) - indentation += 1; - else if (token == TAB) - indentation += tabSize; - else if (token == TAB_SPACE) - continue; - else - break; - } +define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/bidihandler","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/line_widgets","ace/document","ace/background_tokenizer","ace/search_highlight","ace/undomanager","ace/edit_session/folding","ace/edit_session/bracket_match"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var BidiHandler = require("./bidihandler").BidiHandler; +var config = require("./config"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Selection = require("./selection").Selection; +var TextMode = require("./mode/text").Mode; +var Range = require("./range").Range; +var LineWidgets = require("./line_widgets").LineWidgets; +var Document = require("./document").Document; +var BackgroundTokenizer = require("./background_tokenizer").BackgroundTokenizer; +var SearchHighlight = require("./search_highlight").SearchHighlight; +var UndoManager = require("./undomanager").UndoManager; +var EditSession = /** @class */ (function () { + function EditSession(text, mode) { this.doc; + this.$breakpoints = []; + this.$decorations = []; + this.$frontMarkers = {}; + this.$backMarkers = {}; + this.$markerId = 1; + this.$undoSelect = true; + this.$editor = null; + this.prevOp = {}; + this.$foldData = []; + this.id = "session" + (++EditSession.$uid); + this.$foldData.toString = function () { + return this.join("\n"); + }; + this.$gutterCustomWidgets = {}; + this.bgTokenizer = new BackgroundTokenizer((new TextMode()).getTokenizer(), this); + var _self = this; + this.bgTokenizer.on("update", function (e) { + _self._signal("tokenizerUpdate", e); + }); + this.on("changeFold", this.onChangeFold.bind(this)); + this.$onChange = this.onChange.bind(this); + if (typeof text != "object" || !text.getLine) + text = new Document(/**@type{string}*/ (text)); + this.setDocument(text); + this.selection = new Selection(this); + this.$onSelectionChange = this.onSelectionChange.bind(this); + this.selection.on("changeSelection", this.$onSelectionChange); + this.selection.on("changeCursor", this.$onSelectionChange); + this.$bidiHandler = new BidiHandler(this); + config.resetOptions(this); + this.setMode(mode); + config._signal("session", this); + this.destroyed = false; + this.$initOperationListeners(); + } + EditSession.prototype.$initOperationListeners = function () { + var _this = this; + this.curOp = null; + this.on("change", function () { + if (!_this.curOp) { + _this.startOperation(); + _this.curOp.selectionBefore = _this.$lastSel; } - if (isCode && indentedSoftWrap !== false) - indentation += tabSize; - return Math.min(indentation, maxIndent); - } - function addSplit(screenPos) { - var len = screenPos - lastSplit; - for (var i = lastSplit; i < screenPos; i++) { - var ch = tokens[i]; - if (ch === 12 || ch === 2) len -= 1; + _this.curOp.docChanged = true; + }, true); + this.on("changeSelection", function () { + if (!_this.curOp) { + _this.startOperation(); + _this.curOp.selectionBefore = _this.$lastSel; } - - if (!splits.length) { - indent = getWrapIndent(); - splits.indent = indent; + _this.curOp.selectionChanged = true; + }, true); + this.$operationResetTimer = lang.delayedCall(this.endOperation.bind(this, true)); + }; + EditSession.prototype.startOperation = function (commandEvent) { + if (this.curOp) { + if (!commandEvent || this.curOp.command) { + return; } - lastDocSplit += len; - splits.push(lastDocSplit); - lastSplit = screenPos; + this.prevOp = this.curOp; } - var indent = 0; - while (displayLength - lastSplit > wrapLimit - indent) { - var split = lastSplit + wrapLimit - indent; - if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) { - addSplit(split); - continue; - } - if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) { - for (split; split != lastSplit - 1; split--) { - if (tokens[split] == PLACEHOLDER_START) { - break; - } - } - if (split > lastSplit) { - addSplit(split); - continue; - } - split = lastSplit + wrapLimit; - for (split; split < tokens.length; split++) { - if (tokens[split] != PLACEHOLDER_BODY) { - break; - } - } - if (split == tokens.length) { - break; // Breaks the while-loop. - } - addSplit(split); - continue; - } - var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1); - while (split > minSplit && tokens[split] < PLACEHOLDER_START) { - split --; - } - if (isCode) { - while (split > minSplit && tokens[split] < PLACEHOLDER_START) { - split --; - } - while (split > minSplit && tokens[split] == PUNCTUATION) { - split --; - } - } else { - while (split > minSplit && tokens[split] < SPACE) { - split --; - } - } - if (split > minSplit) { - addSplit(++split); - continue; - } - split = lastSplit + wrapLimit; - if (tokens[split] == CHAR_EXT) - split--; - addSplit(split - indent); + if (!commandEvent) { + commandEvent = {}; } - return splits; + this.$operationResetTimer.schedule(); + this.curOp = { + command: commandEvent.command || {}, + args: commandEvent.args + }; + this.curOp.selectionBefore = this.selection.toJSON(); + this._signal("startOperation", commandEvent); }; - this.$getDisplayTokens = function(str, offset) { - var arr = []; - var tabSize; - offset = offset || 0; - - for (var i = 0; i < str.length; i++) { - var c = str.charCodeAt(i); - if (c == 9) { - tabSize = this.getScreenTabSize(arr.length + offset); - arr.push(TAB); - for (var n = 1; n < tabSize; n++) { - arr.push(TAB_SPACE); - } - } - else if (c == 32) { - arr.push(SPACE); - } else if((c > 39 && c < 48) || (c > 57 && c < 64)) { - arr.push(PUNCTUATION); + EditSession.prototype.endOperation = function (e) { + if (this.curOp) { + if (e && e.returnValue === false) { + this.curOp = null; + this._signal("endOperation", e); + return; } - else if (c >= 0x1100 && isFullWidth(c)) { - arr.push(CHAR, CHAR_EXT); - } else { - arr.push(CHAR); + if (e == true && this.curOp.command && this.curOp.command.name == "mouse") { + return; } + var currentSelection = this.selection.toJSON(); + this.curOp.selectionAfter = currentSelection; + this.$lastSel = this.selection.toJSON(); + this.getUndoManager().addSelection(currentSelection); + this._signal("beforeEndOperation"); + this.prevOp = this.curOp; + this.curOp = null; + this._signal("endOperation", e); } - return arr; }; - this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { - if (maxScreenColumn == 0) - return [0, 0]; - if (maxScreenColumn == null) - maxScreenColumn = Infinity; - screenColumn = screenColumn || 0; - - var c, column; - for (column = 0; column < str.length; column++) { - c = str.charCodeAt(column); - if (c == 9) { - screenColumn += this.getScreenTabSize(screenColumn); - } - else if (c >= 0x1100 && isFullWidth(c)) { - screenColumn += 2; - } else { - screenColumn += 1; - } - if (screenColumn > maxScreenColumn) { - break; - } - } - - return [screenColumn, column]; + EditSession.prototype.setDocument = function (doc) { + if (this.doc) + this.doc.off("change", this.$onChange); + this.doc = doc; + doc.on("change", this.$onChange, true); + this.bgTokenizer.setDocument(this.getDocument()); + this.resetCaches(); }; - - this.lineWidgets = null; - this.getRowLength = function(row) { - var h = 1; - if (this.lineWidgets) - h += this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; - - if (!this.$useWrapMode || !this.$wrapData[row]) - return h; - else - return this.$wrapData[row].length + h; + EditSession.prototype.getDocument = function () { + return this.doc; }; - this.getRowLineCount = function(row) { - if (!this.$useWrapMode || !this.$wrapData[row]) { - return 1; - } else { - return this.$wrapData[row].length + 1; + Object.defineProperty(EditSession.prototype, "widgetManager", { + get: function () { + var widgetManager = new LineWidgets(this); + this.widgetManager = widgetManager; + if (this.$editor) + widgetManager.attach(this.$editor); + return widgetManager; + }, + set: function (value) { + Object.defineProperty(this, "widgetManager", { + writable: true, + enumerable: true, + configurable: true, + value: value, + }); + }, + enumerable: false, + configurable: true + }); + EditSession.prototype.$resetRowCache = function (docRow) { + if (!docRow) { + this.$docRowCache = []; + this.$screenRowCache = []; + return; } - }; - - this.getRowWrapIndent = function(screenRow) { - if (this.$useWrapMode) { - var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); - var splits = this.$wrapData[pos.row]; - return splits.length && splits[0] < pos.column ? splits.indent : 0; - } else { - return 0; + var l = this.$docRowCache.length; + var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1; + if (l > i) { + this.$docRowCache.splice(i, l); + this.$screenRowCache.splice(i, l); } }; - this.getScreenLastRowColumn = function(screenRow) { - var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); - return this.documentToScreenColumn(pos.row, pos.column); + EditSession.prototype.$getRowCacheIndex = function (cacheArray, val) { + var low = 0; + var hi = cacheArray.length - 1; + while (low <= hi) { + var mid = (low + hi) >> 1; + var c = cacheArray[mid]; + if (val > c) + low = mid + 1; + else if (val < c) + hi = mid - 1; + else + return mid; + } + return low - 1; }; - this.getDocumentLastRowColumn = function(docRow, docColumn) { - var screenRow = this.documentToScreenRow(docRow, docColumn); - return this.getScreenLastRowColumn(screenRow); + EditSession.prototype.resetCaches = function () { + this.$modified = true; + this.$wrapData = []; + this.$rowLengthCache = []; + this.$resetRowCache(0); + if (!this.destroyed) + this.bgTokenizer.start(0); }; - this.getDocumentLastRowColumnPosition = function(docRow, docColumn) { - var screenRow = this.documentToScreenRow(docRow, docColumn); - return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10); + EditSession.prototype.onChangeFold = function (e) { + var fold = e.data; + this.$resetRowCache(fold.start.row); }; - this.getRowSplitData = function(row) { - if (!this.$useWrapMode) { - return undefined; - } else { - return this.$wrapData[row]; + EditSession.prototype.onChange = function (delta) { + this.$modified = true; + this.$bidiHandler.onChange(delta); + this.$resetRowCache(delta.start.row); + var removedFolds = this.$updateInternalDataOnChange(delta); + if (!this.$fromUndo && this.$undoManager) { + if (removedFolds && removedFolds.length) { + this.$undoManager.add({ + action: "removeFolds", + folds: removedFolds + }, this.mergeUndoDeltas); + this.mergeUndoDeltas = true; + } + this.$undoManager.add(delta, this.mergeUndoDeltas); + this.mergeUndoDeltas = true; + this.$informUndoManager.schedule(); } + this.bgTokenizer.$updateOnChange(delta); + this._signal("change", delta); }; - this.getScreenTabSize = function(screenColumn) { - return this.$tabSize - (screenColumn % this.$tabSize | 0); + EditSession.prototype.onSelectionChange = function () { + this._signal("changeSelection"); }; - - - this.screenToDocumentRow = function(screenRow, screenColumn) { - return this.screenToDocumentPosition(screenRow, screenColumn).row; + EditSession.prototype.setValue = function (text) { + this.doc.setValue(text); + this.selection.moveTo(0, 0); + this.$resetRowCache(0); + this.setUndoManager(this.$undoManager); + this.getUndoManager().reset(); }; - - - this.screenToDocumentColumn = function(screenRow, screenColumn) { - return this.screenToDocumentPosition(screenRow, screenColumn).column; + EditSession.fromJSON = function (session) { + if (typeof session == "string") + session = JSON.parse(session); + var undoManager = new UndoManager(); + undoManager.$undoStack = session.history.$undoStack; + undoManager.$redoStack = session.history.$redoStack; + undoManager.mark = session.history.mark; + undoManager.$rev = session.history.rev; + var editSession = new EditSession(session.value); + session.folds.forEach(function (fold) { + editSession.addFold("...", Range.fromPoints(fold.start, fold.end)); + }); + editSession.setAnnotations(session.annotations); + editSession.setBreakpoints(session.breakpoints); + editSession.setMode(session.mode); + editSession.setScrollLeft(session.scrollLeft); + editSession.setScrollTop(session.scrollTop); + editSession.setUndoManager(undoManager); + editSession.selection.fromJSON(session.selection); + return editSession; + }; + EditSession.prototype.toJSON = function () { + return { + annotations: this.$annotations, + breakpoints: this.$breakpoints, + folds: this.getAllFolds().map(function (fold) { + return fold.range; + }), + history: this.getUndoManager(), + mode: this.$mode.$id, + scrollLeft: this.$scrollLeft, + scrollTop: this.$scrollTop, + selection: this.selection.toJSON(), + value: this.doc.getValue() + }; }; - this.screenToDocumentPosition = function(screenRow, screenColumn, offsetX) { - if (screenRow < 0) - return {row: 0, column: 0}; - - var line; - var docRow = 0; - var docColumn = 0; - var column; - var row = 0; - var rowLength = 0; - - var rowCache = this.$screenRowCache; - var i = this.$getRowCacheIndex(rowCache, screenRow); - var l = rowCache.length; - if (l && i >= 0) { - var row = rowCache[i]; - var docRow = this.$docRowCache[i]; - var doCache = screenRow > rowCache[l - 1]; - } else { - var doCache = !l; + EditSession.prototype.toString = function () { + return this.doc.getValue(); + }; + EditSession.prototype.getSelection = function () { + return this.selection; + }; + EditSession.prototype.getState = function (row) { + return this.bgTokenizer.getState(row); + }; + EditSession.prototype.getTokens = function (row) { + return this.bgTokenizer.getTokens(row); + }; + EditSession.prototype.getTokenAt = function (row, column) { + var tokens = this.bgTokenizer.getTokens(row); + var token, c = 0; + if (column == null) { + var i = tokens.length - 1; + c = this.getLine(row).length; } - - var maxRow = this.getLength() - 1; - var foldLine = this.getNextFoldLine(docRow); - var foldStart = foldLine ? foldLine.start.row : Infinity; - - while (row <= screenRow) { - rowLength = this.getRowLength(docRow); - if (row + rowLength > screenRow || docRow >= maxRow) { - break; - } else { - row += rowLength; - docRow++; - if (docRow > foldStart) { - docRow = foldLine.end.row+1; - foldLine = this.getNextFoldLine(docRow, foldLine); - foldStart = foldLine ? foldLine.start.row : Infinity; - } - } - - if (doCache) { - this.$docRowCache.push(docRow); - this.$screenRowCache.push(row); + else { + for (var i = 0; i < tokens.length; i++) { + c += tokens[i].value.length; + if (c >= column) + break; } } - - if (foldLine && foldLine.start.row <= docRow) { - line = this.getFoldDisplayLine(foldLine); - docRow = foldLine.start.row; - } else if (row + rowLength <= screenRow || docRow > maxRow) { - return { - row: maxRow, - column: this.getLine(maxRow).length + token = tokens[i]; + if (!token) + return null; + token.index = i; + token.start = c - token.value.length; + return token; + }; + EditSession.prototype.setUndoManager = function (undoManager) { + this.$undoManager = undoManager; + if (this.$informUndoManager) + this.$informUndoManager.cancel(); + if (undoManager) { + var self = this; + undoManager.addSession(this); + this.$syncInformUndoManager = function () { + self.$informUndoManager.cancel(); + self.mergeUndoDeltas = false; }; - } else { - line = this.getLine(docRow); - foldLine = null; + this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager); } - var wrapIndent = 0, splitIndex = Math.floor(screenRow - row); - if (this.$useWrapMode) { - var splits = this.$wrapData[docRow]; - if (splits) { - column = splits[splitIndex]; - if(splitIndex > 0 && splits.length) { - wrapIndent = splits.indent; - docColumn = splits[splitIndex - 1] || splits[splits.length - 1]; - line = line.substring(docColumn); - } - } + else { + this.$syncInformUndoManager = function () { }; } - - if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex)) - screenColumn = this.$bidiHandler.offsetToCol(offsetX); - - docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1]; - if (this.$useWrapMode && docColumn >= column) - docColumn = column - 1; - - if (foldLine) - return foldLine.idxToPosition(docColumn); - - return {row: docRow, column: docColumn}; }; - this.documentToScreenPosition = function(docRow, docColumn) { - if (typeof docColumn === "undefined") - var pos = this.$clipPositionToDocument(docRow.row, docRow.column); - else - pos = this.$clipPositionToDocument(docRow, docColumn); - - docRow = pos.row; - docColumn = pos.column; - - var screenRow = 0; - var foldStartRow = null; - var fold = null; - fold = this.getFoldAt(docRow, docColumn, 1); - if (fold) { - docRow = fold.start.row; - docColumn = fold.start.column; - } - - var rowEnd, row = 0; - - - var rowCache = this.$docRowCache; - var i = this.$getRowCacheIndex(rowCache, docRow); - var l = rowCache.length; - if (l && i >= 0) { - var row = rowCache[i]; - var screenRow = this.$screenRowCache[i]; - var doCache = docRow > rowCache[l - 1]; - } else { - var doCache = !l; + EditSession.prototype.markUndoGroup = function () { + if (this.$syncInformUndoManager) + this.$syncInformUndoManager(); + }; + EditSession.prototype.getUndoManager = function () { + return this.$undoManager || this.$defaultUndoManager; + }; + EditSession.prototype.getTabString = function () { + if (this.getUseSoftTabs()) { + return lang.stringRepeat(" ", this.getTabSize()); } - - var foldLine = this.getNextFoldLine(row); - var foldStart = foldLine ?foldLine.start.row :Infinity; - - while (row < docRow) { - if (row >= foldStart) { - rowEnd = foldLine.end.row + 1; - if (rowEnd > docRow) - break; - foldLine = this.getNextFoldLine(rowEnd, foldLine); - foldStart = foldLine ?foldLine.start.row :Infinity; - } - else { - rowEnd = row + 1; - } - - screenRow += this.getRowLength(row); - row = rowEnd; - - if (doCache) { - this.$docRowCache.push(row); - this.$screenRowCache.push(screenRow); - } + else { + return "\t"; } - var textLine = ""; - if (foldLine && row >= foldStart) { - textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn); - foldStartRow = foldLine.start.row; - } else { - textLine = this.getLine(docRow).substring(0, docColumn); - foldStartRow = docRow; + }; + EditSession.prototype.setUseSoftTabs = function (val) { + this.setOption("useSoftTabs", val); + }; + EditSession.prototype.getUseSoftTabs = function () { + return this.$useSoftTabs && !this.$mode.$indentWithTabs; + }; + EditSession.prototype.setTabSize = function (tabSize) { + this.setOption("tabSize", tabSize); + }; + EditSession.prototype.getTabSize = function () { + return this.$tabSize; + }; + EditSession.prototype.isTabStop = function (position) { + return this.$useSoftTabs && (position.column % this.$tabSize === 0); + }; + EditSession.prototype.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) { + this.setOption("navigateWithinSoftTabs", navigateWithinSoftTabs); + }; + EditSession.prototype.getNavigateWithinSoftTabs = function () { + return this.$navigateWithinSoftTabs; + }; + EditSession.prototype.setOverwrite = function (overwrite) { + this.setOption("overwrite", overwrite); + }; + EditSession.prototype.getOverwrite = function () { + return this.$overwrite; + }; + EditSession.prototype.toggleOverwrite = function () { + this.setOverwrite(!this.$overwrite); + }; + EditSession.prototype.addGutterDecoration = function (row, className) { + if (!this.$decorations[row]) + this.$decorations[row] = ""; + this.$decorations[row] += " " + className; + this._signal("changeBreakpoint", {}); + }; + EditSession.prototype.removeGutterCustomWidget = function (row) { + if (this.$editor) { + this.$editor.renderer.$gutterLayer.$removeCustomWidget(row); } - var wrapIndent = 0; - if (this.$useWrapMode) { - var wrapRow = this.$wrapData[foldStartRow]; - if (wrapRow) { - var screenRowOffset = 0; - while (textLine.length >= wrapRow[screenRowOffset]) { - screenRow ++; - screenRowOffset++; - } - textLine = textLine.substring( - wrapRow[screenRowOffset - 1] || 0, textLine.length - ); - wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0; - } + }; + EditSession.prototype.addGutterCustomWidget = function (row, attributes) { + if (this.$editor) { + this.$editor.renderer.$gutterLayer.$addCustomWidget(row, attributes); } - - if (this.lineWidgets && this.lineWidgets[row] && this.lineWidgets[row].rowsAbove) - screenRow += this.lineWidgets[row].rowsAbove; - - return { - row: screenRow, - column: wrapIndent + this.$getStringScreenWidth(textLine)[0] - }; }; - this.documentToScreenColumn = function(row, docColumn) { - return this.documentToScreenPosition(row, docColumn).column; + EditSession.prototype.removeGutterDecoration = function (row, className) { + this.$decorations[row] = (this.$decorations[row] || "").replace(" " + className, ""); + this._signal("changeBreakpoint", {}); }; - this.documentToScreenRow = function(docRow, docColumn) { - return this.documentToScreenPosition(docRow, docColumn).row; + EditSession.prototype.getBreakpoints = function () { + return this.$breakpoints; }; - this.getScreenLength = function() { - var screenRows = 0; - var fold = null; - if (!this.$useWrapMode) { - screenRows = this.getLength(); - var foldData = this.$foldData; - for (var i = 0; i < foldData.length; i++) { - fold = foldData[i]; - screenRows -= fold.end.row - fold.start.row; - } - } else { - var lastRow = this.$wrapData.length; - var row = 0, i = 0; - var fold = this.$foldData[i++]; - var foldStart = fold ? fold.start.row :Infinity; - - while (row < lastRow) { - var splits = this.$wrapData[row]; - screenRows += splits ? splits.length + 1 : 1; - row ++; - if (row > foldStart) { - row = fold.end.row+1; - fold = this.$foldData[i++]; - foldStart = fold ?fold.start.row :Infinity; - } - } + EditSession.prototype.setBreakpoints = function (rows) { + this.$breakpoints = []; + for (var i = 0; i < rows.length; i++) { + this.$breakpoints[rows[i]] = "ace_breakpoint"; } - if (this.lineWidgets) - screenRows += this.$getWidgetScreenLength(); - - return screenRows; + this._signal("changeBreakpoint", {}); }; - this.$setFontMetrics = function(fm) { - if (!this.$enableVarChar) return; - this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { - if (maxScreenColumn === 0) - return [0, 0]; - if (!maxScreenColumn) - maxScreenColumn = Infinity; - screenColumn = screenColumn || 0; - - var c, column; - for (column = 0; column < str.length; column++) { - c = str.charAt(column); - if (c === "\t") { - screenColumn += this.getScreenTabSize(screenColumn); - } else { - screenColumn += fm.getCharacterWidth(c); - } - if (screenColumn > maxScreenColumn) { - break; - } - } - - return [screenColumn, column]; - }; + EditSession.prototype.clearBreakpoints = function () { + this.$breakpoints = []; + this._signal("changeBreakpoint", {}); }; - - this.destroy = function() { - if (!this.destroyed) { - this.bgTokenizer.setDocument(null); - this.bgTokenizer.cleanup(); - this.destroyed = true; + EditSession.prototype.setBreakpoint = function (row, className) { + if (className === undefined) + className = "ace_breakpoint"; + if (className) + this.$breakpoints[row] = className; + else + delete this.$breakpoints[row]; + this._signal("changeBreakpoint", {}); + }; + EditSession.prototype.clearBreakpoint = function (row) { + delete this.$breakpoints[row]; + this._signal("changeBreakpoint", {}); + }; + EditSession.prototype.addMarker = function (range, clazz, type, inFront) { + var id = this.$markerId++; + var marker = { + range: range, + type: type || "line", + renderer: typeof type == "function" ? type : null, + clazz: clazz, + inFront: !!inFront, + id: id + }; + if (inFront) { + this.$frontMarkers[id] = marker; + this._signal("changeFrontMarker"); } - this.$stopWorker(); - this.removeAllListeners(); - if (this.doc) { - this.doc.off("change", this.$onChange); + else { + this.$backMarkers[id] = marker; + this._signal("changeBackMarker"); } - this.selection.detach(); - }; - - this.isFullWidth = isFullWidth; - function isFullWidth(c) { - if (c < 0x1100) - return false; - return c >= 0x1100 && c <= 0x115F || - c >= 0x11A3 && c <= 0x11A7 || - c >= 0x11FA && c <= 0x11FF || - c >= 0x2329 && c <= 0x232A || - c >= 0x2E80 && c <= 0x2E99 || - c >= 0x2E9B && c <= 0x2EF3 || - c >= 0x2F00 && c <= 0x2FD5 || - c >= 0x2FF0 && c <= 0x2FFB || - c >= 0x3000 && c <= 0x303E || - c >= 0x3041 && c <= 0x3096 || - c >= 0x3099 && c <= 0x30FF || - c >= 0x3105 && c <= 0x312D || - c >= 0x3131 && c <= 0x318E || - c >= 0x3190 && c <= 0x31BA || - c >= 0x31C0 && c <= 0x31E3 || - c >= 0x31F0 && c <= 0x321E || - c >= 0x3220 && c <= 0x3247 || - c >= 0x3250 && c <= 0x32FE || - c >= 0x3300 && c <= 0x4DBF || - c >= 0x4E00 && c <= 0xA48C || - c >= 0xA490 && c <= 0xA4C6 || - c >= 0xA960 && c <= 0xA97C || - c >= 0xAC00 && c <= 0xD7A3 || - c >= 0xD7B0 && c <= 0xD7C6 || - c >= 0xD7CB && c <= 0xD7FB || - c >= 0xF900 && c <= 0xFAFF || - c >= 0xFE10 && c <= 0xFE19 || - c >= 0xFE30 && c <= 0xFE52 || - c >= 0xFE54 && c <= 0xFE66 || - c >= 0xFE68 && c <= 0xFE6B || - c >= 0xFF01 && c <= 0xFF60 || - c >= 0xFFE0 && c <= 0xFFE6; - } - -}).call(EditSession.prototype); - -require("./edit_session/folding").Folding.call(EditSession.prototype); -require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype); - - -config.defineOptions(EditSession.prototype, "session", { - wrap: { - set: function(value) { - if (!value || value == "off") - value = false; - else if (value == "free") - value = true; - else if (value == "printMargin") - value = -1; - else if (typeof value == "string") - value = parseInt(value, 10) || false; - - if (this.$wrap == value) - return; - this.$wrap = value; - if (!value) { - this.setUseWrapMode(false); - } else { - var col = typeof value == "number" ? value : null; - this.setWrapLimitRange(col, col); - this.setUseWrapMode(true); - } - }, - get: function() { - if (this.getUseWrapMode()) { - if (this.$wrap == -1) - return "printMargin"; - if (!this.getWrapLimitRange().min) - return "free"; - return this.$wrap; - } - return "off"; - }, - handlesSet: true - }, - wrapMethod: { - set: function(val) { - val = val == "auto" - ? this.$mode.type != "text" - : val != "text"; - if (val != this.$wrapAsCode) { - this.$wrapAsCode = val; - if (this.$useWrapMode) { - this.$useWrapMode = false; - this.setUseWrapMode(true); - } - } - }, - initialValue: "auto" - }, - indentedSoftWrap: { - set: function() { - if (this.$useWrapMode) { - this.$useWrapMode = false; - this.setUseWrapMode(true); - } - }, - initialValue: true - }, - firstLineNumber: { - set: function() {this._signal("changeBreakpoint");}, - initialValue: 1 - }, - useWorker: { - set: function(useWorker) { - this.$useWorker = useWorker; - - this.$stopWorker(); - if (useWorker) - this.$startWorker(); - }, - initialValue: true - }, - useSoftTabs: {initialValue: true}, - tabSize: { - set: function(tabSize) { - tabSize = parseInt(tabSize); - if (tabSize > 0 && this.$tabSize !== tabSize) { - this.$modified = true; - this.$rowLengthCache = []; - this.$tabSize = tabSize; - this._signal("changeTabSize"); - } - }, - initialValue: 4, - handlesSet: true - }, - navigateWithinSoftTabs: {initialValue: false}, - foldStyle: { - set: function(val) {this.setFoldStyle(val);}, - handlesSet: true - }, - overwrite: { - set: function(val) {this._signal("changeOverwrite");}, - initialValue: false - }, - newLineMode: { - set: function(val) {this.doc.setNewLineMode(val);}, - get: function() {return this.doc.getNewLineMode();}, - handlesSet: true - }, - mode: { - set: function(val) { this.setMode(val); }, - get: function() { return this.$modeId; }, - handlesSet: true - } -}); - -exports.EditSession = EditSession; -}); - -define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) { -"use strict"; - -var lang = require("./lib/lang"); -var oop = require("./lib/oop"); -var Range = require("./range").Range; - -var Search = function() { - this.$options = {}; -}; - -(function() { - this.set = function(options) { - oop.mixin(this.$options, options); - return this; + return id; }; - this.getOptions = function() { - return lang.copyObject(this.$options); + EditSession.prototype.addDynamicMarker = function (marker, inFront) { + if (!marker.update) + return; + var id = this.$markerId++; + marker.id = id; + marker.inFront = !!inFront; + if (inFront) { + this.$frontMarkers[id] = marker; + this._signal("changeFrontMarker"); + } + else { + this.$backMarkers[id] = marker; + this._signal("changeBackMarker"); + } + return marker; }; - this.setOptions = function(options) { - this.$options = options; + EditSession.prototype.removeMarker = function (markerId) { + var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId]; + if (!marker) + return; + var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers; + delete (markers[markerId]); + this._signal(marker.inFront ? "changeFrontMarker" : "changeBackMarker"); }; - this.find = function(session) { - var options = this.$options; - var iterator = this.$matchIterator(session, options); - if (!iterator) - return false; - - var firstRange = null; - iterator.forEach(function(sr, sc, er, ec) { - firstRange = new Range(sr, sc, er, ec); - if (sc == ec && options.start && options.start.start - && options.skipCurrent != false && firstRange.isEqual(options.start) - ) { - firstRange = null; - return false; - } - - return true; - }); - - return firstRange; + EditSession.prototype.getMarkers = function (inFront) { + return inFront ? this.$frontMarkers : this.$backMarkers; }; - this.findAll = function(session) { - var options = this.$options; - if (!options.needle) - return []; - this.$assembleRegExp(options); - - var range = options.range; - var lines = range - ? session.getLines(range.start.row, range.end.row) - : session.doc.getAllLines(); - - var ranges = []; - var re = options.re; - if (options.$isMultiLine) { - var len = re.length; - var maxRow = lines.length - len; - var prevRange; - outer: for (var row = re.offset || 0; row <= maxRow; row++) { - for (var j = 0; j < len; j++) - if (lines[row + j].search(re[j]) == -1) - continue outer; - - var startLine = lines[row]; - var line = lines[row + len - 1]; - var startIndex = startLine.length - startLine.match(re[0])[0].length; - var endIndex = line.match(re[len - 1])[0].length; - - if (prevRange && prevRange.end.row === row && - prevRange.end.column > startIndex - ) { - continue; - } - ranges.push(prevRange = new Range( - row, startIndex, row + len - 1, endIndex - )); - if (len > 2) - row = row + len - 2; - } - } else { - for (var i = 0; i < lines.length; i++) { - var matches = lang.getMatchOffsets(lines[i], re); - for (var j = 0; j < matches.length; j++) { - var match = matches[j]; - ranges.push(new Range(i, match.offset, i, match.offset + match.length)); - } - } + EditSession.prototype.highlight = function (re) { + if (!this.$searchHighlight) { + var highlight = new SearchHighlight(null, "ace_selected-word", "text"); + this.$searchHighlight = this.addDynamicMarker(highlight); } - - if (range) { - var startColumn = range.start.column; - var endColumn = range.start.column; - var i = 0, j = ranges.length - 1; - while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row) - i++; - - while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row) - j--; - - ranges = ranges.slice(i, j + 1); - for (i = 0, j = ranges.length; i < j; i++) { - ranges[i].start.row += range.start.row; - ranges[i].end.row += range.start.row; - } + this.$searchHighlight.setRegexp(re); + }; + EditSession.prototype.highlightLines = function (startRow, endRow, clazz, inFront) { + if (typeof endRow != "number") { + clazz = endRow; + endRow = startRow; } - - return ranges; + if (!clazz) + clazz = "ace_step"; + var range = new Range(startRow, 0, endRow, Infinity); + range.id = this.addMarker(range, clazz, "fullLine", inFront); + return range; }; - this.replace = function(input, replacement) { - var options = this.$options; - - var re = this.$assembleRegExp(options); - if (options.$isMultiLine) - return replacement; - - if (!re) - return; - - var match = re.exec(input); - if (!match || match[0].length != input.length) - return null; - - replacement = input.replace(re, replacement); - if (options.preserveCase) { - replacement = replacement.split(""); - for (var i = Math.min(input.length, input.length); i--; ) { - var ch = input[i]; - if (ch && ch.toLowerCase() != ch) - replacement[i] = replacement[i].toUpperCase(); - else - replacement[i] = replacement[i].toLowerCase(); - } - replacement = replacement.join(""); - } - - return replacement; + EditSession.prototype.setAnnotations = function (annotations) { + this.$annotations = annotations; + this._signal("changeAnnotation", {}); }; - - this.$assembleRegExp = function(options, $disableFakeMultiline) { - if (options.needle instanceof RegExp) - return options.re = options.needle; - - var needle = options.needle; - - if (!options.needle) - return options.re = false; - - if (!options.regExp) - needle = lang.escapeRegExp(needle); - - if (options.wholeWord) - needle = addWordBoundary(needle, options); - - var modifier = options.caseSensitive ? "gm" : "gmi"; - - options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle); - if (options.$isMultiLine) - return options.re = this.$assembleMultilineRegExp(needle, modifier); - - try { - var re = new RegExp(needle, modifier); - } catch(e) { - re = false; - } - return options.re = re; + EditSession.prototype.getAnnotations = function () { + return this.$annotations || []; }; - - this.$assembleMultilineRegExp = function(needle, modifier) { - var parts = needle.replace(/\r\n|\r|\n/g, "$\n^").split("\n"); - var re = []; - for (var i = 0; i < parts.length; i++) try { - re.push(new RegExp(parts[i], modifier)); - } catch(e) { - return false; - } - return re; + EditSession.prototype.clearAnnotations = function () { + this.setAnnotations([]); }; - - this.$matchIterator = function(session, options) { - var re = this.$assembleRegExp(options); - if (!re) - return false; - var backwards = options.backwards == true; - var skipCurrent = options.skipCurrent != false; - - var range = options.range; - var start = options.start; - if (!start) - start = range ? range[backwards ? "end" : "start"] : session.selection.getRange(); - - if (start.start) - start = start[skipCurrent != backwards ? "end" : "start"]; - - var firstRow = range ? range.start.row : 0; - var lastRow = range ? range.end.row : session.getLength() - 1; - - if (backwards) { - var forEach = function(callback) { - var row = start.row; - if (forEachInLine(row, start.column, callback)) - return; - for (row--; row >= firstRow; row--) - if (forEachInLine(row, Number.MAX_VALUE, callback)) - return; - if (options.wrap == false) - return; - for (row = lastRow, firstRow = start.row; row >= firstRow; row--) - if (forEachInLine(row, Number.MAX_VALUE, callback)) - return; - }; + EditSession.prototype.$detectNewLine = function (text) { + var match = text.match(/^.*?(\r?\n)/m); + if (match) { + this.$autoNewLine = match[1]; } else { - var forEach = function(callback) { - var row = start.row; - if (forEachInLine(row, start.column, callback)) - return; - for (row = row + 1; row <= lastRow; row++) - if (forEachInLine(row, 0, callback)) - return; - if (options.wrap == false) - return; - for (row = firstRow, lastRow = start.row; row <= lastRow; row++) - if (forEachInLine(row, 0, callback)) - return; - }; + this.$autoNewLine = "\n"; } - - if (options.$isMultiLine) { - var len = re.length; - var forEachInLine = function(row, offset, callback) { - var startRow = backwards ? row - len + 1 : row; - if (startRow < 0 || startRow + len > session.getLength()) return; - var line = session.getLine(startRow); - var startIndex = line.search(re[0]); - if (!backwards && startIndex < offset || startIndex === -1) return; - for (var i = 1; i < len; i++) { - line = session.getLine(startRow + i); - if (line.search(re[i]) == -1) - return; - } - var endIndex = line.match(re[len - 1])[0].length; - if (backwards && endIndex > offset) return; - if (callback(startRow, startIndex, startRow + len - 1, endIndex)) - return true; - }; + }; + EditSession.prototype.getWordRange = function (row, column) { + var line = this.getLine(row); + var inToken = false; + if (column > 0) + inToken = !!line.charAt(column - 1).match(this.tokenRe); + if (!inToken) + inToken = !!line.charAt(column).match(this.tokenRe); + if (inToken) + var re = this.tokenRe; + else if (/^\s+$/.test(line.slice(column - 1, column + 1))) + var re = /\s/; + else + var re = this.nonTokenRe; + var start = column; + if (start > 0) { + do { + start--; + } while (start >= 0 && line.charAt(start).match(re)); + start++; } - else if (backwards) { - var forEachInLine = function(row, endIndex, callback) { - var line = session.getLine(row); - var matches = []; - var m, last = 0; - re.lastIndex = 0; - while((m = re.exec(line))) { - var length = m[0].length; - last = m.index; - if (!length) { - if (last >= line.length) break; - re.lastIndex = last += 1; - } - if (m.index + length > endIndex) - break; - matches.push(m.index, length); - } - for (var i = matches.length - 1; i >= 0; i -= 2) { - var column = matches[i - 1]; - var length = matches[i]; - if (callback(row, column, row, column + length)) - return true; - } - }; + var end = column; + while (end < line.length && line.charAt(end).match(re)) { + end++; } - else { - var forEachInLine = function(row, startIndex, callback) { - var line = session.getLine(row); - var last; - var m; - re.lastIndex = startIndex; - while((m = re.exec(line))) { - var length = m[0].length; - last = m.index; - if (callback(row, last, row,last + length)) - return true; - if (!length) { - re.lastIndex = last += 1; - if (last >= line.length) return false; - } - } - }; + return new Range(row, start, row, end); + }; + EditSession.prototype.getAWordRange = function (row, column) { + var wordRange = this.getWordRange(row, column); + var line = this.getLine(wordRange.end.row); + while (line.charAt(wordRange.end.column).match(/[ \t]/)) { + wordRange.end.column += 1; } - return {forEach: forEach}; + return wordRange; }; - -}).call(Search.prototype); - -function addWordBoundary(needle, options) { - function wordBoundary(c) { - if (/\w/.test(c) || options.regExp) return "\\b"; - return ""; - } - return wordBoundary(needle[0]) + needle - + wordBoundary(needle[needle.length - 1]); -} - -exports.Search = Search; -}); - -define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) { -"use strict"; - -var keyUtil = require("../lib/keys"); -var useragent = require("../lib/useragent"); -var KEY_MODS = keyUtil.KEY_MODS; - -function HashHandler(config, platform) { - this.platform = platform || (useragent.isMac ? "mac" : "win"); - this.commands = {}; - this.commandKeyBinding = {}; - this.addCommands(config); - this.$singleCommand = true; -} - -function MultiHashHandler(config, platform) { - HashHandler.call(this, config, platform); - this.$singleCommand = false; -} - -MultiHashHandler.prototype = HashHandler.prototype; - -(function() { - - - this.addCommand = function(command) { - if (this.commands[command.name]) - this.removeCommand(command); - - this.commands[command.name] = command; - - if (command.bindKey) - this._buildKeyHash(command); + EditSession.prototype.setNewLineMode = function (newLineMode) { + this.doc.setNewLineMode(newLineMode); }; - - this.removeCommand = function(command, keepCommand) { - var name = command && (typeof command === 'string' ? command : command.name); - command = this.commands[name]; - if (!keepCommand) - delete this.commands[name]; - var ckb = this.commandKeyBinding; - for (var keyId in ckb) { - var cmdGroup = ckb[keyId]; - if (cmdGroup == command) { - delete ckb[keyId]; - } else if (Array.isArray(cmdGroup)) { - var i = cmdGroup.indexOf(command); - if (i != -1) { - cmdGroup.splice(i, 1); - if (cmdGroup.length == 1) - ckb[keyId] = cmdGroup[0]; - } - } - } + EditSession.prototype.getNewLineMode = function () { + return this.doc.getNewLineMode(); }; - - this.bindKey = function(key, command, position) { - if (typeof key == "object" && key) { - if (position == undefined) - position = key.position; - key = key[this.platform]; + EditSession.prototype.setUseWorker = function (useWorker) { this.setOption("useWorker", useWorker); }; + EditSession.prototype.getUseWorker = function () { return this.$useWorker; }; + EditSession.prototype.onReloadTokenizer = function (e) { + var rows = e.data; + this.bgTokenizer.start(rows.first); + this._signal("tokenizerUpdate", e); + }; + EditSession.prototype.setMode = function (mode, cb) { + if (mode && typeof mode === "object") { + if (mode.getTokenizer) + return this.$onChangeMode(mode); + var options = mode; + var path = options.path; } - if (!key) + else { + path = /**@type{string}*/ (mode) || "ace/mode/text"; + } + if (!this.$modes["ace/mode/text"]) + this.$modes["ace/mode/text"] = new TextMode(); + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); + cb && cb(); return; - if (typeof command == "function") - return this.addCommand({exec: command, bindKey: key, name: command.name || key}); - - key.split("|").forEach(function(keyPart) { - var chain = ""; - if (keyPart.indexOf(" ") != -1) { - var parts = keyPart.split(/\s+/); - keyPart = parts.pop(); - parts.forEach(function(keyPart) { - var binding = this.parseKeys(keyPart); - var id = KEY_MODS[binding.hashId] + binding.key; - chain += (chain ? " " : "") + id; - this._addCommandToBinding(chain, "chainKeys"); - }, this); - chain += " "; + } + this.$modeId = path; + config.loadModule(["mode", path], function (m) { + if (this.destroyed) { + return; } - var binding = this.parseKeys(keyPart); - var id = KEY_MODS[binding.hashId] + binding.key; - this._addCommandToBinding(chain + id, command, position); - }, this); - }; - - function getPosition(command) { - return typeof command == "object" && command.bindKey - && command.bindKey.position - || (command.isDefault ? -100 : 0); - } - this._addCommandToBinding = function(keyId, command, position) { - var ckb = this.commandKeyBinding, i; - if (!command) { - delete ckb[keyId]; - } else if (!ckb[keyId] || this.$singleCommand) { - ckb[keyId] = command; - } else { - if (!Array.isArray(ckb[keyId])) { - ckb[keyId] = [ckb[keyId]]; - } else if ((i = ckb[keyId].indexOf(command)) != -1) { - ckb[keyId].splice(i, 1); - } - - if (typeof position != "number") { - position = getPosition(command); + if (this.$modeId !== path) + return cb && cb(); + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); } - - var commands = ckb[keyId]; - for (i = 0; i < commands.length; i++) { - var other = commands[i]; - var otherPos = getPosition(other); - if (otherPos > position) - break; + else if (m && m.Mode) { + m = new m.Mode(options); + if (!options) { + this.$modes[path] = m; + m.$id = path; + } + this.$onChangeMode(m); } - commands.splice(i, 0, command); + cb && cb(); + }.bind(this)); + if (!this.$mode) + this.$onChangeMode(this.$modes["ace/mode/text"], true); + }; + EditSession.prototype.$onChangeMode = function (mode, $isPlaceholder) { + if (!$isPlaceholder) + this.$modeId = mode.$id; + if (this.$mode === mode) + return; + var oldMode = this.$mode; + this.$mode = mode; + this.$stopWorker(); + if (this.$useWorker) + this.$startWorker(); + var tokenizer = mode.getTokenizer(); + if (tokenizer.on !== undefined) { + var onReloadTokenizer = this.onReloadTokenizer.bind(this); + tokenizer.on("update", onReloadTokenizer); + } + this.bgTokenizer.setTokenizer(tokenizer); + this.bgTokenizer.setDocument(this.getDocument()); + this.tokenRe = mode.tokenRe; + this.nonTokenRe = mode.nonTokenRe; + if (!$isPlaceholder) { + if (mode.attachToSession) + mode.attachToSession(this); + this.$options.wrapMethod.set.call(this, this.$wrapMethod); + this.$setFolding(mode.foldingRules); + this.bgTokenizer.start(0); + this._emit("changeMode", { oldMode: oldMode, mode: mode }); } }; - - this.addCommands = function(commands) { - commands && Object.keys(commands).forEach(function(name) { - var command = commands[name]; - if (!command) - return; - - if (typeof command === "string") - return this.bindKey(command, name); - - if (typeof command === "function") - command = { exec: command }; - - if (typeof command !== "object") - return; - - if (!command.name) - command.name = name; - - this.addCommand(command); - }, this); + EditSession.prototype.$stopWorker = function () { + if (this.$worker) { + this.$worker.terminate(); + this.$worker = null; + } }; - - this.removeCommands = function(commands) { - Object.keys(commands).forEach(function(name) { - this.removeCommand(commands[name]); - }, this); + EditSession.prototype.$startWorker = function () { + try { + this.$worker = this.$mode.createWorker(this); + } + catch (e) { + config.warn("Could not load worker", e); + this.$worker = null; + } }; - - this.bindKeys = function(keyList) { - Object.keys(keyList).forEach(function(key) { - this.bindKey(key, keyList[key]); - }, this); + EditSession.prototype.getMode = function () { + return this.$mode; }; - - this._buildKeyHash = function(command) { - this.bindKey(command.bindKey, command); + EditSession.prototype.setScrollTop = function (scrollTop) { + if (this.$scrollTop === scrollTop || isNaN(scrollTop)) + return; + this.$scrollTop = scrollTop; + this._signal("changeScrollTop", scrollTop); }; - this.parseKeys = function(keys) { - var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(x){return x;}); - var key = parts.pop(); - - var keyCode = keyUtil[key]; - if (keyUtil.FUNCTION_KEYS[keyCode]) - key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase(); - else if (!parts.length) - return {key: key, hashId: -1}; - else if (parts.length == 1 && parts[0] == "shift") - return {key: key.toUpperCase(), hashId: -1}; - - var hashId = 0; - for (var i = parts.length; i--;) { - var modifier = keyUtil.KEY_MODS[parts[i]]; - if (modifier == null) { - if (typeof console != "undefined") - console.error("invalid modifier " + parts[i] + " in " + keys); - return false; + EditSession.prototype.getScrollTop = function () { + return this.$scrollTop; + }; + EditSession.prototype.setScrollLeft = function (scrollLeft) { + if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft)) + return; + this.$scrollLeft = scrollLeft; + this._signal("changeScrollLeft", scrollLeft); + }; + EditSession.prototype.getScrollLeft = function () { + return this.$scrollLeft; + }; + EditSession.prototype.getScreenWidth = function () { + this.$computeWidth(); + if (this.lineWidgets) + return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth); + return this.screenWidth; + }; + EditSession.prototype.getLineWidgetMaxWidth = function () { + if (this.lineWidgetsWidth != null) + return this.lineWidgetsWidth; + var width = 0; + this.lineWidgets.forEach(function (w) { + if (w && w.screenWidth > width) + width = w.screenWidth; + }); + return this.lineWidgetWidth = width; + }; + EditSession.prototype.$computeWidth = function (force) { + if (this.$modified || force) { + this.$modified = false; + if (this.$useWrapMode) + return this.screenWidth = this.$wrapLimit; + var lines = this.doc.getAllLines(); + var cache = this.$rowLengthCache; + var longestScreenLine = 0; + var foldIndex = 0; + var foldLine = this.$foldData[foldIndex]; + var foldStart = foldLine ? foldLine.start.row : Infinity; + var len = lines.length; + for (var i = 0; i < len; i++) { + if (i > foldStart) { + i = foldLine.end.row + 1; + if (i >= len) + break; + foldLine = this.$foldData[foldIndex++]; + foldStart = foldLine ? foldLine.start.row : Infinity; + } + if (cache[i] == null) + cache[i] = this.$getStringScreenWidth(lines[i])[0]; + if (cache[i] > longestScreenLine) + longestScreenLine = cache[i]; } - hashId |= modifier; + this.screenWidth = longestScreenLine; } - return {key: key, hashId: hashId}; }; - - this.findKeyCommand = function findKeyCommand(hashId, keyString) { - var key = KEY_MODS[hashId] + keyString; - return this.commandKeyBinding[key]; + EditSession.prototype.getLine = function (row) { + return this.doc.getLine(row); }; - - this.handleKeyboard = function(data, hashId, keyString, keyCode) { - if (keyCode < 0) return; - var key = KEY_MODS[hashId] + keyString; - var command = this.commandKeyBinding[key]; - if (data.$keyChain) { - data.$keyChain += " " + key; - command = this.commandKeyBinding[data.$keyChain] || command; - } - - if (command) { - if (command == "chainKeys" || command[command.length - 1] == "chainKeys") { - data.$keyChain = data.$keyChain || key; - return {command: "null"}; + EditSession.prototype.getLines = function (firstRow, lastRow) { + return this.doc.getLines(firstRow, lastRow); + }; + EditSession.prototype.getLength = function () { + return this.doc.getLength(); + }; + EditSession.prototype.getTextRange = function (range) { + return this.doc.getTextRange(range || this.selection.getRange()); + }; + EditSession.prototype.insert = function (position, text) { + return this.doc.insert(position, text); + }; + EditSession.prototype.remove = function (range) { + return this.doc.remove(range); + }; + EditSession.prototype.removeFullLines = function (firstRow, lastRow) { + return this.doc.removeFullLines(firstRow, lastRow); + }; + EditSession.prototype.undoChanges = function (deltas, dontSelect) { + if (!deltas.length) + return; + this.$fromUndo = true; + for (var i = deltas.length - 1; i != -1; i--) { + var delta = deltas[i]; + if (delta.action == "insert" || delta.action == "remove") { + this.doc.revertDelta(delta); + } + else if (delta.folds) { + this.addFolds(delta.folds); } } - - if (data.$keyChain) { - if ((!hashId || hashId == 4) && keyString.length == 1) - data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input - else if (hashId == -1 || keyCode > 0) - data.$keyChain = ""; // reset keyChain + if (!dontSelect && this.$undoSelect) { + if (deltas.selectionBefore) + this.selection.fromJSON(deltas.selectionBefore); + else + this.selection.setRange(this.$getUndoSelection(deltas, true)); } - return {command: command}; - }; - - this.getStatusText = function(editor, data) { - return data.$keyChain || ""; + this.$fromUndo = false; }; - -}).call(HashHandler.prototype); - -exports.HashHandler = HashHandler; -exports.MultiHashHandler = MultiHashHandler; -}); - -define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"], function(require, exports, module) { -"use strict"; - -var oop = require("../lib/oop"); -var MultiHashHandler = require("../keyboard/hash_handler").MultiHashHandler; -var EventEmitter = require("../lib/event_emitter").EventEmitter; - -var CommandManager = function(platform, commands) { - MultiHashHandler.call(this, commands, platform); - this.byName = this.commands; - this.setDefaultHandler("exec", function(e) { - if (!e.args) { - return e.command.exec(e.editor, {}, e.event, true); - } - return e.command.exec(e.editor, e.args, e.event, false); - }); -}; - -oop.inherits(CommandManager, MultiHashHandler); - -(function() { - - oop.implement(this, EventEmitter); - - this.exec = function(command, editor, args) { - if (Array.isArray(command)) { - for (var i = command.length; i--; ) { - if (this.exec(command[i], editor, args)) return true; + EditSession.prototype.redoChanges = function (deltas, dontSelect) { + if (!deltas.length) + return; + this.$fromUndo = true; + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (delta.action == "insert" || delta.action == "remove") { + this.doc.$safeApplyDelta(delta); } - return false; } - - if (typeof command === "string") - command = this.commands[command]; - - if (!command) - return false; - - if (editor && editor.$readOnly && !command.readOnly) - return false; - - if (this.$checkCommandState != false && command.isAvailable && !command.isAvailable(editor)) - return false; - - var e = {editor: editor, command: command, args: args}; - e.returnValue = this._emit("exec", e); - this._signal("afterExec", e); - - return e.returnValue === false ? false : true; + if (!dontSelect && this.$undoSelect) { + if (deltas.selectionAfter) + this.selection.fromJSON(deltas.selectionAfter); + else + this.selection.setRange(this.$getUndoSelection(deltas, false)); + } + this.$fromUndo = false; }; - - this.toggleRecording = function(editor) { - if (this.$inReplay) - return; - - editor && editor._emit("changeStatus"); - if (this.recording) { - this.macro.pop(); - this.off("exec", this.$addCommandToMacro); - - if (!this.macro.length) - this.macro = this.oldMacro; - - return this.recording = false; + EditSession.prototype.setUndoSelect = function (enable) { + this.$undoSelect = enable; + }; + EditSession.prototype.$getUndoSelection = function (deltas, isUndo) { + function isInsert(delta) { + return isUndo ? delta.action !== "insert" : delta.action === "insert"; } - if (!this.$addCommandToMacro) { - this.$addCommandToMacro = function(e) { - this.macro.push([e.command, e.args]); - }.bind(this); + var range, point; + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (!delta.start) + continue; // skip folds + if (!range) { + if (isInsert(delta)) { + range = Range.fromPoints(delta.start, delta.end); + } + else { + range = Range.fromPoints(delta.start, delta.start); + } + continue; + } + if (isInsert(delta)) { + point = delta.start; + if (range.compare(point.row, point.column) == -1) { + range.setStart(point); + } + point = delta.end; + if (range.compare(point.row, point.column) == 1) { + range.setEnd(point); + } + } + else { + point = delta.start; + if (range.compare(point.row, point.column) == -1) { + range = Range.fromPoints(delta.start, delta.start); + } + } } - - this.oldMacro = this.macro; - this.macro = []; - this.on("exec", this.$addCommandToMacro); - return this.recording = true; + return range; }; - - this.replay = function(editor) { - if (this.$inReplay || !this.macro) - return; - - if (this.recording) - return this.toggleRecording(editor); - - try { - this.$inReplay = true; - this.macro.forEach(function(x) { - if (typeof x == "string") - this.exec(x, editor); - else - this.exec(x[0], editor, x[1]); - }, this); - } finally { - this.$inReplay = false; + EditSession.prototype.replace = function (range, text) { + return this.doc.replace(range, text); + }; + EditSession.prototype.moveText = function (fromRange, toPosition, copy) { + var text = this.getTextRange(fromRange); + var folds = this.getFoldsInRange(fromRange); + var toRange = Range.fromPoints(toPosition, toPosition); + if (!copy) { + this.remove(fromRange); + var rowDiff = fromRange.start.row - fromRange.end.row; + var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column; + if (collDiff) { + if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column) + toRange.start.column += collDiff; + if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column) + toRange.end.column += collDiff; + } + if (rowDiff && toRange.start.row >= fromRange.end.row) { + toRange.start.row += rowDiff; + toRange.end.row += rowDiff; + } + } + toRange.end = this.insert(toRange.start, text); + if (folds.length) { + var oldStart = fromRange.start; + var newStart = toRange.start; + var rowDiff = newStart.row - oldStart.row; + var collDiff = newStart.column - oldStart.column; + this.addFolds(folds.map(function (x) { + x = x.clone(); + if (x.start.row == oldStart.row) + x.start.column += collDiff; + if (x.end.row == oldStart.row) + x.end.column += collDiff; + x.start.row += rowDiff; + x.end.row += rowDiff; + return x; + })); } + return toRange; }; - - this.trimMacro = function(m) { - return m.map(function(x){ - if (typeof x[0] != "string") - x[0] = x[0].name; - if (!x[1]) - x = x[0]; - return x; - }); + EditSession.prototype.indentRows = function (startRow, endRow, indentString) { + indentString = indentString.replace(/\t/g, this.getTabString()); + for (var row = startRow; row <= endRow; row++) + this.doc.insertInLine({ row: row, column: 0 }, indentString); }; - -}).call(CommandManager.prototype); - -exports.CommandManager = CommandManager; - -}); - -define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"], function(require, exports, module) { -"use strict"; - -var lang = require("../lib/lang"); -var config = require("../config"); -var Range = require("../range").Range; - -function bindKey(win, mac) { - return {win: win, mac: mac}; -} -exports.commands = [{ - name: "showSettingsMenu", - description: "Show settings menu", - bindKey: bindKey("Ctrl-,", "Command-,"), - exec: function(editor) { - config.loadModule("ace/ext/settings_menu", function(module) { - module.init(editor); - editor.showSettingsMenu(); - }); - }, - readOnly: true -}, { - name: "goToNextError", - description: "Go to next error", - bindKey: bindKey("Alt-E", "F4"), - exec: function(editor) { - config.loadModule("./ext/error_marker", function(module) { - module.showErrorMarker(editor, 1); - }); - }, - scrollIntoView: "animate", - readOnly: true -}, { - name: "goToPreviousError", - description: "Go to previous error", - bindKey: bindKey("Alt-Shift-E", "Shift-F4"), - exec: function(editor) { - config.loadModule("./ext/error_marker", function(module) { - module.showErrorMarker(editor, -1); - }); - }, - scrollIntoView: "animate", - readOnly: true -}, { - name: "selectall", - description: "Select all", - bindKey: bindKey("Ctrl-A", "Command-A"), - exec: function(editor) { editor.selectAll(); }, - readOnly: true -}, { - name: "centerselection", - description: "Center selection", - bindKey: bindKey(null, "Ctrl-L"), - exec: function(editor) { editor.centerSelection(); }, - readOnly: true -}, { - name: "gotoline", - description: "Go to line...", - bindKey: bindKey("Ctrl-L", "Command-L"), - exec: function(editor, line) { - if (typeof line === "number" && !isNaN(line)) - editor.gotoLine(line); - editor.prompt({ $type: "gotoLine" }); - }, - readOnly: true -}, { - name: "fold", - bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"), - exec: function(editor) { editor.session.toggleFold(false); }, - multiSelectAction: "forEach", - scrollIntoView: "center", - readOnly: true -}, { - name: "unfold", - bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"), - exec: function(editor) { editor.session.toggleFold(true); }, - multiSelectAction: "forEach", - scrollIntoView: "center", - readOnly: true -}, { - name: "toggleFoldWidget", - description: "Toggle fold widget", - bindKey: bindKey("F2", "F2"), - exec: function(editor) { editor.session.toggleFoldWidget(); }, - multiSelectAction: "forEach", - scrollIntoView: "center", - readOnly: true -}, { - name: "toggleParentFoldWidget", - description: "Toggle parent fold widget", - bindKey: bindKey("Alt-F2", "Alt-F2"), - exec: function(editor) { editor.session.toggleFoldWidget(true); }, - multiSelectAction: "forEach", - scrollIntoView: "center", - readOnly: true -}, { - name: "foldall", - description: "Fold all", - bindKey: bindKey(null, "Ctrl-Command-Option-0"), - exec: function(editor) { editor.session.foldAll(); }, - scrollIntoView: "center", - readOnly: true -}, { - name: "foldAllComments", - description: "Fold all comments", - bindKey: bindKey(null, "Ctrl-Command-Option-0"), - exec: function(editor) { editor.session.foldAllComments(); }, - scrollIntoView: "center", - readOnly: true -}, { - name: "foldOther", - description: "Fold other", - bindKey: bindKey("Alt-0", "Command-Option-0"), - exec: function(editor) { - editor.session.foldAll(); - editor.session.unfold(editor.selection.getAllRanges()); - }, - scrollIntoView: "center", - readOnly: true -}, { - name: "unfoldall", - description: "Unfold all", - bindKey: bindKey("Alt-Shift-0", "Command-Option-Shift-0"), - exec: function(editor) { editor.session.unfold(); }, - scrollIntoView: "center", - readOnly: true -}, { - name: "findnext", - description: "Find next", - bindKey: bindKey("Ctrl-K", "Command-G"), - exec: function(editor) { editor.findNext(); }, - multiSelectAction: "forEach", - scrollIntoView: "center", - readOnly: true -}, { - name: "findprevious", - description: "Find previous", - bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"), - exec: function(editor) { editor.findPrevious(); }, - multiSelectAction: "forEach", - scrollIntoView: "center", - readOnly: true -}, { - name: "selectOrFindNext", - description: "Select or find next", - bindKey: bindKey("Alt-K", "Ctrl-G"), - exec: function(editor) { - if (editor.selection.isEmpty()) - editor.selection.selectWord(); - else - editor.findNext(); - }, - readOnly: true -}, { - name: "selectOrFindPrevious", - description: "Select or find previous", - bindKey: bindKey("Alt-Shift-K", "Ctrl-Shift-G"), - exec: function(editor) { - if (editor.selection.isEmpty()) - editor.selection.selectWord(); - else - editor.findPrevious(); - }, - readOnly: true -}, { - name: "find", - description: "Find", - bindKey: bindKey("Ctrl-F", "Command-F"), - exec: function(editor) { - config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor);}); - }, - readOnly: true -}, { - name: "overwrite", - description: "Overwrite", - bindKey: "Insert", - exec: function(editor) { editor.toggleOverwrite(); }, - readOnly: true -}, { - name: "selecttostart", - description: "Select to start", - bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Home|Command-Shift-Up"), - exec: function(editor) { editor.getSelection().selectFileStart(); }, - multiSelectAction: "forEach", - readOnly: true, - scrollIntoView: "animate", - aceCommandGroup: "fileJump" -}, { - name: "gotostart", - description: "Go to start", - bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"), - exec: function(editor) { editor.navigateFileStart(); }, - multiSelectAction: "forEach", - readOnly: true, - scrollIntoView: "animate", - aceCommandGroup: "fileJump" -}, { - name: "selectup", - description: "Select up", - bindKey: bindKey("Shift-Up", "Shift-Up|Ctrl-Shift-P"), - exec: function(editor) { editor.getSelection().selectUp(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "golineup", - description: "Go line up", - bindKey: bindKey("Up", "Up|Ctrl-P"), - exec: function(editor, args) { editor.navigateUp(args.times); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selecttoend", - description: "Select to end", - bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-End|Command-Shift-Down"), - exec: function(editor) { editor.getSelection().selectFileEnd(); }, - multiSelectAction: "forEach", - readOnly: true, - scrollIntoView: "animate", - aceCommandGroup: "fileJump" -}, { - name: "gotoend", - description: "Go to end", - bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"), - exec: function(editor) { editor.navigateFileEnd(); }, - multiSelectAction: "forEach", - readOnly: true, - scrollIntoView: "animate", - aceCommandGroup: "fileJump" -}, { - name: "selectdown", - description: "Select down", - bindKey: bindKey("Shift-Down", "Shift-Down|Ctrl-Shift-N"), - exec: function(editor) { editor.getSelection().selectDown(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "golinedown", - description: "Go line down", - bindKey: bindKey("Down", "Down|Ctrl-N"), - exec: function(editor, args) { editor.navigateDown(args.times); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectwordleft", - description: "Select word left", - bindKey: bindKey("Ctrl-Shift-Left", "Option-Shift-Left"), - exec: function(editor) { editor.getSelection().selectWordLeft(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "gotowordleft", - description: "Go to word left", - bindKey: bindKey("Ctrl-Left", "Option-Left"), - exec: function(editor) { editor.navigateWordLeft(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selecttolinestart", - description: "Select to line start", - bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left|Ctrl-Shift-A"), - exec: function(editor) { editor.getSelection().selectLineStart(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "gotolinestart", - description: "Go to line start", - bindKey: bindKey("Alt-Left|Home", "Command-Left|Home|Ctrl-A"), - exec: function(editor) { editor.navigateLineStart(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectleft", - description: "Select left", - bindKey: bindKey("Shift-Left", "Shift-Left|Ctrl-Shift-B"), - exec: function(editor) { editor.getSelection().selectLeft(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "gotoleft", - description: "Go to left", - bindKey: bindKey("Left", "Left|Ctrl-B"), - exec: function(editor, args) { editor.navigateLeft(args.times); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectwordright", - description: "Select word right", - bindKey: bindKey("Ctrl-Shift-Right", "Option-Shift-Right"), - exec: function(editor) { editor.getSelection().selectWordRight(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "gotowordright", - description: "Go to word right", - bindKey: bindKey("Ctrl-Right", "Option-Right"), - exec: function(editor) { editor.navigateWordRight(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selecttolineend", - description: "Select to line end", - bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right|Shift-End|Ctrl-Shift-E"), - exec: function(editor) { editor.getSelection().selectLineEnd(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "gotolineend", - description: "Go to line end", - bindKey: bindKey("Alt-Right|End", "Command-Right|End|Ctrl-E"), - exec: function(editor) { editor.navigateLineEnd(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectright", - description: "Select right", - bindKey: bindKey("Shift-Right", "Shift-Right"), - exec: function(editor) { editor.getSelection().selectRight(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "gotoright", - description: "Go to right", - bindKey: bindKey("Right", "Right|Ctrl-F"), - exec: function(editor, args) { editor.navigateRight(args.times); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectpagedown", - description: "Select page down", - bindKey: "Shift-PageDown", - exec: function(editor) { editor.selectPageDown(); }, - readOnly: true -}, { - name: "pagedown", - description: "Page down", - bindKey: bindKey(null, "Option-PageDown"), - exec: function(editor) { editor.scrollPageDown(); }, - readOnly: true -}, { - name: "gotopagedown", - description: "Go to page down", - bindKey: bindKey("PageDown", "PageDown|Ctrl-V"), - exec: function(editor) { editor.gotoPageDown(); }, - readOnly: true -}, { - name: "selectpageup", - description: "Select page up", - bindKey: "Shift-PageUp", - exec: function(editor) { editor.selectPageUp(); }, - readOnly: true -}, { - name: "pageup", - description: "Page up", - bindKey: bindKey(null, "Option-PageUp"), - exec: function(editor) { editor.scrollPageUp(); }, - readOnly: true -}, { - name: "gotopageup", - description: "Go to page up", - bindKey: "PageUp", - exec: function(editor) { editor.gotoPageUp(); }, - readOnly: true -}, { - name: "scrollup", - description: "Scroll up", - bindKey: bindKey("Ctrl-Up", null), - exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); }, - readOnly: true -}, { - name: "scrolldown", - description: "Scroll down", - bindKey: bindKey("Ctrl-Down", null), - exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); }, - readOnly: true -}, { - name: "selectlinestart", - description: "Select line start", - bindKey: "Shift-Home", - exec: function(editor) { editor.getSelection().selectLineStart(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectlineend", - description: "Select line end", - bindKey: "Shift-End", - exec: function(editor) { editor.getSelection().selectLineEnd(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "togglerecording", - description: "Toggle recording", - bindKey: bindKey("Ctrl-Alt-E", "Command-Option-E"), - exec: function(editor) { editor.commands.toggleRecording(editor); }, - readOnly: true -}, { - name: "replaymacro", - description: "Replay macro", - bindKey: bindKey("Ctrl-Shift-E", "Command-Shift-E"), - exec: function(editor) { editor.commands.replay(editor); }, - readOnly: true -}, { - name: "jumptomatching", - description: "Jump to matching", - bindKey: bindKey("Ctrl-\\|Ctrl-P", "Command-\\"), - exec: function(editor) { editor.jumpToMatching(); }, - multiSelectAction: "forEach", - scrollIntoView: "animate", - readOnly: true -}, { - name: "selecttomatching", - description: "Select to matching", - bindKey: bindKey("Ctrl-Shift-\\|Ctrl-Shift-P", "Command-Shift-\\"), - exec: function(editor) { editor.jumpToMatching(true); }, - multiSelectAction: "forEach", - scrollIntoView: "animate", - readOnly: true -}, { - name: "expandToMatching", - description: "Expand to matching", - bindKey: bindKey("Ctrl-Shift-M", "Ctrl-Shift-M"), - exec: function(editor) { editor.jumpToMatching(true, true); }, - multiSelectAction: "forEach", - scrollIntoView: "animate", - readOnly: true -}, { - name: "passKeysToBrowser", - description: "Pass keys to browser", - bindKey: bindKey(null, null), - exec: function() {}, - passEvent: true, - readOnly: true -}, { - name: "copy", - description: "Copy", - exec: function(editor) { - }, - readOnly: true -}, -{ - name: "cut", - description: "Cut", - exec: function(editor) { - var cutLine = editor.$copyWithEmptySelection && editor.selection.isEmpty(); - var range = cutLine ? editor.selection.getLineRange() : editor.selection.getRange(); - editor._emit("cut", range); - - if (!range.isEmpty()) - editor.session.remove(range); - editor.clearSelection(); - }, - scrollIntoView: "cursor", - multiSelectAction: "forEach" -}, { - name: "paste", - description: "Paste", - exec: function(editor, args) { - editor.$handlePaste(args); - }, - scrollIntoView: "cursor" -}, { - name: "removeline", - description: "Remove line", - bindKey: bindKey("Ctrl-D", "Command-D"), - exec: function(editor) { editor.removeLines(); }, - scrollIntoView: "cursor", - multiSelectAction: "forEachLine" -}, { - name: "duplicateSelection", - description: "Duplicate selection", - bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"), - exec: function(editor) { editor.duplicateSelection(); }, - scrollIntoView: "cursor", - multiSelectAction: "forEach" -}, { - name: "sortlines", - description: "Sort lines", - bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"), - exec: function(editor) { editor.sortLines(); }, - scrollIntoView: "selection", - multiSelectAction: "forEachLine" -}, { - name: "togglecomment", - description: "Toggle comment", - bindKey: bindKey("Ctrl-/", "Command-/"), - exec: function(editor) { editor.toggleCommentLines(); }, - multiSelectAction: "forEachLine", - scrollIntoView: "selectionPart" -}, { - name: "toggleBlockComment", - description: "Toggle block comment", - bindKey: bindKey("Ctrl-Shift-/", "Command-Shift-/"), - exec: function(editor) { editor.toggleBlockComment(); }, - multiSelectAction: "forEach", - scrollIntoView: "selectionPart" -}, { - name: "modifyNumberUp", - description: "Modify number up", - bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"), - exec: function(editor) { editor.modifyNumber(1); }, - scrollIntoView: "cursor", - multiSelectAction: "forEach" -}, { - name: "modifyNumberDown", - description: "Modify number down", - bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"), - exec: function(editor) { editor.modifyNumber(-1); }, - scrollIntoView: "cursor", - multiSelectAction: "forEach" -}, { - name: "replace", - description: "Replace", - bindKey: bindKey("Ctrl-H", "Command-Option-F"), - exec: function(editor) { - config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor, true);}); - } -}, { - name: "undo", - description: "Undo", - bindKey: bindKey("Ctrl-Z", "Command-Z"), - exec: function(editor) { editor.undo(); } -}, { - name: "redo", - description: "Redo", - bindKey: bindKey("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"), - exec: function(editor) { editor.redo(); } -}, { - name: "copylinesup", - description: "Copy lines up", - bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"), - exec: function(editor) { editor.copyLinesUp(); }, - scrollIntoView: "cursor" -}, { - name: "movelinesup", - description: "Move lines up", - bindKey: bindKey("Alt-Up", "Option-Up"), - exec: function(editor) { editor.moveLinesUp(); }, - scrollIntoView: "cursor" -}, { - name: "copylinesdown", - description: "Copy lines down", - bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"), - exec: function(editor) { editor.copyLinesDown(); }, - scrollIntoView: "cursor" -}, { - name: "movelinesdown", - description: "Move lines down", - bindKey: bindKey("Alt-Down", "Option-Down"), - exec: function(editor) { editor.moveLinesDown(); }, - scrollIntoView: "cursor" -}, { - name: "del", - description: "Delete", - bindKey: bindKey("Delete", "Delete|Ctrl-D|Shift-Delete"), - exec: function(editor) { editor.remove("right"); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "backspace", - description: "Backspace", - bindKey: bindKey( - "Shift-Backspace|Backspace", - "Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H" - ), - exec: function(editor) { editor.remove("left"); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "cut_or_delete", - description: "Cut or delete", - bindKey: bindKey("Shift-Delete", null), - exec: function(editor) { - if (editor.selection.isEmpty()) { - editor.remove("left"); - } else { - return false; - } - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "removetolinestart", - description: "Remove to line start", - bindKey: bindKey("Alt-Backspace", "Command-Backspace"), - exec: function(editor) { editor.removeToLineStart(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "removetolineend", - description: "Remove to line end", - bindKey: bindKey("Alt-Delete", "Ctrl-K|Command-Delete"), - exec: function(editor) { editor.removeToLineEnd(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "removetolinestarthard", - description: "Remove to line start hard", - bindKey: bindKey("Ctrl-Shift-Backspace", null), - exec: function(editor) { - var range = editor.selection.getRange(); - range.start.column = 0; - editor.session.remove(range); - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "removetolineendhard", - description: "Remove to line end hard", - bindKey: bindKey("Ctrl-Shift-Delete", null), - exec: function(editor) { - var range = editor.selection.getRange(); - range.end.column = Number.MAX_VALUE; - editor.session.remove(range); - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "removewordleft", - description: "Remove word left", - bindKey: bindKey("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"), - exec: function(editor) { editor.removeWordLeft(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "removewordright", - description: "Remove word right", - bindKey: bindKey("Ctrl-Delete", "Alt-Delete"), - exec: function(editor) { editor.removeWordRight(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "outdent", - description: "Outdent", - bindKey: bindKey("Shift-Tab", "Shift-Tab"), - exec: function(editor) { editor.blockOutdent(); }, - multiSelectAction: "forEach", - scrollIntoView: "selectionPart" -}, { - name: "indent", - description: "Indent", - bindKey: bindKey("Tab", "Tab"), - exec: function(editor) { editor.indent(); }, - multiSelectAction: "forEach", - scrollIntoView: "selectionPart" -}, { - name: "blockoutdent", - description: "Block outdent", - bindKey: bindKey("Ctrl-[", "Ctrl-["), - exec: function(editor) { editor.blockOutdent(); }, - multiSelectAction: "forEachLine", - scrollIntoView: "selectionPart" -}, { - name: "blockindent", - description: "Block indent", - bindKey: bindKey("Ctrl-]", "Ctrl-]"), - exec: function(editor) { editor.blockIndent(); }, - multiSelectAction: "forEachLine", - scrollIntoView: "selectionPart" -}, { - name: "insertstring", - description: "Insert string", - exec: function(editor, str) { editor.insert(str); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "inserttext", - description: "Insert text", - exec: function(editor, args) { - editor.insert(lang.stringRepeat(args.text || "", args.times || 1)); - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "splitline", - description: "Split line", - bindKey: bindKey(null, "Ctrl-O"), - exec: function(editor) { editor.splitLine(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "transposeletters", - description: "Transpose letters", - bindKey: bindKey("Alt-Shift-X", "Ctrl-T"), - exec: function(editor) { editor.transposeLetters(); }, - multiSelectAction: function(editor) {editor.transposeSelections(1); }, - scrollIntoView: "cursor" -}, { - name: "touppercase", - description: "To uppercase", - bindKey: bindKey("Ctrl-U", "Ctrl-U"), - exec: function(editor) { editor.toUpperCase(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "tolowercase", - description: "To lowercase", - bindKey: bindKey("Ctrl-Shift-U", "Ctrl-Shift-U"), - exec: function(editor) { editor.toLowerCase(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "autoindent", - description: "Auto Indent", - bindKey: bindKey(null, null), - exec: function(editor) { editor.autoIndent(); }, - multiSelectAction: "forEachLine", - scrollIntoView: "animate" -}, { - name: "expandtoline", - description: "Expand to line", - bindKey: bindKey("Ctrl-Shift-L", "Command-Shift-L"), - exec: function(editor) { - var range = editor.selection.getRange(); - - range.start.column = range.end.column = 0; - range.end.row++; - editor.selection.setRange(range, false); - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "joinlines", - description: "Join lines", - bindKey: bindKey(null, null), - exec: function(editor) { - var isBackwards = editor.selection.isBackwards(); - var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor(); - var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead(); - var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length; - var selectedText = editor.session.doc.getTextRange(editor.selection.getRange()); - var selectedCount = selectedText.replace(/\n\s*/, " ").length; - var insertLine = editor.session.doc.getLine(selectionStart.row); - - for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) { - var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i))); - if (curLine.length !== 0) { - curLine = " " + curLine; + EditSession.prototype.outdentRows = function (range) { + var rowRange = range.collapseRows(); + var deleteRange = new Range(0, 0, 0, 0); + var size = this.getTabSize(); + for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) { + var line = this.getLine(i); + deleteRange.start.row = i; + deleteRange.end.row = i; + for (var j = 0; j < size; ++j) + if (line.charAt(j) != ' ') + break; + if (j < size && line.charAt(j) == '\t') { + deleteRange.start.column = j; + deleteRange.end.column = j + 1; + } + else { + deleteRange.start.column = 0; + deleteRange.end.column = j; } - insertLine += curLine; + this.remove(deleteRange); } - - if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) { - insertLine += editor.session.doc.getNewLineCharacter(); + }; + EditSession.prototype.$moveLines = function (firstRow, lastRow, dir) { + firstRow = this.getRowFoldStart(firstRow); + lastRow = this.getRowFoldEnd(lastRow); + if (dir < 0) { + var row = this.getRowFoldStart(firstRow + dir); + if (row < 0) + return 0; + var diff = row - firstRow; } - - editor.clearSelection(); - editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine); - - if (selectedCount > 0) { - editor.selection.moveCursorTo(selectionStart.row, selectionStart.column); - editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount); - } else { - firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol; - editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol); + else if (dir > 0) { + var row = this.getRowFoldEnd(lastRow + dir); + if (row > this.doc.getLength() - 1) + return 0; + var diff = row - lastRow; } - }, - multiSelectAction: "forEach", - readOnly: true -}, { - name: "invertSelection", - description: "Invert selection", - bindKey: bindKey(null, null), - exec: function(editor) { - var endRow = editor.session.doc.getLength() - 1; - var endCol = editor.session.doc.getLine(endRow).length; - var ranges = editor.selection.rangeList.ranges; - var newRanges = []; - if (ranges.length < 1) { - ranges = [editor.selection.getRange()]; + else { + firstRow = this.$clipRowToDocument(firstRow); + lastRow = this.$clipRowToDocument(lastRow); + var diff = lastRow - firstRow + 1; } - - for (var i = 0; i < ranges.length; i++) { - if (i == (ranges.length - 1)) { - if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) { - newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol)); - } + var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE); + var folds = this.getFoldsInRange(range).map(function (x) { + x = x.clone(); + x.start.row += diff; + x.end.row += diff; + return x; + }); + var lines = dir == 0 + ? this.doc.getLines(firstRow, lastRow) + : this.doc.removeFullLines(firstRow, lastRow); + this.doc.insertFullLines(firstRow + diff, lines); + folds.length && this.addFolds(folds); + return diff; + }; + EditSession.prototype.moveLinesUp = function (firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, -1); + }; + EditSession.prototype.moveLinesDown = function (firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 1); + }; + EditSession.prototype.duplicateLines = function (firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 0); + }; + EditSession.prototype.$clipRowToDocument = function (row) { + return Math.max(0, Math.min(row, this.doc.getLength() - 1)); + }; + EditSession.prototype.$clipColumnToRow = function (row, column) { + if (column < 0) + return 0; + return Math.min(this.doc.getLine(row).length, column); + }; + EditSession.prototype.$clipPositionToDocument = function (row, column) { + column = Math.max(0, column); + if (row < 0) { + row = 0; + column = 0; + } + else { + var len = this.doc.getLength(); + if (row >= len) { + row = len - 1; + column = this.doc.getLine(len - 1).length; } - - if (i === 0) { - if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) { - newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column)); - } - } else { - newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column)); + else { + column = Math.min(this.doc.getLine(row).length, column); } } - - editor.exitMultiSelectMode(); - editor.clearSelection(); - - for(var i = 0; i < newRanges.length; i++) { - editor.selection.addRange(newRanges[i], false); + return { + row: row, + column: column + }; + }; + EditSession.prototype.$clipRangeToDocument = function (range) { + if (range.start.row < 0) { + range.start.row = 0; + range.start.column = 0; } - }, - readOnly: true, - scrollIntoView: "none" -}, { - name: "addLineAfter", - description: "Add new line after the current line", - exec: function(editor) { - editor.selection.clearSelection(); - editor.navigateLineEnd(); - editor.insert("\n"); - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "addLineBefore", - description: "Add new line before the current line", - exec: function(editor) { - editor.selection.clearSelection(); - var cursor = editor.getCursorPosition(); - editor.selection.moveTo(cursor.row - 1, Number.MAX_VALUE); - editor.insert("\n"); - if (cursor.row === 0) editor.navigateUp(); - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "openCommandPallete", - description: "Open command pallete", - bindKey: bindKey("F1", "F1"), - exec: function(editor) { - editor.prompt({ $type: "commands" }); - }, - readOnly: true -}, { - name: "modeSelect", - description: "Change language mode...", - bindKey: bindKey(null, null), - exec: function(editor) { - editor.prompt({ $type: "modes" }); - }, - readOnly: true -}]; - -for (var i = 1; i < 9; i++) { - exports.commands.push({ - name: "foldToLevel" + i, - description: "Fold To Level " + i, - level: i, - exec: function(editor) { editor.session.foldToLevel(this.level); }, - scrollIntoView: "center", - readOnly: true - }); -} - -}); - -define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config","ace/token_iterator","ace/clipboard"], function(require, exports, module) { -"use strict"; - -require("./lib/fixoldbrowsers"); - -var oop = require("./lib/oop"); -var dom = require("./lib/dom"); -var lang = require("./lib/lang"); -var useragent = require("./lib/useragent"); -var TextInput = require("./keyboard/textinput").TextInput; -var MouseHandler = require("./mouse/mouse_handler").MouseHandler; -var FoldHandler = require("./mouse/fold_handler").FoldHandler; -var KeyBinding = require("./keyboard/keybinding").KeyBinding; -var EditSession = require("./edit_session").EditSession; -var Search = require("./search").Search; -var Range = require("./range").Range; -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var CommandManager = require("./commands/command_manager").CommandManager; -var defaultCommands = require("./commands/default_commands").commands; -var config = require("./config"); -var TokenIterator = require("./token_iterator").TokenIterator; - -var clipboard = require("./clipboard"); -var Editor = function(renderer, session, options) { - this.$toDestroy = []; - var container = renderer.getContainerElement(); - this.container = container; - this.renderer = renderer; - this.id = "editor" + (++Editor.$uid); - - this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands); - if (typeof document == "object") { - this.textInput = new TextInput(renderer.getTextAreaContainer(), this); - this.renderer.textarea = this.textInput.getElement(); - this.$mouseHandler = new MouseHandler(this); - new FoldHandler(this); - } - - this.keyBinding = new KeyBinding(this); - - this.$search = new Search().set({ - wrap: true - }); - - this.$historyTracker = this.$historyTracker.bind(this); - this.commands.on("exec", this.$historyTracker); - - this.$initOperationListeners(); - - this._$emitInputEvent = lang.delayedCall(function() { - this._signal("input", {}); - if (this.session && !this.session.destroyed) - this.session.bgTokenizer.scheduleStart(); - }.bind(this)); - - this.on("change", function(_, _self) { - _self._$emitInputEvent.schedule(31); - }); - - this.setSession(session || options && options.session || new EditSession("")); - config.resetOptions(this); - if (options) - this.setOptions(options); - config._signal("editor", this); -}; - -Editor.$uid = 0; - -(function(){ - - oop.implement(this, EventEmitter); - - this.$initOperationListeners = function() { - this.commands.on("exec", this.startOperation.bind(this), true); - this.commands.on("afterExec", this.endOperation.bind(this), true); - - this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this, true)); - this.on("change", function() { - if (!this.curOp) { - this.startOperation(); - this.curOp.selectionBefore = this.$lastSel; - } - this.curOp.docChanged = true; - }.bind(this), true); - - this.on("changeSelection", function() { - if (!this.curOp) { - this.startOperation(); - this.curOp.selectionBefore = this.$lastSel; - } - this.curOp.selectionChanged = true; - }.bind(this), true); - }; - - this.curOp = null; - this.prevOp = {}; - this.startOperation = function(commandEvent) { - if (this.curOp) { - if (!commandEvent || this.curOp.command) - return; - this.prevOp = this.curOp; + else { + range.start.column = this.$clipColumnToRow(range.start.row, range.start.column); } - if (!commandEvent) { - this.previousCommand = null; - commandEvent = {}; + var len = this.doc.getLength() - 1; + if (range.end.row > len) { + range.end.row = len; + range.end.column = this.doc.getLine(len).length; } - - this.$opResetTimer.schedule(); - this.curOp = this.session.curOp = { - command: commandEvent.command || {}, - args: commandEvent.args, - scrollTop: this.renderer.scrollTop - }; - this.curOp.selectionBefore = this.selection.toJSON(); + else { + range.end.column = this.$clipColumnToRow(range.end.row, range.end.column); + } + return range; }; - - this.endOperation = function(e) { - if (this.curOp && this.session) { - if (e && e.returnValue === false || !this.session) - return (this.curOp = null); - if (e == true && this.curOp.command && this.curOp.command.name == "mouse") - return; - this._signal("beforeEndOperation"); - if (!this.curOp) return; - var command = this.curOp.command; - var scrollIntoView = command && command.scrollIntoView; - if (scrollIntoView) { - switch (scrollIntoView) { - case "center-animate": - scrollIntoView = "animate"; - case "center": - this.renderer.scrollCursorIntoView(null, 0.5); - break; - case "animate": - case "cursor": - this.renderer.scrollCursorIntoView(); - break; - case "selectionPart": - var range = this.selection.getRange(); - var config = this.renderer.layerConfig; - if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) { - this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead); - } - break; - default: - break; - } - if (scrollIntoView == "animate") - this.renderer.animateScrolling(this.curOp.scrollTop); + EditSession.prototype.setUseWrapMode = function (useWrapMode) { + if (useWrapMode != this.$useWrapMode) { + this.$useWrapMode = useWrapMode; + this.$modified = true; + this.$resetRowCache(0); + if (useWrapMode) { + var len = this.getLength(); + this.$wrapData = Array(len); + this.$updateWrapData(0, len - 1); } - var sel = this.selection.toJSON(); - this.curOp.selectionAfter = sel; - this.$lastSel = this.selection.toJSON(); - this.session.getUndoManager().addSelection(sel); - this.prevOp = this.curOp; - this.curOp = null; + this._signal("changeWrapMode"); } }; - this.$mergeableCommands = ["backspace", "del", "insertstring"]; - this.$historyTracker = function(e) { - if (!this.$mergeUndoDeltas) - return; - - var prev = this.prevOp; - var mergeableCommands = this.$mergeableCommands; - var shouldMerge = prev.command && (e.command.name == prev.command.name); - if (e.command.name == "insertstring") { - var text = e.args; - if (this.mergeNextCommand === undefined) - this.mergeNextCommand = true; - - shouldMerge = shouldMerge - && this.mergeNextCommand // previous command allows to coalesce with - && (!/\s/.test(text) || /\s/.test(prev.args)); // previous insertion was of same type - - this.mergeNextCommand = true; - } else { - shouldMerge = shouldMerge - && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable - } - - if ( - this.$mergeUndoDeltas != "always" - && Date.now() - this.sequenceStartTime > 2000 - ) { - shouldMerge = false; // the sequence is too long + EditSession.prototype.getUseWrapMode = function () { + return this.$useWrapMode; + }; + EditSession.prototype.setWrapLimitRange = function (min, max) { + if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) { + this.$wrapLimitRange = { min: min, max: max }; + this.$modified = true; + this.$bidiHandler.markAsDirty(); + if (this.$useWrapMode) + this._signal("changeWrapMode"); } - - if (shouldMerge) - this.session.mergeUndoDeltas = true; - else if (mergeableCommands.indexOf(e.command.name) !== -1) - this.sequenceStartTime = Date.now(); }; - this.setKeyboardHandler = function(keyboardHandler, cb) { - if (keyboardHandler && typeof keyboardHandler === "string" && keyboardHandler != "ace") { - this.$keybindingId = keyboardHandler; - var _self = this; - config.loadModule(["keybinding", keyboardHandler], function(module) { - if (_self.$keybindingId == keyboardHandler) - _self.keyBinding.setKeyboardHandler(module && module.handler); - cb && cb(); - }); - } else { - this.$keybindingId = null; - this.keyBinding.setKeyboardHandler(keyboardHandler); - cb && cb(); + EditSession.prototype.adjustWrapLimit = function (desiredLimit, $printMargin) { + var limits = this.$wrapLimitRange; + if (limits.max < 0) + limits = { min: $printMargin, max: $printMargin }; + var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max); + if (wrapLimit != this.$wrapLimit && wrapLimit > 1) { + this.$wrapLimit = wrapLimit; + this.$modified = true; + if (this.$useWrapMode) { + this.$updateWrapData(0, this.getLength() - 1); + this.$resetRowCache(0); + this._signal("changeWrapLimit"); + } + return true; } + return false; }; - this.getKeyboardHandler = function() { - return this.keyBinding.getKeyboardHandler(); + EditSession.prototype.$constrainWrapLimit = function (wrapLimit, min, max) { + if (min) + wrapLimit = Math.max(min, wrapLimit); + if (max) + wrapLimit = Math.min(max, wrapLimit); + return wrapLimit; }; - this.setSession = function(session) { - if (this.session == session) - return; - if (this.curOp) this.endOperation(); - this.curOp = {}; - - var oldSession = this.session; - if (oldSession) { - this.session.off("change", this.$onDocumentChange); - this.session.off("changeMode", this.$onChangeMode); - this.session.off("tokenizerUpdate", this.$onTokenizerUpdate); - this.session.off("changeTabSize", this.$onChangeTabSize); - this.session.off("changeWrapLimit", this.$onChangeWrapLimit); - this.session.off("changeWrapMode", this.$onChangeWrapMode); - this.session.off("changeFold", this.$onChangeFold); - this.session.off("changeFrontMarker", this.$onChangeFrontMarker); - this.session.off("changeBackMarker", this.$onChangeBackMarker); - this.session.off("changeBreakpoint", this.$onChangeBreakpoint); - this.session.off("changeAnnotation", this.$onChangeAnnotation); - this.session.off("changeOverwrite", this.$onCursorChange); - this.session.off("changeScrollTop", this.$onScrollTopChange); - this.session.off("changeScrollLeft", this.$onScrollLeftChange); - - var selection = this.session.getSelection(); - selection.off("changeCursor", this.$onCursorChange); - selection.off("changeSelection", this.$onSelectionChange); - } - - this.session = session; - if (session) { - this.$onDocumentChange = this.onDocumentChange.bind(this); - session.on("change", this.$onDocumentChange); - this.renderer.setSession(session); - - this.$onChangeMode = this.onChangeMode.bind(this); - session.on("changeMode", this.$onChangeMode); - - this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); - session.on("tokenizerUpdate", this.$onTokenizerUpdate); - - this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); - session.on("changeTabSize", this.$onChangeTabSize); - - this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); - session.on("changeWrapLimit", this.$onChangeWrapLimit); - - this.$onChangeWrapMode = this.onChangeWrapMode.bind(this); - session.on("changeWrapMode", this.$onChangeWrapMode); - - this.$onChangeFold = this.onChangeFold.bind(this); - session.on("changeFold", this.$onChangeFold); - - this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this); - this.session.on("changeFrontMarker", this.$onChangeFrontMarker); - - this.$onChangeBackMarker = this.onChangeBackMarker.bind(this); - this.session.on("changeBackMarker", this.$onChangeBackMarker); - - this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this); - this.session.on("changeBreakpoint", this.$onChangeBreakpoint); - - this.$onChangeAnnotation = this.onChangeAnnotation.bind(this); - this.session.on("changeAnnotation", this.$onChangeAnnotation); - - this.$onCursorChange = this.onCursorChange.bind(this); - this.session.on("changeOverwrite", this.$onCursorChange); - - this.$onScrollTopChange = this.onScrollTopChange.bind(this); - this.session.on("changeScrollTop", this.$onScrollTopChange); - - this.$onScrollLeftChange = this.onScrollLeftChange.bind(this); - this.session.on("changeScrollLeft", this.$onScrollLeftChange); - - this.selection = session.getSelection(); - this.selection.on("changeCursor", this.$onCursorChange); - - this.$onSelectionChange = this.onSelectionChange.bind(this); - this.selection.on("changeSelection", this.$onSelectionChange); - - this.onChangeMode(); - - this.onCursorChange(); - - this.onScrollTopChange(); - this.onScrollLeftChange(); - this.onSelectionChange(); - this.onChangeFrontMarker(); - this.onChangeBackMarker(); - this.onChangeBreakpoint(); - this.onChangeAnnotation(); - this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); - this.renderer.updateFull(); - } else { - this.selection = null; - this.renderer.setSession(session); - } - - this._signal("changeSession", { - session: session, - oldSession: oldSession - }); - - this.curOp = null; - - oldSession && oldSession._signal("changeEditor", {oldEditor: this}); - session && session._signal("changeEditor", {editor: this}); - - if (session && !session.destroyed) - session.bgTokenizer.scheduleStart(); - }; - this.getSession = function() { - return this.session; - }; - this.setValue = function(val, cursorPos) { - this.session.doc.setValue(val); - - if (!cursorPos) - this.selectAll(); - else if (cursorPos == 1) - this.navigateFileEnd(); - else if (cursorPos == -1) - this.navigateFileStart(); - - return val; - }; - this.getValue = function() { - return this.session.getValue(); - }; - this.getSelection = function() { - return this.selection; - }; - this.resize = function(force) { - this.renderer.onResize(force); - }; - this.setTheme = function(theme, cb) { - this.renderer.setTheme(theme, cb); - }; - this.getTheme = function() { - return this.renderer.getTheme(); - }; - this.setStyle = function(style) { - this.renderer.setStyle(style); - }; - this.unsetStyle = function(style) { - this.renderer.unsetStyle(style); + EditSession.prototype.getWrapLimit = function () { + return this.$wrapLimit; }; - this.getFontSize = function () { - return this.getOption("fontSize") || - dom.computedStyle(this.container).fontSize; + EditSession.prototype.setWrapLimit = function (limit) { + this.setWrapLimitRange(limit, limit); }; - this.setFontSize = function(size) { - this.setOption("fontSize", size); + EditSession.prototype.getWrapLimitRange = function () { + return { + min: this.$wrapLimitRange.min, + max: this.$wrapLimitRange.max + }; }; - - this.$highlightBrackets = function() { - if (this.$highlightPending) { - return; - } - var self = this; - this.$highlightPending = true; - setTimeout(function () { - self.$highlightPending = false; - var session = self.session; - if (!session || session.destroyed) return; - if (session.$bracketHighlight) { - session.$bracketHighlight.markerIds.forEach(function(id) { - session.removeMarker(id); - }); - session.$bracketHighlight = null; + EditSession.prototype.$updateInternalDataOnChange = function (delta) { + var useWrapMode = this.$useWrapMode; + var action = delta.action; + var start = delta.start; + var end = delta.end; + var firstRow = start.row; + var lastRow = end.row; + var len = lastRow - firstRow; + var removedFolds = null; + this.$updating = true; + if (len != 0) { + if (action === "remove") { + this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len); + var foldLines = this.$foldData; + removedFolds = this.getFoldsInRange(delta); + this.removeFolds(removedFolds); + var foldLine = this.getFoldLine(end.row); + var idx = 0; + if (foldLine) { + foldLine.addRemoveChars(end.row, end.column, start.column - end.column); + foldLine.shiftRow(-len); + var foldLineBefore = this.getFoldLine(firstRow); + if (foldLineBefore && foldLineBefore !== foldLine) { + foldLineBefore.merge(foldLine); + foldLine = foldLineBefore; + } + idx = foldLines.indexOf(foldLine) + 1; + } + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= end.row) { + foldLine.shiftRow(-len); + } + } + lastRow = firstRow; } - var ranges = session.getMatchingBracketRanges(self.getCursorPosition()); - if (!ranges && session.$mode.getMatching) - ranges = session.$mode.getMatching(self.session); - if (!ranges) - return; - - var markerType = "ace_bracket"; - if (!Array.isArray(ranges)) { - ranges = [ranges]; - } else if (ranges.length == 1) { - markerType = "ace_error_bracket"; + else { + var args = Array(len); + args.unshift(firstRow, 0); + var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache; + arr.splice.apply(arr, args); + var foldLines = this.$foldData; + var foldLine = this.getFoldLine(firstRow); + var idx = 0; + if (foldLine) { + var cmp = foldLine.range.compareInside(start.row, start.column); + if (cmp == 0) { + foldLine = foldLine.split(start.row, start.column); + if (foldLine) { + foldLine.shiftRow(len); + foldLine.addRemoveChars(lastRow, 0, end.column - start.column); + } + } + else + if (cmp == -1) { + foldLine.addRemoveChars(firstRow, 0, end.column - start.column); + foldLine.shiftRow(len); + } + idx = foldLines.indexOf(foldLine) + 1; + } + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= firstRow) { + foldLine.shiftRow(len); + } + } } - if (ranges.length == 2) { - if (Range.comparePoints(ranges[0].end, ranges[1].start) == 0) - ranges = [Range.fromPoints(ranges[0].start, ranges[1].end)]; - else if (Range.comparePoints(ranges[0].start, ranges[1].end) == 0) - ranges = [Range.fromPoints(ranges[1].start, ranges[0].end)]; + } + else { + len = Math.abs(delta.start.column - delta.end.column); + if (action === "remove") { + removedFolds = this.getFoldsInRange(delta); + this.removeFolds(removedFolds); + len = -len; } - - session.$bracketHighlight = { - ranges: ranges, - markerIds: ranges.map(function(range) { - return session.addMarker(range, markerType, "text"); - }) - }; - }, 50); - }; - this.$highlightTags = function() { - if (this.$highlightTagPending) - return; - var self = this; - this.$highlightTagPending = true; - setTimeout(function() { - self.$highlightTagPending = false; - - var session = self.session; - if (!session || session.destroyed) return; - - var pos = self.getCursorPosition(); - var iterator = new TokenIterator(self.session, pos.row, pos.column); - var token = iterator.getCurrentToken(); - - if (!token || !/\b(?:tag-open|tag-name)/.test(token.type)) { - session.removeMarker(session.$tagHighlight); - session.$tagHighlight = null; - return; + var foldLine = this.getFoldLine(firstRow); + if (foldLine) { + foldLine.addRemoveChars(firstRow, start.column, len); } - - if (token.type.indexOf("tag-open") !== -1) { - token = iterator.stepForward(); - if (!token) - return; + } + if (useWrapMode && this.$wrapData.length != this.doc.getLength()) { + console.error("doc.getLength() and $wrapData.length have to be the same!"); + } + this.$updating = false; + if (useWrapMode) + this.$updateWrapData(firstRow, lastRow); + else + this.$updateRowLengthCache(firstRow, lastRow); + return removedFolds; + }; + EditSession.prototype.$updateRowLengthCache = function (firstRow, lastRow) { + this.$rowLengthCache[firstRow] = null; + this.$rowLengthCache[lastRow] = null; + }; + EditSession.prototype.$updateWrapData = function (firstRow, lastRow) { + var lines = this.doc.getAllLines(); + var tabSize = this.getTabSize(); + var wrapData = this.$wrapData; + var wrapLimit = this.$wrapLimit; + var tokens; + var foldLine; + var row = firstRow; + lastRow = Math.min(lastRow, lines.length - 1); + while (row <= lastRow) { + foldLine = this.getFoldLine(row, foldLine); + if (!foldLine) { + tokens = this.$getDisplayTokens(lines[row]); + wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row++; } - - var tag = token.value; - var currentTag = token.value; - var depth = 0; - var prevToken = iterator.stepBackward(); - - if (prevToken.value === '<'){ - do { - prevToken = token; - token = iterator.stepForward(); - - if (token) { - if (token.type.indexOf('tag-name') !== -1) { - currentTag = token.value; - if (tag === currentTag) { - if (prevToken.value === '<') { - depth++; - } else if (prevToken.value === '') { // self closing tag - depth--; + else { + tokens = []; + foldLine.walk(function (placeholder, row, column, lastColumn) { + var walkTokens; + if (placeholder != null) { + walkTokens = this.$getDisplayTokens(placeholder, tokens.length); + walkTokens[0] = PLACEHOLDER_START; + for (var i = 1; i < walkTokens.length; i++) { + walkTokens[i] = PLACEHOLDER_BODY; } } - - } while (token && depth >= 0); - } else { - do { - token = prevToken; - prevToken = iterator.stepBackward(); - - if (token) { - if (token.type.indexOf('tag-name') !== -1) { - if (tag === token.value) { - if (prevToken.value === '<') { - depth++; - } else if (prevToken.value === '') { // self closing tag - var stepCount = 0; - var tmpToken = prevToken; - while (tmpToken) { - if (tmpToken.type.indexOf('tag-name') !== -1 && tmpToken.value === tag) { - depth--; - break; - } else if (tmpToken.value === '<') { - break; - } - tmpToken = iterator.stepBackward(); - stepCount++; - } - for (var i = 0; i < stepCount; i++) { - iterator.stepForward(); - } - } + else { + walkTokens = this.$getDisplayTokens(lines[row].substring(lastColumn, column), tokens.length); } - } while (prevToken && depth <= 0); - iterator.stepForward(); - } - - if (!token) { - session.removeMarker(session.$tagHighlight); - session.$tagHighlight = null; - return; + tokens = tokens.concat(walkTokens); + }.bind(this), foldLine.end.row, lines[foldLine.end.row].length + 1); + wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row = foldLine.end.row + 1; } - - var row = iterator.getCurrentTokenRow(); - var column = iterator.getCurrentTokenColumn(); - var range = new Range(row, column, row, column+token.value.length); - var sbm = session.$backMarkers[session.$tagHighlight]; - if (session.$tagHighlight && sbm != undefined && range.compareRange(sbm.range) !== 0) { - session.removeMarker(session.$tagHighlight); - session.$tagHighlight = null; - } - - if (!session.$tagHighlight) - session.$tagHighlight = session.addMarker(range, "ace_bracket", "text"); - }, 50); - }; - this.focus = function() { - this.textInput.focus(); - }; - this.isFocused = function() { - return this.textInput.isFocused(); - }; - this.blur = function() { - this.textInput.blur(); - }; - this.onFocus = function(e) { - if (this.$isFocused) - return; - this.$isFocused = true; - this.renderer.showCursor(); - this.renderer.visualizeFocus(); - this._emit("focus", e); - }; - this.onBlur = function(e) { - if (!this.$isFocused) - return; - this.$isFocused = false; - this.renderer.hideCursor(); - this.renderer.visualizeBlur(); - this._emit("blur", e); - }; - - this.$cursorChange = function() { - this.renderer.updateCursor(); - this.$highlightBrackets(); - this.$highlightTags(); - this.$updateHighlightActiveLine(); + } }; - this.onDocumentChange = function(delta) { - var wrap = this.session.$useWrapMode; - var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity); - this.renderer.updateLines(delta.start.row, lastRow, wrap); - - this._signal("change", delta); - this.$cursorChange(); - }; - - this.onTokenizerUpdate = function(e) { - var rows = e.data; - this.renderer.updateLines(rows.first, rows.last); + EditSession.prototype.$computeWrapSplits = function (tokens, wrapLimit, tabSize) { + if (tokens.length == 0) { + return []; + } + var splits = []; + var displayLength = tokens.length; + var lastSplit = 0, lastDocSplit = 0; + var isCode = this.$wrapAsCode; + var indentedSoftWrap = this.$indentedSoftWrap; + var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8) + || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2); + function getWrapIndent() { + var indentation = 0; + if (maxIndent === 0) + return indentation; + if (indentedSoftWrap) { + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token == SPACE) + indentation += 1; + else if (token == TAB) + indentation += tabSize; + else if (token == TAB_SPACE) + continue; + else + break; + } + } + if (isCode && indentedSoftWrap !== false) + indentation += tabSize; + return Math.min(indentation, maxIndent); + } + function addSplit(screenPos) { + var len = screenPos - lastSplit; + for (var i = lastSplit; i < screenPos; i++) { + var ch = tokens[i]; + if (ch === 12 || ch === 2) + len -= 1; + } + if (!splits.length) { + indent = getWrapIndent(); + splits.indent = indent; + } + lastDocSplit += len; + splits.push(lastDocSplit); + lastSplit = screenPos; + } + var indent = 0; + while (displayLength - lastSplit > wrapLimit - indent) { + var split = lastSplit + wrapLimit - indent; + if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) { + addSplit(split); + continue; + } + if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) { + for (split; split != lastSplit - 1; split--) { + if (tokens[split] == PLACEHOLDER_START) { + break; + } + } + if (split > lastSplit) { + addSplit(split); + continue; + } + split = lastSplit + wrapLimit; + for (split; split < tokens.length; split++) { + if (tokens[split] != PLACEHOLDER_BODY) { + break; + } + } + if (split == tokens.length) { + break; // Breaks the while-loop. + } + addSplit(split); + continue; + } + var minSplit = Math.max(split - (wrapLimit - (wrapLimit >> 2)), lastSplit - 1); + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split--; + } + if (isCode) { + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split--; + } + while (split > minSplit && tokens[split] == PUNCTUATION) { + split--; + } + } + else { + while (split > minSplit && tokens[split] < SPACE) { + split--; + } + } + if (split > minSplit) { + addSplit(++split); + continue; + } + split = lastSplit + wrapLimit; + if (tokens[split] == CHAR_EXT) + split--; + addSplit(split - indent); + } + return splits; }; - - - this.onScrollTopChange = function() { - this.renderer.scrollToY(this.session.getScrollTop()); + EditSession.prototype.$getDisplayTokens = function (str, offset) { + var arr = []; + var tabSize; + offset = offset || 0; + for (var i = 0; i < str.length; i++) { + var c = str.charCodeAt(i); + if (c == 9) { + tabSize = this.getScreenTabSize(arr.length + offset); + arr.push(TAB); + for (var n = 1; n < tabSize; n++) { + arr.push(TAB_SPACE); + } + } + else if (c == 32) { + arr.push(SPACE); + } + else if ((c > 39 && c < 48) || (c > 57 && c < 64)) { + arr.push(PUNCTUATION); + } + else if (c >= 0x1100 && isFullWidth(c)) { + arr.push(CHAR, CHAR_EXT); + } + else { + arr.push(CHAR); + } + } + return arr; }; - - this.onScrollLeftChange = function() { - this.renderer.scrollToX(this.session.getScrollLeft()); + EditSession.prototype.$getStringScreenWidth = function (str, maxScreenColumn, screenColumn) { + if (maxScreenColumn == 0) + return [0, 0]; + if (maxScreenColumn == null) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charCodeAt(column); + if (c == 9) { + screenColumn += this.getScreenTabSize(screenColumn); + } + else if (c >= 0x1100 && isFullWidth(c)) { + screenColumn += 2; + } + else { + screenColumn += 1; + } + if (screenColumn > maxScreenColumn) { + break; + } + } + return [screenColumn, column]; }; - this.onCursorChange = function() { - this.$cursorChange(); - this._signal("changeSelection"); + EditSession.prototype.getRowLength = function (row) { + var h = 1; + if (this.lineWidgets) + h += this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + if (!this.$useWrapMode || !this.$wrapData[row]) + return h; + else + return this.$wrapData[row].length + h; }; - - this.$updateHighlightActiveLine = function() { - var session = this.getSession(); - - var highlight; - if (this.$highlightActiveLine) { - if (this.$selectionStyle != "line" || !this.selection.isMultiLine()) - highlight = this.getCursorPosition(); - if (this.renderer.theme && this.renderer.theme.$selectionColorConflict && !this.selection.isEmpty()) - highlight = false; - if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1)) - highlight = false; + EditSession.prototype.getRowLineCount = function (row) { + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1; } - - if (session.$highlightLineMarker && !highlight) { - session.removeMarker(session.$highlightLineMarker.id); - session.$highlightLineMarker = null; - } else if (!session.$highlightLineMarker && highlight) { - var range = new Range(highlight.row, highlight.column, highlight.row, Infinity); - range.id = session.addMarker(range, "ace_active-line", "screenLine"); - session.$highlightLineMarker = range; - } else if (highlight) { - session.$highlightLineMarker.start.row = highlight.row; - session.$highlightLineMarker.end.row = highlight.row; - session.$highlightLineMarker.start.column = highlight.column; - session._signal("changeBackMarker"); + else { + return this.$wrapData[row].length + 1; } }; - - this.onSelectionChange = function(e) { - var session = this.session; - - if (session.$selectionMarker) { - session.removeMarker(session.$selectionMarker); + EditSession.prototype.getRowWrapIndent = function (screenRow) { + if (this.$useWrapMode) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + var splits = this.$wrapData[pos.row]; + return splits.length && splits[0] < pos.column ? splits.indent : 0; } - session.$selectionMarker = null; - - if (!this.selection.isEmpty()) { - var range = this.selection.getRange(); - var style = this.getSelectionStyle(); - session.$selectionMarker = session.addMarker(range, "ace_selection", style); - } else { - this.$updateHighlightActiveLine(); + else { + return 0; } - - var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp(); - this.session.highlight(re); - - this._signal("changeSelection"); }; - - this.$getSelectionHighLightRegexp = function() { - var session = this.session; - - var selection = this.getSelectionRange(); - if (selection.isEmpty() || selection.isMultiLine()) - return; - - var startColumn = selection.start.column; - var endColumn = selection.end.column; - var line = session.getLine(selection.start.row); - - var needle = line.substring(startColumn, endColumn); - if (needle.length > 5000 || !/[\w\d]/.test(needle)) - return; - - var re = this.$search.$assembleRegExp({ - wholeWord: true, - caseSensitive: true, - needle: needle - }); - - var wordWithBoundary = line.substring(startColumn - 1, endColumn + 1); - if (!re.test(wordWithBoundary)) - return; - - return re; + EditSession.prototype.getScreenLastRowColumn = function (screenRow) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + return this.documentToScreenColumn(pos.row, pos.column); }; - - - this.onChangeFrontMarker = function() { - this.renderer.updateFrontMarkers(); + EditSession.prototype.getDocumentLastRowColumn = function (docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.getScreenLastRowColumn(screenRow); }; - - this.onChangeBackMarker = function() { - this.renderer.updateBackMarkers(); + EditSession.prototype.getDocumentLastRowColumnPosition = function (docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10); }; - - - this.onChangeBreakpoint = function() { - this.renderer.updateBreakpoints(); + EditSession.prototype.getRowSplitData = function (row) { + if (!this.$useWrapMode) { + return undefined; + } + else { + return this.$wrapData[row]; + } }; - - this.onChangeAnnotation = function() { - this.renderer.setAnnotations(this.session.getAnnotations()); - }; - - - this.onChangeMode = function(e) { - this.renderer.updateText(); - this._emit("changeMode", e); - }; - - - this.onChangeWrapLimit = function() { - this.renderer.updateFull(); - }; - - this.onChangeWrapMode = function() { - this.renderer.onResize(true); + EditSession.prototype.getScreenTabSize = function (screenColumn) { + return this.$tabSize - (screenColumn % this.$tabSize | 0); }; - - - this.onChangeFold = function() { - this.$updateHighlightActiveLine(); - this.renderer.updateFull(); + EditSession.prototype.screenToDocumentRow = function (screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).row; }; - this.getSelectedText = function() { - return this.session.getTextRange(this.getSelectionRange()); + EditSession.prototype.screenToDocumentColumn = function (screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).column; }; - this.getCopyText = function() { - var text = this.getSelectedText(); - var nl = this.session.doc.getNewLineCharacter(); - var copyLine= false; - if (!text && this.$copyWithEmptySelection) { - copyLine = true; - var ranges = this.selection.getAllRanges(); - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i]; - if (i && ranges[i - 1].start.row == range.start.row) - continue; - text += this.session.getLine(range.start.row) + nl; - } + EditSession.prototype.screenToDocumentPosition = function (screenRow, screenColumn, offsetX) { + if (screenRow < 0) + return { row: 0, column: 0 }; + var line; + var docRow = 0; + var docColumn = 0; + var column; + var row = 0; + var rowLength = 0; + var rowCache = this.$screenRowCache; + var i = this.$getRowCacheIndex(rowCache, screenRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var docRow = this.$docRowCache[i]; + var doCache = screenRow > rowCache[l - 1]; } - var e = {text: text}; - this._signal("copy", e); - clipboard.lineMode = copyLine ? e.text : false; - return e.text; - }; - this.onCopy = function() { - this.commands.exec("copy", this); - }; - this.onCut = function() { - this.commands.exec("cut", this); - }; - this.onPaste = function(text, event) { - var e = {text: text, event: event}; - this.commands.exec("paste", this, e); - }; - - this.$handlePaste = function(e) { - if (typeof e == "string") - e = {text: e}; - this._signal("paste", e); - var text = e.text; - - var lineMode = text === clipboard.lineMode; - var session = this.session; - if (!this.inMultiSelectMode || this.inVirtualSelectionMode) { - if (lineMode) - session.insert({ row: this.selection.lead.row, column: 0 }, text); - else - this.insert(text); - } else if (lineMode) { - this.selection.rangeList.ranges.forEach(function(range) { - session.insert({ row: range.start.row, column: 0 }, text); - }); - } else { - var lines = text.split(/\r\n|\r|\n/); - var ranges = this.selection.rangeList.ranges; - - var isFullLine = lines.length == 2 && (!lines[0] || !lines[1]); - if (lines.length != ranges.length || isFullLine) - return this.commands.exec("insertstring", this, text); - - for (var i = ranges.length; i--;) { - var range = ranges[i]; - if (!range.isEmpty()) - session.remove(range); - - session.insert(range.start, lines[i]); - } + else { + var doCache = !l; } - }; - - this.execCommand = function(command, args) { - return this.commands.exec(command, this, args); - }; - this.insert = function(text, pasted) { - var session = this.session; - var mode = session.getMode(); - var cursor = this.getCursorPosition(); - - if (this.getBehavioursEnabled() && !pasted) { - var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); - if (transform) { - if (text !== transform.text) { - if (!this.inVirtualSelectionMode) { - this.session.mergeUndoDeltas = false; - this.mergeNextCommand = false; - } + var maxRow = this.getLength() - 1; + var foldLine = this.getNextFoldLine(docRow); + var foldStart = foldLine ? foldLine.start.row : Infinity; + while (row <= screenRow) { + rowLength = this.getRowLength(docRow); + if (row + rowLength > screenRow || docRow >= maxRow) { + break; + } + else { + row += rowLength; + docRow++; + if (docRow > foldStart) { + docRow = foldLine.end.row + 1; + foldLine = this.getNextFoldLine(docRow, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; } - text = transform.text; - } - } - - if (text == "\t") - text = this.session.getTabString(); - if (!this.selection.isEmpty()) { - var range = this.getSelectionRange(); - cursor = this.session.remove(range); - this.clearSelection(); - } - else if (this.session.getOverwrite() && text.indexOf("\n") == -1) { - var range = new Range.fromPoints(cursor, cursor); - range.end.column += text.length; - this.session.remove(range); - } - - if (text == "\n" || text == "\r\n") { - var line = session.getLine(cursor.row); - if (cursor.column > line.search(/\S|$/)) { - var d = line.substr(cursor.column).search(/\S|$/); - session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d); + if (doCache) { + this.$docRowCache.push(docRow); + this.$screenRowCache.push(row); } } - this.clearSelection(); - - var start = cursor.column; - var lineState = session.getState(cursor.row); - var line = session.getLine(cursor.row); - var shouldOutdent = mode.checkOutdent(lineState, line, text); - session.insert(cursor, text); - - if (transform && transform.selection) { - if (transform.selection.length == 2) { // Transform relative to the current column - this.selection.setSelectionRange( - new Range(cursor.row, start + transform.selection[0], - cursor.row, start + transform.selection[1])); - } else { // Transform relative to the current row. - this.selection.setSelectionRange( - new Range(cursor.row + transform.selection[0], - transform.selection[1], - cursor.row + transform.selection[2], - transform.selection[3])); - } + if (foldLine && foldLine.start.row <= docRow) { + line = this.getFoldDisplayLine(foldLine); + docRow = foldLine.start.row; } - if (this.$enableAutoIndent) { - if (session.getDocument().isNewLine(text)) { - var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); - - session.insert({row: cursor.row+1, column: 0}, lineIndent); - } - if (shouldOutdent) - mode.autoOutdent(lineState, session, cursor.row); + else if (row + rowLength <= screenRow || docRow > maxRow) { + return { + row: maxRow, + column: this.getLine(maxRow).length + }; } - }; - - this.autoIndent = function () { - var session = this.session; - var mode = session.getMode(); - - var startRow, endRow; - if (this.selection.isEmpty()) { - startRow = 0; - endRow = session.doc.getLength() - 1; - } else { - var selectedRange = this.getSelectionRange(); - - startRow = selectedRange.start.row; - endRow = selectedRange.end.row; + else { + line = this.getLine(docRow); + foldLine = null; } - - var prevLineState = ""; - var prevLine = ""; - var lineIndent = ""; - var line, currIndent, range; - var tab = session.getTabString(); - - for (var row = startRow; row <= endRow; row++) { - if (row > 0) { - prevLineState = session.getState(row - 1); - prevLine = session.getLine(row - 1); - lineIndent = mode.getNextLineIndent(prevLineState, prevLine, tab); - } - - line = session.getLine(row); - currIndent = mode.$getIndent(line); - if (lineIndent !== currIndent) { - if (currIndent.length > 0) { - range = new Range(row, 0, row, currIndent.length); - session.remove(range); - } - if (lineIndent.length > 0) { - session.insert({row: row, column: 0}, lineIndent); + var wrapIndent = 0, splitIndex = Math.floor(screenRow - row); + if (this.$useWrapMode) { + var splits = this.$wrapData[docRow]; + if (splits) { + column = splits[splitIndex]; + if (splitIndex > 0 && splits.length) { + wrapIndent = splits.indent; + docColumn = splits[splitIndex - 1] || splits[splits.length - 1]; + line = line.substring(docColumn); } } - - mode.autoOutdent(prevLineState, session, row); } + if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex)) + screenColumn = this.$bidiHandler.offsetToCol(offsetX); + docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1]; + if (this.$useWrapMode && docColumn >= column) + docColumn = column - 1; + if (foldLine) + return foldLine.idxToPosition(docColumn); + return { row: docRow, column: docColumn }; }; - - - this.onTextInput = function(text, composition) { - if (!composition) - return this.keyBinding.onTextInput(text); - - this.startOperation({command: { name: "insertstring" }}); - var applyComposition = this.applyComposition.bind(this, text, composition); - if (this.selection.rangeCount) - this.forEachSelection(applyComposition); + EditSession.prototype.documentToScreenPosition = function (docRow, docColumn) { + if (typeof docColumn === "undefined") + var pos = this.$clipPositionToDocument(/**@type{Point}*/ (docRow).row, /**@type{Point}*/ (docRow).column); else - applyComposition(); - this.endOperation(); - }; - - this.applyComposition = function(text, composition) { - if (composition.extendLeft || composition.extendRight) { - var r = this.selection.getRange(); - r.start.column -= composition.extendLeft; - r.end.column += composition.extendRight; - if (r.start.column < 0) { - r.start.row--; - r.start.column += this.session.getLine(r.start.row).length + 1; - } - this.selection.setRange(r); - if (!text && !r.isEmpty()) - this.remove(); + pos = this.$clipPositionToDocument(/**@type{number}*/ (docRow), docColumn); + docRow = pos.row; + docColumn = pos.column; + var screenRow = 0; + var foldStartRow = null; + var fold = null; + fold = this.getFoldAt(docRow, docColumn, 1); + if (fold) { + docRow = fold.start.row; + docColumn = fold.start.column; } - if (text || !this.selection.isEmpty()) - this.insert(text, true); - if (composition.restoreStart || composition.restoreEnd) { - var r = this.selection.getRange(); - r.start.column -= composition.restoreStart; - r.end.column -= composition.restoreEnd; - this.selection.setRange(r); + var rowEnd, row = 0; + var rowCache = this.$docRowCache; + var i = this.$getRowCacheIndex(rowCache, docRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var screenRow = this.$screenRowCache[i]; + var doCache = docRow > rowCache[l - 1]; } - }; - - this.onCommandKey = function(e, hashId, keyCode) { - return this.keyBinding.onCommandKey(e, hashId, keyCode); - }; - this.setOverwrite = function(overwrite) { - this.session.setOverwrite(overwrite); - }; - this.getOverwrite = function() { - return this.session.getOverwrite(); - }; - this.toggleOverwrite = function() { - this.session.toggleOverwrite(); - }; - this.setScrollSpeed = function(speed) { - this.setOption("scrollSpeed", speed); - }; - this.getScrollSpeed = function() { - return this.getOption("scrollSpeed"); - }; - this.setDragDelay = function(dragDelay) { - this.setOption("dragDelay", dragDelay); - }; - this.getDragDelay = function() { - return this.getOption("dragDelay"); - }; - this.setSelectionStyle = function(val) { - this.setOption("selectionStyle", val); - }; - this.getSelectionStyle = function() { - return this.getOption("selectionStyle"); - }; - this.setHighlightActiveLine = function(shouldHighlight) { - this.setOption("highlightActiveLine", shouldHighlight); - }; - this.getHighlightActiveLine = function() { - return this.getOption("highlightActiveLine"); - }; - this.setHighlightGutterLine = function(shouldHighlight) { - this.setOption("highlightGutterLine", shouldHighlight); - }; - - this.getHighlightGutterLine = function() { - return this.getOption("highlightGutterLine"); - }; - this.setHighlightSelectedWord = function(shouldHighlight) { - this.setOption("highlightSelectedWord", shouldHighlight); - }; - this.getHighlightSelectedWord = function() { - return this.$highlightSelectedWord; - }; - - this.setAnimatedScroll = function(shouldAnimate){ - this.renderer.setAnimatedScroll(shouldAnimate); - }; - - this.getAnimatedScroll = function(){ - return this.renderer.getAnimatedScroll(); - }; - this.setShowInvisibles = function(showInvisibles) { - this.renderer.setShowInvisibles(showInvisibles); - }; - this.getShowInvisibles = function() { - return this.renderer.getShowInvisibles(); - }; - - this.setDisplayIndentGuides = function(display) { - this.renderer.setDisplayIndentGuides(display); - }; - - this.getDisplayIndentGuides = function() { - return this.renderer.getDisplayIndentGuides(); - }; - this.setShowPrintMargin = function(showPrintMargin) { - this.renderer.setShowPrintMargin(showPrintMargin); - }; - this.getShowPrintMargin = function() { - return this.renderer.getShowPrintMargin(); - }; - this.setPrintMarginColumn = function(showPrintMargin) { - this.renderer.setPrintMarginColumn(showPrintMargin); - }; - this.getPrintMarginColumn = function() { - return this.renderer.getPrintMarginColumn(); - }; - this.setReadOnly = function(readOnly) { - this.setOption("readOnly", readOnly); - }; - this.getReadOnly = function() { - return this.getOption("readOnly"); - }; - this.setBehavioursEnabled = function (enabled) { - this.setOption("behavioursEnabled", enabled); - }; - this.getBehavioursEnabled = function () { - return this.getOption("behavioursEnabled"); - }; - this.setWrapBehavioursEnabled = function (enabled) { - this.setOption("wrapBehavioursEnabled", enabled); - }; - this.getWrapBehavioursEnabled = function () { - return this.getOption("wrapBehavioursEnabled"); - }; - this.setShowFoldWidgets = function(show) { - this.setOption("showFoldWidgets", show); - - }; - this.getShowFoldWidgets = function() { - return this.getOption("showFoldWidgets"); - }; - - this.setFadeFoldWidgets = function(fade) { - this.setOption("fadeFoldWidgets", fade); - }; - - this.getFadeFoldWidgets = function() { - return this.getOption("fadeFoldWidgets"); - }; - this.remove = function(dir) { - if (this.selection.isEmpty()){ - if (dir == "left") - this.selection.selectLeft(); - else - this.selection.selectRight(); + else { + var doCache = !l; } - - var range = this.getSelectionRange(); - if (this.getBehavioursEnabled()) { - var session = this.session; - var state = session.getState(range.start.row); - var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); - - if (range.end.column === 0) { - var text = session.getTextRange(range); - if (text[text.length - 1] == "\n") { - var line = session.getLine(range.end.row); - if (/^\s+$/.test(line)) { - range.end.column = line.length; - } + var foldLine = this.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + while (row < docRow) { + if (row >= foldStart) { + rowEnd = foldLine.end.row + 1; + if (rowEnd > docRow) + break; + foldLine = this.getNextFoldLine(rowEnd, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + else { + rowEnd = row + 1; + } + screenRow += this.getRowLength(row); + row = rowEnd; + if (doCache) { + this.$docRowCache.push(row); + this.$screenRowCache.push(screenRow); + } + } + var textLine = ""; + if (foldLine && row >= foldStart) { + textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn); + foldStartRow = foldLine.start.row; + } + else { + textLine = this.getLine(docRow).substring(0, docColumn); + foldStartRow = docRow; + } + var wrapIndent = 0; + if (this.$useWrapMode) { + var wrapRow = this.$wrapData[foldStartRow]; + if (wrapRow) { + var screenRowOffset = 0; + while (textLine.length >= wrapRow[screenRowOffset]) { + screenRow++; + screenRowOffset++; } + textLine = textLine.substring(wrapRow[screenRowOffset - 1] || 0, textLine.length); + wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0; } - if (new_range) - range = new_range; } - - this.session.remove(range); - this.clearSelection(); - }; - this.removeWordRight = function() { - if (this.selection.isEmpty()) - this.selection.selectWordRight(); - - this.session.remove(this.getSelectionRange()); - this.clearSelection(); + if (this.lineWidgets && this.lineWidgets[row] && this.lineWidgets[row].rowsAbove) + screenRow += this.lineWidgets[row].rowsAbove; + return { + row: screenRow, + column: wrapIndent + this.$getStringScreenWidth(textLine)[0] + }; }; - this.removeWordLeft = function() { - if (this.selection.isEmpty()) - this.selection.selectWordLeft(); - - this.session.remove(this.getSelectionRange()); - this.clearSelection(); + EditSession.prototype.documentToScreenColumn = function (row, docColumn) { + return this.documentToScreenPosition(row, docColumn).column; }; - this.removeToLineStart = function() { - if (this.selection.isEmpty()) - this.selection.selectLineStart(); - if (this.selection.isEmpty()) - this.selection.selectLeft(); - this.session.remove(this.getSelectionRange()); - this.clearSelection(); + EditSession.prototype.documentToScreenRow = function (docRow, docColumn) { + return this.documentToScreenPosition(docRow, docColumn).row; }; - this.removeToLineEnd = function() { - if (this.selection.isEmpty()) - this.selection.selectLineEnd(); - - var range = this.getSelectionRange(); - if (range.start.column == range.end.column && range.start.row == range.end.row) { - range.end.column = 0; - range.end.row++; + EditSession.prototype.getScreenLength = function () { + var screenRows = 0; + var fold = null; + if (!this.$useWrapMode) { + screenRows = this.getLength(); + var foldData = this.$foldData; + for (var i = 0; i < foldData.length; i++) { + fold = foldData[i]; + screenRows -= fold.end.row - fold.start.row; + } } - - this.session.remove(range); - this.clearSelection(); - }; - this.splitLine = function() { - if (!this.selection.isEmpty()) { - this.session.remove(this.getSelectionRange()); - this.clearSelection(); + else { + var lastRow = this.$wrapData.length; + var row = 0, i = 0; + var fold = this.$foldData[i++]; + var foldStart = fold ? fold.start.row : Infinity; + while (row < lastRow) { + var splits = this.$wrapData[row]; + screenRows += splits ? splits.length + 1 : 1; + row++; + if (row > foldStart) { + row = fold.end.row + 1; + fold = this.$foldData[i++]; + foldStart = fold ? fold.start.row : Infinity; + } + } } - - var cursor = this.getCursorPosition(); - this.insert("\n"); - this.moveCursorToPosition(cursor); + if (this.lineWidgets) + screenRows += this.$getWidgetScreenLength(); + return screenRows; }; - this.transposeLetters = function() { - if (!this.selection.isEmpty()) { - return; - } - - var cursor = this.getCursorPosition(); - var column = cursor.column; - if (column === 0) + EditSession.prototype.$setFontMetrics = function (fm) { + if (!this.$enableVarChar) return; - - var line = this.session.getLine(cursor.row); - var swap, range; - if (column < line.length) { - swap = line.charAt(column) + line.charAt(column-1); - range = new Range(cursor.row, column-1, cursor.row, column+1); - } - else { - swap = line.charAt(column-1) + line.charAt(column-2); - range = new Range(cursor.row, column-2, cursor.row, column); - } - this.session.replace(range, swap); - this.session.selection.moveToPosition(range.end); + this.$getStringScreenWidth = function (str, maxScreenColumn, screenColumn) { + if (maxScreenColumn === 0) + return [0, 0]; + if (!maxScreenColumn) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charAt(column); + if (c === "\t") { + screenColumn += this.getScreenTabSize(screenColumn); + } + else { + screenColumn += fm.getCharacterWidth(c); + } + if (screenColumn > maxScreenColumn) { + break; + } + } + return [screenColumn, column]; + }; }; - this.toLowerCase = function() { - var originalRange = this.getSelectionRange(); - if (this.selection.isEmpty()) { - this.selection.selectWord(); + EditSession.prototype.getPrecedingCharacter = function () { + var pos = this.selection.getCursor(); + if (pos.column === 0) { + return pos.row === 0 ? "" : this.doc.getNewLineCharacter(); } - - var range = this.getSelectionRange(); - var text = this.session.getTextRange(range); - this.session.replace(range, text.toLowerCase()); - this.selection.setSelectionRange(originalRange); + var currentLine = this.getLine(pos.row); + return currentLine[pos.column - 1]; }; - this.toUpperCase = function() { - var originalRange = this.getSelectionRange(); - if (this.selection.isEmpty()) { - this.selection.selectWord(); + EditSession.prototype.destroy = function () { + if (!this.destroyed) { + this.bgTokenizer.setDocument(null); + this.bgTokenizer.cleanup(); + this.destroyed = true; } - - var range = this.getSelectionRange(); - var text = this.session.getTextRange(range); - this.session.replace(range, text.toUpperCase()); - this.selection.setSelectionRange(originalRange); + this.endOperation(); + this.$stopWorker(); + this.removeAllListeners(); + if (this.doc) { + this.doc.off("change", this.$onChange); + } + if (this.selection) { + this.selection.off("changeCursor", this.$onSelectionChange); + this.selection.off("changeSelection", this.$onSelectionChange); + } + this.selection.detach(); }; - this.indent = function() { - var session = this.session; - var range = this.getSelectionRange(); - - if (range.start.row < range.end.row) { - var rows = this.$getSelectedRows(); - session.indentRows(rows.first, rows.last, "\t"); - return; - } else if (range.start.column < range.end.column) { - var text = session.getTextRange(range); - if (!/^\s+$/.test(text)) { - var rows = this.$getSelectedRows(); - session.indentRows(rows.first, rows.last, "\t"); + return EditSession; +}()); +EditSession.$uid = 0; +EditSession.prototype.$modes = config.$modes; +EditSession.prototype.getValue = EditSession.prototype.toString; +EditSession.prototype.$defaultUndoManager = { + undo: function () { }, + redo: function () { }, + hasUndo: function () { }, + hasRedo: function () { }, + reset: function () { }, + add: function () { }, + addSelection: function () { }, + startNewGroup: function () { }, + addSession: function () { } +}; +EditSession.prototype.$overwrite = false; +EditSession.prototype.$mode = null; +EditSession.prototype.$modeId = null; +EditSession.prototype.$scrollTop = 0; +EditSession.prototype.$scrollLeft = 0; +EditSession.prototype.$wrapLimit = 80; +EditSession.prototype.$useWrapMode = false; +EditSession.prototype.$wrapLimitRange = { + min: null, + max: null +}; +EditSession.prototype.lineWidgets = null; +EditSession.prototype.isFullWidth = isFullWidth; +oop.implement(EditSession.prototype, EventEmitter); +var CHAR = 1, CHAR_EXT = 2, PLACEHOLDER_START = 3, PLACEHOLDER_BODY = 4, PUNCTUATION = 9, SPACE = 10, TAB = 11, TAB_SPACE = 12; +function isFullWidth(c) { + if (c < 0x1100) + return false; + return c >= 0x1100 && c <= 0x115F || + c >= 0x11A3 && c <= 0x11A7 || + c >= 0x11FA && c <= 0x11FF || + c >= 0x2329 && c <= 0x232A || + c >= 0x2E80 && c <= 0x2E99 || + c >= 0x2E9B && c <= 0x2EF3 || + c >= 0x2F00 && c <= 0x2FD5 || + c >= 0x2FF0 && c <= 0x2FFB || + c >= 0x3000 && c <= 0x303E || + c >= 0x3041 && c <= 0x3096 || + c >= 0x3099 && c <= 0x30FF || + c >= 0x3105 && c <= 0x312D || + c >= 0x3131 && c <= 0x318E || + c >= 0x3190 && c <= 0x31BA || + c >= 0x31C0 && c <= 0x31E3 || + c >= 0x31F0 && c <= 0x321E || + c >= 0x3220 && c <= 0x3247 || + c >= 0x3250 && c <= 0x32FE || + c >= 0x3300 && c <= 0x4DBF || + c >= 0x4E00 && c <= 0xA48C || + c >= 0xA490 && c <= 0xA4C6 || + c >= 0xA960 && c <= 0xA97C || + c >= 0xAC00 && c <= 0xD7A3 || + c >= 0xD7B0 && c <= 0xD7C6 || + c >= 0xD7CB && c <= 0xD7FB || + c >= 0xF900 && c <= 0xFAFF || + c >= 0xFE10 && c <= 0xFE19 || + c >= 0xFE30 && c <= 0xFE52 || + c >= 0xFE54 && c <= 0xFE66 || + c >= 0xFE68 && c <= 0xFE6B || + c >= 0xFF01 && c <= 0xFF60 || + c >= 0xFFE0 && c <= 0xFFE6; +} +require("./edit_session/folding").Folding.call(EditSession.prototype); +require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype); +config.defineOptions(EditSession.prototype, "session", { + wrap: { + set: function (value) { + if (!value || value == "off") + value = false; + else if (value == "free") + value = true; + else if (value == "printMargin") + value = -1; + else if (typeof value == "string") + value = parseInt(value, 10) || false; + if (this.$wrap == value) return; + this.$wrap = value; + if (!value) { + this.setUseWrapMode(false); } - } - - var line = session.getLine(range.start.row); - var position = range.start; - var size = session.getTabSize(); - var column = session.documentToScreenColumn(position.row, position.column); - - if (this.session.getUseSoftTabs()) { - var count = (size - column % size); - var indentString = lang.stringRepeat(" ", count); - } else { - var count = column % size; - while (line[range.start.column - 1] == " " && count) { - range.start.column--; - count--; + else { + var col = typeof value == "number" ? value : null; + this.setWrapLimitRange(col, col); + this.setUseWrapMode(true); } - this.selection.setSelectionRange(range); - indentString = "\t"; - } - return this.insert(indentString); - }; - this.blockIndent = function() { - var rows = this.$getSelectedRows(); - this.session.indentRows(rows.first, rows.last, "\t"); - }; - this.blockOutdent = function() { - var selection = this.session.getSelection(); - this.session.outdentRows(selection.getRange()); - }; - this.sortLines = function() { - var rows = this.$getSelectedRows(); - var session = this.session; - - var lines = []; - for (var i = rows.first; i <= rows.last; i++) - lines.push(session.getLine(i)); + }, + get: function () { + if (this.getUseWrapMode()) { + if (this.$wrap == -1) + return "printMargin"; + if (!this.getWrapLimitRange().min) + return "free"; + return this.$wrap; + } + return "off"; + }, + handlesSet: true + }, + wrapMethod: { + set: function (val) { + val = val == "auto" + ? this.$mode.type != "text" + : val != "text"; + if (val != this.$wrapAsCode) { + this.$wrapAsCode = val; + if (this.$useWrapMode) { + this.$useWrapMode = false; + this.setUseWrapMode(true); + } + } + }, + initialValue: "auto" + }, + indentedSoftWrap: { + set: function () { + if (this.$useWrapMode) { + this.$useWrapMode = false; + this.setUseWrapMode(true); + } + }, + initialValue: true + }, + firstLineNumber: { + set: function () { this._signal("changeBreakpoint"); }, + initialValue: 1 + }, + useWorker: { + set: function (useWorker) { + this.$useWorker = useWorker; + this.$stopWorker(); + if (useWorker) + this.$startWorker(); + }, + initialValue: true + }, + useSoftTabs: { initialValue: true }, + tabSize: { + set: function (tabSize) { + tabSize = parseInt(tabSize); + if (tabSize > 0 && this.$tabSize !== tabSize) { + this.$modified = true; + this.$rowLengthCache = []; + this.$tabSize = tabSize; + this._signal("changeTabSize"); + } + }, + initialValue: 4, + handlesSet: true + }, + navigateWithinSoftTabs: { initialValue: false }, + foldStyle: { + set: function (val) { this.setFoldStyle(val); }, + handlesSet: true + }, + overwrite: { + set: function (val) { this._signal("changeOverwrite"); }, + initialValue: false + }, + newLineMode: { + set: function (val) { this.doc.setNewLineMode(val); }, + get: function () { return this.doc.getNewLineMode(); }, + handlesSet: true + }, + mode: { + set: function (val) { this.setMode(val); }, + get: function () { return this.$modeId; }, + handlesSet: true + } +}); +exports.EditSession = EditSession; - lines.sort(function(a, b) { - if (a.toLowerCase() < b.toLowerCase()) return -1; - if (a.toLowerCase() > b.toLowerCase()) return 1; - return 0; - }); +}); - var deleteRange = new Range(0, 0, 0, 0); - for (var i = rows.first; i <= rows.last; i++) { - var line = session.getLine(i); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = line.length; - session.replace(deleteRange, lines[i-rows.first]); - } +define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module){"use strict"; +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var Range = require("./range").Range; +var Search = /** @class */ (function () { + function Search() { + this.$options = {}; + } + Search.prototype.set = function (options) { + oop.mixin(this.$options, options); + return this; }; - this.toggleCommentLines = function() { - var state = this.session.getState(this.getCursorPosition().row); - var rows = this.$getSelectedRows(); - this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last); + Search.prototype.getOptions = function () { + return lang.copyObject(this.$options); }; - - this.toggleBlockComment = function() { - var cursor = this.getCursorPosition(); - var state = this.session.getState(cursor.row); - var range = this.getSelectionRange(); - this.session.getMode().toggleBlockComment(state, this.session, range, cursor); + Search.prototype.setOptions = function (options) { + this.$options = options; }; - this.getNumberAt = function(row, column) { - var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g; - _numberRx.lastIndex = 0; - - var s = this.session.getLine(row); - while (_numberRx.lastIndex < column) { - var m = _numberRx.exec(s); - if(m.index <= column && m.index+m[0].length >= column){ - var number = { - value: m[0], - start: m.index, - end: m.index+m[0].length - }; - return number; + Search.prototype.find = function (session) { + var options = this.$options; + var iterator = this.$matchIterator(session, options); + if (!iterator) + return false; + var firstRange = null; + iterator.forEach(function (sr, sc, er, ec) { + firstRange = new Range(sr, sc, er, ec); + if (sc == ec && options.start && /**@type{Range}*/ (options.start).start + && options.skipCurrent != false && firstRange.isEqual(/**@type{Range}*/ (options.start))) { + firstRange = null; + return false; } - } - return null; + return true; + }); + return firstRange; }; - this.modifyNumber = function(amount) { - var row = this.selection.getCursor().row; - var column = this.selection.getCursor().column; - var charRange = new Range(row, column-1, row, column); - - var c = this.session.getTextRange(charRange); - if (!isNaN(parseFloat(c)) && isFinite(c)) { - var nr = this.getNumberAt(row, column); - if (nr) { - var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end; - var decimals = nr.start + nr.value.length - fp; - - var t = parseFloat(nr.value); - t *= Math.pow(10, decimals); - - - if(fp !== nr.end && column < fp){ - amount *= Math.pow(10, nr.end - column - 1); - } else { - amount *= Math.pow(10, nr.end - column); + Search.prototype.findAll = function (session) { + var options = this.$options; + if (!options.needle) + return []; + this.$assembleRegExp(options); + var range = options.range; + var lines = range + ? session.getLines(range.start.row, range.end.row) + : session.doc.getAllLines(); + var ranges = []; + var re = options.re; + if (options.$isMultiLine) { + var len = re.length; + var maxRow = lines.length - len; + var prevRange; + outer: for (var row = re.offset || 0; row <= maxRow; row++) { + for (var j = 0; j < len; j++) + if (lines[row + j].search(re[j]) == -1) + continue outer; + var startLine = lines[row]; + var line = lines[row + len - 1]; + var startIndex = startLine.length - startLine.match(re[0])[0].length; + var endIndex = line.match(re[len - 1])[0].length; + if (prevRange && prevRange.end.row === row && + prevRange.end.column > startIndex) { + continue; } - - t += amount; - t /= Math.pow(10, decimals); - var nnr = t.toFixed(decimals); - var replaceRange = new Range(row, nr.start, row, nr.end); - this.session.replace(replaceRange, nnr); - this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length)); - + ranges.push(prevRange = new Range(row, startIndex, row + len - 1, endIndex)); + if (len > 2) + row = row + len - 2; } - } else { - this.toggleWord(); } - }; - - this.$toggleWordPairs = [ - ["first", "last"], - ["true", "false"], - ["yes", "no"], - ["width", "height"], - ["top", "bottom"], - ["right", "left"], - ["on", "off"], - ["x", "y"], - ["get", "set"], - ["max", "min"], - ["horizontal", "vertical"], - ["show", "hide"], - ["add", "remove"], - ["up", "down"], - ["before", "after"], - ["even", "odd"], - ["in", "out"], - ["inside", "outside"], - ["next", "previous"], - ["increase", "decrease"], - ["attach", "detach"], - ["&&", "||"], - ["==", "!="] - ]; - - this.toggleWord = function () { - var row = this.selection.getCursor().row; - var column = this.selection.getCursor().column; - this.selection.selectWord(); - var currentState = this.getSelectedText(); - var currWordStart = this.selection.getWordRange().start.column; - var wordParts = currentState.replace(/([a-z]+|[A-Z]+)(?=[A-Z_]|$)/g, '$1 ').split(/\s/); - var delta = column - currWordStart - 1; - if (delta < 0) delta = 0; - var curLength = 0, itLength = 0; - var that = this; - if (currentState.match(/[A-Za-z0-9_]+/)) { - wordParts.forEach(function (item, i) { - itLength = curLength + item.length; - if (delta >= curLength && delta <= itLength) { - currentState = item; - that.selection.clearSelection(); - that.moveCursorTo(row, curLength + currWordStart); - that.selection.selectTo(row, itLength + currWordStart); + else { + for (var matches, i = 0; i < lines.length; i++) { + if (this.$isMultilineSearch(options)) { + var lng = lines.length - 1; + matches = this.$multiLineForward(session, re, i, lng); + if (matches) { + var end_row = matches.endRow <= lng ? matches.endRow - 1 : lng; + if (end_row > i) + i = end_row; + ranges.push(new Range(matches.startRow, matches.startCol, matches.endRow, matches.endCol)); + } } - curLength = itLength; - }); - } - - var wordPairs = this.$toggleWordPairs; - var reg; - for (var i = 0; i < wordPairs.length; i++) { - var item = wordPairs[i]; - for (var j = 0; j <= 1; j++) { - var negate = +!j; - var firstCondition = currentState.match(new RegExp('^\\s?_?(' + lang.escapeRegExp(item[j]) + ')\\s?$', 'i')); - if (firstCondition) { - var secondCondition = currentState.match(new RegExp('([_]|^|\\s)(' + lang.escapeRegExp(firstCondition[1]) + ')($|\\s)', 'g')); - if (secondCondition) { - reg = currentState.replace(new RegExp(lang.escapeRegExp(item[j]), 'i'), function (result) { - var res = item[negate]; - if (result.toUpperCase() == result) { - res = res.toUpperCase(); - } else if (result.charAt(0).toUpperCase() == result.charAt(0)) { - res = res.substr(0, 0) + item[negate].charAt(0).toUpperCase() + res.substr(1); - } - return res; - }); - this.insert(reg); - reg = ""; + else { + matches = lang.getMatchOffsets(lines[i], re); + for (var j = 0; j < matches.length; j++) { + var match = matches[j]; + ranges.push(new Range(i, match.offset, i, match.offset + match.length)); } } } } - }; - this.removeLines = function() { - var rows = this.$getSelectedRows(); - this.session.removeFullLines(rows.first, rows.last); - this.clearSelection(); - }; - - this.duplicateSelection = function() { - var sel = this.selection; - var doc = this.session; - var range = sel.getRange(); - var reverse = sel.isBackwards(); - if (range.isEmpty()) { - var row = range.start.row; - doc.duplicateLines(row, row); - } else { - var point = reverse ? range.start : range.end; - var endPoint = doc.insert(point, doc.getTextRange(range), false); - range.start = point; - range.end = endPoint; - - sel.setSelectionRange(range, reverse); + if (range) { + var startColumn = range.start.column; + var endColumn = range.end.column; + var i = 0, j = ranges.length - 1; + while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == 0) + i++; + var endRow = range.end.row - range.start.row; + while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == endRow) + j--; + ranges = ranges.slice(i, j + 1); + for (i = 0, j = ranges.length; i < j; i++) { + ranges[i].start.row += range.start.row; + ranges[i].end.row += range.start.row; + } } + return ranges; }; - this.moveLinesDown = function() { - this.$moveLines(1, false); - }; - this.moveLinesUp = function() { - this.$moveLines(-1, false); - }; - this.moveText = function(range, toPosition, copy) { - return this.session.moveText(range, toPosition, copy); - }; - this.copyLinesUp = function() { - this.$moveLines(-1, true); - }; - this.copyLinesDown = function() { - this.$moveLines(1, true); - }; - this.$moveLines = function(dir, copy) { - var rows, moved; - var selection = this.selection; - if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) { - var range = selection.toOrientedRange(); - rows = this.$getSelectedRows(range); - moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir); - if (copy && dir == -1) moved = 0; - range.moveBy(moved, 0); - selection.fromOrientedRange(range); - } else { - var ranges = selection.rangeList.ranges; - selection.rangeList.detach(this.session); - this.inVirtualSelectionMode = true; - - var diff = 0; - var totalDiff = 0; - var l = ranges.length; - for (var i = 0; i < l; i++) { - var rangeIndex = i; - ranges[i].moveBy(diff, 0); - rows = this.$getSelectedRows(ranges[i]); - var first = rows.first; - var last = rows.last; - while (++i < l) { - if (totalDiff) ranges[i].moveBy(totalDiff, 0); - var subRows = this.$getSelectedRows(ranges[i]); - if (copy && subRows.first != last) + Search.prototype.parseReplaceString = function (replaceString) { + var CharCode = { + DollarSign: 36, + Ampersand: 38, + Digit0: 48, + Digit1: 49, + Digit9: 57, + Backslash: 92, + n: 110, + t: 116 + }; + var replacement = ''; + for (var i = 0, len = replaceString.length; i < len; i++) { + var chCode = replaceString.charCodeAt(i); + if (chCode === CharCode.Backslash) { + i++; + if (i >= len) { + replacement += "\\"; + break; + } + var nextChCode = replaceString.charCodeAt(i); + switch (nextChCode) { + case CharCode.Backslash: + replacement += "\\"; break; - else if (!copy && subRows.first > last + 1) + case CharCode.n: + replacement += "\n"; + break; + case CharCode.t: + replacement += "\t"; break; - last = subRows.last; } - i--; - diff = this.session.$moveLines(first, last, copy ? 0 : dir); - if (copy && dir == -1) rangeIndex = i + 1; - while (rangeIndex <= i) { - ranges[rangeIndex].moveBy(diff, 0); - rangeIndex++; + continue; + } + if (chCode === CharCode.DollarSign) { + i++; + if (i >= len) { + replacement += "$"; + break; + } + var nextChCode_1 = replaceString.charCodeAt(i); + if (nextChCode_1 === CharCode.DollarSign) { + replacement += "$$"; + continue; + } + if (nextChCode_1 === CharCode.Digit0 || nextChCode_1 === CharCode.Ampersand) { + replacement += "$&"; + continue; + } + if (CharCode.Digit1 <= nextChCode_1 && nextChCode_1 <= CharCode.Digit9) { + replacement += "$" + replaceString[i]; + continue; } - if (!copy) diff = 0; - totalDiff += diff; } - - selection.fromOrientedRange(selection.ranges[0]); - selection.rangeList.attach(this.session); - this.inVirtualSelectionMode = false; + replacement += replaceString[i]; } + return replacement || replaceString; }; - this.$getSelectedRows = function(range) { - range = (range || this.getSelectionRange()).collapseRows(); - - return { - first: this.session.getRowFoldStart(range.start.row), - last: this.session.getRowFoldEnd(range.end.row) - }; - }; - - this.onCompositionStart = function(compositionState) { - this.renderer.showComposition(compositionState); - }; - - this.onCompositionUpdate = function(text) { - this.renderer.setCompositionText(text); - }; - - this.onCompositionEnd = function() { - this.renderer.hideComposition(); - }; - this.getFirstVisibleRow = function() { - return this.renderer.getFirstVisibleRow(); - }; - this.getLastVisibleRow = function() { - return this.renderer.getLastVisibleRow(); - }; - this.isRowVisible = function(row) { - return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); - }; - this.isRowFullyVisible = function(row) { - return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow()); - }; - this.$getVisibleRowCount = function() { - return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1; - }; - - this.$moveByPage = function(dir, select) { - var renderer = this.renderer; - var config = this.renderer.layerConfig; - var rows = dir * Math.floor(config.height / config.lineHeight); - - if (select === true) { - this.selection.$moveSelection(function(){ - this.moveCursorBy(rows, 0); - }); - } else if (select === false) { - this.selection.moveCursorBy(rows, 0); - this.selection.clearSelection(); + Search.prototype.replace = function (input, replacement) { + var options = this.$options; + var re = this.$assembleRegExp(options); + if (options.$isMultiLine) + return replacement; + if (!re) + return; + var mtSearch = this.$isMultilineSearch(options); + if (mtSearch) + input = input.replace(/\r\n|\r|\n/g, "\n"); + var match = re.exec(input); + if (!match || (!mtSearch && match[0].length != input.length)) + return null; + replacement = options.regExp + ? this.parseReplaceString(replacement) + : replacement.replace(/\$/g, "$$$$"); + replacement = input.replace(re, replacement); + if (options.preserveCase) { + replacement = replacement.split(""); + for (var i = Math.min(input.length, input.length); i--;) { + var ch = input[i]; + if (ch && ch.toLowerCase() != ch) + replacement[i] = replacement[i].toUpperCase(); + else + replacement[i] = replacement[i].toLowerCase(); + } + replacement = replacement.join(""); } - - var scrollTop = renderer.scrollTop; - - renderer.scrollBy(0, rows * config.lineHeight); - if (select != null) - renderer.scrollCursorIntoView(null, 0.5); - - renderer.animateScrolling(scrollTop); - }; - this.selectPageDown = function() { - this.$moveByPage(1, true); - }; - this.selectPageUp = function() { - this.$moveByPage(-1, true); - }; - this.gotoPageDown = function() { - this.$moveByPage(1, false); - }; - this.gotoPageUp = function() { - this.$moveByPage(-1, false); - }; - this.scrollPageDown = function() { - this.$moveByPage(1); - }; - this.scrollPageUp = function() { - this.$moveByPage(-1); + return replacement; }; - this.scrollToRow = function(row) { - this.renderer.scrollToRow(row); + Search.prototype.$assembleRegExp = function (options, $disableFakeMultiline) { + if (options.needle instanceof RegExp) + return options.re = options.needle; + var needle = options.needle; + if (!options.needle) + return options.re = false; + if (!options.regExp) + needle = lang.escapeRegExp(needle); + var modifier = options.caseSensitive ? "gm" : "gmi"; + try { + new RegExp(needle, "u"); + options.$supportsUnicodeFlag = true; + modifier += "u"; + } + catch (e) { + options.$supportsUnicodeFlag = false; //left for backward compatibility with previous versions for cases like /ab\{2}/gu + } + if (options.wholeWord) + needle = addWordBoundary(needle, options); + options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle); + if (options.$isMultiLine) + return options.re = this.$assembleMultilineRegExp(needle, modifier); + try { + var re = new RegExp(needle, modifier); + } + catch (e) { + re = false; + } + return options.re = re; }; - this.scrollToLine = function(line, center, animate, callback) { - this.renderer.scrollToLine(line, center, animate, callback); + Search.prototype.$assembleMultilineRegExp = function (needle, modifier) { + var parts = needle.replace(/\r\n|\r|\n/g, "$\n^").split("\n"); + var re = []; + for (var i = 0; i < parts.length; i++) + try { + re.push(new RegExp(parts[i], modifier)); + } + catch (e) { + return false; + } + return re; }; - this.centerSelection = function() { - var range = this.getSelectionRange(); - var pos = { - row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2), - column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2) - }; - this.renderer.alignCursor(pos, 0.5); + Search.prototype.$isMultilineSearch = function (options) { + return options.re && /\\r\\n|\\r|\\n/.test(options.re.source) && options.regExp && !options.$isMultiLine; }; - this.getCursorPosition = function() { - return this.selection.getCursor(); + Search.prototype.$multiLineForward = function (session, re, start, last) { + var line, chunk = chunkEnd(session, start); + for (var row = start; row <= last;) { + for (var i = 0; i < chunk; i++) { + if (row > last) + break; + var next = session.getLine(row++); + line = line == null ? next : line + "\n" + next; + } + var match = re.exec(line); + re.lastIndex = 0; + if (match) { + var beforeMatch = line.slice(0, match.index).split("\n"); + var matchedText = match[0].split("\n"); + var startRow = start + beforeMatch.length - 1; + var startCol = beforeMatch[beforeMatch.length - 1].length; + var endRow = startRow + matchedText.length - 1; + var endCol = matchedText.length == 1 + ? startCol + matchedText[0].length + : matchedText[matchedText.length - 1].length; + return { + startRow: startRow, + startCol: startCol, + endRow: endRow, + endCol: endCol + }; + } + } + return null; }; - this.getCursorPositionScreen = function() { - return this.session.documentToScreenPosition(this.getCursorPosition()); + Search.prototype.$multiLineBackward = function (session, re, endIndex, start, first) { + var line, chunk = chunkEnd(session, start), endMargin = session.getLine(start).length - endIndex; + for (var row = start; row >= first;) { + for (var i = 0; i < chunk && row >= first; i++) { + var next = session.getLine(row--); + line = line == null ? next : next + "\n" + line; + } + var match = multiLineBackwardMatch(line, re, endMargin); + if (match) { + var beforeMatch = line.slice(0, match.index).split("\n"); + var matchedText = match[0].split("\n"); + var startRow = row + beforeMatch.length; + var startCol = beforeMatch[beforeMatch.length - 1].length; + var endRow = startRow + matchedText.length - 1; + var endCol = matchedText.length == 1 + ? startCol + matchedText[0].length + : matchedText[matchedText.length - 1].length; + return { + startRow: startRow, + startCol: startCol, + endRow: endRow, + endCol: endCol + }; + } + } + return null; }; - this.getSelectionRange = function() { - return this.selection.getRange(); - }; - this.selectAll = function() { - this.selection.selectAll(); - }; - this.clearSelection = function() { - this.selection.clearSelection(); - }; - this.moveCursorTo = function(row, column) { - this.selection.moveCursorTo(row, column); - }; - this.moveCursorToPosition = function(pos) { - this.selection.moveCursorToPosition(pos); - }; - this.jumpToMatching = function(select, expand) { - var cursor = this.getCursorPosition(); - var iterator = new TokenIterator(this.session, cursor.row, cursor.column); - var prevToken = iterator.getCurrentToken(); - var token = prevToken || iterator.stepForward(); - - if (!token) return; - var matchType; - var found = false; - var depth = {}; - var i = cursor.column - token.start; - var bracketType; - var brackets = { - ")": "(", - "(": "(", - "]": "[", - "[": "[", - "{": "{", - "}": "{" - }; - - do { - if (token.value.match(/[{}()\[\]]/g)) { - for (; i < token.value.length && !found; i++) { - if (!brackets[token.value[i]]) { - continue; - } - - bracketType = brackets[token.value[i]] + '.' + token.type.replace("rparen", "lparen"); - - if (isNaN(depth[bracketType])) { - depth[bracketType] = 0; - } - - switch (token.value[i]) { - case '(': - case '[': - case '{': - depth[bracketType]++; - break; - case ')': - case ']': - case '}': - depth[bracketType]--; - - if (depth[bracketType] === -1) { - matchType = 'bracket'; - found = true; - } - break; - } - } - } - else if (token.type.indexOf('tag-name') !== -1) { - if (isNaN(depth[token.value])) { - depth[token.value] = 0; - } - - if (prevToken.value === '<') { - depth[token.value]++; + Search.prototype.$matchIterator = function (session, options) { + var re = this.$assembleRegExp(options); + if (!re) + return false; + var mtSearch = this.$isMultilineSearch(options); + var mtForward = this.$multiLineForward; + var mtBackward = this.$multiLineBackward; + var backwards = options.backwards == true; + var skipCurrent = options.skipCurrent != false; + var supportsUnicodeFlag = re.unicode; + var range = options.range; + var start = options.start; + if (!start) + start = range ? range[backwards ? "end" : "start"] : session.selection.getRange(); + if (start.start) + start = start[skipCurrent != backwards ? "end" : "start"]; + var firstRow = range ? range.start.row : 0; + var lastRow = range ? range.end.row : session.getLength() - 1; + if (backwards) { + var forEach = function (callback) { + var row = start.row; + if (forEachInLine(row, start.column, callback)) + return; + for (row--; row >= firstRow; row--) + if (forEachInLine(row, Number.MAX_VALUE, callback)) + return; + if (options.wrap == false) + return; + for (row = lastRow, firstRow = start.row; row >= firstRow; row--) + if (forEachInLine(row, Number.MAX_VALUE, callback)) + return; + }; + } + else { + var forEach = function (callback) { + var row = start.row; + if (forEachInLine(row, start.column, callback)) + return; + for (row = row + 1; row <= lastRow; row++) + if (forEachInLine(row, 0, callback)) + return; + if (options.wrap == false) + return; + for (row = firstRow, lastRow = start.row; row <= lastRow; row++) + if (forEachInLine(row, 0, callback)) + return; + }; + } + if (options.$isMultiLine) { + var len = re.length; + var forEachInLine = function (row, offset, callback) { + var startRow = backwards ? row - len + 1 : row; + if (startRow < 0 || startRow + len > session.getLength()) + return; + var line = session.getLine(startRow); + var startIndex = line.search(re[0]); + if (!backwards && startIndex < offset || startIndex === -1) + return; + for (var i = 1; i < len; i++) { + line = session.getLine(startRow + i); + if (line.search(re[i]) == -1) + return; } - else if (prevToken.value === ' offset) + return; + if (callback(startRow, startIndex, startRow + len - 1, endIndex)) + return true; + }; + } + else if (backwards) { + var forEachInLine = function (row, endIndex, callback) { + if (mtSearch) { + var pos = mtBackward(session, re, endIndex, row, firstRow); + if (!pos) + return false; + if (callback(pos.startRow, pos.startCol, pos.endRow, pos.endCol)) + return true; } - - if (depth[token.value] === -1) { - matchType = 'tag'; - found = true; + else { + var line = session.getLine(row); + var matches = []; + var m, last = 0; + re.lastIndex = 0; + while ((m = re.exec(line))) { + var length = m[0].length; + last = m.index; + if (!length) { + if (last >= line.length) + break; + re.lastIndex = last += lang.skipEmptyMatch(line, last, supportsUnicodeFlag); + } + if (m.index + length > endIndex) + break; + matches.push(m.index, length); + } + for (var i = matches.length - 1; i >= 0; i -= 2) { + var column = matches[i - 1]; + var length = matches[i]; + if (callback(row, column, row, column + length)) + return true; + } } - } - - if (!found) { - prevToken = token; - token = iterator.stepForward(); - i = 0; - } - } while (token && !found); - if (!matchType) - return; - - var range, pos; - if (matchType === 'bracket') { - range = this.session.getBracketRange(cursor); - if (!range) { - range = new Range( - iterator.getCurrentTokenRow(), - iterator.getCurrentTokenColumn() + i - 1, - iterator.getCurrentTokenRow(), - iterator.getCurrentTokenColumn() + i - 1 - ); - pos = range.start; - if (expand || pos.row === cursor.row && Math.abs(pos.column - cursor.column) < 2) - range = this.session.getBracketRange(pos); - } + }; } - else if (matchType === 'tag') { - if (token && token.type.indexOf('tag-name') !== -1) - var tag = token.value; - else - return; - - range = new Range( - iterator.getCurrentTokenRow(), - iterator.getCurrentTokenColumn() - 2, - iterator.getCurrentTokenRow(), - iterator.getCurrentTokenColumn() - 2 - ); - if (range.compare(cursor.row, cursor.column) === 0) { - found = false; - do { - token = prevToken; - prevToken = iterator.stepBackward(); - - if (prevToken) { - if (prevToken.type.indexOf('tag-close') !== -1) { - range.setEnd(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); - } - - if (token.value === tag && token.type.indexOf('tag-name') !== -1) { - if (prevToken.value === '<') { - depth[tag]++; - } - else if (prevToken.value === ' row) + row = end_row; + } + if (!pos) + return false; + if (callback(pos.startRow, pos.startCol, pos.endRow, pos.endCol)) + return true; + } + else { + var line = session.getLine(row); + var last; + var m; + while ((m = re.exec(line))) { + var length = m[0].length; + last = m.index; + if (callback(row, last, row, last + length)) + return true; + if (!length) { + re.lastIndex = last += lang.skipEmptyMatch(line, last, supportsUnicodeFlag); + if (last >= line.length) + return false; } } - } while (prevToken && !found); - } - if (token && token.type.indexOf('tag-name')) { - pos = range.start; - if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2) - pos = range.end; - } - } - - pos = range && range.cursor || pos; - if (pos) { - if (select) { - if (range && expand) { - this.selection.setRange(range); - } else if (range && range.isEqual(this.getSelectionRange())) { - this.clearSelection(); - } else { - this.selection.selectTo(pos.row, pos.column); } - } else { - this.selection.moveTo(pos.row, pos.column); - } - } - }; - this.gotoLine = function(lineNumber, column, animate) { - this.selection.clearSelection(); - this.session.unfold({row: lineNumber - 1, column: column || 0}); - this.exitMultiSelectMode && this.exitMultiSelectMode(); - this.moveCursorTo(lineNumber - 1, column || 0); - - if (!this.isRowFullyVisible(lineNumber - 1)) - this.scrollToLine(lineNumber - 1, true, animate); - }; - this.navigateTo = function(row, column) { - this.selection.moveTo(row, column); - }; - this.navigateUp = function(times) { - if (this.selection.isMultiLine() && !this.selection.isBackwards()) { - var selectionStart = this.selection.anchor.getPosition(); - return this.moveCursorToPosition(selectionStart); + }; } - this.selection.clearSelection(); - this.selection.moveCursorBy(-times || -1, 0); + return { forEach: forEach }; }; - this.navigateDown = function(times) { - if (this.selection.isMultiLine() && this.selection.isBackwards()) { - var selectionEnd = this.selection.anchor.getPosition(); - return this.moveCursorToPosition(selectionEnd); + return Search; +}()); +function addWordBoundary(needle, options) { + var supportsLookbehind = lang.supportsLookbehind(); + function wordBoundary(c, firstChar) { + if (firstChar === void 0) { firstChar = true; } + var wordRegExp = supportsLookbehind && options.$supportsUnicodeFlag ? new RegExp("[\\p{L}\\p{N}_]", "u") : new RegExp("\\w"); + if (wordRegExp.test(c) || options.regExp) { + if (supportsLookbehind && options.$supportsUnicodeFlag) { + if (firstChar) + return "(?<=^|[^\\p{L}\\p{N}_])"; + return "(?=[^\\p{L}\\p{N}_]|$)"; + } + return "\\b"; } - this.selection.clearSelection(); - this.selection.moveCursorBy(times || 1, 0); + return ""; + } + var needleArray = Array.from(needle); + var firstChar = needleArray[0]; + var lastChar = needleArray[needleArray.length - 1]; + return wordBoundary(firstChar) + needle + wordBoundary(lastChar, false); +} +function multiLineBackwardMatch(line, re, endMargin) { + var match = null; + var from = 0; + while (from <= line.length) { + re.lastIndex = from; + var newMatch = re.exec(line); + if (!newMatch) + break; + var end = newMatch.index + newMatch[0].length; + if (end > line.length - endMargin) + break; + if (!match || end > match.index + match[0].length) + match = newMatch; + from = newMatch.index + 1; + } + return match; +} +function chunkEnd(session, start) { + var base = 5000, startPosition = { row: start, column: 0 }, startIndex = session.doc.positionToIndex(startPosition), targetIndex = startIndex + base, targetPosition = session.doc.indexToPosition(targetIndex), targetLine = targetPosition.row; + return targetLine + 1; +} +exports.Search = Search; + +}); + +define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); var keyUtil = require("../lib/keys"); +var useragent = require("../lib/useragent"); +var KEY_MODS = keyUtil.KEY_MODS; +var MultiHashHandler = /** @class */ (function () { + function MultiHashHandler(config, platform) { + this.$init(config, platform, false); + } + MultiHashHandler.prototype.$init = function (config, platform, $singleCommand) { + this.platform = platform || (useragent.isMac ? "mac" : "win"); + this.commands = {}; + this.commandKeyBinding = {}; + this.addCommands(config); + this.$singleCommand = $singleCommand; + }; + MultiHashHandler.prototype.addCommand = function (command) { + if (this.commands[command.name]) + this.removeCommand(command); + this.commands[command.name] = command; + if (command.bindKey) + this._buildKeyHash(command); }; - this.navigateLeft = function(times) { - if (!this.selection.isEmpty()) { - var selectionStart = this.getSelectionRange().start; - this.moveCursorToPosition(selectionStart); - } - else { - times = times || 1; - while (times--) { - this.selection.moveCursorLeft(); + MultiHashHandler.prototype.removeCommand = function (command, keepCommand) { + var name = command && (typeof command === 'string' ? command : command.name); + command = this.commands[name]; + if (!keepCommand) + delete this.commands[name]; + var ckb = this.commandKeyBinding; + for (var keyId in ckb) { + var cmdGroup = ckb[keyId]; + if (cmdGroup == command) { + delete ckb[keyId]; + } + else if (Array.isArray(cmdGroup)) { + var i = cmdGroup.indexOf(command); + if (i != -1) { + cmdGroup.splice(i, 1); + if (cmdGroup.length == 1) + ckb[keyId] = cmdGroup[0]; + } } } - this.clearSelection(); }; - this.navigateRight = function(times) { - if (!this.selection.isEmpty()) { - var selectionEnd = this.getSelectionRange().end; - this.moveCursorToPosition(selectionEnd); + MultiHashHandler.prototype.bindKey = function (key, command, position) { + if (typeof key == "object" && key) { + if (position == undefined) + position = key.position; + key = key[this.platform]; + } + if (!key) + return; + if (typeof command == "function") + return this.addCommand({ exec: command, bindKey: key, name: command.name || /**@type{string}*/ (key) }); (key).split("|").forEach(function (keyPart) { + var chain = ""; + if (keyPart.indexOf(" ") != -1) { + var parts = keyPart.split(/\s+/); + keyPart = parts.pop(); + parts.forEach(function (keyPart) { + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + chain += (chain ? " " : "") + id; + this._addCommandToBinding(chain, "chainKeys"); + }, this); + chain += " "; + } + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + this._addCommandToBinding(chain + id, command, position); + }, this); + }; + MultiHashHandler.prototype._addCommandToBinding = function (keyId, command, position) { + var ckb = this.commandKeyBinding, i; + if (!command) { + delete ckb[keyId]; + } + else if (!ckb[keyId] || this.$singleCommand) { + ckb[keyId] = command; } else { - times = times || 1; - while (times--) { - this.selection.moveCursorRight(); + if (!Array.isArray(ckb[keyId])) { + ckb[keyId] = [ckb[keyId]]; + } + else if ((i = ckb[keyId].indexOf(command)) != -1) { + ckb[keyId].splice(i, 1); + } + if (typeof position != "number") { + position = getPosition(command); + } + var commands = ckb[keyId]; + for (i = 0; i < commands.length; i++) { + var other = commands[i]; + var otherPos = getPosition(other); + if (otherPos > position) + break; } + commands.splice(i, 0, command); } - this.clearSelection(); - }; - this.navigateLineStart = function() { - this.selection.moveCursorLineStart(); - this.clearSelection(); - }; - this.navigateLineEnd = function() { - this.selection.moveCursorLineEnd(); - this.clearSelection(); }; - this.navigateFileEnd = function() { - this.selection.moveCursorFileEnd(); - this.clearSelection(); + MultiHashHandler.prototype.addCommands = function (commands) { + commands && Object.keys(commands).forEach(function (name) { + var command = commands[name]; + if (!command) + return; + if (typeof command === "string") + return this.bindKey(command, name); + if (typeof command === "function") + command = { exec: command }; + if (typeof command !== "object") + return; + if (!command.name) + command.name = name; + this.addCommand(command); + }, this); }; - this.navigateFileStart = function() { - this.selection.moveCursorFileStart(); - this.clearSelection(); + MultiHashHandler.prototype.removeCommands = function (commands) { + Object.keys(commands).forEach(function (name) { + this.removeCommand(commands[name]); + }, this); }; - this.navigateWordRight = function() { - this.selection.moveCursorWordRight(); - this.clearSelection(); + MultiHashHandler.prototype.bindKeys = function (keyList) { + Object.keys(keyList).forEach(function (key) { + this.bindKey(key, keyList[key]); + }, this); }; - this.navigateWordLeft = function() { - this.selection.moveCursorWordLeft(); - this.clearSelection(); + MultiHashHandler.prototype._buildKeyHash = function (command) { + this.bindKey(command.bindKey, command); }; - this.replace = function(replacement, options) { - if (options) - this.$search.set(options); - - var range = this.$search.find(this.session); - var replaced = 0; - if (!range) - return replaced; - - if (this.$tryReplace(range, replacement)) { - replaced = 1; + MultiHashHandler.prototype.parseKeys = function (keys) { + var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function (x) { return x; }); + var key = parts.pop(); + var keyCode = keyUtil[key]; + if (keyUtil.FUNCTION_KEYS[keyCode]) + key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase(); + else if (!parts.length) + return { key: key, hashId: -1 }; + else if (parts.length == 1 && parts[0] == "shift") + return { key: key.toUpperCase(), hashId: -1 }; + var hashId = 0; + for (var i = parts.length; i--;) { + var modifier = keyUtil.KEY_MODS[parts[i]]; + if (modifier == null) { + if (typeof console != "undefined") + console.error("invalid modifier " + parts[i] + " in " + keys); + return false; + } + hashId |= modifier; } - - this.selection.setSelectionRange(range); - this.renderer.scrollSelectionIntoView(range.start, range.end); - - return replaced; + return { key: key, hashId: hashId }; }; - this.replaceAll = function(replacement, options) { - if (options) { - this.$search.set(options); + MultiHashHandler.prototype.findKeyCommand = function (hashId, keyString) { + var key = KEY_MODS[hashId] + keyString; + return this.commandKeyBinding[key]; + }; + MultiHashHandler.prototype.handleKeyboard = function (data, hashId, keyString, keyCode) { + if (keyCode < 0) + return; + var key = KEY_MODS[hashId] + keyString; + var command = this.commandKeyBinding[key]; + if (data.$keyChain) { + data.$keyChain += " " + key; + command = this.commandKeyBinding[data.$keyChain] || command; } - - var ranges = this.$search.findAll(this.session); - var replaced = 0; - if (!ranges.length) - return replaced; - - var selection = this.getSelectionRange(); - this.selection.moveTo(0, 0); - - for (var i = ranges.length - 1; i >= 0; --i) { - if(this.$tryReplace(ranges[i], replacement)) { - replaced++; + if (command) { + if (command == "chainKeys" || command[command.length - 1] == "chainKeys") { + data.$keyChain = data.$keyChain || key; + return { command: "null" }; } } - - this.selection.setSelectionRange(selection); - - return replaced; - }; - - this.$tryReplace = function(range, replacement) { - var input = this.session.getTextRange(range); - replacement = this.$search.replace(input, replacement); - if (replacement !== null) { - range.end = this.session.replace(range, replacement); - return range; - } else { - return null; + if (data.$keyChain) { + if ((!hashId || hashId == 4) && keyString.length == 1) + data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input + else if (hashId == -1 || keyCode > 0) + data.$keyChain = ""; // reset keyChain } + return { command: command }; }; - this.getLastSearchOptions = function() { - return this.$search.getOptions(); + MultiHashHandler.prototype.getStatusText = function (editor, data) { + return data.$keyChain || ""; }; - this.find = function(needle, options, animate) { - if (!options) - options = {}; + return MultiHashHandler; +}()); +function getPosition(command) { + return typeof command == "object" && command.bindKey + && command.bindKey.position + || (command.isDefault ? -100 : 0); +} +var HashHandler = /** @class */ (function (_super) { + __extends(HashHandler, _super); + function HashHandler(config, platform) { + var _this = _super.call(this, config, platform) || this; + _this.$singleCommand = true; + return _this; + } + return HashHandler; +}(MultiHashHandler)); +HashHandler.call = function (thisArg, config, platform) { + MultiHashHandler.prototype.$init.call(thisArg, config, platform, true); +}; +MultiHashHandler.call = function (thisArg, config, platform) { + MultiHashHandler.prototype.$init.call(thisArg, config, platform, false); +}; +exports.HashHandler = HashHandler; +exports.MultiHashHandler = MultiHashHandler; - if (typeof needle == "string" || needle instanceof RegExp) - options.needle = needle; - else if (typeof needle == "object") - oop.mixin(options, needle); +}); - var range = this.selection.getRange(); - if (options.needle == null) { - needle = this.session.getTextRange(range) - || this.$search.$options.needle; - if (!needle) { - range = this.session.getWordRange(range.start.row, range.start.column); - needle = this.session.getTextRange(range); +define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var oop = require("../lib/oop"); +var MultiHashHandler = require("../keyboard/hash_handler").MultiHashHandler; +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var CommandManager = /** @class */ (function (_super) { + __extends(CommandManager, _super); + function CommandManager(platform, commands) { + var _this = _super.call(this, commands, platform) || this; + _this.byName = _this.commands; + _this.setDefaultHandler("exec", function (e) { + if (!e.args) { + return e.command.exec(e.editor, {}, e.event, true); + } + return e.command.exec(e.editor, e.args, e.event, false); + }); + return _this; + } + CommandManager.prototype.exec = function (command, editor, args) { + if (Array.isArray(command)) { + for (var i = command.length; i--;) { + if (this.exec(command[i], editor, args)) + return true; } - this.$search.set({needle: needle}); + return false; } - - this.$search.set(options); - if (!options.start) - this.$search.set({start: range}); - - var newRange = this.$search.find(this.session); - if (options.preventScroll) - return newRange; - if (newRange) { - this.revealRange(newRange, animate); - return newRange; + if (typeof command === "string") + command = this.commands[command]; + var e = { editor: editor, command: command, args: args }; + if (!this.canExecute(command, editor)) { + this._signal("commandUnavailable", e); + return false; } - if (options.backwards) - range.start = range.end; - else - range.end = range.start; - this.selection.setRange(range); - }; - this.findNext = function(options, animate) { - this.find({skipCurrent: true, backwards: false}, options, animate); - }; - this.findPrevious = function(options, animate) { - this.find(options, {skipCurrent: true, backwards: true}, animate); - }; - - this.revealRange = function(range, animate) { - this.session.unfold(range); - this.selection.setSelectionRange(range); - - var scrollTop = this.renderer.scrollTop; - this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); - if (animate !== false) - this.renderer.animateScrolling(scrollTop); - }; - this.undo = function() { - this.session.getUndoManager().undo(this.session); - this.renderer.scrollCursorIntoView(null, 0.5); - }; - this.redo = function() { - this.session.getUndoManager().redo(this.session); - this.renderer.scrollCursorIntoView(null, 0.5); + e.returnValue = this._emit("exec", e); + this._signal("afterExec", e); + return e.returnValue === false ? false : true; }; - this.destroy = function() { - if (this.$toDestroy) { - this.$toDestroy.forEach(function(el) { - el.destroy(); - }); - this.$toDestroy = null; - } - if (this.$mouseHandler) - this.$mouseHandler.destroy(); - this.renderer.destroy(); - this._signal("destroy", this); - if (this.session) - this.session.destroy(); - if (this._$emitInputEvent) - this._$emitInputEvent.cancel(); - this.removeAllListeners(); + CommandManager.prototype.canExecute = function (command, editor) { + if (typeof command === "string") + command = this.commands[command]; + if (!command) + return false; + if (editor && editor.$readOnly && !command.readOnly) + return false; + if (this.$checkCommandState != false && command.isAvailable && !command.isAvailable(editor)) + return false; + return true; }; - this.setAutoScrollEditorIntoView = function(enable) { - if (!enable) + CommandManager.prototype.toggleRecording = function (editor) { + if (this.$inReplay) return; - var rect; - var self = this; - var shouldScroll = false; - if (!this.$scrollAnchor) - this.$scrollAnchor = document.createElement("div"); - var scrollAnchor = this.$scrollAnchor; - scrollAnchor.style.cssText = "position:absolute"; - this.container.insertBefore(scrollAnchor, this.container.firstChild); - var onChangeSelection = this.on("changeSelection", function() { - shouldScroll = true; - }); - var onBeforeRender = this.renderer.on("beforeRender", function() { - if (shouldScroll) - rect = self.renderer.container.getBoundingClientRect(); - }); - var onAfterRender = this.renderer.on("afterRender", function() { - if (shouldScroll && rect && (self.isFocused() - || self.searchBox && self.searchBox.isFocused()) - ) { - var renderer = self.renderer; - var pos = renderer.$cursorLayer.$pixelPos; - var config = renderer.layerConfig; - var top = pos.top - config.offset; - if (pos.top >= 0 && top + rect.top < 0) { - shouldScroll = true; - } else if (pos.top < config.height && - pos.top + rect.top + config.lineHeight > window.innerHeight) { - shouldScroll = false; - } else { - shouldScroll = null; - } - if (shouldScroll != null) { - scrollAnchor.style.top = top + "px"; - scrollAnchor.style.left = pos.left + "px"; - scrollAnchor.style.height = config.lineHeight + "px"; - scrollAnchor.scrollIntoView(shouldScroll); - } - shouldScroll = rect = null; - } - }); - this.setAutoScrollEditorIntoView = function(enable) { - if (enable) - return; - delete this.setAutoScrollEditorIntoView; - this.off("changeSelection", onChangeSelection); - this.renderer.off("afterRender", onAfterRender); - this.renderer.off("beforeRender", onBeforeRender); - }; + editor && editor._emit("changeStatus"); + if (this.recording) { + this.macro.pop(); + this.off("exec", this.$addCommandToMacro); + if (!this.macro.length) + this.macro = this.oldMacro; + return this.recording = false; + } + if (!this.$addCommandToMacro) { + this.$addCommandToMacro = function (e) { + this.macro.push([e.command, e.args]); + }.bind(this); + } + this.oldMacro = this.macro; + this.macro = []; + this.on("exec", this.$addCommandToMacro); + return this.recording = true; }; - - - this.$resetCursorStyle = function() { - var style = this.$cursorStyle || "ace"; - var cursorLayer = this.renderer.$cursorLayer; - if (!cursorLayer) + CommandManager.prototype.replay = function (editor) { + if (this.$inReplay || !this.macro) return; - cursorLayer.setSmoothBlinking(/smooth/.test(style)); - cursorLayer.isBlinking = !this.$readOnly && style != "wide"; - dom.setCssClass(cursorLayer.element, "ace_slim-cursors", /slim/.test(style)); + if (this.recording) + return this.toggleRecording(editor); + try { + this.$inReplay = true; + this.macro.forEach(function (x) { + if (typeof x == "string") + this.exec(x, editor); + else + this.exec(x[0], editor, x[1]); + }, this); + } + finally { + this.$inReplay = false; + } }; - this.prompt = function(message, options, callback) { - var editor = this; - config.loadModule("./ext/prompt", function (module) { - module.prompt(editor, message, options, callback); + CommandManager.prototype.trimMacro = function (m) { + return m.map(function (x) { + if (typeof x[0] != "string") + x[0] = x[0].name; + if (!x[1]) + x = x[0]; + return x; }); }; + return CommandManager; +}(MultiHashHandler)); +oop.implement(CommandManager.prototype, EventEmitter); +exports.CommandManager = CommandManager; -}).call(Editor.prototype); - - +}); -config.defineOptions(Editor.prototype, "editor", { - selectionStyle: { - set: function(style) { - this.onSelectionChange(); - this._signal("changeSelectionStyle", {data: style}); +define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"], function(require, exports, module){"use strict"; +var lang = require("../lib/lang"); +var config = require("../config"); +var Range = require("../range").Range; +function bindKey(win, mac) { + return { win: win, mac: mac }; +} +exports.commands = [{ + name: "showSettingsMenu", + description: "Show settings menu", + bindKey: bindKey("Ctrl-,", "Command-,"), + exec: function (editor) { + config.loadModule("ace/ext/settings_menu", function (module) { + module.init(editor); + editor.showSettingsMenu(); + }); }, - initialValue: "line" - }, - highlightActiveLine: { - set: function() {this.$updateHighlightActiveLine();}, - initialValue: true - }, - highlightSelectedWord: { - set: function(shouldHighlight) {this.$onSelectionChange();}, - initialValue: true - }, - readOnly: { - set: function(readOnly) { - this.textInput.setReadOnly(readOnly); - this.$resetCursorStyle(); + readOnly: true + }, { + name: "goToNextError", + description: "Go to next error", + bindKey: bindKey("Alt-E", "F4"), + exec: function (editor) { + config.loadModule("ace/ext/error_marker", function (module) { + module.showErrorMarker(editor, 1); + }); }, - initialValue: false - }, - copyWithEmptySelection: { - set: function(value) { - this.textInput.setCopyWithEmptySelection(value); + scrollIntoView: "animate", + readOnly: true + }, { + name: "goToPreviousError", + description: "Go to previous error", + bindKey: bindKey("Alt-Shift-E", "Shift-F4"), + exec: function (editor) { + config.loadModule("ace/ext/error_marker", function (module) { + module.showErrorMarker(editor, -1); + }); }, - initialValue: false - }, - cursorStyle: { - set: function(val) { this.$resetCursorStyle(); }, - values: ["ace", "slim", "smooth", "wide"], - initialValue: "ace" - }, - mergeUndoDeltas: { - values: [false, true, "always"], - initialValue: true - }, - behavioursEnabled: {initialValue: true}, - wrapBehavioursEnabled: {initialValue: true}, - enableAutoIndent: {initialValue: true}, - autoScrollEditorIntoView: { - set: function(val) {this.setAutoScrollEditorIntoView(val);} - }, - keyboardHandler: { - set: function(val) { this.setKeyboardHandler(val); }, - get: function() { return this.$keybindingId; }, - handlesSet: true - }, - value: { - set: function(val) { this.session.setValue(val); }, - get: function() { return this.getValue(); }, - handlesSet: true, - hidden: true - }, - session: { - set: function(val) { this.setSession(val); }, - get: function() { return this.session; }, - handlesSet: true, - hidden: true - }, - - showLineNumbers: { - set: function(show) { - this.renderer.$gutterLayer.setShowLineNumbers(show); - this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER); - if (show && this.$relativeLineNumbers) - relativeNumberRenderer.attach(this); + scrollIntoView: "animate", + readOnly: true + }, { + name: "selectall", + description: "Select all", + bindKey: bindKey("Ctrl-A", "Command-A"), + exec: function (editor) { editor.selectAll(); }, + readOnly: true + }, { + name: "centerselection", + description: "Center selection", + bindKey: bindKey(null, "Ctrl-L"), + exec: function (editor) { editor.centerSelection(); }, + readOnly: true + }, { + name: "gotoline", + description: "Go to line...", + bindKey: bindKey("Ctrl-L", "Command-L"), + exec: function (editor, line) { + if (typeof line === "number" && !isNaN(line)) + editor.gotoLine(line); + editor.prompt({ $type: "gotoLine" }); + }, + readOnly: true + }, { + name: "fold", + bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"), + exec: function (editor) { editor.session.toggleFold(false); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "unfold", + bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"), + exec: function (editor) { editor.session.toggleFold(true); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "toggleFoldWidget", + description: "Toggle fold widget", + bindKey: bindKey("F2", "F2"), + exec: function (editor) { editor.session.toggleFoldWidget(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "toggleParentFoldWidget", + description: "Toggle parent fold widget", + bindKey: bindKey("Alt-F2", "Alt-F2"), + exec: function (editor) { editor.session.toggleFoldWidget(true); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "foldall", + description: "Fold all", + bindKey: bindKey(null, "Ctrl-Command-Option-0"), + exec: function (editor) { editor.session.foldAll(); }, + scrollIntoView: "center", + readOnly: true + }, { + name: "foldAllComments", + description: "Fold all comments", + bindKey: bindKey(null, "Ctrl-Command-Option-0"), + exec: function (editor) { editor.session.foldAllComments(); }, + scrollIntoView: "center", + readOnly: true + }, { + name: "foldOther", + description: "Fold other", + bindKey: bindKey("Alt-0", "Command-Option-0"), + exec: function (editor) { + editor.session.foldAll(); + editor.session.unfold(editor.selection.getAllRanges()); + }, + scrollIntoView: "center", + readOnly: true + }, { + name: "unfoldall", + description: "Unfold all", + bindKey: bindKey("Alt-Shift-0", "Command-Option-Shift-0"), + exec: function (editor) { editor.session.unfold(); }, + scrollIntoView: "center", + readOnly: true + }, { + name: "findnext", + description: "Find next", + bindKey: bindKey("Ctrl-K", "Command-G"), + exec: function (editor) { editor.findNext(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "findprevious", + description: "Find previous", + bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"), + exec: function (editor) { editor.findPrevious(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "selectOrFindNext", + description: "Select or find next", + bindKey: bindKey("Alt-K", "Ctrl-G"), + exec: function (editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); else - relativeNumberRenderer.detach(this); + editor.findNext(); }, - initialValue: true - }, - relativeLineNumbers: { - set: function(value) { - if (this.$showLineNumbers && value) - relativeNumberRenderer.attach(this); + readOnly: true + }, { + name: "selectOrFindPrevious", + description: "Select or find previous", + bindKey: bindKey("Alt-Shift-K", "Ctrl-Shift-G"), + exec: function (editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); else - relativeNumberRenderer.detach(this); - } + editor.findPrevious(); + }, + readOnly: true + }, { + name: "find", + description: "Find", + bindKey: bindKey("Ctrl-F", "Command-F"), + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { e.Search(editor); }); + }, + readOnly: true + }, { + name: "overwrite", + description: "Overwrite", + bindKey: "Insert", + exec: function (editor) { editor.toggleOverwrite(); }, + readOnly: true + }, { + name: "selecttostart", + description: "Select to start", + bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Home|Command-Shift-Up"), + exec: function (editor) { editor.getSelection().selectFileStart(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" + }, { + name: "gotostart", + description: "Go to start", + bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"), + exec: function (editor) { editor.navigateFileStart(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" + }, { + name: "selectup", + description: "Select up", + bindKey: bindKey("Shift-Up", "Shift-Up|Ctrl-Shift-P"), + exec: function (editor) { editor.getSelection().selectUp(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "golineup", + description: "Go line up", + bindKey: bindKey("Up", "Up|Ctrl-P"), + exec: function (editor, args) { editor.navigateUp(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selecttoend", + description: "Select to end", + bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-End|Command-Shift-Down"), + exec: function (editor) { editor.getSelection().selectFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" + }, { + name: "gotoend", + description: "Go to end", + bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"), + exec: function (editor) { editor.navigateFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" + }, { + name: "selectdown", + description: "Select down", + bindKey: bindKey("Shift-Down", "Shift-Down|Ctrl-Shift-N"), + exec: function (editor) { editor.getSelection().selectDown(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "golinedown", + description: "Go line down", + bindKey: bindKey("Down", "Down|Ctrl-N"), + exec: function (editor, args) { editor.navigateDown(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectwordleft", + description: "Select word left", + bindKey: bindKey("Ctrl-Shift-Left", "Option-Shift-Left"), + exec: function (editor) { editor.getSelection().selectWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotowordleft", + description: "Go to word left", + bindKey: bindKey("Ctrl-Left", "Option-Left"), + exec: function (editor) { editor.navigateWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selecttolinestart", + description: "Select to line start", + bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left|Ctrl-Shift-A"), + exec: function (editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotolinestart", + description: "Go to line start", + bindKey: bindKey("Alt-Left|Home", "Command-Left|Home|Ctrl-A"), + exec: function (editor) { editor.navigateLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectleft", + description: "Select left", + bindKey: bindKey("Shift-Left", "Shift-Left|Ctrl-Shift-B"), + exec: function (editor) { editor.getSelection().selectLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotoleft", + description: "Go to left", + bindKey: bindKey("Left", "Left|Ctrl-B"), + exec: function (editor, args) { editor.navigateLeft(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectwordright", + description: "Select word right", + bindKey: bindKey("Ctrl-Shift-Right", "Option-Shift-Right"), + exec: function (editor) { editor.getSelection().selectWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotowordright", + description: "Go to word right", + bindKey: bindKey("Ctrl-Right", "Option-Right"), + exec: function (editor) { editor.navigateWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selecttolineend", + description: "Select to line end", + bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right|Shift-End|Ctrl-Shift-E"), + exec: function (editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotolineend", + description: "Go to line end", + bindKey: bindKey("Alt-Right|End", "Command-Right|End|Ctrl-E"), + exec: function (editor) { editor.navigateLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectright", + description: "Select right", + bindKey: bindKey("Shift-Right", "Shift-Right"), + exec: function (editor) { editor.getSelection().selectRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotoright", + description: "Go to right", + bindKey: bindKey("Right", "Right|Ctrl-F"), + exec: function (editor, args) { editor.navigateRight(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectpagedown", + description: "Select page down", + bindKey: "Shift-PageDown", + exec: function (editor) { editor.selectPageDown(); }, + readOnly: true + }, { + name: "pagedown", + description: "Page down", + bindKey: bindKey(null, "Option-PageDown"), + exec: function (editor) { editor.scrollPageDown(); }, + readOnly: true + }, { + name: "gotopagedown", + description: "Go to page down", + bindKey: bindKey("PageDown", "PageDown|Ctrl-V"), + exec: function (editor) { editor.gotoPageDown(); }, + readOnly: true + }, { + name: "selectpageup", + description: "Select page up", + bindKey: "Shift-PageUp", + exec: function (editor) { editor.selectPageUp(); }, + readOnly: true + }, { + name: "pageup", + description: "Page up", + bindKey: bindKey(null, "Option-PageUp"), + exec: function (editor) { editor.scrollPageUp(); }, + readOnly: true + }, { + name: "gotopageup", + description: "Go to page up", + bindKey: "PageUp", + exec: function (editor) { editor.gotoPageUp(); }, + readOnly: true + }, { + name: "scrollup", + description: "Scroll up", + bindKey: bindKey("Ctrl-Up", null), + exec: function (e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true + }, { + name: "scrolldown", + description: "Scroll down", + bindKey: bindKey("Ctrl-Down", null), + exec: function (e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true + }, { + name: "selectlinestart", + description: "Select line start", + bindKey: "Shift-Home", + exec: function (editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectlineend", + description: "Select line end", + bindKey: "Shift-End", + exec: function (editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "togglerecording", + description: "Toggle recording", + bindKey: bindKey("Ctrl-Alt-E", "Command-Option-E"), + exec: function (editor) { editor.commands.toggleRecording(editor); }, + readOnly: true + }, { + name: "replaymacro", + description: "Replay macro", + bindKey: bindKey("Ctrl-Shift-E", "Command-Shift-E"), + exec: function (editor) { editor.commands.replay(editor); }, + readOnly: true + }, { + name: "jumptomatching", + description: "Jump to matching", + bindKey: bindKey("Ctrl-\\|Ctrl-P", "Command-\\"), + exec: function (editor) { editor.jumpToMatching(); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true + }, { + name: "selecttomatching", + description: "Select to matching", + bindKey: bindKey("Ctrl-Shift-\\|Ctrl-Shift-P", "Command-Shift-\\"), + exec: function (editor) { editor.jumpToMatching(true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true + }, { + name: "expandToMatching", + description: "Expand to matching", + bindKey: bindKey("Ctrl-Shift-M", "Ctrl-Shift-M"), + exec: function (editor) { editor.jumpToMatching(true, true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true + }, { + name: "passKeysToBrowser", + description: "Pass keys to browser", + bindKey: bindKey(null, null), + exec: function () { }, + passEvent: true, + readOnly: true + }, { + name: "copy", + description: "Copy", + exec: function (editor) { + }, + readOnly: true }, - placeholder: { - set: function(message) { - if (!this.$updatePlaceholder) { - this.$updatePlaceholder = function() { - var value = this.session && (this.renderer.$composition || this.getValue()); - if (value && this.renderer.placeholderNode) { - this.renderer.off("afterRender", this.$updatePlaceholder); - dom.removeCssClass(this.container, "ace_hasPlaceholder"); - this.renderer.placeholderNode.remove(); - this.renderer.placeholderNode = null; - } else if (!value && !this.renderer.placeholderNode) { - this.renderer.on("afterRender", this.$updatePlaceholder); - dom.addCssClass(this.container, "ace_hasPlaceholder"); - var el = dom.createElement("div"); - el.className = "ace_placeholder"; - el.textContent = this.$placeholder || ""; - this.renderer.placeholderNode = el; - this.renderer.content.appendChild(this.renderer.placeholderNode); - } else if (!value && this.renderer.placeholderNode) { - this.renderer.placeholderNode.textContent = this.$placeholder || ""; - } - }.bind(this); - this.on("input", this.$updatePlaceholder); + { + name: "cut", + description: "Cut", + exec: function (editor) { + var cutLine = editor.$copyWithEmptySelection && editor.selection.isEmpty(); + var range = cutLine ? editor.selection.getLineRange() : editor.selection.getRange(); + editor._emit("cut", range); + if (!range.isEmpty()) + editor.session.remove(range); + editor.clearSelection(); + }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" + }, { + name: "paste", + description: "Paste", + exec: function (editor, args) { + editor.$handlePaste(args); + }, + scrollIntoView: "cursor" + }, { + name: "removeline", + description: "Remove line", + bindKey: bindKey("Ctrl-D", "Command-D"), + exec: function (editor) { editor.removeLines(); }, + scrollIntoView: "cursor", + multiSelectAction: "forEachLine" + }, { + name: "duplicateSelection", + description: "Duplicate selection", + bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"), + exec: function (editor) { editor.duplicateSelection(); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" + }, { + name: "sortlines", + description: "Sort lines", + bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"), + exec: function (editor) { editor.sortLines(); }, + scrollIntoView: "selection", + multiSelectAction: "forEachLine" + }, { + name: "togglecomment", + description: "Toggle comment", + bindKey: bindKey("Ctrl-/", "Command-/"), + exec: function (editor) { editor.toggleCommentLines(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" + }, { + name: "toggleBlockComment", + description: "Toggle block comment", + bindKey: bindKey("Ctrl-Shift-/", "Command-Shift-/"), + exec: function (editor) { editor.toggleBlockComment(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" + }, { + name: "modifyNumberUp", + description: "Modify number up", + bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"), + exec: function (editor) { editor.modifyNumber(1); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" + }, { + name: "modifyNumberDown", + description: "Modify number down", + bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"), + exec: function (editor) { editor.modifyNumber(-1); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" + }, { + name: "replace", + description: "Replace", + bindKey: bindKey("Ctrl-H", "Command-Option-F"), + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { e.Search(editor, true); }); + } + }, { + name: "undo", + description: "Undo", + bindKey: bindKey("Ctrl-Z", "Command-Z"), + exec: function (editor) { editor.undo(); } + }, { + name: "redo", + description: "Redo", + bindKey: bindKey("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"), + exec: function (editor) { editor.redo(); } + }, { + name: "copylinesup", + description: "Copy lines up", + bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"), + exec: function (editor) { editor.copyLinesUp(); }, + scrollIntoView: "cursor" + }, { + name: "movelinesup", + description: "Move lines up", + bindKey: bindKey("Alt-Up", "Option-Up"), + exec: function (editor) { editor.moveLinesUp(); }, + scrollIntoView: "cursor" + }, { + name: "copylinesdown", + description: "Copy lines down", + bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"), + exec: function (editor) { editor.copyLinesDown(); }, + scrollIntoView: "cursor" + }, { + name: "movelinesdown", + description: "Move lines down", + bindKey: bindKey("Alt-Down", "Option-Down"), + exec: function (editor) { editor.moveLinesDown(); }, + scrollIntoView: "cursor" + }, { + name: "del", + description: "Delete", + bindKey: bindKey("Delete", "Delete|Ctrl-D|Shift-Delete"), + exec: function (editor) { editor.remove("right"); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "backspace", + description: "Backspace", + bindKey: bindKey("Shift-Backspace|Backspace", "Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"), + exec: function (editor) { editor.remove("left"); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "cut_or_delete", + description: "Cut or delete", + bindKey: bindKey("Shift-Delete", null), + exec: function (editor) { + if (editor.selection.isEmpty()) { + editor.remove("left"); } - this.$updatePlaceholder(); - } - }, - - hScrollBarAlwaysVisible: "renderer", - vScrollBarAlwaysVisible: "renderer", - highlightGutterLine: "renderer", - animatedScroll: "renderer", - showInvisibles: "renderer", - showPrintMargin: "renderer", - printMarginColumn: "renderer", - printMargin: "renderer", - fadeFoldWidgets: "renderer", - showFoldWidgets: "renderer", - displayIndentGuides: "renderer", - showGutter: "renderer", - fontSize: "renderer", - fontFamily: "renderer", - maxLines: "renderer", - minLines: "renderer", - scrollPastEnd: "renderer", - fixedWidthGutter: "renderer", - theme: "renderer", - hasCssTransforms: "renderer", - maxPixelHeight: "renderer", - useTextareaForIME: "renderer", - - scrollSpeed: "$mouseHandler", - dragDelay: "$mouseHandler", - dragEnabled: "$mouseHandler", - focusTimeout: "$mouseHandler", - tooltipFollowsMouse: "$mouseHandler", + else { + return false; + } + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removetolinestart", + description: "Remove to line start", + bindKey: bindKey("Alt-Backspace", "Command-Backspace"), + exec: function (editor) { editor.removeToLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removetolineend", + description: "Remove to line end", + bindKey: bindKey("Alt-Delete", "Ctrl-K|Command-Delete"), + exec: function (editor) { editor.removeToLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removetolinestarthard", + description: "Remove to line start hard", + bindKey: bindKey("Ctrl-Shift-Backspace", null), + exec: function (editor) { + var range = editor.selection.getRange(); + range.start.column = 0; + editor.session.remove(range); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removetolineendhard", + description: "Remove to line end hard", + bindKey: bindKey("Ctrl-Shift-Delete", null), + exec: function (editor) { + var range = editor.selection.getRange(); + range.end.column = Number.MAX_VALUE; + editor.session.remove(range); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removewordleft", + description: "Remove word left", + bindKey: bindKey("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"), + exec: function (editor) { editor.removeWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removewordright", + description: "Remove word right", + bindKey: bindKey("Ctrl-Delete", "Alt-Delete"), + exec: function (editor) { editor.removeWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "outdent", + description: "Outdent", + bindKey: bindKey("Shift-Tab", "Shift-Tab"), + exec: function (editor) { editor.blockOutdent(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" + }, { + name: "indent", + description: "Indent", + bindKey: bindKey("Tab", "Tab"), + exec: function (editor) { editor.indent(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" + }, { + name: "blockoutdent", + description: "Block outdent", + bindKey: bindKey("Ctrl-[", "Ctrl-["), + exec: function (editor) { editor.blockOutdent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" + }, { + name: "blockindent", + description: "Block indent", + bindKey: bindKey("Ctrl-]", "Ctrl-]"), + exec: function (editor) { editor.blockIndent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" + }, { + name: "insertstring", + description: "Insert string", + exec: function (editor, str) { editor.insert(str); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "inserttext", + description: "Insert text", + exec: function (editor, args) { + editor.insert(lang.stringRepeat(args.text || "", args.times || 1)); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "splitline", + description: "Split line", + bindKey: bindKey(null, "Ctrl-O"), + exec: function (editor) { editor.splitLine(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "transposeletters", + description: "Transpose letters", + bindKey: bindKey("Alt-Shift-X", "Ctrl-T"), + exec: function (editor) { editor.transposeLetters(); }, + multiSelectAction: function (editor) { editor.transposeSelections(1); }, + scrollIntoView: "cursor" + }, { + name: "touppercase", + description: "To uppercase", + bindKey: bindKey("Ctrl-U", "Ctrl-U"), + exec: function (editor) { editor.toUpperCase(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "tolowercase", + description: "To lowercase", + bindKey: bindKey("Ctrl-Shift-U", "Ctrl-Shift-U"), + exec: function (editor) { editor.toLowerCase(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "autoindent", + description: "Auto Indent", + bindKey: bindKey(null, null), + exec: function (editor) { editor.autoIndent(); }, + scrollIntoView: "animate" + }, { + name: "expandtoline", + description: "Expand to line", + bindKey: bindKey("Ctrl-Shift-L", "Command-Shift-L"), + exec: function (editor) { + var range = editor.selection.getRange(); + range.start.column = range.end.column = 0; + range.end.row++; + editor.selection.setRange(range, false); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "openlink", + bindKey: bindKey("Ctrl+F3", "F3"), + exec: function (editor) { editor.openLink(); } + }, { + name: "joinlines", + description: "Join lines", + bindKey: bindKey(null, null), + exec: function (editor) { + var isBackwards = editor.selection.isBackwards(); + var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor(); + var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead(); + var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length; + var selectedText = editor.session.doc.getTextRange(editor.selection.getRange()); + var selectedCount = selectedText.replace(/\n\s*/, " ").length; + var insertLine = editor.session.doc.getLine(selectionStart.row); + for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) { + var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i))); + if (curLine.length !== 0) { + curLine = " " + curLine; + } + insertLine += curLine; + } + if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) { + insertLine += editor.session.doc.getNewLineCharacter(); + } + editor.clearSelection(); + editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine); + if (selectedCount > 0) { + editor.selection.moveCursorTo(selectionStart.row, selectionStart.column); + editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount); + } + else { + firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol; + editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol); + } + }, + multiSelectAction: "forEach", + readOnly: true + }, { + name: "invertSelection", + description: "Invert selection", + bindKey: bindKey(null, null), + exec: function (editor) { + var endRow = editor.session.doc.getLength() - 1; + var endCol = editor.session.doc.getLine(endRow).length; + var ranges = editor.selection.rangeList.ranges; + var newRanges = []; + if (ranges.length < 1) { + ranges = [editor.selection.getRange()]; + } + for (var i = 0; i < ranges.length; i++) { + if (i == (ranges.length - 1)) { + if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) { + newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol)); + } + } + if (i === 0) { + if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) { + newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column)); + } + } + else { + newRanges.push(new Range(ranges[i - 1].end.row, ranges[i - 1].end.column, ranges[i].start.row, ranges[i].start.column)); + } + } + editor.exitMultiSelectMode(); + editor.clearSelection(); + for (var i = 0; i < newRanges.length; i++) { + editor.selection.addRange(newRanges[i], false); + } + }, + readOnly: true, + scrollIntoView: "none" + }, { + name: "addLineAfter", + description: "Add new line after the current line", + exec: function (editor) { + editor.selection.clearSelection(); + editor.navigateLineEnd(); + editor.insert("\n"); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "addLineBefore", + description: "Add new line before the current line", + exec: function (editor) { + editor.selection.clearSelection(); + var cursor = editor.getCursorPosition(); + editor.selection.moveTo(cursor.row - 1, Number.MAX_VALUE); + editor.insert("\n"); + if (cursor.row === 0) + editor.navigateUp(); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "openCommandPallete", + exec: function (editor) { + console.warn("This is an obsolete command. Please use `openCommandPalette` instead."); + editor.prompt({ $type: "commands" }); + }, + readOnly: true + }, { + name: "openCommandPalette", + description: "Open command palette", + bindKey: bindKey("F1", "F1"), + exec: function (editor) { + editor.prompt({ $type: "commands" }); + }, + readOnly: true + }, { + name: "modeSelect", + description: "Change language mode...", + bindKey: bindKey(null, null), + exec: function (editor) { + editor.prompt({ $type: "modes" }); + }, + readOnly: true + }]; +for (var i = 1; i < 9; i++) { + exports.commands.push({ + name: "foldToLevel" + i, + description: "Fold To Level " + i, + level: i, + exec: function (editor) { editor.session.foldToLevel(this.level); }, + scrollIntoView: "center", + readOnly: true + }); +} - firstLineNumber: "session", - overwrite: "session", - newLineMode: "session", - useWorker: "session", - useSoftTabs: "session", - navigateWithinSoftTabs: "session", - tabSize: "session", - wrap: "session", - indentedSoftWrap: "session", - foldStyle: "session", - mode: "session" }); - -var relativeNumberRenderer = { - getText: function(session, row) { - return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9 ? "\xb7" : ""))) + ""; - }, - getWidth: function(session, lastLineNumber, config) { - return Math.max( - lastLineNumber.toString().length, - (config.lastRow + 1).toString().length, - 2 - ) * config.characterWidth; - }, - update: function(e, editor) { - editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER); - }, - attach: function(editor) { - editor.renderer.$gutterLayer.$renderer = this; - editor.on("changeSelection", this.update); - this.update(null, editor); - }, - detach: function(editor) { - if (editor.renderer.$gutterLayer.$renderer == this) - editor.renderer.$gutterLayer.$renderer = null; - editor.off("changeSelection", this.update); - this.update(null, editor); +define("ace/keyboard/gutter_handler",["require","exports","module","ace/lib/keys"], function(require, exports, module){"use strict"; +var keys = require('../lib/keys'); +var GutterKeyboardHandler = /** @class */ (function () { + function GutterKeyboardHandler(editor) { + this.editor = editor; + this.gutterLayer = editor.renderer.$gutterLayer; + this.element = editor.renderer.$gutter; + this.lines = editor.renderer.$gutterLayer.$lines; + this.activeRowIndex = null; + this.activeLane = null; + this.annotationTooltip = this.editor.$mouseHandler.$tooltip; } -}; + GutterKeyboardHandler.prototype.addListener = function () { + this.element.addEventListener("keydown", this.$onGutterKeyDown.bind(this)); + this.element.addEventListener("focusout", this.$blurGutter.bind(this)); + this.editor.on("mousewheel", this.$blurGutter.bind(this)); + }; + GutterKeyboardHandler.prototype.removeListener = function () { + this.element.removeEventListener("keydown", this.$onGutterKeyDown.bind(this)); + this.element.removeEventListener("focusout", this.$blurGutter.bind(this)); + this.editor.off("mousewheel", this.$blurGutter.bind(this)); + }; + GutterKeyboardHandler.prototype.$onGutterKeyDown = function (e) { + if (this.annotationTooltip.isOpen) { + e.preventDefault(); + if (e.keyCode === keys["escape"]) + this.annotationTooltip.hide(); + return; + } + if (e.target === this.element) { + if (e.keyCode != keys["enter"]) { + return; + } + e.preventDefault(); + var row = this.editor.getCursorPosition().row; + if (!this.editor.isRowVisible(row)) + this.editor.scrollToLine(row, true, true); + setTimeout( + function () { + var index = this.$rowToRowIndex(this.gutterLayer.$cursorCell.row); + var nearestFoldLaneWidgetIndex = this.$findNearestFoldLaneWidget(index); + var nearestAnnotationIndex = this.$findNearestAnnotation(index); + if (nearestFoldLaneWidgetIndex === null && nearestAnnotationIndex === null) + return; + var futureActiveRowIndex = this.$findClosestNumber(nearestFoldLaneWidgetIndex, nearestAnnotationIndex, index); + if (futureActiveRowIndex === nearestFoldLaneWidgetIndex) { + this.activeLane = "fold"; + this.activeRowIndex = nearestFoldLaneWidgetIndex; + if (this.$isCustomWidgetVisible(nearestFoldLaneWidgetIndex)) { + this.$focusCustomWidget(this.activeRowIndex); + return; + } + else { + this.$focusFoldWidget(this.activeRowIndex); + return; + } + } + else { + this.activeRowIndex = nearestAnnotationIndex; + this.activeLane = "annotation"; + this.$focusAnnotation(this.activeRowIndex); + return; + } + }.bind(this), 10); + return; + } + this.$handleGutterKeyboardInteraction(e); + setTimeout(function () { + this.editor._signal("gutterkeydown", new GutterKeyboardEvent(e, this)); + }.bind(this), 10); + }; + GutterKeyboardHandler.prototype.$handleGutterKeyboardInteraction = function (e) { + if (e.keyCode === keys["tab"]) { + e.preventDefault(); + return; + } + if (e.keyCode === keys["escape"]) { + e.preventDefault(); + this.$blurGutter(); + this.element.focus(); + this.lane = null; + return; + } + if (e.keyCode === keys["up"]) { + e.preventDefault(); + switch (this.activeLane) { + case "fold": + this.$moveFoldWidgetUp(); + break; + case "annotation": + this.$moveAnnotationUp(); + break; + } + return; + } + if (e.keyCode === keys["down"]) { + e.preventDefault(); + switch (this.activeLane) { + case "fold": + this.$moveFoldWidgetDown(); + break; + case "annotation": + this.$moveAnnotationDown(); + break; + } + return; + } + if (e.keyCode === keys["left"]) { + e.preventDefault(); + this.$switchLane("annotation"); + return; + } + if (e.keyCode === keys["right"]) { + e.preventDefault(); + this.$switchLane("fold"); + return; + } + if (e.keyCode === keys["enter"] || e.keyCode === keys["space"]) { + e.preventDefault(); + switch (this.activeLane) { + case "fold": + var row = this.$rowIndexToRow(this.activeRowIndex); + var customWidget = this.editor.session.$gutterCustomWidgets[row]; + if (customWidget) { + if (customWidget.callbacks && customWidget.callbacks.onClick) { + customWidget.callbacks.onClick(e, row); + } + } + else if (this.gutterLayer.session.foldWidgets[row] === 'start') { + this.editor.session.onFoldWidgetClick(this.$rowIndexToRow(this.activeRowIndex), e); + setTimeout( + function () { + if (this.$rowIndexToRow(this.activeRowIndex) !== row) { + this.$blurFoldWidget(this.activeRowIndex); + this.activeRowIndex = this.$rowToRowIndex(row); + this.$focusFoldWidget(this.activeRowIndex); + } + }.bind(this), 10); + break; + } + else if (this.gutterLayer.session.foldWidgets[this.$rowIndexToRow(this.activeRowIndex)] === 'end') { + break; + } + return; + case "annotation": + this.annotationTooltip.showTooltip(this.$rowIndexToRow(this.activeRowIndex)); + this.annotationTooltip.$fromKeyboard = true; + break; + } + return; + } + }; + GutterKeyboardHandler.prototype.$blurGutter = function () { + if (this.activeRowIndex !== null) { + switch (this.activeLane) { + case "fold": + this.$blurFoldWidget(this.activeRowIndex); + this.$blurCustomWidget(this.activeRowIndex); + break; + case "annotation": + this.$blurAnnotation(this.activeRowIndex); + break; + } + } + if (this.annotationTooltip.isOpen) + this.annotationTooltip.hide(); + return; + }; + GutterKeyboardHandler.prototype.$isFoldWidgetVisible = function (index) { + var isRowFullyVisible = this.editor.isRowFullyVisible(this.$rowIndexToRow(index)); + var isIconVisible = this.$getFoldWidget(index).style.display !== "none"; + return isRowFullyVisible && isIconVisible; + }; + GutterKeyboardHandler.prototype.$isCustomWidgetVisible = function (index) { + var isRowFullyVisible = this.editor.isRowFullyVisible(this.$rowIndexToRow(index)); + var isIconVisible = !!this.$getCustomWidget(index); + return isRowFullyVisible && isIconVisible; + }; + GutterKeyboardHandler.prototype.$isAnnotationVisible = function (index) { + var isRowFullyVisible = this.editor.isRowFullyVisible(this.$rowIndexToRow(index)); + var isIconVisible = this.$getAnnotation(index).style.display !== "none"; + return isRowFullyVisible && isIconVisible; + }; + GutterKeyboardHandler.prototype.$getFoldWidget = function (index) { + var cell = this.lines.get(index); + var element = cell.element; + return element.childNodes[1]; + }; + GutterKeyboardHandler.prototype.$getCustomWidget = function (index) { + var cell = this.lines.get(index); + var element = cell.element; + return element.childNodes[3]; + }; + GutterKeyboardHandler.prototype.$getAnnotation = function (index) { + var cell = this.lines.get(index); + var element = cell.element; + return element.childNodes[2]; + }; + GutterKeyboardHandler.prototype.$findNearestFoldLaneWidget = function (index) { + if (this.$isCustomWidgetVisible(index)) + return index; + if (this.$isFoldWidgetVisible(index)) + return index; + var i = 0; + while (index - i > 0 || index + i < this.lines.getLength() - 1) { + i++; + if (index - i >= 0 && this.$isCustomWidgetVisible(index - i)) + return index - i; + if (index + i <= this.lines.getLength() - 1 && this.$isCustomWidgetVisible(index + i)) + return index + i; + if (index - i >= 0 && this.$isFoldWidgetVisible(index - i)) + return index - i; + if (index + i <= this.lines.getLength() - 1 && this.$isFoldWidgetVisible(index + i)) + return index + i; + } + return null; + }; + GutterKeyboardHandler.prototype.$findNearestAnnotation = function (index) { + if (this.$isAnnotationVisible(index)) + return index; + var i = 0; + while (index - i > 0 || index + i < this.lines.getLength() - 1) { + i++; + if (index - i >= 0 && this.$isAnnotationVisible(index - i)) + return index - i; + if (index + i <= this.lines.getLength() - 1 && this.$isAnnotationVisible(index + i)) + return index + i; + } + return null; + }; + GutterKeyboardHandler.prototype.$focusFoldWidget = function (index) { + if (index == null) + return; + var foldWidget = this.$getFoldWidget(index); + foldWidget.classList.add(this.editor.renderer.keyboardFocusClassName); + foldWidget.focus(); + }; + GutterKeyboardHandler.prototype.$focusCustomWidget = function (index) { + if (index == null) + return; + var customWidget = this.$getCustomWidget(index); + if (customWidget) { + customWidget.classList.add(this.editor.renderer.keyboardFocusClassName); + customWidget.focus(); + } + }; + GutterKeyboardHandler.prototype.$focusAnnotation = function (index) { + if (index == null) + return; + var annotation = this.$getAnnotation(index); + annotation.classList.add(this.editor.renderer.keyboardFocusClassName); + annotation.focus(); + }; + GutterKeyboardHandler.prototype.$blurFoldWidget = function (index) { + var foldWidget = this.$getFoldWidget(index); + foldWidget.classList.remove(this.editor.renderer.keyboardFocusClassName); + foldWidget.blur(); + }; + GutterKeyboardHandler.prototype.$blurCustomWidget = function (index) { + var customWidget = this.$getCustomWidget(index); + if (customWidget) { + customWidget.classList.remove(this.editor.renderer.keyboardFocusClassName); + customWidget.blur(); + } + }; + GutterKeyboardHandler.prototype.$blurAnnotation = function (index) { + var annotation = this.$getAnnotation(index); + annotation.classList.remove(this.editor.renderer.keyboardFocusClassName); + annotation.blur(); + }; + GutterKeyboardHandler.prototype.$moveFoldWidgetUp = function () { + var index = this.activeRowIndex; + while (index > 0) { + index--; + if (this.$isFoldWidgetVisible(index) || this.$isCustomWidgetVisible(index)) { + this.$blurFoldWidget(this.activeRowIndex); + this.$blurCustomWidget(this.activeRowIndex); + this.activeRowIndex = index; + if (this.$isFoldWidgetVisible(index)) { + this.$focusFoldWidget(this.activeRowIndex); + } + else { + this.$focusCustomWidget(this.activeRowIndex); + } + return; + } + } + return; + }; + GutterKeyboardHandler.prototype.$moveFoldWidgetDown = function () { + var index = this.activeRowIndex; + while (index < this.lines.getLength() - 1) { + index++; + if (this.$isFoldWidgetVisible(index) || this.$isCustomWidgetVisible(index)) { + this.$blurFoldWidget(this.activeRowIndex); + this.$blurCustomWidget(this.activeRowIndex); + this.activeRowIndex = index; + if (this.$isFoldWidgetVisible(index)) { + this.$focusFoldWidget(this.activeRowIndex); + } + else { + this.$focusCustomWidget(this.activeRowIndex); + } + return; + } + } + return; + }; + GutterKeyboardHandler.prototype.$moveAnnotationUp = function () { + var index = this.activeRowIndex; + while (index > 0) { + index--; + if (this.$isAnnotationVisible(index)) { + this.$blurAnnotation(this.activeRowIndex); + this.activeRowIndex = index; + this.$focusAnnotation(this.activeRowIndex); + return; + } + } + return; + }; + GutterKeyboardHandler.prototype.$moveAnnotationDown = function () { + var index = this.activeRowIndex; + while (index < this.lines.getLength() - 1) { + index++; + if (this.$isAnnotationVisible(index)) { + this.$blurAnnotation(this.activeRowIndex); + this.activeRowIndex = index; + this.$focusAnnotation(this.activeRowIndex); + return; + } + } + return; + }; + GutterKeyboardHandler.prototype.$findClosestNumber = function (num1, num2, target) { + if (num1 === null) + return num2; + if (num2 === null) + return num1; + return (Math.abs(target - num1) <= Math.abs(target - num2)) ? num1 : num2; + }; + GutterKeyboardHandler.prototype.$switchLane = function (desinationLane) { + switch (desinationLane) { + case "annotation": + if (this.activeLane === "annotation") { + break; + } + var annotationIndex = this.$findNearestAnnotation(this.activeRowIndex); + if (annotationIndex == null) { + break; + } + this.activeLane = "annotation"; + this.$blurFoldWidget(this.activeRowIndex); + this.$blurCustomWidget(this.activeRowIndex); + this.activeRowIndex = annotationIndex; + this.$focusAnnotation(this.activeRowIndex); + break; + case "fold": + if (this.activeLane === "fold") { + break; + } + var foldLaneWidgetIndex = this.$findNearestFoldLaneWidget(this.activeRowIndex); + if (foldLaneWidgetIndex === null) { + break; + } + this.activeLane = "fold"; + this.$blurAnnotation(this.activeRowIndex); + this.activeRowIndex = foldLaneWidgetIndex; + if (this.$isCustomWidgetVisible(foldLaneWidgetIndex)) { + this.$focusCustomWidget(this.activeRowIndex); + } + else { + this.$focusFoldWidget(this.activeRowIndex); + } + break; + } + return; + }; + GutterKeyboardHandler.prototype.$rowIndexToRow = function (index) { + var cell = this.lines.get(index); + if (cell) + return cell.row; + return null; + }; + GutterKeyboardHandler.prototype.$rowToRowIndex = function (row) { + for (var i = 0; i < this.lines.getLength(); i++) { + var cell = this.lines.get(i); + if (cell.row == row) + return i; + } + return null; + }; + return GutterKeyboardHandler; +}()); +exports.GutterKeyboardHandler = GutterKeyboardHandler; +var GutterKeyboardEvent = /** @class */ (function () { + function GutterKeyboardEvent(domEvent, gutterKeyboardHandler) { + this.gutterKeyboardHandler = gutterKeyboardHandler; + this.domEvent = domEvent; + } + GutterKeyboardEvent.prototype.getKey = function () { + return keys.keyCodeToString(this.domEvent.keyCode); + }; + GutterKeyboardEvent.prototype.getRow = function () { + return this.gutterKeyboardHandler.$rowIndexToRow(this.gutterKeyboardHandler.activeRowIndex); + }; + GutterKeyboardEvent.prototype.isInAnnotationLane = function () { + return this.gutterKeyboardHandler.activeLane === "annotation"; + }; + GutterKeyboardEvent.prototype.isInFoldLane = function () { + return this.gutterKeyboardHandler.activeLane === "fold"; + }; + return GutterKeyboardEvent; +}()); +exports.GutterKeyboardEvent = GutterKeyboardEvent; -exports.Editor = Editor; }); -define("ace/undomanager",["require","exports","module","ace/range"], function(require, exports, module) { -"use strict"; -var UndoManager = function() { - this.$maxRev = 0; - this.$fromUndo = false; - this.reset(); -}; - -(function() { - - this.addSession = function(session) { - this.$session = session; +define("ace/editor",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config","ace/token_iterator","ace/keyboard/gutter_handler","ace/config","ace/clipboard","ace/lib/keys","ace/lib/event","ace/tooltip"], function(require, exports, module){"use strict"; +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } }; - this.add = function(delta, allowMerge, session) { - if (this.$fromUndo) return; - if (delta == this.$lastDelta) return; - if (!this.$keepRedoStack) this.$redoStack.length = 0; - if (allowMerge === false || !this.lastDeltas) { - this.lastDeltas = []; - this.$undoStack.push(this.lastDeltas); - delta.id = this.$rev = ++this.$maxRev; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var lang = require("./lib/lang"); +var useragent = require("./lib/useragent"); +var TextInput = require("./keyboard/textinput").TextInput; +var MouseHandler = require("./mouse/mouse_handler").MouseHandler; +var FoldHandler = require("./mouse/fold_handler").FoldHandler; +var KeyBinding = require("./keyboard/keybinding").KeyBinding; +var EditSession = require("./edit_session").EditSession; +var Search = require("./search").Search; +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var CommandManager = require("./commands/command_manager").CommandManager; +var defaultCommands = require("./commands/default_commands").commands; +var config = require("./config"); +var TokenIterator = require("./token_iterator").TokenIterator; +var GutterKeyboardHandler = require("./keyboard/gutter_handler").GutterKeyboardHandler; +var nls = require("./config").nls; +var clipboard = require("./clipboard"); +var keys = require('./lib/keys'); +var event = require("./lib/event"); +var HoverTooltip = require("./tooltip").HoverTooltip; +var Editor = /** @class */ (function () { + function Editor(renderer, session, options) { + this.id = "editor" + (++Editor.$uid); this.session; + this.$toDestroy = []; + var container = renderer.getContainerElement(); + this.container = container; + this.renderer = renderer; + this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands); + if (typeof document == "object") { + this.textInput = new TextInput(renderer.getTextAreaContainer(), this); + this.renderer.textarea = this.textInput.getElement(); + this.$mouseHandler = new MouseHandler(this); + new FoldHandler(this); + } + this.keyBinding = new KeyBinding(this); + this.$search = new Search().set({ + wrap: true + }); + this.$historyTracker = this.$historyTracker.bind(this); + this.commands.on("exec", this.$historyTracker); + this.$initOperationListeners(); + this._$emitInputEvent = lang.delayedCall(function () { + this._signal("input", {}); + if (this.session && !this.session.destroyed) + this.session.bgTokenizer.scheduleStart(); + }.bind(this)); + this.on("change", function (_, _self) { + _self._$emitInputEvent.schedule(31); + }); + this.setSession(session || options && options.session || new EditSession("")); + config.resetOptions(this); + if (options) + this.setOptions(options); + config._signal("editor", this); + } + Editor.prototype.$initOperationListeners = function () { + this.commands.on("exec", this.startOperation.bind(this), true); + this.commands.on("afterExec", this.endOperation.bind(this), true); + }; + Editor.prototype.startOperation = function (commandEvent) { + this.session.startOperation(commandEvent); + }; + Editor.prototype.endOperation = function (e) { + this.session.endOperation(e); + }; + Editor.prototype.onStartOperation = function (commandEvent) { + this.curOp = this.session.curOp; + this.curOp.scrollTop = this.renderer.scrollTop; + this.prevOp = this.session.prevOp; + if (!commandEvent) { + this.previousCommand = null; + } + }; + Editor.prototype.onEndOperation = function (e) { + if (this.curOp && this.session) { + if (e && e.returnValue === false) { + this.curOp = null; + return; + } + this._signal("beforeEndOperation"); + if (!this.curOp) + return; + var command = this.curOp.command; + var scrollIntoView = command && command.scrollIntoView; + if (scrollIntoView) { + switch (scrollIntoView) { + case "center-animate": + scrollIntoView = "animate"; + case "center": + this.renderer.scrollCursorIntoView(null, 0.5); + break; + case "animate": + case "cursor": + this.renderer.scrollCursorIntoView(); + break; + case "selectionPart": + var range = this.selection.getRange(); + var config = this.renderer.layerConfig; + if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) { + this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead); + } + break; + default: + break; + } + if (scrollIntoView == "animate") + this.renderer.animateScrolling(this.curOp.scrollTop); + } + this.$lastSel = this.session.selection.toJSON(); + this.prevOp = this.curOp; + this.curOp = null; + } + }; + Editor.prototype.$historyTracker = function (e) { + if (!this.$mergeUndoDeltas) + return; + var prev = this.prevOp; + var mergeableCommands = this.$mergeableCommands; + var shouldMerge = prev.command && (e.command.name == prev.command.name); + if (e.command.name == "insertstring") { + var text = e.args; + if (this.mergeNextCommand === undefined) + this.mergeNextCommand = true; + shouldMerge = shouldMerge + && this.mergeNextCommand // previous command allows to coalesce with + && (!/\s/.test(text) || /\s/.test(prev.args)); // previous insertion was of same type + this.mergeNextCommand = true; + } + else { + shouldMerge = shouldMerge + && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable + } + if (this.$mergeUndoDeltas != "always" + && Date.now() - this.sequenceStartTime > 2000) { + shouldMerge = false; // the sequence is too long + } + if (shouldMerge) + this.session.mergeUndoDeltas = true; + else if (mergeableCommands.indexOf(e.command.name) !== -1) + this.sequenceStartTime = Date.now(); + }; + Editor.prototype.setKeyboardHandler = function (keyboardHandler, cb) { + if (keyboardHandler && typeof keyboardHandler === "string" && keyboardHandler != "ace") { + this.$keybindingId = keyboardHandler; + var _self = this; + config.loadModule(["keybinding", keyboardHandler], function (module) { + if (_self.$keybindingId == keyboardHandler) + _self.keyBinding.setKeyboardHandler(module && module.handler); + cb && cb(); + }); + } + else { + this.$keybindingId = null; + this.keyBinding.setKeyboardHandler(keyboardHandler); + cb && cb(); + } + }; + Editor.prototype.getKeyboardHandler = function () { + return this.keyBinding.getKeyboardHandler(); + }; + Editor.prototype.setSession = function (session) { + if (this.session == session) + return; + if (this.curOp) + this.endOperation(); + this.curOp = {}; + var oldSession = this.session; + if (oldSession) { + this.session.off("change", this.$onDocumentChange); + this.session.off("changeMode", this.$onChangeMode); + this.session.off("tokenizerUpdate", this.$onTokenizerUpdate); + this.session.off("changeTabSize", this.$onChangeTabSize); + this.session.off("changeWrapLimit", this.$onChangeWrapLimit); + this.session.off("changeWrapMode", this.$onChangeWrapMode); + this.session.off("changeFold", this.$onChangeFold); + this.session.off("changeFrontMarker", this.$onChangeFrontMarker); + this.session.off("changeBackMarker", this.$onChangeBackMarker); + this.session.off("changeBreakpoint", this.$onChangeBreakpoint); + this.session.off("changeAnnotation", this.$onChangeAnnotation); + this.session.off("changeOverwrite", this.$onCursorChange); + this.session.off("changeScrollTop", this.$onScrollTopChange); + this.session.off("changeScrollLeft", this.$onScrollLeftChange); + this.session.off("startOperation", this.$onStartOperation); + this.session.off("endOperation", this.$onEndOperation); + var selection = this.session.getSelection(); + selection.off("changeCursor", this.$onCursorChange); + selection.off("changeSelection", this.$onSelectionChange); + } + this.session = session; + if (session) { + this.$onDocumentChange = this.onDocumentChange.bind(this); + session.on("change", this.$onDocumentChange); + this.renderer.setSession(session); + this.$onChangeMode = this.onChangeMode.bind(this); + session.on("changeMode", this.$onChangeMode); + this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); + session.on("tokenizerUpdate", this.$onTokenizerUpdate); + this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); + session.on("changeTabSize", this.$onChangeTabSize); + this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); + session.on("changeWrapLimit", this.$onChangeWrapLimit); + this.$onChangeWrapMode = this.onChangeWrapMode.bind(this); + session.on("changeWrapMode", this.$onChangeWrapMode); + this.$onChangeFold = this.onChangeFold.bind(this); + session.on("changeFold", this.$onChangeFold); + this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this); + this.session.on("changeFrontMarker", this.$onChangeFrontMarker); + this.$onChangeBackMarker = this.onChangeBackMarker.bind(this); + this.session.on("changeBackMarker", this.$onChangeBackMarker); + this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this); + this.session.on("changeBreakpoint", this.$onChangeBreakpoint); + this.$onChangeAnnotation = this.onChangeAnnotation.bind(this); + this.session.on("changeAnnotation", this.$onChangeAnnotation); + this.$onCursorChange = this.onCursorChange.bind(this); + this.session.on("changeOverwrite", this.$onCursorChange); + this.$onScrollTopChange = this.onScrollTopChange.bind(this); + this.session.on("changeScrollTop", this.$onScrollTopChange); + this.$onScrollLeftChange = this.onScrollLeftChange.bind(this); + this.session.on("changeScrollLeft", this.$onScrollLeftChange); + this.selection = session.getSelection(); + this.selection.on("changeCursor", this.$onCursorChange); + this.$onSelectionChange = this.onSelectionChange.bind(this); + this.selection.on("changeSelection", this.$onSelectionChange); + this.$onStartOperation = this.onStartOperation.bind(this); + this.session.on("startOperation", this.$onStartOperation); + this.$onEndOperation = this.onEndOperation.bind(this); + this.session.on("endOperation", this.$onEndOperation); + this.onChangeMode(); + this.onCursorChange(); + this.onScrollTopChange(); + this.onScrollLeftChange(); + this.onSelectionChange(); + this.onChangeFrontMarker(); + this.onChangeBackMarker(); + this.onChangeBreakpoint(); + this.onChangeAnnotation(); + this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); + this.renderer.updateFull(); + } + else { + this.selection = null; + this.renderer.setSession(session); + } + this._signal("changeSession", { + session: session, + oldSession: oldSession + }); + this.curOp = null; + oldSession && oldSession._signal("changeEditor", { oldEditor: this }); + if (oldSession) + oldSession.$editor = null; + session && session._signal("changeEditor", { editor: this }); + if (session) + session.$editor = this; + if (session && !session.destroyed) + session.bgTokenizer.scheduleStart(); + }; + Editor.prototype.getSession = function () { + return this.session; + }; + Editor.prototype.setValue = function (val, cursorPos) { + this.session.doc.setValue(val); + if (!cursorPos) + this.selectAll(); + else if (cursorPos == 1) + this.navigateFileEnd(); + else if (cursorPos == -1) + this.navigateFileStart(); + return val; + }; + Editor.prototype.getValue = function () { + return this.session.getValue(); + }; + Editor.prototype.getSelection = function () { + return this.selection; + }; + Editor.prototype.resize = function (force) { + this.renderer.onResize(force); + }; + Editor.prototype.setTheme = function (theme, cb) { + this.renderer.setTheme(theme, cb); + }; + Editor.prototype.getTheme = function () { + return this.renderer.getTheme(); + }; + Editor.prototype.setStyle = function (style, incluude) { + this.renderer.setStyle(style, incluude); + }; + Editor.prototype.unsetStyle = function (style) { + this.renderer.unsetStyle(style); + }; + Editor.prototype.getFontSize = function () { + return this.getOption("fontSize") || + dom.computedStyle(this.container).fontSize; + }; + Editor.prototype.setFontSize = function (size) { + this.setOption("fontSize", size); + }; + Editor.prototype.$highlightBrackets = function () { + if (this.$highlightPending) { + return; + } + var self = this; + this.$highlightPending = true; + setTimeout(function () { + self.$highlightPending = false; + var session = self.session; + if (!session || session.destroyed) + return; + if (session.$bracketHighlight) { + session.$bracketHighlight.markerIds.forEach(function (id) { + session.removeMarker(id); + }); + session.$bracketHighlight = null; + } + var pos = self.getCursorPosition(); + var handler = self.getKeyboardHandler(); + var isBackwards = handler && handler.$getDirectionForHighlight && handler.$getDirectionForHighlight(self); + var ranges = session.getMatchingBracketRanges(pos, isBackwards); + if (!ranges) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + if (token && /\b(?:tag-open|tag-name)/.test(token.type)) { + var tagNamesRanges = session.getMatchingTags(pos); + if (tagNamesRanges) { + ranges = [ + tagNamesRanges.openTagName.isEmpty() ? tagNamesRanges.openTag : tagNamesRanges.openTagName, + tagNamesRanges.closeTagName.isEmpty() ? tagNamesRanges.closeTag : tagNamesRanges.closeTagName + ]; + } + } + } + if (!ranges && session.$mode.getMatching) + ranges = session.$mode.getMatching(self.session); + if (!ranges) { + if (self.getHighlightIndentGuides()) + self.renderer.$textLayer.$highlightIndentGuide(); + return; + } + var markerType = "ace_bracket"; + if (!Array.isArray(ranges)) { + ranges = [ranges]; + } + else if (ranges.length == 1) { + markerType = "ace_error_bracket"; + } + if (ranges.length == 2) { + if (Range.comparePoints(ranges[0].end, ranges[1].start) == 0) + ranges = [Range.fromPoints(ranges[0].start, ranges[1].end)]; + else if (Range.comparePoints(ranges[0].start, ranges[1].end) == 0) + ranges = [Range.fromPoints(ranges[1].start, ranges[0].end)]; + } + session.$bracketHighlight = { + ranges: ranges, + markerIds: ranges.map(function (range) { + return session.addMarker(range, markerType, "text"); + }) + }; + if (self.getHighlightIndentGuides()) + self.renderer.$textLayer.$highlightIndentGuide(); + }, 50); + }; + Editor.prototype.focus = function () { + this.textInput.focus(); + }; + Editor.prototype.isFocused = function () { + return this.textInput.isFocused(); + }; + Editor.prototype.blur = function () { + this.textInput.blur(); + }; + Editor.prototype.onFocus = function (e) { + if (this.$isFocused) + return; + this.$isFocused = true; + this.renderer.showCursor(); + this.renderer.visualizeFocus(); + this._emit("focus", e); + }; + Editor.prototype.onBlur = function (e) { + if (!this.$isFocused) + return; + this.$isFocused = false; + this.renderer.hideCursor(); + this.renderer.visualizeBlur(); + this._emit("blur", e); + }; + Editor.prototype.$cursorChange = function () { + this.renderer.updateCursor(); + this.$highlightBrackets(); + this.$updateHighlightActiveLine(); + }; + Editor.prototype.onDocumentChange = function (delta) { + var wrap = this.session.$useWrapMode; + var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity); + this.renderer.updateLines(delta.start.row, lastRow, wrap); + this._signal("change", delta); + this.$cursorChange(); + }; + Editor.prototype.onTokenizerUpdate = function (e) { + var rows = e.data; + this.renderer.updateLines(rows.first, rows.last); + }; + Editor.prototype.onScrollTopChange = function () { + this.renderer.scrollToY(this.session.getScrollTop()); + }; + Editor.prototype.onScrollLeftChange = function () { + this.renderer.scrollToX(this.session.getScrollLeft()); + }; + Editor.prototype.onCursorChange = function () { + this.$cursorChange(); + this._signal("changeSelection"); + }; + Editor.prototype.$updateHighlightActiveLine = function () { + var session = this.getSession(); + var highlight; + if (this.$highlightActiveLine) { + if (this.$selectionStyle != "line" || !this.selection.isMultiLine()) + highlight = this.getCursorPosition(); + if (this.renderer.theme && this.renderer.theme.$selectionColorConflict && !this.selection.isEmpty()) + highlight = false; + if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1)) + highlight = false; + } + if (session.$highlightLineMarker && !highlight) { + session.removeMarker(session.$highlightLineMarker.id); + session.$highlightLineMarker = null; + } + else if (!session.$highlightLineMarker && highlight) { + var range = new Range(highlight.row, highlight.column, highlight.row, Infinity); + range.id = session.addMarker(range, "ace_active-line", "screenLine"); + session.$highlightLineMarker = range; + } + else if (highlight) { + session.$highlightLineMarker.start.row = highlight.row; + session.$highlightLineMarker.end.row = highlight.row; + session.$highlightLineMarker.start.column = highlight.column; + session._signal("changeBackMarker"); + } + }; + Editor.prototype.onSelectionChange = function (e) { + var session = this.session; + if (session.$selectionMarker) { + session.removeMarker(session.$selectionMarker); + } + session.$selectionMarker = null; + if (!this.selection.isEmpty()) { + var range = this.selection.getRange(); + var style = this.getSelectionStyle(); + session.$selectionMarker = session.addMarker(range, "ace_selection", style); + } + else { + this.$updateHighlightActiveLine(); + } + var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp(); + this.session.highlight(re); + this._signal("changeSelection"); + }; + Editor.prototype.$getSelectionHighLightRegexp = function () { + var session = this.session; + var selection = this.getSelectionRange(); + if (selection.isEmpty() || selection.isMultiLine()) + return; + var startColumn = selection.start.column; + var endColumn = selection.end.column; + var line = session.getLine(selection.start.row); + var needle = line.substring(startColumn, endColumn); + if (needle.length > 5000 || !/[\w\d]/.test(needle)) + return; + var re = this.$search.$assembleRegExp({ + wholeWord: true, + caseSensitive: true, + needle: needle + }); + var wordWithBoundary = line.substring(startColumn - 1, endColumn + 1); + if (!re.test(wordWithBoundary)) + return; + return re; + }; + Editor.prototype.onChangeFrontMarker = function () { + this.renderer.updateFrontMarkers(); + }; + Editor.prototype.onChangeBackMarker = function () { + this.renderer.updateBackMarkers(); + }; + Editor.prototype.onChangeBreakpoint = function () { + this.renderer.updateBreakpoints(); + }; + Editor.prototype.onChangeAnnotation = function () { + this.renderer.setAnnotations(this.session.getAnnotations()); + }; + Editor.prototype.onChangeMode = function (e) { + this.renderer.updateText(); + this._emit("changeMode", e); + }; + Editor.prototype.onChangeWrapLimit = function () { + this.renderer.updateFull(); + }; + Editor.prototype.onChangeWrapMode = function () { + this.renderer.onResize(true); + }; + Editor.prototype.onChangeFold = function () { + this.$updateHighlightActiveLine(); + this.renderer.updateFull(); + }; + Editor.prototype.getSelectedText = function () { + return this.session.getTextRange(this.getSelectionRange()); + }; + Editor.prototype.getCopyText = function () { + var text = this.getSelectedText(); + var nl = this.session.doc.getNewLineCharacter(); + var copyLine = false; + if (!text && this.$copyWithEmptySelection) { + copyLine = true; + var ranges = this.selection.getAllRanges(); + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (i && ranges[i - 1].start.row == range.start.row) + continue; + text += this.session.getLine(range.start.row) + nl; + } + } + var e = { text: text }; + this._signal("copy", e); + clipboard.lineMode = copyLine ? e.text : false; + return e.text; + }; + Editor.prototype.onCopy = function () { + this.commands.exec("copy", this); + }; + Editor.prototype.onCut = function () { + this.commands.exec("cut", this); + }; + Editor.prototype.onPaste = function (text, event) { + var e = { text: text, event: event }; + this.commands.exec("paste", this, e); + }; + Editor.prototype.$handlePaste = function (e) { + if (typeof e == "string") + e = { text: e }; + this._signal("paste", e); + var text = e.text; + var lineMode = text === clipboard.lineMode; + var session = this.session; + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) { + if (lineMode) + session.insert({ row: this.selection.lead.row, column: 0 }, text); + else + this.insert(text); + } + else if (lineMode) { + this.selection.rangeList.ranges.forEach(function (range) { + session.insert({ row: range.start.row, column: 0 }, text); + }); + } + else { + var lines = text.split(/\r\n|\r|\n/); + var ranges = this.selection.rangeList.ranges; + var isFullLine = lines.length == 2 && (!lines[0] || !lines[1]); + if (lines.length != ranges.length || isFullLine) + return this.commands.exec("insertstring", this, text); + for (var i = ranges.length; i--;) { + var range = ranges[i]; + if (!range.isEmpty()) + session.remove(range); + session.insert(range.start, lines[i]); + } + } + }; + Editor.prototype.execCommand = function (command, args) { + return this.commands.exec(command, this, args); + }; + Editor.prototype.insert = function (text, pasted) { + var session = this.session; + var mode = session.getMode(); + var cursor = this.getCursorPosition(); + if (this.getBehavioursEnabled() && !pasted) { + var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); + if (transform) { + if (text !== transform.text) { + if (!this.inVirtualSelectionMode) { + this.session.mergeUndoDeltas = false; + this.mergeNextCommand = false; + } + } + text = transform.text; + } + } + if (text == "\t") + text = this.session.getTabString(); + if (!this.selection.isEmpty()) { + var range = this.getSelectionRange(); + cursor = this.session.remove(range); + this.clearSelection(); + } + else if (this.session.getOverwrite() && text.indexOf("\n") == -1) { + var range = Range.fromPoints(cursor, cursor); + range.end.column += text.length; + this.session.remove(range); + } + if (text == "\n" || text == "\r\n") { + var line = session.getLine(cursor.row); + if (cursor.column > line.search(/\S|$/)) { + var d = line.substr(cursor.column).search(/\S|$/); + session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d); + } + } + this.clearSelection(); + var start = cursor.column; + var lineState = session.getState(cursor.row); + var line = session.getLine(cursor.row); + var shouldOutdent = mode.checkOutdent(lineState, line, text); + session.insert(cursor, text); + if (transform && transform.selection) { + if (transform.selection.length == 2) { // Transform relative to the current column + this.selection.setSelectionRange(new Range(cursor.row, start + transform.selection[0], cursor.row, start + transform.selection[1])); + } + else { // Transform relative to the current row. + this.selection.setSelectionRange(new Range(cursor.row + transform.selection[0], transform.selection[1], cursor.row + transform.selection[2], transform.selection[3])); + } + } + if (this.$enableAutoIndent) { + if (session.getDocument().isNewLine(text)) { + var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); + session.insert({ row: cursor.row + 1, column: 0 }, lineIndent); + } + if (shouldOutdent) + mode.autoOutdent(lineState, session, cursor.row); + } + }; + Editor.prototype.autoIndent = function () { + var session = this.session; + var mode = session.getMode(); + var ranges = this.selection.isEmpty() + ? [new Range(0, 0, session.doc.getLength() - 1, 0)] + : this.selection.getAllRanges(); + var prevLineState = ""; + var prevLine = ""; + var lineIndent = ""; + var tab = session.getTabString(); + for (var i = 0; i < ranges.length; i++) { + var startRow = ranges[i].start.row; + var endRow = ranges[i].end.row; + for (var row = startRow; row <= endRow; row++) { + if (row > 0) { + prevLineState = session.getState(row - 1); + prevLine = session.getLine(row - 1); + lineIndent = mode.getNextLineIndent(prevLineState, prevLine, tab); + } + var line = session.getLine(row); + var currIndent = mode.$getIndent(line); + if (lineIndent !== currIndent) { + if (currIndent.length > 0) { + var range = new Range(row, 0, row, currIndent.length); + session.remove(range); + } + if (lineIndent.length > 0) { + session.insert({ row: row, column: 0 }, lineIndent); + } + } + mode.autoOutdent(prevLineState, session, row); + } + } + }; + Editor.prototype.onTextInput = function (text, composition) { + if (!composition) + return this.keyBinding.onTextInput(text); + this.startOperation({ command: { name: "insertstring" } }); + var applyComposition = this.applyComposition.bind(this, text, composition); + if (this.selection.rangeCount) + this.forEachSelection(applyComposition); + else + applyComposition(); + this.endOperation(); + }; + Editor.prototype.applyComposition = function (text, composition) { + if (composition.extendLeft || composition.extendRight) { + var r = this.selection.getRange(); + r.start.column -= composition.extendLeft; + r.end.column += composition.extendRight; + if (r.start.column < 0) { + r.start.row--; + r.start.column += this.session.getLine(r.start.row).length + 1; + } + this.selection.setRange(r); + if (!text && !r.isEmpty()) + this.remove(); + } + if (text || !this.selection.isEmpty()) + this.insert(text, true); + if (composition.restoreStart || composition.restoreEnd) { + var r = this.selection.getRange(); + r.start.column -= composition.restoreStart; + r.end.column -= composition.restoreEnd; + this.selection.setRange(r); + } + }; + Editor.prototype.onCommandKey = function (e, hashId, keyCode) { + return this.keyBinding.onCommandKey(e, hashId, keyCode); + }; + Editor.prototype.setOverwrite = function (overwrite) { + this.session.setOverwrite(overwrite); + }; + Editor.prototype.getOverwrite = function () { + return this.session.getOverwrite(); + }; + Editor.prototype.toggleOverwrite = function () { + this.session.toggleOverwrite(); + }; + Editor.prototype.setScrollSpeed = function (speed) { + this.setOption("scrollSpeed", speed); + }; + Editor.prototype.getScrollSpeed = function () { + return this.getOption("scrollSpeed"); + }; + Editor.prototype.setDragDelay = function (dragDelay) { + this.setOption("dragDelay", dragDelay); + }; + Editor.prototype.getDragDelay = function () { + return this.getOption("dragDelay"); + }; + Editor.prototype.setSelectionStyle = function (val) { + this.setOption("selectionStyle", val); + }; + Editor.prototype.getSelectionStyle = function () { + return this.getOption("selectionStyle"); + }; + Editor.prototype.setHighlightActiveLine = function (shouldHighlight) { + this.setOption("highlightActiveLine", shouldHighlight); + }; + Editor.prototype.getHighlightActiveLine = function () { + return this.getOption("highlightActiveLine"); + }; + Editor.prototype.setHighlightGutterLine = function (shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + Editor.prototype.getHighlightGutterLine = function () { + return this.getOption("highlightGutterLine"); + }; + Editor.prototype.setHighlightSelectedWord = function (shouldHighlight) { + this.setOption("highlightSelectedWord", shouldHighlight); + }; + Editor.prototype.getHighlightSelectedWord = function () { + return this.$highlightSelectedWord; + }; + Editor.prototype.setAnimatedScroll = function (shouldAnimate) { + this.renderer.setAnimatedScroll(shouldAnimate); + }; + Editor.prototype.getAnimatedScroll = function () { + return this.renderer.getAnimatedScroll(); + }; + Editor.prototype.setShowInvisibles = function (showInvisibles) { + this.renderer.setShowInvisibles(showInvisibles); + }; + Editor.prototype.getShowInvisibles = function () { + return this.renderer.getShowInvisibles(); + }; + Editor.prototype.setDisplayIndentGuides = function (display) { + this.renderer.setDisplayIndentGuides(display); + }; + Editor.prototype.getDisplayIndentGuides = function () { + return this.renderer.getDisplayIndentGuides(); + }; + Editor.prototype.setHighlightIndentGuides = function (highlight) { + this.renderer.setHighlightIndentGuides(highlight); + }; + Editor.prototype.getHighlightIndentGuides = function () { + return this.renderer.getHighlightIndentGuides(); + }; + Editor.prototype.setShowPrintMargin = function (showPrintMargin) { + this.renderer.setShowPrintMargin(showPrintMargin); + }; + Editor.prototype.getShowPrintMargin = function () { + return this.renderer.getShowPrintMargin(); + }; + Editor.prototype.setPrintMarginColumn = function (showPrintMargin) { + this.renderer.setPrintMarginColumn(showPrintMargin); + }; + Editor.prototype.getPrintMarginColumn = function () { + return this.renderer.getPrintMarginColumn(); + }; + Editor.prototype.setReadOnly = function (readOnly) { + this.setOption("readOnly", readOnly); + }; + Editor.prototype.getReadOnly = function () { + return this.getOption("readOnly"); + }; + Editor.prototype.setBehavioursEnabled = function (enabled) { + this.setOption("behavioursEnabled", enabled); + }; + Editor.prototype.getBehavioursEnabled = function () { + return this.getOption("behavioursEnabled"); + }; + Editor.prototype.setWrapBehavioursEnabled = function (enabled) { + this.setOption("wrapBehavioursEnabled", enabled); + }; + Editor.prototype.getWrapBehavioursEnabled = function () { + return this.getOption("wrapBehavioursEnabled"); + }; + Editor.prototype.setShowFoldWidgets = function (show) { + this.setOption("showFoldWidgets", show); + }; + Editor.prototype.getShowFoldWidgets = function () { + return this.getOption("showFoldWidgets"); + }; + Editor.prototype.setFadeFoldWidgets = function (fade) { + this.setOption("fadeFoldWidgets", fade); + }; + Editor.prototype.getFadeFoldWidgets = function () { + return this.getOption("fadeFoldWidgets"); + }; + Editor.prototype.remove = function (dir) { + if (this.selection.isEmpty()) { + if (dir == "left") + this.selection.selectLeft(); + else + this.selection.selectRight(); + } + var range = this.getSelectionRange(); + if (this.getBehavioursEnabled()) { + var session = this.session; + var state = session.getState(range.start.row); + var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); + if (range.end.column === 0) { + var text = session.getTextRange(range); + if (text[text.length - 1] == "\n") { + var line = session.getLine(range.end.row); + if (/^\s+$/.test(line)) { + range.end.column = line.length; + } + } + } + if (new_range) + range = new_range; + } + this.session.remove(range); + this.clearSelection(); + }; + Editor.prototype.removeWordRight = function () { + if (this.selection.isEmpty()) + this.selection.selectWordRight(); + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + Editor.prototype.removeWordLeft = function () { + if (this.selection.isEmpty()) + this.selection.selectWordLeft(); + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + Editor.prototype.removeToLineStart = function () { + if (this.selection.isEmpty()) + this.selection.selectLineStart(); + if (this.selection.isEmpty()) + this.selection.selectLeft(); + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + Editor.prototype.removeToLineEnd = function () { + if (this.selection.isEmpty()) + this.selection.selectLineEnd(); + var range = this.getSelectionRange(); + if (range.start.column == range.end.column && range.start.row == range.end.row) { + range.end.column = 0; + range.end.row++; + } + this.session.remove(range); + this.clearSelection(); + }; + Editor.prototype.splitLine = function () { + if (!this.selection.isEmpty()) { + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + } + var cursor = this.getCursorPosition(); + this.insert("\n"); + this.moveCursorToPosition(cursor); + }; + Editor.prototype.setGhostText = function (text, position) { + this.renderer.setGhostText(text, position); + }; + Editor.prototype.removeGhostText = function () { + this.renderer.removeGhostText(); + }; + Editor.prototype.transposeLetters = function () { + if (!this.selection.isEmpty()) { + return; + } + var cursor = this.getCursorPosition(); + var column = cursor.column; + if (column === 0) + return; + var line = this.session.getLine(cursor.row); + var swap, range; + if (column < line.length) { + swap = line.charAt(column) + line.charAt(column - 1); + range = new Range(cursor.row, column - 1, cursor.row, column + 1); + } + else { + swap = line.charAt(column - 1) + line.charAt(column - 2); + range = new Range(cursor.row, column - 2, cursor.row, column); + } + this.session.replace(range, swap); + this.session.selection.moveToPosition(range.end); + }; + Editor.prototype.toLowerCase = function () { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toLowerCase()); + this.selection.setSelectionRange(originalRange); + }; + Editor.prototype.toUpperCase = function () { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toUpperCase()); + this.selection.setSelectionRange(originalRange); + }; + Editor.prototype.indent = function () { + var session = this.session; + var range = this.getSelectionRange(); + if (range.start.row < range.end.row) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } + else if (range.start.column < range.end.column) { + var text = session.getTextRange(range); + if (!/^\s+$/.test(text)) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } + } + var line = session.getLine(range.start.row); + var position = range.start; + var size = session.getTabSize(); + var column = session.documentToScreenColumn(position.row, position.column); + if (this.session.getUseSoftTabs()) { + var count = (size - column % size); + var indentString = lang.stringRepeat(" ", count); + } + else { + var count = column % size; + while (line[range.start.column - 1] == " " && count) { + range.start.column--; + count--; + } + this.selection.setSelectionRange(range); + indentString = "\t"; + } + return this.insert(indentString); + }; + Editor.prototype.blockIndent = function () { + var rows = this.$getSelectedRows(); + this.session.indentRows(rows.first, rows.last, "\t"); + }; + Editor.prototype.blockOutdent = function () { + var selection = this.session.getSelection(); + this.session.outdentRows(selection.getRange()); + }; + Editor.prototype.sortLines = function () { + var rows = this.$getSelectedRows(); + var session = this.session; + var lines = []; + for (var i = rows.first; i <= rows.last; i++) + lines.push(session.getLine(i)); + lines.sort(function (a, b) { + if (a.toLowerCase() < b.toLowerCase()) + return -1; + if (a.toLowerCase() > b.toLowerCase()) + return 1; + return 0; + }); + var deleteRange = new Range(0, 0, 0, 0); + for (var i = rows.first; i <= rows.last; i++) { + var line = session.getLine(i); + deleteRange.start.row = i; + deleteRange.end.row = i; + deleteRange.end.column = line.length; + session.replace(deleteRange, lines[i - rows.first]); + } + }; + Editor.prototype.toggleCommentLines = function () { + var state = this.session.getState(this.getCursorPosition().row); + var rows = this.$getSelectedRows(); + this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last); + }; + Editor.prototype.toggleBlockComment = function () { + var cursor = this.getCursorPosition(); + var state = this.session.getState(cursor.row); + var range = this.getSelectionRange(); + this.session.getMode().toggleBlockComment(state, this.session, range, cursor); + }; + Editor.prototype.getNumberAt = function (row, column) { + var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g; + _numberRx.lastIndex = 0; + var s = this.session.getLine(row); + while (_numberRx.lastIndex < column) { + var m = _numberRx.exec(s); + if (m.index <= column && m.index + m[0].length >= column) { + var number = { + value: m[0], + start: m.index, + end: m.index + m[0].length + }; + return number; + } + } + return null; + }; + Editor.prototype.modifyNumber = function (amount) { + var row = this.selection.getCursor().row; + var column = this.selection.getCursor().column; + var charRange = new Range(row, column - 1, row, column); + var c = this.session.getTextRange(charRange); + if (!isNaN(parseFloat(c)) && isFinite(c)) { + var nr = this.getNumberAt(row, column); + if (nr) { + var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end; + var decimals = nr.start + nr.value.length - fp; + var t = parseFloat(nr.value); + t *= Math.pow(10, decimals); + if (fp !== nr.end && column < fp) { + amount *= Math.pow(10, nr.end - column - 1); + } + else { + amount *= Math.pow(10, nr.end - column); + } + t += amount; + t /= Math.pow(10, decimals); + var nnr = t.toFixed(decimals); + var replaceRange = new Range(row, nr.start, row, nr.end); + this.session.replace(replaceRange, nnr); + this.moveCursorTo(row, Math.max(nr.start + 1, column + nnr.length - nr.value.length)); + } + } + else { + this.toggleWord(); + } + }; + Editor.prototype.toggleWord = function () { + var row = this.selection.getCursor().row; + var column = this.selection.getCursor().column; + this.selection.selectWord(); + var currentState = this.getSelectedText(); + var currWordStart = this.selection.getWordRange().start.column; + var wordParts = currentState.replace(/([a-z]+|[A-Z]+)(?=[A-Z_]|$)/g, '$1 ').split(/\s/); + var delta = column - currWordStart - 1; + if (delta < 0) + delta = 0; + var curLength = 0, itLength = 0; + var that = this; + if (currentState.match(/[A-Za-z0-9_]+/)) { + wordParts.forEach(function (item, i) { + itLength = curLength + item.length; + if (delta >= curLength && delta <= itLength) { + currentState = item; + that.selection.clearSelection(); + that.moveCursorTo(row, curLength + currWordStart); + that.selection.selectTo(row, itLength + currWordStart); + } + curLength = itLength; + }); + } + var wordPairs = this.$toggleWordPairs; + var reg; + for (var i = 0; i < wordPairs.length; i++) { + var item = wordPairs[i]; + for (var j = 0; j <= 1; j++) { + var negate = +!j; + var firstCondition = currentState.match(new RegExp('^\\s?_?(' + lang.escapeRegExp(item[j]) + ')\\s?$', 'i')); + if (firstCondition) { + var secondCondition = currentState.match(new RegExp('([_]|^|\\s)(' + lang.escapeRegExp(firstCondition[1]) + ')($|\\s)', 'g')); + if (secondCondition) { + reg = currentState.replace(new RegExp(lang.escapeRegExp(item[j]), 'i'), function (result) { + var res = item[negate]; + if (result.toUpperCase() == result) { + res = res.toUpperCase(); + } + else if (result.charAt(0).toUpperCase() == result.charAt(0)) { + res = res.substr(0, 0) + item[negate].charAt(0).toUpperCase() + res.substr(1); + } + return res; + }); + this.insert(reg); + reg = ""; + } + } + } + } + }; + Editor.prototype.findLinkAt = function (row, column) { + var e_1, _a; + var line = this.session.getLine(row); + var wordParts = line.split(/((?:https?|ftp):\/\/[\S]+)/); + var columnPosition = column; + if (columnPosition < 0) + columnPosition = 0; + var previousPosition = 0, currentPosition = 0, match; + try { + for (var wordParts_1 = __values(wordParts), wordParts_1_1 = wordParts_1.next(); !wordParts_1_1.done; wordParts_1_1 = wordParts_1.next()) { + var item = wordParts_1_1.value; + currentPosition = previousPosition + item.length; + if (columnPosition >= previousPosition && columnPosition <= currentPosition) { + if (item.match(/((?:https?|ftp):\/\/[\S]+)/)) { + match = item.replace(/[\s:.,'";}\]]+$/, ""); + break; + } + } + previousPosition = currentPosition; + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (wordParts_1_1 && !wordParts_1_1.done && (_a = wordParts_1.return)) _a.call(wordParts_1); + } + finally { if (e_1) throw e_1.error; } + } + return match; + }; + Editor.prototype.openLink = function () { + var cursor = this.selection.getCursor(); + var url = this.findLinkAt(cursor.row, cursor.column); + if (url) + window.open(url, '_blank'); + return url != null; + }; + Editor.prototype.removeLines = function () { + var rows = this.$getSelectedRows(); + this.session.removeFullLines(rows.first, rows.last); + this.clearSelection(); + }; + Editor.prototype.duplicateSelection = function () { + var sel = this.selection; + var doc = this.session; + var range = sel.getRange(); + var reverse = sel.isBackwards(); + if (range.isEmpty()) { + var row = range.start.row; + doc.duplicateLines(row, row); + } + else { + var point = reverse ? range.start : range.end; + var endPoint = doc.insert(point, doc.getTextRange(range)); + range.start = point; + range.end = endPoint; + sel.setSelectionRange(range, reverse); + } + }; + Editor.prototype.moveLinesDown = function () { + this.$moveLines(1, false); + }; + Editor.prototype.moveLinesUp = function () { + this.$moveLines(-1, false); + }; + Editor.prototype.moveText = function (range, toPosition, copy) { + return this.session.moveText(range, toPosition, copy); + }; + Editor.prototype.copyLinesUp = function () { + this.$moveLines(-1, true); + }; + Editor.prototype.copyLinesDown = function () { + this.$moveLines(1, true); + }; + Editor.prototype.$moveLines = function (dir, copy) { + var rows, moved; + var selection = this.selection; + if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) { + var range = selection.toOrientedRange(); + rows = this.$getSelectedRows(range); + moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir); + if (copy && dir == -1) + moved = 0; + range.moveBy(moved, 0); + selection.fromOrientedRange(range); + } + else { + var ranges = selection.rangeList.ranges; + selection.rangeList.detach(this.session); + this.inVirtualSelectionMode = true; + var diff = 0; + var totalDiff = 0; + var l = ranges.length; + for (var i = 0; i < l; i++) { + var rangeIndex = i; + ranges[i].moveBy(diff, 0); + rows = this.$getSelectedRows(ranges[i]); + var first = rows.first; + var last = rows.last; + while (++i < l) { + if (totalDiff) + ranges[i].moveBy(totalDiff, 0); + var subRows = this.$getSelectedRows(ranges[i]); + if (copy && subRows.first != last) + break; + else if (!copy && subRows.first > last + 1) + break; + last = subRows.last; + } + i--; + diff = this.session.$moveLines(first, last, copy ? 0 : dir); + if (copy && dir == -1) + rangeIndex = i + 1; + while (rangeIndex <= i) { + ranges[rangeIndex].moveBy(diff, 0); + rangeIndex++; + } + if (!copy) + diff = 0; + totalDiff += diff; + } + selection.fromOrientedRange(selection.ranges[0]); + selection.rangeList.attach(this.session); + this.inVirtualSelectionMode = false; + } + }; + Editor.prototype.$getSelectedRows = function (range) { + range = (range || this.getSelectionRange()).collapseRows(); + return { + first: this.session.getRowFoldStart(range.start.row), + last: this.session.getRowFoldEnd(range.end.row) + }; + }; + Editor.prototype.onCompositionStart = function (compositionState) { + this.renderer.showComposition(compositionState); + }; + Editor.prototype.onCompositionUpdate = function (text) { + this.renderer.setCompositionText(text); + }; + Editor.prototype.onCompositionEnd = function () { + this.renderer.hideComposition(); + }; + Editor.prototype.getFirstVisibleRow = function () { + return this.renderer.getFirstVisibleRow(); + }; + Editor.prototype.getLastVisibleRow = function () { + return this.renderer.getLastVisibleRow(); + }; + Editor.prototype.isRowVisible = function (row) { + return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); + }; + Editor.prototype.isRowFullyVisible = function (row) { + return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow()); + }; + Editor.prototype.$getVisibleRowCount = function () { + return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1; + }; + Editor.prototype.$moveByPage = function (dir, select) { + var renderer = this.renderer; + var config = this.renderer.layerConfig; + var rows = dir * Math.floor(config.height / config.lineHeight); + if (select === true) { + this.selection.$moveSelection(function () { + this.moveCursorBy(rows, 0); + }); + } + else if (select === false) { + this.selection.moveCursorBy(rows, 0); + this.selection.clearSelection(); + } + var scrollTop = renderer.scrollTop; + renderer.scrollBy(0, rows * config.lineHeight); + if (select != null) + renderer.scrollCursorIntoView(null, 0.5); + renderer.animateScrolling(scrollTop); + }; + Editor.prototype.selectPageDown = function () { + this.$moveByPage(1, true); + }; + Editor.prototype.selectPageUp = function () { + this.$moveByPage(-1, true); + }; + Editor.prototype.gotoPageDown = function () { + this.$moveByPage(1, false); + }; + Editor.prototype.gotoPageUp = function () { + this.$moveByPage(-1, false); + }; + Editor.prototype.scrollPageDown = function () { + this.$moveByPage(1); + }; + Editor.prototype.scrollPageUp = function () { + this.$moveByPage(-1); + }; + Editor.prototype.scrollToRow = function (row) { + this.renderer.scrollToRow(row); + }; + Editor.prototype.scrollToLine = function (line, center, animate, callback) { + this.renderer.scrollToLine(line, center, animate, callback); + }; + Editor.prototype.centerSelection = function () { + var range = this.getSelectionRange(); + var pos = { + row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2), + column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2) + }; + this.renderer.alignCursor(pos, 0.5); + }; + Editor.prototype.getCursorPosition = function () { + return this.selection.getCursor(); + }; + Editor.prototype.getCursorPositionScreen = function () { + return this.session.documentToScreenPosition(this.getCursorPosition()); + }; + Editor.prototype.getSelectionRange = function () { + return this.selection.getRange(); + }; + Editor.prototype.selectAll = function () { + this.selection.selectAll(); + }; + Editor.prototype.clearSelection = function () { + this.selection.clearSelection(); + }; + Editor.prototype.moveCursorTo = function (row, column) { + this.selection.moveCursorTo(row, column); + }; + Editor.prototype.moveCursorToPosition = function (pos) { + this.selection.moveCursorToPosition(pos); + }; + Editor.prototype.jumpToMatching = function (select, expand) { + var cursor = this.getCursorPosition(); + var iterator = new TokenIterator(this.session, cursor.row, cursor.column); + var prevToken = iterator.getCurrentToken(); + var tokenCount = 0; + if (prevToken && prevToken.type.indexOf('tag-name') !== -1) { + prevToken = iterator.stepBackward(); + } + var token = prevToken || iterator.stepForward(); + if (!token) + return; + var matchType; + var found = false; + var depth = {}; + var i = cursor.column - token.start; + var bracketType; + var brackets = { + ")": "(", + "(": "(", + "]": "[", + "[": "[", + "{": "{", + "}": "{" + }; + do { + if (token.value.match(/[{}()\[\]]/g)) { + for (; i < token.value.length && !found; i++) { + if (!brackets[token.value[i]]) { + continue; + } + bracketType = brackets[token.value[i]] + '.' + token.type.replace("rparen", "lparen"); + if (isNaN(depth[bracketType])) { + depth[bracketType] = 0; + } + switch (token.value[i]) { + case '(': + case '[': + case '{': + depth[bracketType]++; + break; + case ')': + case ']': + case '}': + depth[bracketType]--; + if (depth[bracketType] === -1) { + matchType = 'bracket'; + found = true; + } + break; + } + } + } + else if (token.type.indexOf('tag-name') !== -1) { + if (isNaN(depth[token.value])) { + depth[token.value] = 0; + } + if (prevToken.value === '<' && tokenCount > 1) { + depth[token.value]++; + } + else if (prevToken.value === '= 0; --i) { + if (this.$tryReplace(ranges[i], replacement)) { + replaced++; + } } - this.$fromUndo = false; - - return redoSelectionRange; - }; - - this.$syncRev = function() { - var stack = this.$undoStack; - var nextDelta = stack[stack.length - 1]; - var id = nextDelta && nextDelta[0].id || 0; - this.$redoStackBaseRev = id; - this.$rev = id; + this.selection.setSelectionRange(selection); + return replaced; }; - this.reset = function() { - this.lastDeltas = null; - this.$lastDelta = null; - this.$undoStack = []; - this.$redoStack = []; - this.$rev = 0; - this.mark = 0; - this.$redoStackBaseRev = this.$rev; - this.selections = []; + Editor.prototype.$tryReplace = function (range, replacement) { + var input = this.session.getTextRange(range); + replacement = this.$search.replace(input, replacement); + if (replacement !== null) { + range.end = this.session.replace(range, replacement); + return range; + } + else { + return null; + } }; - this.canUndo = function() { - return this.$undoStack.length > 0; + Editor.prototype.getLastSearchOptions = function () { + return this.$search.getOptions(); }; - this.canRedo = function() { - return this.$redoStack.length > 0; + Editor.prototype.find = function (needle, options, animate) { + if (!options) + options = {}; + if (typeof needle == "string" || needle instanceof RegExp) + options.needle = needle; + else if (typeof needle == "object") + oop.mixin(options, needle); + var range = this.selection.getRange(); + if (options.needle == null) { + needle = this.session.getTextRange(range) + || this.$search.$options.needle; + if (!needle) { + range = this.session.getWordRange(range.start.row, range.start.column); + needle = this.session.getTextRange(range); + } + this.$search.set({ needle: needle }); + } + this.$search.set(options); + if (!options.start) + this.$search.set({ start: range }); + var newRange = this.$search.find(this.session); + if (options.preventScroll) + return newRange; + if (newRange) { + this.revealRange(newRange, animate); + return newRange; + } + if (options.backwards) + range.start = range.end; + else + range.end = range.start; + this.selection.setRange(range); }; - this.bookmark = function(rev) { - if (rev == undefined) - rev = this.$rev; - this.mark = rev; + Editor.prototype.findNext = function (options, animate) { + this.find({ skipCurrent: true, backwards: false }, options, animate); }; - this.isAtBookmark = function() { - return this.$rev === this.mark; + Editor.prototype.findPrevious = function (options, animate) { + this.find(options, { skipCurrent: true, backwards: true }, animate); }; - - this.toJSON = function() { - + Editor.prototype.revealRange = function (range, animate) { + this.session.unfold(range); + this.selection.setSelectionRange(range); + var scrollTop = this.renderer.scrollTop; + this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); + if (animate !== false) + this.renderer.animateScrolling(scrollTop); }; - - this.fromJSON = function() { - + Editor.prototype.undo = function () { + this.session.getUndoManager().undo(this.session); + this.renderer.scrollCursorIntoView(null, 0.5); }; - - this.hasUndo = this.canUndo; - this.hasRedo = this.canRedo; - this.isClean = this.isAtBookmark; - this.markClean = this.bookmark; - - this.$prettyPrint = function(delta) { - if (delta) return stringifyDelta(delta); - return stringifyDelta(this.$undoStack) + "\n---\n" + stringifyDelta(this.$redoStack); + Editor.prototype.redo = function () { + this.session.getUndoManager().redo(this.session); + this.renderer.scrollCursorIntoView(null, 0.5); }; -}).call(UndoManager.prototype); - -function rearrangeUndoStack(stack, pos) { - for (var i = pos; i--; ) { - var deltaSet = stack[i]; - if (deltaSet && !deltaSet[0].ignore) { - while(i < pos - 1) { - var swapped = swapGroups(stack[i], stack[i + 1]); - stack[i] = swapped[0]; - stack[i + 1] = swapped[1]; - i++; - } - return true; - } - } -} - -var Range = require("./range").Range; -var cmp = Range.comparePoints; -var comparePoints = Range.comparePoints; - -function $updateMarkers(delta) { - var isInsert = delta.action == "insert"; - var start = delta.start; - var end = delta.end; - var rowShift = (end.row - start.row) * (isInsert ? 1 : -1); - var colShift = (end.column - start.column) * (isInsert ? 1 : -1); - if (isInsert) end = start; - - for (var i in this.marks) { - var point = this.marks[i]; - var cmp = comparePoints(point, start); - if (cmp < 0) { - continue; // delta starts after the range + Editor.prototype.destroy = function () { + this.destroyed = true; + if (this.$toDestroy) { + this.$toDestroy.forEach(function (el) { + el.destroy(); + }); + this.$toDestroy = []; } - if (cmp === 0) { - if (isInsert) { - if (point.bias == 1) { - cmp = 1; + if (this.$mouseHandler) + this.$mouseHandler.destroy(); + this.renderer.destroy(); + this._signal("destroy", this); + if (this.session) + this.session.destroy(); + if (this._$emitInputEvent) + this._$emitInputEvent.cancel(); + this.removeAllListeners(); + }; + Editor.prototype.setAutoScrollEditorIntoView = function (enable) { + if (!enable) + return; + var rect; + var self = this; + var shouldScroll = false; + if (!this.$scrollAnchor) + this.$scrollAnchor = document.createElement("div"); + var scrollAnchor = this.$scrollAnchor; + scrollAnchor.style.cssText = "position:absolute"; + this.container.insertBefore(scrollAnchor, this.container.firstChild); + var onChangeSelection = this.on("changeSelection", function () { + shouldScroll = true; + }); + var onBeforeRender = this.renderer.on("beforeRender", function () { + if (shouldScroll) + rect = self.renderer.container.getBoundingClientRect(); + }); + var onAfterRender = this.renderer.on("afterRender", function () { + if (shouldScroll && rect && (self.isFocused() + || self.searchBox && self.searchBox.isFocused())) { + var renderer = self.renderer; + var pos = renderer.$cursorLayer.$pixelPos; + var config = renderer.layerConfig; + var top = pos.top - config.offset; + if (pos.top >= 0 && top + rect.top < 0) { + shouldScroll = true; + } + else if (pos.top < config.height && + pos.top + rect.top + config.lineHeight > window.innerHeight) { + shouldScroll = false; } else { - point.bias == -1; - continue; + shouldScroll = null; + } + if (shouldScroll != null) { + scrollAnchor.style.top = top + "px"; + scrollAnchor.style.left = pos.left + "px"; + scrollAnchor.style.height = config.lineHeight + "px"; + scrollAnchor.scrollIntoView(shouldScroll); } + shouldScroll = rect = null; } - } - var cmp2 = isInsert ? cmp : comparePoints(point, end); - if (cmp2 > 0) { - point.row += rowShift; - point.column += point.row == end.row ? colShift : 0; - continue; - } - if (!isInsert && cmp2 <= 0) { - point.row = start.row; - point.column = start.column; - if (cmp2 === 0) - point.bias = 1; - } - } -} - - - -function clonePos(pos) { - return {row: pos.row,column: pos.column}; -} -function cloneDelta(d) { - return { - start: clonePos(d.start), - end: clonePos(d.end), - action: d.action, - lines: d.lines.slice() + }); + this.setAutoScrollEditorIntoView = function (enable) { + if (enable) + return; + delete this.setAutoScrollEditorIntoView; + this.off("changeSelection", onChangeSelection); + this.renderer.off("afterRender", onAfterRender); + this.renderer.off("beforeRender", onBeforeRender); + }; }; -} -function stringifyDelta(d) { - d = d || this; - if (Array.isArray(d)) { - return d.map(stringifyDelta).join("\n"); - } - var type = ""; - if (d.action) { - type = d.action == "insert" ? "+" : "-"; - type += "[" + d.lines + "]"; - } else if (d.value) { - if (Array.isArray(d.value)) { - type = d.value.map(stringifyRange).join("\n"); - } else { - type = stringifyRange(d.value); - } - } - if (d.start) { - type += stringifyRange(d); - } - if (d.id || d.rev) { - type += "\t(" + (d.id || d.rev) + ")"; - } - return type; -} -function stringifyRange(r) { - return r.start.row + ":" + r.start.column - + "=>" + r.end.row + ":" + r.end.column; -} - -function swap(d1, d2) { - var i1 = d1.action == "insert"; - var i2 = d2.action == "insert"; - - if (i1 && i2) { - if (cmp(d2.start, d1.end) >= 0) { - shift(d2, d1, -1); - } else if (cmp(d2.start, d1.start) <= 0) { - shift(d1, d2, +1); - } else { - return null; - } - } else if (i1 && !i2) { - if (cmp(d2.start, d1.end) >= 0) { - shift(d2, d1, -1); - } else if (cmp(d2.end, d1.start) <= 0) { - shift(d1, d2, -1); - } else { - return null; - } - } else if (!i1 && i2) { - if (cmp(d2.start, d1.start) >= 0) { - shift(d2, d1, +1); - } else if (cmp(d2.start, d1.start) <= 0) { - shift(d1, d2, +1); - } else { - return null; - } - } else if (!i1 && !i2) { - if (cmp(d2.start, d1.start) >= 0) { - shift(d2, d1, +1); - } else if (cmp(d2.end, d1.start) <= 0) { - shift(d1, d2, -1); - } else { - return null; - } - } - return [d2, d1]; -} -function swapGroups(ds1, ds2) { - for (var i = ds1.length; i--; ) { - for (var j = 0; j < ds2.length; j++) { - if (!swap(ds1[i], ds2[j])) { - while (i < ds1.length) { - while (j--) { - swap(ds2[j], ds1[i]); - } - j = ds2.length; - i++; - } - return [ds1, ds2]; - } - } - } - ds1.selectionBefore = ds2.selectionBefore = - ds1.selectionAfter = ds2.selectionAfter = null; - return [ds2, ds1]; -} -function xform(d1, c1) { - var i1 = d1.action == "insert"; - var i2 = c1.action == "insert"; - - if (i1 && i2) { - if (cmp(d1.start, c1.start) < 0) { - shift(c1, d1, 1); - } else { - shift(d1, c1, 1); - } - } else if (i1 && !i2) { - if (cmp(d1.start, c1.end) >= 0) { - shift(d1, c1, -1); - } else if (cmp(d1.start, c1.start) <= 0) { - shift(c1, d1, +1); - } else { - shift(d1, Range.fromPoints(c1.start, d1.start), -1); - shift(c1, d1, +1); - } - } else if (!i1 && i2) { - if (cmp(c1.start, d1.end) >= 0) { - shift(c1, d1, -1); - } else if (cmp(c1.start, d1.start) <= 0) { - shift(d1, c1, +1); - } else { - shift(c1, Range.fromPoints(d1.start, c1.start), -1); - shift(d1, c1, +1); - } - } else if (!i1 && !i2) { - if (cmp(c1.start, d1.end) >= 0) { - shift(c1, d1, -1); - } else if (cmp(c1.end, d1.start) <= 0) { - shift(d1, c1, -1); - } else { - var before, after; - if (cmp(d1.start, c1.start) < 0) { - before = d1; - d1 = splitDelta(d1, c1.start); + Editor.prototype.$resetCursorStyle = function () { + var style = this.$cursorStyle || "ace"; + var cursorLayer = this.renderer.$cursorLayer; + if (!cursorLayer) + return; + cursorLayer.setSmoothBlinking(/smooth/.test(style)); + cursorLayer.isBlinking = !this.$readOnly && style != "wide"; + dom.setCssClass(cursorLayer.element, "ace_slim-cursors", /slim/.test(style)); + }; + Editor.prototype.prompt = function (message, options, callback) { + var editor = this; + config.loadModule("ace/ext/prompt", function (module) { + module.prompt(editor, message, options, callback); + }); + }; + Object.defineProperty(Editor.prototype, "hoverTooltip", { + get: function () { + return this.$hoverTooltip || (this.$hoverTooltip = new HoverTooltip(this.container)); + }, + set: function (value) { + if (this.$hoverTooltip) + this.$hoverTooltip.destroy(); + this.$hoverTooltip = value; + }, + enumerable: false, + configurable: true + }); + return Editor; +}()); +Editor.$uid = 0; +Editor.prototype.curOp = null; +Editor.prototype.prevOp = {}; +Editor.prototype.$mergeableCommands = ["backspace", "del", "insertstring"]; +Editor.prototype.$toggleWordPairs = [ + ["first", "last"], + ["true", "false"], + ["yes", "no"], + ["width", "height"], + ["top", "bottom"], + ["right", "left"], + ["on", "off"], + ["x", "y"], + ["get", "set"], + ["max", "min"], + ["horizontal", "vertical"], + ["show", "hide"], + ["add", "remove"], + ["up", "down"], + ["before", "after"], + ["even", "odd"], + ["in", "out"], + ["inside", "outside"], + ["next", "previous"], + ["increase", "decrease"], + ["attach", "detach"], + ["&&", "||"], + ["==", "!="] +]; +oop.implement(Editor.prototype, EventEmitter); +config.defineOptions(Editor.prototype, "editor", { + selectionStyle: { + set: function (style) { + this.onSelectionChange(); + this._signal("changeSelectionStyle", { data: style }); + }, + initialValue: "line" + }, + highlightActiveLine: { + set: function () { this.$updateHighlightActiveLine(); }, + initialValue: true + }, + highlightSelectedWord: { + set: function (shouldHighlight) { this.$onSelectionChange(); }, + initialValue: true + }, + readOnly: { + set: function (/**@type{boolean}*/ readOnly) { + var _this = this; + this.textInput.setReadOnly(readOnly); + if (this.destroyed) + return; + this.$resetCursorStyle(); + if (!this.$readOnlyCallback) { + this.$readOnlyCallback = function (e) { + var shouldShow = false; + if (e && e.type == "keydown") { + if (e && e.key && !e.ctrlKey && !e.metaKey) { + if (e.key == " ") + e.preventDefault(); + shouldShow = e.key.length == 1; + } + if (!shouldShow) + return; + } + else if (e && e.type !== "exec") { + shouldShow = true; + } + if (shouldShow) { + var domNode = dom.createElement("div"); + domNode.textContent = nls("editor.tooltip.disable-editing", "Editing is disabled"); + if (!_this.hoverTooltip.isOpen) { + _this.hoverTooltip.showForRange(_this, _this.getSelectionRange(), domNode); + } + } + else if (_this.hoverTooltip && _this.hoverTooltip.isOpen) { + _this.hoverTooltip.hide(); + } + }; } - if (cmp(d1.end, c1.end) > 0) { - after = splitDelta(d1, c1.end); + var textArea = this.textInput.getElement(); + if (readOnly) { + event.addListener(textArea, "keydown", this.$readOnlyCallback, this); + this.commands.on("exec", this.$readOnlyCallback); + this.commands.on("commandUnavailable", this.$readOnlyCallback); } - - shiftPos(c1.end, d1.start, d1.end, -1); - if (after && !before) { - d1.lines = after.lines; - d1.start = after.start; - d1.end = after.end; - after = d1; + else { + event.removeListener(textArea, "keydown", this.$readOnlyCallback); + this.commands.off("exec", this.$readOnlyCallback); + this.commands.off("commandUnavailable", this.$readOnlyCallback); } - - return [c1, before, after].filter(Boolean); + }, + initialValue: false + }, + copyWithEmptySelection: { + set: function (value) { + this.textInput.setCopyWithEmptySelection(value); + }, + initialValue: false + }, + cursorStyle: { + set: function (val) { this.$resetCursorStyle(); }, + values: ["ace", "slim", "smooth", "wide"], + initialValue: "ace" + }, + mergeUndoDeltas: { + values: [false, true, "always"], + initialValue: true + }, + behavioursEnabled: { initialValue: true }, + wrapBehavioursEnabled: { initialValue: true }, + enableAutoIndent: { initialValue: true }, + autoScrollEditorIntoView: { + set: function (val) { this.setAutoScrollEditorIntoView(val); } + }, + keyboardHandler: { + set: function (val) { this.setKeyboardHandler(val); }, + get: function () { return this.$keybindingId; }, + handlesSet: true + }, + value: { + set: function (val) { this.session.setValue(val); }, + get: function () { return this.getValue(); }, + handlesSet: true, + hidden: true + }, + session: { + set: function (val) { this.setSession(val); }, + get: function () { return this.session; }, + handlesSet: true, + hidden: true + }, + showLineNumbers: { + set: function (show) { + this.renderer.$gutterLayer.setShowLineNumbers(show); + this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER); + if (show && this.$relativeLineNumbers) + relativeNumberRenderer.attach(this); + else + relativeNumberRenderer.detach(this); + }, + initialValue: true + }, + relativeLineNumbers: { + set: function (value) { + if (this.$showLineNumbers && value) + relativeNumberRenderer.attach(this); + else + relativeNumberRenderer.detach(this); } - } - return [c1, d1]; -} - -function shift(d1, d2, dir) { - shiftPos(d1.start, d2.start, d2.end, dir); - shiftPos(d1.end, d2.start, d2.end, dir); -} -function shiftPos(pos, start, end, dir) { - if (pos.row == (dir == 1 ? start : end).row) { - pos.column += dir * (end.column - start.column); - } - pos.row += dir * (end.row - start.row); -} -function splitDelta(c, pos) { - var lines = c.lines; - var end = c.end; - c.end = clonePos(pos); - var rowsBefore = c.end.row - c.start.row; - var otherLines = lines.splice(rowsBefore, lines.length); - - var col = rowsBefore ? pos.column : pos.column - c.start.column; - lines.push(otherLines[0].substring(0, col)); - otherLines[0] = otherLines[0].substr(col) ; - var rest = { - start: clonePos(pos), - end: end, - lines: otherLines, - action: c.action - }; - return rest; -} - -function moveDeltasByOne(redoStack, d) { - d = cloneDelta(d); - for (var j = redoStack.length; j--;) { - var deltaSet = redoStack[j]; - for (var i = 0; i < deltaSet.length; i++) { - var x = deltaSet[i]; - var xformed = xform(x, d); - d = xformed[0]; - if (xformed.length != 2) { - if (xformed[2]) { - deltaSet.splice(i + 1, 1, xformed[1], xformed[2]); - i++; - } else if (!xformed[1]) { - deltaSet.splice(i, 1); - i--; - } + }, + placeholder: { + set: function (message) { + if (!this.$updatePlaceholder) { + this.$updatePlaceholder = function () { + var hasValue = this.session && (this.renderer.$composition || + this.session.getLength() > 1 || this.session.getLine(0).length > 0); + if (hasValue && this.renderer.placeholderNode) { + this.renderer.off("afterRender", this.$updatePlaceholder); + dom.removeCssClass(this.container, "ace_hasPlaceholder"); + this.renderer.placeholderNode.remove(); + this.renderer.placeholderNode = null; + } + else if (!hasValue && !this.renderer.placeholderNode) { + this.renderer.on("afterRender", this.$updatePlaceholder); + dom.addCssClass(this.container, "ace_hasPlaceholder"); + var el = dom.createElement("div"); + el.className = "ace_placeholder"; + el.textContent = this.$placeholder || ""; + this.renderer.placeholderNode = el; + this.renderer.content.appendChild(this.renderer.placeholderNode); + } + else if (!hasValue && this.renderer.placeholderNode) { + this.renderer.placeholderNode.textContent = this.$placeholder || ""; + } + }.bind(this); + this.on("input", this.$updatePlaceholder); } + this.$updatePlaceholder(); } - if (!deltaSet.length) { - redoStack.splice(j, 1); - } - } - return redoStack; -} -function rebaseRedoStack(redoStack, deltaSets) { - for (var i = 0; i < deltaSets.length; i++) { - var deltas = deltaSets[i]; - for (var j = 0; j < deltas.length; j++) { - moveDeltasByOne(redoStack, deltas[j]); - } + }, + enableKeyboardAccessibility: { + set: function (value) { + var blurCommand = { + name: "blurTextInput", + description: "Set focus to the editor content div to allow tabbing through the page", + bindKey: "Esc", + exec: function (editor) { + editor.blur(); + editor.renderer.scroller.focus(); + }, + readOnly: true + }; + var focusOnEnterKeyup = function (e) { + if (e.target == this.renderer.scroller && e.keyCode === keys['enter']) { + e.preventDefault(); + var row = this.getCursorPosition().row; + if (!this.isRowVisible(row)) + this.scrollToLine(row, true, true); + this.focus(); + } + }; + var gutterKeyboardHandler; + if (value) { + this.renderer.enableKeyboardAccessibility = true; + this.renderer.keyboardFocusClassName = "ace_keyboard-focus"; + this.textInput.getElement().setAttribute("tabindex", -1); + this.textInput.setNumberOfExtraLines(useragent.isWin ? 3 : 0); + this.renderer.scroller.setAttribute("tabindex", 0); + this.renderer.scroller.setAttribute("role", "group"); + this.renderer.scroller.setAttribute("aria-roledescription", nls("editor.scroller.aria-roledescription", "editor")); + this.renderer.scroller.classList.add(this.renderer.keyboardFocusClassName); + this.renderer.scroller.setAttribute("aria-label", nls("editor.scroller.aria-label", "Editor content, press Enter to start editing, press Escape to exit")); + this.renderer.scroller.addEventListener("keyup", focusOnEnterKeyup.bind(this)); + this.commands.addCommand(blurCommand); + this.renderer.$gutter.setAttribute("tabindex", 0); + this.renderer.$gutter.setAttribute("aria-hidden", false); + this.renderer.$gutter.setAttribute("role", "group"); + this.renderer.$gutter.setAttribute("aria-roledescription", nls("editor.gutter.aria-roledescription", "editor gutter")); + this.renderer.$gutter.setAttribute("aria-label", nls("editor.gutter.aria-label", "Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit")); + this.renderer.$gutter.classList.add(this.renderer.keyboardFocusClassName); + this.renderer.content.setAttribute("aria-hidden", true); + if (!gutterKeyboardHandler) + gutterKeyboardHandler = new GutterKeyboardHandler(this); + gutterKeyboardHandler.addListener(); + this.textInput.setAriaOptions({ + setLabel: true + }); + } + else { + this.renderer.enableKeyboardAccessibility = false; + this.textInput.getElement().setAttribute("tabindex", 0); + this.textInput.setNumberOfExtraLines(0); + this.renderer.scroller.setAttribute("tabindex", -1); + this.renderer.scroller.removeAttribute("role"); + this.renderer.scroller.removeAttribute("aria-roledescription"); + this.renderer.scroller.classList.remove(this.renderer.keyboardFocusClassName); + this.renderer.scroller.removeAttribute("aria-label"); + this.renderer.scroller.removeEventListener("keyup", focusOnEnterKeyup.bind(this)); + this.commands.removeCommand(blurCommand); + this.renderer.content.removeAttribute("aria-hidden"); + this.renderer.$gutter.setAttribute("tabindex", -1); + this.renderer.$gutter.setAttribute("aria-hidden", true); + this.renderer.$gutter.removeAttribute("role"); + this.renderer.$gutter.removeAttribute("aria-roledescription"); + this.renderer.$gutter.removeAttribute("aria-label"); + this.renderer.$gutter.classList.remove(this.renderer.keyboardFocusClassName); + if (gutterKeyboardHandler) + gutterKeyboardHandler.removeListener(); + } + }, + initialValue: false + }, + textInputAriaLabel: { + set: function (val) { this.$textInputAriaLabel = val; }, + initialValue: "" + }, + enableMobileMenu: { + set: function (val) { this.$enableMobileMenu = val; }, + initialValue: true + }, + customScrollbar: "renderer", + hScrollBarAlwaysVisible: "renderer", + vScrollBarAlwaysVisible: "renderer", + highlightGutterLine: "renderer", + animatedScroll: "renderer", + showInvisibles: "renderer", + showPrintMargin: "renderer", + printMarginColumn: "renderer", + printMargin: "renderer", + fadeFoldWidgets: "renderer", + showFoldWidgets: "renderer", + displayIndentGuides: "renderer", + highlightIndentGuides: "renderer", + showGutter: "renderer", + fontSize: "renderer", + fontFamily: "renderer", + maxLines: "renderer", + minLines: "renderer", + scrollPastEnd: "renderer", + fixedWidthGutter: "renderer", + theme: "renderer", + hasCssTransforms: "renderer", + maxPixelHeight: "renderer", + useTextareaForIME: "renderer", + useResizeObserver: "renderer", + useSvgGutterIcons: "renderer", + showFoldedAnnotations: "renderer", + scrollSpeed: "$mouseHandler", + dragDelay: "$mouseHandler", + dragEnabled: "$mouseHandler", + focusTimeout: "$mouseHandler", + firstLineNumber: "session", + overwrite: "session", + newLineMode: "session", + useWorker: "session", + useSoftTabs: "session", + navigateWithinSoftTabs: "session", + tabSize: "session", + wrap: "session", + indentedSoftWrap: "session", + foldStyle: "session", + mode: "session" +}); +var relativeNumberRenderer = { + getText: function (/**@type{EditSession}*/ session, /**@type{number}*/ row) { + return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9 ? "\xb7" : ""))) + ""; + }, + getWidth: function (session, /**@type{number}*/ lastLineNumber, config) { + return Math.max(lastLineNumber.toString().length, (config.lastRow + 1).toString().length, 2) * config.characterWidth; + }, + update: function (e, /**@type{Editor}*/ editor) { + editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER); + }, + attach: function (/**@type{Editor}*/ editor) { + editor.renderer.$gutterLayer.$renderer = this; + editor.on("changeSelection", this.update); + this.update(null, editor); + }, + detach: function (/**@type{Editor}*/ editor) { + if (editor.renderer.$gutterLayer.$renderer == this) + editor.renderer.$gutterLayer.$renderer = null; + editor.off("changeSelection", this.update); + this.update(null, editor); } -} - -exports.UndoManager = UndoManager; +}; +exports.Editor = Editor; }); -define("ace/layer/lines",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/layer/lines",["require","exports","module","ace/lib/dom"], function(require, exports, module){"use strict"; var dom = require("../lib/dom"); - -var Lines = function(element, canvasHeight) { - this.element = element; - this.canvasHeight = canvasHeight || 500000; - this.element.style.height = (this.canvasHeight * 2) + "px"; - - this.cells = []; - this.cellCache = []; - this.$offsetCoefficient = 0; -}; - -(function() { - - this.moveContainer = function(config) { +var Lines = /** @class */ (function () { + function Lines(element, canvasHeight) { + this.element = element; + this.canvasHeight = canvasHeight || 500000; + this.element.style.height = (this.canvasHeight * 2) + "px"; + this.cells = []; + this.cellCache = []; + this.$offsetCoefficient = 0; + } + Lines.prototype.moveContainer = function (config) { dom.translate(this.element, 0, -((config.firstRowScreen * config.lineHeight) % this.canvasHeight) - config.offset * this.$offsetCoefficient); - }; - - this.pageChanged = function(oldConfig, newConfig) { - return ( - Math.floor((oldConfig.firstRowScreen * oldConfig.lineHeight) / this.canvasHeight) !== - Math.floor((newConfig.firstRowScreen * newConfig.lineHeight) / this.canvasHeight) - ); }; - - this.computeLineTop = function(row, config, session) { + Lines.prototype.pageChanged = function (oldConfig, newConfig) { + return (Math.floor((oldConfig.firstRowScreen * oldConfig.lineHeight) / this.canvasHeight) !== + Math.floor((newConfig.firstRowScreen * newConfig.lineHeight) / this.canvasHeight)); + }; + Lines.prototype.computeLineTop = function (row, config, session) { var screenTop = config.firstRowScreen * config.lineHeight; var screenPage = Math.floor(screenTop / this.canvasHeight); var lineTop = session.documentToScreenRow(row, 0) * config.lineHeight; return lineTop - (screenPage * this.canvasHeight); }; - - this.computeLineHeight = function(row, config, session) { + Lines.prototype.computeLineHeight = function (row, config, session) { return config.lineHeight * session.getRowLineCount(row); }; - - this.getLength = function() { + Lines.prototype.getLength = function () { return this.cells.length; }; - - this.get = function(index) { + Lines.prototype.get = function (index) { return this.cells[index]; }; - - this.shift = function() { + Lines.prototype.shift = function () { this.$cacheCell(this.cells.shift()); }; - - this.pop = function() { + Lines.prototype.pop = function () { this.$cacheCell(this.cells.pop()); }; - - this.push = function(cell) { + Lines.prototype.push = function (cell) { if (Array.isArray(cell)) { this.cells.push.apply(this.cells, cell); var fragment = dom.createFragment(this.element); - for (var i=0; i foldStart) { row = fold.end.row + 1; @@ -15575,68 +16580,57 @@ var Gutter = function(parentEl) { if (row > lastRow) { while (this.$lines.getLength() > index + 1) this.$lines.pop(); - break; } - cell = this.$lines.get(++index); if (cell) { cell.row = row; - } else { + } + else { cell = this.$lines.createCell(row, config, this.session, onCreateCell); this.$lines.push(cell); } - this.$renderCell(cell, config, fold, row); row++; } - this._signal("afterRender"); this.$updateGutterWidth(config); + if (this.$showCursorMarker && this.$highlightGutterLine) + this.$updateCursorMarker(); }; - - this.$updateGutterWidth = function(config) { + Gutter.prototype.$updateGutterWidth = function (config) { var session = this.session; - var gutterRenderer = session.gutterRenderer || this.$renderer; - var firstLineNumber = session.$firstLineNumber; var lastLineText = this.$lines.last() ? this.$lines.last().text : ""; - if (this.$fixedWidth || session.$useWrapMode) lastLineText = session.getLength() + firstLineNumber - 1; - - var gutterWidth = gutterRenderer + var gutterWidth = gutterRenderer ? gutterRenderer.getWidth(session, lastLineText, config) : lastLineText.toString().length * config.characterWidth; - var padding = this.$padding || this.$computePadding(); gutterWidth += padding.left + padding.right; if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) { - this.gutterWidth = gutterWidth; - this.element.parentNode.style.width = - this.element.style.width = Math.ceil(this.gutterWidth) + "px"; + this.gutterWidth = gutterWidth; (this.element.parentNode).style.width = + this.element.style.width = Math.ceil(this.gutterWidth) + "px"; this._signal("changeGutterWidth", gutterWidth); } }; - - this.$updateCursorRow = function() { + Gutter.prototype.$updateCursorRow = function () { if (!this.$highlightGutterLine) return; - var position = this.session.selection.getCursor(); if (this.$cursorRow === position.row) return; - this.$cursorRow = position.row; }; - - this.updateLineHighlight = function() { + Gutter.prototype.updateLineHighlight = function () { + if (this.$showCursorMarker) + this.$updateCursorMarker(); if (!this.$highlightGutterLine) return; var row = this.session.selection.cursor.row; this.$cursorRow = row; - if (this.$cursorCell && this.$cursorCell.row == row) return; if (this.$cursorCell) @@ -15659,93 +16653,99 @@ var Gutter = function(parentEl) { } } }; - - this.scrollLines = function(config) { + Gutter.prototype.$updateCursorMarker = function () { + if (!this.session) + return; + var session = this.session; + if (!this.$highlightElement) { + this.$highlightElement = dom.createElement("div"); + this.$highlightElement.className = "ace_gutter-cursor"; + this.$highlightElement.style.pointerEvents = "none"; + this.element.appendChild(this.$highlightElement); + } + var pos = session.selection.cursor; + var config = this.config; + var lines = this.$lines; + var screenTop = config.firstRowScreen * config.lineHeight; + var screenPage = Math.floor(screenTop / lines.canvasHeight); + var lineTop = session.documentToScreenRow(pos) * config.lineHeight; + var top = lineTop - (screenPage * lines.canvasHeight); + dom.setStyle(this.$highlightElement.style, "height", config.lineHeight + "px"); + dom.setStyle(this.$highlightElement.style, "top", top + "px"); + }; + Gutter.prototype.scrollLines = function (config) { var oldConfig = this.config; this.config = config; - this.$updateCursorRow(); if (this.$lines.pageChanged(oldConfig, config)) return this.update(config); - this.$lines.moveContainer(config); - - var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar - this.session.getLength() - 1); + var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar + this.session.getLength() - 1); var oldLastRow = this.oldLastRow; this.oldLastRow = lastRow; - if (!oldConfig || oldLastRow < config.firstRow) return this.update(config); - if (lastRow < oldConfig.firstRow) return this.update(config); - if (oldConfig.firstRow < config.firstRow) - for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--) + for (var row = this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row > 0; row--) this.$lines.shift(); - if (oldLastRow > lastRow) - for (var row=this.session.getFoldedRowCount(lastRow + 1, oldLastRow); row>0; row--) + for (var row = this.session.getFoldedRowCount(lastRow + 1, oldLastRow); row > 0; row--) this.$lines.pop(); - if (config.firstRow < oldConfig.firstRow) { this.$lines.unshift(this.$renderLines(config, config.firstRow, oldConfig.firstRow - 1)); } - if (lastRow > oldLastRow) { this.$lines.push(this.$renderLines(config, oldLastRow + 1, lastRow)); } - this.updateLineHighlight(); - this._signal("afterRender"); this.$updateGutterWidth(config); }; - - this.$renderLines = function(config, firstRow, lastRow) { + Gutter.prototype.$renderLines = function (config, firstRow, lastRow) { var fragment = []; var row = firstRow; var foldLine = this.session.getNextFoldLine(row); var foldStart = foldLine ? foldLine.start.row : Infinity; - while (true) { if (row > foldStart) { - row = foldLine.end.row+1; + row = foldLine.end.row + 1; foldLine = this.session.getNextFoldLine(row, foldLine); foldStart = foldLine ? foldLine.start.row : Infinity; } if (row > lastRow) break; - var cell = this.$lines.createCell(row, config, this.session, onCreateCell); this.$renderCell(cell, config, foldLine, row); fragment.push(cell); - row++; } return fragment; }; - - this.$renderCell = function(cell, config, fold, row) { + Gutter.prototype.$renderCell = function (cell, config, fold, row) { var element = cell.element; - var session = this.session; - var textNode = element.childNodes[0]; var foldWidget = element.childNodes[1]; - + var annotationNode = element.childNodes[2]; + var customWidget = element.childNodes[3]; + var annotationIconNode = annotationNode.firstChild; var firstLineNumber = session.$firstLineNumber; - var breakpoints = session.$breakpoints; var decorations = session.$decorations; var gutterRenderer = session.gutterRenderer || this.$renderer; var foldWidgets = this.$showFoldWidgets && session.foldWidgets; var foldStart = fold ? fold.start.row : Number.MAX_VALUE; - - var className = "ace_gutter-cell "; + var lineHeight = config.lineHeight + "px"; + var className = this.$useSvgGutterIcons ? "ace_gutter-cell_svg-icons " : "ace_gutter-cell "; + var iconClassName = this.$useSvgGutterIcons ? "ace_icon_svg" : "ace_icon"; + var rowText = (gutterRenderer + ? gutterRenderer.getText(session, row) + : row + firstLineNumber).toString(); if (this.$highlightGutterLine) { - if (row == this.$cursorRow || (fold && row < this.$cursorRow && row >= foldStart && this.$cursorRow <= fold.end.row)) { + if (row == this.$cursorRow || (fold && row < this.$cursorRow && row >= foldStart && this.$cursorRow <= fold.end.row)) { className += "ace_gutter-active-line "; if (this.$cursorCell != cell) { if (this.$cursorCell) @@ -15754,95 +16754,274 @@ var Gutter = function(parentEl) { } } } - if (breakpoints[row]) className += breakpoints[row]; if (decorations[row]) className += decorations[row]; - if (this.$annotations[row]) + if (this.$annotations[row] && row !== foldStart) className += this.$annotations[row].className; - if (element.className != className) - element.className = className; - if (foldWidgets) { var c = foldWidgets[row]; if (c == null) c = foldWidgets[row] = session.getFoldWidget(row); } - if (c) { - var className = "ace_fold-widget ace_" + c; - if (c == "start" && row == foldStart && row < fold.end.row) - className += " ace_closed"; + var foldClass = "ace_fold-widget ace_" + c; + var isClosedFold = c == "start" && row == foldStart && row < fold.end.row; + if (isClosedFold) { + foldClass += " ace_closed"; + var foldAnnotationClass = ""; + var annotationInFold = false; + for (var i = row + 1; i <= fold.end.row; i++) { + if (!this.$annotations[i]) + continue; + if (this.$annotations[i].className === " ace_error") { + annotationInFold = true; + foldAnnotationClass = " ace_error_fold"; + break; + } + if (this.$annotations[i].className === " ace_security") { + annotationInFold = true; + foldAnnotationClass = " ace_security_fold"; + } + else if (this.$annotations[i].className === " ace_warning" && + foldAnnotationClass !== " ace_security_fold") { + annotationInFold = true; + foldAnnotationClass = " ace_warning_fold"; + } + } + className += foldAnnotationClass; + } else - className += " ace_open"; - if (foldWidget.className != className) - foldWidget.className = className; - - var foldHeight = config.lineHeight + "px"; - dom.setStyle(foldWidget.style, "height", foldHeight); + foldClass += " ace_open"; + if (foldWidget.className != foldClass) + foldWidget.className = foldClass; + dom.setStyle(foldWidget.style, "height", lineHeight); dom.setStyle(foldWidget.style, "display", "inline-block"); - } else { + foldWidget.setAttribute("role", "button"); + foldWidget.setAttribute("tabindex", "-1"); + var foldRange = session.getFoldWidgetRange(row); + if (foldRange) + foldWidget.setAttribute("aria-label", nls("gutter.code-folding.range.aria-label", "Toggle code folding, rows $0 through $1", [ + foldRange.start.row + 1, + foldRange.end.row + 1 + ])); + else { + if (fold) + foldWidget.setAttribute("aria-label", nls("gutter.code-folding.closed.aria-label", "Toggle code folding, rows $0 through $1", [ + fold.start.row + 1, + fold.end.row + 1 + ])); + else + foldWidget.setAttribute("aria-label", nls("gutter.code-folding.open.aria-label", "Toggle code folding, row $0", [row + 1])); + } + if (isClosedFold) { + foldWidget.setAttribute("aria-expanded", "false"); + foldWidget.setAttribute("title", nls("gutter.code-folding.closed.title", "Unfold code")); + } + else { + foldWidget.setAttribute("aria-expanded", "true"); + foldWidget.setAttribute("title", nls("gutter.code-folding.open.title", "Fold code")); + } + } + else { if (foldWidget) { dom.setStyle(foldWidget.style, "display", "none"); + foldWidget.setAttribute("tabindex", "0"); + foldWidget.removeAttribute("role"); + foldWidget.removeAttribute("aria-label"); + } + } + var customWidgetAttributes = this.session.$gutterCustomWidgets[row]; + if (customWidgetAttributes) { + this.$addCustomWidget(row, customWidgetAttributes, cell); + } + else if (customWidget) { + this.$removeCustomWidget(row, cell); + } + if (annotationInFold && this.$showFoldedAnnotations) { + annotationNode.className = "ace_gutter_annotation"; + annotationIconNode.className = iconClassName; + annotationIconNode.className += foldAnnotationClass; + dom.setStyle(annotationIconNode.style, "height", lineHeight); + dom.setStyle(annotationNode.style, "display", "block"); + dom.setStyle(annotationNode.style, "height", lineHeight); + var ariaLabel; + switch (foldAnnotationClass) { + case " ace_error_fold": + ariaLabel = nls("gutter.annotation.aria-label.error", "Error, read annotations row $0", [rowText]); + break; + case " ace_security_fold": + ariaLabel = nls("gutter.annotation.aria-label.security", "Security finding, read annotations row $0", [rowText]); + break; + case " ace_warning_fold": + ariaLabel = nls("gutter.annotation.aria-label.warning", "Warning, read annotations row $0", [rowText]); + break; } + annotationNode.setAttribute("aria-label", ariaLabel); + annotationNode.setAttribute("tabindex", "-1"); + annotationNode.setAttribute("role", "button"); } - - var text = (gutterRenderer - ? gutterRenderer.getText(session, row) - : row + firstLineNumber).toString(); - - if (text !== textNode.data) { - textNode.data = text; + else if (this.$annotations[row]) { + annotationNode.className = "ace_gutter_annotation"; + annotationIconNode.className = iconClassName; + if (this.$useSvgGutterIcons) + annotationIconNode.className += this.$annotations[row].className; + else + element.classList.add(this.$annotations[row].className.replace(" ", "")); + dom.setStyle(annotationIconNode.style, "height", lineHeight); + dom.setStyle(annotationNode.style, "display", "block"); + dom.setStyle(annotationNode.style, "height", lineHeight); + var ariaLabel; + switch (this.$annotations[row].className) { + case " ace_error": + ariaLabel = nls("gutter.annotation.aria-label.error", "Error, read annotations row $0", [rowText]); + break; + case " ace_security": + ariaLabel = nls("gutter.annotation.aria-label.security", "Security finding, read annotations row $0", [rowText]); + break; + case " ace_warning": + ariaLabel = nls("gutter.annotation.aria-label.warning", "Warning, read annotations row $0", [rowText]); + break; + case " ace_info": + ariaLabel = nls("gutter.annotation.aria-label.info", "Info, read annotations row $0", [rowText]); + break; + case " ace_hint": + ariaLabel = nls("gutter.annotation.aria-label.hint", "Suggestion, read annotations row $0", [rowText]); + break; + } + annotationNode.setAttribute("aria-label", ariaLabel); + annotationNode.setAttribute("tabindex", "-1"); + annotationNode.setAttribute("role", "button"); + } + else { + dom.setStyle(annotationNode.style, "display", "none"); + annotationNode.removeAttribute("aria-label"); + annotationNode.removeAttribute("role"); + annotationNode.setAttribute("tabindex", "0"); + } + if (rowText !== textNode.data) { + textNode.data = rowText; } - + if (element.className != className) + element.className = className; dom.setStyle(cell.element.style, "height", this.$lines.computeLineHeight(row, config, session) + "px"); dom.setStyle(cell.element.style, "top", this.$lines.computeLineTop(row, config, session) + "px"); - - cell.text = text; + cell.text = rowText; + if (annotationNode.style.display === "none" && foldWidget.style.display === "none" && !customWidgetAttributes) + cell.element.setAttribute("aria-hidden", true); + else + cell.element.setAttribute("aria-hidden", false); return cell; }; - - this.$fixedWidth = false; - - this.$highlightGutterLine = true; - this.$renderer = ""; - this.setHighlightGutterLine = function(highlightGutterLine) { + Gutter.prototype.setHighlightGutterLine = function (highlightGutterLine) { this.$highlightGutterLine = highlightGutterLine; + if (!highlightGutterLine && this.$highlightElement) { + this.$highlightElement.remove(); + this.$highlightElement = null; + } }; - - this.$showLineNumbers = true; - this.$renderer = ""; - this.setShowLineNumbers = function(show) { + Gutter.prototype.setShowLineNumbers = function (show) { this.$renderer = !show && { - getWidth: function() {return 0;}, - getText: function() {return "";} + getWidth: function () { return 0; }, + getText: function () { return ""; } }; }; - - this.getShowLineNumbers = function() { + Gutter.prototype.getShowLineNumbers = function () { return this.$showLineNumbers; }; - - this.$showFoldWidgets = true; - this.setShowFoldWidgets = function(show) { + Gutter.prototype.setShowFoldWidgets = function (show) { if (show) dom.addCssClass(this.element, "ace_folding-enabled"); else dom.removeCssClass(this.element, "ace_folding-enabled"); - this.$showFoldWidgets = show; this.$padding = null; }; - - this.getShowFoldWidgets = function() { + Gutter.prototype.getShowFoldWidgets = function () { return this.$showFoldWidgets; }; - - this.$computePadding = function() { + Gutter.prototype.$hideFoldWidget = function (row, cell) { + var rowCell = cell || this.$getGutterCell(row); + if (rowCell && rowCell.element) { + var foldWidget = rowCell.element.childNodes[1]; + if (foldWidget) { + dom.setStyle(foldWidget.style, "display", "none"); + } + } + }; + Gutter.prototype.$showFoldWidget = function (row, cell) { + var rowCell = cell || this.$getGutterCell(row); + if (rowCell && rowCell.element) { + var foldWidget = rowCell.element.childNodes[1]; + if (foldWidget && this.session.foldWidgets && this.session.foldWidgets[rowCell.row]) { + dom.setStyle(foldWidget.style, "display", "inline-block"); + } + } + }; + Gutter.prototype.$getGutterCell = function (row) { + var cells = this.$lines.cells; + var min = 0; + var max = cells.length - 1; + if (row < cells[0].row || row > cells[max].row) + return; + while (min <= max) { + var mid = Math.floor((min + max) / 2); + var cell = cells[mid]; + if (cell.row > row) { + max = mid - 1; + } + else if (cell.row < row) { + min = mid + 1; + } + else { + return cell; + } + } + return cell; + }; + Gutter.prototype.$addCustomWidget = function (row, _a, cell) { + var className = _a.className, label = _a.label, title = _a.title, callbacks = _a.callbacks; + this.session.$gutterCustomWidgets[row] = { className: className, label: label, title: title, callbacks: callbacks }; + this.$hideFoldWidget(row, cell); + var rowCell = cell || this.$getGutterCell(row); + if (rowCell && rowCell.element) { + var customWidget = rowCell.element.querySelector(".ace_custom-widget"); + if (customWidget) { + customWidget.remove(); + } + customWidget = dom.createElement("span"); + customWidget.className = "ace_custom-widget ".concat(className); + customWidget.setAttribute("tabindex", "-1"); + customWidget.setAttribute("role", 'button'); + customWidget.setAttribute("aria-label", label); + customWidget.setAttribute("title", title); + dom.setStyle(customWidget.style, "display", "inline-block"); + dom.setStyle(customWidget.style, "height", "inherit"); + if (callbacks && callbacks.onClick) { + customWidget.addEventListener("click", function (e) { + callbacks.onClick(e, row); + e.stopPropagation(); + }); + } + rowCell.element.appendChild(customWidget); + } + }; + Gutter.prototype.$removeCustomWidget = function (row, cell) { + delete this.session.$gutterCustomWidgets[row]; + this.$showFoldWidget(row, cell); + var rowCell = cell || this.$getGutterCell(row); + if (rowCell && rowCell.element) { + var customWidget = rowCell.element.querySelector(".ace_custom-widget"); + if (customWidget) { + rowCell.element.removeChild(customWidget); + } + } + }; + Gutter.prototype.$computePadding = function () { if (!this.element.firstChild) - return {left: 0, right: 0}; - var style = dom.computedStyle(this.element.firstChild); + return { left: 0, right: 0 }; + var style = dom.computedStyle(/**@type{Element}*/ (this.element.firstChild)); this.$padding = {}; this.$padding.left = (parseInt(style.borderLeftWidth) || 0) + (parseInt(style.paddingLeft) || 0) + 1; @@ -15850,8 +17029,7 @@ var Gutter = function(parentEl) { + (parseInt(style.paddingRight) || 0); return this.$padding; }; - - this.getRegion = function(point) { + Gutter.prototype.getRegion = function (point) { var padding = this.$padding || this.$computePadding(); var rect = this.element.getBoundingClientRect(); if (point.x < padding.left + rect.left) @@ -15859,118 +17037,111 @@ var Gutter = function(parentEl) { if (this.$showFoldWidgets && point.x > rect.right - padding.right) return "foldWidgets"; }; - -}).call(Gutter.prototype); - + return Gutter; +}()); +Gutter.prototype.$fixedWidth = false; +Gutter.prototype.$highlightGutterLine = true; +Gutter.prototype.$renderer = undefined; +Gutter.prototype.$showLineNumbers = true; +Gutter.prototype.$showFoldWidgets = true; +oop.implement(Gutter.prototype, EventEmitter); function onCreateCell(element) { var textNode = document.createTextNode(''); element.appendChild(textNode); - var foldWidget = dom.createElement("span"); element.appendChild(foldWidget); - + var annotationNode = dom.createElement("span"); + element.appendChild(annotationNode); + var annotationIconNode = dom.createElement("span"); + annotationNode.appendChild(annotationIconNode); return element; } - exports.Gutter = Gutter; }); -define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"], function(require, exports, module){"use strict"; var Range = require("../range").Range; var dom = require("../lib/dom"); - -var Marker = function(parentEl) { - this.element = dom.createElement("div"); - this.element.className = "ace_layer ace_marker-layer"; - parentEl.appendChild(this.element); -}; - -(function() { - - this.$padding = 0; - - this.setPadding = function(padding) { +var Marker = /** @class */ (function () { + function Marker(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_marker-layer"; + parentEl.appendChild(this.element); + } + Marker.prototype.setPadding = function (padding) { this.$padding = padding; }; - this.setSession = function(session) { + Marker.prototype.setSession = function (session) { this.session = session; }; - - this.setMarkers = function(markers) { + Marker.prototype.setMarkers = function (markers) { this.markers = markers; }; - - this.elt = function(className, css) { + Marker.prototype.elt = function (className, css) { var x = this.i != -1 && this.element.childNodes[this.i]; if (!x) { x = document.createElement("div"); this.element.appendChild(x); this.i = -1; - } else { + } + else { this.i++; } x.style.cssText = css; x.className = className; }; - - this.update = function(config) { - if (!config) return; - + Marker.prototype.update = function (config) { + if (!config) + return; this.config = config; - this.i = 0; var html; for (var key in this.markers) { var marker = this.markers[key]; - if (!marker.range) { marker.update(html, this, this.session, config); continue; } - var range = marker.range.clipRows(config.firstRow, config.lastRow); - if (range.isEmpty()) continue; - + if (range.isEmpty()) + continue; range = range.toScreenRange(this.session); if (marker.renderer) { var top = this.$getTop(range.start.row, config); var left = this.$padding + range.start.column * config.characterWidth; marker.renderer(html, range, left, top, config); - } else if (marker.type == "fullLine") { + } + else if (marker.type == "fullLine") { this.drawFullLineMarker(html, range, marker.clazz, config); - } else if (marker.type == "screenLine") { + } + else if (marker.type == "screenLine") { this.drawScreenLineMarker(html, range, marker.clazz, config); - } else if (range.isMultiLine()) { + } + else if (range.isMultiLine()) { if (marker.type == "text") this.drawTextMarker(html, range, marker.clazz, config); else this.drawMultiLineMarker(html, range, marker.clazz, config); - } else { + } + else { this.drawSingleLineMarker(html, range, marker.clazz + " ace_start" + " ace_br15", config); } } - if (this.i !=-1) { + if (this.i != -1) { while (this.i < this.element.childElementCount) this.element.removeChild(this.element.lastChild); } }; - - this.$getTop = function(row, layerConfig) { + Marker.prototype.$getTop = function (row, layerConfig) { return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight; }; - - function getBorderClass(tl, tr, br, bl) { - return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0); - } - this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) { + Marker.prototype.drawTextMarker = function (stringBuilder, range, clazz, layerConfig, extraStyle) { var session = this.session; var start = range.start.row; var end = range.end.row; var row = start; - var prev = 0; + var prev = 0; var curr = 0; var next = session.getScreenLastRowColumn(row); var lineRange = new Range(row, range.start.column, row, curr); @@ -15981,158 +17152,123 @@ var Marker = function(parentEl) { prev = curr; curr = next; next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column; - this.drawSingleLineMarker(stringBuilder, lineRange, - clazz + (row == start ? " ace_start" : "") + " ace_br" - + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end), - layerConfig, row == end ? 0 : 1, extraStyle); + this.drawSingleLineMarker(stringBuilder, lineRange, clazz + (row == start ? " ace_start" : "") + " ace_br" + + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end), layerConfig, row == end ? 0 : 1, extraStyle); } }; - this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + Marker.prototype.drawMultiLineMarker = function (stringBuilder, range, clazz, config, extraStyle) { var padding = this.$padding; var height = config.lineHeight; var top = this.$getTop(range.start.row, config); var left = padding + range.start.column * config.characterWidth; extraStyle = extraStyle || ""; - if (this.session.$bidiHandler.isBidiRow(range.start.row)) { - var range1 = range.clone(); - range1.end.row = range1.start.row; - range1.end.column = this.session.getLine(range1.start.row).length; - this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + " ace_br1 ace_start", config, null, extraStyle); - } else { - this.elt( - clazz + " ace_br1 ace_start", - "height:"+ height+ "px;"+ "right:0;"+ "top:"+top+ "px;left:"+ left+ "px;" + (extraStyle || "") - ); + var range1 = range.clone(); + range1.end.row = range1.start.row; + range1.end.column = this.session.getLine(range1.start.row).length; + this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + " ace_br1 ace_start", config, null, extraStyle); + } + else { + this.elt(clazz + " ace_br1 ace_start", "height:" + height + "px;" + "right:" + padding + "px;" + "top:" + top + "px;left:" + left + "px;" + (extraStyle || "")); } if (this.session.$bidiHandler.isBidiRow(range.end.row)) { - var range1 = range.clone(); - range1.start.row = range1.end.row; - range1.start.column = 0; - this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + " ace_br12", config, null, extraStyle); - } else { + var range1 = range.clone(); + range1.start.row = range1.end.row; + range1.start.column = 0; + this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + " ace_br12", config, null, extraStyle); + } + else { top = this.$getTop(range.end.row, config); var width = range.end.column * config.characterWidth; - - this.elt( - clazz + " ace_br12", - "height:"+ height+ "px;"+ - "width:"+ width+ "px;"+ - "top:"+ top+ "px;"+ - "left:"+ padding+ "px;"+ (extraStyle || "") - ); + this.elt(clazz + " ace_br12", "height:" + height + "px;" + + "width:" + width + "px;" + + "top:" + top + "px;" + + "left:" + padding + "px;" + (extraStyle || "")); } height = (range.end.row - range.start.row - 1) * config.lineHeight; if (height <= 0) return; top = this.$getTop(range.start.row + 1, config); - var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8); - - this.elt( - clazz + (radiusClass ? " ace_br" + radiusClass : ""), - "height:"+ height+ "px;"+ - "right:0;"+ - "top:"+ top+ "px;"+ - "left:"+ padding+ "px;"+ (extraStyle || "") - ); - }; - this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) { + this.elt(clazz + (radiusClass ? " ace_br" + radiusClass : ""), "height:" + height + "px;" + + "right:" + padding + "px;" + + "top:" + top + "px;" + + "left:" + padding + "px;" + (extraStyle || "")); + }; + Marker.prototype.drawSingleLineMarker = function (stringBuilder, range, clazz, config, extraLength, extraStyle) { if (this.session.$bidiHandler.isBidiRow(range.start.row)) return this.drawBidiSingleLineMarker(stringBuilder, range, clazz, config, extraLength, extraStyle); var height = config.lineHeight; var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth; - var top = this.$getTop(range.start.row, config); var left = this.$padding + range.start.column * config.characterWidth; - - this.elt( - clazz, - "height:"+ height+ "px;"+ - "width:"+ width+ "px;"+ - "top:"+ top+ "px;"+ - "left:"+ left+ "px;"+ (extraStyle || "") - ); - }; - this.drawBidiSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) { + this.elt(clazz, "height:" + height + "px;" + + "width:" + width + "px;" + + "top:" + top + "px;" + + "left:" + left + "px;" + (extraStyle || "")); + }; + Marker.prototype.drawBidiSingleLineMarker = function (stringBuilder, range, clazz, config, extraLength, extraStyle) { var height = config.lineHeight, top = this.$getTop(range.start.row, config), padding = this.$padding; var selections = this.session.$bidiHandler.getSelections(range.start.column, range.end.column); - - selections.forEach(function(selection) { - this.elt( - clazz, - "height:" + height + "px;" + - "width:" + selection.width + (extraLength || 0) + "px;" + + selections.forEach(function (selection) { + this.elt(clazz, "height:" + height + "px;" + + "width:" + (selection.width + (extraLength || 0)) + "px;" + "top:" + top + "px;" + - "left:" + (padding + selection.left) + "px;" + (extraStyle || "") - ); + "left:" + (padding + selection.left) + "px;" + (extraStyle || "")); }, this); }; - - this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + Marker.prototype.drawFullLineMarker = function (stringBuilder, range, clazz, config, extraStyle) { var top = this.$getTop(range.start.row, config); var height = config.lineHeight; if (range.start.row != range.end.row) height += this.$getTop(range.end.row, config) - top; - - this.elt( - clazz, - "height:"+ height+ "px;"+ - "top:"+ top+ "px;"+ - "left:0;right:0;"+ (extraStyle || "") - ); + this.elt(clazz, "height:" + height + "px;" + + "top:" + top + "px;" + + "left:0;right:0;" + (extraStyle || "")); }; - - this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + Marker.prototype.drawScreenLineMarker = function (stringBuilder, range, clazz, config, extraStyle) { var top = this.$getTop(range.start.row, config); var height = config.lineHeight; - - this.elt( - clazz, - "height:"+ height+ "px;"+ - "top:"+ top+ "px;"+ - "left:0;right:0;"+ (extraStyle || "") - ); - }; - -}).call(Marker.prototype); - + this.elt(clazz, "height:" + height + "px;" + + "top:" + top + "px;" + + "left:0;right:0;" + (extraStyle || "")); + }; + return Marker; +}()); +Marker.prototype.$padding = 0; +function getBorderClass(tl, tr, br, bl) { + return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0); +} exports.Marker = Marker; }); -define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/layer/lines","ace/lib/event_emitter"], function(require, exports, module) { -"use strict"; +define("ace/layer/text_util",["require","exports","module"], function(require, exports, module){// Tokens for which Ace just uses a simple TextNode and does not add any special className. +var textTokens = new Set(["text", "rparen", "lparen"]); +exports.isTextToken = function (tokenType) { + return textTokens.has(tokenType); +}; + +}); +define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/layer/lines","ace/lib/event_emitter","ace/config","ace/layer/text_util"], function(require, exports, module){"use strict"; var oop = require("../lib/oop"); var dom = require("../lib/dom"); var lang = require("../lib/lang"); var Lines = require("./lines").Lines; var EventEmitter = require("../lib/event_emitter").EventEmitter; - -var Text = function(parentEl) { - this.dom = dom; - this.element = this.dom.createElement("div"); - this.element.className = "ace_layer ace_text-layer"; - parentEl.appendChild(this.element); - this.$updateEolChar = this.$updateEolChar.bind(this); - this.$lines = new Lines(this.element); -}; - -(function() { - - oop.implement(this, EventEmitter); - - this.EOF_CHAR = "\xB6"; - this.EOL_CHAR_LF = "\xAC"; - this.EOL_CHAR_CRLF = "\xa4"; - this.EOL_CHAR = this.EOL_CHAR_LF; - this.TAB_CHAR = "\u2014"; //"\u21E5"; - this.SPACE_CHAR = "\xB7"; - this.$padding = 0; - this.MAX_LINE_LENGTH = 10000; - - this.$updateEolChar = function() { +var nls = require("../config").nls; +var isTextToken = require("./text_util").isTextToken; +var Text = /** @class */ (function () { + function Text(parentEl) { + this.dom = dom; + this.element = this.dom.createElement("div"); + this.element.className = "ace_layer ace_text-layer"; + parentEl.appendChild(this.element); + this.$updateEolChar = this.$updateEolChar.bind(this); + this.$lines = new Lines(this.element); + } + Text.prototype.$updateEolChar = function () { var doc = this.session.doc; var unixMode = doc.getNewLineCharacter() == "\n" && doc.getNewLineMode() != "windows"; var EOL_CHAR = unixMode ? this.EOL_CHAR_LF : this.EOL_CHAR_CRLF; @@ -16141,162 +17277,138 @@ var Text = function(parentEl) { return true; } }; - - this.setPadding = function(padding) { + Text.prototype.setPadding = function (padding) { this.$padding = padding; this.element.style.margin = "0 " + padding + "px"; }; - - this.getLineHeight = function() { + Text.prototype.getLineHeight = function () { return this.$fontMetrics.$characterSize.height || 0; }; - - this.getCharacterWidth = function() { + Text.prototype.getCharacterWidth = function () { return this.$fontMetrics.$characterSize.width || 0; }; - - this.$setFontMetrics = function(measure) { + Text.prototype.$setFontMetrics = function (measure) { this.$fontMetrics = measure; - this.$fontMetrics.on("changeCharacterSize", function(e) { + this.$fontMetrics.on("changeCharacterSize", + function (e) { this._signal("changeCharacterSize", e); }.bind(this)); this.$pollSizeChanges(); }; - - this.checkForSizeChanges = function() { + Text.prototype.checkForSizeChanges = function () { this.$fontMetrics.checkForSizeChanges(); }; - this.$pollSizeChanges = function() { + Text.prototype.$pollSizeChanges = function () { return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges(); }; - this.setSession = function(session) { + Text.prototype.setSession = function (session) { this.session = session; if (session) this.$computeTabString(); }; - - this.showInvisibles = false; - this.showSpaces = false; - this.showTabs = false; - this.showEOL = false; - this.setShowInvisibles = function(showInvisibles) { + Text.prototype.setShowInvisibles = function (showInvisibles) { if (this.showInvisibles == showInvisibles) return false; - this.showInvisibles = showInvisibles; if (typeof showInvisibles == "string") { this.showSpaces = /tab/i.test(showInvisibles); this.showTabs = /space/i.test(showInvisibles); this.showEOL = /eol/i.test(showInvisibles); - } else { + } + else { this.showSpaces = this.showTabs = this.showEOL = showInvisibles; } this.$computeTabString(); return true; }; - - this.displayIndentGuides = true; - this.setDisplayIndentGuides = function(display) { + Text.prototype.setDisplayIndentGuides = function (display) { if (this.displayIndentGuides == display) return false; - this.displayIndentGuides = display; this.$computeTabString(); return true; }; - - this.$tabStrings = []; - this.onChangeTabSize = - this.$computeTabString = function() { + Text.prototype.setHighlightIndentGuides = function (highlight) { + if (this.$highlightIndentGuides === highlight) + return false; + this.$highlightIndentGuides = highlight; + return highlight; + }; + Text.prototype.$computeTabString = function () { var tabSize = this.session.getTabSize(); - this.tabSize = tabSize; - var tabStr = this.$tabStrings = [0]; + this.tabSize = tabSize; var tabStr = this.$tabStrings = [0]; for (var i = 1; i < tabSize + 1; i++) { if (this.showTabs) { var span = this.dom.createElement("span"); span.className = "ace_invisible ace_invisible_tab"; span.textContent = lang.stringRepeat(this.TAB_CHAR, i); tabStr.push(span); - } else { + } + else { tabStr.push(this.dom.createTextNode(lang.stringRepeat(" ", i), this.element)); } } if (this.displayIndentGuides) { - this.$indentGuideRe = /\s\S| \t|\t |\s$/; + this.$indentGuideRe = /\s\S| \t|\t |\s$/; var className = "ace_indent-guide"; var spaceClass = this.showSpaces ? " ace_invisible ace_invisible_space" : ""; var spaceContent = this.showSpaces ? lang.stringRepeat(this.SPACE_CHAR, this.tabSize) : lang.stringRepeat(" ", this.tabSize); - var tabClass = this.showTabs ? " ace_invisible ace_invisible_tab" : ""; - var tabContent = this.showTabs + var tabContent = this.showTabs ? lang.stringRepeat(this.TAB_CHAR, this.tabSize) : spaceContent; - var span = this.dom.createElement("span"); span.className = className + spaceClass; span.textContent = spaceContent; this.$tabStrings[" "] = span; - var span = this.dom.createElement("span"); span.className = className + tabClass; span.textContent = tabContent; this.$tabStrings["\t"] = span; } }; - - this.updateLines = function(config, firstRow, lastRow) { + Text.prototype.updateLines = function (config, firstRow, lastRow) { if (this.config.lastRow != config.lastRow || this.config.firstRow != config.firstRow) { return this.update(config); } - this.config = config; - var first = Math.max(firstRow, config.firstRow); var last = Math.min(lastRow, config.lastRow); - var lineElements = this.element.childNodes; var lineElementsIdx = 0; - for (var row = config.firstRow; row < first; row++) { var foldLine = this.session.getFoldLine(row); if (foldLine) { if (foldLine.containsRow(first)) { first = foldLine.start.row; break; - } else { + } + else { row = foldLine.end.row; } } - lineElementsIdx ++; + lineElementsIdx++; } - var heightChanged = false; var row = first; var foldLine = this.session.getNextFoldLine(row); var foldStart = foldLine ? foldLine.start.row : Infinity; - while (true) { if (row > foldStart) { - row = foldLine.end.row+1; + row = foldLine.end.row + 1; foldLine = this.session.getNextFoldLine(row, foldLine); - foldStart = foldLine ? foldLine.start.row :Infinity; + foldStart = foldLine ? foldLine.start.row : Infinity; } if (row > last) - break; - - var lineElement = lineElements[lineElementsIdx++]; + break; var lineElement = lineElements[lineElementsIdx++]; if (lineElement) { this.dom.removeChildren(lineElement); - this.$renderLine( - lineElement, row, row == foldStart ? foldLine : false - ); - + this.$renderLine(lineElement, row, row == foldStart ? foldLine : false); if (heightChanged) lineElement.style.top = this.$lines.computeLineTop(row, config, this.session) + "px"; - var height = (config.lineHeight * this.session.getRowLength(row)) + "px"; if (lineElement.style.height != height) { heightChanged = true; @@ -16312,110 +17424,80 @@ var Text = function(parentEl) { } } }; - - this.scrollLines = function(config) { + Text.prototype.scrollLines = function (config) { var oldConfig = this.config; this.config = config; - if (this.$lines.pageChanged(oldConfig, config)) return this.update(config); - this.$lines.moveContainer(config); - var lastRow = config.lastRow; var oldLastRow = oldConfig ? oldConfig.lastRow : -1; - if (!oldConfig || oldLastRow < config.firstRow) return this.update(config); - if (lastRow < oldConfig.firstRow) return this.update(config); - if (!oldConfig || oldConfig.lastRow < config.firstRow) return this.update(config); - if (config.lastRow < oldConfig.firstRow) return this.update(config); - if (oldConfig.firstRow < config.firstRow) - for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--) + for (var row = this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row > 0; row--) this.$lines.shift(); - if (oldConfig.lastRow > config.lastRow) - for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--) + for (var row = this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row > 0; row--) this.$lines.pop(); - if (config.firstRow < oldConfig.firstRow) { this.$lines.unshift(this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1)); } - if (config.lastRow > oldConfig.lastRow) { this.$lines.push(this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow)); } + this.$highlightIndentGuide(); }; - - this.$renderLinesFragment = function(config, firstRow, lastRow) { + Text.prototype.$renderLinesFragment = function (config, firstRow, lastRow) { var fragment = []; var row = firstRow; var foldLine = this.session.getNextFoldLine(row); var foldStart = foldLine ? foldLine.start.row : Infinity; - while (true) { if (row > foldStart) { - row = foldLine.end.row+1; + row = foldLine.end.row + 1; foldLine = this.session.getNextFoldLine(row, foldLine); foldStart = foldLine ? foldLine.start.row : Infinity; } if (row > lastRow) break; - var line = this.$lines.createCell(row, config, this.session); - var lineEl = line.element; this.dom.removeChildren(lineEl); dom.setStyle(lineEl.style, "height", this.$lines.computeLineHeight(row, config, this.session) + "px"); dom.setStyle(lineEl.style, "top", this.$lines.computeLineTop(row, config, this.session) + "px"); this.$renderLine(lineEl, row, row == foldStart ? foldLine : false); - if (this.$useLineGroups()) { lineEl.className = "ace_line_group"; - } else { + } + else { lineEl.className = "ace_line"; } fragment.push(line); - row++; } return fragment; }; - - this.update = function(config) { + Text.prototype.update = function (config) { this.$lines.moveContainer(config); - this.config = config; - var firstRow = config.firstRow; var lastRow = config.lastRow; - var lines = this.$lines; while (lines.getLength()) lines.pop(); - lines.push(this.$renderLinesFragment(config, firstRow, lastRow)); }; - - this.$textToken = { - "text": true, - "rparen": true, - "lparen": true - }; - - this.$renderToken = function(parent, screenColumn, token, value) { + Text.prototype.$renderToken = function (parent, screenColumn, token, value) { var self = this; - var re = /(\t)|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF\uFFF9-\uFFFC\u2066\u2067\u2068\u202A\u202B\u202D\u202E\u202C\u2069]+)|(\u3000)|([\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3001-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF])/g; - + var re = /(\t)|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF\uFFF9-\uFFFC\u2066\u2067\u2068\u202A\u202B\u202D\u202E\u202C\u2069\u2060\u2061\u2062\u2063\u2064\u206A\u206B\u206B\u206C\u206D\u206E\u206F]+)|(\u3000)|([\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3001-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF])/g; var valueFragment = this.dom.createFragment(this.element); - var m; var i = 0; while (m = re.exec(value)) { @@ -16424,45 +17506,46 @@ var Text = function(parentEl) { var controlCharacter = m[3]; var cjkSpace = m[4]; var cjk = m[5]; - if (!self.showSpaces && simpleSpace) continue; - var before = i != m.index ? value.slice(i, m.index) : ""; - i = m.index + m[0].length; - if (before) { valueFragment.appendChild(this.dom.createTextNode(before, this.element)); } - if (tab) { var tabSize = self.session.getScreenTabSize(screenColumn + m.index); - valueFragment.appendChild(self.$tabStrings[tabSize].cloneNode(true)); + var text = self.$tabStrings[tabSize].cloneNode(true); + text["charCount"] = 1; + valueFragment.appendChild(text); screenColumn += tabSize - 1; - } else if (simpleSpace) { + } + else if (simpleSpace) { if (self.showSpaces) { var span = this.dom.createElement("span"); span.className = "ace_invisible ace_invisible_space"; span.textContent = lang.stringRepeat(self.SPACE_CHAR, simpleSpace.length); valueFragment.appendChild(span); - } else { - valueFragment.appendChild(this.com.createTextNode(simpleSpace, this.element)); } - } else if (controlCharacter) { + else { + valueFragment.appendChild(this.dom.createTextNode(simpleSpace, this.element)); + } + } + else if (controlCharacter) { var span = this.dom.createElement("span"); span.className = "ace_invisible ace_invisible_space ace_invalid"; span.textContent = lang.stringRepeat(self.SPACE_CHAR, controlCharacter.length); valueFragment.appendChild(span); - } else if (cjkSpace) { + } + else if (cjkSpace) { screenColumn += 1; - var span = this.dom.createElement("span"); span.style.width = (self.config.characterWidth * 2) + "px"; span.className = self.showSpaces ? "ace_cjk ace_invisible ace_invisible_space" : "ace_cjk"; span.textContent = self.showSpaces ? self.SPACE_CHAR : cjkSpace; valueFragment.appendChild(span); - } else if (cjk) { + } + else if (cjk) { screenColumn += 1; var span = this.dom.createElement("span"); span.style.width = (self.config.characterWidth * 2) + "px"; @@ -16471,64 +17554,168 @@ var Text = function(parentEl) { valueFragment.appendChild(span); } } - valueFragment.appendChild(this.dom.createTextNode(i ? value.slice(i) : value, this.element)); - - if (!this.$textToken[token.type]) { + if (!isTextToken(token.type)) { var classes = "ace_" + token.type.replace(/\./g, " ace_"); var span = this.dom.createElement("span"); - if (token.type == "fold") + if (token.type == "fold") { span.style.width = (token.value.length * this.config.characterWidth) + "px"; - + span.setAttribute("title", nls("inline-fold.closed.title", "Unfold code")); + } span.className = classes; span.appendChild(valueFragment); - parent.appendChild(span); } else { parent.appendChild(valueFragment); } - return screenColumn + value.length; }; - - this.renderIndentGuide = function(parent, value, max) { + Text.prototype.renderIndentGuide = function (parent, value, max) { var cols = value.search(this.$indentGuideRe); if (cols <= 0 || cols >= max) return value; if (value[0] == " ") { cols -= cols % this.tabSize; - var count = cols/this.tabSize; - for (var i=0; i ranges[i].start.row) { + this.$highlightIndentGuideMarker.dir = -1; + } + else { + this.$highlightIndentGuideMarker.dir = 1; + } + break; + } + } + } + if (!this.$highlightIndentGuideMarker.end) { + if (lines[cursor.row] !== '' && cursor.column === lines[cursor.row].length) { + this.$highlightIndentGuideMarker.dir = 1; + for (var i = cursor.row + 1; i < lines.length; i++) { + var line = lines[i]; + var currentIndent = /^\s*/.exec(line)[0].length; + if (line !== '') { + this.$highlightIndentGuideMarker.end = i; + if (currentIndent <= initialIndent) + break; + } + } + } + } + this.$renderHighlightIndentGuide(); + }; + Text.prototype.$clearActiveIndentGuide = function () { + var activeIndentGuides = this.element.querySelectorAll(".ace_indent-guide-active"); + for (var i = 0; i < activeIndentGuides.length; i++) { + activeIndentGuides[i].classList.remove("ace_indent-guide-active"); + } + }; + Text.prototype.$setIndentGuideActive = function (cell, indentLevel) { + var line = this.session.doc.getLine(cell.row); + if (line !== "") { + var element = cell.element; + if (cell.element.classList && cell.element.classList.contains("ace_line_group")) { + if (cell.element.childNodes.length > 0) { + element = cell.element.childNodes[0]; + } + else { + return; + } + } + var childNodes = element.childNodes; + if (childNodes) { + var node = childNodes[indentLevel - 1]; + if (node && node.classList && node.classList.contains("ace_indent-guide")) + node.classList.add("ace_indent-guide-active"); + } + } + }; + Text.prototype.$renderHighlightIndentGuide = function () { + if (!this.$lines) + return; + var cells = this.$lines.cells; + this.$clearActiveIndentGuide(); + var indentLevel = this.$highlightIndentGuideMarker.indentLevel; + if (indentLevel !== 0) { + if (this.$highlightIndentGuideMarker.dir === 1) { + for (var i = 0; i < cells.length; i++) { + var cell = cells[i]; + if (this.$highlightIndentGuideMarker.end && cell.row >= this.$highlightIndentGuideMarker.start + + 1) { + if (cell.row >= this.$highlightIndentGuideMarker.end) + break; + this.$setIndentGuideActive(cell, indentLevel); + } + } + } + else { + for (var i = cells.length - 1; i >= 0; i--) { + var cell = cells[i]; + if (this.$highlightIndentGuideMarker.end && cell.row < this.$highlightIndentGuideMarker.start) { + if (cell.row < this.$highlightIndentGuideMarker.end) + break; + this.$setIndentGuideActive(cell, indentLevel); + } + } + } + } + }; + Text.prototype.$createLineElement = function (parent) { var lineEl = this.dom.createElement("div"); lineEl.className = "ace_line"; lineEl.style.height = this.config.lineHeight + "px"; - return lineEl; }; - - this.$renderWrappedLine = function(parent, tokens, splits) { + Text.prototype.$renderWrappedLine = function (parent, tokens, splits) { var chars = 0; var split = 0; var splitChars = splits[0]; var screenColumn = 0; - var lineEl = this.$createLineElement(); parent.appendChild(lineEl); - for (var i = 0; i < tokens.length; i++) { var token = tokens[i]; var value = token.value; @@ -16539,44 +17726,35 @@ var Text = function(parentEl) { continue; chars -= value.length; } - if (chars + value.length < splitChars) { screenColumn = this.$renderToken(lineEl, screenColumn, token, value); chars += value.length; - } else { + } + else { while (chars + value.length >= splitChars) { - screenColumn = this.$renderToken( - lineEl, screenColumn, - token, value.substring(0, splitChars - chars) - ); + screenColumn = this.$renderToken(lineEl, screenColumn, token, value.substring(0, splitChars - chars)); value = value.substring(splitChars - chars); chars = splitChars; - lineEl = this.$createLineElement(); parent.appendChild(lineEl); - - lineEl.appendChild(this.dom.createTextNode(lang.stringRepeat("\xa0", splits.indent), this.element)); - - split ++; + var text = this.dom.createTextNode(lang.stringRepeat("\xa0", splits.indent), this.element); + text["charCount"] = 0; // not to take into account when we are counting columns + lineEl.appendChild(text); + split++; screenColumn = 0; splitChars = splits[split] || Number.MAX_VALUE; } if (value.length != 0) { chars += value.length; - screenColumn = this.$renderToken( - lineEl, screenColumn, token, value - ); + screenColumn = this.$renderToken(lineEl, screenColumn, token, value); } } } - if (splits[splits.length - 1] > this.MAX_LINE_LENGTH) this.$renderOverflowMessage(lineEl, screenColumn, null, "", true); }; - - this.$renderSimpleLine = function(parent, tokens) { + Text.prototype.$renderSimpleLine = function (parent, tokens) { var screenColumn = 0; - for (var i = 0; i < tokens.length; i++) { var token = tokens[i]; var value = token.value; @@ -16590,33 +17768,28 @@ var Text = function(parentEl) { screenColumn = this.$renderToken(parent, screenColumn, token, value); } }; - - this.$renderOverflowMessage = function(parent, screenColumn, token, value, hide) { - token && this.$renderToken(parent, screenColumn, token, - value.slice(0, this.MAX_LINE_LENGTH - screenColumn)); - + Text.prototype.$renderOverflowMessage = function (parent, screenColumn, token, value, hide) { + token && this.$renderToken(parent, screenColumn, token, value.slice(0, this.MAX_LINE_LENGTH - screenColumn)); var overflowEl = this.dom.createElement("span"); overflowEl.className = "ace_inline_button ace_keyword ace_toggle_wrap"; overflowEl.textContent = hide ? "" : ""; - - parent.appendChild(overflowEl); + parent.appendChild(overflowEl); }; - this.$renderLine = function(parent, row, foldLine) { + Text.prototype.$renderLine = function (parent, row, foldLine) { if (!foldLine && foldLine != false) foldLine = this.session.getFoldLine(row); - if (foldLine) var tokens = this.$getFoldLineTokens(row, foldLine); else var tokens = this.session.getTokens(row); - var lastLineEl = parent; if (tokens.length) { var splits = this.session.getRowSplitData(row); if (splits && splits.length) { this.$renderWrappedLine(parent, tokens, splits); var lastLineEl = parent.lastChild; - } else { + } + else { var lastLineEl = parent; if (this.$useLineGroups()) { lastLineEl = this.$createLineElement(); @@ -16624,33 +17797,28 @@ var Text = function(parentEl) { } this.$renderSimpleLine(lastLineEl, tokens); } - } else if (this.$useLineGroups()) { + } + else if (this.$useLineGroups()) { lastLineEl = this.$createLineElement(); parent.appendChild(lastLineEl); } - if (this.showEOL && lastLineEl) { if (foldLine) row = foldLine.end.row; - var invisibleEl = this.dom.createElement("span"); invisibleEl.className = "ace_invisible ace_invisible_eol"; invisibleEl.textContent = row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR; - lastLineEl.appendChild(invisibleEl); } }; - - this.$getFoldLineTokens = function(row, foldLine) { + Text.prototype.$getFoldLineTokens = function (row, foldLine) { var session = this.session; var renderTokens = []; - function addTokens(tokens, from, to) { var idx = 0, col = 0; while ((col + tokens[idx].value.length) < from) { col += tokens[idx].value.length; idx++; - if (idx == tokens.length) return; } @@ -16658,16 +17826,13 @@ var Text = function(parentEl) { var value = tokens[idx].value.substring(from - col); if (value.length > (to - from)) value = value.substring(0, to - from); - renderTokens.push({ type: tokens[idx].type, value: value }); - col = from + value.length; idx += 1; } - while (col < to && idx < tokens.length) { var value = tokens[idx].value; if (value.length + col > to) { @@ -16675,114 +17840,112 @@ var Text = function(parentEl) { type: tokens[idx].type, value: value.substring(0, to - col) }); - } else + } + else renderTokens.push(tokens[idx]); col += value.length; idx += 1; } } - var tokens = session.getTokens(row); - foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) { + foldLine.walk(function (placeholder, row, column, lastColumn, isNewRow) { if (placeholder != null) { renderTokens.push({ type: "fold", value: placeholder }); - } else { + } + else { if (isNewRow) tokens = session.getTokens(row); - if (tokens.length) addTokens(tokens, lastColumn, column); } }, foldLine.end.row, this.session.getLine(foldLine.end.row).length); - return renderTokens; }; - - this.$useLineGroups = function() { + Text.prototype.$useLineGroups = function () { return this.session.getUseWrapMode(); }; - - this.destroy = function() {}; -}).call(Text.prototype); - + return Text; +}()); +Text.prototype.EOF_CHAR = "\xB6"; +Text.prototype.EOL_CHAR_LF = "\xAC"; +Text.prototype.EOL_CHAR_CRLF = "\xa4"; +Text.prototype.EOL_CHAR = Text.prototype.EOL_CHAR_LF; +Text.prototype.TAB_CHAR = "\u2014"; //"\u21E5"; +Text.prototype.SPACE_CHAR = "\xB7"; +Text.prototype.$padding = 0; +Text.prototype.MAX_LINE_LENGTH = 10000; +Text.prototype.showInvisibles = false; +Text.prototype.showSpaces = false; +Text.prototype.showTabs = false; +Text.prototype.showEOL = false; +Text.prototype.displayIndentGuides = true; +Text.prototype.$highlightIndentGuides = true; +Text.prototype.$tabStrings = []; +Text.prototype.destroy = {}; +Text.prototype.onChangeTabSize = Text.prototype.$computeTabString; +oop.implement(Text.prototype, EventEmitter); exports.Text = Text; }); -define("ace/layer/cursor",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/layer/cursor",["require","exports","module","ace/lib/dom"], function(require, exports, module){"use strict"; var dom = require("../lib/dom"); - -var Cursor = function(parentEl) { - this.element = dom.createElement("div"); - this.element.className = "ace_layer ace_cursor-layer"; - parentEl.appendChild(this.element); - - this.isVisible = false; - this.isBlinking = true; - this.blinkInterval = 1000; - this.smoothBlinking = false; - - this.cursors = []; - this.cursor = this.addCursor(); - dom.addCssClass(this.element, "ace_hidden-cursors"); - this.$updateCursors = this.$updateOpacity.bind(this); -}; - -(function() { - - this.$updateOpacity = function(val) { +var Cursor = /** @class */ (function () { + function Cursor(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_cursor-layer"; + parentEl.appendChild(this.element); + this.isVisible = false; + this.isBlinking = true; + this.blinkInterval = 1000; + this.smoothBlinking = false; + this.cursors = []; + this.cursor = this.addCursor(); + dom.addCssClass(this.element, "ace_hidden-cursors"); + this.$updateCursors = this.$updateOpacity.bind(this); + } + Cursor.prototype.$updateOpacity = function (val) { var cursors = this.cursors; - for (var i = cursors.length; i--; ) + for (var i = cursors.length; i--;) dom.setStyle(cursors[i].style, "opacity", val ? "" : "0"); }; - - this.$startCssAnimation = function() { + Cursor.prototype.$startCssAnimation = function () { var cursors = this.cursors; - for (var i = cursors.length; i--; ) + for (var i = cursors.length; i--;) cursors[i].style.animationDuration = this.blinkInterval + "ms"; - this.$isAnimating = true; - setTimeout(function() { + setTimeout(function () { if (this.$isAnimating) { dom.addCssClass(this.element, "ace_animate-blinking"); } }.bind(this)); }; - - this.$stopCssAnimation = function() { + Cursor.prototype.$stopCssAnimation = function () { this.$isAnimating = false; dom.removeCssClass(this.element, "ace_animate-blinking"); }; - - this.$padding = 0; - this.setPadding = function(padding) { + Cursor.prototype.setPadding = function (padding) { this.$padding = padding; }; - - this.setSession = function(session) { + Cursor.prototype.setSession = function (session) { this.session = session; }; - - this.setBlinking = function(blinking) { + Cursor.prototype.setBlinking = function (blinking) { if (blinking != this.isBlinking) { this.isBlinking = blinking; this.restartTimer(); } }; - - this.setBlinkInterval = function(blinkInterval) { + Cursor.prototype.setBlinkInterval = function (blinkInterval) { if (blinkInterval != this.blinkInterval) { this.blinkInterval = blinkInterval; this.restartTimer(); } }; - - this.setSmoothBlinking = function(smoothBlinking) { + Cursor.prototype.setSmoothBlinking = function (smoothBlinking) { if (smoothBlinking != this.smoothBlinking) { this.smoothBlinking = smoothBlinking; dom.setCssClass(this.element, "ace_smooth-blinking", smoothBlinking); @@ -16790,145 +17953,122 @@ var Cursor = function(parentEl) { this.restartTimer(); } }; - - this.addCursor = function() { + Cursor.prototype.addCursor = function () { var el = dom.createElement("div"); el.className = "ace_cursor"; this.element.appendChild(el); this.cursors.push(el); return el; }; - - this.removeCursor = function() { + Cursor.prototype.removeCursor = function () { if (this.cursors.length > 1) { var el = this.cursors.pop(); el.parentNode.removeChild(el); return el; } }; - - this.hideCursor = function() { + Cursor.prototype.hideCursor = function () { this.isVisible = false; dom.addCssClass(this.element, "ace_hidden-cursors"); this.restartTimer(); }; - - this.showCursor = function() { + Cursor.prototype.showCursor = function () { this.isVisible = true; dom.removeCssClass(this.element, "ace_hidden-cursors"); this.restartTimer(); }; - - this.restartTimer = function() { + Cursor.prototype.restartTimer = function () { var update = this.$updateCursors; clearInterval(this.intervalId); clearTimeout(this.timeoutId); this.$stopCssAnimation(); - if (this.smoothBlinking) { this.$isSmoothBlinking = false; dom.removeCssClass(this.element, "ace_smooth-blinking"); } - update(true); - if (!this.isBlinking || !this.blinkInterval || !this.isVisible) { this.$stopCssAnimation(); return; } - if (this.smoothBlinking) { this.$isSmoothBlinking = true; - setTimeout(function() { + setTimeout(function () { if (this.$isSmoothBlinking) { dom.addCssClass(this.element, "ace_smooth-blinking"); } }.bind(this)); } - if (dom.HAS_CSS_ANIMATION) { this.$startCssAnimation(); - } else { - var blink = function(){ - this.timeoutId = setTimeout(function() { + } + else { + var blink = /**@this{Cursor}*/ function () { + this.timeoutId = setTimeout(function () { update(false); }, 0.6 * this.blinkInterval); }.bind(this); - - this.intervalId = setInterval(function() { + this.intervalId = setInterval(function () { update(true); blink(); }, this.blinkInterval); blink(); } }; - - this.getPixelPosition = function(position, onScreen) { + Cursor.prototype.getPixelPosition = function (position, onScreen) { if (!this.config || !this.session) - return {left : 0, top : 0}; - + return { left: 0, top: 0 }; if (!position) position = this.session.selection.getCursor(); var pos = this.session.documentToScreenPosition(position); var cursorLeft = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, position.row) ? this.session.$bidiHandler.getPosLeft(pos.column) : pos.column * this.config.characterWidth); - var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) * this.config.lineHeight; - - return {left : cursorLeft, top : cursorTop}; + return { left: cursorLeft, top: cursorTop }; }; - - this.isCursorInView = function(pixelPos, config) { + Cursor.prototype.isCursorInView = function (pixelPos, config) { return pixelPos.top >= 0 && pixelPos.top < config.maxHeight; }; - - this.update = function(config) { + Cursor.prototype.update = function (config) { this.config = config; - var selections = this.session.$selectionMarkers; var i = 0, cursorIndex = 0; - - if (selections === undefined || selections.length === 0){ - selections = [{cursor: null}]; + if (selections === undefined || selections.length === 0) { + selections = [{ cursor: null }]; } - for (var i = 0, n = selections.length; i < n; i++) { var pixelPos = this.getPixelPosition(selections[i].cursor, true); if ((pixelPos.top > config.height + config.offset || - pixelPos.top < 0) && i > 1) { + pixelPos.top < 0) && i > 1) { continue; } - var element = this.cursors[cursorIndex++] || this.addCursor(); var style = element.style; - if (!this.drawCursor) { if (!this.isCursorInView(pixelPos, config)) { dom.setStyle(style, "display", "none"); - } else { + } + else { dom.setStyle(style, "display", "block"); dom.translate(element, pixelPos.left, pixelPos.top); dom.setStyle(style, "width", Math.round(config.characterWidth) + "px"); dom.setStyle(style, "height", config.lineHeight + "px"); } - } else { + } + else { this.drawCursor(element, pixelPos, config, selections[i], this.session); } } while (this.cursors.length > cursorIndex) this.removeCursor(); - var overwrite = this.session.getOverwrite(); this.$setOverwrite(overwrite); this.$pixelPos = pixelPos; this.restartTimer(); }; - - this.drawCursor = null; - - this.$setOverwrite = function(overwrite) { + Cursor.prototype.$setOverwrite = function (overwrite) { if (overwrite != this.overwrite) { this.overwrite = overwrite; if (overwrite) @@ -16937,270 +18077,485 @@ var Cursor = function(parentEl) { dom.removeCssClass(this.element, "ace_overwrite-cursors"); } }; - - this.destroy = function() { + Cursor.prototype.destroy = function () { clearInterval(this.intervalId); clearTimeout(this.timeoutId); }; - -}).call(Cursor.prototype); - + return Cursor; +}()); +Cursor.prototype.$padding = 0; +Cursor.prototype.drawCursor = null; exports.Cursor = Cursor; }); -define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module) { -"use strict"; - +define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); var oop = require("./lib/oop"); var dom = require("./lib/dom"); var event = require("./lib/event"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var MAX_SCROLL_H = 0x8000; -var ScrollBar = function(parent) { - this.element = dom.createElement("div"); - this.element.className = "ace_scrollbar ace_scrollbar" + this.classSuffix; - - this.inner = dom.createElement("div"); - this.inner.className = "ace_scrollbar-inner"; - this.inner.textContent = "\xa0"; - this.element.appendChild(this.inner); - - parent.appendChild(this.element); - - this.setVisible(false); - this.skipEvent = false; - - event.addListener(this.element, "scroll", this.onScroll.bind(this)); - event.addListener(this.element, "mousedown", event.preventDefault); -}; - -(function() { - oop.implement(this, EventEmitter); - - this.setVisible = function(isVisible) { +var Scrollbar = /** @class */ (function () { + function Scrollbar(parent, classSuffix) { + this.element = dom.createElement("div"); + this.element.className = "ace_scrollbar ace_scrollbar" + classSuffix; + this.element.tabIndex = -1; + this.inner = dom.createElement("div"); + this.inner.className = "ace_scrollbar-inner"; + this.inner.textContent = "\xa0"; + this.element.appendChild(this.inner); + parent.appendChild(this.element); + this.setVisible(false); + this.skipEvent = false; + event.addListener(this.element, "scroll", this.onScroll.bind(this)); + event.addListener(this.element, "mousedown", event.preventDefault); + } + Scrollbar.prototype.setVisible = function (isVisible) { this.element.style.display = isVisible ? "" : "none"; this.isVisible = isVisible; this.coeff = 1; }; -}).call(ScrollBar.prototype); -var VScrollBar = function(parent, renderer) { - ScrollBar.call(this, parent); - this.scrollTop = 0; - this.scrollHeight = 0; - renderer.$scrollbarWidth = - this.width = dom.scrollbarWidth(parent.ownerDocument); - this.inner.style.width = - this.element.style.width = (this.width || 15) + 5 + "px"; - this.$minWidth = 0; -}; - -oop.inherits(VScrollBar, ScrollBar); - -(function() { - - this.classSuffix = '-v'; - this.onScroll = function() { + return Scrollbar; +}()); +oop.implement(Scrollbar.prototype, EventEmitter); +var VScrollBar = /** @class */ (function (_super) { + __extends(VScrollBar, _super); + function VScrollBar(parent, renderer) { + var _this = _super.call(this, parent, '-v') || this; + _this.scrollTop = 0; + _this.scrollHeight = 0; + renderer.$scrollbarWidth = + _this.width = dom.scrollbarWidth(parent.ownerDocument); + _this.inner.style.width = + _this.element.style.width = (_this.width || 15) + 5 + "px"; + _this.$minWidth = 0; + return _this; + } + VScrollBar.prototype.onScroll = function () { if (!this.skipEvent) { this.scrollTop = this.element.scrollTop; if (this.coeff != 1) { var h = this.element.clientHeight / this.scrollHeight; this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h); } - this._emit("scroll", {data: this.scrollTop}); + this._emit("scroll", { data: this.scrollTop }); } this.skipEvent = false; }; - this.getWidth = function() { + VScrollBar.prototype.getWidth = function () { return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0); }; - this.setHeight = function(height) { + VScrollBar.prototype.setHeight = function (height) { this.element.style.height = height + "px"; }; - this.setInnerHeight = - this.setScrollHeight = function(height) { + VScrollBar.prototype.setScrollHeight = function (height) { this.scrollHeight = height; if (height > MAX_SCROLL_H) { this.coeff = MAX_SCROLL_H / height; height = MAX_SCROLL_H; - } else if (this.coeff != 1) { + } + else if (this.coeff != 1) { this.coeff = 1; } this.inner.style.height = height + "px"; }; - this.setScrollTop = function(scrollTop) { + VScrollBar.prototype.setScrollTop = function (scrollTop) { if (this.scrollTop != scrollTop) { this.skipEvent = true; this.scrollTop = scrollTop; this.element.scrollTop = scrollTop * this.coeff; } }; - -}).call(VScrollBar.prototype); -var HScrollBar = function(parent, renderer) { - ScrollBar.call(this, parent); - this.scrollLeft = 0; - this.height = renderer.$scrollbarWidth; - this.inner.style.height = - this.element.style.height = (this.height || 15) + 5 + "px"; -}; - -oop.inherits(HScrollBar, ScrollBar); - -(function() { - - this.classSuffix = '-h'; - this.onScroll = function() { + return VScrollBar; +}(Scrollbar)); +VScrollBar.prototype.setInnerHeight = VScrollBar.prototype.setScrollHeight; +var HScrollBar = /** @class */ (function (_super) { + __extends(HScrollBar, _super); + function HScrollBar(parent, renderer) { + var _this = _super.call(this, parent, '-h') || this; + _this.scrollLeft = 0; + _this.height = renderer.$scrollbarWidth; + _this.inner.style.height = + _this.element.style.height = (_this.height || 15) + 5 + "px"; + return _this; + } + HScrollBar.prototype.onScroll = function () { if (!this.skipEvent) { this.scrollLeft = this.element.scrollLeft; - this._emit("scroll", {data: this.scrollLeft}); + this._emit("scroll", { data: this.scrollLeft }); + } + this.skipEvent = false; + }; + HScrollBar.prototype.getHeight = function () { + return this.isVisible ? this.height : 0; + }; + HScrollBar.prototype.setWidth = function (width) { + this.element.style.width = width + "px"; + }; + HScrollBar.prototype.setInnerWidth = function (width) { + this.inner.style.width = width + "px"; + }; + HScrollBar.prototype.setScrollWidth = function (width) { + this.inner.style.width = width + "px"; + }; + HScrollBar.prototype.setScrollLeft = function (scrollLeft) { + if (this.scrollLeft != scrollLeft) { + this.skipEvent = true; + this.scrollLeft = this.element.scrollLeft = scrollLeft; + } + }; + return HScrollBar; +}(Scrollbar)); +exports.ScrollBar = VScrollBar; // backward compatibility +exports.ScrollBarV = VScrollBar; // backward compatibility +exports.ScrollBarH = HScrollBar; // backward compatibility +exports.VScrollBar = VScrollBar; +exports.HScrollBar = HScrollBar; + +}); + +define("ace/scrollbar_custom",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var event = require("./lib/event"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +dom.importCssString(".ace_editor>.ace_sb-v div, .ace_editor>.ace_sb-h div{\n position: absolute;\n background: rgba(128, 128, 128, 0.6);\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n border: 1px solid #bbb;\n border-radius: 2px;\n z-index: 8;\n}\n.ace_editor>.ace_sb-v, .ace_editor>.ace_sb-h {\n position: absolute;\n z-index: 6;\n background: none;\n overflow: hidden!important;\n}\n.ace_editor>.ace_sb-v {\n z-index: 6;\n right: 0;\n top: 0;\n width: 12px;\n}\n.ace_editor>.ace_sb-v div {\n z-index: 8;\n right: 0;\n width: 100%;\n}\n.ace_editor>.ace_sb-h {\n bottom: 0;\n left: 0;\n height: 12px;\n}\n.ace_editor>.ace_sb-h div {\n bottom: 0;\n height: 100%;\n}\n.ace_editor>.ace_sb_grabbed {\n z-index: 8;\n background: #000;\n}", "ace_scrollbar.css", false); +var ScrollBar = /** @class */ (function () { + function ScrollBar(parent, classSuffix) { + this.element = dom.createElement("div"); + this.element.className = "ace_sb" + classSuffix; + this.inner = dom.createElement("div"); + this.inner.className = ""; + this.element.appendChild(this.inner); + this.VScrollWidth = 12; + this.HScrollHeight = 12; + parent.appendChild(this.element); + this.setVisible(false); + this.skipEvent = false; + event.addMultiMouseDownListener(this.element, [500, 300, 300], this, "onMouseDown"); + } + ScrollBar.prototype.setVisible = function (isVisible) { + this.element.style.display = isVisible ? "" : "none"; + this.isVisible = isVisible; + this.coeff = 1; + }; + return ScrollBar; +}()); +oop.implement(ScrollBar.prototype, EventEmitter); +var VScrollBar = /** @class */ (function (_super) { + __extends(VScrollBar, _super); + function VScrollBar(parent, renderer) { + var _this = _super.call(this, parent, '-v') || this; + _this.scrollTop = 0; + _this.scrollHeight = 0; + _this.parent = parent; + _this.width = _this.VScrollWidth; + _this.renderer = renderer; + _this.inner.style.width = _this.element.style.width = (_this.width || 15) + "px"; + _this.$minWidth = 0; + return _this; + } + VScrollBar.prototype.onMouseDown = function (eType, e) { + if (eType !== "mousedown") + return; + if (event.getButton(e) !== 0 || e.detail === 2) { + return; + } + if (e.target === this.inner) { + var self = this; + var mousePageY = e.clientY; + var onMouseMove = function (e) { + mousePageY = e.clientY; + }; + var onMouseUp = function () { + clearInterval(timerId); + }; + var startY = e.clientY; + var startTop = this.thumbTop; + var onScrollInterval = function () { + if (mousePageY === undefined) + return; + var scrollTop = self.scrollTopFromThumbTop(startTop + mousePageY - startY); + if (scrollTop === self.scrollTop) + return; + self._emit("scroll", { data: scrollTop }); + }; + event.capture(this.inner, onMouseMove, onMouseUp); + var timerId = setInterval(onScrollInterval, 20); + return event.preventDefault(e); + } + var top = e.clientY - this.element.getBoundingClientRect().top - this.thumbHeight / 2; + this._emit("scroll", { data: this.scrollTopFromThumbTop(top) }); + return event.preventDefault(e); + }; + VScrollBar.prototype.getHeight = function () { + return this.height; + }; + VScrollBar.prototype.scrollTopFromThumbTop = function (thumbTop) { + var scrollTop = thumbTop * (this.pageHeight - this.viewHeight) / (this.slideHeight - this.thumbHeight); + scrollTop = scrollTop >> 0; + if (scrollTop < 0) { + scrollTop = 0; + } + else if (scrollTop > this.pageHeight - this.viewHeight) { + scrollTop = this.pageHeight - this.viewHeight; + } + return scrollTop; + }; + VScrollBar.prototype.getWidth = function () { + return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0); + }; + VScrollBar.prototype.setHeight = function (height) { + this.height = Math.max(0, height); + this.slideHeight = this.height; + this.viewHeight = this.height; + this.setScrollHeight(this.pageHeight, true); + }; + VScrollBar.prototype.setScrollHeight = function (height, force) { + if (this.pageHeight === height && !force) + return; + this.pageHeight = height; + this.thumbHeight = this.slideHeight * this.viewHeight / this.pageHeight; + if (this.thumbHeight > this.slideHeight) + this.thumbHeight = this.slideHeight; + if (this.thumbHeight < 15) + this.thumbHeight = 15; + this.inner.style.height = this.thumbHeight + "px"; + if (this.scrollTop > (this.pageHeight - this.viewHeight)) { + this.scrollTop = (this.pageHeight - this.viewHeight); + if (this.scrollTop < 0) + this.scrollTop = 0; + this._emit("scroll", { data: this.scrollTop }); + } + }; + VScrollBar.prototype.setScrollTop = function (scrollTop) { + this.scrollTop = scrollTop; + if (scrollTop < 0) + scrollTop = 0; + this.thumbTop = scrollTop * (this.slideHeight - this.thumbHeight) / (this.pageHeight - this.viewHeight); + this.inner.style.top = this.thumbTop + "px"; + }; + return VScrollBar; +}(ScrollBar)); +VScrollBar.prototype.setInnerHeight = VScrollBar.prototype.setScrollHeight; +var HScrollBar = /** @class */ (function (_super) { + __extends(HScrollBar, _super); + function HScrollBar(parent, renderer) { + var _this = _super.call(this, parent, '-h') || this; + _this.scrollLeft = 0; + _this.scrollWidth = 0; + _this.height = _this.HScrollHeight; + _this.inner.style.height = _this.element.style.height = (_this.height || 12) + "px"; + _this.renderer = renderer; + return _this; + } + HScrollBar.prototype.onMouseDown = function (eType, e) { + if (eType !== "mousedown") + return; + if (event.getButton(e) !== 0 || e.detail === 2) { + return; + } + if (e.target === this.inner) { + var self = this; + var mousePageX = e.clientX; + var onMouseMove = function (e) { + mousePageX = e.clientX; + }; + var onMouseUp = function () { + clearInterval(timerId); + }; + var startX = e.clientX; + var startLeft = this.thumbLeft; + var onScrollInterval = function () { + if (mousePageX === undefined) + return; + var scrollLeft = self.scrollLeftFromThumbLeft(startLeft + mousePageX - startX); + if (scrollLeft === self.scrollLeft) + return; + self._emit("scroll", { data: scrollLeft }); + }; + event.capture(this.inner, onMouseMove, onMouseUp); + var timerId = setInterval(onScrollInterval, 20); + return event.preventDefault(e); } - this.skipEvent = false; + var left = e.clientX - this.element.getBoundingClientRect().left - this.thumbWidth / 2; + this._emit("scroll", { data: this.scrollLeftFromThumbLeft(left) }); + return event.preventDefault(e); }; - this.getHeight = function() { + HScrollBar.prototype.getHeight = function () { return this.isVisible ? this.height : 0; }; - this.setWidth = function(width) { - this.element.style.width = width + "px"; - }; - this.setInnerWidth = function(width) { - this.inner.style.width = width + "px"; - }; - this.setScrollWidth = function(width) { - this.inner.style.width = width + "px"; - }; - this.setScrollLeft = function(scrollLeft) { - if (this.scrollLeft != scrollLeft) { - this.skipEvent = true; - this.scrollLeft = this.element.scrollLeft = scrollLeft; + HScrollBar.prototype.scrollLeftFromThumbLeft = function (thumbLeft) { + var scrollLeft = thumbLeft * (this.pageWidth - this.viewWidth) / (this.slideWidth - this.thumbWidth); + scrollLeft = scrollLeft >> 0; + if (scrollLeft < 0) { + scrollLeft = 0; + } + else if (scrollLeft > this.pageWidth - this.viewWidth) { + scrollLeft = this.pageWidth - this.viewWidth; } + return scrollLeft; }; - -}).call(HScrollBar.prototype); - - + HScrollBar.prototype.setWidth = function (width) { + this.width = Math.max(0, width); + this.element.style.width = this.width + "px"; + this.slideWidth = this.width; + this.viewWidth = this.width; + this.setScrollWidth(this.pageWidth, true); + }; + HScrollBar.prototype.setScrollWidth = function (width, force) { + if (this.pageWidth === width && !force) + return; + this.pageWidth = width; + this.thumbWidth = this.slideWidth * this.viewWidth / this.pageWidth; + if (this.thumbWidth > this.slideWidth) + this.thumbWidth = this.slideWidth; + if (this.thumbWidth < 15) + this.thumbWidth = 15; + this.inner.style.width = this.thumbWidth + "px"; + if (this.scrollLeft > (this.pageWidth - this.viewWidth)) { + this.scrollLeft = (this.pageWidth - this.viewWidth); + if (this.scrollLeft < 0) + this.scrollLeft = 0; + this._emit("scroll", { data: this.scrollLeft }); + } + }; + HScrollBar.prototype.setScrollLeft = function (scrollLeft) { + this.scrollLeft = scrollLeft; + if (scrollLeft < 0) + scrollLeft = 0; + this.thumbLeft = scrollLeft * (this.slideWidth - this.thumbWidth) / (this.pageWidth - this.viewWidth); + this.inner.style.left = (this.thumbLeft) + "px"; + }; + return HScrollBar; +}(ScrollBar)); +HScrollBar.prototype.setInnerWidth = HScrollBar.prototype.setScrollWidth; exports.ScrollBar = VScrollBar; // backward compatibility exports.ScrollBarV = VScrollBar; // backward compatibility exports.ScrollBarH = HScrollBar; // backward compatibility - exports.VScrollBar = VScrollBar; exports.HScrollBar = HScrollBar; -}); -define("ace/renderloop",["require","exports","module","ace/lib/event"], function(require, exports, module) { -"use strict"; +}); +define("ace/renderloop",["require","exports","module","ace/lib/event"], function(require, exports, module){"use strict"; var event = require("./lib/event"); - - -var RenderLoop = function(onRender, win) { - this.onRender = onRender; - this.pending = false; - this.changes = 0; - this.$recursionLimit = 2; - this.window = win || window; - var _self = this; - this._flush = function(ts) { - _self.pending = false; - var changes = _self.changes; - - if (changes) { - event.blockIdle(100); - _self.changes = 0; - _self.onRender(changes); - } - - if (_self.changes) { - if (_self.$recursionLimit-- < 0) return; - _self.schedule(); - } else { - _self.$recursionLimit = 2; - } - }; -}; - -(function() { - - this.schedule = function(change) { +var RenderLoop = /** @class */ (function () { + function RenderLoop(onRender, win) { + this.onRender = onRender; + this.pending = false; + this.changes = 0; + this.$recursionLimit = 2; + this.window = win || window; + var _self = this; + this._flush = function (ts) { + _self.pending = false; + var changes = _self.changes; + if (changes) { + event.blockIdle(100); + _self.changes = 0; + _self.onRender(changes); + } + if (_self.changes) { + if (_self.$recursionLimit-- < 0) + return; + _self.schedule(); + } + else { + _self.$recursionLimit = 2; + } + }; + } + RenderLoop.prototype.schedule = function (change) { this.changes = this.changes | change; if (this.changes && !this.pending) { event.nextFrame(this._flush); this.pending = true; } }; - - this.clear = function(change) { + RenderLoop.prototype.clear = function (change) { var changes = this.changes; this.changes = 0; return changes; }; - -}).call(RenderLoop.prototype); - + return RenderLoop; +}()); exports.RenderLoop = RenderLoop; -}); -define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module) { +}); -var oop = require("../lib/oop"); +define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module){var oop = require("../lib/oop"); var dom = require("../lib/dom"); var lang = require("../lib/lang"); var event = require("../lib/event"); var useragent = require("../lib/useragent"); var EventEmitter = require("../lib/event_emitter").EventEmitter; - -var CHAR_COUNT = 256; +var CHAR_COUNT = 512; var USE_OBSERVER = typeof ResizeObserver == "function"; var L = 200; - -var FontMetrics = exports.FontMetrics = function(parentEl) { - this.el = dom.createElement("div"); - this.$setMeasureNodeStyles(this.el.style, true); - - this.$main = dom.createElement("div"); - this.$setMeasureNodeStyles(this.$main.style); - - this.$measureNode = dom.createElement("div"); - this.$setMeasureNodeStyles(this.$measureNode.style); - - - this.el.appendChild(this.$main); - this.el.appendChild(this.$measureNode); - parentEl.appendChild(this.el); - - this.$measureNode.textContent = lang.stringRepeat("X", CHAR_COUNT); - - this.$characterSize = {width: 0, height: 0}; - - - if (USE_OBSERVER) - this.$addObserver(); - else - this.checkForSizeChanges(); -}; - -(function() { - - oop.implement(this, EventEmitter); - - this.$characterSize = {width: 0, height: 0}; - - this.$setMeasureNodeStyles = function(style, isRoot) { +var FontMetrics = /** @class */ (function () { + function FontMetrics(parentEl) { + this.el = dom.createElement("div"); + this.$setMeasureNodeStyles(this.el.style, true); + this.$main = dom.createElement("div"); + this.$setMeasureNodeStyles(this.$main.style); + this.$measureNode = dom.createElement("div"); + this.$setMeasureNodeStyles(this.$measureNode.style); + this.el.appendChild(this.$main); + this.el.appendChild(this.$measureNode); + parentEl.appendChild(this.el); + this.$measureNode.textContent = lang.stringRepeat("X", CHAR_COUNT); + this.$characterSize = { width: 0, height: 0 }; + if (USE_OBSERVER) + this.$addObserver(); + else + this.checkForSizeChanges(); + } + FontMetrics.prototype.$setMeasureNodeStyles = function (style, isRoot) { style.width = style.height = "auto"; style.left = style.top = "0px"; style.visibility = "hidden"; style.position = "absolute"; style.whiteSpace = "pre"; - if (useragent.isIE < 8) { style["font-family"] = "inherit"; - } else { + } + else { style.font = "inherit"; } style.overflow = isRoot ? "hidden" : "visible"; }; - - this.checkForSizeChanges = function(size) { + FontMetrics.prototype.checkForSizeChanges = function (size) { if (size === undefined) size = this.$measureSizes(); if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) { @@ -17210,39 +18565,35 @@ var FontMetrics = exports.FontMetrics = function(parentEl) { this.$characterSize = size; this.charSizes = Object.create(null); this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height; - this._emit("changeCharacterSize", {data: size}); + this._emit("changeCharacterSize", { data: size }); } }; - - this.$addObserver = function() { + FontMetrics.prototype.$addObserver = function () { var self = this; - this.$observer = new window.ResizeObserver(function(e) { + this.$observer = new window.ResizeObserver(function (e) { self.checkForSizeChanges(); }); this.$observer.observe(this.$measureNode); }; - - this.$pollSizeChanges = function() { + FontMetrics.prototype.$pollSizeChanges = function () { if (this.$pollSizeChangesTimer || this.$observer) return this.$pollSizeChangesTimer; var self = this; - return this.$pollSizeChangesTimer = event.onIdle(function cb() { self.checkForSizeChanges(); event.onIdle(cb, 500); }, 500); }; - - this.setPolling = function(val) { + FontMetrics.prototype.setPolling = function (val) { if (val) { this.$pollSizeChanges(); - } else if (this.$pollSizeChangesTimer) { + } + else if (this.$pollSizeChangesTimer) { clearInterval(this.$pollSizeChangesTimer); this.$pollSizeChangesTimer = 0; } }; - - this.$measureSizes = function(node) { + FontMetrics.prototype.$measureSizes = function (node) { var size = { height: (node || this.$measureNode).clientHeight, width: (node || this.$measureNode).clientWidth / CHAR_COUNT @@ -17251,43 +18602,39 @@ var FontMetrics = exports.FontMetrics = function(parentEl) { return null; return size; }; - - this.$measureCharWidth = function(ch) { + FontMetrics.prototype.$measureCharWidth = function (ch) { this.$main.textContent = lang.stringRepeat(ch, CHAR_COUNT); var rect = this.$main.getBoundingClientRect(); return rect.width / CHAR_COUNT; }; - - this.getCharacterWidth = function(ch) { + FontMetrics.prototype.getCharacterWidth = function (ch) { var w = this.charSizes[ch]; if (w === undefined) { w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width; } return w; }; - - this.destroy = function() { + FontMetrics.prototype.destroy = function () { clearInterval(this.$pollSizeChangesTimer); if (this.$observer) this.$observer.disconnect(); if (this.el && this.el.parentNode) this.el.parentNode.removeChild(this.el); }; - - - this.$getZoom = function getZoom(element) { - if (!element || !element.parentElement) return 1; - return (window.getComputedStyle(element).zoom || 1) * getZoom(element.parentElement); + FontMetrics.prototype.$getZoom = function (element) { + if (!element || !element.parentElement) + return 1; + return (Number(window.getComputedStyle(element)["zoom"]) || 1) * this.$getZoom(element.parentElement); }; - this.$initTransformMeasureNodes = function() { - var t = function(t, l) { + FontMetrics.prototype.$initTransformMeasureNodes = function () { + var t = function (t, l) { return ["div", { - style: "position: absolute;top:" + t + "px;left:" + l + "px;" - }]; + style: "position: absolute;top:" + t + "px;left:" + l + "px;" + }]; }; this.els = dom.buildDom([t(0, 0), t(L, 0), t(0, L), t(L, L)], this.el); }; - this.transformCoordinates = function(clientPos, elPos) { + FontMetrics.prototype.transformCoordinates = function (clientPos, elPos) { if (clientPos) { var zoom = this.$getZoom(this.el); clientPos = mul(1 / zoom, clientPos); @@ -17302,45 +18649,185 @@ var FontMetrics = exports.FontMetrics = function(parentEl) { function sub(a, b) { return [a[0] - b[0], a[1] - b[1]]; } function add(a, b) { return [a[0] + b[0], a[1] + b[1]]; } function mul(a, b) { return [a * b[0], a * b[1]]; } - if (!this.els) this.$initTransformMeasureNodes(); - function p(el) { var r = el.getBoundingClientRect(); return [r.left, r.top]; } - var a = p(this.els[0]); var b = p(this.els[1]); var c = p(this.els[2]); var d = p(this.els[3]); - var h = solve(sub(d, b), sub(d, c), sub(add(b, c), add(d, a))); - var m1 = mul(1 + h[0], sub(b, a)); var m2 = mul(1 + h[1], sub(c, a)); - if (elPos) { var x = elPos; var k = h[0] * x[0] / L + h[1] * x[1] / L + 1; var ut = add(mul(x[0], m1), mul(x[1], m2)); - return add(mul(1 / k / L, ut), a); + return add(mul(1 / k / L, ut), a); } var u = sub(clientPos, a); var f = solve(sub(m1, mul(h[0], u)), sub(m2, mul(h[1], u)), u); return mul(L, f); }; - -}).call(FontMetrics.prototype); + return FontMetrics; +}()); +FontMetrics.prototype.$characterSize = { width: 0, height: 0 }; +oop.implement(FontMetrics.prototype, EventEmitter); +exports.FontMetrics = FontMetrics; }); -define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter","ace/lib/useragent"], function(require, exports, module) { -"use strict"; +define("ace/css/editor-css",["require","exports","module"], function(require, exports, module){/* +styles = [] +for (var i = 1; i < 16; i++) { + styles.push(".ace_br" + i + "{" + ( + ["top-left", "top-right", "bottom-right", "bottom-left"] + ).map(function(x, j) { + return i & (1< .ace_line, .ace_text-layer > .ace_line_group {\n contain: style size layout;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n}\n\n.ace_hidpi .ace_text-layer,\n.ace_hidpi .ace_gutter-layer,\n.ace_hidpi .ace_content,\n.ace_hidpi .ace_gutter {\n contain: strict;\n}\n.ace_hidpi .ace_text-layer > .ace_line, \n.ace_hidpi .ace_text-layer > .ace_line_group {\n contain: strict;\n}\n\n.ace_cjk {\n display: inline-block;\n text-align: center;\n}\n\n.ace_cursor-layer {\n z-index: 4;\n}\n\n.ace_cursor {\n z-index: 4;\n position: absolute;\n box-sizing: border-box;\n border-left: 2px solid;\n /* workaround for smooth cursor repaintng whole screen in chrome */\n transform: translatez(0);\n}\n\n.ace_multiselect .ace_cursor {\n border-left-width: 1px;\n}\n\n.ace_slim-cursors .ace_cursor {\n border-left-width: 1px;\n}\n\n.ace_overwrite-cursors .ace_cursor {\n border-left-width: 0;\n border-bottom: 1px solid;\n}\n\n.ace_hidden-cursors .ace_cursor {\n opacity: 0.2;\n}\n\n.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {\n opacity: 0;\n}\n\n.ace_smooth-blinking .ace_cursor {\n transition: opacity 0.18s;\n}\n\n.ace_animate-blinking .ace_cursor {\n animation-duration: 1000ms;\n animation-timing-function: step-end;\n animation-name: blink-ace-animate;\n animation-iteration-count: infinite;\n}\n\n.ace_animate-blinking.ace_smooth-blinking .ace_cursor {\n animation-duration: 1000ms;\n animation-timing-function: ease-in-out;\n animation-name: blink-ace-animate-smooth;\n}\n \n@keyframes blink-ace-animate {\n from, to { opacity: 1; }\n 60% { opacity: 0; }\n}\n\n@keyframes blink-ace-animate-smooth {\n from, to { opacity: 1; }\n 45% { opacity: 1; }\n 60% { opacity: 0; }\n 85% { opacity: 0; }\n}\n\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\n position: absolute;\n z-index: 3;\n}\n\n.ace_marker-layer .ace_selection {\n position: absolute;\n z-index: 5;\n}\n\n.ace_marker-layer .ace_bracket {\n position: absolute;\n z-index: 6;\n}\n\n.ace_marker-layer .ace_error_bracket {\n position: absolute;\n border-bottom: 1px solid #DE5555;\n border-radius: 0;\n}\n\n.ace_marker-layer .ace_active-line {\n position: absolute;\n z-index: 2;\n}\n\n.ace_marker-layer .ace_selected-word {\n position: absolute;\n z-index: 4;\n box-sizing: border-box;\n}\n\n.ace_line .ace_fold {\n box-sizing: border-box;\n\n display: inline-block;\n height: 11px;\n margin-top: -2px;\n vertical-align: middle;\n\n background-image:\n url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\n url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\n background-repeat: no-repeat, repeat-x;\n background-position: center center, top left;\n color: transparent;\n\n border: 1px solid black;\n border-radius: 2px;\n\n cursor: pointer;\n pointer-events: auto;\n}\n\n.ace_dark .ace_fold {\n}\n\n.ace_fold:hover{\n background-image:\n url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\n url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\n}\n\n.ace_tooltip {\n background-color: #f5f5f5;\n border: 1px solid gray;\n border-radius: 1px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\n color: black;\n padding: 3px 4px;\n position: fixed;\n z-index: 999999;\n box-sizing: border-box;\n cursor: default;\n white-space: pre-wrap;\n word-wrap: break-word;\n line-height: normal;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n pointer-events: none;\n overflow: auto;\n max-width: min(33em, 66vw);\n overscroll-behavior: contain;\n}\n.ace_tooltip pre {\n white-space: pre-wrap;\n}\n\n.ace_tooltip.ace_dark {\n background-color: #636363;\n color: #fff;\n}\n\n.ace_tooltip:focus {\n outline: 1px solid #5E9ED6;\n}\n\n.ace_icon {\n display: inline-block;\n width: 18px;\n vertical-align: top;\n}\n\n.ace_icon_svg {\n display: inline-block;\n width: 12px;\n vertical-align: top;\n -webkit-mask-repeat: no-repeat;\n -webkit-mask-size: 12px;\n -webkit-mask-position: center;\n}\n\n.ace_folding-enabled > .ace_gutter-cell, .ace_folding-enabled > .ace_gutter-cell_svg-icons {\n padding-right: 13px;\n}\n\n.ace_fold-widget, .ace_custom-widget {\n box-sizing: border-box;\n\n margin: 0 -12px 0 1px;\n display: none;\n width: 11px;\n vertical-align: top;\n\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\n background-repeat: no-repeat;\n background-position: center;\n\n border-radius: 3px;\n \n border: 1px solid transparent;\n cursor: pointer;\n pointer-events: auto;\n}\n\n.ace_custom-widget {\n background: none;\n}\n\n.ace_folding-enabled .ace_fold-widget {\n display: inline-block; \n}\n\n.ace_fold-widget.ace_end {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\n}\n\n.ace_fold-widget.ace_closed {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\n}\n\n.ace_fold-widget:hover {\n border: 1px solid rgba(0, 0, 0, 0.3);\n background-color: rgba(255, 255, 255, 0.2);\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n}\n\n.ace_fold-widget:active {\n border: 1px solid rgba(0, 0, 0, 0.4);\n background-color: rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n}\n/**\n * Dark version for fold widgets\n */\n.ace_dark .ace_fold-widget {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\n}\n.ace_dark .ace_fold-widget.ace_end {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\n}\n.ace_dark .ace_fold-widget.ace_closed {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\n}\n.ace_dark .ace_fold-widget:hover {\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\n background-color: rgba(255, 255, 255, 0.1);\n}\n.ace_dark .ace_fold-widget:active {\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\n}\n\n.ace_inline_button {\n border: 1px solid lightgray;\n display: inline-block;\n margin: -1px 8px;\n padding: 0 5px;\n pointer-events: auto;\n cursor: pointer;\n}\n.ace_inline_button:hover {\n border-color: gray;\n background: rgba(200,200,200,0.2);\n display: inline-block;\n pointer-events: auto;\n}\n\n.ace_fold-widget.ace_invalid {\n background-color: #FFB4B4;\n border-color: #DE5555;\n}\n\n.ace_fade-fold-widgets .ace_fold-widget {\n transition: opacity 0.4s ease 0.05s;\n opacity: 0;\n}\n\n.ace_fade-fold-widgets:hover .ace_fold-widget {\n transition: opacity 0.05s ease 0.05s;\n opacity:1;\n}\n\n.ace_underline {\n text-decoration: underline;\n}\n\n.ace_bold {\n font-weight: bold;\n}\n\n.ace_nobold .ace_bold {\n font-weight: normal;\n}\n\n.ace_italic {\n font-style: italic;\n}\n\n\n.ace_error-marker {\n background-color: rgba(255, 0, 0,0.2);\n position: absolute;\n z-index: 9;\n}\n\n.ace_highlight-marker {\n background-color: rgba(255, 255, 0,0.2);\n position: absolute;\n z-index: 8;\n}\n\n.ace_mobile-menu {\n position: absolute;\n line-height: 1.5;\n border-radius: 4px;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n user-select: none;\n background: white;\n box-shadow: 1px 3px 2px grey;\n border: 1px solid #dcdcdc;\n color: black;\n}\n.ace_dark > .ace_mobile-menu {\n background: #333;\n color: #ccc;\n box-shadow: 1px 3px 2px grey;\n border: 1px solid #444;\n\n}\n.ace_mobile-button {\n padding: 2px;\n cursor: pointer;\n overflow: hidden;\n}\n.ace_mobile-button:hover {\n background-color: #eee;\n opacity:1;\n}\n.ace_mobile-button:active {\n background-color: #ddd;\n}\n\n.ace_placeholder {\n position: relative;\n font-family: arial;\n transform: scale(0.9);\n transform-origin: left;\n white-space: pre;\n opacity: 0.7;\n margin: 0 10px;\n z-index: 1;\n}\n\n.ace_ghost_text {\n opacity: 0.5;\n font-style: italic;\n}\n\n.ace_ghost_text_container > div {\n white-space: pre;\n}\n\n.ghost_text_line_wrapped::after {\n content: \"\u21A9\";\n position: absolute;\n}\n\n.ace_lineWidgetContainer.ace_ghost_text {\n margin: 0px 4px\n}\n\n.ace_screenreader-only {\n position:absolute;\n left:-10000px;\n top:auto;\n width:1px;\n height:1px;\n overflow:hidden;\n}\n\n.ace_hidden_token {\n display: none;\n}"; + +}); + +define("ace/layer/decorators",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var dom = require("../lib/dom"); +var oop = require("../lib/oop"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var Decorator = /** @class */ (function () { + function Decorator(scrollbarV, renderer) { + this.renderer = renderer; + this.pixelRatio = 1; + this.maxHeight = renderer.layerConfig.maxHeight; + this.lineHeight = renderer.layerConfig.lineHeight; + this.minDecorationHeight = (2 * this.pixelRatio) | 0; + this.halfMinDecorationHeight = (this.minDecorationHeight / 2) | 0; + this.colors = {}; + this.colors.dark = { + "error": "rgba(255, 18, 18, 1)", + "warning": "rgba(18, 136, 18, 1)", + "info": "rgba(18, 18, 136, 1)", + }; + this.colors.light = { + "error": "rgb(255,51,51)", + "warning": "rgb(32,133,72)", + "info": "rgb(35,68,138)", + }; + this.setScrollBarV(scrollbarV); + } + Decorator.prototype.$createCanvas = function () { + this.canvas = dom.createElement("canvas"); + this.canvas.style.top = 0 + "px"; + this.canvas.style.right = 0 + "px"; + this.canvas.style.zIndex = "7"; + this.canvas.style.position = "absolute"; + }; + Decorator.prototype.setScrollBarV = function (scrollbarV) { + this.$createCanvas(); + this.scrollbarV = scrollbarV; + scrollbarV.element.appendChild(this.canvas); + this.setDimensions(); + }; + Decorator.prototype.$updateDecorators = function (config) { + if (typeof this.canvas.getContext !== "function") { + return; + } + var colors = (this.renderer.theme.isDark === true) ? this.colors.dark : this.colors.light; + this.setDimensions(config); + var ctx = this.canvas.getContext("2d"); + function compare(a, b) { + if (a.priority < b.priority) + return -1; + if (a.priority > b.priority) + return 1; + return 0; + } + var annotations = this.renderer.session.$annotations; + ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + if (annotations) { + var priorities = { + "info": 1, + "warning": 2, + "error": 3 + }; + annotations.forEach(function (item) { + item["priority"] = priorities[item.type] || null; + }); + annotations = annotations.sort(compare); + for (var i = 0; i < annotations.length; i++) { + var row = annotations[i].row; + var offset1 = this.getVerticalOffsetForRow(row); + var offset2 = offset1 + this.lineHeight; + var y1 = Math.round(this.heightRatio * offset1); + var y2 = Math.round(this.heightRatio * offset2); + var ycenter = Math.round((y1 + y2) / 2); + var halfHeight = (y2 - ycenter); + if (halfHeight < this.halfMinDecorationHeight) { + halfHeight = this.halfMinDecorationHeight; + } + if (ycenter - halfHeight < 0) { + ycenter = halfHeight; + } + if (ycenter + halfHeight > this.canvasHeight) { + ycenter = this.canvasHeight - halfHeight; + } + var from = ycenter - halfHeight; + var to = ycenter + halfHeight; + var zoneHeight = to - from; + ctx.fillStyle = colors[annotations[i].type] || null; + ctx.fillRect(0, from, Math.round(this.oneZoneWidth - 1), zoneHeight); + } + } + var cursor = this.renderer.session.selection.getCursor(); + if (cursor) { + var currentY = Math.round(this.getVerticalOffsetForRow(cursor.row) * this.heightRatio); + ctx.fillStyle = "rgba(0, 0, 0, 0.5)"; + ctx.fillRect(0, currentY, this.canvasWidth, 2); + } + }; + Decorator.prototype.getVerticalOffsetForRow = function (row) { + row = row | 0; + var offset = this.renderer.session.documentToScreenRow(row, 0) * this.lineHeight; + return offset; + }; + Decorator.prototype.setDimensions = function (config) { + config = config || this.renderer.layerConfig; + this.maxHeight = config.maxHeight; + this.lineHeight = config.lineHeight; + this.canvasHeight = config.height; + this.canvasWidth = this.scrollbarV.width || this.canvasWidth; + this.setZoneWidth(); + this.canvas.width = this.canvasWidth; + this.canvas.height = this.canvasHeight; + if (this.maxHeight < this.canvasHeight) { + this.heightRatio = 1; + } + else { + this.heightRatio = this.canvasHeight / this.maxHeight; + } + }; + Decorator.prototype.setZoneWidth = function () { + this.oneZoneWidth = this.canvasWidth; + }; + Decorator.prototype.destroy = function () { + this.canvas.parentNode.removeChild(this.canvas); + }; + return Decorator; +}()); +oop.implement(Decorator.prototype, EventEmitter); +exports.Decorator = Decorator; + +}); +define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/scrollbar_custom","ace/scrollbar_custom","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter","ace/css/editor-css","ace/layer/decorators","ace/lib/useragent","ace/layer/text_util"], function(require, exports, module){"use strict"; var oop = require("./lib/oop"); var dom = require("./lib/dom"); +var lang = require("./lib/lang"); var config = require("./config"); var GutterLayer = require("./layer/gutter").Gutter; var MarkerLayer = require("./layer/marker").Marker; @@ -17348,660 +18835,133 @@ var TextLayer = require("./layer/text").Text; var CursorLayer = require("./layer/cursor").Cursor; var HScrollBar = require("./scrollbar").HScrollBar; var VScrollBar = require("./scrollbar").VScrollBar; +var HScrollBarCustom = require("./scrollbar_custom").HScrollBar; +var VScrollBarCustom = require("./scrollbar_custom").VScrollBar; var RenderLoop = require("./renderloop").RenderLoop; var FontMetrics = require("./layer/font_metrics").FontMetrics; var EventEmitter = require("./lib/event_emitter").EventEmitter; -var editorCss = "\ -.ace_br1 {border-top-left-radius : 3px;}\ -.ace_br2 {border-top-right-radius : 3px;}\ -.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\ -.ace_br4 {border-bottom-right-radius: 3px;}\ -.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\ -.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\ -.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\ -.ace_br8 {border-bottom-left-radius : 3px;}\ -.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\ -.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\ -.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\ -.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ -.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ -.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ -.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ -.ace_editor {\ -position: relative;\ -overflow: hidden;\ -padding: 0;\ -font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\ -direction: ltr;\ -text-align: left;\ --webkit-tap-highlight-color: rgba(0, 0, 0, 0);\ -}\ -.ace_scroller {\ -position: absolute;\ -overflow: hidden;\ -top: 0;\ -bottom: 0;\ -background-color: inherit;\ --ms-user-select: none;\ --moz-user-select: none;\ --webkit-user-select: none;\ -user-select: none;\ -cursor: text;\ -}\ -.ace_content {\ -position: absolute;\ -box-sizing: border-box;\ -min-width: 100%;\ -contain: style size layout;\ -font-variant-ligatures: no-common-ligatures;\ -}\ -.ace_dragging .ace_scroller:before{\ -position: absolute;\ -top: 0;\ -left: 0;\ -right: 0;\ -bottom: 0;\ -content: '';\ -background: rgba(250, 250, 250, 0.01);\ -z-index: 1000;\ -}\ -.ace_dragging.ace_dark .ace_scroller:before{\ -background: rgba(0, 0, 0, 0.01);\ -}\ -.ace_gutter {\ -position: absolute;\ -overflow : hidden;\ -width: auto;\ -top: 0;\ -bottom: 0;\ -left: 0;\ -cursor: default;\ -z-index: 4;\ --ms-user-select: none;\ --moz-user-select: none;\ --webkit-user-select: none;\ -user-select: none;\ -contain: style size layout;\ -}\ -.ace_gutter-active-line {\ -position: absolute;\ -left: 0;\ -right: 0;\ -}\ -.ace_scroller.ace_scroll-left {\ -box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\ -}\ -.ace_gutter-cell {\ -position: absolute;\ -top: 0;\ -left: 0;\ -right: 0;\ -padding-left: 19px;\ -padding-right: 6px;\ -background-repeat: no-repeat;\ -}\ -.ace_gutter-cell.ace_error {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\");\ -background-repeat: no-repeat;\ -background-position: 2px center;\ -}\ -.ace_gutter-cell.ace_warning {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\");\ -background-position: 2px center;\ -}\ -.ace_gutter-cell.ace_info {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\");\ -background-position: 2px center;\ -}\ -.ace_dark .ace_gutter-cell.ace_info {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\");\ -}\ -.ace_scrollbar {\ -contain: strict;\ -position: absolute;\ -right: 0;\ -bottom: 0;\ -z-index: 6;\ -}\ -.ace_scrollbar-inner {\ -position: absolute;\ -cursor: text;\ -left: 0;\ -top: 0;\ -}\ -.ace_scrollbar-v{\ -overflow-x: hidden;\ -overflow-y: scroll;\ -top: 0;\ -}\ -.ace_scrollbar-h {\ -overflow-x: scroll;\ -overflow-y: hidden;\ -left: 0;\ -}\ -.ace_print-margin {\ -position: absolute;\ -height: 100%;\ -}\ -.ace_text-input {\ -position: absolute;\ -z-index: 0;\ -width: 0.5em;\ -height: 1em;\ -opacity: 0;\ -background: transparent;\ --moz-appearance: none;\ -appearance: none;\ -border: none;\ -resize: none;\ -outline: none;\ -overflow: hidden;\ -font: inherit;\ -padding: 0 1px;\ -margin: 0 -1px;\ -contain: strict;\ --ms-user-select: text;\ --moz-user-select: text;\ --webkit-user-select: text;\ -user-select: text;\ -white-space: pre!important;\ -}\ -.ace_text-input.ace_composition {\ -background: transparent;\ -color: inherit;\ -z-index: 1000;\ -opacity: 1;\ -}\ -.ace_composition_placeholder { color: transparent }\ -.ace_composition_marker { \ -border-bottom: 1px solid;\ -position: absolute;\ -border-radius: 0;\ -margin-top: 1px;\ -}\ -[ace_nocontext=true] {\ -transform: none!important;\ -filter: none!important;\ -clip-path: none!important;\ -mask : none!important;\ -contain: none!important;\ -perspective: none!important;\ -mix-blend-mode: initial!important;\ -z-index: auto;\ -}\ -.ace_layer {\ -z-index: 1;\ -position: absolute;\ -overflow: hidden;\ -word-wrap: normal;\ -white-space: pre;\ -height: 100%;\ -width: 100%;\ -box-sizing: border-box;\ -pointer-events: none;\ -}\ -.ace_gutter-layer {\ -position: relative;\ -width: auto;\ -text-align: right;\ -pointer-events: auto;\ -height: 1000000px;\ -contain: style size layout;\ -}\ -.ace_text-layer {\ -font: inherit !important;\ -position: absolute;\ -height: 1000000px;\ -width: 1000000px;\ -contain: style size layout;\ -}\ -.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {\ -contain: style size layout;\ -position: absolute;\ -top: 0;\ -left: 0;\ -right: 0;\ -}\ -.ace_hidpi .ace_text-layer,\ -.ace_hidpi .ace_gutter-layer,\ -.ace_hidpi .ace_content,\ -.ace_hidpi .ace_gutter {\ -contain: strict;\ -will-change: transform;\ -}\ -.ace_hidpi .ace_text-layer > .ace_line, \ -.ace_hidpi .ace_text-layer > .ace_line_group {\ -contain: strict;\ -}\ -.ace_cjk {\ -display: inline-block;\ -text-align: center;\ -}\ -.ace_cursor-layer {\ -z-index: 4;\ -}\ -.ace_cursor {\ -z-index: 4;\ -position: absolute;\ -box-sizing: border-box;\ -border-left: 2px solid;\ -transform: translatez(0);\ -}\ -.ace_multiselect .ace_cursor {\ -border-left-width: 1px;\ -}\ -.ace_slim-cursors .ace_cursor {\ -border-left-width: 1px;\ -}\ -.ace_overwrite-cursors .ace_cursor {\ -border-left-width: 0;\ -border-bottom: 1px solid;\ -}\ -.ace_hidden-cursors .ace_cursor {\ -opacity: 0.2;\ -}\ -.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {\ -opacity: 0;\ -}\ -.ace_smooth-blinking .ace_cursor {\ -transition: opacity 0.18s;\ -}\ -.ace_animate-blinking .ace_cursor {\ -animation-duration: 1000ms;\ -animation-timing-function: step-end;\ -animation-name: blink-ace-animate;\ -animation-iteration-count: infinite;\ -}\ -.ace_animate-blinking.ace_smooth-blinking .ace_cursor {\ -animation-duration: 1000ms;\ -animation-timing-function: ease-in-out;\ -animation-name: blink-ace-animate-smooth;\ -}\ -@keyframes blink-ace-animate {\ -from, to { opacity: 1; }\ -60% { opacity: 0; }\ -}\ -@keyframes blink-ace-animate-smooth {\ -from, to { opacity: 1; }\ -45% { opacity: 1; }\ -60% { opacity: 0; }\ -85% { opacity: 0; }\ -}\ -.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\ -position: absolute;\ -z-index: 3;\ -}\ -.ace_marker-layer .ace_selection {\ -position: absolute;\ -z-index: 5;\ -}\ -.ace_marker-layer .ace_bracket {\ -position: absolute;\ -z-index: 6;\ -}\ -.ace_marker-layer .ace_error_bracket {\ -position: absolute;\ -border-bottom: 1px solid #DE5555;\ -border-radius: 0;\ -}\ -.ace_marker-layer .ace_active-line {\ -position: absolute;\ -z-index: 2;\ -}\ -.ace_marker-layer .ace_selected-word {\ -position: absolute;\ -z-index: 4;\ -box-sizing: border-box;\ -}\ -.ace_line .ace_fold {\ -box-sizing: border-box;\ -display: inline-block;\ -height: 11px;\ -margin-top: -2px;\ -vertical-align: middle;\ -background-image:\ -url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ -url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\ -background-repeat: no-repeat, repeat-x;\ -background-position: center center, top left;\ -color: transparent;\ -border: 1px solid black;\ -border-radius: 2px;\ -cursor: pointer;\ -pointer-events: auto;\ -}\ -.ace_dark .ace_fold {\ -}\ -.ace_fold:hover{\ -background-image:\ -url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ -url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\ -}\ -.ace_tooltip {\ -background-color: #FFF;\ -background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\ -border: 1px solid gray;\ -border-radius: 1px;\ -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\ -color: black;\ -max-width: 100%;\ -padding: 3px 4px;\ -position: fixed;\ -z-index: 999999;\ -box-sizing: border-box;\ -cursor: default;\ -white-space: pre;\ -word-wrap: break-word;\ -line-height: normal;\ -font-style: normal;\ -font-weight: normal;\ -letter-spacing: normal;\ -pointer-events: none;\ -}\ -.ace_folding-enabled > .ace_gutter-cell {\ -padding-right: 13px;\ -}\ -.ace_fold-widget {\ -box-sizing: border-box;\ -margin: 0 -12px 0 1px;\ -display: none;\ -width: 11px;\ -vertical-align: top;\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\ -background-repeat: no-repeat;\ -background-position: center;\ -border-radius: 3px;\ -border: 1px solid transparent;\ -cursor: pointer;\ -}\ -.ace_folding-enabled .ace_fold-widget {\ -display: inline-block; \ -}\ -.ace_fold-widget.ace_end {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\ -}\ -.ace_fold-widget.ace_closed {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\ -}\ -.ace_fold-widget:hover {\ -border: 1px solid rgba(0, 0, 0, 0.3);\ -background-color: rgba(255, 255, 255, 0.2);\ -box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ -}\ -.ace_fold-widget:active {\ -border: 1px solid rgba(0, 0, 0, 0.4);\ -background-color: rgba(0, 0, 0, 0.05);\ -box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ -}\ -.ace_dark .ace_fold-widget {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\ -}\ -.ace_dark .ace_fold-widget.ace_end {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\ -}\ -.ace_dark .ace_fold-widget.ace_closed {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\ -}\ -.ace_dark .ace_fold-widget:hover {\ -box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ -background-color: rgba(255, 255, 255, 0.1);\ -}\ -.ace_dark .ace_fold-widget:active {\ -box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ -}\ -.ace_inline_button {\ -border: 1px solid lightgray;\ -display: inline-block;\ -margin: -1px 8px;\ -padding: 0 5px;\ -pointer-events: auto;\ -cursor: pointer;\ -}\ -.ace_inline_button:hover {\ -border-color: gray;\ -background: rgba(200,200,200,0.2);\ -display: inline-block;\ -pointer-events: auto;\ -}\ -.ace_fold-widget.ace_invalid {\ -background-color: #FFB4B4;\ -border-color: #DE5555;\ -}\ -.ace_fade-fold-widgets .ace_fold-widget {\ -transition: opacity 0.4s ease 0.05s;\ -opacity: 0;\ -}\ -.ace_fade-fold-widgets:hover .ace_fold-widget {\ -transition: opacity 0.05s ease 0.05s;\ -opacity:1;\ -}\ -.ace_underline {\ -text-decoration: underline;\ -}\ -.ace_bold {\ -font-weight: bold;\ -}\ -.ace_nobold .ace_bold {\ -font-weight: normal;\ -}\ -.ace_italic {\ -font-style: italic;\ -}\ -.ace_error-marker {\ -background-color: rgba(255, 0, 0,0.2);\ -position: absolute;\ -z-index: 9;\ -}\ -.ace_highlight-marker {\ -background-color: rgba(255, 255, 0,0.2);\ -position: absolute;\ -z-index: 8;\ -}\ -.ace_mobile-menu {\ -position: absolute;\ -line-height: 1.5;\ -border-radius: 4px;\ --ms-user-select: none;\ --moz-user-select: none;\ --webkit-user-select: none;\ -user-select: none;\ -background: white;\ -box-shadow: 1px 3px 2px grey;\ -border: 1px solid #dcdcdc;\ -color: black;\ -}\ -.ace_dark > .ace_mobile-menu {\ -background: #333;\ -color: #ccc;\ -box-shadow: 1px 3px 2px grey;\ -border: 1px solid #444;\ -}\ -.ace_mobile-button {\ -padding: 2px;\ -cursor: pointer;\ -overflow: hidden;\ -}\ -.ace_mobile-button:hover {\ -background-color: #eee;\ -opacity:1;\ -}\ -.ace_mobile-button:active {\ -background-color: #ddd;\ -}\ -.ace_placeholder {\ -font-family: arial;\ -transform: scale(0.9);\ -transform-origin: left;\ -white-space: pre;\ -opacity: 0.7;\ -margin: 0 10px;\ -}"; - +var editorCss = require("./css/editor-css"); +var Decorator = require("./layer/decorators").Decorator; var useragent = require("./lib/useragent"); -var HIDE_TEXTAREA = useragent.isIE; - +var isTextToken = require("./layer/text_util").isTextToken; dom.importCssString(editorCss, "ace_editor.css", false); - -var VirtualRenderer = function(container, theme) { - var _self = this; - - this.container = container || dom.createElement("div"); - - dom.addCssClass(this.container, "ace_editor"); - if (dom.HI_DPI) dom.addCssClass(this.container, "ace_hidpi"); - - this.setTheme(theme); - if (config.get("useStrictCSP") == null) - config.set("useStrictCSP", false); - - this.$gutter = dom.createElement("div"); - this.$gutter.className = "ace_gutter"; - this.container.appendChild(this.$gutter); - this.$gutter.setAttribute("aria-hidden", true); - - this.scroller = dom.createElement("div"); - this.scroller.className = "ace_scroller"; - - this.container.appendChild(this.scroller); - - this.content = dom.createElement("div"); - this.content.className = "ace_content"; - this.scroller.appendChild(this.content); - - this.$gutterLayer = new GutterLayer(this.$gutter); - this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)); - - this.$markerBack = new MarkerLayer(this.content); - - var textLayer = this.$textLayer = new TextLayer(this.content); - this.canvas = textLayer.element; - - this.$markerFront = new MarkerLayer(this.content); - - this.$cursorLayer = new CursorLayer(this.content); - this.$horizScroll = false; - this.$vScroll = false; - - this.scrollBar = - this.scrollBarV = new VScrollBar(this.container, this); - this.scrollBarH = new HScrollBar(this.container, this); - this.scrollBarV.on("scroll", function(e) { - if (!_self.$scrollAnimation) - _self.session.setScrollTop(e.data - _self.scrollMargin.top); - }); - this.scrollBarH.on("scroll", function(e) { - if (!_self.$scrollAnimation) - _self.session.setScrollLeft(e.data - _self.scrollMargin.left); - }); - - this.scrollTop = 0; - this.scrollLeft = 0; - - this.cursorPos = { - row : 0, - column : 0 - }; - - this.$fontMetrics = new FontMetrics(this.container); - this.$textLayer.$setFontMetrics(this.$fontMetrics); - this.$textLayer.on("changeCharacterSize", function(e) { - _self.updateCharacterSize(); - _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height); - _self._signal("changeCharacterSize", e); - }); - - this.$size = { - width: 0, - height: 0, - scrollerHeight: 0, - scrollerWidth: 0, - $dirty: true - }; - - this.layerConfig = { - width : 1, - padding : 0, - firstRow : 0, - firstRowScreen: 0, - lastRow : 0, - lineHeight : 0, - characterWidth : 0, - minHeight : 1, - maxHeight : 1, - offset : 0, - height : 1, - gutterOffset: 1 - }; - - this.scrollMargin = { - left: 0, - right: 0, - top: 0, - bottom: 0, - v: 0, - h: 0 - }; - - this.margin = { - left: 0, - right: 0, - top: 0, - bottom: 0, - v: 0, - h: 0 - }; - - this.$keepTextAreaAtCursor = !useragent.isIOS; - - this.$loop = new RenderLoop( - this.$renderChanges.bind(this), - this.container.ownerDocument.defaultView - ); - this.$loop.schedule(this.CHANGE_FULL); - - this.updateCharacterSize(); - this.setPadding(4); - config.resetOptions(this); - config._signal("renderer", this); -}; - -(function() { - - this.CHANGE_CURSOR = 1; - this.CHANGE_MARKER = 2; - this.CHANGE_GUTTER = 4; - this.CHANGE_SCROLL = 8; - this.CHANGE_LINES = 16; - this.CHANGE_TEXT = 32; - this.CHANGE_SIZE = 64; - this.CHANGE_MARKER_BACK = 128; - this.CHANGE_MARKER_FRONT = 256; - this.CHANGE_FULL = 512; - this.CHANGE_H_SCROLL = 1024; - - oop.implement(this, EventEmitter); - - this.updateCharacterSize = function() { +var VirtualRenderer = /** @class */ (function () { + function VirtualRenderer(container, theme) { + var _self = this; + this.container = container || dom.createElement("div"); + dom.addCssClass(this.container, "ace_editor"); + if (dom.HI_DPI) + dom.addCssClass(this.container, "ace_hidpi"); + this.setTheme(theme); + if (config.get("useStrictCSP") == null) + config.set("useStrictCSP", false); + this.$gutter = dom.createElement("div"); + this.$gutter.className = "ace_gutter"; + this.container.appendChild(this.$gutter); + this.$gutter.setAttribute("aria-hidden", "true"); + this.scroller = dom.createElement("div"); + this.scroller.className = "ace_scroller"; + this.container.appendChild(this.scroller); + this.content = dom.createElement("div"); + this.content.className = "ace_content"; + this.scroller.appendChild(this.content); + this.$gutterLayer = new GutterLayer(this.$gutter); + this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)); + this.$markerBack = new MarkerLayer(this.content); + var textLayer = this.$textLayer = new TextLayer(this.content); + this.canvas = textLayer.element; + this.$markerFront = new MarkerLayer(this.content); + this.$cursorLayer = new CursorLayer(this.content); + this.$horizScroll = false; + this.$vScroll = false; + this.scrollBar = + this.scrollBarV = new VScrollBar(this.container, this); + this.scrollBarH = new HScrollBar(this.container, this); + this.scrollBarV.on("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.on("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); + this.scrollTop = 0; + this.scrollLeft = 0; + this.cursorPos = { + row: 0, + column: 0 + }; + this.$fontMetrics = new FontMetrics(this.container); + this.$textLayer.$setFontMetrics(this.$fontMetrics); + this.$textLayer.on("changeCharacterSize", function (e) { + _self.updateCharacterSize(); + _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height); + _self._signal("changeCharacterSize", e); + }); + this.$size = { + width: 0, + height: 0, + scrollerHeight: 0, + scrollerWidth: 0, + $dirty: true + }; + this.layerConfig = { + width: 1, + padding: 0, + firstRow: 0, + firstRowScreen: 0, + lastRow: 0, + lineHeight: 0, + characterWidth: 0, + minHeight: 1, + maxHeight: 1, + offset: 0, + height: 1, + gutterOffset: 1 + }; + this.scrollMargin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + v: 0, + h: 0 + }; + this.margin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + v: 0, + h: 0 + }; + this.$keepTextAreaAtCursor = !useragent.isIOS; + this.$loop = new RenderLoop(this.$renderChanges.bind(this), this.container.ownerDocument.defaultView); + this.$loop.schedule(this.CHANGE_FULL); + this.updateCharacterSize(); + this.setPadding(4); + this.$addResizeObserver(); + config.resetOptions(this); + config._signal("renderer", this); + } + VirtualRenderer.prototype.updateCharacterSize = function () { if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) { this.$allowBoldFonts = this.$textLayer.allowBoldFonts; this.setStyle("ace_nobold", !this.$allowBoldFonts); } - this.layerConfig.characterWidth = - this.characterWidth = this.$textLayer.getCharacterWidth(); + this.characterWidth = this.$textLayer.getCharacterWidth(); this.layerConfig.lineHeight = - this.lineHeight = this.$textLayer.getLineHeight(); + this.lineHeight = this.$textLayer.getLineHeight(); this.$updatePrintMargin(); dom.setStyle(this.scroller.style, "line-height", this.lineHeight + "px"); }; - this.setSession = function(session) { + VirtualRenderer.prototype.setSession = function (session) { if (this.session) this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode); - this.session = session; if (session && this.scrollMargin.top && session.getScrollTop() <= 0) session.setScrollTop(-this.scrollMargin.top); - this.$cursorLayer.setSession(session); this.$markerBack.setSession(session); this.$markerFront.setSession(session); @@ -18009,19 +18969,16 @@ var VirtualRenderer = function(container, theme) { this.$textLayer.setSession(session); if (!session) return; - this.$loop.schedule(this.CHANGE_FULL); this.session.$setFontMetrics(this.$fontMetrics); this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null; - this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this); this.onChangeNewLineMode(); this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode); }; - this.updateLines = function(firstRow, lastRow, force) { + VirtualRenderer.prototype.updateLines = function (firstRow, lastRow, force) { if (lastRow === undefined) lastRow = Infinity; - if (!this.$changedLines) { this.$changedLines = { firstRow: firstRow, @@ -18031,7 +18988,6 @@ var VirtualRenderer = function(container, theme) { else { if (this.$changedLines.firstRow > firstRow) this.$changedLines.firstRow = firstRow; - if (this.$changedLines.lastRow < lastRow) this.$changedLines.lastRow = lastRow; } @@ -18045,38 +19001,34 @@ var VirtualRenderer = function(container, theme) { return; this.$loop.schedule(this.CHANGE_LINES); }; - - this.onChangeNewLineMode = function() { + VirtualRenderer.prototype.onChangeNewLineMode = function () { this.$loop.schedule(this.CHANGE_TEXT); this.$textLayer.$updateEolChar(); this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR); }; - - this.onChangeTabSize = function() { + VirtualRenderer.prototype.onChangeTabSize = function () { this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER); this.$textLayer.onChangeTabSize(); }; - this.updateText = function() { + VirtualRenderer.prototype.updateText = function () { this.$loop.schedule(this.CHANGE_TEXT); }; - this.updateFull = function(force) { + VirtualRenderer.prototype.updateFull = function (force) { if (force) this.$renderChanges(this.CHANGE_FULL, true); else this.$loop.schedule(this.CHANGE_FULL); }; - this.updateFontSize = function() { + VirtualRenderer.prototype.updateFontSize = function () { this.$textLayer.checkForSizeChanges(); }; - - this.$changes = 0; - this.$updateSizeAsync = function() { + VirtualRenderer.prototype.$updateSizeAsync = function () { if (this.$loop.pending) this.$size.$dirty = true; else this.onResize(); }; - this.onResize = function(force, gutterWidth, width, height) { + VirtualRenderer.prototype.onResize = function (force, gutterWidth, width, height) { if (this.resizing > 2) return; else if (this.resizing > 0) @@ -18086,28 +19038,33 @@ var VirtualRenderer = function(container, theme) { var el = this.container; if (!height) height = el.clientHeight || el.scrollHeight; + if (!height && this.$maxLines && this.lineHeight > 1) { + if (!el.style.height || el.style.height == "0px") { + el.style.height = "1px"; + height = el.clientHeight || el.scrollHeight; + } + } if (!width) width = el.clientWidth || el.scrollWidth; var changes = this.$updateCachedSize(force, gutterWidth, width, height); - - + if (this.$resizeTimer) + this.$resizeTimer.cancel(); if (!this.$size.scrollerHeight || (!width && !height)) return this.resizing = 0; - if (force) this.$gutterLayer.$padding = null; - if (force) this.$renderChanges(changes | this.$changes, true); else this.$loop.schedule(changes | this.$changes); - if (this.resizing) this.resizing = 0; this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null; + if (this.$customScrollbar) { + this.$updateCustomScrollbar(true); + } }; - - this.$updateCachedSize = function(force, gutterWidth, width, height) { + VirtualRenderer.prototype.$updateCachedSize = function (force, gutterWidth, width, height) { height -= (this.$extraHeight || 0); var changes = 0; var size = this.$size; @@ -18120,124 +19077,114 @@ var VirtualRenderer = function(container, theme) { if (height && (force || size.height != height)) { size.height = height; changes |= this.CHANGE_SIZE; - size.scrollerHeight = size.height; if (this.$horizScroll) size.scrollerHeight -= this.scrollBarH.getHeight(); + this.scrollBarV.setHeight(size.scrollerHeight); this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px"; - changes = changes | this.CHANGE_SCROLL; } - if (width && (force || size.width != width)) { changes |= this.CHANGE_SIZE; size.width = width; - if (gutterWidth == null) gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; - this.gutterWidth = gutterWidth; - dom.setStyle(this.scrollBarH.element.style, "left", gutterWidth + "px"); dom.setStyle(this.scroller.style, "left", gutterWidth + this.margin.left + "px"); size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth() - this.margin.h); dom.setStyle(this.$gutter.style, "left", this.margin.left + "px"); - var right = this.scrollBarV.getWidth() + "px"; dom.setStyle(this.scrollBarH.element.style, "right", right); dom.setStyle(this.scroller.style, "right", right); dom.setStyle(this.scroller.style, "bottom", this.scrollBarH.getHeight()); - + this.scrollBarH.setWidth(size.scrollerWidth); if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) { changes |= this.CHANGE_FULL; } } - size.$dirty = !width || !height; - if (changes) this._signal("resize", oldSize); - return changes; }; - - this.onGutterResize = function(width) { + VirtualRenderer.prototype.onGutterResize = function (width) { var gutterWidth = this.$showGutter ? width : 0; if (gutterWidth != this.gutterWidth) this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height); - if (this.session.getUseWrapMode() && this.adjustWrapLimit()) { this.$loop.schedule(this.CHANGE_FULL); - } else if (this.$size.$dirty) { + } + else if (this.$size.$dirty) { this.$loop.schedule(this.CHANGE_FULL); - } else { + } + else { this.$computeLayerConfig(); } }; - this.adjustWrapLimit = function() { + VirtualRenderer.prototype.adjustWrapLimit = function () { var availableWidth = this.$size.scrollerWidth - this.$padding * 2; var limit = Math.floor(availableWidth / this.characterWidth); return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn); }; - this.setAnimatedScroll = function(shouldAnimate){ + VirtualRenderer.prototype.setAnimatedScroll = function (shouldAnimate) { this.setOption("animatedScroll", shouldAnimate); }; - this.getAnimatedScroll = function() { + VirtualRenderer.prototype.getAnimatedScroll = function () { return this.$animatedScroll; }; - this.setShowInvisibles = function(showInvisibles) { + VirtualRenderer.prototype.setShowInvisibles = function (showInvisibles) { this.setOption("showInvisibles", showInvisibles); this.session.$bidiHandler.setShowInvisibles(showInvisibles); }; - this.getShowInvisibles = function() { + VirtualRenderer.prototype.getShowInvisibles = function () { return this.getOption("showInvisibles"); }; - this.getDisplayIndentGuides = function() { + VirtualRenderer.prototype.getDisplayIndentGuides = function () { return this.getOption("displayIndentGuides"); }; - - this.setDisplayIndentGuides = function(display) { + VirtualRenderer.prototype.setDisplayIndentGuides = function (display) { this.setOption("displayIndentGuides", display); }; - this.setShowPrintMargin = function(showPrintMargin) { + VirtualRenderer.prototype.getHighlightIndentGuides = function () { + return this.getOption("highlightIndentGuides"); + }; + VirtualRenderer.prototype.setHighlightIndentGuides = function (highlight) { + this.setOption("highlightIndentGuides", highlight); + }; + VirtualRenderer.prototype.setShowPrintMargin = function (showPrintMargin) { this.setOption("showPrintMargin", showPrintMargin); }; - this.getShowPrintMargin = function() { + VirtualRenderer.prototype.getShowPrintMargin = function () { return this.getOption("showPrintMargin"); }; - this.setPrintMarginColumn = function(showPrintMargin) { - this.setOption("printMarginColumn", showPrintMargin); + VirtualRenderer.prototype.setPrintMarginColumn = function (printMarginColumn) { + this.setOption("printMarginColumn", printMarginColumn); }; - this.getPrintMarginColumn = function() { + VirtualRenderer.prototype.getPrintMarginColumn = function () { return this.getOption("printMarginColumn"); }; - this.getShowGutter = function(){ + VirtualRenderer.prototype.getShowGutter = function () { return this.getOption("showGutter"); }; - this.setShowGutter = function(show){ + VirtualRenderer.prototype.setShowGutter = function (show) { return this.setOption("showGutter", show); }; - - this.getFadeFoldWidgets = function(){ + VirtualRenderer.prototype.getFadeFoldWidgets = function () { return this.getOption("fadeFoldWidgets"); }; - - this.setFadeFoldWidgets = function(show) { + VirtualRenderer.prototype.setFadeFoldWidgets = function (show) { this.setOption("fadeFoldWidgets", show); }; - - this.setHighlightGutterLine = function(shouldHighlight) { + VirtualRenderer.prototype.setHighlightGutterLine = function (shouldHighlight) { this.setOption("highlightGutterLine", shouldHighlight); }; - - this.getHighlightGutterLine = function() { + VirtualRenderer.prototype.getHighlightGutterLine = function () { return this.getOption("highlightGutterLine"); }; - - this.$updatePrintMargin = function() { + VirtualRenderer.prototype.$updatePrintMargin = function () { if (!this.$showPrintMargin && !this.$printMarginEl) return; - if (!this.$printMarginEl) { var containerEl = dom.createElement("div"); containerEl.className = "ace_layer ace_print-margin-layer"; @@ -18246,25 +19193,24 @@ var VirtualRenderer = function(container, theme) { containerEl.appendChild(this.$printMarginEl); this.content.insertBefore(containerEl, this.content.firstChild); } - var style = this.$printMarginEl.style; style.left = Math.round(this.characterWidth * this.$printMarginColumn + this.$padding) + "px"; style.visibility = this.$showPrintMargin ? "visible" : "hidden"; - if (this.session && this.session.$wrap == -1) this.adjustWrapLimit(); }; - this.getContainerElement = function() { + VirtualRenderer.prototype.getContainerElement = function () { return this.container; }; - this.getMouseEventTarget = function() { + VirtualRenderer.prototype.getMouseEventTarget = function () { return this.scroller; }; - this.getTextAreaContainer = function() { + VirtualRenderer.prototype.getTextAreaContainer = function () { return this.container; }; - this.$moveTextAreaToCursor = function() { - if (this.$isMousePressed) return; + VirtualRenderer.prototype.$moveTextAreaToCursor = function () { + if (this.$isMousePressed) + return; var style = this.textarea.style; var composition = this.$composition; if (!this.$keepTextAreaAtCursor && !composition) { @@ -18276,18 +19222,15 @@ var VirtualRenderer = function(container, theme) { return; if (composition && composition.markerRange) pixelPos = this.$cursorLayer.getPixelPosition(composition.markerRange.start, true); - var config = this.layerConfig; var posTop = pixelPos.top; var posLeft = pixelPos.left; posTop -= config.offset; - - var h = composition && composition.useTextareaForIME ? this.lineHeight : HIDE_TEXTAREA ? 0 : 1; + var h = composition && composition.useTextareaForIME || useragent.isMobile ? this.lineHeight : 1; if (posTop < 0 || posTop > config.height - h) { dom.translate(this.textarea, 0, 0); return; } - var w = 1; var maxTop = this.$size.height - h; if (!composition) { @@ -18302,24 +19245,21 @@ var VirtualRenderer = function(container, theme) { posTop += this.lineHeight + 2; } } - posLeft -= this.scrollLeft; if (posLeft > this.$size.scrollerWidth - w) posLeft = this.$size.scrollerWidth - w; - posLeft += this.gutterWidth + this.margin.left; - dom.setStyle(style, "height", h + "px"); dom.setStyle(style, "width", w + "px"); dom.translate(this.textarea, Math.min(posLeft, this.$size.scrollerWidth - w), Math.min(posTop, maxTop)); }; - this.getFirstVisibleRow = function() { + VirtualRenderer.prototype.getFirstVisibleRow = function () { return this.layerConfig.firstRow; }; - this.getFirstFullyVisibleRow = function() { + VirtualRenderer.prototype.getFirstFullyVisibleRow = function () { return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1); }; - this.getLastFullyVisibleRow = function() { + VirtualRenderer.prototype.getLastFullyVisibleRow = function () { var config = this.layerConfig; var lastRow = config.lastRow; var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight; @@ -18327,12 +19267,10 @@ var VirtualRenderer = function(container, theme) { return lastRow - 1; return lastRow; }; - this.getLastVisibleRow = function() { + VirtualRenderer.prototype.getLastVisibleRow = function () { return this.layerConfig.lastRow; }; - - this.$padding = null; - this.setPadding = function(padding) { + VirtualRenderer.prototype.setPadding = function (padding) { this.$padding = padding; this.$textLayer.setPadding(padding); this.$cursorLayer.setPadding(padding); @@ -18341,45 +19279,42 @@ var VirtualRenderer = function(container, theme) { this.$loop.schedule(this.CHANGE_FULL); this.$updatePrintMargin(); }; - - this.setScrollMargin = function(top, bottom, left, right) { + VirtualRenderer.prototype.setScrollMargin = function (top, bottom, left, right) { var sm = this.scrollMargin; - sm.top = top|0; - sm.bottom = bottom|0; - sm.right = right|0; - sm.left = left|0; + sm.top = top | 0; + sm.bottom = bottom | 0; + sm.right = right | 0; + sm.left = left | 0; sm.v = sm.top + sm.bottom; sm.h = sm.left + sm.right; if (sm.top && this.scrollTop <= 0 && this.session) this.session.setScrollTop(-sm.top); this.updateFull(); }; - - this.setMargin = function(top, bottom, left, right) { + VirtualRenderer.prototype.setMargin = function (top, bottom, left, right) { var sm = this.margin; - sm.top = top|0; - sm.bottom = bottom|0; - sm.right = right|0; - sm.left = left|0; + sm.top = top | 0; + sm.bottom = bottom | 0; + sm.right = right | 0; + sm.left = left | 0; sm.v = sm.top + sm.bottom; sm.h = sm.left + sm.right; this.$updateCachedSize(true, this.gutterWidth, this.$size.width, this.$size.height); this.updateFull(); }; - this.getHScrollBarAlwaysVisible = function() { + VirtualRenderer.prototype.getHScrollBarAlwaysVisible = function () { return this.$hScrollBarAlwaysVisible; }; - this.setHScrollBarAlwaysVisible = function(alwaysVisible) { + VirtualRenderer.prototype.setHScrollBarAlwaysVisible = function (alwaysVisible) { this.setOption("hScrollBarAlwaysVisible", alwaysVisible); }; - this.getVScrollBarAlwaysVisible = function() { + VirtualRenderer.prototype.getVScrollBarAlwaysVisible = function () { return this.$vScrollBarAlwaysVisible; }; - this.setVScrollBarAlwaysVisible = function(alwaysVisible) { + VirtualRenderer.prototype.setVScrollBarAlwaysVisible = function (alwaysVisible) { this.setOption("vScrollBarAlwaysVisible", alwaysVisible); }; - - this.$updateScrollBarV = function() { + VirtualRenderer.prototype.$updateScrollBarV = function () { var scrollHeight = this.layerConfig.maxHeight; var scrollerHeight = this.$size.scrollerHeight; if (!this.$maxLines && this.$scrollPastEnd) { @@ -18392,29 +19327,25 @@ var VirtualRenderer = function(container, theme) { this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v); this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top); }; - this.$updateScrollBarH = function() { + VirtualRenderer.prototype.$updateScrollBarH = function () { this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h); this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left); }; - - this.$frozen = false; - this.freeze = function() { + VirtualRenderer.prototype.freeze = function () { this.$frozen = true; }; - - this.unfreeze = function() { + VirtualRenderer.prototype.unfreeze = function () { this.$frozen = false; }; - - this.$renderChanges = function(changes, force) { + VirtualRenderer.prototype.$renderChanges = function (changes, force) { if (this.$changes) { changes |= this.$changes; this.$changes = 0; } if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) { this.$changes |= changes; - return; - } + return; + } if (this.$size.$dirty) { this.$changes |= changes; return this.onResize(true); @@ -18422,23 +19353,19 @@ var VirtualRenderer = function(container, theme) { if (!this.lineHeight) { this.$textLayer.checkForSizeChanges(); } - this._signal("beforeRender", changes); - if (this.session && this.session.$bidiHandler) this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics); - var config = this.layerConfig; if (changes & this.CHANGE_FULL || changes & this.CHANGE_SIZE || changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES || changes & this.CHANGE_SCROLL || - changes & this.CHANGE_H_SCROLL - ) { + changes & this.CHANGE_H_SCROLL) { changes |= this.$computeLayerConfig() | this.$loop.clear(); if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) { - var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight; + var st = this.scrollTop + (config.firstRow - Math.max(this.layerConfig.firstRow, 0)) * this.lineHeight; if (st > 0) { this.scrollTop = st; changes = changes | this.CHANGE_SCROLL; @@ -18449,24 +19376,26 @@ var VirtualRenderer = function(container, theme) { this.$updateScrollBarV(); if (changes & this.CHANGE_H_SCROLL) this.$updateScrollBarH(); - dom.translate(this.content, -this.scrollLeft, -config.offset); - var width = config.width + 2 * this.$padding + "px"; var height = config.minHeight + "px"; - dom.setStyle(this.content.style, "width", width); dom.setStyle(this.content.style, "height", height); } if (changes & this.CHANGE_H_SCROLL) { dom.translate(this.content, -this.scrollLeft, -config.offset); - this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left"; + this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller " : "ace_scroller ace_scroll-left "; + if (this.enableKeyboardAccessibility) + this.scroller.className += this.keyboardFocusClassName; } if (changes & this.CHANGE_FULL) { this.$changedLines = null; this.$textLayer.update(config); if (this.$showGutter) this.$gutterLayer.update(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } this.$markerBack.update(config); this.$markerFront.update(config); this.$cursorLayer.update(config); @@ -18480,13 +19409,15 @@ var VirtualRenderer = function(container, theme) { this.$textLayer.update(config); else this.$textLayer.scrollLines(config); - if (this.$showGutter) { if (changes & this.CHANGE_GUTTER || changes & this.CHANGE_LINES) this.$gutterLayer.update(config); else this.$gutterLayer.scrollLines(config); } + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } this.$markerBack.update(config); this.$markerFront.update(config); this.$cursorLayer.update(config); @@ -18494,109 +19425,98 @@ var VirtualRenderer = function(container, theme) { this._signal("afterRender", changes); return; } - if (changes & this.CHANGE_TEXT) { this.$changedLines = null; this.$textLayer.update(config); if (this.$showGutter) this.$gutterLayer.update(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } } else if (changes & this.CHANGE_LINES) { if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter) this.$gutterLayer.update(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } } else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) { if (this.$showGutter) this.$gutterLayer.update(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } } else if (changes & this.CHANGE_CURSOR) { if (this.$highlightGutterLine) this.$gutterLayer.updateLineHighlight(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } } - if (changes & this.CHANGE_CURSOR) { this.$cursorLayer.update(config); this.$moveTextAreaToCursor(); } - if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) { this.$markerFront.update(config); } - if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) { this.$markerBack.update(config); } - this._signal("afterRender", changes); }; - - - this.$autosize = function() { + VirtualRenderer.prototype.$autosize = function () { var height = this.session.getScreenLength() * this.lineHeight; var maxHeight = this.$maxLines * this.lineHeight; - var desiredHeight = Math.min(maxHeight, - Math.max((this.$minLines || 1) * this.lineHeight, height) - ) + this.scrollMargin.v + (this.$extraHeight || 0); + var desiredHeight = Math.min(maxHeight, Math.max((this.$minLines || 1) * this.lineHeight, height)) + this.scrollMargin.v + (this.$extraHeight || 0); if (this.$horizScroll) desiredHeight += this.scrollBarH.getHeight(); if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight) desiredHeight = this.$maxPixelHeight; - var hideScrollbars = desiredHeight <= 2 * this.lineHeight; var vScroll = !hideScrollbars && height > maxHeight; - if (desiredHeight != this.desiredHeight || this.$size.height != this.desiredHeight || vScroll != this.$vScroll) { if (vScroll != this.$vScroll) { this.$vScroll = vScroll; this.scrollBarV.setVisible(vScroll); } - var w = this.container.clientWidth; this.container.style.height = desiredHeight + "px"; this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight); this.desiredHeight = desiredHeight; - this._signal("autosize"); } }; - - this.$computeLayerConfig = function() { + VirtualRenderer.prototype.$computeLayerConfig = function () { var session = this.session; var size = this.$size; - var hideScrollbars = size.height <= 2 * this.lineHeight; var screenLines = this.session.getScreenLength(); var maxHeight = screenLines * this.lineHeight; - var longestLine = this.$getLongestLine(); - var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible || size.scrollerWidth - longestLine - 2 * this.$padding < 0); - var hScrollChanged = this.$horizScroll !== horizScroll; if (hScrollChanged) { this.$horizScroll = horizScroll; this.scrollBarH.setVisible(horizScroll); } var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine - if (this.$maxLines && this.lineHeight > 1) + if (this.$maxLines && this.lineHeight > 1) { this.$autosize(); - + hideScrollbars = size.height <= 2 * this.lineHeight; + } var minHeight = size.scrollerHeight + this.lineHeight; - var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd : 0; maxHeight += scrollPastEnd; - var sm = this.scrollMargin; - this.session.setScrollTop(Math.max(-sm.top, - Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom))); - - this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, - longestLine + 2 * this.$padding - size.scrollerWidth + sm.right))); - + this.session.setScrollTop(Math.max(-sm.top, Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom))); + this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, longestLine + 2 * this.$padding - size.scrollerWidth + sm.right))); var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible || size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top); var vScrollChanged = vScrollBefore !== vScroll; @@ -18604,7 +19524,6 @@ var VirtualRenderer = function(container, theme) { this.$vScroll = vScroll; this.scrollBarV.setVisible(vScroll); } - var offset = this.scrollTop % this.lineHeight; var lineCount = Math.ceil(minHeight / this.lineHeight) - 1; var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight)); @@ -18616,18 +19535,18 @@ var VirtualRenderer = function(container, theme) { if (foldLine) { firstRow = foldLine.start.row; } - firstRowScreen = session.documentToScreenRow(firstRow, 0); firstRowHeight = session.getRowLength(firstRow) * lineHeight; - lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1); minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight + - firstRowHeight; - + firstRowHeight; offset = this.scrollTop - firstRowScreen * lineHeight; - + if (offset < 0 && firstRowScreen > 0) { + firstRowScreen = Math.max(0, firstRowScreen + Math.floor(offset / lineHeight)); + offset = this.scrollTop - firstRowScreen * lineHeight; + } var changes = 0; - if (this.layerConfig.width != longestLine || hScrollChanged) + if (this.layerConfig.width != longestLine || hScrollChanged) changes = this.CHANGE_H_SCROLL; if (hScrollChanged || vScrollChanged) { changes |= this.$updateCachedSize(true, this.gutterWidth, size.width, size.height); @@ -18635,38 +19554,37 @@ var VirtualRenderer = function(container, theme) { if (vScrollChanged) longestLine = this.$getLongestLine(); } - this.layerConfig = { - width : longestLine, - padding : this.$padding, - firstRow : firstRow, + width: longestLine, + padding: this.$padding, + firstRow: firstRow, firstRowScreen: firstRowScreen, - lastRow : lastRow, - lineHeight : lineHeight, - characterWidth : this.characterWidth, - minHeight : minHeight, - maxHeight : maxHeight, - offset : offset, - gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0, - height : this.$size.scrollerHeight + lastRow: lastRow, + lineHeight: lineHeight, + characterWidth: this.characterWidth, + minHeight: minHeight, + maxHeight: maxHeight, + offset: offset, + gutterOffset: lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0, + height: this.$size.scrollerHeight }; - if (this.session.$bidiHandler) this.session.$bidiHandler.setContentWidth(longestLine - this.$padding); - return changes; }; - - this.$updateLines = function() { - if (!this.$changedLines) return; + VirtualRenderer.prototype.$updateLines = function () { + if (!this.$changedLines) + return; var firstRow = this.$changedLines.firstRow; var lastRow = this.$changedLines.lastRow; this.$changedLines = null; - var layerConfig = this.layerConfig; - - if (firstRow > layerConfig.lastRow + 1) { return; } - if (lastRow < layerConfig.firstRow) { return; } + if (firstRow > layerConfig.lastRow + 1) { + return; + } + if (lastRow < layerConfig.firstRow) { + return; + } if (lastRow === Infinity) { if (this.$showGutter) this.$gutterLayer.update(layerConfig); @@ -18676,2633 +19594,2237 @@ var VirtualRenderer = function(container, theme) { this.$textLayer.updateLines(layerConfig, firstRow, lastRow); return true; }; - - this.$getLongestLine = function() { + VirtualRenderer.prototype.$getLongestLine = function () { var charCount = this.session.getScreenWidth(); if (this.showInvisibles && !this.session.$useWrapMode) charCount += 1; - if (this.$textLayer && charCount > this.$textLayer.MAX_LINE_LENGTH) charCount = this.$textLayer.MAX_LINE_LENGTH + 30; - return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth)); }; - this.updateFrontMarkers = function() { + VirtualRenderer.prototype.updateFrontMarkers = function () { this.$markerFront.setMarkers(this.session.getMarkers(true)); this.$loop.schedule(this.CHANGE_MARKER_FRONT); }; - this.updateBackMarkers = function() { + VirtualRenderer.prototype.updateBackMarkers = function () { this.$markerBack.setMarkers(this.session.getMarkers()); this.$loop.schedule(this.CHANGE_MARKER_BACK); }; - this.addGutterDecoration = function(row, className){ + VirtualRenderer.prototype.addGutterDecoration = function (row, className) { this.$gutterLayer.addGutterDecoration(row, className); }; - this.removeGutterDecoration = function(row, className){ + VirtualRenderer.prototype.removeGutterDecoration = function (row, className) { this.$gutterLayer.removeGutterDecoration(row, className); }; - this.updateBreakpoints = function(rows) { + VirtualRenderer.prototype.updateBreakpoints = function (rows) { + this._rows = rows; this.$loop.schedule(this.CHANGE_GUTTER); }; - this.setAnnotations = function(annotations) { + VirtualRenderer.prototype.setAnnotations = function (annotations) { this.$gutterLayer.setAnnotations(annotations); this.$loop.schedule(this.CHANGE_GUTTER); }; - this.updateCursor = function() { + VirtualRenderer.prototype.updateCursor = function () { this.$loop.schedule(this.CHANGE_CURSOR); }; - this.hideCursor = function() { + VirtualRenderer.prototype.hideCursor = function () { this.$cursorLayer.hideCursor(); }; - this.showCursor = function() { + VirtualRenderer.prototype.showCursor = function () { this.$cursorLayer.showCursor(); }; - - this.scrollSelectionIntoView = function(anchor, lead, offset) { + VirtualRenderer.prototype.scrollSelectionIntoView = function (anchor, lead, offset) { this.scrollCursorIntoView(anchor, offset); this.scrollCursorIntoView(lead, offset); }; - this.scrollCursorIntoView = function(cursor, offset, $viewMargin) { + VirtualRenderer.prototype.scrollCursorIntoView = function (cursor, offset, $viewMargin) { if (this.$size.scrollerHeight === 0) return; - var pos = this.$cursorLayer.getPixelPosition(cursor); - - var left = pos.left; - var top = pos.top; - + var newLeft = pos.left; + var newTop = pos.top; var topMargin = $viewMargin && $viewMargin.top || 0; var bottomMargin = $viewMargin && $viewMargin.bottom || 0; - - var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop; - - if (scrollTop + topMargin > top) { - if (offset && scrollTop + topMargin > top + this.lineHeight) - top -= offset * this.$size.scrollerHeight; - if (top === 0) - top = -this.scrollMargin.top; - this.session.setScrollTop(top); - } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) { - if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight) - top += offset * this.$size.scrollerHeight; - this.session.setScrollTop(top + this.lineHeight + bottomMargin - this.$size.scrollerHeight); - } - - var scrollLeft = this.scrollLeft; - - if (scrollLeft > left) { - if (left < this.$padding + 2 * this.layerConfig.characterWidth) - left = -this.scrollMargin.left; - this.session.setScrollLeft(left); - } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) { - this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth)); - } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) { - this.session.setScrollLeft(0); - } - }; - this.getScrollTop = function() { - return this.session.getScrollTop(); - }; - this.getScrollLeft = function() { - return this.session.getScrollLeft(); - }; - this.getScrollTopRow = function() { - return this.scrollTop / this.lineHeight; - }; - this.getScrollBottomRow = function() { - return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1); - }; - this.scrollToRow = function(row) { - this.session.setScrollTop(row * this.lineHeight); - }; - - this.alignCursor = function(cursor, alignment) { - if (typeof cursor == "number") - cursor = {row: cursor, column: 0}; - - var pos = this.$cursorLayer.getPixelPosition(cursor); - var h = this.$size.scrollerHeight - this.lineHeight; - var offset = pos.top - h * (alignment || 0); - - this.session.setScrollTop(offset); - return offset; - }; - - this.STEPS = 8; - this.$calcSteps = function(fromValue, toValue){ - var i = 0; - var l = this.STEPS; - var steps = []; - - var func = function(t, x_min, dx) { - return dx * (Math.pow(t - 1, 3) + 1) + x_min; - }; - - for (i = 0; i < l; ++i) - steps.push(func(i / this.STEPS, fromValue, toValue - fromValue)); - - return steps; - }; - this.scrollToLine = function(line, center, animate, callback) { - var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0}); - var offset = pos.top; - if (center) - offset -= this.$size.scrollerHeight / 2; - - var initialScroll = this.scrollTop; - this.session.setScrollTop(offset); - if (animate !== false) - this.animateScrolling(initialScroll, callback); - }; - - this.animateScrolling = function(fromValue, callback) { - var toValue = this.scrollTop; - if (!this.$animatedScroll) - return; - var _self = this; - - if (fromValue == toValue) - return; - if (this.$scrollAnimation) { - var oldSteps = this.$scrollAnimation.steps; - if (oldSteps.length) { - fromValue = oldSteps[0]; - if (fromValue == toValue) - return; - } - } - - var steps = _self.$calcSteps(fromValue, toValue); - this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps}; - - clearInterval(this.$timer); - - _self.session.setScrollTop(steps.shift()); - _self.session.$scrollTop = toValue; - this.$timer = setInterval(function() { - if (!_self.session) - return clearInterval(_self.$timer); - if (steps.length) { - _self.session.setScrollTop(steps.shift()); - _self.session.$scrollTop = toValue; - } else if (toValue != null) { - _self.session.$scrollTop = -1; - _self.session.setScrollTop(toValue); - toValue = null; - } else { - _self.$timer = clearInterval(_self.$timer); - _self.$scrollAnimation = null; - callback && callback(); - } - }, 10); - }; - this.scrollToY = function(scrollTop) { - if (this.scrollTop !== scrollTop) { - this.$loop.schedule(this.CHANGE_SCROLL); - this.scrollTop = scrollTop; - } - }; - this.scrollToX = function(scrollLeft) { - if (this.scrollLeft !== scrollLeft) - this.scrollLeft = scrollLeft; - this.$loop.schedule(this.CHANGE_H_SCROLL); - }; - this.scrollTo = function(x, y) { - this.session.setScrollTop(y); - this.session.setScrollLeft(x); - }; - this.scrollBy = function(deltaX, deltaY) { - deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY); - deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX); - }; - this.isScrollableBy = function(deltaX, deltaY) { - if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top) - return true; - if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight - - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom) - return true; - if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left) - return true; - if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth - - this.layerConfig.width < -1 + this.scrollMargin.right) - return true; - }; - - this.pixelToScreenCoordinates = function(x, y) { - var canvasPos; - if (this.$hasCssTransforms) { - canvasPos = {top:0, left: 0}; - var p = this.$fontMetrics.transformCoordinates([x, y]); - x = p[1] - this.gutterWidth - this.margin.left; - y = p[0]; - } else { - canvasPos = this.scroller.getBoundingClientRect(); - } - - var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding; - var offset = offsetX / this.characterWidth; - var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); - var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset); - - return {row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX}; - }; - - this.screenToTextCoordinates = function(x, y) { - var canvasPos; - if (this.$hasCssTransforms) { - canvasPos = {top:0, left: 0}; - var p = this.$fontMetrics.transformCoordinates([x, y]); - x = p[1] - this.gutterWidth - this.margin.left; - y = p[0]; - } else { - canvasPos = this.scroller.getBoundingClientRect(); - } - - var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding; - var offset = offsetX / this.characterWidth; - var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset); - - var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); - - return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX); - }; - this.textToScreenCoordinates = function(row, column) { - var canvasPos = this.scroller.getBoundingClientRect(); - var pos = this.session.documentToScreenPosition(row, column); - - var x = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, row) - ? this.session.$bidiHandler.getPosLeft(pos.column) - : Math.round(pos.column * this.characterWidth)); - - var y = pos.row * this.lineHeight; - - return { - pageX: canvasPos.left + x - this.scrollLeft, - pageY: canvasPos.top + y - this.scrollTop - }; - }; - this.visualizeFocus = function() { - dom.addCssClass(this.container, "ace_focus"); - }; - this.visualizeBlur = function() { - dom.removeCssClass(this.container, "ace_focus"); - }; - this.showComposition = function(composition) { - this.$composition = composition; - if (!composition.cssText) { - composition.cssText = this.textarea.style.cssText; - } - if (composition.useTextareaForIME == undefined) - composition.useTextareaForIME = this.$useTextareaForIME; - - if (this.$useTextareaForIME) { - dom.addCssClass(this.textarea, "ace_composition"); - this.textarea.style.cssText = ""; - this.$moveTextAreaToCursor(); - this.$cursorLayer.element.style.display = "none"; + this.$stopAnimation = true; + } + var currentTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop; + if (currentTop + topMargin > newTop) { + if (offset && currentTop + topMargin > newTop + this.lineHeight) + newTop -= offset * this.$size.scrollerHeight; + if (newTop === 0) + newTop = -this.scrollMargin.top; + this.session.setScrollTop(newTop); + } + else if (currentTop + this.$size.scrollerHeight - bottomMargin < newTop + this.lineHeight) { + if (offset && currentTop + this.$size.scrollerHeight - bottomMargin < newTop - this.lineHeight) + newTop += offset * this.$size.scrollerHeight; + this.session.setScrollTop(newTop + this.lineHeight + bottomMargin - this.$size.scrollerHeight); + } + var currentLeft = this.scrollLeft; + var twoCharsWidth = 2 * this.layerConfig.characterWidth; + if (newLeft - twoCharsWidth < currentLeft) { + newLeft -= twoCharsWidth; + if (newLeft < this.$padding + twoCharsWidth) { + newLeft = -this.scrollMargin.left; + } + this.session.setScrollLeft(newLeft); } else { - composition.markerId = this.session.addMarker(composition.markerRange, "ace_composition_marker", "text"); - } - }; - this.setCompositionText = function(text) { - var cursor = this.session.selection.cursor; - this.addToken(text, "composition_placeholder", cursor.row, cursor.column); - this.$moveTextAreaToCursor(); - }; - this.hideComposition = function() { - if (!this.$composition) - return; - - if (this.$composition.markerId) - this.session.removeMarker(this.$composition.markerId); - - dom.removeCssClass(this.textarea, "ace_composition"); - this.textarea.style.cssText = this.$composition.cssText; - var cursor = this.session.selection.cursor; - this.removeExtraToken(cursor.row, cursor.column); - this.$composition = null; - this.$cursorLayer.element.style.display = ""; - }; - - this.addToken = function(text, type, row, column) { - var session = this.session; - session.bgTokenizer.lines[row] = null; - var newToken = {type: type, value: text}; - var tokens = session.getTokens(row); - if (column == null) { - tokens.push(newToken); - } else { - var l = 0; - for (var i =0; i < tokens.length; i++) { - var token = tokens[i]; - l += token.value.length; - if (column <= l) { - var diff = token.value.length - (l - column); - var before = token.value.slice(0, diff); - var after = token.value.slice(diff); - - tokens.splice(i, 1, {type: token.type, value: before}, newToken, {type: token.type, value: after}); - break; - } + newLeft += twoCharsWidth; + if (currentLeft + this.$size.scrollerWidth < newLeft + this.characterWidth) { + this.session.setScrollLeft(Math.round(newLeft + this.characterWidth - this.$size.scrollerWidth)); } - } - this.updateLines(row, row); - }; - - this.removeExtraToken = function(row, column) { - this.updateLines(row, row); - }; - this.setTheme = function(theme, cb) { - var _self = this; - this.$themeId = theme; - _self._dispatchEvent('themeChange',{theme:theme}); - - if (!theme || typeof theme == "string") { - var moduleName = theme || this.$options.theme.initialValue; - config.loadModule(["theme", moduleName], afterLoad); - } else { - afterLoad(theme); - } - - function afterLoad(module) { - if (_self.$themeId != theme) - return cb && cb(); - if (!module || !module.cssClass) - throw new Error("couldn't load module " + theme + " or it didn't call define"); - if (module.$id) - _self.$themeId = module.$id; - dom.importCssString( - module.cssText, - module.cssClass, - _self.container - ); - - if (_self.theme) - dom.removeCssClass(_self.container, _self.theme.cssClass); - - var padding = "padding" in module ? module.padding - : "padding" in (_self.theme || {}) ? 4 : _self.$padding; - if (_self.$padding && padding != _self.$padding) - _self.setPadding(padding); - _self.$theme = module.cssClass; - - _self.theme = module; - dom.addCssClass(_self.container, module.cssClass); - dom.setCssClass(_self.container, "ace_dark", module.isDark); - if (_self.$size) { - _self.$size.width = 0; - _self.$updateSizeAsync(); + else if (currentLeft <= this.$padding && newLeft - currentLeft < this.characterWidth) { + this.session.setScrollLeft(0); } - - _self._dispatchEvent('themeLoaded', {theme:module}); - cb && cb(); } }; - this.getTheme = function() { - return this.$themeId; + VirtualRenderer.prototype.getScrollTop = function () { + return this.session.getScrollTop(); }; - this.setStyle = function(style, include) { - dom.setCssClass(this.container, style, include !== false); + VirtualRenderer.prototype.getScrollLeft = function () { + return this.session.getScrollLeft(); }; - this.unsetStyle = function(style) { - dom.removeCssClass(this.container, style); + VirtualRenderer.prototype.getScrollTopRow = function () { + return this.scrollTop / this.lineHeight; }; - - this.setCursorStyle = function(style) { - dom.setStyle(this.scroller.style, "cursor", style); + VirtualRenderer.prototype.getScrollBottomRow = function () { + return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1); }; - this.setMouseCursor = function(cursorStyle) { - dom.setStyle(this.scroller.style, "cursor", cursorStyle); + VirtualRenderer.prototype.scrollToRow = function (row) { + this.session.setScrollTop(row * this.lineHeight); }; - - this.attachToShadowRoot = function() { - dom.importCssString(editorCss, "ace_editor.css", this.container); + VirtualRenderer.prototype.alignCursor = function (cursor, alignment) { + if (typeof cursor == "number") + cursor = { row: cursor, column: 0 }; + var pos = this.$cursorLayer.getPixelPosition(cursor); + var h = this.$size.scrollerHeight - this.lineHeight; + var offset = pos.top - h * (alignment || 0); + this.session.setScrollTop(offset); + return offset; }; - this.destroy = function() { - this.freeze(); - this.$fontMetrics.destroy(); - this.$cursorLayer.destroy(); - this.removeAllListeners(); - this.container.textContent = ""; + VirtualRenderer.prototype.$calcSteps = function (fromValue, toValue) { + var i = 0; + var l = this.STEPS; + var steps = []; + var func = function (t, x_min, dx) { + return dx * (Math.pow(t - 1, 3) + 1) + x_min; + }; + for (i = 0; i < l; ++i) + steps.push(func(i / this.STEPS, fromValue, toValue - fromValue)); + return steps; }; - -}).call(VirtualRenderer.prototype); - - -config.defineOptions(VirtualRenderer.prototype, "renderer", { - animatedScroll: {initialValue: false}, - showInvisibles: { - set: function(value) { - if (this.$textLayer.setShowInvisibles(value)) - this.$loop.schedule(this.CHANGE_TEXT); - }, - initialValue: false - }, - showPrintMargin: { - set: function() { this.$updatePrintMargin(); }, - initialValue: true - }, - printMarginColumn: { - set: function() { this.$updatePrintMargin(); }, - initialValue: 80 - }, - printMargin: { - set: function(val) { - if (typeof val == "number") - this.$printMarginColumn = val; - this.$showPrintMargin = !!val; - this.$updatePrintMargin(); - }, - get: function() { - return this.$showPrintMargin && this.$printMarginColumn; - } - }, - showGutter: { - set: function(show){ - this.$gutter.style.display = show ? "block" : "none"; - this.$loop.schedule(this.CHANGE_FULL); - this.onGutterResize(); - }, - initialValue: true - }, - fadeFoldWidgets: { - set: function(show) { - dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show); - }, - initialValue: false - }, - showFoldWidgets: { - set: function(show) { - this.$gutterLayer.setShowFoldWidgets(show); - this.$loop.schedule(this.CHANGE_GUTTER); - }, - initialValue: true - }, - displayIndentGuides: { - set: function(show) { - if (this.$textLayer.setDisplayIndentGuides(show)) - this.$loop.schedule(this.CHANGE_TEXT); - }, - initialValue: true - }, - highlightGutterLine: { - set: function(shouldHighlight) { - this.$gutterLayer.setHighlightGutterLine(shouldHighlight); - this.$loop.schedule(this.CHANGE_GUTTER); - }, - initialValue: true - }, - hScrollBarAlwaysVisible: { - set: function(val) { - if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll) - this.$loop.schedule(this.CHANGE_SCROLL); - }, - initialValue: false - }, - vScrollBarAlwaysVisible: { - set: function(val) { - if (!this.$vScrollBarAlwaysVisible || !this.$vScroll) - this.$loop.schedule(this.CHANGE_SCROLL); - }, - initialValue: false - }, - fontSize: { - set: function(size) { - if (typeof size == "number") - size = size + "px"; - this.container.style.fontSize = size; - this.updateFontSize(); - }, - initialValue: 12 - }, - fontFamily: { - set: function(name) { - this.container.style.fontFamily = name; - this.updateFontSize(); - } - }, - maxLines: { - set: function(val) { - this.updateFull(); - } - }, - minLines: { - set: function(val) { - if (!(this.$minLines < 0x1ffffffffffff)) - this.$minLines = 0; - this.updateFull(); - } - }, - maxPixelHeight: { - set: function(val) { - this.updateFull(); - }, - initialValue: 0 - }, - scrollPastEnd: { - set: function(val) { - val = +val || 0; - if (this.$scrollPastEnd == val) - return; - this.$scrollPastEnd = val; - this.$loop.schedule(this.CHANGE_SCROLL); - }, - initialValue: 0, - handlesSet: true - }, - fixedWidthGutter: { - set: function(val) { - this.$gutterLayer.$fixedWidth = !!val; - this.$loop.schedule(this.CHANGE_GUTTER); - } - }, - theme: { - set: function(val) { this.setTheme(val); }, - get: function() { return this.$themeId || this.theme; }, - initialValue: "./theme/textmate", - handlesSet: true - }, - hasCssTransforms: { - }, - useTextareaForIME: { - initialValue: !useragent.isMobile && !useragent.isIE - } -}); - -exports.VirtualRenderer = VirtualRenderer; -}); - -define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"], function(require, exports, module) { -"use strict"; - -var oop = require("../lib/oop"); -var net = require("../lib/net"); -var EventEmitter = require("../lib/event_emitter").EventEmitter; -var config = require("../config"); - -function $workerBlob(workerUrl) { - var script = "importScripts('" + net.qualifyURL(workerUrl) + "');"; - try { - return new Blob([script], {"type": "application/javascript"}); - } catch (e) { // Backwards-compatibility - var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; - var blobBuilder = new BlobBuilder(); - blobBuilder.append(script); - return blobBuilder.getBlob("application/javascript"); - } -} - -function createWorker(workerUrl) { - if (typeof Worker == "undefined") - return { postMessage: function() {}, terminate: function() {} }; - if (config.get("loadWorkerFromBlob")) { - var blob = $workerBlob(workerUrl); - var URL = window.URL || window.webkitURL; - var blobURL = URL.createObjectURL(blob); - return new Worker(blobURL); - } - return new Worker(workerUrl); -} - -var WorkerClient = function(worker) { - if (!worker.postMessage) - worker = this.$createWorkerFromOldConfig.apply(this, arguments); - - this.$worker = worker; - this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); - this.changeListener = this.changeListener.bind(this); - this.onMessage = this.onMessage.bind(this); - - this.callbackId = 1; - this.callbacks = {}; - - this.$worker.onmessage = this.onMessage; -}; - -(function(){ - - oop.implement(this, EventEmitter); - - this.$createWorkerFromOldConfig = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) { - if (require.nameToUrl && !require.toUrl) - require.toUrl = require.nameToUrl; - - if (config.get("packaged") || !require.toUrl) { - workerUrl = workerUrl || config.moduleUrl(mod, "worker"); - } else { - var normalizePath = this.$normalizePath; - workerUrl = workerUrl || normalizePath(require.toUrl("ace/worker/worker.js", null, "_")); - - var tlns = {}; - topLevelNamespaces.forEach(function(ns) { - tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, "")); - }); + VirtualRenderer.prototype.scrollToLine = function (line, center, animate, callback) { + var pos = this.$cursorLayer.getPixelPosition({ row: line, column: 0 }); + var offset = pos.top; + if (center) + offset -= this.$size.scrollerHeight / 2; + var initialScroll = this.scrollTop; + this.session.setScrollTop(offset); + if (animate !== false) + this.animateScrolling(initialScroll, callback); + }; + VirtualRenderer.prototype.animateScrolling = function (fromValue, callback) { + var toValue = this.scrollTop; + if (!this.$animatedScroll) + return; + var _self = this; + if (fromValue == toValue) + return; + if (this.$scrollAnimation) { + var oldSteps = this.$scrollAnimation.steps; + if (oldSteps.length) { + fromValue = oldSteps[0]; + if (fromValue == toValue) + return; + } } - - this.$worker = createWorker(workerUrl); - if (importScripts) { - this.send("importScripts", importScripts); + var steps = _self.$calcSteps(fromValue, toValue); + this.$scrollAnimation = { from: fromValue, to: toValue, steps: steps }; + clearInterval(this.$timer); + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + function endAnimation() { + _self.$timer = clearInterval(_self.$timer); + _self.$scrollAnimation = null; + _self.$stopAnimation = false; + callback && callback(); } - this.$worker.postMessage({ - init : true, - tlns : tlns, - module : mod, - classname : classname - }); - return this.$worker; + this.$timer = setInterval(function () { + if (_self.$stopAnimation) { + endAnimation(); + return; + } + if (!_self.session) + return clearInterval(_self.$timer); + if (steps.length) { + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + } + else if (toValue != null) { + _self.session.$scrollTop = -1; + _self.session.setScrollTop(toValue); + toValue = null; + } + else { + endAnimation(); + } + }, 10); }; - - this.onMessage = function(e) { - var msg = e.data; - switch (msg.type) { - case "event": - this._signal(msg.name, {data: msg.data}); - break; - case "call": - var callback = this.callbacks[msg.id]; - if (callback) { - callback(msg.data); - delete this.callbacks[msg.id]; - } - break; - case "error": - this.reportError(msg.data); - break; - case "log": - window.console && console.log && console.log.apply(console, msg.data); - break; + VirtualRenderer.prototype.scrollToY = function (scrollTop) { + if (this.scrollTop !== scrollTop) { + this.$loop.schedule(this.CHANGE_SCROLL); + this.scrollTop = scrollTop; } }; - - this.reportError = function(err) { - window.console && console.error && console.error(err); + VirtualRenderer.prototype.scrollToX = function (scrollLeft) { + if (this.scrollLeft !== scrollLeft) + this.scrollLeft = scrollLeft; + this.$loop.schedule(this.CHANGE_H_SCROLL); }; - - this.$normalizePath = function(path) { - return net.qualifyURL(path); + VirtualRenderer.prototype.scrollTo = function (x, y) { + this.session.setScrollTop(y); + this.session.setScrollLeft(x); }; - - this.terminate = function() { - this._signal("terminate", {}); - this.deltaQueue = null; - this.$worker.terminate(); - this.$worker = null; - if (this.$doc) - this.$doc.off("change", this.changeListener); - this.$doc = null; + VirtualRenderer.prototype.scrollBy = function (deltaX, deltaY) { + deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY); + deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX); }; - - this.send = function(cmd, args) { - this.$worker.postMessage({command: cmd, args: args}); + VirtualRenderer.prototype.isScrollableBy = function (deltaX, deltaY) { + if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top) + return true; + if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight + - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom) + return true; + if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left) + return true; + if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth + - this.layerConfig.width < -1 + this.scrollMargin.right) + return true; }; - - this.call = function(cmd, args, callback) { - if (callback) { - var id = this.callbackId++; - this.callbacks[id] = callback; - args.push(id); + VirtualRenderer.prototype.pixelToScreenCoordinates = function (x, y) { + var canvasPos; + if (this.$hasCssTransforms) { + canvasPos = { top: 0, left: 0 }; + var p = this.$fontMetrics.transformCoordinates([x, y]); + x = p[1] - this.gutterWidth - this.margin.left; + y = p[0]; } - this.send(cmd, args); + else { + canvasPos = this.scroller.getBoundingClientRect(); + } + var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding; + var offset = offsetX / this.characterWidth; + var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); + var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset); + return { row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX }; }; - - this.emit = function(event, data) { - try { - if (data.data && data.data.err) - data.data.err = {message: data.data.err.message, stack: data.data.err.stack, code: data.data.err.code}; - this.$worker && this.$worker.postMessage({event: event, data: {data: data.data}}); + VirtualRenderer.prototype.screenToTextCoordinates = function (x, y) { + var canvasPos; + if (this.$hasCssTransforms) { + canvasPos = { top: 0, left: 0 }; + var p = this.$fontMetrics.transformCoordinates([x, y]); + x = p[1] - this.gutterWidth - this.margin.left; + y = p[0]; } - catch(ex) { - console.error(ex.stack); + else { + canvasPos = this.scroller.getBoundingClientRect(); } + var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding; + var offset = offsetX / this.characterWidth; + var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset); + var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight; + return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX); }; - - this.attachToDocument = function(doc) { - if (this.$doc) - this.terminate(); - - this.$doc = doc; - this.call("setValue", [doc.getValue()]); - doc.on("change", this.changeListener, true); + VirtualRenderer.prototype.textToScreenCoordinates = function (row, column) { + var canvasPos = this.scroller.getBoundingClientRect(); + var pos = this.session.documentToScreenPosition(row, column); + var x = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, row) + ? this.session.$bidiHandler.getPosLeft(pos.column) + : Math.round(pos.column * this.characterWidth)); + var y = pos.row * this.lineHeight; + return { + pageX: canvasPos.left + x - this.scrollLeft, + pageY: canvasPos.top + y - this.scrollTop + }; }; - - this.changeListener = function(delta) { - if (!this.deltaQueue) { - this.deltaQueue = []; - setTimeout(this.$sendDeltaQueue, 0); - } - if (delta.action == "insert") - this.deltaQueue.push(delta.start, delta.lines); - else - this.deltaQueue.push(delta.start, delta.end); + VirtualRenderer.prototype.visualizeFocus = function () { + dom.addCssClass(this.container, "ace_focus"); }; - - this.$sendDeltaQueue = function() { - var q = this.deltaQueue; - if (!q) return; - this.deltaQueue = null; - if (q.length > 50 && q.length > this.$doc.getLength() >> 1) { - this.call("setValue", [this.$doc.getValue()]); - } else - this.emit("change", {data: q}); + VirtualRenderer.prototype.visualizeBlur = function () { + dom.removeCssClass(this.container, "ace_focus"); }; - -}).call(WorkerClient.prototype); - - -var UIWorkerClient = function(topLevelNamespaces, mod, classname) { - var main = null; - var emitSync = false; - var sender = Object.create(EventEmitter); - - var messageBuffer = []; - var workerClient = new WorkerClient({ - messageBuffer: messageBuffer, - terminate: function() {}, - postMessage: function(e) { - messageBuffer.push(e); - if (!main) return; - if (emitSync) - setTimeout(processNext); - else - processNext(); + VirtualRenderer.prototype.showComposition = function (composition) { + this.$composition = composition; + if (!composition.cssText) { + composition.cssText = this.textarea.style.cssText; + } + if (composition.useTextareaForIME == undefined) + composition.useTextareaForIME = this.$useTextareaForIME; + if (this.$useTextareaForIME) { + dom.addCssClass(this.textarea, "ace_composition"); + this.textarea.style.cssText = ""; + this.$moveTextAreaToCursor(); + this.$cursorLayer.element.style.display = "none"; + } + else { + composition.markerId = this.session.addMarker(composition.markerRange, "ace_composition_marker", "text"); } - }); - - workerClient.setEmitSync = function(val) { emitSync = val; }; - - var processNext = function() { - var msg = messageBuffer.shift(); - if (msg.command) - main[msg.command].apply(main, msg.args); - else if (msg.event) - sender._signal(msg.event, msg.data); }; - - sender.postMessage = function(msg) { - workerClient.onMessage({data: msg}); + VirtualRenderer.prototype.setCompositionText = function (text) { + var cursor = this.session.selection.cursor; + this.addToken(text, "composition_placeholder", cursor.row, cursor.column); + this.$moveTextAreaToCursor(); }; - sender.callback = function(data, callbackId) { - this.postMessage({type: "call", id: callbackId, data: data}); + VirtualRenderer.prototype.hideComposition = function () { + if (!this.$composition) + return; + if (this.$composition.markerId) + this.session.removeMarker(this.$composition.markerId); + dom.removeCssClass(this.textarea, "ace_composition"); + this.textarea.style.cssText = this.$composition.cssText; + var cursor = this.session.selection.cursor; + this.removeExtraToken(cursor.row, cursor.column); + this.$composition = null; + this.$cursorLayer.element.style.display = ""; }; - sender.emit = function(name, data) { - this.postMessage({type: "event", name: name, data: data}); + VirtualRenderer.prototype.setGhostText = function (text, position) { + var cursor = this.session.selection.cursor; + var insertPosition = position || { row: cursor.row, column: cursor.column }; + this.removeGhostText(); + var textChunks = this.$calculateWrappedTextChunks(text, insertPosition); + this.addToken(textChunks[0].text, "ghost_text", insertPosition.row, insertPosition.column); + this.$ghostText = { + text: text, + position: { + row: insertPosition.row, + column: insertPosition.column + } + }; + var widgetDiv = dom.createElement("div"); + if (textChunks.length > 1) { + var hiddenTokens = this.hideTokensAfterPosition(insertPosition.row, insertPosition.column); + var lastLineDiv; + textChunks.slice(1).forEach(function (el) { + var chunkDiv = dom.createElement("div"); + var chunkSpan = dom.createElement("span"); + chunkSpan.className = "ace_ghost_text"; + if (el.wrapped) + chunkDiv.className = "ghost_text_line_wrapped"; + if (el.text.length === 0) + el.text = " "; + chunkSpan.appendChild(dom.createTextNode(el.text)); + chunkDiv.appendChild(chunkSpan); + widgetDiv.appendChild(chunkDiv); + lastLineDiv = chunkDiv; + }); + hiddenTokens.forEach(function (token) { + var element = dom.createElement("span"); + if (!isTextToken(token.type)) + element.className = "ace_" + token.type.replace(/\./g, " ace_"); + element.appendChild(dom.createTextNode(token.value)); + lastLineDiv.appendChild(element); + }); + this.$ghostTextWidget = { + el: widgetDiv, + row: insertPosition.row, + column: insertPosition.column, + className: "ace_ghost_text_container" + }; + this.session.widgetManager.addLineWidget(this.$ghostTextWidget); + var pixelPosition = this.$cursorLayer.getPixelPosition(insertPosition, true); + var el = this.container; + var height = el.getBoundingClientRect().height; + var ghostTextHeight = textChunks.length * this.lineHeight; + var fitsY = ghostTextHeight < (height - pixelPosition.top); + if (fitsY) + return; + if (ghostTextHeight < height) { + this.scrollBy(0, (textChunks.length - 1) * this.lineHeight); + } + else { + this.scrollToRow(insertPosition.row); + } + } }; - - config.loadModule(["worker", mod], function(Main) { - main = new Main[classname](sender); - while (messageBuffer.length) - processNext(); - }); - - return workerClient; -}; - -exports.UIWorkerClient = UIWorkerClient; -exports.WorkerClient = WorkerClient; -exports.createWorker = createWorker; - - -}); - -define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"], function(require, exports, module) { -"use strict"; - -var Range = require("./range").Range; -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var oop = require("./lib/oop"); - -var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) { - var _self = this; - this.length = length; - this.session = session; - this.doc = session.getDocument(); - this.mainClass = mainClass; - this.othersClass = othersClass; - this.$onUpdate = this.onUpdate.bind(this); - this.doc.on("change", this.$onUpdate, true); - this.$others = others; - - this.$onCursorChange = function() { - setTimeout(function() { - _self.onCursorChange(); - }); + VirtualRenderer.prototype.$calculateWrappedTextChunks = function (text, position) { + var availableWidth = this.$size.scrollerWidth - this.$padding * 2; + var limit = Math.floor(availableWidth / this.characterWidth) - 2; + limit = limit <= 0 ? 60 : limit; // this is a hack to prevent the editor from crashing when the window is too small + var textLines = text.split(/\r?\n/); + var textChunks = []; + for (var i = 0; i < textLines.length; i++) { + var displayTokens = this.session.$getDisplayTokens(textLines[i], position.column); + var wrapSplits = this.session.$computeWrapSplits(displayTokens, limit, this.session.$tabSize); + if (wrapSplits.length > 0) { + var start = 0; + wrapSplits.push(textLines[i].length); + for (var j = 0; j < wrapSplits.length; j++) { + var textSlice = textLines[i].slice(start, wrapSplits[j]); + textChunks.push({ text: textSlice, wrapped: true }); + start = wrapSplits[j]; + } + } + else { + textChunks.push({ text: textLines[i], wrapped: false }); + } + } + return textChunks; }; - - this.$pos = pos; - var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1}; - this.$undoStackDepth = undoStack.length; - this.setup(); - - session.selection.on("changeCursor", this.$onCursorChange); -}; - -(function() { - - oop.implement(this, EventEmitter); - this.setup = function() { - var _self = this; - var doc = this.doc; - var session = this.session; - - this.selectionBefore = session.selection.toJSON(); - if (session.selection.inMultiSelectMode) - session.selection.toSingleRange(); - - this.pos = doc.createAnchor(this.$pos.row, this.$pos.column); - var pos = this.pos; - pos.$insertRight = true; - pos.detach(); - pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); - this.others = []; - this.$others.forEach(function(other) { - var anchor = doc.createAnchor(other.row, other.column); - anchor.$insertRight = true; - anchor.detach(); - _self.others.push(anchor); - }); - session.setUndoSelect(false); + VirtualRenderer.prototype.removeGhostText = function () { + if (!this.$ghostText) + return; + var position = this.$ghostText.position; + this.removeExtraToken(position.row, position.column); + if (this.$ghostTextWidget) { + this.session.widgetManager.removeLineWidget(this.$ghostTextWidget); + this.$ghostTextWidget = null; + } + this.$ghostText = null; }; - this.showOtherMarkers = function() { - if (this.othersActive) return; + VirtualRenderer.prototype.addToken = function (text, type, row, column) { var session = this.session; - var _self = this; - this.othersActive = true; - this.others.forEach(function(anchor) { - anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false); - }); + session.bgTokenizer.lines[row] = null; + var newToken = { type: type, value: text }; + var tokens = session.getTokens(row); + if (column == null || !tokens.length) { + tokens.push(newToken); + } + else { + var l = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + l += token.value.length; + if (column <= l) { + var diff = token.value.length - (l - column); + var before = token.value.slice(0, diff); + var after = token.value.slice(diff); + tokens.splice(i, 1, { type: token.type, value: before }, newToken, { type: token.type, value: after }); + break; + } + } + } + this.updateLines(row, row); }; - this.hideOtherMarkers = function() { - if (!this.othersActive) return; - this.othersActive = false; - for (var i = 0; i < this.others.length; i++) { - this.session.removeMarker(this.others[i].markerId); + VirtualRenderer.prototype.hideTokensAfterPosition = function (row, column) { + var tokens = this.session.getTokens(row); + var l = 0; + var hasPassedCursor = false; + var hiddenTokens = []; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + l += token.value.length; + if (token.type === "ghost_text") + continue; + if (hasPassedCursor) { + hiddenTokens.push({ type: token.type, value: token.value }); + token.type = "hidden_token"; + continue; + } + if (l === column) { + hasPassedCursor = true; + } } + this.updateLines(row, row); + return hiddenTokens; }; - this.onUpdate = function(delta) { - if (this.$updating) - return this.updateAnchors(delta); - - var range = delta; - if (range.start.row !== range.end.row) return; - if (range.start.row !== this.pos.row) return; - this.$updating = true; - var lengthDiff = delta.action === "insert" ? range.end.column - range.start.column : range.start.column - range.end.column; - var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1; - var distanceFromStart = range.start.column - this.pos.column; - - this.updateAnchors(delta); - - if (inMainRange) - this.length += lengthDiff; - - if (inMainRange && !this.session.$fromUndo) { - if (delta.action === 'insert') { - for (var i = this.others.length - 1; i >= 0; i--) { - var otherPos = this.others[i]; - var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; - this.doc.insertMergedLines(newPos, delta.lines); + VirtualRenderer.prototype.removeExtraToken = function (row, column) { + this.session.bgTokenizer.lines[row] = null; + this.updateLines(row, row); + }; + VirtualRenderer.prototype.setTheme = function (theme, cb) { + var _self = this; + this.$themeId = theme; + _self._dispatchEvent('themeChange', { theme: theme }); + if (!theme || typeof theme == "string") { + var moduleName = theme || this.$options.theme.initialValue; + config.loadModule(["theme", moduleName], afterLoad); + } + else { + afterLoad(theme); + } + function afterLoad(module) { + if (_self.$themeId != theme) + return cb && cb(); + if (!module || !module.cssClass) + throw new Error("couldn't load module " + theme + " or it didn't call define"); + if (module.$id) + _self.$themeId = module.$id; + dom.importCssString(module.cssText, module.cssClass, _self.container); + if (_self.theme) + dom.removeCssClass(_self.container, _self.theme.cssClass); + var padding = "padding" in module ? module.padding + : "padding" in (_self.theme || {}) ? 4 : _self.$padding; + if (_self.$padding && padding != _self.$padding) + _self.setPadding(padding); + if (_self.$gutterLayer) { + var showGutterCursor = module["$showGutterCursorMarker"]; + if (showGutterCursor && !_self.$gutterLayer.$showCursorMarker) { + _self.$gutterLayer.$showCursorMarker = "theme"; } - } else if (delta.action === 'remove') { - for (var i = this.others.length - 1; i >= 0; i--) { - var otherPos = this.others[i]; - var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; - this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff)); + else if (!showGutterCursor && _self.$gutterLayer.$showCursorMarker == "theme") { + _self.$gutterLayer.$showCursorMarker = null; } } + _self.$theme = module.cssClass; + _self.theme = module; + dom.addCssClass(_self.container, module.cssClass); + dom.setCssClass(_self.container, "ace_dark", module.isDark); + if (_self.$size) { + _self.$size.width = 0; + _self.$updateSizeAsync(); + } + _self._dispatchEvent('themeLoaded', { theme: module }); + cb && cb(); + if (useragent.isSafari && _self.scroller) { + _self.scroller.style.background = "red"; + _self.scroller.style.background = ""; + } } - - this.$updating = false; - this.updateMarkers(); }; - - this.updateAnchors = function(delta) { - this.pos.onChange(delta); - for (var i = this.others.length; i--;) - this.others[i].onChange(delta); - this.updateMarkers(); + VirtualRenderer.prototype.getTheme = function () { + return this.$themeId; }; - - this.updateMarkers = function() { - if (this.$updating) - return; - var _self = this; - var session = this.session; - var updateMarker = function(pos, className) { - session.removeMarker(pos.markerId); - pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false); - }; - updateMarker(this.pos, this.mainClass); - for (var i = this.others.length; i--;) - updateMarker(this.others[i], this.othersClass); + VirtualRenderer.prototype.setStyle = function (style, include) { + dom.setCssClass(this.container, style, include !== false); }; - - this.onCursorChange = function(event) { - if (this.$updating || !this.session) return; - var pos = this.session.selection.getCursor(); - if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { - this.showOtherMarkers(); - this._emit("cursorEnter", event); - } else { - this.hideOtherMarkers(); - this._emit("cursorLeave", event); - } - }; - this.detach = function() { - this.session.removeMarker(this.pos && this.pos.markerId); - this.hideOtherMarkers(); - this.doc.off("change", this.$onUpdate); - this.session.selection.off("changeCursor", this.$onCursorChange); - this.session.setUndoSelect(true); - this.session = null; + VirtualRenderer.prototype.unsetStyle = function (style) { + dom.removeCssClass(this.container, style); }; - this.cancel = function() { - if (this.$undoStackDepth === -1) - return; - var undoManager = this.session.getUndoManager(); - var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth; - for (var i = 0; i < undosRequired; i++) { - undoManager.undo(this.session, true); - } - if (this.selectionBefore) - this.session.selection.fromJSON(this.selectionBefore); + VirtualRenderer.prototype.setCursorStyle = function (style) { + dom.setStyle(this.scroller.style, "cursor", style); }; -}).call(PlaceHolder.prototype); - - -exports.PlaceHolder = PlaceHolder; -}); - -define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { - -var event = require("../lib/event"); -var useragent = require("../lib/useragent"); -function isSamePoint(p1, p2) { - return p1.row == p2.row && p1.column == p2.column; -} - -function onMouseDown(e) { - var ev = e.domEvent; - var alt = ev.altKey; - var shift = ev.shiftKey; - var ctrl = ev.ctrlKey; - var accel = e.getAccelKey(); - var button = e.getButton(); - - if (ctrl && useragent.isMac) - button = ev.button; - - if (e.editor.inMultiSelectMode && button == 2) { - e.editor.textInput.onContextMenu(e.domEvent); - return; - } - - if (!ctrl && !alt && !accel) { - if (button === 0 && e.editor.inMultiSelectMode) - e.editor.exitMultiSelectMode(); - return; - } - - if (button !== 0) - return; - - var editor = e.editor; - var selection = editor.selection; - var isMultiSelect = editor.inMultiSelectMode; - var pos = e.getDocumentPosition(); - var cursor = selection.getCursor(); - var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor)); - - var mouseX = e.x, mouseY = e.y; - var onMouseSelection = function(e) { - mouseX = e.clientX; - mouseY = e.clientY; + VirtualRenderer.prototype.setMouseCursor = function (cursorStyle) { + dom.setStyle(this.scroller.style, "cursor", cursorStyle); }; - - var session = editor.session; - var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); - var screenCursor = screenAnchor; - - var selectionMode; - if (editor.$mouseHandler.$enableJumpToDef) { - if (ctrl && alt || accel && alt) - selectionMode = shift ? "block" : "add"; - else if (alt && editor.$blockSelectEnabled) - selectionMode = "block"; - } else { - if (accel && !alt) { - selectionMode = "add"; - if (!isMultiSelect && shift) - return; - } else if (alt && editor.$blockSelectEnabled) { - selectionMode = "block"; - } - } - - if (selectionMode && useragent.isMac && ev.ctrlKey) { - editor.$mouseHandler.cancelContextMenu(); - } - - if (selectionMode == "add") { - if (!isMultiSelect && inSelection) - return; // dragging - - if (!isMultiSelect) { - var range = selection.toOrientedRange(); - editor.addSelectionMarker(range); + VirtualRenderer.prototype.attachToShadowRoot = function () { + dom.importCssString(editorCss, "ace_editor.css", this.container); + }; + VirtualRenderer.prototype.destroy = function () { + this.freeze(); + this.$fontMetrics.destroy(); + this.$cursorLayer.destroy(); + this.removeAllListeners(); + this.container.textContent = ""; + this.setOption("useResizeObserver", false); + }; + VirtualRenderer.prototype.$updateCustomScrollbar = function (val) { + var _self = this; + this.$horizScroll = this.$vScroll = null; + this.scrollBarV.element.remove(); + this.scrollBarH.element.remove(); + if (val === true) { + this.scrollBarV = new VScrollBarCustom(this.container, this); + this.scrollBarH = new HScrollBarCustom(this.container, this); + this.scrollBarV.setHeight(this.$size.scrollerHeight); + this.scrollBarH.setWidth(this.$size.scrollerWidth); + this.scrollBarV.addEventListener("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.addEventListener("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); + if (!this.$scrollDecorator) { + this.$scrollDecorator = new Decorator(this.scrollBarV, this); + this.$scrollDecorator.$updateDecorators(); + } + else { + this.$scrollDecorator.setScrollBarV(this.scrollBarV); + this.$scrollDecorator.$updateDecorators(); + } } - - var oldRange = selection.rangeList.rangeAtPoint(pos); - - editor.inVirtualSelectionMode = true; - - if (shift) { - oldRange = null; - range = selection.ranges[0] || range; - editor.removeSelectionMarker(range); + else { + this.scrollBarV = new VScrollBar(this.container, this); + this.scrollBarH = new HScrollBar(this.container, this); + this.scrollBarV.addEventListener("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.addEventListener("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); } - editor.once("mouseup", function() { - var tmpSel = selection.toOrientedRange(); - - if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) - selection.substractPoint(tmpSel.cursor); + }; + VirtualRenderer.prototype.$addResizeObserver = function () { + if (!window.ResizeObserver || this.$resizeObserver) + return; + var self = this; + this.$resizeTimer = lang.delayedCall(function () { + if (!self.destroyed) + self.onResize(); + }, 50); + this.$resizeObserver = new window.ResizeObserver(function (e) { + var w = e[0].contentRect.width; + var h = e[0].contentRect.height; + if (Math.abs(self.$size.width - w) > 1 + || Math.abs(self.$size.height - h) > 1) { + self.$resizeTimer.delay(); + } else { - if (shift) { - selection.substractPoint(range.cursor); - } else if (range) { - editor.removeSelectionMarker(range); - selection.addRange(range); - } - selection.addRange(tmpSel); + self.$resizeTimer.cancel(); } - editor.inVirtualSelectionMode = false; }); - - } else if (selectionMode == "block") { - e.stop(); - editor.inVirtualSelectionMode = true; - var initialRange; - var rectSel = []; - var blockSelect = function() { - var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); - var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX); - - if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead)) - return; - screenCursor = newCursor; - - editor.selection.moveToPosition(cursor); - editor.renderer.scrollCursorIntoView(); - - editor.removeSelectionMarkers(rectSel); - rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor); - if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty()) - rectSel[0] = editor.$mouseHandler.$clickSelection.clone(); - rectSel.forEach(editor.addSelectionMarker, editor); - editor.updateSelectionMarkers(); - }; - if (isMultiSelect && !accel) { - selection.toSingleRange(); - } else if (!isMultiSelect && accel) { - initialRange = selection.toOrientedRange(); - editor.addSelectionMarker(initialRange); + this.$resizeObserver.observe(this.container); + }; + return VirtualRenderer; +}()); +VirtualRenderer.prototype.CHANGE_CURSOR = 1; +VirtualRenderer.prototype.CHANGE_MARKER = 2; +VirtualRenderer.prototype.CHANGE_GUTTER = 4; +VirtualRenderer.prototype.CHANGE_SCROLL = 8; +VirtualRenderer.prototype.CHANGE_LINES = 16; +VirtualRenderer.prototype.CHANGE_TEXT = 32; +VirtualRenderer.prototype.CHANGE_SIZE = 64; +VirtualRenderer.prototype.CHANGE_MARKER_BACK = 128; +VirtualRenderer.prototype.CHANGE_MARKER_FRONT = 256; +VirtualRenderer.prototype.CHANGE_FULL = 512; +VirtualRenderer.prototype.CHANGE_H_SCROLL = 1024; +VirtualRenderer.prototype.$changes = 0; +VirtualRenderer.prototype.$padding = null; +VirtualRenderer.prototype.$frozen = false; +VirtualRenderer.prototype.STEPS = 8; +oop.implement(VirtualRenderer.prototype, EventEmitter); +config.defineOptions(VirtualRenderer.prototype, "renderer", { + useResizeObserver: { + set: function (value) { + if (!value && this.$resizeObserver) { + this.$resizeObserver.disconnect(); + this.$resizeTimer.cancel(); + this.$resizeTimer = this.$resizeObserver = null; + } + else if (value && !this.$resizeObserver) { + this.$addResizeObserver(); + } } - - if (shift) - screenAnchor = session.documentToScreenPosition(selection.lead); - else - selection.moveToPosition(pos); - - screenCursor = {row: -1, column: -1}; - - var onMouseSelectionEnd = function(e) { - blockSelect(); - clearInterval(timerId); - editor.removeSelectionMarkers(rectSel); - if (!rectSel.length) - rectSel = [selection.toOrientedRange()]; - if (initialRange) { - editor.removeSelectionMarker(initialRange); - selection.toSingleRange(initialRange); + }, + animatedScroll: { initialValue: false }, + showInvisibles: { + set: function (value) { + if (this.$textLayer.setShowInvisibles(value)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: false + }, + showPrintMargin: { + set: function () { this.$updatePrintMargin(); }, + initialValue: true + }, + printMarginColumn: { + set: function () { this.$updatePrintMargin(); }, + initialValue: 80 + }, + printMargin: { + set: function (val) { + if (typeof val == "number") + this.$printMarginColumn = val; + this.$showPrintMargin = !!val; + this.$updatePrintMargin(); + }, + get: function () { + return this.$showPrintMargin && this.$printMarginColumn; + } + }, + showGutter: { + set: function (show) { + this.$gutter.style.display = show ? "block" : "none"; + this.$loop.schedule(this.CHANGE_FULL); + this.onGutterResize(); + }, + initialValue: true + }, + useSvgGutterIcons: { + set: function (value) { + this.$gutterLayer.$useSvgGutterIcons = value; + }, + initialValue: false + }, + showFoldedAnnotations: { + set: function (value) { + this.$gutterLayer.$showFoldedAnnotations = value; + }, + initialValue: false + }, + fadeFoldWidgets: { + set: function (show) { + dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show); + }, + initialValue: false + }, + showFoldWidgets: { + set: function (show) { + this.$gutterLayer.setShowFoldWidgets(show); + this.$loop.schedule(this.CHANGE_GUTTER); + }, + initialValue: true + }, + displayIndentGuides: { + set: function (show) { + if (this.$textLayer.setDisplayIndentGuides(show)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: true + }, + highlightIndentGuides: { + set: function (show) { + if (this.$textLayer.setHighlightIndentGuides(show) == true) { + this.$textLayer.$highlightIndentGuide(); } - for (var i = 0; i < rectSel.length; i++) - selection.addRange(rectSel[i]); - editor.inVirtualSelectionMode = false; - editor.$mouseHandler.$clickSelection = null; - }; - - var onSelectionInterval = blockSelect; - - event.capture(editor.container, onMouseSelection, onMouseSelectionEnd); - var timerId = setInterval(function() {onSelectionInterval();}, 20); - - return e.preventDefault(); + else { + this.$textLayer.$clearActiveIndentGuide(this.$textLayer.$lines.cells); + } + }, + initialValue: true + }, + highlightGutterLine: { + set: function (shouldHighlight) { + this.$gutterLayer.setHighlightGutterLine(shouldHighlight); + this.$loop.schedule(this.CHANGE_GUTTER); + }, + initialValue: true + }, + hScrollBarAlwaysVisible: { + set: function (val) { + if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + vScrollBarAlwaysVisible: { + set: function (val) { + if (!this.$vScrollBarAlwaysVisible || !this.$vScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + fontSize: { + set: function (size) { + if (typeof size == "number") + size = size + "px"; + this.container.style.fontSize = size; + this.updateFontSize(); + }, + initialValue: 12 + }, + fontFamily: { + set: function (name) { + this.container.style.fontFamily = name; + this.updateFontSize(); + } + }, + maxLines: { + set: function (val) { + this.updateFull(); + } + }, + minLines: { + set: function (val) { + if (!(this.$minLines < 0x1ffffffffffff)) + this.$minLines = 0; + this.updateFull(); + } + }, + maxPixelHeight: { + set: function (val) { + this.updateFull(); + }, + initialValue: 0 + }, + scrollPastEnd: { + set: function (val) { + val = +val || 0; + if (this.$scrollPastEnd == val) + return; + this.$scrollPastEnd = val; + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: 0, + handlesSet: true + }, + fixedWidthGutter: { + set: function (val) { + this.$gutterLayer.$fixedWidth = !!val; + this.$loop.schedule(this.CHANGE_GUTTER); + } + }, + customScrollbar: { + set: function (val) { + this.$updateCustomScrollbar(val); + }, + initialValue: false + }, + theme: { + set: function (val) { this.setTheme(val); }, + get: function () { return this.$themeId || this.theme; }, + initialValue: "./theme/textmate", + handlesSet: true + }, + hasCssTransforms: {}, + useTextareaForIME: { + initialValue: !useragent.isMobile && !useragent.isIE } -} - - -exports.onMouseDown = onMouseDown; - }); - -define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module) { -exports.defaultCommands = [{ - name: "addCursorAbove", - description: "Add cursor above", - exec: function(editor) { editor.selectMoreLines(-1); }, - bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "addCursorBelow", - description: "Add cursor below", - exec: function(editor) { editor.selectMoreLines(1); }, - bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "addCursorAboveSkipCurrent", - description: "Add cursor above (skip current)", - exec: function(editor) { editor.selectMoreLines(-1, true); }, - bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "addCursorBelowSkipCurrent", - description: "Add cursor below (skip current)", - exec: function(editor) { editor.selectMoreLines(1, true); }, - bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectMoreBefore", - description: "Select more before", - exec: function(editor) { editor.selectMore(-1); }, - bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectMoreAfter", - description: "Select more after", - exec: function(editor) { editor.selectMore(1); }, - bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectNextBefore", - description: "Select next before", - exec: function(editor) { editor.selectMore(-1, true); }, - bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectNextAfter", - description: "Select next after", - exec: function(editor) { editor.selectMore(1, true); }, - bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "toggleSplitSelectionIntoLines", - description: "Split into lines", - exec: function(editor) { - if (editor.multiSelect.rangeCount > 1) - editor.multiSelect.joinSelections(); - else - editor.multiSelect.splitIntoLines(); - }, - bindKey: {win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L"}, - readOnly: true -}, { - name: "splitSelectionIntoLines", - description: "Split into lines", - exec: function(editor) { editor.multiSelect.splitIntoLines(); }, - readOnly: true -}, { - name: "alignCursors", - description: "Align cursors", - exec: function(editor) { editor.alignCursors(); }, - bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"}, - scrollIntoView: "cursor" -}, { - name: "findAll", - description: "Find all", - exec: function(editor) { editor.findAll(); }, - bindKey: {win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G"}, - scrollIntoView: "cursor", - readOnly: true -}]; -exports.multiSelectCommands = [{ - name: "singleSelection", - description: "Single selection", - bindKey: "esc", - exec: function(editor) { editor.exitMultiSelectMode(); }, - scrollIntoView: "cursor", - readOnly: true, - isAvailable: function(editor) {return editor && editor.inMultiSelectMode;} -}]; - -var HashHandler = require("../keyboard/hash_handler").HashHandler; -exports.keyboardHandler = new HashHandler(exports.multiSelectCommands); +exports.VirtualRenderer = VirtualRenderer; }); -define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"], function(require, exports, module) { - -var RangeList = require("./range_list").RangeList; -var Range = require("./range").Range; -var Selection = require("./selection").Selection; -var onMouseDown = require("./mouse/multi_select_handler").onMouseDown; -var event = require("./lib/event"); -var lang = require("./lib/lang"); -var commands = require("./commands/multi_select_commands"); -exports.commands = commands.defaultCommands.concat(commands.multiSelectCommands); -var Search = require("./search").Search; -var search = new Search(); - -function find(session, needle, dir) { - search.$options.wrap = true; - search.$options.needle = needle; - search.$options.backwards = dir == -1; - return search.find(session); -} -var EditSession = require("./edit_session").EditSession; -(function() { - this.getSelectionMarkers = function() { - return this.$selectionMarkers; - }; -}).call(EditSession.prototype); -(function() { - this.ranges = null; - this.rangeList = null; - this.addRange = function(range, $blockChangeEvents) { - if (!range) - return; - - if (!this.inMultiSelectMode && this.rangeCount === 0) { - var oldRange = this.toOrientedRange(); - this.rangeList.add(oldRange); - this.rangeList.add(range); - if (this.rangeList.ranges.length != 2) { - this.rangeList.removeAll(); - return $blockChangeEvents || this.fromOrientedRange(range); - } - this.rangeList.removeAll(); - this.rangeList.add(oldRange); - this.$onAddRange(oldRange); - } +define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"], function(require, exports, module) { +"use strict"; - if (!range.cursor) - range.cursor = range.end; +var oop = require("../lib/oop"); +var net = require("../lib/net"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var config = require("../config"); - var removed = this.rangeList.add(range); +function $workerBlob(workerUrl) { + var script = "importScripts('" + net.qualifyURL(workerUrl) + "');"; + try { + return new Blob([script], {"type": "application/javascript"}); + } catch (e) { // Backwards-compatibility + var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; + var blobBuilder = new BlobBuilder(); + blobBuilder.append(script); + return blobBuilder.getBlob("application/javascript"); + } +} - this.$onAddRange(range); +function createWorker(workerUrl) { + if (typeof Worker == "undefined") + return { postMessage: function() {}, terminate: function() {} }; + if (config.get("loadWorkerFromBlob")) { + var blob = $workerBlob(workerUrl); + var URL = window.URL || window.webkitURL; + var blobURL = URL.createObjectURL(blob); + return new Worker(blobURL); + } + return new Worker(workerUrl); +} - if (removed.length) - this.$onRemoveRange(removed); +var WorkerClient = function(worker) { + if (!worker.postMessage) + worker = this.$createWorkerFromOldConfig.apply(this, arguments); - if (this.rangeCount > 1 && !this.inMultiSelectMode) { - this._signal("multiSelect"); - this.inMultiSelectMode = true; - this.session.$undoSelect = false; - this.rangeList.attach(this.session); - } + this.$worker = worker; + this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); + this.changeListener = this.changeListener.bind(this); + this.onMessage = this.onMessage.bind(this); - return $blockChangeEvents || this.fromOrientedRange(range); - }; - this.toSingleRange = function(range) { - range = range || this.ranges[0]; - var removed = this.rangeList.removeAll(); - if (removed.length) - this.$onRemoveRange(removed); + this.callbackId = 1; + this.callbacks = {}; - range && this.fromOrientedRange(range); - }; - this.substractPoint = function(pos) { - var removed = this.rangeList.substractPoint(pos); - if (removed) { - this.$onRemoveRange(removed); - return removed[0]; - } - }; - this.mergeOverlappingRanges = function() { - var removed = this.rangeList.merge(); - if (removed.length) - this.$onRemoveRange(removed); - }; + this.$worker.onmessage = this.onMessage; +}; - this.$onAddRange = function(range) { - this.rangeCount = this.rangeList.ranges.length; - this.ranges.unshift(range); - this._signal("addRange", {range: range}); - }; +(function(){ - this.$onRemoveRange = function(removed) { - this.rangeCount = this.rangeList.ranges.length; - if (this.rangeCount == 1 && this.inMultiSelectMode) { - var lastRange = this.rangeList.ranges.pop(); - removed.push(lastRange); - this.rangeCount = 0; - } + oop.implement(this, EventEmitter); - for (var i = removed.length; i--; ) { - var index = this.ranges.indexOf(removed[i]); - this.ranges.splice(index, 1); - } + this.$createWorkerFromOldConfig = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) { + if (require.nameToUrl && !require.toUrl) + require.toUrl = require.nameToUrl; - this._signal("removeRange", {ranges: removed}); + if (config.get("packaged") || !require.toUrl) { + workerUrl = workerUrl || config.moduleUrl(mod, "worker"); + } else { + var normalizePath = this.$normalizePath; + workerUrl = workerUrl || normalizePath(require.toUrl("ace/worker/worker.js", null, "_")); - if (this.rangeCount === 0 && this.inMultiSelectMode) { - this.inMultiSelectMode = false; - this._signal("singleSelect"); - this.session.$undoSelect = true; - this.rangeList.detach(this.session); + var tlns = {}; + topLevelNamespaces.forEach(function(ns) { + tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, "")); + }); } - lastRange = lastRange || this.ranges[0]; - if (lastRange && !lastRange.isEqual(this.getRange())) - this.fromOrientedRange(lastRange); + this.$worker = createWorker(workerUrl); + if (importScripts) { + this.send("importScripts", importScripts); + } + this.$worker.postMessage({ + init : true, + tlns : tlns, + module : mod, + classname : classname + }); + return this.$worker; }; - this.$initRangeList = function() { - if (this.rangeList) - return; - this.rangeList = new RangeList(); - this.ranges = []; - this.rangeCount = 0; - }; - this.getAllRanges = function() { - return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()]; - }; - this.splitIntoLines = function () { - var ranges = this.ranges.length ? this.ranges : [this.getRange()]; - var newRanges = []; - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i]; - var row = range.start.row; - var endRow = range.end.row; - if (row === endRow) { - newRanges.push(range.clone()); - } else { - newRanges.push(new Range(row, range.start.column, row, this.session.getLine(row).length)); - while (++row < endRow) - newRanges.push(this.getLineRange(row, true)); - newRanges.push(new Range(endRow, 0, endRow, range.end.column)); - } - if (i == 0 && !this.isBackwards()) - newRanges = newRanges.reverse(); + this.onMessage = function(e) { + var msg = e.data; + switch (msg.type) { + case "event": + this._signal(msg.name, {data: msg.data}); + break; + case "call": + var callback = this.callbacks[msg.id]; + if (callback) { + callback(msg.data); + delete this.callbacks[msg.id]; + } + break; + case "error": + this.reportError(msg.data); + break; + case "log": + window.console && console.log && console.log.apply(console, msg.data); + break; } - this.toSingleRange(); - for (var i = newRanges.length; i--;) - this.addRange(newRanges[i]); }; - this.joinSelections = function () { - var ranges = this.rangeList.ranges; - var lastRange = ranges[ranges.length - 1]; - var range = Range.fromPoints(ranges[0].start, lastRange.end); - - this.toSingleRange(); - this.setSelectionRange(range, lastRange.cursor == lastRange.start); + this.reportError = function(err) { + window.console && console.error && console.error(err); }; - this.toggleBlockSelection = function () { - if (this.rangeCount > 1) { - var ranges = this.rangeList.ranges; - var lastRange = ranges[ranges.length - 1]; - var range = Range.fromPoints(ranges[0].start, lastRange.end); - this.toSingleRange(); - this.setSelectionRange(range, lastRange.cursor == lastRange.start); - } else { - var cursor = this.session.documentToScreenPosition(this.cursor); - var anchor = this.session.documentToScreenPosition(this.anchor); + this.$normalizePath = function(path) { + return net.qualifyURL(path); + }; - var rectSel = this.rectangularRangeBlock(cursor, anchor); - rectSel.forEach(this.addRange, this); - } + this.terminate = function() { + this._signal("terminate", {}); + this.deltaQueue = null; + this.$worker.terminate(); + this.$worker.onerror = function(e) { + e.preventDefault(); + }; + this.$worker = null; + if (this.$doc) + this.$doc.off("change", this.changeListener); + this.$doc = null; }; - this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) { - var rectSel = []; - var xBackwards = screenCursor.column < screenAnchor.column; - if (xBackwards) { - var startColumn = screenCursor.column; - var endColumn = screenAnchor.column; - var startOffsetX = screenCursor.offsetX; - var endOffsetX = screenAnchor.offsetX; - } else { - var startColumn = screenAnchor.column; - var endColumn = screenCursor.column; - var startOffsetX = screenAnchor.offsetX; - var endOffsetX = screenCursor.offsetX; - } + this.send = function(cmd, args) { + this.$worker.postMessage({command: cmd, args: args}); + }; - var yBackwards = screenCursor.row < screenAnchor.row; - if (yBackwards) { - var startRow = screenCursor.row; - var endRow = screenAnchor.row; - } else { - var startRow = screenAnchor.row; - var endRow = screenCursor.row; + this.call = function(cmd, args, callback) { + if (callback) { + var id = this.callbackId++; + this.callbacks[id] = callback; + args.push(id); } + this.send(cmd, args); + }; - if (startColumn < 0) - startColumn = 0; - if (startRow < 0) - startRow = 0; - - if (startRow == endRow) - includeEmptyLines = true; - - var docEnd; - for (var row = startRow; row <= endRow; row++) { - var range = Range.fromPoints( - this.session.screenToDocumentPosition(row, startColumn, startOffsetX), - this.session.screenToDocumentPosition(row, endColumn, endOffsetX) - ); - if (range.isEmpty()) { - if (docEnd && isSamePoint(range.end, docEnd)) - break; - docEnd = range.end; - } - range.cursor = xBackwards ? range.start : range.end; - rectSel.push(range); + this.emit = function(event, data) { + try { + if (data.data && data.data.err) + data.data.err = {message: data.data.err.message, stack: data.data.err.stack, code: data.data.err.code}; + this.$worker && this.$worker.postMessage({event: event, data: {data: data.data}}); } - - if (yBackwards) - rectSel.reverse(); - - if (!includeEmptyLines) { - var end = rectSel.length - 1; - while (rectSel[end].isEmpty() && end > 0) - end--; - if (end > 0) { - var start = 0; - while (rectSel[start].isEmpty()) - start++; - } - for (var i = end; i >= start; i--) { - if (rectSel[i].isEmpty()) - rectSel.splice(i, 1); - } + catch(ex) { + console.error(ex.stack); } - - return rectSel; - }; -}).call(Selection.prototype); -var Editor = require("./editor").Editor; -(function() { - this.updateSelectionMarkers = function() { - this.renderer.updateCursor(); - this.renderer.updateBackMarkers(); }; - this.addSelectionMarker = function(orientedRange) { - if (!orientedRange.cursor) - orientedRange.cursor = orientedRange.end; - var style = this.getSelectionStyle(); - orientedRange.marker = this.session.addMarker(orientedRange, "ace_selection", style); + this.attachToDocument = function(doc) { + if (this.$doc) + this.terminate(); - this.session.$selectionMarkers.push(orientedRange); - this.session.selectionMarkerCount = this.session.$selectionMarkers.length; - return orientedRange; - }; - this.removeSelectionMarker = function(range) { - if (!range.marker) - return; - this.session.removeMarker(range.marker); - var index = this.session.$selectionMarkers.indexOf(range); - if (index != -1) - this.session.$selectionMarkers.splice(index, 1); - this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + this.$doc = doc; + this.call("setValue", [doc.getValue()]); + doc.on("change", this.changeListener, true); }; - this.removeSelectionMarkers = function(ranges) { - var markerList = this.session.$selectionMarkers; - for (var i = ranges.length; i--; ) { - var range = ranges[i]; - if (!range.marker) - continue; - this.session.removeMarker(range.marker); - var index = markerList.indexOf(range); - if (index != -1) - markerList.splice(index, 1); + this.changeListener = function(delta) { + if (!this.deltaQueue) { + this.deltaQueue = []; + setTimeout(this.$sendDeltaQueue, 0); } - this.session.selectionMarkerCount = markerList.length; + if (delta.action == "insert") + this.deltaQueue.push(delta.start, delta.lines); + else + this.deltaQueue.push(delta.start, delta.end); }; - this.$onAddRange = function(e) { - this.addSelectionMarker(e.range); - this.renderer.updateCursor(); - this.renderer.updateBackMarkers(); + this.$sendDeltaQueue = function() { + var q = this.deltaQueue; + if (!q) return; + this.deltaQueue = null; + if (q.length > 50 && q.length > this.$doc.getLength() >> 1) { + this.call("setValue", [this.$doc.getValue()]); + } else + this.emit("change", {data: q}); }; - this.$onRemoveRange = function(e) { - this.removeSelectionMarkers(e.ranges); - this.renderer.updateCursor(); - this.renderer.updateBackMarkers(); - }; +}).call(WorkerClient.prototype); - this.$onMultiSelect = function(e) { - if (this.inMultiSelectMode) - return; - this.inMultiSelectMode = true; - this.setStyle("ace_multiselect"); - this.keyBinding.addKeyboardHandler(commands.keyboardHandler); - this.commands.setDefaultHandler("exec", this.$onMultiSelectExec); +var UIWorkerClient = function(topLevelNamespaces, mod, classname) { + var main = null; + var emitSync = false; + var sender = Object.create(EventEmitter); - this.renderer.updateCursor(); - this.renderer.updateBackMarkers(); - }; + var messageBuffer = []; + var workerClient = new WorkerClient({ + messageBuffer: messageBuffer, + terminate: function() {}, + postMessage: function(e) { + messageBuffer.push(e); + if (!main) return; + if (emitSync) + setTimeout(processNext); + else + processNext(); + } + }); - this.$onSingleSelect = function(e) { - if (this.session.multiSelect.inVirtualMode) - return; - this.inMultiSelectMode = false; + workerClient.setEmitSync = function(val) { emitSync = val; }; - this.unsetStyle("ace_multiselect"); - this.keyBinding.removeKeyboardHandler(commands.keyboardHandler); + var processNext = function() { + var msg = messageBuffer.shift(); + if (msg.command) + main[msg.command].apply(main, msg.args); + else if (msg.event) + sender._signal(msg.event, msg.data); + }; - this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec); - this.renderer.updateCursor(); - this.renderer.updateBackMarkers(); - this._emit("changeSelection"); + sender.postMessage = function(msg) { + workerClient.onMessage({data: msg}); + }; + sender.callback = function(data, callbackId) { + this.postMessage({type: "call", id: callbackId, data: data}); + }; + sender.emit = function(name, data) { + this.postMessage({type: "event", name: name, data: data}); }; - this.$onMultiSelectExec = function(e) { - var command = e.command; - var editor = e.editor; - if (!editor.multiSelect) + config.loadModule(["worker", mod], function(Main) { + main = new Main[classname](sender); + while (messageBuffer.length) + processNext(); + }); + + return workerClient; +}; + +exports.UIWorkerClient = UIWorkerClient; +exports.WorkerClient = WorkerClient; +exports.createWorker = createWorker; + + +}); + +define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"], function(require, exports, module){"use strict"; +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var oop = require("./lib/oop"); +var PlaceHolder = /** @class */ (function () { + function PlaceHolder(session, length, pos, others, mainClass, othersClass) { + var _self = this; + this.length = length; + this.session = session; + this.doc = session.getDocument(); + this.mainClass = mainClass; + this.othersClass = othersClass; + this.$onUpdate = this.onUpdate.bind(this); + this.doc.on("change", this.$onUpdate, true); + this.$others = others; + this.$onCursorChange = function () { + setTimeout(function () { + _self.onCursorChange(); + }); + }; + this.$pos = pos; + var undoStack = session.getUndoManager().$undoStack || session.getUndoManager()["$undostack"] || { length: -1 }; + this.$undoStackDepth = undoStack.length; + this.setup(); + session.selection.on("changeCursor", this.$onCursorChange); + } + PlaceHolder.prototype.setup = function () { + var _self = this; + var doc = this.doc; + var session = this.session; + this.selectionBefore = session.selection.toJSON(); + if (session.selection.inMultiSelectMode) + session.selection.toSingleRange(); + this.pos = doc.createAnchor(this.$pos.row, this.$pos.column); + var pos = this.pos; + pos.$insertRight = true; + pos.detach(); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); + this.others = []; + this.$others.forEach(function (other) { + var anchor = doc.createAnchor(other.row, other.column); + anchor.$insertRight = true; + anchor.detach(); + _self.others.push(anchor); + }); + session.setUndoSelect(false); + }; + PlaceHolder.prototype.showOtherMarkers = function () { + if (this.othersActive) return; - if (!command.multiSelectAction) { - var result = command.exec(editor, e.args || {}); - editor.multiSelect.addRange(editor.multiSelect.toOrientedRange()); - editor.multiSelect.mergeOverlappingRanges(); - } else if (command.multiSelectAction == "forEach") { - result = editor.forEachSelection(command, e.args); - } else if (command.multiSelectAction == "forEachLine") { - result = editor.forEachSelection(command, e.args, true); - } else if (command.multiSelectAction == "single") { - editor.exitMultiSelectMode(); - result = command.exec(editor, e.args || {}); - } else { - result = command.multiSelectAction(editor, e.args || {}); + var session = this.session; + var _self = this; + this.othersActive = true; + this.others.forEach(function (anchor) { + anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column + _self.length), _self.othersClass, null, false); + }); + }; + PlaceHolder.prototype.hideOtherMarkers = function () { + if (!this.othersActive) + return; + this.othersActive = false; + for (var i = 0; i < this.others.length; i++) { + this.session.removeMarker(this.others[i].markerId); } - return result; - }; - this.forEachSelection = function(cmd, args, options) { - if (this.inVirtualSelectionMode) + }; + PlaceHolder.prototype.onUpdate = function (delta) { + if (this.$updating) + return this.updateAnchors(delta); + var range = delta; + if (range.start.row !== range.end.row) return; - var keepOrder = options && options.keepOrder; - var $byLines = options == true || options && options.$byLines; - var session = this.session; - var selection = this.selection; - var rangeList = selection.rangeList; - var ranges = (keepOrder ? selection : rangeList).ranges; - var result; - - if (!ranges.length) - return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); - - var reg = selection._eventRegistry; - selection._eventRegistry = {}; - - var tmpSel = new Selection(session); - this.inVirtualSelectionMode = true; - for (var i = ranges.length; i--;) { - if ($byLines) { - while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row) - i--; + if (range.start.row !== this.pos.row) + return; + this.$updating = true; + var lengthDiff = delta.action === "insert" ? range.end.column - range.start.column : range.start.column - range.end.column; + var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1; + var distanceFromStart = range.start.column - this.pos.column; + this.updateAnchors(delta); + if (inMainRange) + this.length += lengthDiff; + if (inMainRange && !this.session.$fromUndo) { + if (delta.action === 'insert') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = { row: otherPos.row, column: otherPos.column + distanceFromStart }; + this.doc.insertMergedLines(newPos, delta.lines); + } + } + else if (delta.action === 'remove') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = { row: otherPos.row, column: otherPos.column + distanceFromStart }; + this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff)); + } } - tmpSel.fromOrientedRange(ranges[i]); - tmpSel.index = i; - this.selection = session.selection = tmpSel; - var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); - if (!result && cmdResult !== undefined) - result = cmdResult; - tmpSel.toOrientedRange(ranges[i]); } - tmpSel.detach(); - - this.selection = session.selection = selection; - this.inVirtualSelectionMode = false; - selection._eventRegistry = reg; - selection.mergeOverlappingRanges(); - if (selection.ranges[0]) - selection.fromOrientedRange(selection.ranges[0]); - - var anim = this.renderer.$scrollAnimation; - this.onCursorChange(); - this.onSelectionChange(); - if (anim && anim.from == anim.to) - this.renderer.animateScrolling(anim.from); - - return result; + this.$updating = false; + this.updateMarkers(); + }; + PlaceHolder.prototype.updateAnchors = function (delta) { + this.pos.onChange(delta); + for (var i = this.others.length; i--;) + this.others[i].onChange(delta); + this.updateMarkers(); + }; + PlaceHolder.prototype.updateMarkers = function () { + if (this.$updating) + return; + var _self = this; + var session = this.session; + var updateMarker = function (pos, className) { + session.removeMarker(pos.markerId); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + _self.length), className, null, false); + }; + updateMarker(this.pos, this.mainClass); + for (var i = this.others.length; i--;) + updateMarker(this.others[i], this.othersClass); }; - this.exitMultiSelectMode = function() { - if (!this.inMultiSelectMode || this.inVirtualSelectionMode) + PlaceHolder.prototype.onCursorChange = function (event) { + if (this.$updating || !this.session) return; - this.multiSelect.toSingleRange(); - }; - - this.getSelectedText = function() { - var text = ""; - if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { - var ranges = this.multiSelect.rangeList.ranges; - var buf = []; - for (var i = 0; i < ranges.length; i++) { - buf.push(this.session.getTextRange(ranges[i])); - } - var nl = this.session.getDocument().getNewLineCharacter(); - text = buf.join(nl); - if (text.length == (buf.length - 1) * nl.length) - text = ""; - } else if (!this.selection.isEmpty()) { - text = this.session.getTextRange(this.getSelectionRange()); + var pos = this.session.selection.getCursor(); + if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { + this.showOtherMarkers(); + this._emit("cursorEnter", event); + } + else { + this.hideOtherMarkers(); + this._emit("cursorLeave", event); } - return text; }; - - this.$checkMultiselectChange = function(e, anchor) { - if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { - var range = this.multiSelect.ranges[0]; - if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor) - return; - var pos = anchor == this.multiSelect.anchor - ? range.cursor == range.start ? range.end : range.start - : range.cursor; - if (pos.row != anchor.row - || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column) - this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange()); - else - this.multiSelect.mergeOverlappingRanges(); + PlaceHolder.prototype.detach = function () { + this.session.removeMarker(this.pos && this.pos.markerId); + this.hideOtherMarkers(); + this.doc.off("change", this.$onUpdate); + this.session.selection.off("changeCursor", this.$onCursorChange); + this.session.setUndoSelect(true); + this.session = null; + }; + PlaceHolder.prototype.cancel = function () { + if (this.$undoStackDepth === -1) + return; + var undoManager = this.session.getUndoManager(); + var undosRequired = (undoManager.$undoStack || undoManager["$undostack"]).length - this.$undoStackDepth; + for (var i = 0; i < undosRequired; i++) { + undoManager.undo(this.session, true); } + if (this.selectionBefore) + this.session.selection.fromJSON(this.selectionBefore); }; - this.findAll = function(needle, options, additive) { - options = options || {}; - options.needle = needle || options.needle; - if (options.needle == undefined) { - var range = this.selection.isEmpty() - ? this.selection.getWordRange() - : this.selection.getRange(); - options.needle = this.session.getTextRange(range); - } - this.$search.set(options); - - var ranges = this.$search.findAll(this.session); - if (!ranges.length) - return 0; - - var selection = this.multiSelect; + return PlaceHolder; +}()); +oop.implement(PlaceHolder.prototype, EventEmitter); +exports.PlaceHolder = PlaceHolder; - if (!additive) - selection.toSingleRange(ranges[0]); +}); - for (var i = ranges.length; i--; ) - selection.addRange(ranges[i], true); - if (range && selection.rangeList.rangeAtPoint(range.start)) - selection.addRange(range, true); - - return ranges.length; +define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module){var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} +function onMouseDown(e) { + var ev = e.domEvent; + var alt = ev.altKey; + var shift = ev.shiftKey; + var ctrl = ev.ctrlKey; + var accel = e.getAccelKey(); + var button = e.getButton(); + if (ctrl && useragent.isMac) + button = ev.button; + if (e.editor.inMultiSelectMode && button == 2) { + e.editor.textInput.onContextMenu(e.domEvent); + return; + } + if (!ctrl && !alt && !accel) { + if (button === 0 && e.editor.inMultiSelectMode) + e.editor.exitMultiSelectMode(); + return; + } + if (button !== 0) + return; + var editor = e.editor; + var selection = editor.selection; + var isMultiSelect = editor.inMultiSelectMode; + var pos = e.getDocumentPosition(); + var cursor = selection.getCursor(); + var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor)); + var mouseX = e.x, mouseY = e.y; + var onMouseSelection = function (e) { + mouseX = e.clientX; + mouseY = e.clientY; }; - this.selectMoreLines = function(dir, skip) { - var range = this.selection.toOrientedRange(); - var isBackwards = range.cursor == range.end; - - var screenLead = this.session.documentToScreenPosition(range.cursor); - if (this.selection.$desiredColumn) - screenLead.column = this.selection.$desiredColumn; - - var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column); - - if (!range.isEmpty()) { - var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start); - var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column); - } else { - var anchor = lead; + var session = editor.session; + var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var screenCursor = screenAnchor; + var selectionMode; + if (editor.$mouseHandler.$enableJumpToDef) { + if (ctrl && alt || accel && alt) + selectionMode = shift ? "block" : "add"; + else if (alt && editor.$blockSelectEnabled) + selectionMode = "block"; + } + else { + if (accel && !alt) { + selectionMode = "add"; + if (!isMultiSelect && shift) + return; } - - if (isBackwards) { - var newRange = Range.fromPoints(lead, anchor); - newRange.cursor = newRange.start; - } else { - var newRange = Range.fromPoints(anchor, lead); - newRange.cursor = newRange.end; + else if (alt && editor.$blockSelectEnabled) { + selectionMode = "block"; } - - newRange.desiredColumn = screenLead.column; - if (!this.selection.inMultiSelectMode) { - this.selection.addRange(range); - } else { - if (skip) - var toRemove = range.cursor; + } + if (selectionMode && useragent.isMac && ev.ctrlKey) { + editor.$mouseHandler.cancelContextMenu(); + } + if (selectionMode == "add") { + if (!isMultiSelect && inSelection) + return; // dragging + if (!isMultiSelect) { + var range = selection.toOrientedRange(); + editor.addSelectionMarker(range); + } + var oldRange = selection.rangeList.rangeAtPoint(pos); + editor.inVirtualSelectionMode = true; + if (shift) { + oldRange = null; + range = selection.ranges[0] || range; + editor.removeSelectionMarker(range); + } + editor.once("mouseup", function () { + var tmpSel = selection.toOrientedRange(); + if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) + selection.substractPoint(tmpSel.cursor); + else { + if (shift) { + selection.substractPoint(range.cursor); + } + else if (range) { + editor.removeSelectionMarker(range); + selection.addRange(range); + } + selection.addRange(tmpSel); + } + editor.inVirtualSelectionMode = false; + }); + } + else if (selectionMode == "block") { + e.stop(); + editor.inVirtualSelectionMode = true; + var initialRange; + var rectSel = []; + var blockSelect = function () { + var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX); + if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead)) + return; + screenCursor = newCursor; + editor.selection.moveToPosition(cursor); + editor.renderer.scrollCursorIntoView(); + editor.removeSelectionMarkers(rectSel); + rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor); + if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty()) + rectSel[0] = editor.$mouseHandler.$clickSelection.clone(); + rectSel.forEach(editor.addSelectionMarker, editor); + editor.updateSelectionMarkers(); + }; + if (isMultiSelect && !accel) { + selection.toSingleRange(); + } + else if (!isMultiSelect && accel) { + initialRange = selection.toOrientedRange(); + editor.addSelectionMarker(initialRange); } + if (shift) + screenAnchor = session.documentToScreenPosition(selection.lead); + else + selection.moveToPosition(pos); + screenCursor = { row: -1, column: -1 }; + var onMouseSelectionEnd = function (e) { + blockSelect(); + clearInterval(timerId); + editor.removeSelectionMarkers(rectSel); + if (!rectSel.length) + rectSel = [selection.toOrientedRange()]; + if (initialRange) { + editor.removeSelectionMarker(initialRange); + selection.toSingleRange(initialRange); + } + for (var i = 0; i < rectSel.length; i++) + selection.addRange(rectSel[i]); + editor.inVirtualSelectionMode = false; + editor.$mouseHandler.$clickSelection = null; + }; + var onSelectionInterval = blockSelect; + event.capture(editor.container, onMouseSelection, onMouseSelectionEnd); + var timerId = setInterval(function () { onSelectionInterval(); }, 20); + return e.preventDefault(); + } +} +exports.onMouseDown = onMouseDown; - this.selection.addRange(newRange); - if (toRemove) - this.selection.substractPoint(toRemove); - }; - this.transposeSelections = function(dir) { - var session = this.session; - var sel = session.multiSelect; - var all = sel.ranges; +}); + +define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module){/** + * commands to enter multiselect mode + * @type {import("../../ace-internal").Ace.Command[]} + */ +exports.defaultCommands = [{ + name: "addCursorAbove", + description: "Add cursor above", + exec: function (editor) { editor.selectMoreLines(-1); }, + bindKey: { win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "addCursorBelow", + description: "Add cursor below", + exec: function (editor) { editor.selectMoreLines(1); }, + bindKey: { win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "addCursorAboveSkipCurrent", + description: "Add cursor above (skip current)", + exec: function (editor) { editor.selectMoreLines(-1, true); }, + bindKey: { win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "addCursorBelowSkipCurrent", + description: "Add cursor below (skip current)", + exec: function (editor) { editor.selectMoreLines(1, true); }, + bindKey: { win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectMoreBefore", + description: "Select more before", + exec: function (editor) { editor.selectMore(-1); }, + bindKey: { win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectMoreAfter", + description: "Select more after", + exec: function (editor) { editor.selectMore(1); }, + bindKey: { win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectNextBefore", + description: "Select next before", + exec: function (editor) { editor.selectMore(-1, true); }, + bindKey: { win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectNextAfter", + description: "Select next after", + exec: function (editor) { editor.selectMore(1, true); }, + bindKey: { win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "toggleSplitSelectionIntoLines", + description: "Split selection into lines", + exec: function (editor) { + if (editor.multiSelect.rangeCount > 1) + editor.multiSelect.joinSelections(); + else + editor.multiSelect.splitIntoLines(); + }, + bindKey: { win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L" }, + readOnly: true + }, { + name: "splitSelectionIntoLines", + description: "Split into lines", + exec: function (editor) { editor.multiSelect.splitIntoLines(); }, + readOnly: true + }, { + name: "alignCursors", + description: "Align cursors", + exec: function (editor) { editor.alignCursors(); }, + bindKey: { win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A" }, + scrollIntoView: "cursor" + }, { + name: "findAll", + description: "Find all", + exec: function (editor) { editor.findAll(); }, + bindKey: { win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G" }, + scrollIntoView: "cursor", + readOnly: true + }]; +exports.multiSelectCommands = [{ + name: "singleSelection", + description: "Single selection", + bindKey: "esc", + exec: function (editor) { editor.exitMultiSelectMode(); }, + scrollIntoView: "cursor", + readOnly: true, + isAvailable: function (editor) { return editor && editor.inMultiSelectMode; } + }]; +var HashHandler = require("../keyboard/hash_handler").HashHandler; +exports.keyboardHandler = new HashHandler(exports.multiSelectCommands); - for (var i = all.length; i--; ) { - var range = all[i]; - if (range.isEmpty()) { - var tmp = session.getWordRange(range.start.row, range.start.column); - range.start.row = tmp.start.row; - range.start.column = tmp.start.column; - range.end.row = tmp.end.row; - range.end.column = tmp.end.column; +}); + +define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"], function(require, exports, module){/** + * @typedef {import("./anchor").Anchor} Anchor + * @typedef {import("../ace-internal").Ace.Point} Point + * @typedef {import("../ace-internal").Ace.ScreenCoordinates} ScreenCoordinates + */ +var RangeList = require("./range_list").RangeList; +var Range = require("./range").Range; +var Selection = require("./selection").Selection; +var onMouseDown = require("./mouse/multi_select_handler").onMouseDown; +var event = require("./lib/event"); +var lang = require("./lib/lang"); +var commands = require("./commands/multi_select_commands"); +exports.commands = commands.defaultCommands.concat(commands.multiSelectCommands); +var Search = require("./search").Search; +var search = new Search(); +function find(session, needle, dir) { + search.$options.wrap = true; + search.$options.needle = needle; + search.$options.backwards = dir == -1; + return search.find(session); +} +var EditSession = require("./edit_session").EditSession; +(function () { + this.getSelectionMarkers = function () { + return this.$selectionMarkers; + }; +}).call(EditSession.prototype); +(function () { + this.ranges = null; + this.rangeList = null; + this.addRange = function (range, $blockChangeEvents) { + if (!range) + return; + if (!this.inMultiSelectMode && this.rangeCount === 0) { + var oldRange = this.toOrientedRange(); + this.rangeList.add(oldRange); + this.rangeList.add(range); + if (this.rangeList.ranges.length != 2) { + this.rangeList.removeAll(); + return $blockChangeEvents || this.fromOrientedRange(range); } + this.rangeList.removeAll(); + this.rangeList.add(oldRange); + this.$onAddRange(oldRange); } - sel.mergeOverlappingRanges(); - - var words = []; - for (var i = all.length; i--; ) { - var range = all[i]; - words.unshift(session.getTextRange(range)); + if (!range.cursor) + range.cursor = range.end; + var removed = this.rangeList.add(range); + this.$onAddRange(range); + if (removed.length) + this.$onRemoveRange(removed); + if (this.rangeCount > 1 && !this.inMultiSelectMode) { + this._signal("multiSelect"); + this.inMultiSelectMode = true; + this.session.$undoSelect = false; + this.rangeList.attach(this.session); } - - if (dir < 0) - words.unshift(words.pop()); - else - words.push(words.shift()); - - for (var i = all.length; i--; ) { - var range = all[i]; - var tmp = range.clone(); - session.replace(range, words[i]); - range.start.row = tmp.start.row; - range.start.column = tmp.start.column; + return $blockChangeEvents || this.fromOrientedRange(range); + }; + this.toSingleRange = function (range) { + range = range || this.ranges[0]; + var removed = this.rangeList.removeAll(); + if (removed.length) + this.$onRemoveRange(removed); + range && this.fromOrientedRange(range); + }; + this.substractPoint = function (pos) { + var removed = this.rangeList.substractPoint(pos); + if (removed) { + this.$onRemoveRange(removed); + return removed[0]; } - sel.fromOrientedRange(sel.ranges[0]); }; - this.selectMore = function(dir, skip, stopAtFirst) { - var session = this.session; - var sel = session.multiSelect; - - var range = sel.toOrientedRange(); - if (range.isEmpty()) { - range = session.getWordRange(range.start.row, range.start.column); - range.cursor = dir == -1 ? range.start : range.end; - this.multiSelect.addRange(range); - if (stopAtFirst) - return; + this.mergeOverlappingRanges = function () { + var removed = this.rangeList.merge(); + if (removed.length) + this.$onRemoveRange(removed); + }; + this.$onAddRange = function (range) { + this.rangeCount = this.rangeList.ranges.length; + this.ranges.unshift(range); + this._signal("addRange", { range: range }); + }; + this.$onRemoveRange = function (removed) { + this.rangeCount = this.rangeList.ranges.length; + if (this.rangeCount == 1 && this.inMultiSelectMode) { + var lastRange = this.rangeList.ranges.pop(); + removed.push(lastRange); + this.rangeCount = 0; } - var needle = session.getTextRange(range); - - var newRange = find(session, needle, dir); - if (newRange) { - newRange.cursor = dir == -1 ? newRange.start : newRange.end; - this.session.unfold(newRange); - this.multiSelect.addRange(newRange); - this.renderer.scrollCursorIntoView(null, 0.5); + for (var i = removed.length; i--;) { + var index = this.ranges.indexOf(removed[i]); + this.ranges.splice(index, 1); } - if (skip) - this.multiSelect.substractPoint(range.cursor); + this._signal("removeRange", { ranges: removed }); + if (this.rangeCount === 0 && this.inMultiSelectMode) { + this.inMultiSelectMode = false; + this._signal("singleSelect"); + this.session.$undoSelect = true; + this.rangeList.detach(this.session); + } + lastRange = lastRange || this.ranges[0]; + if (lastRange && !lastRange.isEqual(this.getRange())) + this.fromOrientedRange(lastRange); }; - this.alignCursors = function() { - var session = this.session; - var sel = session.multiSelect; - var ranges = sel.ranges; - var row = -1; - var sameRowRanges = ranges.filter(function(r) { - if (r.cursor.row == row) - return true; - row = r.cursor.row; - }); - - if (!ranges.length || sameRowRanges.length == ranges.length - 1) { - var range = this.selection.getRange(); - var fr = range.start.row, lr = range.end.row; - var guessRange = fr == lr; - if (guessRange) { - var max = this.session.getLength(); - var line; - do { - line = this.session.getLine(lr); - } while (/[=:]/.test(line) && ++lr < max); - do { - line = this.session.getLine(fr); - } while (/[=:]/.test(line) && --fr > 0); - - if (fr < 0) fr = 0; - if (lr >= max) lr = max - 1; + this.$initRangeList = function () { + if (this.rangeList) + return; + this.rangeList = new RangeList(); + this.ranges = []; + this.rangeCount = 0; + }; + this.getAllRanges = function () { + return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()]; + }; + this.splitIntoLines = function () { + var ranges = this.ranges.length ? this.ranges : [this.getRange()]; + var newRanges = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + var row = range.start.row; + var endRow = range.end.row; + if (row === endRow) { + newRanges.push(range.clone()); } - var lines = this.session.removeFullLines(fr, lr); - lines = this.$reAlignText(lines, guessRange); - this.session.insert({row: fr, column: 0}, lines.join("\n") + "\n"); - if (!guessRange) { - range.start.column = 0; - range.end.column = lines[lines.length - 1].length; + else { + newRanges.push(new Range(row, range.start.column, row, this.session.getLine(row).length)); + while (++row < endRow) + newRanges.push(this.getLineRange(row, true)); + newRanges.push(new Range(endRow, 0, endRow, range.end.column)); } - this.selection.setRange(range); - } else { - sameRowRanges.forEach(function(r) { - sel.substractPoint(r.cursor); - }); - - var maxCol = 0; - var minSpace = Infinity; - var spaceOffsets = ranges.map(function(r) { - var p = r.cursor; - var line = session.getLine(p.row); - var spaceOffset = line.substr(p.column).search(/\S/g); - if (spaceOffset == -1) - spaceOffset = 0; - - if (p.column > maxCol) - maxCol = p.column; - if (spaceOffset < minSpace) - minSpace = spaceOffset; - return spaceOffset; - }); - ranges.forEach(function(r, i) { - var p = r.cursor; - var l = maxCol - p.column; - var d = spaceOffsets[i] - minSpace; - if (l > d) - session.insert(p, lang.stringRepeat(" ", l - d)); - else - session.remove(new Range(p.row, p.column, p.row, p.column - l + d)); - - r.start.column = r.end.column = maxCol; - r.start.row = r.end.row = p.row; - r.cursor = r.end; - }); - sel.fromOrientedRange(ranges[0]); - this.renderer.updateCursor(); - this.renderer.updateBackMarkers(); + if (i == 0 && !this.isBackwards()) + newRanges = newRanges.reverse(); } + this.toSingleRange(); + for (var i = newRanges.length; i--;) + this.addRange(newRanges[i]); }; - - this.$reAlignText = function(lines, forceLeft) { - var isLeftAligned = true, isRightAligned = true; - var startW, textW, endW; - - return lines.map(function(line) { - var m = line.match(/(\s*)(.*?)(\s*)([=:].*)/); - if (!m) - return [line]; - - if (startW == null) { - startW = m[1].length; - textW = m[2].length; - endW = m[3].length; - return m; - } - - if (startW + textW + endW != m[1].length + m[2].length + m[3].length) - isRightAligned = false; - if (startW != m[1].length) - isLeftAligned = false; - - if (startW > m[1].length) - startW = m[1].length; - if (textW < m[2].length) - textW = m[2].length; - if (endW > m[3].length) - endW = m[3].length; - - return m; - }).map(forceLeft ? alignLeft : - isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign); - - function spaces(n) { - return lang.stringRepeat(" ", n); + this.joinSelections = function () { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + }; + this.toggleBlockSelection = function () { + if (this.rangeCount > 1) { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); } - - function alignLeft(m) { - return !m[2] ? m[0] : spaces(startW) + m[2] - + spaces(textW - m[2].length + endW) - + m[4].replace(/^([=:])\s+/, "$1 "); + else { + var cursor = this.session.documentToScreenPosition(this.cursor); + var anchor = this.session.documentToScreenPosition(this.anchor); + var rectSel = this.rectangularRangeBlock(cursor, anchor); + rectSel.forEach(this.addRange, this); } - function alignRight(m) { - return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2] - + spaces(endW) - + m[4].replace(/^([=:])\s+/, "$1 "); + }; + this.rectangularRangeBlock = function (screenCursor, screenAnchor, includeEmptyLines) { + var rectSel = []; + var xBackwards = screenCursor.column < screenAnchor.column; + if (xBackwards) { + var startColumn = screenCursor.column; + var endColumn = screenAnchor.column; + var startOffsetX = screenCursor.offsetX; + var endOffsetX = screenAnchor.offsetX; } - function unAlign(m) { - return !m[2] ? m[0] : spaces(startW) + m[2] - + spaces(endW) - + m[4].replace(/^([=:])\s+/, "$1 "); + else { + var startColumn = screenAnchor.column; + var endColumn = screenCursor.column; + var startOffsetX = screenAnchor.offsetX; + var endOffsetX = screenCursor.offsetX; } - }; -}).call(Editor.prototype); - - -function isSamePoint(p1, p2) { - return p1.row == p2.row && p1.column == p2.column; -} -exports.onSessionChange = function(e) { - var session = e.session; - if (session && !session.multiSelect) { - session.$selectionMarkers = []; - session.selection.$initRangeList(); - session.multiSelect = session.selection; - } - this.multiSelect = session && session.multiSelect; - - var oldSession = e.oldSession; - if (oldSession) { - oldSession.multiSelect.off("addRange", this.$onAddRange); - oldSession.multiSelect.off("removeRange", this.$onRemoveRange); - oldSession.multiSelect.off("multiSelect", this.$onMultiSelect); - oldSession.multiSelect.off("singleSelect", this.$onSingleSelect); - oldSession.multiSelect.lead.off("change", this.$checkMultiselectChange); - oldSession.multiSelect.anchor.off("change", this.$checkMultiselectChange); - } - - if (session) { - session.multiSelect.on("addRange", this.$onAddRange); - session.multiSelect.on("removeRange", this.$onRemoveRange); - session.multiSelect.on("multiSelect", this.$onMultiSelect); - session.multiSelect.on("singleSelect", this.$onSingleSelect); - session.multiSelect.lead.on("change", this.$checkMultiselectChange); - session.multiSelect.anchor.on("change", this.$checkMultiselectChange); - } - - if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) { - if (session.selection.inMultiSelectMode) - this.$onMultiSelect(); - else - this.$onSingleSelect(); - } -}; -function MultiSelect(editor) { - if (editor.$multiselectOnSessionChange) - return; - editor.$onAddRange = editor.$onAddRange.bind(editor); - editor.$onRemoveRange = editor.$onRemoveRange.bind(editor); - editor.$onMultiSelect = editor.$onMultiSelect.bind(editor); - editor.$onSingleSelect = editor.$onSingleSelect.bind(editor); - editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor); - editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor); - - editor.$multiselectOnSessionChange(editor); - editor.on("changeSession", editor.$multiselectOnSessionChange); - - editor.on("mousedown", onMouseDown); - editor.commands.addCommands(commands.defaultCommands); - - addAltCursorListeners(editor); -} - -function addAltCursorListeners(editor){ - if (!editor.textInput) return; - var el = editor.textInput.getElement(); - var altCursor = false; - event.addListener(el, "keydown", function(e) { - var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey); - if (editor.$blockSelectEnabled && altDown) { - if (!altCursor) { - editor.renderer.setMouseCursor("crosshair"); - altCursor = true; - } - } else if (altCursor) { - reset(); + var yBackwards = screenCursor.row < screenAnchor.row; + if (yBackwards) { + var startRow = screenCursor.row; + var endRow = screenAnchor.row; } - }, editor); - - event.addListener(el, "keyup", reset, editor); - event.addListener(el, "blur", reset, editor); - function reset(e) { - if (altCursor) { - editor.renderer.setMouseCursor(""); - altCursor = false; + else { + var startRow = screenAnchor.row; + var endRow = screenCursor.row; } - } -} - -exports.MultiSelect = MultiSelect; - - -require("./config").defineOptions(Editor.prototype, "editor", { - enableMultiselect: { - set: function(val) { - MultiSelect(this); - if (val) { - this.on("changeSession", this.$multiselectOnSessionChange); - this.on("mousedown", onMouseDown); - } else { - this.off("changeSession", this.$multiselectOnSessionChange); - this.off("mousedown", onMouseDown); + if (startColumn < 0) + startColumn = 0; + if (startRow < 0) + startRow = 0; + if (startRow == endRow) + includeEmptyLines = true; + var docEnd; + for (var row = startRow; row <= endRow; row++) { + var range = Range.fromPoints(this.session.screenToDocumentPosition(row, startColumn, startOffsetX), this.session.screenToDocumentPosition(row, endColumn, endOffsetX)); + if (range.isEmpty()) { + if (docEnd && isSamePoint(range.end, docEnd)) + break; + docEnd = range.end; } - }, - value: true - }, - enableBlockSelect: { - set: function(val) { - this.$blockSelectEnabled = val; - }, - value: true - } -}); - - - -}); - -define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"], function(require, exports, module) { -"use strict"; - -var Range = require("../../range").Range; - -var FoldMode = exports.FoldMode = function() {}; - -(function() { - - this.foldingStartMarker = null; - this.foldingStopMarker = null; - this.getFoldWidget = function(session, foldStyle, row) { - var line = session.getLine(row); - if (this.foldingStartMarker.test(line)) - return "start"; - if (foldStyle == "markbeginend" - && this.foldingStopMarker - && this.foldingStopMarker.test(line)) - return "end"; - return ""; + range.cursor = xBackwards ? range.start : range.end; + rectSel.push(range); + } + if (yBackwards) + rectSel.reverse(); + if (!includeEmptyLines) { + var end = rectSel.length - 1; + while (rectSel[end].isEmpty() && end > 0) + end--; + if (end > 0) { + var start = 0; + while (rectSel[start].isEmpty()) + start++; + } + for (var i = end; i >= start; i--) { + if (rectSel[i].isEmpty()) + rectSel.splice(i, 1); + } + } + return rectSel; }; - - this.getFoldWidgetRange = function(session, foldStyle, row) { - return null; +}).call(Selection.prototype); +var Editor = require("./editor").Editor; +(function () { + this.updateSelectionMarkers = function () { + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); }; - - this.indentationBlock = function(session, row, column) { - var re = /\S/; - var line = session.getLine(row); - var startLevel = line.search(re); - if (startLevel == -1) + this.addSelectionMarker = function (orientedRange) { + if (!orientedRange.cursor) + orientedRange.cursor = orientedRange.end; + var style = this.getSelectionStyle(); + orientedRange.marker = this.session.addMarker(orientedRange, "ace_selection", style); + this.session.$selectionMarkers.push(orientedRange); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + return orientedRange; + }; + this.removeSelectionMarker = function (range) { + if (!range.marker) + return; + this.session.removeMarker(range.marker); + var index = this.session.$selectionMarkers.indexOf(range); + if (index != -1) + this.session.$selectionMarkers.splice(index, 1); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + }; + this.removeSelectionMarkers = function (ranges) { + var markerList = this.session.$selectionMarkers; + for (var i = ranges.length; i--;) { + var range = ranges[i]; + if (!range.marker) + continue; + this.session.removeMarker(range.marker); + var index = markerList.indexOf(range); + if (index != -1) + markerList.splice(index, 1); + } + this.session.selectionMarkerCount = markerList.length; + }; + this.$onAddRange = function (e) { + this.addSelectionMarker(e.range); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.$onRemoveRange = function (e) { + this.removeSelectionMarkers(e.ranges); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.$onMultiSelect = function (e) { + if (this.inMultiSelectMode) + return; + this.inMultiSelectMode = true; + this.setStyle("ace_multiselect"); + this.keyBinding.addKeyboardHandler(commands.keyboardHandler); + this.commands.setDefaultHandler("exec", this.$onMultiSelectExec); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.$onSingleSelect = function (e) { + if (this.session.multiSelect.inVirtualMode) + return; + this.inMultiSelectMode = false; + this.unsetStyle("ace_multiselect"); + this.keyBinding.removeKeyboardHandler(commands.keyboardHandler); + this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + this._emit("changeSelection"); + }; + this.$onMultiSelectExec = function (e) { + var command = e.command; + var editor = e.editor; + if (!editor.multiSelect) return; - - var startColumn = column || line.length; - var maxRow = session.getLength(); - var startRow = row; - var endRow = row; - - while (++row < maxRow) { - var level = session.getLine(row).search(re); - - if (level == -1) - continue; - - if (level <= startLevel) { - var token = session.getTokenAt(row, 0); - if (!token || token.type !== "string") - break; - } - - endRow = row; + if (!command.multiSelectAction) { + var result = command.exec(editor, e.args || {}); + editor.multiSelect.addRange(editor.multiSelect.toOrientedRange()); + editor.multiSelect.mergeOverlappingRanges(); } - - if (endRow > startRow) { - var endColumn = session.getLine(endRow).length; - return new Range(startRow, startColumn, endRow, endColumn); + else if (command.multiSelectAction == "forEach") { + result = editor.forEachSelection(command, e.args); + } + else if (command.multiSelectAction == "forEachLine") { + result = editor.forEachSelection(command, e.args, true); + } + else if (command.multiSelectAction == "single") { + editor.exitMultiSelectMode(); + result = command.exec(editor, e.args || {}); } + else { + result = command.multiSelectAction(editor, e.args || {}); + } + return result; }; - - this.openingBracketBlock = function(session, bracket, row, column, typeRe) { - var start = {row: row, column: column + 1}; - var end = session.$findClosingBracket(bracket, start, typeRe); - if (!end) + this.forEachSelection = function (cmd, args, options) { + if (this.inVirtualSelectionMode) return; - - var fw = session.foldWidgets[end.row]; - if (fw == null) - fw = session.getFoldWidget(end.row); - - if (fw == "start" && end.row > start.row) { - end.row --; - end.column = session.getLine(end.row).length; + var keepOrder = options && options.keepOrder; + var $byLines = options == true || options && options.$byLines; + var session = this.session; + var selection = this.selection; + var rangeList = selection.rangeList; + var ranges = (keepOrder ? selection : rangeList).ranges; + var result; + if (!ranges.length) + return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + var reg = selection._eventRegistry; + selection._eventRegistry = {}; + var tmpSel = new Selection(session); + this.inVirtualSelectionMode = true; + for (var i = ranges.length; i--;) { + if ($byLines) { + while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row) + i--; + } + tmpSel.fromOrientedRange(ranges[i]); + tmpSel.index = i; + this.selection = session.selection = tmpSel; + var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + if (!result && cmdResult !== undefined) + result = cmdResult; + tmpSel.toOrientedRange(ranges[i]); } - return Range.fromPoints(start, end); + tmpSel.detach(); + this.selection = session.selection = selection; + this.inVirtualSelectionMode = false; + selection._eventRegistry = reg; + selection.mergeOverlappingRanges(); + if (selection.ranges[0]) + selection.fromOrientedRange(selection.ranges[0]); + var anim = this.renderer.$scrollAnimation; + this.onCursorChange(); + this.onSelectionChange(); + if (anim && anim.from == anim.to) + this.renderer.animateScrolling(anim.from); + return result; }; - - this.closingBracketBlock = function(session, bracket, row, column, typeRe) { - var end = {row: row, column: column}; - var start = session.$findOpeningBracket(bracket, end); - - if (!start) + this.exitMultiSelectMode = function () { + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) return; - - start.column++; - end.column--; - - return Range.fromPoints(start, end); + this.multiSelect.toSingleRange(); }; -}).call(FoldMode.prototype); - -}); - -define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; - -exports.isDark = false; -exports.cssClass = "ace-tm"; -exports.cssText = ".ace-tm .ace_gutter {\ -background: #f0f0f0;\ -color: #333;\ -}\ -.ace-tm .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-tm .ace_fold {\ -background-color: #6B72E6;\ -}\ -.ace-tm {\ -background-color: #FFFFFF;\ -color: black;\ -}\ -.ace-tm .ace_cursor {\ -color: black;\ -}\ -.ace-tm .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-tm .ace_storage,\ -.ace-tm .ace_keyword {\ -color: blue;\ -}\ -.ace-tm .ace_constant {\ -color: rgb(197, 6, 11);\ -}\ -.ace-tm .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-tm .ace_constant.ace_language {\ -color: rgb(88, 92, 246);\ -}\ -.ace-tm .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-tm .ace_invalid {\ -background-color: rgba(255, 0, 0, 0.1);\ -color: red;\ -}\ -.ace-tm .ace_support.ace_function {\ -color: rgb(60, 76, 114);\ -}\ -.ace-tm .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-tm .ace_support.ace_type,\ -.ace-tm .ace_support.ace_class {\ -color: rgb(109, 121, 222);\ -}\ -.ace-tm .ace_keyword.ace_operator {\ -color: rgb(104, 118, 135);\ -}\ -.ace-tm .ace_string {\ -color: rgb(3, 106, 7);\ -}\ -.ace-tm .ace_comment {\ -color: rgb(76, 136, 107);\ -}\ -.ace-tm .ace_comment.ace_doc {\ -color: rgb(0, 102, 255);\ -}\ -.ace-tm .ace_comment.ace_doc.ace_tag {\ -color: rgb(128, 159, 191);\ -}\ -.ace-tm .ace_constant.ace_numeric {\ -color: rgb(0, 0, 205);\ -}\ -.ace-tm .ace_variable {\ -color: rgb(49, 132, 149);\ -}\ -.ace-tm .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-tm .ace_entity.ace_name.ace_function {\ -color: #0000A2;\ -}\ -.ace-tm .ace_heading {\ -color: rgb(12, 7, 255);\ -}\ -.ace-tm .ace_list {\ -color:rgb(185, 6, 144);\ -}\ -.ace-tm .ace_meta.ace_tag {\ -color:rgb(0, 22, 142);\ -}\ -.ace-tm .ace_string.ace_regex {\ -color: rgb(255, 0, 0)\ -}\ -.ace-tm .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-tm.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px white;\ -}\ -.ace-tm .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-tm .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-tm .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-tm .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.07);\ -}\ -.ace-tm .ace_gutter-active-line {\ -background-color : #dcdcdc;\ -}\ -.ace-tm .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-tm .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}\ -"; -exports.$id = "ace/theme/textmate"; - -var dom = require("../lib/dom"); -dom.importCssString(exports.cssText, exports.cssClass, false); -}); - -define("ace/line_widgets",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; - -var dom = require("./lib/dom"); - -function LineWidgets(session) { - this.session = session; - this.session.widgetManager = this; - this.session.getRowLength = this.getRowLength; - this.session.$getWidgetScreenLength = this.$getWidgetScreenLength; - this.updateOnChange = this.updateOnChange.bind(this); - this.renderWidgets = this.renderWidgets.bind(this); - this.measureWidgets = this.measureWidgets.bind(this); - this.session._changedWidgets = []; - this.$onChangeEditor = this.$onChangeEditor.bind(this); - - this.session.on("change", this.updateOnChange); - this.session.on("changeFold", this.updateOnFold); - this.session.on("changeEditor", this.$onChangeEditor); -} - -(function() { - this.getRowLength = function(row) { - var h; - if (this.lineWidgets) - h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; - else - h = 0; - if (!this.$useWrapMode || !this.$wrapData[row]) { - return 1 + h; - } else { - return this.$wrapData[row].length + 1 + h; + this.getSelectedText = function () { + var text = ""; + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var ranges = this.multiSelect.rangeList.ranges; + var buf = []; + for (var i = 0; i < ranges.length; i++) { + buf.push(this.session.getTextRange(ranges[i])); + } + var nl = this.session.getDocument().getNewLineCharacter(); + text = buf.join(nl); + if (text.length == (buf.length - 1) * nl.length) + text = ""; + } + else if (!this.selection.isEmpty()) { + text = this.session.getTextRange(this.getSelectionRange()); } + return text; }; - - this.$getWidgetScreenLength = function() { - var screenRows = 0; - this.lineWidgets.forEach(function(w){ - if (w && w.rowCount && !w.hidden) - screenRows += w.rowCount; - }); - return screenRows; - }; - - this.$onChangeEditor = function(e) { - this.attach(e.editor); + this.$checkMultiselectChange = function (e, anchor) { + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var range = this.multiSelect.ranges[0]; + if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor) + return; + var pos = anchor == this.multiSelect.anchor + ? range.cursor == range.start ? range.end : range.start + : range.cursor; + if (pos.row != anchor.row + || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column) + this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange()); + else + this.multiSelect.mergeOverlappingRanges(); + } }; - - this.attach = function(editor) { - if (editor && editor.widgetManager && editor.widgetManager != this) - editor.widgetManager.detach(); - - if (this.editor == editor) - return; - - this.detach(); - this.editor = editor; - - if (editor) { - editor.widgetManager = this; - editor.renderer.on("beforeRender", this.measureWidgets); - editor.renderer.on("afterRender", this.renderWidgets); + this.findAll = function (needle, options, additive) { + options = options || {}; + options.needle = needle || options.needle; + if (options.needle == undefined) { + var range = this.selection.isEmpty() + ? this.selection.getWordRange() + : this.selection.getRange(); + options.needle = this.session.getTextRange(range); + } + this.$search.set(options); + var ranges = this.$search.findAll(this.session); + if (!ranges.length) + return 0; + var selection = this.multiSelect; + if (!additive) + selection.toSingleRange(ranges[0]); + for (var i = ranges.length; i--;) + selection.addRange(ranges[i], true); + if (range && selection.rangeList.rangeAtPoint(range.start)) + selection.addRange(range, true); + return ranges.length; + }; + this.selectMoreLines = function (dir, skip) { + var range = this.selection.toOrientedRange(); + var isBackwards = range.cursor == range.end; + var screenLead = this.session.documentToScreenPosition(range.cursor); + if (this.selection.$desiredColumn) + screenLead.column = this.selection.$desiredColumn; + var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column); + if (!range.isEmpty()) { + var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start); + var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column); + } + else { + var anchor = lead; + } + if (isBackwards) { + var newRange = Range.fromPoints(lead, anchor); + newRange.cursor = newRange.start; + } + else { + var newRange = Range.fromPoints(anchor, lead); + newRange.cursor = newRange.end; + } + newRange.desiredColumn = screenLead.column; + if (!this.selection.inMultiSelectMode) { + this.selection.addRange(range); } + else { + if (skip) + var toRemove = range.cursor; + } + this.selection.addRange(newRange); + if (toRemove) + this.selection.substractPoint(toRemove); }; - this.detach = function(e) { - var editor = this.editor; - if (!editor) - return; - - this.editor = null; - editor.widgetManager = null; - - editor.renderer.off("beforeRender", this.measureWidgets); - editor.renderer.off("afterRender", this.renderWidgets); - var lineWidgets = this.session.lineWidgets; - lineWidgets && lineWidgets.forEach(function(w) { - if (w && w.el && w.el.parentNode) { - w._inDocument = false; - w.el.parentNode.removeChild(w.el); + this.transposeSelections = function (dir) { + var session = this.session; + var sel = session.multiSelect; + var all = sel.ranges; + for (var i = all.length; i--;) { + var range = all[i]; + if (range.isEmpty()) { + var tmp_1 = session.getWordRange(range.start.row, range.start.column); + range.start.row = tmp_1.start.row; + range.start.column = tmp_1.start.column; + range.end.row = tmp_1.end.row; + range.end.column = tmp_1.end.column; } - }); + } + sel.mergeOverlappingRanges(); + var words = []; + for (var i = all.length; i--;) { + var range = all[i]; + words.unshift(session.getTextRange(range)); + } + if (dir < 0) + words.unshift(words.pop()); + else + words.push(words.shift()); + for (var i = all.length; i--;) { + var range = all[i]; + var tmp = range.clone(); + session.replace(range, words[i]); + range.start.row = tmp.start.row; + range.start.column = tmp.start.column; + } + sel.fromOrientedRange(sel.ranges[0]); }; - - this.updateOnFold = function(e, session) { - var lineWidgets = session.lineWidgets; - if (!lineWidgets || !e.action) - return; - var fold = e.data; - var start = fold.start.row; - var end = fold.end.row; - var hide = e.action == "add"; - for (var i = start + 1; i < end; i++) { - if (lineWidgets[i]) - lineWidgets[i].hidden = hide; + this.selectMore = function (dir, skip, stopAtFirst) { + var session = this.session; + var sel = session.multiSelect; + var range = sel.toOrientedRange(); + if (range.isEmpty()) { + range = session.getWordRange(range.start.row, range.start.column); + range.cursor = dir == -1 ? range.start : range.end; + this.multiSelect.addRange(range); + if (stopAtFirst) + return; } - if (lineWidgets[end]) { - if (hide) { - if (!lineWidgets[start]) - lineWidgets[start] = lineWidgets[end]; - else - lineWidgets[end].hidden = hide; - } else { - if (lineWidgets[start] == lineWidgets[end]) - lineWidgets[start] = undefined; - lineWidgets[end].hidden = hide; - } + var needle = session.getTextRange(range); + var newRange = find(session, needle, dir); + if (newRange) { + newRange.cursor = dir == -1 ? newRange.start : newRange.end; + this.session.unfold(newRange); + this.multiSelect.addRange(newRange); + this.renderer.scrollCursorIntoView(null, 0.5); } + if (skip) + this.multiSelect.substractPoint(range.cursor); }; - - this.updateOnChange = function(delta) { - var lineWidgets = this.session.lineWidgets; - if (!lineWidgets) return; - - var startRow = delta.start.row; - var len = delta.end.row - startRow; - - if (len === 0) { - } else if (delta.action == "remove") { - var removed = lineWidgets.splice(startRow + 1, len); - if (!lineWidgets[startRow] && removed[removed.length - 1]) { - lineWidgets[startRow] = removed.pop(); + this.alignCursors = function () { + var session = this.session; + var sel = session.multiSelect; + var ranges = sel.ranges; + var row = -1; + var sameRowRanges = ranges.filter(function (r) { + if (r.cursor.row == row) + return true; + row = r.cursor.row; + }); + if (!ranges.length || sameRowRanges.length == ranges.length - 1) { + var range = this.selection.getRange(); + var fr = range.start.row, lr = range.end.row; + var guessRange = fr == lr; + if (guessRange) { + var max = this.session.getLength(); + var line; + do { + line = this.session.getLine(lr); + } while (/[=:]/.test(line) && ++lr < max); + do { + line = this.session.getLine(fr); + } while (/[=:]/.test(line) && --fr > 0); + if (fr < 0) + fr = 0; + if (lr >= max) + lr = max - 1; } - removed.forEach(function(w) { - w && this.removeLineWidget(w); - }, this); - this.$updateRows(); - } else { - var args = new Array(len); - if (lineWidgets[startRow] && lineWidgets[startRow].column != null) { - if (delta.start.column > lineWidgets[startRow].column) - startRow++; + var lines = this.session.removeFullLines(fr, lr); + lines = this.$reAlignText(lines, guessRange); + this.session.insert({ row: fr, column: 0 }, lines.join("\n") + "\n"); + if (!guessRange) { + range.start.column = 0; + range.end.column = lines[lines.length - 1].length; } - args.unshift(startRow, 0); - lineWidgets.splice.apply(lineWidgets, args); - this.$updateRows(); + this.selection.setRange(range); + } + else { + sameRowRanges.forEach(function (r) { + sel.substractPoint(r.cursor); + }); + var maxCol = 0; + var minSpace = Infinity; + var spaceOffsets = ranges.map(function (r) { + var p = r.cursor; + var line = session.getLine(p.row); + var spaceOffset = line.substr(p.column).search(/\S/g); + if (spaceOffset == -1) + spaceOffset = 0; + if (p.column > maxCol) + maxCol = p.column; + if (spaceOffset < minSpace) + minSpace = spaceOffset; + return spaceOffset; + }); + ranges.forEach(function (r, i) { + var p = r.cursor; + var l = maxCol - p.column; + var d = spaceOffsets[i] - minSpace; + if (l > d) + session.insert(p, lang.stringRepeat(" ", l - d)); + else + session.remove(new Range(p.row, p.column, p.row, p.column - l + d)); + r.start.column = r.end.column = maxCol; + r.start.row = r.end.row = p.row; + r.cursor = r.end; + }); + sel.fromOrientedRange(ranges[0]); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); } }; - - this.$updateRows = function() { - var lineWidgets = this.session.lineWidgets; - if (!lineWidgets) return; - var noWidgets = true; - lineWidgets.forEach(function(w, i) { - if (w) { - noWidgets = false; - w.row = i; - while (w.$oldWidget) { - w.$oldWidget.row = i; - w = w.$oldWidget; - } - } - }); - if (noWidgets) - this.session.lineWidgets = null; - }; - - this.$registerLineWidget = function(w) { - if (!this.session.lineWidgets) - this.session.lineWidgets = new Array(this.session.getLength()); - - var old = this.session.lineWidgets[w.row]; - if (old) { - w.$oldWidget = old; - if (old.el && old.el.parentNode) { - old.el.parentNode.removeChild(old.el); - old._inDocument = false; + this.$reAlignText = function (lines, forceLeft) { + var isLeftAligned = true, isRightAligned = true; + var startW, textW, endW; + return lines.map(function (line) { + var m = line.match(/(\s*)(.*?)(\s*)([=:].*)/); + if (!m) + return [line]; + if (startW == null) { + startW = m[1].length; + textW = m[2].length; + endW = m[3].length; + return m; } + if (startW + textW + endW != m[1].length + m[2].length + m[3].length) + isRightAligned = false; + if (startW != m[1].length) + isLeftAligned = false; + if (startW > m[1].length) + startW = m[1].length; + if (textW < m[2].length) + textW = m[2].length; + if (endW > m[3].length) + endW = m[3].length; + return m; + }).map(forceLeft ? alignLeft : + isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign); + function spaces(n) { + return lang.stringRepeat(" ", n); } - - this.session.lineWidgets[w.row] = w; - return w; - }; - - this.addLineWidget = function(w) { - this.$registerLineWidget(w); - w.session = this.session; - - if (!this.editor) return w; - - var renderer = this.editor.renderer; - if (w.html && !w.el) { - w.el = dom.createElement("div"); - w.el.innerHTML = w.html; + function alignLeft(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(textW - m[2].length + endW) + + m[4].replace(/^([=:])\s+/, "$1 "); } - if (w.el) { - dom.addCssClass(w.el, "ace_lineWidgetContainer"); - w.el.style.position = "absolute"; - w.el.style.zIndex = 5; - renderer.container.appendChild(w.el); - w._inDocument = true; - - if (!w.coverGutter) { - w.el.style.zIndex = 3; - } - if (w.pixelHeight == null) { - w.pixelHeight = w.el.offsetHeight; + function alignRight(m) { + return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2] + + spaces(endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + function unAlign(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + }; +}).call(Editor.prototype); +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} +exports.onSessionChange = function (e) { + var session = e.session; + if (session && !session.multiSelect) { + session.$selectionMarkers = []; + session.selection.$initRangeList(); + session.multiSelect = session.selection; + } + this.multiSelect = session && session.multiSelect; + var oldSession = e.oldSession; + if (oldSession) { + oldSession.multiSelect.off("addRange", this.$onAddRange); + oldSession.multiSelect.off("removeRange", this.$onRemoveRange); + oldSession.multiSelect.off("multiSelect", this.$onMultiSelect); + oldSession.multiSelect.off("singleSelect", this.$onSingleSelect); + oldSession.multiSelect.lead.off("change", this.$checkMultiselectChange); + oldSession.multiSelect.anchor.off("change", this.$checkMultiselectChange); + } + if (session) { + session.multiSelect.on("addRange", this.$onAddRange); + session.multiSelect.on("removeRange", this.$onRemoveRange); + session.multiSelect.on("multiSelect", this.$onMultiSelect); + session.multiSelect.on("singleSelect", this.$onSingleSelect); + session.multiSelect.lead.on("change", this.$checkMultiselectChange); + session.multiSelect.anchor.on("change", this.$checkMultiselectChange); + } + if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) { + if (session.selection.inMultiSelectMode) + this.$onMultiSelect(); + else + this.$onSingleSelect(); + } +}; +function MultiSelect(editor) { + if (editor.$multiselectOnSessionChange) + return; + editor.$onAddRange = editor.$onAddRange.bind(editor); + editor.$onRemoveRange = editor.$onRemoveRange.bind(editor); + editor.$onMultiSelect = editor.$onMultiSelect.bind(editor); + editor.$onSingleSelect = editor.$onSingleSelect.bind(editor); + editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor); + editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor); + editor.$multiselectOnSessionChange(editor); + editor.on("changeSession", editor.$multiselectOnSessionChange); + editor.on("mousedown", onMouseDown); + editor.commands.addCommands(commands.defaultCommands); + addAltCursorListeners(editor); +} +function addAltCursorListeners(editor) { + if (!editor.textInput) + return; + var el = editor.textInput.getElement(); + var altCursor = false; + event.addListener(el, "keydown", function (e) { + var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey); + if (editor.$blockSelectEnabled && altDown) { + if (!altCursor) { + editor.renderer.setMouseCursor("crosshair"); + altCursor = true; } } - if (w.rowCount == null) { - w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight; + else if (altCursor) { + reset(); } - - var fold = this.session.getFoldAt(w.row, 0); - w.$fold = fold; - if (fold) { - var lineWidgets = this.session.lineWidgets; - if (w.row == fold.end.row && !lineWidgets[fold.start.row]) - lineWidgets[fold.start.row] = w; - else - w.hidden = true; + }, editor); + event.addListener(el, "keyup", reset, editor); + event.addListener(el, "blur", reset, editor); + function reset(e) { + if (altCursor) { + editor.renderer.setMouseCursor(""); + altCursor = false; } - - this.session._emit("changeFold", {data:{start:{row: w.row}}}); - - this.$updateRows(); - this.renderWidgets(null, renderer); - this.onWidgetChanged(w); - return w; - }; - - this.removeLineWidget = function(w) { - w._inDocument = false; - w.session = null; - if (w.el && w.el.parentNode) - w.el.parentNode.removeChild(w.el); - if (w.editor && w.editor.destroy) try { - w.editor.destroy(); - } catch(e){} - if (this.session.lineWidgets) { - var w1 = this.session.lineWidgets[w.row]; - if (w1 == w) { - this.session.lineWidgets[w.row] = w.$oldWidget; - if (w.$oldWidget) - this.onWidgetChanged(w.$oldWidget); - } else { - while (w1) { - if (w1.$oldWidget == w) { - w1.$oldWidget = w.$oldWidget; - break; - } - w1 = w1.$oldWidget; - } + } +} +exports.MultiSelect = MultiSelect; +require("./config").defineOptions(Editor.prototype, "editor", { + enableMultiselect: { + set: function (val) { + MultiSelect(this); + if (val) { + this.on("mousedown", onMouseDown); } - } - this.session._emit("changeFold", {data:{start:{row: w.row}}}); - this.$updateRows(); - }; - - this.getWidgetsAtRow = function(row) { - var lineWidgets = this.session.lineWidgets; - var w = lineWidgets && lineWidgets[row]; - var list = []; - while (w) { - list.push(w); - w = w.$oldWidget; - } - return list; + else { + this.off("mousedown", onMouseDown); + } + }, + value: true + }, + enableBlockSelect: { + set: function (val) { + this.$blockSelectEnabled = val; + }, + value: true + } +}); + +}); + +define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var Range = require("../../range").Range; +var FoldMode = exports.FoldMode = function () { }; +(function () { + this.foldingStartMarker = null; + this.foldingStopMarker = null; + this.getFoldWidget = function (session, foldStyle, row) { + var line = session.getLine(row); + if (this.foldingStartMarker.test(line)) + return "start"; + if (foldStyle == "markbeginend" + && this.foldingStopMarker + && this.foldingStopMarker.test(line)) + return "end"; + return ""; }; - - this.onWidgetChanged = function(w) { - this.session._changedWidgets.push(w); - this.editor && this.editor.renderer.updateFull(); + this.getFoldWidgetRange = function (session, foldStyle, row) { + return null; }; - - this.measureWidgets = function(e, renderer) { - var changedWidgets = this.session._changedWidgets; - var config = renderer.layerConfig; - - if (!changedWidgets || !changedWidgets.length) return; - var min = Infinity; - for (var i = 0; i < changedWidgets.length; i++) { - var w = changedWidgets[i]; - if (!w || !w.el) continue; - if (w.session != this.session) continue; - if (!w._inDocument) { - if (this.session.lineWidgets[w.row] != w) - continue; - w._inDocument = true; - renderer.container.appendChild(w.el); - } - - w.h = w.el.offsetHeight; - - if (!w.fixedWidth) { - w.w = w.el.offsetWidth; - w.screenWidth = Math.ceil(w.w / config.characterWidth); - } - - var rowCount = w.h / config.lineHeight; - if (w.coverLine) { - rowCount -= this.session.getRowLineCount(w.row); - if (rowCount < 0) - rowCount = 0; - } - if (w.rowCount != rowCount) { - w.rowCount = rowCount; - if (w.row < min) - min = w.row; + this.indentationBlock = function (session, row, column) { + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1) + return; + var startColumn = column || line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + while (++row < maxRow) { + var level = session.getLine(row).search(re); + if (level == -1) + continue; + if (level <= startLevel) { + var token = session.getTokenAt(row, 0); + if (!token || token.type !== "string") + break; } + endRow = row; } - if (min != Infinity) { - this.session._emit("changeFold", {data:{start:{row: min}}}); - this.session.lineWidgetWidth = null; + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); } - this.session._changedWidgets = []; }; - - this.renderWidgets = function(e, renderer) { - var config = renderer.layerConfig; - var lineWidgets = this.session.lineWidgets; - if (!lineWidgets) + this.openingBracketBlock = function (session, bracket, row, column, typeRe) { + var start = { row: row, column: column + 1 }; + var end = session.$findClosingBracket(bracket, start, typeRe); + if (!end) return; - var first = Math.min(this.firstRow, config.firstRow); - var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length); - - while (first > 0 && !lineWidgets[first]) - first--; - - this.firstRow = config.firstRow; - this.lastRow = config.lastRow; - - renderer.$cursorLayer.config = config; - for (var i = first; i <= last; i++) { - var w = lineWidgets[i]; - if (!w || !w.el) continue; - if (w.hidden) { - w.el.style.top = -100 - (w.pixelHeight || 0) + "px"; - continue; - } - if (!w._inDocument) { - w._inDocument = true; - renderer.container.appendChild(w.el); - } - var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top; - if (!w.coverLine) - top += config.lineHeight * this.session.getRowLineCount(w.row); - w.el.style.top = top - config.offset + "px"; - - var left = w.coverGutter ? 0 : renderer.gutterWidth; - if (!w.fixedWidth) - left -= renderer.scrollLeft; - w.el.style.left = left + "px"; - - if (w.fullWidth && w.screenWidth) { - w.el.style.minWidth = config.width + 2 * config.padding + "px"; - } - - if (w.fixedWidth) { - w.el.style.right = renderer.scrollBar.getWidth() + "px"; - } else { - w.el.style.right = ""; - } + var fw = session.foldWidgets[end.row]; + if (fw == null) + fw = session.getFoldWidget(end.row); + if (fw == "start" && end.row > start.row) { + end.row--; + end.column = session.getLine(end.row).length; } + return Range.fromPoints(start, end); }; - -}).call(LineWidgets.prototype); - - -exports.LineWidgets = LineWidgets; + this.closingBracketBlock = function (session, bracket, row, column, typeRe) { + var end = { row: row, column: column }; + var start = session.$findOpeningBracket(bracket, end); + if (!start) + return; + start.column++; + end.column--; + return Range.fromPoints(start, end); + }; +}).call(FoldMode.prototype); }); -define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"], function(require, exports, module) { +define("ace/ext/error_marker",["require","exports","module","ace/lib/dom","ace/range","ace/config"], function(require, exports, module){/** + * ## Error Marker extension + * + * Provides inline error display functionality for Ace editor. Creates visual error markers that appear as tooltips + * below editor lines containing annotations (errors, warnings, info). Enables navigation between error locations with + * keyboard shortcuts and displays context-sensitive messages with proper styling based on annotation severity. + * + * @module + */ "use strict"; -var LineWidgets = require("../line_widgets").LineWidgets; var dom = require("../lib/dom"); var Range = require("../range").Range; - +var nls = require("../config").nls; function binarySearch(array, needle, comparator) { var first = 0; var last = array.length - 1; - while (first <= last) { var mid = (first + last) >> 1; var c = comparator(needle, array[mid]); @@ -21315,25 +21837,20 @@ function binarySearch(array, needle, comparator) { } return -(first + 1); } - function findAnnotations(session, row, dir) { var annotations = session.getAnnotations().sort(Range.comparePoints); if (!annotations.length) return; - - var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints); + var i = binarySearch(annotations, { row: row, column: -1 }, Range.comparePoints); if (i < 0) i = -i - 1; - if (i >= annotations.length) i = dir > 0 ? 0 : annotations.length - 1; else if (i === 0 && dir < 0) i = annotations.length - 1; - var annotation = annotations[i]; if (!annotation || !dir) return; - if (annotation.row === row) { do { annotation = annotations[i += dir]; @@ -21341,8 +21858,6 @@ function findAnnotations(session, row, dir) { if (!annotation) return annotations.slice(); } - - var matched = []; row = annotation.row; do { @@ -21351,22 +21866,17 @@ function findAnnotations(session, row, dir) { } while (annotation && annotation.row == row); return matched.length && matched; } - -exports.showErrorMarker = function(editor, dir) { +exports.showErrorMarker = function (editor, dir) { var session = editor.session; - if (!session.widgetManager) { - session.widgetManager = new LineWidgets(session); - session.widgetManager.attach(editor); - } - var pos = editor.getCursorPosition(); var row = pos.row; - var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) { + var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function (w) { return w.type == "errorMarker"; })[0]; if (oldWidget) { oldWidget.destroy(); - } else { + } + else { row -= dir; } var annotations = findAnnotations(session, row, dir); @@ -21378,19 +21888,20 @@ exports.showErrorMarker = function(editor, dir) { : annotation.column) || 0; pos.row = annotation.row; gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row]; - } else if (oldWidget) { + } + else if (oldWidget) { return; - } else { + } + else { gutterAnno = { - text: ["Looks good!"], + displayText: [nls("error-marker.good-state", "Looks good!")], className: "ace_ok" }; } editor.session.unfold(pos.row); editor.selection.moveToPosition(pos); - var w = { - row: pos.row, + row: pos.row, fixedWidth: true, coverGutter: true, el: dom.createElement("div"), @@ -21399,25 +21910,25 @@ exports.showErrorMarker = function(editor, dir) { var el = w.el.appendChild(dom.createElement("div")); var arrow = w.el.appendChild(dom.createElement("div")); arrow.className = "error_widget_arrow " + gutterAnno.className; - var left = editor.renderer.$cursorLayer .getPixelPosition(pos).left; arrow.style.left = left + editor.renderer.gutterWidth - 5 + "px"; - w.el.className = "error_widget_wrapper"; el.className = "error_widget " + gutterAnno.className; - el.innerHTML = gutterAnno.text.join("
"); - + gutterAnno.displayText.forEach(function (annoTextLine, i) { + el.appendChild(dom.createTextNode(annoTextLine)); + if (i < gutterAnno.displayText.length - 1) { + el.appendChild(dom.createElement("br")); + } + }); el.appendChild(dom.createElement("div")); - - var kb = function(_, hashId, keyString) { + var kb = function (_, hashId, keyString) { if (hashId === 0 && (keyString === "esc" || keyString === "return")) { w.destroy(); - return {command: "null"}; + return { command: "null" }; } }; - - w.destroy = function() { + w.destroy = function () { if (editor.$mouseHandler.isMousePressed) return; editor.keyBinding.removeKeyboardHandler(kb); @@ -21427,66 +21938,27 @@ exports.showErrorMarker = function(editor, dir) { editor.off("mouseup", w.destroy); editor.off("change", w.destroy); }; - editor.keyBinding.addKeyboardHandler(kb); editor.on("changeSelection", w.destroy); editor.on("changeSession", w.destroy); editor.on("mouseup", w.destroy); editor.on("change", w.destroy); - editor.session.widgetManager.addLineWidget(w); - w.el.onmousedown = editor.focus.bind(editor); - - editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight}); + editor.renderer.scrollCursorIntoView(null, 0.5, { bottom: w.el.offsetHeight }); }; - - -dom.importCssString("\ - .error_widget_wrapper {\ - background: inherit;\ - color: inherit;\ - border:none\ - }\ - .error_widget {\ - border-top: solid 2px;\ - border-bottom: solid 2px;\ - margin: 5px 0;\ - padding: 10px 40px;\ - white-space: pre-wrap;\ - }\ - .error_widget.ace_error, .error_widget_arrow.ace_error{\ - border-color: #ff5a5a\ - }\ - .error_widget.ace_warning, .error_widget_arrow.ace_warning{\ - border-color: #F1D817\ - }\ - .error_widget.ace_info, .error_widget_arrow.ace_info{\ - border-color: #5a5a5a\ - }\ - .error_widget.ace_ok, .error_widget_arrow.ace_ok{\ - border-color: #5aaa5a\ - }\ - .error_widget_arrow {\ - position: absolute;\ - border: solid 5px;\ - border-top-color: transparent!important;\ - border-right-color: transparent!important;\ - border-left-color: transparent!important;\ - top: -5px;\ - }\ -", "error_marker.css", false); +dom.importCssString("\n .error_widget_wrapper {\n background: inherit;\n color: inherit;\n border:none\n }\n .error_widget {\n border-top: solid 2px;\n border-bottom: solid 2px;\n margin: 5px 0;\n padding: 10px 40px;\n white-space: pre-wrap;\n }\n .error_widget.ace_error, .error_widget_arrow.ace_error{\n border-color: #ff5a5a\n }\n .error_widget.ace_warning, .error_widget_arrow.ace_warning{\n border-color: #F1D817\n }\n .error_widget.ace_info, .error_widget_arrow.ace_info{\n border-color: #5a5a5a\n }\n .error_widget.ace_ok, .error_widget_arrow.ace_ok{\n border-color: #5aaa5a\n }\n .error_widget_arrow {\n position: absolute;\n border: solid 5px;\n border-top-color: transparent!important;\n border-right-color: transparent!important;\n border-left-color: transparent!important;\n top: -5px;\n }\n", "error_marker.css", false); }); -define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/range","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"], function(require, exports, module) { +define("ace/ace",["require","exports","module","ace/lib/dom","ace/range","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config","ace/loader_build"], function(require, exports, module){/** + * The main class required to set up an Ace instance in the browser. + * + * @namespace Ace + **/ "use strict"; - -require("./lib/fixoldbrowsers"); - +require("./loader_build")(exports) var dom = require("./lib/dom"); -var event = require("./lib/event"); - var Range = require("./range").Range; var Editor = require("./editor").Editor; var EditSession = require("./edit_session").EditSession; @@ -21499,53 +21971,43 @@ require("./multi_select"); require("./mode/folding/fold_mode"); require("./theme/textmate"); require("./ext/error_marker"); - exports.config = require("./config"); -exports.require = require; - -if (typeof define === "function") - exports.define = define; -exports.edit = function(el, options) { +exports.edit = function (el, options) { if (typeof el == "string") { var _id = el; el = document.getElementById(_id); if (!el) throw new Error("ace.edit can't find div #" + _id); } - if (el && el.env && el.env.editor instanceof Editor) return el.env.editor; - var value = ""; if (el && /input|textarea/i.test(el.tagName)) { var oldNode = el; value = oldNode.value; el = dom.createElement("pre"); oldNode.parentNode.replaceChild(el, oldNode); - } else if (el) { + } + else if (el) { value = el.textContent; el.innerHTML = ""; } - var doc = exports.createEditSession(value); - var editor = new Editor(new Renderer(el), doc, options); - var env = { document: doc, editor: editor, onResize: editor.resize.bind(editor, null) }; - if (oldNode) env.textarea = oldNode; - event.addListener(window, "resize", env.onResize); - editor.on("destroy", function() { - event.removeListener(window, "resize", env.onResize); + if (oldNode) + env.textarea = oldNode; + editor.on("destroy", function () { env.editor.container.env = null; // prevent memory leak on old ie }); editor.container.env = editor.env = env; return editor; }; -exports.createEditSession = function(text, mode) { +exports.createEditSession = function (text, mode) { var doc = new EditSession(text, mode); doc.setUndoManager(new UndoManager()); return doc; @@ -21555,20 +22017,28 @@ exports.Editor = Editor; exports.EditSession = EditSession; exports.UndoManager = UndoManager; exports.VirtualRenderer = Renderer; -exports.version = exports.config.version; +var version = exports.config.version; +exports.version = version; + }); (function() { window.require(["ace/ace"], function(a) { if (a) { a.config.init(true); a.define = window.define; } - if (!window.ace) - window.ace = a; + var global = (function () { + return this; + })(); + if (!global && typeof window != "undefined") global = window; // can happen in strict mode + if (!global && typeof self != "undefined") global = self; // can happen in webworker + + if (!global.ace) + global.ace = a; for (var key in a) if (a.hasOwnProperty(key)) - window.ace[key] = a[key]; - window.ace["default"] = window.ace; + global.ace[key] = a[key]; + global.ace["default"] = global.ace; if (typeof module == "object" && typeof exports == "object" && module) { - module.exports = window.ace; + module.exports = global.ace; } }); })(); diff --git a/app/Resources/ui/js/ace/ext-beautify.js b/app/Resources/ui/js/ace/ext-beautify.js index 6c8826f3..b17ea0bd 100644 --- a/app/Resources/ui/js/ace/ext-beautify.js +++ b/app/Resources/ui/js/ace/ext-beautify.js @@ -1,18 +1,28 @@ -define("ace/ext/beautify",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +define("ace/ext/beautify",["require","exports","module","ace/token_iterator"], function(require, exports, module){/** + * ## Code beautification and formatting extension. + * + * **This extension is considered outdated.** For better formatting support with modern language servers + * and advanced formatting capabilities, consider using [ace-linters](https://github.com/mkslanc/ace-linters) + * which provides comprehensive language support including formatting, linting, and IntelliSense features. + * + * This legacy extension provides basic formatting for HTML, CSS, JavaScript, and PHP code with support for + * proper indentation, whitespace management, line breaks, and bracket alignment. It handles various language + * constructs including HTML tags, CSS selectors, JavaScript operators, control structures, and maintains + * consistent code style throughout the document. + * + * @module + */ "use strict"; var TokenIterator = require("../token_iterator").TokenIterator; - function is(token, type) { return token.type.lastIndexOf(type + ".xml") > -1; } exports.singletonTags = ["area", "base", "br", "col", "command", "embed", "hr", "html", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; exports.blockTags = ["article", "aside", "blockquote", "body", "div", "dl", "fieldset", "footer", "form", "head", "header", "html", "nav", "ol", "p", "script", "section", "style", "table", "tbody", "tfoot", "thead", "ul"]; - exports.formatOptions = { lineBreaksAfterCommasInCurlyBlock: true }; - -exports.beautify = function(session) { +exports.beautify = function (session) { var iterator = new TokenIterator(session, 0, 0); var token = iterator.getCurrentToken(); var tabString = session.getTabString(); @@ -43,40 +53,32 @@ exports.beautify = function(session) { var inTag = false; var inCSS = false; var inBlock = false; - var levels = {0: 0}; + var levels = { 0: 0 }; var parents = []; var caseBody = false; - - var trimNext = function() { + var trimNext = function () { if (nextToken && nextToken.value && nextToken.type !== 'string.regexp') nextToken.value = nextToken.value.replace(/^\s*/, ""); }; - - var trimLine = function() { + var trimLine = function () { var end = code.length - 1; - while (true) { if (end == 0) break; if (code[end] !== " ") break; - end = end - 1; } - code = code.slice(0, end + 1); }; - - var trimCode = function() { + var trimCode = function () { code = code.trimRight(); breakBefore = false; }; - while (token !== null) { curRow = iterator.getCurrentTokenRow(); rowTokens = iterator.$rowTokens; nextToken = iterator.stepForward(); - if (typeof token !== "undefined") { value = token.value; unindent = 0; @@ -88,18 +90,19 @@ exports.beautify = function(session) { if (value === " 0; rowsToAdd--) code += "\n"; - breakBefore = true; if (!is(token, "comment") && !token.type.match(/^(comment|string)$/)) - value = value.trimLeft(); + value = value.trimLeft(); } - if (value) { if (token.type === "keyword" && value.match(/^(if|else|elseif|for|foreach|while|switch)$/)) { parents[depth] = value; - trimNext(); spaceAfter = true; if (value.match(/^(else|elseif)$/)) { @@ -134,13 +132,13 @@ exports.beautify = function(session) { spaceBefore = true; } } - } else if (token.type === "paren.lparen") { + } + else if (token.type === "paren.lparen") { trimNext(); if (value.substr(-1) === "{") { spaceAfter = true; indentNextLine = false; - - if(!inTag) + if (!inTag) rowsToAdd = 1; } if (value.substr(0, 1) === "{") { @@ -148,25 +146,27 @@ exports.beautify = function(session) { if (code.substr(-1) !== '[' && code.trimRight().substr(-1) === '[') { trimCode(); spaceBefore = false; - } else if (code.trimRight().substr(-1) === ')') { + } + else if (code.trimRight().substr(-1) === ')') { trimCode(); - } else { + } + else { trimLine(); } } - } else if (token.type === "paren.rparen") { + } + else if (token.type === "paren.rparen") { unindent = 1; if (value.substr(0, 1) === "}") { - if (parents[depth-1] === 'case') + if (parents[depth - 1] === 'case') unindent++; - if (code.trimRight().substr(-1) === '{') { trimCode(); - } else { + } + else { spaceBefore = true; - if (inCSS) - rowsToAdd+=2; + rowsToAdd += 2; } } if (value.substr(0, 1) === "]") { @@ -183,80 +183,81 @@ exports.beautify = function(session) { trimCode(); } } - trimLine(); - } else if ((token.type === "keyword.operator" || token.type === "keyword") && value.match(/^(=|==|===|!=|!==|&&|\|\||and|or|xor|\+=|.=|>|>=|<|<=|=>)$/)) { + } + else if ((token.type === "keyword.operator" || token.type === "keyword") && value.match(/^(=|==|===|!=|!==|&&|\|\||and|or|xor|\+=|.=|>|>=|<|<=|=>)$/)) { trimCode(); trimNext(); spaceBefore = true; spaceAfter = true; - } else if (token.type === "punctuation.operator" && value === ';') { + } + else if (token.type === "punctuation.operator" && value === ';') { trimCode(); trimNext(); spaceAfter = true; - if (inCSS) rowsToAdd++; - } else if (token.type === "punctuation.operator" && value.match(/^(:|,)$/)) { + } + else if (token.type === "punctuation.operator" && value.match(/^(:|,)$/)) { trimCode(); trimNext(); - if (value.match(/^(,)$/) && curlyDepth>0 && roundDepth===0 && formatOptions.lineBreaksAfterCommasInCurlyBlock) { + if (value.match(/^(,)$/) && curlyDepth > 0 && roundDepth === 0 && formatOptions.lineBreaksAfterCommasInCurlyBlock) { rowsToAdd++; - } else { + } + else { spaceAfter = true; breakBefore = false; } - } else if (token.type === "support.php_tag" && value === "?>" && !breakBefore) { + } + else if (token.type === "support.php_tag" && value === "?>" && !breakBefore) { trimCode(); spaceBefore = true; - } else if (is(token, "attribute-name") && code.substr(-1).match(/^\s$/)) { + } + else if (is(token, "attribute-name") && code.substr(-1).match(/^\s$/)) { spaceBefore = true; - } else if (is(token, "attribute-equals")) { + } + else if (is(token, "attribute-equals")) { trimLine(); trimNext(); - } else if (is(token, "tag-close")) { + } + else if (is(token, "tag-close")) { trimLine(); - if(value === "/>") + if (value === "/>") spaceBefore = true; - } else if (token.type === "keyword" && value.match(/^(case|default)$/)) { + } + else if (token.type === "keyword" && value.match(/^(case|default)$/)) { if (caseBody) unindent = 1; } if (breakBefore && !(token.type.match(/^(comment)$/) && !value.substr(0, 1).match(/^[/#]$/)) && !(token.type.match(/^(string)$/) && !value.substr(0, 1).match(/^['"@]$/))) { - indent = lastIndent; - - if(depth > lastDepth) { + if (depth > lastDepth) { indent++; - - for (i=depth; i > lastDepth; i--) + for (i = depth; i > lastDepth; i--) levels[i] = indent; - } else if(depth < lastDepth) + } + else if (depth < lastDepth) indent = levels[depth]; - lastDepth = depth; lastIndent = indent; - - if(unindent) + if (unindent) indent -= unindent; - if (indentNextLine && !roundDepth) { indent++; indentNextLine = false; } - for (i = 0; i < indent; i++) code += tabString; } - if (token.type === "keyword" && value.match(/^(case|default)$/)) { if (caseBody === false) { parents[depth] = value; depth++; caseBody = true; } - } else if (token.type === "keyword" && value.match(/^(break)$/)) { - if(parents[depth-1] && parents[depth-1].match(/^(case|default)$/)) { + } + else if (token.type === "keyword" && value.match(/^(break)$/)) { + if (parents[depth - 1] && parents[depth - 1].match(/^(case|default)$/)) { depth--; caseBody = false; } @@ -266,25 +267,22 @@ exports.beautify = function(session) { curlyDepth += (value.match(/\{/g) || []).length; depth += value.length; } - if (token.type === "keyword" && value.match(/^(if|else|elseif|for|while)$/)) { indentNextLine = true; roundDepth = 0; - } else if (!roundDepth && value.trim() && token.type !== "comment") + } + else if (!roundDepth && value.trim() && token.type !== "comment") indentNextLine = false; - if (token.type === "paren.rparen") { roundDepth -= (value.match(/\)/g) || []).length; curlyDepth -= (value.match(/\}/g) || []).length; - for (i = 0; i < value.length; i++) { depth--; - if(value.substr(i, 1)==='}' && parents[depth]==='case') { + if (value.substr(i, 1) === '}' && parents[depth] === 'case') { depth--; } } } - if (token.type == "text") value = value.replace(/\s+$/, " "); if (spaceBefore && !breakBefore) { @@ -292,12 +290,9 @@ exports.beautify = function(session) { if (code.substr(-1) !== "\n") code += " "; } - code += value; - if (spaceAfter) code += " "; - breakBefore = false; spaceBefore = false; spaceAfter = false; @@ -310,36 +305,33 @@ exports.beautify = function(session) { if (nextToken && singletonTags.indexOf(nextToken.value) === -1) { if (is(token, "tag-open") && value === ""){ + } + else if (is(token, "tag-close") && value === "/>") { depth--; } } - if (is(token, "tag-name")) { tagName = value; } - row = curRow; } } - token = nextToken; } - code = code.trim(); session.doc.setValue(code); }; - exports.commands = [{ - name: "beautify", - description: "Format selection (Beautify)", - exec: function(editor) { - exports.beautify(editor.session); - }, - bindKey: "Ctrl-Shift-B" -}]; + name: "beautify", + description: "Format selection (Beautify)", + exec: function (editor) { + exports.beautify(editor.session); + }, + bindKey: "Ctrl-Shift-B" + }]; }); (function() { window.require(["ace/ext/beautify"], function(m) { diff --git a/app/Resources/ui/js/ace/ext-code_lens.js b/app/Resources/ui/js/ace/ext-code_lens.js index 19a4c201..a8d5aa5b 100644 --- a/app/Resources/ui/js/ace/ext-code_lens.js +++ b/app/Resources/ui/js/ace/ext-code_lens.js @@ -1,18 +1,21 @@ -define("ace/ext/code_lens",["require","exports","module","ace/line_widgets","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/code_lens",["require","exports","module","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/editor","ace/config"], function(require, exports, module){/** + * ## Code Lens extension. + * + * Displaying contextual information and clickable commands above code lines. Supports registering custom providers, + * rendering lens widgets with proper positioning and styling, and handling user interactions with lens commands. + * @module + */ "use strict"; -var LineWidgets = require("../line_widgets").LineWidgets; var event = require("../lib/event"); var lang = require("../lib/lang"); var dom = require("../lib/dom"); - function clearLensElements(renderer) { var textLayer = renderer.$textLayer; var lensElements = textLayer.$lenses; if (lensElements) - lensElements.forEach(function(el) {el.remove(); }); + lensElements.forEach(function (el) { el.remove(); }); textLayer.$lenses = null; } - function renderWidgets(changes, renderer) { var changed = changes & renderer.CHANGE_LINES || changes & renderer.CHANGE_FULL @@ -20,7 +23,6 @@ function renderWidgets(changes, renderer) { || changes & renderer.CHANGE_TEXT; if (!changed) return; - var session = renderer.session; var lineWidgets = renderer.session.lineWidgets; var textLayer = renderer.$textLayer; @@ -30,49 +32,42 @@ function renderWidgets(changes, renderer) { clearLensElements(renderer); return; } - var textCells = renderer.$textLayer.$lines.cells; var config = renderer.layerConfig; var padding = renderer.$padding; - if (!lensElements) lensElements = textLayer.$lenses = []; - - var index = 0; for (var i = 0; i < textCells.length; i++) { var row = textCells[i].row; var widget = lineWidgets[row]; var lenses = widget && widget.lenses; - - if (!lenses || !lenses.length) continue; - + if (!lenses || !lenses.length) + continue; var lensContainer = lensElements[index]; if (!lensContainer) { lensContainer = lensElements[index] - = dom.buildDom(["div", {class: "ace_codeLens"}], renderer.container); + = dom.buildDom(["div", { class: "ace_codeLens" }], renderer.container); } lensContainer.style.height = config.lineHeight + "px"; index++; - for (var j = 0; j < lenses.length; j++) { var el = lensContainer.childNodes[2 * j]; if (!el) { - if (j != 0) lensContainer.appendChild(dom.createTextNode("\xa0|\xa0")); + if (j != 0) + lensContainer.appendChild(dom.createTextNode("\xa0|\xa0")); el = dom.buildDom(["a"], lensContainer); } el.textContent = lenses[j].title; - el.lensCommand = lenses[j]; + (el).lensCommand = lenses[j]; } while (lensContainer.childNodes.length > 2 * j - 1) lensContainer.lastChild.remove(); - var top = renderer.$cursorLayer.getPixelPosition({ row: row, column: 0 }, true).top - config.lineHeight * widget.rowsAbove - config.offset; lensContainer.style.top = top + "px"; - var left = renderer.gutterWidth; var indent = session.getLine(row).search(/\S|$/); if (indent == -1) @@ -83,21 +78,19 @@ function renderWidgets(changes, renderer) { while (index < lensElements.length) lensElements.pop().remove(); } - function clearCodeLensWidgets(session) { - if (!session.lineWidgets) return; + if (!session.lineWidgets) + return; var widgetManager = session.widgetManager; - session.lineWidgets.forEach(function(widget) { + session.lineWidgets.forEach(function (widget) { if (widget && widget.lenses) widgetManager.removeLineWidget(widget); }); } - -exports.setLenses = function(session, lenses) { +exports.setLenses = function (session, lenses) { var firstRow = Number.MAX_VALUE; - clearCodeLensWidgets(session); - lenses && lenses.forEach(function(lens) { + lenses && lenses.forEach(function (lens) { var row = lens.start.row; var column = lens.start.column; var widget = session.lineWidgets && session.lineWidgets[row]; @@ -114,37 +107,33 @@ exports.setLenses = function(session, lenses) { if (row < firstRow) firstRow = row; }); - session._emit("changeFold", {data: {start: {row: firstRow}}}); + session._emit("changeFold", { data: { start: { row: firstRow } } }); return firstRow; }; - function attachToEditor(editor) { editor.codeLensProviders = []; editor.renderer.on("afterRender", renderWidgets); if (!editor.$codeLensClickHandler) { - editor.$codeLensClickHandler = function(e) { + editor.$codeLensClickHandler = function (e) { var command = e.target.lensCommand; - if (!command) return; + if (!command) + return; editor.execCommand(command.id, command.arguments); editor._emit("codeLensClick", e); }; event.addListener(editor.container, "click", editor.$codeLensClickHandler, editor); } - editor.$updateLenses = function() { + editor.$updateLenses = function () { var session = editor.session; - if (!session) return; - - if (!session.widgetManager) { - session.widgetManager = new LineWidgets(session); - session.widgetManager.attach(editor); - } - + if (!session) + return; var providersToWaitNum = editor.codeLensProviders.length; var lenses = []; - editor.codeLensProviders.forEach(function(provider) { - provider.provideCodeLenses(session, function(err, payload) { - if (err) return; - payload.forEach(function(lens) { + editor.codeLensProviders.forEach(function (provider) { + provider.provideCodeLenses(session, function (err, payload) { + if (err) + return; + payload.forEach(function (lens) { lenses.push(lens); }); providersToWaitNum--; @@ -153,85 +142,57 @@ function attachToEditor(editor) { } }); }); - function applyLenses() { var cursor = session.selection.cursor; var oldRow = session.documentToScreenRow(cursor); var scrollTop = session.getScrollTop(); var firstRow = exports.setLenses(session, lenses); - var lastDelta = session.$undoManager && session.$undoManager.$lastDelta; if (lastDelta && lastDelta.action == "remove" && lastDelta.lines.length > 1) return; var row = session.documentToScreenRow(cursor); var lineHeight = editor.renderer.layerConfig.lineHeight; var top = session.getScrollTop() + (row - oldRow) * lineHeight; - if (firstRow == 0 && scrollTop < lineHeight /4 && scrollTop > -lineHeight/4) { + if (firstRow == 0 && scrollTop < lineHeight / 4 && scrollTop > -lineHeight / 4) { top = -lineHeight; } session.setScrollTop(top); } }; var updateLenses = lang.delayedCall(editor.$updateLenses); - editor.$updateLensesOnInput = function() { + editor.$updateLensesOnInput = function () { updateLenses.delay(250); }; editor.on("input", editor.$updateLensesOnInput); } - function detachFromEditor(editor) { editor.off("input", editor.$updateLensesOnInput); editor.renderer.off("afterRender", renderWidgets); if (editor.$codeLensClickHandler) editor.container.removeEventListener("click", editor.$codeLensClickHandler); } - -exports.registerCodeLensProvider = function(editor, codeLensProvider) { +exports.registerCodeLensProvider = function (editor, codeLensProvider) { editor.setOption("enableCodeLens", true); editor.codeLensProviders.push(codeLensProvider); editor.$updateLensesOnInput(); }; - -exports.clear = function(session) { +exports.clear = function (session) { exports.setLenses(session, null); }; - var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { enableCodeLens: { - set: function(val) { + set: function (val) { if (val) { attachToEditor(this); - } else { + } + else { detachFromEditor(this); } } } }); - -dom.importCssString("\ -.ace_codeLens {\ - position: absolute;\ - color: #aaa;\ - font-size: 88%;\ - background: inherit;\ - width: 100%;\ - display: flex;\ - align-items: flex-end;\ - pointer-events: none;\ -}\ -.ace_codeLens > a {\ - cursor: pointer;\ - pointer-events: auto;\ -}\ -.ace_codeLens > a:hover {\ - color: #0000ff;\ - text-decoration: underline;\ -}\ -.ace_dark > .ace_codeLens > a:hover {\ - color: #4e94ce;\ -}\ -", "codelense.css", false); +dom.importCssString("\n.ace_codeLens {\n position: absolute;\n color: #aaa;\n font-size: 88%;\n background: inherit;\n width: 100%;\n display: flex;\n align-items: flex-end;\n pointer-events: none;\n}\n.ace_codeLens > a {\n cursor: pointer;\n pointer-events: auto;\n}\n.ace_codeLens > a:hover {\n color: #0000ff;\n text-decoration: underline;\n}\n.ace_dark > .ace_codeLens > a:hover {\n color: #4e94ce;\n}\n", "codelense.css", false); }); (function() { window.require(["ace/ext/code_lens"], function(m) { diff --git a/app/Resources/ui/js/ace/ext-elastic_tabstops_lite.js b/app/Resources/ui/js/ace/ext-elastic_tabstops_lite.js index 855666ac..54d75877 100644 --- a/app/Resources/ui/js/ace/ext-elastic_tabstops_lite.js +++ b/app/Resources/ui/js/ace/ext-elastic_tabstops_lite.js @@ -1,44 +1,48 @@ -define("ace/ext/elastic_tabstops_lite",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/elastic_tabstops_lite",["require","exports","module","ace/editor","ace/config"], function(require, exports, module){/** + * ## Elastic Tabstops Lite extension. + * + * Automatically adjusts tab spacing to align content in tabular format by calculating optimal column widths + * and maintaining consistent vertical alignment across multiple lines. Tracks content changes and dynamically + * reprocesses affected rows to ensure proper formatting without manual intervention. + * + * **Enable:** `editor.setOption("useElasticTabstops", true)` + * or configure it during editor initialization in the options object. + * @module + */ "use strict"; - -var ElasticTabstopsLite = function(editor) { - this.$editor = editor; - var self = this; - var changedRows = []; - var recordChanges = false; - this.onAfterExec = function() { - recordChanges = false; - self.processRows(changedRows); - changedRows = []; - }; - this.onExec = function() { - recordChanges = true; - }; - this.onChange = function(delta) { - if (recordChanges) { - if (changedRows.indexOf(delta.start.row) == -1) - changedRows.push(delta.start.row); - if (delta.end.row != delta.start.row) - changedRows.push(delta.end.row); - } - }; -}; - -(function() { - this.processRows = function(rows) { +var ElasticTabstopsLite = /** @class */ (function () { + function ElasticTabstopsLite(editor) { + this.$editor = editor; + var self = this; + var changedRows = []; + var recordChanges = false; + this.onAfterExec = function () { + recordChanges = false; + self.processRows(changedRows); + changedRows = []; + }; + this.onExec = function () { + recordChanges = true; + }; + this.onChange = function (delta) { + if (recordChanges) { + if (changedRows.indexOf(delta.start.row) == -1) + changedRows.push(delta.start.row); + if (delta.end.row != delta.start.row) + changedRows.push(delta.end.row); + } + }; + } + ElasticTabstopsLite.prototype.processRows = function (rows) { this.$inChange = true; var checkedRows = []; - for (var r = 0, rowCount = rows.length; r < rowCount; r++) { var row = rows[r]; - if (checkedRows.indexOf(row) > -1) continue; - var cellWidthObj = this.$findCellWidthsForBlock(row); var cellWidths = this.$setBlockCellWidthsToMax(cellWidthObj.cellWidths); var rowIndex = cellWidthObj.firstRow; - for (var w = 0, l = cellWidths.length; w < l; w++) { var widths = cellWidths[w]; checkedRows.push(rowIndex); @@ -48,68 +52,53 @@ var ElasticTabstopsLite = function(editor) { } this.$inChange = false; }; - - this.$findCellWidthsForBlock = function(row) { + ElasticTabstopsLite.prototype.$findCellWidthsForBlock = function (row) { var cellWidths = [], widths; var rowIter = row; while (rowIter >= 0) { widths = this.$cellWidthsForRow(rowIter); if (widths.length == 0) break; - cellWidths.unshift(widths); rowIter--; } var firstRow = rowIter + 1; rowIter = row; var numRows = this.$editor.session.getLength(); - while (rowIter < numRows - 1) { rowIter++; - widths = this.$cellWidthsForRow(rowIter); if (widths.length == 0) break; - cellWidths.push(widths); } - return { cellWidths: cellWidths, firstRow: firstRow }; }; - - this.$cellWidthsForRow = function(row) { + ElasticTabstopsLite.prototype.$cellWidthsForRow = function (row) { var selectionColumns = this.$selectionColumnsForRow(row); - var tabs = [-1].concat(this.$tabsForRow(row)); - var widths = tabs.map(function(el) { return 0; } ).slice(1); + var widths = tabs.map(function (el) { return 0; }).slice(1); var line = this.$editor.session.getLine(row); - for (var i = 0, len = tabs.length - 1; i < len; i++) { - var leftEdge = tabs[i]+1; - var rightEdge = tabs[i+1]; - + var leftEdge = tabs[i] + 1; + var rightEdge = tabs[i + 1]; var rightmostSelection = this.$rightmostSelectionInCell(selectionColumns, rightEdge); var cell = line.substring(leftEdge, rightEdge); - widths[i] = Math.max(cell.replace(/\s+$/g,'').length, rightmostSelection - leftEdge); + widths[i] = Math.max(cell.replace(/\s+$/g, '').length, rightmostSelection - leftEdge); } - return widths; }; - - this.$selectionColumnsForRow = function(row) { + ElasticTabstopsLite.prototype.$selectionColumnsForRow = function (row) { var selections = [], cursor = this.$editor.getCursorPosition(); if (this.$editor.session.getSelection().isEmpty()) { if (row == cursor.row) selections.push(cursor.column); } - return selections; }; - - this.$setBlockCellWidthsToMax = function(cellWidths) { + ElasticTabstopsLite.prototype.$setBlockCellWidthsToMax = function (cellWidths) { var startingNewBlock = true, blockStartRow, blockEndRow, maxWidth; var columnInfo = this.$izip_longest(cellWidths); - for (var c = 0, l = columnInfo.length; c < l; c++) { var column = columnInfo[c]; if (!column.push) { @@ -117,7 +106,6 @@ var ElasticTabstopsLite = function(editor) { continue; } column.push(NaN); - for (var r = 0, s = column.length; r < s; r++) { var width = column[r]; if (startingNewBlock) { @@ -127,23 +115,18 @@ var ElasticTabstopsLite = function(editor) { } if (isNaN(width)) { blockEndRow = r; - for (var j = blockStartRow; j < blockEndRow; j++) { cellWidths[j][c] = maxWidth; } startingNewBlock = true; } - maxWidth = Math.max(maxWidth, width); } } - return cellWidths; }; - - this.$rightmostSelectionInCell = function(selectionColumns, cellRightEdge) { + ElasticTabstopsLite.prototype.$rightmostSelectionInCell = function (selectionColumns, cellRightEdge) { var rightmost = 0; - if (selectionColumns.length) { var lengths = []; for (var s = 0, length = selectionColumns.length; s < length; s++) { @@ -154,70 +137,53 @@ var ElasticTabstopsLite = function(editor) { } rightmost = Math.max.apply(Math, lengths); } - return rightmost; }; - - this.$tabsForRow = function(row) { - var rowTabs = [], line = this.$editor.session.getLine(row), - re = /\t/g, match; - + ElasticTabstopsLite.prototype.$tabsForRow = function (row) { + var rowTabs = [], line = this.$editor.session.getLine(row), re = /\t/g, match; while ((match = re.exec(line)) != null) { rowTabs.push(match.index); } - return rowTabs; }; - - this.$adjustRow = function(row, widths) { + ElasticTabstopsLite.prototype.$adjustRow = function (row, widths) { var rowTabs = this.$tabsForRow(row); - if (rowTabs.length == 0) return; - var bias = 0, location = -1; var expandedSet = this.$izip(widths, rowTabs); - for (var i = 0, l = expandedSet.length; i < l; i++) { var w = expandedSet[i][0], it = expandedSet[i][1]; location += 1 + w; it += bias; var difference = location - it; - if (difference == 0) continue; - - var partialLine = this.$editor.session.getLine(row).substr(0, it ); + var partialLine = this.$editor.session.getLine(row).substr(0, it); var strippedPartialLine = partialLine.replace(/\s*$/g, ""); var ispaces = partialLine.length - strippedPartialLine.length; - if (difference > 0) { - this.$editor.session.getDocument().insertInLine({row: row, column: it + 1}, Array(difference + 1).join(" ") + "\t"); + this.$editor.session.getDocument().insertInLine({ row: row, column: it + 1 }, Array(difference + 1).join(" ") + "\t"); this.$editor.session.getDocument().removeInLine(row, it, it + 1); - bias += difference; } - if (difference < 0 && ispaces >= -difference) { this.$editor.session.getDocument().removeInLine(row, it + difference, it); bias += difference; } } }; - this.$izip_longest = function(iterables) { + ElasticTabstopsLite.prototype.$izip_longest = function (iterables) { if (!iterables[0]) return []; var longest = iterables[0].length; var iterablesLength = iterables.length; - for (var i = 1; i < iterablesLength; i++) { var iLength = iterables[i].length; if (iLength > longest) longest = iLength; } - var expandedSet = []; - for (var l = 0; l < longest; l++) { var set = []; for (var i = 0; i < iterablesLength; i++) { @@ -226,39 +192,34 @@ var ElasticTabstopsLite = function(editor) { else set.push(iterables[i][l]); } - expandedSet.push(set); } - - return expandedSet; }; - this.$izip = function(widths, tabs) { + ElasticTabstopsLite.prototype.$izip = function (widths, tabs) { var size = widths.length >= tabs.length ? tabs.length : widths.length; - var expandedSet = []; for (var i = 0; i < size; i++) { - var set = [ widths[i], tabs[i] ]; + var set = [widths[i], tabs[i]]; expandedSet.push(set); } return expandedSet; }; - -}).call(ElasticTabstopsLite.prototype); - + return ElasticTabstopsLite; +}()); exports.ElasticTabstopsLite = ElasticTabstopsLite; - var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { useElasticTabstops: { - set: function(val) { + set: function (val) { if (val) { if (!this.elasticTabstops) this.elasticTabstops = new ElasticTabstopsLite(this); this.commands.on("afterExec", this.elasticTabstops.onAfterExec); this.commands.on("exec", this.elasticTabstops.onExec); this.on("change", this.elasticTabstops.onChange); - } else if (this.elasticTabstops) { + } + else if (this.elasticTabstops) { this.commands.removeListener("afterExec", this.elasticTabstops.onAfterExec); this.commands.removeListener("exec", this.elasticTabstops.onExec); this.removeListener("change", this.elasticTabstops.onChange); diff --git a/app/Resources/ui/js/ace/ext-emmet.js b/app/Resources/ui/js/ace/ext-emmet.js index 68fc0ff1..6650ffe2 100644 --- a/app/Resources/ui/js/ace/ext-emmet.js +++ b/app/Resources/ui/js/ace/ext-emmet.js @@ -1,5 +1,4 @@ -define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module) { -"use strict"; +define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module){"use strict"; var dom = require("./lib/dom"); var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; @@ -9,107 +8,100 @@ var RangeList = require("./range_list").RangeList; var HashHandler = require("./keyboard/hash_handler").HashHandler; var Tokenizer = require("./tokenizer").Tokenizer; var clipboard = require("./clipboard"); - var VARIABLES = { - CURRENT_WORD: function(editor) { + CURRENT_WORD: function (editor) { return editor.session.getTextRange(editor.session.getWordRange()); }, - SELECTION: function(editor, name, indentation) { + SELECTION: function (editor, name, indentation) { var text = editor.session.getTextRange(); if (indentation) return text.replace(/\n\r?([ \t]*\S)/g, "\n" + indentation + "$1"); return text; }, - CURRENT_LINE: function(editor) { + CURRENT_LINE: function (editor) { return editor.session.getLine(editor.getCursorPosition().row); }, - PREV_LINE: function(editor) { + PREV_LINE: function (editor) { return editor.session.getLine(editor.getCursorPosition().row - 1); }, - LINE_INDEX: function(editor) { + LINE_INDEX: function (editor) { return editor.getCursorPosition().row; }, - LINE_NUMBER: function(editor) { + LINE_NUMBER: function (editor) { return editor.getCursorPosition().row + 1; }, - SOFT_TABS: function(editor) { + SOFT_TABS: function (editor) { return editor.session.getUseSoftTabs() ? "YES" : "NO"; }, - TAB_SIZE: function(editor) { + TAB_SIZE: function (editor) { return editor.session.getTabSize(); }, - CLIPBOARD: function(editor) { + CLIPBOARD: function (editor) { return clipboard.getText && clipboard.getText(); }, - FILENAME: function(editor) { + FILENAME: function (editor) { return /[^/\\]*$/.exec(this.FILEPATH(editor))[0]; }, - FILENAME_BASE: function(editor) { + FILENAME_BASE: function (editor) { return /[^/\\]*$/.exec(this.FILEPATH(editor))[0].replace(/\.[^.]*$/, ""); }, - DIRECTORY: function(editor) { + DIRECTORY: function (editor) { return this.FILEPATH(editor).replace(/[^/\\]*$/, ""); }, - FILEPATH: function(editor) { return "/not implemented.txt"; }, - WORKSPACE_NAME: function() { return "Unknown"; }, - FULLNAME: function() { return "Unknown"; }, - BLOCK_COMMENT_START: function(editor) { + FILEPATH: function (editor) { return "/not implemented.txt"; }, + WORKSPACE_NAME: function () { return "Unknown"; }, + FULLNAME: function () { return "Unknown"; }, + BLOCK_COMMENT_START: function (editor) { var mode = editor.session.$mode || {}; return mode.blockComment && mode.blockComment.start || ""; }, - BLOCK_COMMENT_END: function(editor) { + BLOCK_COMMENT_END: function (editor) { var mode = editor.session.$mode || {}; return mode.blockComment && mode.blockComment.end || ""; }, - LINE_COMMENT: function(editor) { + LINE_COMMENT: function (editor) { var mode = editor.session.$mode || {}; return mode.lineCommentStart || ""; }, - CURRENT_YEAR: date.bind(null, {year: "numeric"}), - CURRENT_YEAR_SHORT: date.bind(null, {year: "2-digit"}), - CURRENT_MONTH: date.bind(null, {month: "numeric"}), - CURRENT_MONTH_NAME: date.bind(null, {month: "long"}), - CURRENT_MONTH_NAME_SHORT: date.bind(null, {month: "short"}), - CURRENT_DATE: date.bind(null, {day: "2-digit"}), - CURRENT_DAY_NAME: date.bind(null, {weekday: "long"}), - CURRENT_DAY_NAME_SHORT: date.bind(null, {weekday: "short"}), - CURRENT_HOUR: date.bind(null, {hour: "2-digit", hour12: false}), - CURRENT_MINUTE: date.bind(null, {minute: "2-digit"}), - CURRENT_SECOND: date.bind(null, {second: "2-digit"}) + CURRENT_YEAR: date.bind(null, { year: "numeric" }), + CURRENT_YEAR_SHORT: date.bind(null, { year: "2-digit" }), + CURRENT_MONTH: date.bind(null, { month: "numeric" }), + CURRENT_MONTH_NAME: date.bind(null, { month: "long" }), + CURRENT_MONTH_NAME_SHORT: date.bind(null, { month: "short" }), + CURRENT_DATE: date.bind(null, { day: "2-digit" }), + CURRENT_DAY_NAME: date.bind(null, { weekday: "long" }), + CURRENT_DAY_NAME_SHORT: date.bind(null, { weekday: "short" }), + CURRENT_HOUR: date.bind(null, { hour: "2-digit", hour12: false }), + CURRENT_MINUTE: date.bind(null, { minute: "2-digit" }), + CURRENT_SECOND: date.bind(null, { second: "2-digit" }) }; - VARIABLES.SELECTED_TEXT = VARIABLES.SELECTION; - function date(dateFormat) { var str = new Date().toLocaleString("en-us", dateFormat); return str.length == 1 ? "0" + str : str; } - -var SnippetManager = function() { - this.snippetMap = {}; - this.snippetNameMap = {}; -}; - -(function() { - oop.implement(this, EventEmitter); - - this.getTokenizer = function() { - return SnippetManager.$tokenizer || this.createTokenizer(); +var SnippetManager = /** @class */ (function () { + function SnippetManager() { + this.snippetMap = {}; + this.snippetNameMap = {}; + this.variables = VARIABLES; + } + SnippetManager.prototype.getTokenizer = function () { + return SnippetManager["$tokenizer"] || this.createTokenizer(); }; - - this.createTokenizer = function() { + SnippetManager.prototype.createTokenizer = function () { function TabstopToken(str) { str = str.substr(1); if (/^\d+$/.test(str)) - return [{tabstopId: parseInt(str, 10)}]; - return [{text: str}]; + return [{ tabstopId: parseInt(str, 10) }]; + return [{ text: str }]; } function escape(ch) { return "(?:[^\\\\" + ch + "]|\\\\.)"; } var formatMatcher = { - regex: "/(" + escape("/") + "+)/", - onMatch: function(val, state, stack) { + regex: "/(" + escape("/") + "+)/", + onMatch: function (val, state, stack) { var ts = stack[0]; ts.fmtString = true; ts.guard = val.slice(1, -1); @@ -118,118 +110,115 @@ var SnippetManager = function() { }, next: "formatString" }; - - SnippetManager.$tokenizer = new Tokenizer({ + SnippetManager["$tokenizer"] = new Tokenizer({ start: [ - {regex: /\\./, onMatch: function(val, state, stack) { - var ch = val[1]; - if (ch == "}" && stack.length) { - val = ch; - } else if ("`$\\".indexOf(ch) != -1) { - val = ch; - } - return [val]; - }}, - {regex: /}/, onMatch: function(val, state, stack) { - return [stack.length ? stack.shift() : val]; - }}, - {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, - {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { - var t = TabstopToken(str.substr(1)); - stack.unshift(t[0]); - return t; - }, next: "snippetVar"}, - {regex: /\n/, token: "newline", merge: false} + { regex: /\\./, onMatch: function (val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) { + val = ch; + } + else if ("`$\\".indexOf(ch) != -1) { + val = ch; + } + return [val]; + } }, + { regex: /}/, onMatch: function (val, state, stack) { + return [stack.length ? stack.shift() : val]; + } }, + { regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken }, + { regex: /\$\{[\dA-Z_a-z]+/, onMatch: function (str, state, stack) { + var t = TabstopToken(str.substr(1)); + stack.unshift(t[0]); + return t; + }, next: "snippetVar" }, + { regex: /\n/, token: "newline", merge: false } ], snippetVar: [ - {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { - var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function(operator) { - return operator.length == 2 ? operator[1] : "\x00"; - }).split("\x00").map(function(value){ - return {value: value}; - }); - stack[0].choices = choices; - return [choices[0]]; - }, next: "start"}, + { regex: "\\|" + escape("\\|") + "*\\|", onMatch: function (val, state, stack) { + var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function (operator) { + return operator.length == 2 ? operator[1] : "\x00"; + }).split("\x00").map(function (value) { + return { value: value }; + }); + stack[0].choices = choices; + return [choices[0]]; + }, next: "start" }, formatMatcher, - {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} + { regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start" } ], formatString: [ - {regex: /:/, onMatch: function(val, state, stack) { - if (stack.length && stack[0].expectElse) { - stack[0].expectElse = false; - stack[0].ifEnd = {elseEnd: stack[0]}; - return [stack[0].ifEnd]; - } - return ":"; - }}, - {regex: /\\./, onMatch: function(val, state, stack) { - var ch = val[1]; - if (ch == "}" && stack.length) - val = ch; - else if ("`$\\".indexOf(ch) != -1) - val = ch; - else if (ch == "n") - val = "\n"; - else if (ch == "t") - val = "\t"; - else if ("ulULE".indexOf(ch) != -1) - val = {changeCase: ch, local: ch > "a"}; - return [val]; - }}, - {regex: "/\\w*}", onMatch: function(val, state, stack) { - var next = stack.shift(); - if (next) - next.flag = val.slice(1, -1); - this.next = next && next.tabstopId ? "start" : ""; - return [next || val]; - }, next: "start"}, - {regex: /\$(?:\d+|\w+)/, onMatch: function(val, state, stack) { - return [{text: val.slice(1)}]; - }}, - {regex: /\${\w+/, onMatch: function(val, state, stack) { - var token = {text: val.slice(2)}; - stack.unshift(token); - return [token]; - }, next: "formatStringVar"}, - {regex: /\n/, token: "newline", merge: false}, - {regex: /}/, onMatch: function(val, state, stack) { - var next = stack.shift(); - this.next = next && next.tabstopId ? "start" : ""; - return [next || val]; - }, next: "start"} + { regex: /:/, onMatch: function (val, state, stack) { + if (stack.length && stack[0].expectElse) { + stack[0].expectElse = false; + stack[0].ifEnd = { elseEnd: stack[0] }; + return [stack[0].ifEnd]; + } + return ":"; + } }, + { regex: /\\./, onMatch: function (val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) + val = ch; + else if ("`$\\".indexOf(ch) != -1) + val = ch; + else if (ch == "n") + val = "\n"; + else if (ch == "t") + val = "\t"; + else if ("ulULE".indexOf(ch) != -1) + val = { changeCase: ch, local: ch > "a" }; + return [val]; + } }, + { regex: "/\\w*}", onMatch: function (val, state, stack) { + var next = stack.shift(); + if (next) + next.flag = val.slice(1, -1); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start" }, + { regex: /\$(?:\d+|\w+)/, onMatch: function (val, state, stack) { + return [{ text: val.slice(1) }]; + } }, + { regex: /\${\w+/, onMatch: function (val, state, stack) { + var token = { text: val.slice(2) }; + stack.unshift(token); + return [token]; + }, next: "formatStringVar" }, + { regex: /\n/, token: "newline", merge: false }, + { regex: /}/, onMatch: function (val, state, stack) { + var next = stack.shift(); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start" } ], formatStringVar: [ - {regex: /:\/\w+}/, onMatch: function(val, state, stack) { - var ts = stack[0]; - ts.formatFunction = val.slice(2, -1); - return [stack.shift()]; - }, next: "formatString"}, + { regex: /:\/\w+}/, onMatch: function (val, state, stack) { + var ts = stack[0]; + ts.formatFunction = val.slice(2, -1); + return [stack.shift()]; + }, next: "formatString" }, formatMatcher, - {regex: /:[\?\-+]?/, onMatch: function(val, state, stack) { - if (val[1] == "+") - stack[0].ifEnd = stack[0]; - if (val[1] == "?") - stack[0].expectElse = true; - }, next: "formatString"}, - {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString"} + { regex: /:[\?\-+]?/, onMatch: function (val, state, stack) { + if (val[1] == "+") + stack[0].ifEnd = stack[0]; + if (val[1] == "?") + stack[0].expectElse = true; + }, next: "formatString" }, + { regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString" } ] }); - return SnippetManager.$tokenizer; + return SnippetManager["$tokenizer"]; }; - - this.tokenizeTmSnippet = function(str, startState) { - return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { + SnippetManager.prototype.tokenizeTmSnippet = function (str, startState) { + return this.getTokenizer().getLineTokens(str, startState).tokens.map(function (x) { return x.value || x; }); }; - - this.getVariableValue = function(editor, name, indentation) { + SnippetManager.prototype.getVariableValue = function (editor, name, indentation) { if (/^\d+$/.test(name)) return (this.variables.__ || {})[name] || ""; if (/^[A-Z]\d+$/.test(name)) return (this.variables[name[0] + "__"] || {})[name.substr(1)] || ""; - name = name.replace(/^TM_/, ""); if (!this.variables.hasOwnProperty(name)) return ""; @@ -238,21 +227,20 @@ var SnippetManager = function() { value = this.variables[name](editor, name, indentation); return value == null ? "" : value; }; - - this.variables = VARIABLES; - this.tmStrFormat = function(str, ch, editor) { - if (!ch.fmt) return str; + SnippetManager.prototype.tmStrFormat = function (str, ch, editor) { + if (!ch.fmt) + return str; var flag = ch.flag || ""; var re = ch.guard; re = new RegExp(re, flag.replace(/[^gim]/g, "")); var fmtTokens = typeof ch.fmt == "string" ? this.tokenizeTmSnippet(ch.fmt, "formatString") : ch.fmt; var _self = this; - var formatted = str.replace(re, function() { + var formatted = str.replace(re, function () { var oldArgs = _self.variables.__; _self.variables.__ = [].slice.call(arguments); var fmtParts = _self.resolveVariables(fmtTokens, editor); var gChangeCase = "E"; - for (var i = 0; i < fmtParts.length; i++) { + for (var i = 0; i < fmtParts.length; i++) { var ch = fmtParts[i]; if (typeof ch == "object") { fmtParts[i] = ""; @@ -265,12 +253,15 @@ var SnippetManager = function() { fmtParts[i] = next[0].toLowerCase(); fmtParts[i + 1] = next.substr(1); } - } else if (ch.changeCase) { + } + else if (ch.changeCase) { gChangeCase = ch.changeCase; } - } else if (gChangeCase == "U") { + } + else if (gChangeCase == "U") { fmtParts[i] = ch.toUpperCase(); - } else if (gChangeCase == "L") { + } + else if (gChangeCase == "L") { fmtParts[i] = ch.toLowerCase(); } } @@ -279,16 +270,14 @@ var SnippetManager = function() { }); return formatted; }; - - this.tmFormatFunction = function(str, ch, editor) { + SnippetManager.prototype.tmFormatFunction = function (str, ch, editor) { if (ch.formatFunction == "upcase") return str.toUpperCase(); if (ch.formatFunction == "downcase") return str.toLowerCase(); return str; }; - - this.resolveVariables = function(snippet, editor) { + SnippetManager.prototype.resolveVariables = function (snippet, editor) { var result = []; var indentation = ""; var afterNewLine = true; @@ -306,34 +295,37 @@ var SnippetManager = function() { } continue; } - if (!ch) continue; + if (!ch) + continue; afterNewLine = false; - if (ch.fmtString) { var j = snippet.indexOf(ch, i + 1); - if (j == -1) j = snippet.length; + if (j == -1) + j = snippet.length; ch.fmt = snippet.slice(i + 1, j); i = j; } - if (ch.text) { var value = this.getVariableValue(editor, ch.text, indentation) + ""; if (ch.fmtString) value = this.tmStrFormat(value, ch, editor); if (ch.formatFunction) value = this.tmFormatFunction(value, ch, editor); - if (value && !ch.ifEnd) { result.push(value); gotoNext(ch); - } else if (!value && ch.ifEnd) { + } + else if (!value && ch.ifEnd) { gotoNext(ch.ifEnd); } - } else if (ch.elseEnd) { + } + else if (ch.elseEnd) { gotoNext(ch.elseEnd); - } else if (ch.tabstopId != null) { + } + else if (ch.tabstopId != null) { result.push(ch); - } else if (ch.changeCase != null) { + } + else if (ch.changeCase != null) { result.push(ch); } } @@ -344,142 +336,35 @@ var SnippetManager = function() { } return result; }; - - this.insertSnippetForSelection = function(editor, snippetText) { - var cursor = editor.getCursorPosition(); - var line = editor.session.getLine(cursor.row); - var tabString = editor.session.getTabString(); - var indentString = line.match(/^\s*/)[0]; - - if (cursor.column < indentString.length) - indentString = indentString.slice(0, cursor.column); - - snippetText = snippetText.replace(/\r/g, ""); - var tokens = this.tokenizeTmSnippet(snippetText); - tokens = this.resolveVariables(tokens, editor); - tokens = tokens.map(function(x) { - if (x == "\n") - return x + indentString; - if (typeof x == "string") - return x.replace(/\t/g, tabString); - return x; - }); - var tabstops = []; - tokens.forEach(function(p, i) { - if (typeof p != "object") - return; - var id = p.tabstopId; - var ts = tabstops[id]; - if (!ts) { - ts = tabstops[id] = []; - ts.index = id; - ts.value = ""; - ts.parents = {}; - } - if (ts.indexOf(p) !== -1) - return; - if (p.choices && !ts.choices) - ts.choices = p.choices; - ts.push(p); - var i1 = tokens.indexOf(p, i + 1); - if (i1 === -1) - return; - - var value = tokens.slice(i + 1, i1); - var isNested = value.some(function(t) {return typeof t === "object";}); - if (isNested && !ts.value) { - ts.value = value; - } else if (value.length && (!ts.value || typeof ts.value !== "string")) { - ts.value = value.join(""); - } - }); - tabstops.forEach(function(ts) {ts.length = 0;}); - var expanding = {}; - function copyValue(val) { - var copy = []; - for (var i = 0; i < val.length; i++) { - var p = val[i]; - if (typeof p == "object") { - if (expanding[p.tabstopId]) - continue; - var j = val.lastIndexOf(p, i - 1); - p = copy[j] || {tabstopId: p.tabstopId}; - } - copy[i] = p; - } - return copy; - } - for (var i = 0; i < tokens.length; i++) { - var p = tokens[i]; - if (typeof p != "object") - continue; - var id = p.tabstopId; - var ts = tabstops[id]; - var i1 = tokens.indexOf(p, i + 1); - if (expanding[id]) { - if (expanding[id] === p) { - delete expanding[id]; - Object.keys(expanding).forEach(function(parentId) { - ts.parents[parentId] = true; - }); - } - continue; - } - expanding[id] = p; - var value = ts.value; - if (typeof value !== "string") - value = copyValue(value); - else if (p.fmt) - value = this.tmStrFormat(value, p, editor); - tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); - - if (ts.indexOf(p) === -1) - ts.push(p); - } - var row = 0, column = 0; - var text = ""; - tokens.forEach(function(t) { - if (typeof t === "string") { - var lines = t.split("\n"); - if (lines.length > 1){ - column = lines[lines.length - 1].length; - row += lines.length - 1; - } else - column += t.length; - text += t; - } else if (t) { - if (!t.start) - t.start = {row: row, column: column}; - else - t.end = {row: row, column: column}; - } - }); + SnippetManager.prototype.getDisplayTextForSnippet = function (editor, snippetText) { + var processedSnippet = processSnippetText.call(this, editor, snippetText); + return processedSnippet.text; + }; + SnippetManager.prototype.insertSnippetForSelection = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } + var processedSnippet = processSnippetText.call(this, editor, snippetText, options); var range = editor.getSelectionRange(); - var end = editor.session.replace(range, text); - + var end = editor.session.replace(range, processedSnippet.text); var tabstopManager = new TabstopManager(editor); var selectionId = editor.inVirtualSelectionMode && editor.selection.index; - tabstopManager.addTabstops(tabstops, range.start, end, selectionId); + tabstopManager.addTabstops(processedSnippet.tabstops, range.start, end, selectionId); }; - - this.insertSnippet = function(editor, snippetText) { + SnippetManager.prototype.insertSnippet = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } var self = this; if (editor.inVirtualSelectionMode) - return self.insertSnippetForSelection(editor, snippetText); - - editor.forEachSelection(function() { - self.insertSnippetForSelection(editor, snippetText); - }, null, {keepOrder: true}); - + return self.insertSnippetForSelection(editor, snippetText, options); + editor.forEachSelection(function () { + self.insertSnippetForSelection(editor, snippetText, options); + }, null, { keepOrder: true }); if (editor.tabstopManager) editor.tabstopManager.tabNext(); }; - - this.$getScope = function(editor) { + SnippetManager.prototype.$getScope = function (editor) { var scope = editor.session.$mode.$id || ""; scope = scope.split("/").pop(); if (scope === "html" || scope === "php") { - if (scope === "php" && !editor.session.$mode.inlinePhp) + if (scope === "php" && !editor.session.$mode.inlinePhp) scope = "html"; var c = editor.getCursorPosition(); var state = editor.session.getState(c.row); @@ -495,11 +380,9 @@ var SnippetManager = function() { scope = "php"; } } - return scope; }; - - this.getActiveScopes = function(editor) { + SnippetManager.prototype.getActiveScopes = function (editor) { var scope = this.$getScope(editor); var scopes = [scope]; var snippetMap = this.snippetMap; @@ -509,26 +392,23 @@ var SnippetManager = function() { scopes.push("_"); return scopes; }; - - this.expandWithTab = function(editor, options) { + SnippetManager.prototype.expandWithTab = function (editor, options) { var self = this; - var result = editor.forEachSelection(function() { + var result = editor.forEachSelection(function () { return self.expandSnippetForSelection(editor, options); - }, null, {keepOrder: true}); + }, null, { keepOrder: true }); if (result && editor.tabstopManager) editor.tabstopManager.tabNext(); return result; }; - - this.expandSnippetForSelection = function(editor, options) { + SnippetManager.prototype.expandSnippetForSelection = function (editor, options) { var cursor = editor.getCursorPosition(); var line = editor.session.getLine(cursor.row); var before = line.substring(0, cursor.column); var after = line.substr(cursor.column); - var snippetMap = this.snippetMap; var snippet; - this.getActiveScopes(editor).some(function(scope) { + this.getActiveScopes(editor).some(function (scope) { var snippets = snippetMap[scope]; if (snippets) snippet = this.findMatchingSnippet(snippets, before, after); @@ -538,20 +418,14 @@ var SnippetManager = function() { return false; if (options && options.dryRun) return true; - editor.session.doc.removeInLine(cursor.row, - cursor.column - snippet.replaceBefore.length, - cursor.column + snippet.replaceAfter.length - ); - + editor.session.doc.removeInLine(cursor.row, cursor.column - snippet.replaceBefore.length, cursor.column + snippet.replaceAfter.length); this.variables.M__ = snippet.matchBefore; this.variables.T__ = snippet.matchAfter; this.insertSnippetForSelection(editor, snippet.content); - this.variables.M__ = this.variables.T__ = null; return true; }; - - this.findMatchingSnippet = function(snippetList, before, after) { + SnippetManager.prototype.findMatchingSnippet = function (snippetList, before, after) { for (var i = snippetList.length; i--;) { var s = snippetList[i]; if (s.startRe && !s.startRe.test(before)) @@ -560,7 +434,6 @@ var SnippetManager = function() { continue; if (!s.startRe && !s.endRe) continue; - s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; @@ -568,21 +441,15 @@ var SnippetManager = function() { return s; } }; - - this.snippetMap = {}; - this.snippetNameMap = {}; - this.register = function(snippets, scope) { + SnippetManager.prototype.register = function (snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; var self = this; - - if (!snippets) + if (!snippets) snippets = []; - function wrapRegexp(src) { if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) src = "(?:" + src + ")"; - return src || ""; } function guardedRegexp(re, guard, opening) { @@ -592,14 +459,14 @@ var SnippetManager = function() { re = guard + re; if (re && re[re.length - 1] != "$") re = re + "$"; - } else { + } + else { re = re + guard; if (re && re[0] != "^") re = "^" + re; } return new RegExp(re); } - function addSnippet(s) { if (!s.scope) s.scope = scope || "_"; @@ -608,7 +475,6 @@ var SnippetManager = function() { snippetMap[scope] = []; snippetNameMap[scope] = {}; } - var map = snippetNameMap[scope]; if (s.name) { var old = map[s.name]; @@ -617,48 +483,40 @@ var SnippetManager = function() { map[s.name] = s; } snippetMap[scope].push(s); - if (s.prefix) s.tabTrigger = s.prefix; - if (!s.content && s.body) s.content = Array.isArray(s.body) ? s.body.join("\n") : s.body; - if (s.tabTrigger && !s.trigger) { if (!s.guard && /^\w/.test(s.tabTrigger)) s.guard = "\\b"; s.trigger = lang.escapeRegExp(s.tabTrigger); } - if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard) return; - s.startRe = guardedRegexp(s.trigger, s.guard, true); s.triggerRe = new RegExp(s.trigger); - s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); s.endTriggerRe = new RegExp(s.endTrigger); } - if (Array.isArray(snippets)) { snippets.forEach(addSnippet); - } else { - Object.keys(snippets).forEach(function(key) { + } + else { + Object.keys(snippets).forEach(function (key) { addSnippet(snippets[key]); }); } - - this._signal("registerSnippets", {scope: scope}); + this._signal("registerSnippets", { scope: scope }); }; - this.unregister = function(snippets, scope) { + SnippetManager.prototype.unregister = function (snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; - function removeSnippet(s) { - var nameMap = snippetNameMap[s.scope||scope]; + var nameMap = snippetNameMap[s.scope || scope]; if (nameMap && nameMap[s.name]) { delete nameMap[s.name]; - var map = snippetMap[s.scope||scope]; + var map = snippetMap[s.scope || scope]; var i = map && map.indexOf(s); if (i >= 0) map.splice(i, 1); @@ -669,9 +527,9 @@ var SnippetManager = function() { else if (Array.isArray(snippets)) snippets.forEach(removeSnippet); }; - this.parseSnippetFile = function(str) { + SnippetManager.prototype.parseSnippetFile = function (str) { str = str.replace(/\r/g, ""); - var list = [], snippet = {}; + var list = [], /**@type{Snippet}*/ snippet = {}; var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; var m; while (m = re.exec(str)) { @@ -679,12 +537,15 @@ var SnippetManager = function() { try { snippet = JSON.parse(m[1]); list.push(snippet); - } catch (e) {} - } if (m[4]) { + } + catch (e) { } + } + if (m[4]) { snippet.content = m[4].replace(/^\t/gm, ""); list.push(snippet); snippet = {}; - } else { + } + else { var key = m[2], val = m[3]; if (key == "regex") { var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; @@ -692,21 +553,23 @@ var SnippetManager = function() { snippet.trigger = guardRe.exec(val)[1]; snippet.endTrigger = guardRe.exec(val)[1]; snippet.endGuard = guardRe.exec(val)[1]; - } else if (key == "snippet") { + } + else if (key == "snippet") { snippet.tabTrigger = val.match(/^\S*/)[0]; if (!snippet.name) snippet.name = val; - } else if (key) { + } + else if (key) { snippet[key] = val; } } } return list; }; - this.getSnippetByName = function(name, editor) { + SnippetManager.prototype.getSnippetByName = function (name, editor) { var snippetMap = this.snippetNameMap; var snippet; - this.getActiveScopes(editor).some(function(scope) { + this.getActiveScopes(editor).some(function (scope) { var snippets = snippetMap[scope]; if (snippets) snippet = snippets[name]; @@ -714,59 +577,172 @@ var SnippetManager = function() { }, this); return snippet; }; - -}).call(SnippetManager.prototype); - - -var TabstopManager = function(editor) { - if (editor.tabstopManager) - return editor.tabstopManager; - editor.tabstopManager = this; - this.$onChange = this.onChange.bind(this); - this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; - this.$onChangeSession = this.onChangeSession.bind(this); - this.$onAfterExec = this.onAfterExec.bind(this); - this.attach(editor); + return SnippetManager; +}()); +oop.implement(SnippetManager.prototype, EventEmitter); +var processSnippetText = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var tabString = editor.session.getTabString(); + var indentString = line.match(/^\s*/)[0]; + if (cursor.column < indentString.length) + indentString = indentString.slice(0, cursor.column); + snippetText = snippetText.replace(/\r/g, ""); + var tokens = this.tokenizeTmSnippet(snippetText); + tokens = this.resolveVariables(tokens, editor); + tokens = tokens.map(function (x) { + if (x == "\n" && !options.excludeExtraIndent) + return x + indentString; + if (typeof x == "string") + return x.replace(/\t/g, tabString); + return x; + }); + var tabstops = []; + tokens.forEach(function (p, i) { + if (typeof p != "object") + return; + var id = p.tabstopId; + var ts = tabstops[id]; + if (!ts) { + ts = tabstops[id] = []; + ts.index = id; + ts.value = ""; + ts.parents = {}; + } + if (ts.indexOf(p) !== -1) + return; + if (p.choices && !ts.choices) + ts.choices = p.choices; + ts.push(p); + var i1 = tokens.indexOf(p, i + 1); + if (i1 === -1) + return; + var value = tokens.slice(i + 1, i1); + var isNested = value.some(function (t) { return typeof t === "object"; }); + if (isNested && !ts.value) { + ts.value = value; + } + else if (value.length && (!ts.value || typeof ts.value !== "string")) { + ts.value = value.join(""); + } + }); + tabstops.forEach(function (ts) { ts.length = 0; }); + var expanding = {}; + function copyValue(val) { + var copy = []; + for (var i = 0; i < val.length; i++) { + var p = val[i]; + if (typeof p == "object") { + if (expanding[p.tabstopId]) + continue; + var j = val.lastIndexOf(p, i - 1); + p = copy[j] || { tabstopId: p.tabstopId }; + } + copy[i] = p; + } + return copy; + } + for (var i = 0; i < tokens.length; i++) { + var p = tokens[i]; + if (typeof p != "object") + continue; + var id = p.tabstopId; + var ts = tabstops[id]; + var i1 = tokens.indexOf(p, i + 1); + if (expanding[id]) { + if (expanding[id] === p) { + delete expanding[id]; + Object.keys(expanding).forEach(function (parentId) { + ts.parents[parentId] = true; + }); + } + continue; + } + expanding[id] = p; + var value = ts.value; + if (typeof value !== "string") + value = copyValue(value); + else if (p.fmt) + value = this.tmStrFormat(value, p, editor); + tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); + if (ts.indexOf(p) === -1) + ts.push(p); + } + var row = 0, column = 0; + var text = ""; + tokens.forEach(function (t) { + if (typeof t === "string") { + var lines = t.split("\n"); + if (lines.length > 1) { + column = lines[lines.length - 1].length; + row += lines.length - 1; + } + else + column += t.length; + text += t; + } + else if (t) { + if (!t.start) + t.start = { row: row, column: column }; + else + t.end = { row: row, column: column }; + } + }); + return { + text: text, + tabstops: tabstops, + tokens: tokens + }; }; -(function() { - this.attach = function(editor) { +var TabstopManager = /** @class */ (function () { + function TabstopManager(editor) { this.index = 0; this.ranges = []; this.tabstops = []; + if (editor.tabstopManager) + return editor.tabstopManager; + editor.tabstopManager = this; + this.$onChange = this.onChange.bind(this); + this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; + this.$onChangeSession = this.onChangeSession.bind(this); + this.$onAfterExec = this.onAfterExec.bind(this); + this.attach(editor); + } + TabstopManager.prototype.attach = function (editor) { this.$openTabstops = null; this.selectedTabstop = null; - this.editor = editor; + this.session = editor.session; this.editor.on("change", this.$onChange); this.editor.on("changeSelection", this.$onChangeSelection); this.editor.on("changeSession", this.$onChangeSession); this.editor.commands.on("afterExec", this.$onAfterExec); this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); }; - this.detach = function() { + TabstopManager.prototype.detach = function () { this.tabstops.forEach(this.removeTabstopMarkers, this); - this.ranges = null; - this.tabstops = null; + this.ranges.length = 0; + this.tabstops.length = 0; this.selectedTabstop = null; - this.editor.removeListener("change", this.$onChange); - this.editor.removeListener("changeSelection", this.$onChangeSelection); - this.editor.removeListener("changeSession", this.$onChangeSession); - this.editor.commands.removeListener("afterExec", this.$onAfterExec); + this.editor.off("change", this.$onChange); + this.editor.off("changeSelection", this.$onChangeSelection); + this.editor.off("changeSession", this.$onChangeSession); + this.editor.commands.off("afterExec", this.$onAfterExec); this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); this.editor.tabstopManager = null; + this.session = null; this.editor = null; }; - - this.onChange = function(delta) { + TabstopManager.prototype.onChange = function (delta) { var isRemove = delta.action[0] == "r"; var selectedTabstop = this.selectedTabstop || {}; var parents = selectedTabstop.parents || {}; - var tabstops = (this.tabstops || []).slice(); + var tabstops = this.tabstops.slice(); for (var i = 0; i < tabstops.length; i++) { var ts = tabstops[i]; var active = ts == selectedTabstop || parents[ts.index]; ts.rangeList.$bias = active ? 0 : 1; - if (delta.action == "remove" && ts !== selectedTabstop) { var parentActive = ts.parents && ts.parents[selectedTabstop.index]; var startIndex = ts.rangeList.pointIndex(delta.start, parentActive); @@ -779,16 +755,16 @@ var TabstopManager = function(editor) { } ts.rangeList.$onChange(delta); } - var session = this.editor.session; + var session = this.session; if (!this.$inChange && isRemove && session.getLength() == 1 && !session.getValue()) this.detach(); }; - this.updateLinkedFields = function() { + TabstopManager.prototype.updateLinkedFields = function () { var ts = this.selectedTabstop; if (!ts || !ts.hasLinkedRanges || !ts.firstNonLinked) return; this.$inChange = true; - var session = this.editor.session; + var session = this.session; var text = session.getTextRange(ts.firstNonLinked); for (var i = 0; i < ts.length; i++) { var range = ts[i]; @@ -800,11 +776,11 @@ var TabstopManager = function(editor) { } this.$inChange = false; }; - this.onAfterExec = function(e) { + TabstopManager.prototype.onAfterExec = function (e) { if (e.command && !e.command.readOnly) this.updateLinkedFields(); }; - this.onChangeSelection = function() { + TabstopManager.prototype.onChangeSelection = function () { if (!this.editor) return; var lead = this.editor.selection.lead; @@ -820,20 +796,22 @@ var TabstopManager = function(editor) { } this.detach(); }; - this.onChangeSession = function() { + TabstopManager.prototype.onChangeSession = function () { this.detach(); }; - this.tabNext = function(dir) { + TabstopManager.prototype.tabNext = function (dir) { var max = this.tabstops.length; var index = this.index + (dir || 1); index = Math.min(Math.max(index, 1), max); if (index == max) index = 0; this.selectTabstop(index); - if (index === 0) + this.updateTabstopMarkers(); + if (index === 0) { this.detach(); + } }; - this.selectTabstop = function(index) { + TabstopManager.prototype.selectTabstop = function (index) { this.$openTabstops = null; var ts = this.tabstops[this.index]; if (ts) @@ -842,10 +820,10 @@ var TabstopManager = function(editor) { ts = this.tabstops[this.index]; if (!ts || !ts.length) return; - this.selectedTabstop = ts; var range = ts.firstNonLinked || ts; - if (ts.choices) range.cursor = range.start; + if (ts.choices) + range.cursor = range.start; if (!this.editor.inVirtualSelectionMode) { var sel = this.editor.multiSelect; sel.toSingleRange(range); @@ -854,17 +832,16 @@ var TabstopManager = function(editor) { continue; sel.addRange(ts[i].clone(), true); } - } else { + } + else { this.editor.selection.fromOrientedRange(range); } - this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); if (this.selectedTabstop && this.selectedTabstop.choices) - this.editor.execCommand("startAutocomplete", {matches: this.selectedTabstop.choices}); + this.editor.execCommand("startAutocomplete", { matches: this.selectedTabstop.choices }); }; - this.addTabstops = function(tabstops, start, end) { + TabstopManager.prototype.addTabstops = function (tabstops, start, end) { var useLink = this.useLink || !this.editor.getOption("enableMultiselect"); - if (!this.$openTabstops) this.$openTabstops = []; if (!tabstops[0]) { @@ -874,13 +851,13 @@ var TabstopManager = function(editor) { tabstops[0] = [p]; tabstops[0].index = 0; } - var i = this.index; var arg = [i + 1, 0]; var ranges = this.ranges; - tabstops.forEach(function(ts, index) { + var snippetId = this.snippetId = (this.snippetId || 0) + 1; + tabstops.forEach(function (ts, index) { var dest = this.$openTabstops[index] || ts; - + dest.snippetId = snippetId; for (var i = 0; i < ts.length; i++) { var p = ts[i]; var range = Range.fromPoints(p.start, p.end || p.start); @@ -896,7 +873,8 @@ var TabstopManager = function(editor) { if (p.fmtString || (dest.firstNonLinked && useLink)) { range.linked = true; dest.hasLinkedRanges = true; - } else if (!dest.firstNonLinked) + } + else if (!dest.firstNonLinked) dest.firstNonLinked = range; } if (!dest.firstNonLinked) @@ -910,36 +888,51 @@ var TabstopManager = function(editor) { dest.rangeList.$bias = 0; dest.rangeList.addList(dest); }, this); - if (arg.length > 2) { if (this.tabstops.length) arg.push(arg.splice(2, 1)[0]); this.tabstops.splice.apply(this.tabstops, arg); } }; - - this.addTabstopMarkers = function(ts) { - var session = this.editor.session; - ts.forEach(function(range) { - if (!range.markerId) + TabstopManager.prototype.addTabstopMarkers = function (ts) { + var session = this.session; + ts.forEach(function (range) { + if (!range.markerId) range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); }); }; - this.removeTabstopMarkers = function(ts) { - var session = this.editor.session; - ts.forEach(function(range) { + TabstopManager.prototype.removeTabstopMarkers = function (ts) { + var session = this.session; + ts.forEach(function (range) { session.removeMarker(range.markerId); range.markerId = null; }); }; - this.removeRange = function(range) { + TabstopManager.prototype.updateTabstopMarkers = function () { + if (!this.selectedTabstop) + return; + var currentSnippetId = this.selectedTabstop.snippetId; + if (this.selectedTabstop.index === 0) { + currentSnippetId--; + } + this.tabstops.forEach(function (ts) { + if (ts.snippetId === currentSnippetId) + this.addTabstopMarkers(ts); + else + this.removeTabstopMarkers(ts); + }, this); + }; + TabstopManager.prototype.removeRange = function (range) { var i = range.tabstop.indexOf(range); - if (i != -1) range.tabstop.splice(i, 1); + if (i != -1) + range.tabstop.splice(i, 1); i = this.ranges.indexOf(range); - if (i != -1) this.ranges.splice(i, 1); + if (i != -1) + this.ranges.splice(i, 1); i = range.tabstop.rangeList.ranges.indexOf(range); - if (i != -1) range.tabstop.splice(i, 1); - this.editor.session.removeMarker(range.markerId); + if (i != -1) + range.tabstop.splice(i, 1); + this.session.removeMarker(range.markerId); if (!range.tabstop.length) { i = this.tabstops.indexOf(range.tabstop); if (i != -1) @@ -948,65 +941,58 @@ var TabstopManager = function(editor) { this.detach(); } }; - - this.keyboardHandler = new HashHandler(); - this.keyboardHandler.bindKeys({ - "Tab": function(editor) { - if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) - return; - editor.tabstopManager.tabNext(1); - editor.renderer.scrollCursorIntoView(); - }, - "Shift-Tab": function(editor) { - editor.tabstopManager.tabNext(-1); - editor.renderer.scrollCursorIntoView(); - }, - "Esc": function(editor) { - editor.tabstopManager.detach(); - } - }); -}).call(TabstopManager.prototype); - - - -var movePoint = function(point, diff) { + return TabstopManager; +}()); +TabstopManager.prototype.keyboardHandler = new HashHandler(); +TabstopManager.prototype.keyboardHandler.bindKeys({ + "Tab": function (editor) { + if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) + return; + editor.tabstopManager.tabNext(1); + editor.renderer.scrollCursorIntoView(); + }, + "Shift-Tab": function (editor) { + editor.tabstopManager.tabNext(-1); + editor.renderer.scrollCursorIntoView(); + }, + "Esc": function (editor) { + editor.tabstopManager.detach(); + } +}); +var movePoint = function (point, diff) { if (point.row == 0) point.column += diff.column; point.row += diff.row; }; - -var moveRelative = function(point, start) { +var moveRelative = function (point, start) { if (point.row == start.row) point.column -= start.column; point.row -= start.row; }; - - -dom.importCssString("\ -.ace_snippet-marker {\ - -moz-box-sizing: border-box;\ - box-sizing: border-box;\ - background: rgba(194, 193, 208, 0.09);\ - border: 1px dotted rgba(211, 208, 235, 0.62);\ - position: absolute;\ -}", "snippets.css", false); - +dom.importCssString("\n.ace_snippet-marker {\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n background: rgba(194, 193, 208, 0.09);\n border: 1px dotted rgba(211, 208, 235, 0.62);\n position: absolute;\n}", "snippets.css", false); exports.snippetManager = new SnippetManager(); - - var Editor = require("./editor").Editor; -(function() { - this.insertSnippet = function(content, options) { +(function () { + this.insertSnippet = function (content, options) { return exports.snippetManager.insertSnippet(this, content, options); }; - this.expandSnippet = function(options) { + this.expandSnippet = function (options) { return exports.snippetManager.expandWithTab(this, options); }; }).call(Editor.prototype); }); -define("ace/ext/emmet",["require","exports","module","ace/keyboard/hash_handler","ace/editor","ace/snippets","ace/range","ace/config","resources","resources","tabStops","resources","utils","actions"], function(require, exports, module) { +define("ace/ext/emmet",["require","exports","module","ace/keyboard/hash_handler","ace/editor","ace/snippets","ace/range","ace/config","resources","resources","tabStops","resources","utils","actions"], function(require, exports, module){/** + * ## Emmet extension + * + * Providing HTML/CSS abbreviation expansion, code navigation, and text editing utilities with configurable options and + * keyboard shortcuts for rapid web development workflow. + * + * **Enable:** `editor.setOption("enableEmmet", true)` + * or configure it during editor initialization in the options object. + * @module + */ "use strict"; var HashHandler = require("../keyboard/hash_handler").HashHandler; var Editor = require("../editor").Editor; @@ -1014,76 +1000,73 @@ var snippetManager = require("../snippets").snippetManager; var Range = require("../range").Range; var config = require("../config"); var emmet, emmetPath; -function AceEmmetEditor() {} - -AceEmmetEditor.prototype = { - setupContext: function(editor) { +var AceEmmetEditor = /** @class */ (function () { + function AceEmmetEditor() { + } + AceEmmetEditor.prototype.setupContext = function (editor) { this.ace = editor; this.indentation = editor.session.getTabString(); if (!emmet) - emmet = window.emmet; + emmet = window["emmet"]; var resources = emmet.resources || emmet.require("resources"); resources.setVariable("indentation", this.indentation); this.$syntax = null; this.$syntax = this.getSyntax(); - }, - getSelectionRange: function() { + }; + AceEmmetEditor.prototype.getSelectionRange = function () { var range = this.ace.getSelectionRange(); var doc = this.ace.session.doc; return { start: doc.positionToIndex(range.start), end: doc.positionToIndex(range.end) }; - }, - createSelection: function(start, end) { + }; + AceEmmetEditor.prototype.createSelection = function (start, end) { var doc = this.ace.session.doc; this.ace.selection.setRange({ start: doc.indexToPosition(start), end: doc.indexToPosition(end) }); - }, - getCurrentLineRange: function() { + }; + AceEmmetEditor.prototype.getCurrentLineRange = function () { var ace = this.ace; var row = ace.getCursorPosition().row; var lineLength = ace.session.getLine(row).length; - var index = ace.session.doc.positionToIndex({row: row, column: 0}); + var index = ace.session.doc.positionToIndex({ row: row, column: 0 }); return { start: index, end: index + lineLength }; - }, - getCaretPos: function(){ + }; + AceEmmetEditor.prototype.getCaretPos = function () { var pos = this.ace.getCursorPosition(); return this.ace.session.doc.positionToIndex(pos); - }, - setCaretPos: function(index){ + }; + AceEmmetEditor.prototype.setCaretPos = function (index) { var pos = this.ace.session.doc.indexToPosition(index); this.ace.selection.moveToPosition(pos); - }, - getCurrentLine: function() { + }; + AceEmmetEditor.prototype.getCurrentLine = function () { var row = this.ace.getCursorPosition().row; return this.ace.session.getLine(row); - }, - replaceContent: function(value, start, end, noIndent) { + }; + AceEmmetEditor.prototype.replaceContent = function (value, start, end, noIndent) { if (end == null) end = start == null ? this.getContent().length : start; if (start == null) - start = 0; - + start = 0; var editor = this.ace; var doc = editor.session.doc; var range = Range.fromPoints(doc.indexToPosition(start), doc.indexToPosition(end)); editor.session.remove(range); - range.end = range.start; - value = this.$updateTabstops(value); snippetManager.insertSnippet(editor, value); - }, - getContent: function(){ + }; + AceEmmetEditor.prototype.getContent = function () { return this.ace.getValue(); - }, - getSyntax: function() { + }; + AceEmmetEditor.prototype.getSyntax = function () { if (this.$syntax) return this.$syntax; var syntax = this.ace.session.$modeId.split("/").pop(); @@ -1101,34 +1084,34 @@ AceEmmetEditor.prototype = { } } return syntax; - }, - getProfileName: function() { + }; + AceEmmetEditor.prototype.getProfileName = function () { var resources = emmet.resources || emmet.require("resources"); switch (this.getSyntax()) { - case "css": return "css"; - case "xml": - case "xsl": - return "xml"; - case "html": - var profile = resources.getVariable("profile"); - if (!profile) - profile = this.ace.session.getLines(0,2).join("").search(/]+XHTML/i) != -1 ? "xhtml": "html"; - return profile; - default: - var mode = this.ace.session.$mode; - return mode.emmetConfig && mode.emmetConfig.profile || "xhtml"; + case "css": return "css"; + case "xml": + case "xsl": + return "xml"; + case "html": + var profile = resources.getVariable("profile"); + if (!profile) + profile = this.ace.session.getLines(0, 2).join("").search(/]+XHTML/i) != -1 ? "xhtml" : "html"; + return profile; + default: + var mode = this.ace.session.$mode; + return mode.emmetConfig && mode.emmetConfig.profile || "xhtml"; } - }, - prompt: function(title) { + }; + AceEmmetEditor.prototype.prompt = function (title) { return prompt(title); // eslint-disable-line no-alert - }, - getSelection: function() { + }; + AceEmmetEditor.prototype.getSelection = function () { return this.ace.session.getTextRange(); - }, - getFilePath: function() { + }; + AceEmmetEditor.prototype.getFilePath = function () { return ""; - }, - $updateTabstops: function(value) { + }; + AceEmmetEditor.prototype.$updateTabstops = function (value) { var base = 1000; var zeroBase = 0; var lastZero = null; @@ -1136,74 +1119,67 @@ AceEmmetEditor.prototype = { var resources = emmet.resources || emmet.require("resources"); var settings = resources.getVocabulary("user"); var tabstopOptions = { - tabstop: function(data) { + tabstop: function (data) { var group = parseInt(data.group, 10); var isZero = group === 0; if (isZero) group = ++zeroBase; else group += base; - var placeholder = data.placeholder; if (placeholder) { placeholder = ts.processText(placeholder, tabstopOptions); } - var result = '${' + group + (placeholder ? ':' + placeholder : '') + '}'; - if (isZero) { lastZero = [data.start, result]; } - return result; }, - escape: function(ch) { - if (ch == '$') return '\\$'; - if (ch == '\\') return '\\\\'; + escape: function (ch) { + if (ch == '$') + return '\\$'; + if (ch == '\\') + return '\\\\'; return ch; } }; - value = ts.processText(value, tabstopOptions); - if (settings.variables['insert_final_tabstop'] && !/\$\{0\}$/.test(value)) { value += '${0}'; - } else if (lastZero) { + } + else if (lastZero) { var common = emmet.utils ? emmet.utils.common : emmet.require('utils'); value = common.replaceSubstring(value, '${0}', lastZero[0], lastZero[1]); } - return value; - } -}; - - + }; + return AceEmmetEditor; +}()); var keymap = { - expand_abbreviation: {"mac": "ctrl+alt+e", "win": "alt+e"}, - match_pair_outward: {"mac": "ctrl+d", "win": "ctrl+,"}, - match_pair_inward: {"mac": "ctrl+j", "win": "ctrl+shift+0"}, - matching_pair: {"mac": "ctrl+alt+j", "win": "alt+j"}, + expand_abbreviation: { "mac": "ctrl+alt+e", "win": "alt+e" }, + match_pair_outward: { "mac": "ctrl+d", "win": "ctrl+," }, + match_pair_inward: { "mac": "ctrl+j", "win": "ctrl+shift+0" }, + matching_pair: { "mac": "ctrl+alt+j", "win": "alt+j" }, next_edit_point: "alt+right", prev_edit_point: "alt+left", - toggle_comment: {"mac": "command+/", "win": "ctrl+/"}, - split_join_tag: {"mac": "shift+command+'", "win": "shift+ctrl+`"}, - remove_tag: {"mac": "command+'", "win": "shift+ctrl+;"}, - evaluate_math_expression: {"mac": "shift+command+y", "win": "shift+ctrl+y"}, + toggle_comment: { "mac": "command+/", "win": "ctrl+/" }, + split_join_tag: { "mac": "shift+command+'", "win": "shift+ctrl+`" }, + remove_tag: { "mac": "command+'", "win": "shift+ctrl+;" }, + evaluate_math_expression: { "mac": "shift+command+y", "win": "shift+ctrl+y" }, increment_number_by_1: "ctrl+up", decrement_number_by_1: "ctrl+down", increment_number_by_01: "alt+up", decrement_number_by_01: "alt+down", - increment_number_by_10: {"mac": "alt+command+up", "win": "shift+alt+up"}, - decrement_number_by_10: {"mac": "alt+command+down", "win": "shift+alt+down"}, - select_next_item: {"mac": "shift+command+.", "win": "shift+ctrl+."}, - select_previous_item: {"mac": "shift+command+,", "win": "shift+ctrl+,"}, - reflect_css_value: {"mac": "shift+command+r", "win": "shift+ctrl+r"}, - - encode_decode_data_url: {"mac": "shift+ctrl+d", "win": "ctrl+'"}, + increment_number_by_10: { "mac": "alt+command+up", "win": "shift+alt+up" }, + decrement_number_by_10: { "mac": "alt+command+down", "win": "shift+alt+down" }, + select_next_item: { "mac": "shift+command+.", "win": "shift+ctrl+." }, + select_previous_item: { "mac": "shift+command+,", "win": "shift+ctrl+," }, + reflect_css_value: { "mac": "shift+command+r", "win": "shift+ctrl+r" }, + encode_decode_data_url: { "mac": "shift+ctrl+d", "win": "ctrl+'" }, expand_abbreviation_with_tab: "Tab", - wrap_with_abbreviation: {"mac": "shift+ctrl+a", "win": "shift+ctrl+a"} + wrap_with_abbreviation: { "mac": "shift+ctrl+a", "win": "shift+ctrl+a" } }; - var editorProxy = new AceEmmetEditor(); exports.commands = new HashHandler(); exports.runEmmetCommand = function runEmmetCommand(editor) { @@ -1218,15 +1194,14 @@ exports.runEmmetCommand = function runEmmetCommand(editor) { try { editorProxy.setupContext(editor); var actions = emmet.actions || emmet.require("actions"); - if (this.action == "wrap_with_abbreviation") { - return setTimeout(function() { + return setTimeout(function () { actions.run("wrap_with_abbreviation", editorProxy); }, 0); } - var result = actions.run(this.action, editorProxy); - } catch(e) { + } + catch (e) { if (!emmet) { var loading = exports.load(runEmmetCommand.bind(this, editor)); if (this.action == "expand_abbreviation_with_tab") @@ -1239,7 +1214,6 @@ exports.runEmmetCommand = function runEmmetCommand(editor) { } return result; }; - for (var command in keymap) { exports.commands.addCommand({ name: "emmet:" + command, @@ -1249,23 +1223,23 @@ for (var command in keymap) { multiSelectAction: "forEach" }); } - -exports.updateCommands = function(editor, enabled) { +exports.updateCommands = function (editor, enabled) { if (enabled) { editor.keyBinding.addKeyboardHandler(exports.commands); - } else { + } + else { editor.keyBinding.removeKeyboardHandler(exports.commands); } }; - -exports.isSupportedMode = function(mode) { - if (!mode) return false; - if (mode.emmetConfig) return true; +exports.isSupportedMode = function (mode) { + if (!mode) + return false; + if (mode.emmetConfig) + return true; var id = mode.$id || mode; return /css|less|scss|sass|stylus|html|php|twig|ejs|handlebars/.test(id); }; - -exports.isAvailable = function(editor, command) { +exports.isAvailable = function (editor, command) { if (/(evaluate_math_expression|expand_abbreviation)$/.test(command)) return true; var mode = editor.session.$mode; @@ -1275,12 +1249,12 @@ exports.isAvailable = function(editor, command) { editorProxy.setupContext(editor); if (/js|php/.test(editorProxy.getSyntax())) isSupported = false; - } catch(e) {} + } + catch (e) { } } return isSupported; }; - -var onChangeMode = function(e, target) { +var onChangeMode = function (e, target) { var editor = target; if (!editor) return; @@ -1291,36 +1265,34 @@ var onChangeMode = function(e, target) { exports.load(); exports.updateCommands(editor, enabled); }; - -exports.load = function(cb) { +exports.load = function (cb) { if (typeof emmetPath !== "string") { config.warn("script for emmet-core is not loaded"); return false; } - config.loadModule(emmetPath, function() { + config.loadModule(emmetPath, function () { emmetPath = null; cb && cb(); }); return true; }; - exports.AceEmmetEditor = AceEmmetEditor; config.defineOptions(Editor.prototype, "editor", { enableEmmet: { - set: function(val) { + set: function (val) { this[val ? "on" : "removeListener"]("changeMode", onChangeMode); - onChangeMode({enableEmmet: !!val}, this); + onChangeMode({ enableEmmet: !!val }, this); }, value: true } }); - -exports.setCore = function(e) { +exports.setCore = function (e) { if (typeof e == "string") - emmetPath = e; + emmetPath = e; else - emmet = e; + emmet = e; }; + }); (function() { window.require(["ace/ext/emmet"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/ext-hardwrap.js b/app/Resources/ui/js/ace/ext-hardwrap.js index a2037b91..3a744d30 100644 --- a/app/Resources/ui/js/ace/ext-hardwrap.js +++ b/app/Resources/ui/js/ace/ext-hardwrap.js @@ -1,47 +1,52 @@ -define("ace/ext/hardwrap",["require","exports","module","ace/range","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/hardwrap",["require","exports","module","ace/range","ace/editor","ace/config"], function(require, exports, module){/** + * ## Text hard wrapping extension for automatic line breaking and text formatting. + * + * Provides intelligent line wrapping functionality that breaks long lines at configurable column limits while + * preserving indentation and optionally merging short adjacent lines. Supports both automatic wrapping during text + * input and manual formatting of selected text ranges. + * + * **Enable:** `editor.setOption("hardWrap", true)` + * or configure it during editor initialization in the options object. + * @module + */ "use strict"; - var Range = require("../range").Range; - function hardWrap(editor, options) { var max = options.column || editor.getOption("printMarginColumn"); var allowMerge = options.allowMerge != false; - var row = Math.min(options.startRow, options.endRow); var endRow = Math.max(options.startRow, options.endRow); - var session = editor.session; - while (row <= endRow) { var line = session.getLine(row); if (line.length > max) { var space = findSpace(line, max, 5); if (space) { var indentation = /^\s*/.exec(line)[0]; - session.replace(new Range(row,space.start,row,space.end), "\n" + indentation); + session.replace(new Range(row, space.start, row, space.end), "\n" + indentation); } endRow++; - } else if (allowMerge && /\S/.test(line) && row != endRow) { + } + else if (allowMerge && /\S/.test(line) && row != endRow) { var nextLine = session.getLine(row + 1); if (nextLine && /\S/.test(nextLine)) { var trimmedLine = line.replace(/\s+$/, ""); var trimmedNextLine = nextLine.replace(/^\s+/, ""); var mergedLine = trimmedLine + " " + trimmedNextLine; - var space = findSpace(mergedLine, max, 5); if (space && space.start > trimmedLine.length || mergedLine.length < max) { - var replaceRange = new Range(row,trimmedLine.length,row + 1,nextLine.length - trimmedNextLine.length); + var replaceRange = new Range(row, trimmedLine.length, row + 1, nextLine.length - trimmedNextLine.length); session.replace(replaceRange, " "); row--; endRow--; - } else if (trimmedLine.length < line.length) { + } + else if (trimmedLine.length < line.length) { session.remove(new Range(row, trimmedLine.length, row, line.length)); } } } row++; } - function findSpace(line, max, min) { if (line.length < max) return; @@ -73,46 +78,43 @@ function hardWrap(editor, options) { }; } if (spaceAfter && spaceAfter[2]) { - start = max + spaceAfter[2].length; + start = max + spaceAfter[2].length; return { start: start, end: start + spaceAfter[3].length }; } } - } - function wrapAfterInput(e) { if (e.command.name == "insertstring" && /\S/.test(e.args)) { var editor = e.editor; var cursor = editor.selection.cursor; - if (cursor.column <= editor.renderer.$printMarginColumn) return; + if (cursor.column <= editor.renderer.$printMarginColumn) + return; var lastDelta = editor.session.$undoManager.$lastDelta; - hardWrap(editor, { startRow: cursor.row, endRow: cursor.row, allowMerge: false }); - if (lastDelta != editor.session.$undoManager.$lastDelta) + if (lastDelta != editor.session.$undoManager.$lastDelta) editor.session.markUndoGroup(); } } - var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { hardWrap: { - set: function(val) { + set: function (val) { if (val) { this.commands.on("afterExec", wrapAfterInput); - } else { + } + else { this.commands.off("afterExec", wrapAfterInput); } }, value: false } }); - exports.hardWrap = hardWrap; }); (function() { diff --git a/app/Resources/ui/js/ace/ext-keybinding_menu.js b/app/Resources/ui/js/ace/ext-keybinding_menu.js index b9ad46ee..b17ba748 100644 --- a/app/Resources/ui/js/ace/ext-keybinding_menu.js +++ b/app/Resources/ui/js/ace/ext-keybinding_menu.js @@ -1,80 +1,42 @@ -define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/ext/menu_tools/settings_menu.css",["require","exports","module"], function(require, exports, module){module.exports = "#ace_settingsmenu, #kbshortcutmenu {\n background-color: #F7F7F7;\n color: black;\n box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\n padding: 1em 0.5em 2em 1em;\n overflow: auto;\n position: absolute;\n margin: 0;\n bottom: 0;\n right: 0;\n top: 0;\n z-index: 9991;\n cursor: default;\n}\n\n.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\n box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\n background-color: rgba(255, 255, 255, 0.6);\n color: black;\n}\n\n.ace_optionsMenuEntry:hover {\n background-color: rgba(100, 100, 100, 0.1);\n transition: all 0.3s\n}\n\n.ace_closeButton {\n background: rgba(245, 146, 146, 0.5);\n border: 1px solid #F48A8A;\n border-radius: 50%;\n padding: 7px;\n position: absolute;\n right: -8px;\n top: -8px;\n z-index: 100000;\n}\n.ace_closeButton{\n background: rgba(245, 146, 146, 0.9);\n}\n.ace_optionsMenuKey {\n color: darkslateblue;\n font-weight: bold;\n}\n.ace_optionsMenuCommand {\n color: darkcyan;\n font-weight: normal;\n}\n.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\n vertical-align: middle;\n}\n\n.ace_optionsMenuEntry button[ace_selected_button=true] {\n background: #e7e7e7;\n box-shadow: 1px 0px 2px 0px #adadad inset;\n border-color: #adadad;\n}\n.ace_optionsMenuEntry button {\n background: white;\n border: 1px solid lightgray;\n margin: 0px;\n}\n.ace_optionsMenuEntry button:hover{\n background: #f0f0f0;\n}"; + +}); + +define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/ext/menu_tools/settings_menu.css"], function(require, exports, module){/** + * ## Overlay Page utility + * + * Provides modal overlay functionality for displaying editor extension interfaces. Creates a full-screen overlay with + * configurable backdrop behavior, keyboard navigation (ESC to close), and focus management. Used by various extensions + * to display menus, settings panels, and other interactive content over the editor interface. + * + * **Usage:** + * ```javascript + * var overlayPage = require('./overlay_page').overlayPage; + * var contentElement = document.createElement('div'); + * contentElement.innerHTML = '

Settings

'; + * + * var overlay = overlayPage(editor, contentElement, function() { + * console.log('Overlay closed'); + * }); + * ``` + * + * @module + */ 'use strict'; var dom = require("../../lib/dom"); -var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ -background-color: #F7F7F7;\ -color: black;\ -box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ -padding: 1em 0.5em 2em 1em;\ -overflow: auto;\ -position: absolute;\ -margin: 0;\ -bottom: 0;\ -right: 0;\ -top: 0;\ -z-index: 9991;\ -cursor: default;\ -}\ -.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ -box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ -background-color: rgba(255, 255, 255, 0.6);\ -color: black;\ -}\ -.ace_optionsMenuEntry:hover {\ -background-color: rgba(100, 100, 100, 0.1);\ -transition: all 0.3s\ -}\ -.ace_closeButton {\ -background: rgba(245, 146, 146, 0.5);\ -border: 1px solid #F48A8A;\ -border-radius: 50%;\ -padding: 7px;\ -position: absolute;\ -right: -8px;\ -top: -8px;\ -z-index: 100000;\ -}\ -.ace_closeButton{\ -background: rgba(245, 146, 146, 0.9);\ -}\ -.ace_optionsMenuKey {\ -color: darkslateblue;\ -font-weight: bold;\ -}\ -.ace_optionsMenuCommand {\ -color: darkcyan;\ -font-weight: normal;\ -}\ -.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\ -vertical-align: middle;\ -}\ -.ace_optionsMenuEntry button[ace_selected_button=true] {\ -background: #e7e7e7;\ -box-shadow: 1px 0px 2px 0px #adadad inset;\ -border-color: #adadad;\ -}\ -.ace_optionsMenuEntry button {\ -background: white;\ -border: 1px solid lightgray;\ -margin: 0px;\ -}\ -.ace_optionsMenuEntry button:hover{\ -background: #f0f0f0;\ -}"; +var cssText = require("./settings_menu.css"); dom.importCssString(cssText, "settings_menu.css", false); - module.exports.overlayPage = function overlayPage(editor, contentElement, callback) { var closer = document.createElement('div'); var ignoreFocusOut = false; - function documentEscListener(e) { if (e.keyCode === 27) { close(); } } - function close() { - if (!closer) return; + if (!closer) + return; document.removeEventListener('keydown', documentEscListener); closer.parentNode.removeChild(closer); if (editor) { @@ -90,22 +52,19 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba contentElement.style.pointerEvents = "auto"; } } - closer.style.cssText = 'margin: 0; padding: 0; ' + 'position: fixed; top:0; bottom:0; left:0; right:0;' + 'z-index: 9990; ' + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : ''); - closer.addEventListener('click', function(e) { + closer.addEventListener('click', function (e) { if (!ignoreFocusOut) { close(); } }); document.addEventListener('keydown', documentEscListener); - contentElement.addEventListener('click', function (e) { e.stopPropagation(); }); - closer.appendChild(contentElement); document.body.appendChild(closer); if (editor) { @@ -119,29 +78,49 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba }); -define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/lib/keys"], function(require, exports, module) { -"use strict"; -var keys = require("../../lib/keys"); -module.exports.getEditorKeybordShortcuts = function(editor) { +define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/ext/menu_tools/get_editor_keyboard_shortcuts","ace/lib/keys"], function(require, exports, module){/** + * ## Editor Keyboard Shortcuts Utility + * + * Provides functionality to extract and format keyboard shortcuts from an Ace editor instance. Analyzes all registered + * command handlers and their key bindings to generate a list of available keyboard shortcuts for the + * current platform. Returns formatted key combinations with proper modifier key representations and handles multiple + * bindings per command with pipe-separated notation. + * + * **Usage:** + * ```javascript + * var getKbShortcuts = require('ace/ext/menu_tools/get_editor_keyboard_shortcuts'); + * var shortcuts = getKbShortcuts.getEditorKeybordShortcuts(editor); + * console.log(shortcuts); + * // [ + * // {'command': 'selectall', 'key': 'Ctrl-A'}, + * // {'command': 'copy', 'key': 'Ctrl-C|Ctrl-Insert'} + * // ] + * ``` + * + * @module + */ +"use strict"; var keys = require("../../lib/keys"); +module.exports.getEditorKeybordShortcuts = function (editor) { var KEY_MODS = keys.KEY_MODS; var keybindings = []; var commandMap = {}; - editor.keyBinding.$handlers.forEach(function(handler) { - var ckb = handler.commandKeyBinding; + editor.keyBinding.$handlers.forEach(function (handler) { + var ckb = handler["commandKeyBinding"]; for (var i in ckb) { - var key = i.replace(/(^|-)\w/g, function(x) { return x.toUpperCase(); }); + var key = i.replace(/(^|-)\w/g, function (x) { return x.toUpperCase(); }); var commands = ckb[i]; if (!Array.isArray(commands)) commands = [commands]; - commands.forEach(function(command) { + commands.forEach(function (command) { if (typeof command != "string") - command = command.name; + command = command.name; if (commandMap[command]) { commandMap[command].key += "|" + key; - } else { - commandMap[command] = {key: key, command: command}; + } + else { + commandMap[command] = { key: key, command: command }; keybindings.push(commandMap[command]); - } + } }); } }); @@ -150,38 +129,51 @@ module.exports.getEditorKeybordShortcuts = function(editor) { }); -define("ace/ext/keybinding_menu",["require","exports","module","ace/editor","ace/ext/menu_tools/overlay_page","ace/ext/menu_tools/get_editor_keyboard_shortcuts"], function(require, exports, module) { - "use strict"; - var Editor = require("../editor").Editor; - function showKeyboardShortcuts (editor) { - if(!document.getElementById('kbshortcutmenu')) { - var overlayPage = require('./menu_tools/overlay_page').overlayPage; - var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts; - var kb = getEditorKeybordShortcuts(editor); - var el = document.createElement('div'); - var commands = kb.reduce(function(previous, current) { - return previous + '
' - + current.command + ' : ' - + '' + current.key + '
'; - }, ''); - - el.id = 'kbshortcutmenu'; - el.innerHTML = '

Keyboard Shortcuts

' + commands + ''; - overlayPage(editor, el); - } +define("ace/ext/keybinding_menu",["require","exports","module","ace/editor","ace/ext/menu_tools/overlay_page","ace/ext/menu_tools/get_editor_keyboard_shortcuts"], function(require, exports, module){/** + * ## Show Keyboard Shortcuts extension + * + * Provides a keyboard shortcuts display overlay for the Ace editor. Creates an interactive menu that shows all available + * keyboard shortcuts with their corresponding commands, organized in a searchable and navigable format. The menu + * appears as an overlay page and can be triggered via keyboard shortcut (Ctrl-Alt-H/Cmd-Alt-H) or programmatically. + * + * @author + * Matthew Christopher Kastor-Inare III
+ * @module + */ +"use strict"; +var Editor = require("../editor").Editor; +function showKeyboardShortcuts(editor) { + if (!document.getElementById('kbshortcutmenu')) { + var overlayPage = require('./menu_tools/overlay_page').overlayPage; + var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts; + var kb = getEditorKeybordShortcuts(editor); + var el = document.createElement('div'); + var commands = kb.reduce(function (previous, current) { + return previous + '
' + + current.command + ' : ' + + '' + current.key + '
'; + }, ''); + el.id = 'kbshortcutmenu'; + el.innerHTML = '

Keyboard Shortcuts

' + commands + ''; + overlayPage(editor, el); } - module.exports.init = function(editor) { - Editor.prototype.showKeyboardShortcuts = function() { - showKeyboardShortcuts(this); - }; - editor.commands.addCommands([{ +} +module.exports.init = function (editor) { + Editor.prototype.showKeyboardShortcuts = function () { + showKeyboardShortcuts(this); + }; + editor.commands.addCommands([{ name: "showKeyboardShortcuts", - bindKey: {win: "Ctrl-Alt-h", mac: "Command-Alt-h"}, - exec: function(editor, line) { + bindKey: { + win: "Ctrl-Alt-h", + mac: "Command-Alt-h" + }, + exec: + function (editor, line) { editor.showKeyboardShortcuts(); } }]); - }; +}; }); (function() { window.require(["ace/ext/keybinding_menu"], function(m) { diff --git a/app/Resources/ui/js/ace/ext-language_tools.js b/app/Resources/ui/js/ace/ext-language_tools.js index e0316dcc..3942c228 100644 --- a/app/Resources/ui/js/ace/ext-language_tools.js +++ b/app/Resources/ui/js/ace/ext-language_tools.js @@ -1,5 +1,4 @@ -define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module) { -"use strict"; +define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module){"use strict"; var dom = require("./lib/dom"); var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; @@ -9,107 +8,100 @@ var RangeList = require("./range_list").RangeList; var HashHandler = require("./keyboard/hash_handler").HashHandler; var Tokenizer = require("./tokenizer").Tokenizer; var clipboard = require("./clipboard"); - var VARIABLES = { - CURRENT_WORD: function(editor) { + CURRENT_WORD: function (editor) { return editor.session.getTextRange(editor.session.getWordRange()); }, - SELECTION: function(editor, name, indentation) { + SELECTION: function (editor, name, indentation) { var text = editor.session.getTextRange(); if (indentation) return text.replace(/\n\r?([ \t]*\S)/g, "\n" + indentation + "$1"); return text; }, - CURRENT_LINE: function(editor) { + CURRENT_LINE: function (editor) { return editor.session.getLine(editor.getCursorPosition().row); }, - PREV_LINE: function(editor) { + PREV_LINE: function (editor) { return editor.session.getLine(editor.getCursorPosition().row - 1); }, - LINE_INDEX: function(editor) { + LINE_INDEX: function (editor) { return editor.getCursorPosition().row; }, - LINE_NUMBER: function(editor) { + LINE_NUMBER: function (editor) { return editor.getCursorPosition().row + 1; }, - SOFT_TABS: function(editor) { + SOFT_TABS: function (editor) { return editor.session.getUseSoftTabs() ? "YES" : "NO"; }, - TAB_SIZE: function(editor) { + TAB_SIZE: function (editor) { return editor.session.getTabSize(); }, - CLIPBOARD: function(editor) { + CLIPBOARD: function (editor) { return clipboard.getText && clipboard.getText(); }, - FILENAME: function(editor) { + FILENAME: function (editor) { return /[^/\\]*$/.exec(this.FILEPATH(editor))[0]; }, - FILENAME_BASE: function(editor) { + FILENAME_BASE: function (editor) { return /[^/\\]*$/.exec(this.FILEPATH(editor))[0].replace(/\.[^.]*$/, ""); }, - DIRECTORY: function(editor) { + DIRECTORY: function (editor) { return this.FILEPATH(editor).replace(/[^/\\]*$/, ""); }, - FILEPATH: function(editor) { return "/not implemented.txt"; }, - WORKSPACE_NAME: function() { return "Unknown"; }, - FULLNAME: function() { return "Unknown"; }, - BLOCK_COMMENT_START: function(editor) { + FILEPATH: function (editor) { return "/not implemented.txt"; }, + WORKSPACE_NAME: function () { return "Unknown"; }, + FULLNAME: function () { return "Unknown"; }, + BLOCK_COMMENT_START: function (editor) { var mode = editor.session.$mode || {}; return mode.blockComment && mode.blockComment.start || ""; }, - BLOCK_COMMENT_END: function(editor) { + BLOCK_COMMENT_END: function (editor) { var mode = editor.session.$mode || {}; return mode.blockComment && mode.blockComment.end || ""; }, - LINE_COMMENT: function(editor) { + LINE_COMMENT: function (editor) { var mode = editor.session.$mode || {}; return mode.lineCommentStart || ""; }, - CURRENT_YEAR: date.bind(null, {year: "numeric"}), - CURRENT_YEAR_SHORT: date.bind(null, {year: "2-digit"}), - CURRENT_MONTH: date.bind(null, {month: "numeric"}), - CURRENT_MONTH_NAME: date.bind(null, {month: "long"}), - CURRENT_MONTH_NAME_SHORT: date.bind(null, {month: "short"}), - CURRENT_DATE: date.bind(null, {day: "2-digit"}), - CURRENT_DAY_NAME: date.bind(null, {weekday: "long"}), - CURRENT_DAY_NAME_SHORT: date.bind(null, {weekday: "short"}), - CURRENT_HOUR: date.bind(null, {hour: "2-digit", hour12: false}), - CURRENT_MINUTE: date.bind(null, {minute: "2-digit"}), - CURRENT_SECOND: date.bind(null, {second: "2-digit"}) + CURRENT_YEAR: date.bind(null, { year: "numeric" }), + CURRENT_YEAR_SHORT: date.bind(null, { year: "2-digit" }), + CURRENT_MONTH: date.bind(null, { month: "numeric" }), + CURRENT_MONTH_NAME: date.bind(null, { month: "long" }), + CURRENT_MONTH_NAME_SHORT: date.bind(null, { month: "short" }), + CURRENT_DATE: date.bind(null, { day: "2-digit" }), + CURRENT_DAY_NAME: date.bind(null, { weekday: "long" }), + CURRENT_DAY_NAME_SHORT: date.bind(null, { weekday: "short" }), + CURRENT_HOUR: date.bind(null, { hour: "2-digit", hour12: false }), + CURRENT_MINUTE: date.bind(null, { minute: "2-digit" }), + CURRENT_SECOND: date.bind(null, { second: "2-digit" }) }; - VARIABLES.SELECTED_TEXT = VARIABLES.SELECTION; - function date(dateFormat) { var str = new Date().toLocaleString("en-us", dateFormat); return str.length == 1 ? "0" + str : str; } - -var SnippetManager = function() { - this.snippetMap = {}; - this.snippetNameMap = {}; -}; - -(function() { - oop.implement(this, EventEmitter); - - this.getTokenizer = function() { - return SnippetManager.$tokenizer || this.createTokenizer(); - }; - - this.createTokenizer = function() { +var SnippetManager = /** @class */ (function () { + function SnippetManager() { + this.snippetMap = {}; + this.snippetNameMap = {}; + this.variables = VARIABLES; + } + SnippetManager.prototype.getTokenizer = function () { + return SnippetManager["$tokenizer"] || this.createTokenizer(); + }; + SnippetManager.prototype.createTokenizer = function () { function TabstopToken(str) { str = str.substr(1); if (/^\d+$/.test(str)) - return [{tabstopId: parseInt(str, 10)}]; - return [{text: str}]; + return [{ tabstopId: parseInt(str, 10) }]; + return [{ text: str }]; } function escape(ch) { return "(?:[^\\\\" + ch + "]|\\\\.)"; } var formatMatcher = { - regex: "/(" + escape("/") + "+)/", - onMatch: function(val, state, stack) { + regex: "/(" + escape("/") + "+)/", + onMatch: function (val, state, stack) { var ts = stack[0]; ts.fmtString = true; ts.guard = val.slice(1, -1); @@ -118,118 +110,115 @@ var SnippetManager = function() { }, next: "formatString" }; - - SnippetManager.$tokenizer = new Tokenizer({ + SnippetManager["$tokenizer"] = new Tokenizer({ start: [ - {regex: /\\./, onMatch: function(val, state, stack) { - var ch = val[1]; - if (ch == "}" && stack.length) { - val = ch; - } else if ("`$\\".indexOf(ch) != -1) { - val = ch; - } - return [val]; - }}, - {regex: /}/, onMatch: function(val, state, stack) { - return [stack.length ? stack.shift() : val]; - }}, - {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, - {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { - var t = TabstopToken(str.substr(1)); - stack.unshift(t[0]); - return t; - }, next: "snippetVar"}, - {regex: /\n/, token: "newline", merge: false} + { regex: /\\./, onMatch: function (val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) { + val = ch; + } + else if ("`$\\".indexOf(ch) != -1) { + val = ch; + } + return [val]; + } }, + { regex: /}/, onMatch: function (val, state, stack) { + return [stack.length ? stack.shift() : val]; + } }, + { regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken }, + { regex: /\$\{[\dA-Z_a-z]+/, onMatch: function (str, state, stack) { + var t = TabstopToken(str.substr(1)); + stack.unshift(t[0]); + return t; + }, next: "snippetVar" }, + { regex: /\n/, token: "newline", merge: false } ], snippetVar: [ - {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { - var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function(operator) { - return operator.length == 2 ? operator[1] : "\x00"; - }).split("\x00").map(function(value){ - return {value: value}; - }); - stack[0].choices = choices; - return [choices[0]]; - }, next: "start"}, + { regex: "\\|" + escape("\\|") + "*\\|", onMatch: function (val, state, stack) { + var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function (operator) { + return operator.length == 2 ? operator[1] : "\x00"; + }).split("\x00").map(function (value) { + return { value: value }; + }); + stack[0].choices = choices; + return [choices[0]]; + }, next: "start" }, formatMatcher, - {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} + { regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start" } ], formatString: [ - {regex: /:/, onMatch: function(val, state, stack) { - if (stack.length && stack[0].expectElse) { - stack[0].expectElse = false; - stack[0].ifEnd = {elseEnd: stack[0]}; - return [stack[0].ifEnd]; - } - return ":"; - }}, - {regex: /\\./, onMatch: function(val, state, stack) { - var ch = val[1]; - if (ch == "}" && stack.length) - val = ch; - else if ("`$\\".indexOf(ch) != -1) - val = ch; - else if (ch == "n") - val = "\n"; - else if (ch == "t") - val = "\t"; - else if ("ulULE".indexOf(ch) != -1) - val = {changeCase: ch, local: ch > "a"}; - return [val]; - }}, - {regex: "/\\w*}", onMatch: function(val, state, stack) { - var next = stack.shift(); - if (next) - next.flag = val.slice(1, -1); - this.next = next && next.tabstopId ? "start" : ""; - return [next || val]; - }, next: "start"}, - {regex: /\$(?:\d+|\w+)/, onMatch: function(val, state, stack) { - return [{text: val.slice(1)}]; - }}, - {regex: /\${\w+/, onMatch: function(val, state, stack) { - var token = {text: val.slice(2)}; - stack.unshift(token); - return [token]; - }, next: "formatStringVar"}, - {regex: /\n/, token: "newline", merge: false}, - {regex: /}/, onMatch: function(val, state, stack) { - var next = stack.shift(); - this.next = next && next.tabstopId ? "start" : ""; - return [next || val]; - }, next: "start"} + { regex: /:/, onMatch: function (val, state, stack) { + if (stack.length && stack[0].expectElse) { + stack[0].expectElse = false; + stack[0].ifEnd = { elseEnd: stack[0] }; + return [stack[0].ifEnd]; + } + return ":"; + } }, + { regex: /\\./, onMatch: function (val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) + val = ch; + else if ("`$\\".indexOf(ch) != -1) + val = ch; + else if (ch == "n") + val = "\n"; + else if (ch == "t") + val = "\t"; + else if ("ulULE".indexOf(ch) != -1) + val = { changeCase: ch, local: ch > "a" }; + return [val]; + } }, + { regex: "/\\w*}", onMatch: function (val, state, stack) { + var next = stack.shift(); + if (next) + next.flag = val.slice(1, -1); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start" }, + { regex: /\$(?:\d+|\w+)/, onMatch: function (val, state, stack) { + return [{ text: val.slice(1) }]; + } }, + { regex: /\${\w+/, onMatch: function (val, state, stack) { + var token = { text: val.slice(2) }; + stack.unshift(token); + return [token]; + }, next: "formatStringVar" }, + { regex: /\n/, token: "newline", merge: false }, + { regex: /}/, onMatch: function (val, state, stack) { + var next = stack.shift(); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start" } ], formatStringVar: [ - {regex: /:\/\w+}/, onMatch: function(val, state, stack) { - var ts = stack[0]; - ts.formatFunction = val.slice(2, -1); - return [stack.shift()]; - }, next: "formatString"}, + { regex: /:\/\w+}/, onMatch: function (val, state, stack) { + var ts = stack[0]; + ts.formatFunction = val.slice(2, -1); + return [stack.shift()]; + }, next: "formatString" }, formatMatcher, - {regex: /:[\?\-+]?/, onMatch: function(val, state, stack) { - if (val[1] == "+") - stack[0].ifEnd = stack[0]; - if (val[1] == "?") - stack[0].expectElse = true; - }, next: "formatString"}, - {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString"} + { regex: /:[\?\-+]?/, onMatch: function (val, state, stack) { + if (val[1] == "+") + stack[0].ifEnd = stack[0]; + if (val[1] == "?") + stack[0].expectElse = true; + }, next: "formatString" }, + { regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString" } ] }); - return SnippetManager.$tokenizer; + return SnippetManager["$tokenizer"]; }; - - this.tokenizeTmSnippet = function(str, startState) { - return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { + SnippetManager.prototype.tokenizeTmSnippet = function (str, startState) { + return this.getTokenizer().getLineTokens(str, startState).tokens.map(function (x) { return x.value || x; }); }; - - this.getVariableValue = function(editor, name, indentation) { + SnippetManager.prototype.getVariableValue = function (editor, name, indentation) { if (/^\d+$/.test(name)) return (this.variables.__ || {})[name] || ""; if (/^[A-Z]\d+$/.test(name)) return (this.variables[name[0] + "__"] || {})[name.substr(1)] || ""; - name = name.replace(/^TM_/, ""); if (!this.variables.hasOwnProperty(name)) return ""; @@ -238,21 +227,20 @@ var SnippetManager = function() { value = this.variables[name](editor, name, indentation); return value == null ? "" : value; }; - - this.variables = VARIABLES; - this.tmStrFormat = function(str, ch, editor) { - if (!ch.fmt) return str; + SnippetManager.prototype.tmStrFormat = function (str, ch, editor) { + if (!ch.fmt) + return str; var flag = ch.flag || ""; var re = ch.guard; re = new RegExp(re, flag.replace(/[^gim]/g, "")); var fmtTokens = typeof ch.fmt == "string" ? this.tokenizeTmSnippet(ch.fmt, "formatString") : ch.fmt; var _self = this; - var formatted = str.replace(re, function() { + var formatted = str.replace(re, function () { var oldArgs = _self.variables.__; _self.variables.__ = [].slice.call(arguments); var fmtParts = _self.resolveVariables(fmtTokens, editor); var gChangeCase = "E"; - for (var i = 0; i < fmtParts.length; i++) { + for (var i = 0; i < fmtParts.length; i++) { var ch = fmtParts[i]; if (typeof ch == "object") { fmtParts[i] = ""; @@ -265,12 +253,15 @@ var SnippetManager = function() { fmtParts[i] = next[0].toLowerCase(); fmtParts[i + 1] = next.substr(1); } - } else if (ch.changeCase) { + } + else if (ch.changeCase) { gChangeCase = ch.changeCase; } - } else if (gChangeCase == "U") { + } + else if (gChangeCase == "U") { fmtParts[i] = ch.toUpperCase(); - } else if (gChangeCase == "L") { + } + else if (gChangeCase == "L") { fmtParts[i] = ch.toLowerCase(); } } @@ -279,16 +270,14 @@ var SnippetManager = function() { }); return formatted; }; - - this.tmFormatFunction = function(str, ch, editor) { + SnippetManager.prototype.tmFormatFunction = function (str, ch, editor) { if (ch.formatFunction == "upcase") return str.toUpperCase(); if (ch.formatFunction == "downcase") return str.toLowerCase(); return str; }; - - this.resolveVariables = function(snippet, editor) { + SnippetManager.prototype.resolveVariables = function (snippet, editor) { var result = []; var indentation = ""; var afterNewLine = true; @@ -306,34 +295,37 @@ var SnippetManager = function() { } continue; } - if (!ch) continue; + if (!ch) + continue; afterNewLine = false; - if (ch.fmtString) { var j = snippet.indexOf(ch, i + 1); - if (j == -1) j = snippet.length; + if (j == -1) + j = snippet.length; ch.fmt = snippet.slice(i + 1, j); i = j; } - if (ch.text) { var value = this.getVariableValue(editor, ch.text, indentation) + ""; if (ch.fmtString) value = this.tmStrFormat(value, ch, editor); if (ch.formatFunction) value = this.tmFormatFunction(value, ch, editor); - if (value && !ch.ifEnd) { result.push(value); gotoNext(ch); - } else if (!value && ch.ifEnd) { + } + else if (!value && ch.ifEnd) { gotoNext(ch.ifEnd); } - } else if (ch.elseEnd) { + } + else if (ch.elseEnd) { gotoNext(ch.elseEnd); - } else if (ch.tabstopId != null) { + } + else if (ch.tabstopId != null) { result.push(ch); - } else if (ch.changeCase != null) { + } + else if (ch.changeCase != null) { result.push(ch); } } @@ -344,142 +336,35 @@ var SnippetManager = function() { } return result; }; - - this.insertSnippetForSelection = function(editor, snippetText) { - var cursor = editor.getCursorPosition(); - var line = editor.session.getLine(cursor.row); - var tabString = editor.session.getTabString(); - var indentString = line.match(/^\s*/)[0]; - - if (cursor.column < indentString.length) - indentString = indentString.slice(0, cursor.column); - - snippetText = snippetText.replace(/\r/g, ""); - var tokens = this.tokenizeTmSnippet(snippetText); - tokens = this.resolveVariables(tokens, editor); - tokens = tokens.map(function(x) { - if (x == "\n") - return x + indentString; - if (typeof x == "string") - return x.replace(/\t/g, tabString); - return x; - }); - var tabstops = []; - tokens.forEach(function(p, i) { - if (typeof p != "object") - return; - var id = p.tabstopId; - var ts = tabstops[id]; - if (!ts) { - ts = tabstops[id] = []; - ts.index = id; - ts.value = ""; - ts.parents = {}; - } - if (ts.indexOf(p) !== -1) - return; - if (p.choices && !ts.choices) - ts.choices = p.choices; - ts.push(p); - var i1 = tokens.indexOf(p, i + 1); - if (i1 === -1) - return; - - var value = tokens.slice(i + 1, i1); - var isNested = value.some(function(t) {return typeof t === "object";}); - if (isNested && !ts.value) { - ts.value = value; - } else if (value.length && (!ts.value || typeof ts.value !== "string")) { - ts.value = value.join(""); - } - }); - tabstops.forEach(function(ts) {ts.length = 0;}); - var expanding = {}; - function copyValue(val) { - var copy = []; - for (var i = 0; i < val.length; i++) { - var p = val[i]; - if (typeof p == "object") { - if (expanding[p.tabstopId]) - continue; - var j = val.lastIndexOf(p, i - 1); - p = copy[j] || {tabstopId: p.tabstopId}; - } - copy[i] = p; - } - return copy; - } - for (var i = 0; i < tokens.length; i++) { - var p = tokens[i]; - if (typeof p != "object") - continue; - var id = p.tabstopId; - var ts = tabstops[id]; - var i1 = tokens.indexOf(p, i + 1); - if (expanding[id]) { - if (expanding[id] === p) { - delete expanding[id]; - Object.keys(expanding).forEach(function(parentId) { - ts.parents[parentId] = true; - }); - } - continue; - } - expanding[id] = p; - var value = ts.value; - if (typeof value !== "string") - value = copyValue(value); - else if (p.fmt) - value = this.tmStrFormat(value, p, editor); - tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); - - if (ts.indexOf(p) === -1) - ts.push(p); - } - var row = 0, column = 0; - var text = ""; - tokens.forEach(function(t) { - if (typeof t === "string") { - var lines = t.split("\n"); - if (lines.length > 1){ - column = lines[lines.length - 1].length; - row += lines.length - 1; - } else - column += t.length; - text += t; - } else if (t) { - if (!t.start) - t.start = {row: row, column: column}; - else - t.end = {row: row, column: column}; - } - }); + SnippetManager.prototype.getDisplayTextForSnippet = function (editor, snippetText) { + var processedSnippet = processSnippetText.call(this, editor, snippetText); + return processedSnippet.text; + }; + SnippetManager.prototype.insertSnippetForSelection = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } + var processedSnippet = processSnippetText.call(this, editor, snippetText, options); var range = editor.getSelectionRange(); - var end = editor.session.replace(range, text); - + var end = editor.session.replace(range, processedSnippet.text); var tabstopManager = new TabstopManager(editor); var selectionId = editor.inVirtualSelectionMode && editor.selection.index; - tabstopManager.addTabstops(tabstops, range.start, end, selectionId); + tabstopManager.addTabstops(processedSnippet.tabstops, range.start, end, selectionId); }; - - this.insertSnippet = function(editor, snippetText) { + SnippetManager.prototype.insertSnippet = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } var self = this; if (editor.inVirtualSelectionMode) - return self.insertSnippetForSelection(editor, snippetText); - - editor.forEachSelection(function() { - self.insertSnippetForSelection(editor, snippetText); - }, null, {keepOrder: true}); - + return self.insertSnippetForSelection(editor, snippetText, options); + editor.forEachSelection(function () { + self.insertSnippetForSelection(editor, snippetText, options); + }, null, { keepOrder: true }); if (editor.tabstopManager) editor.tabstopManager.tabNext(); }; - - this.$getScope = function(editor) { + SnippetManager.prototype.$getScope = function (editor) { var scope = editor.session.$mode.$id || ""; scope = scope.split("/").pop(); if (scope === "html" || scope === "php") { - if (scope === "php" && !editor.session.$mode.inlinePhp) + if (scope === "php" && !editor.session.$mode.inlinePhp) scope = "html"; var c = editor.getCursorPosition(); var state = editor.session.getState(c.row); @@ -495,11 +380,9 @@ var SnippetManager = function() { scope = "php"; } } - return scope; }; - - this.getActiveScopes = function(editor) { + SnippetManager.prototype.getActiveScopes = function (editor) { var scope = this.$getScope(editor); var scopes = [scope]; var snippetMap = this.snippetMap; @@ -509,26 +392,23 @@ var SnippetManager = function() { scopes.push("_"); return scopes; }; - - this.expandWithTab = function(editor, options) { + SnippetManager.prototype.expandWithTab = function (editor, options) { var self = this; - var result = editor.forEachSelection(function() { + var result = editor.forEachSelection(function () { return self.expandSnippetForSelection(editor, options); - }, null, {keepOrder: true}); + }, null, { keepOrder: true }); if (result && editor.tabstopManager) editor.tabstopManager.tabNext(); return result; }; - - this.expandSnippetForSelection = function(editor, options) { + SnippetManager.prototype.expandSnippetForSelection = function (editor, options) { var cursor = editor.getCursorPosition(); var line = editor.session.getLine(cursor.row); var before = line.substring(0, cursor.column); var after = line.substr(cursor.column); - var snippetMap = this.snippetMap; var snippet; - this.getActiveScopes(editor).some(function(scope) { + this.getActiveScopes(editor).some(function (scope) { var snippets = snippetMap[scope]; if (snippets) snippet = this.findMatchingSnippet(snippets, before, after); @@ -538,20 +418,14 @@ var SnippetManager = function() { return false; if (options && options.dryRun) return true; - editor.session.doc.removeInLine(cursor.row, - cursor.column - snippet.replaceBefore.length, - cursor.column + snippet.replaceAfter.length - ); - + editor.session.doc.removeInLine(cursor.row, cursor.column - snippet.replaceBefore.length, cursor.column + snippet.replaceAfter.length); this.variables.M__ = snippet.matchBefore; this.variables.T__ = snippet.matchAfter; this.insertSnippetForSelection(editor, snippet.content); - this.variables.M__ = this.variables.T__ = null; return true; }; - - this.findMatchingSnippet = function(snippetList, before, after) { + SnippetManager.prototype.findMatchingSnippet = function (snippetList, before, after) { for (var i = snippetList.length; i--;) { var s = snippetList[i]; if (s.startRe && !s.startRe.test(before)) @@ -560,7 +434,6 @@ var SnippetManager = function() { continue; if (!s.startRe && !s.endRe) continue; - s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; @@ -568,21 +441,15 @@ var SnippetManager = function() { return s; } }; - - this.snippetMap = {}; - this.snippetNameMap = {}; - this.register = function(snippets, scope) { + SnippetManager.prototype.register = function (snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; var self = this; - - if (!snippets) + if (!snippets) snippets = []; - function wrapRegexp(src) { if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) src = "(?:" + src + ")"; - return src || ""; } function guardedRegexp(re, guard, opening) { @@ -592,14 +459,14 @@ var SnippetManager = function() { re = guard + re; if (re && re[re.length - 1] != "$") re = re + "$"; - } else { + } + else { re = re + guard; if (re && re[0] != "^") re = "^" + re; } return new RegExp(re); } - function addSnippet(s) { if (!s.scope) s.scope = scope || "_"; @@ -608,7 +475,6 @@ var SnippetManager = function() { snippetMap[scope] = []; snippetNameMap[scope] = {}; } - var map = snippetNameMap[scope]; if (s.name) { var old = map[s.name]; @@ -617,48 +483,40 @@ var SnippetManager = function() { map[s.name] = s; } snippetMap[scope].push(s); - if (s.prefix) s.tabTrigger = s.prefix; - if (!s.content && s.body) s.content = Array.isArray(s.body) ? s.body.join("\n") : s.body; - if (s.tabTrigger && !s.trigger) { if (!s.guard && /^\w/.test(s.tabTrigger)) s.guard = "\\b"; s.trigger = lang.escapeRegExp(s.tabTrigger); } - if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard) return; - s.startRe = guardedRegexp(s.trigger, s.guard, true); s.triggerRe = new RegExp(s.trigger); - s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); s.endTriggerRe = new RegExp(s.endTrigger); } - if (Array.isArray(snippets)) { snippets.forEach(addSnippet); - } else { - Object.keys(snippets).forEach(function(key) { + } + else { + Object.keys(snippets).forEach(function (key) { addSnippet(snippets[key]); }); } - - this._signal("registerSnippets", {scope: scope}); + this._signal("registerSnippets", { scope: scope }); }; - this.unregister = function(snippets, scope) { + SnippetManager.prototype.unregister = function (snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; - function removeSnippet(s) { - var nameMap = snippetNameMap[s.scope||scope]; + var nameMap = snippetNameMap[s.scope || scope]; if (nameMap && nameMap[s.name]) { delete nameMap[s.name]; - var map = snippetMap[s.scope||scope]; + var map = snippetMap[s.scope || scope]; var i = map && map.indexOf(s); if (i >= 0) map.splice(i, 1); @@ -669,9 +527,9 @@ var SnippetManager = function() { else if (Array.isArray(snippets)) snippets.forEach(removeSnippet); }; - this.parseSnippetFile = function(str) { + SnippetManager.prototype.parseSnippetFile = function (str) { str = str.replace(/\r/g, ""); - var list = [], snippet = {}; + var list = [], /**@type{Snippet}*/ snippet = {}; var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; var m; while (m = re.exec(str)) { @@ -679,12 +537,15 @@ var SnippetManager = function() { try { snippet = JSON.parse(m[1]); list.push(snippet); - } catch (e) {} - } if (m[4]) { + } + catch (e) { } + } + if (m[4]) { snippet.content = m[4].replace(/^\t/gm, ""); list.push(snippet); snippet = {}; - } else { + } + else { var key = m[2], val = m[3]; if (key == "regex") { var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; @@ -692,21 +553,23 @@ var SnippetManager = function() { snippet.trigger = guardRe.exec(val)[1]; snippet.endTrigger = guardRe.exec(val)[1]; snippet.endGuard = guardRe.exec(val)[1]; - } else if (key == "snippet") { + } + else if (key == "snippet") { snippet.tabTrigger = val.match(/^\S*/)[0]; if (!snippet.name) snippet.name = val; - } else if (key) { + } + else if (key) { snippet[key] = val; } } } return list; }; - this.getSnippetByName = function(name, editor) { + SnippetManager.prototype.getSnippetByName = function (name, editor) { var snippetMap = this.snippetNameMap; var snippet; - this.getActiveScopes(editor).some(function(scope) { + this.getActiveScopes(editor).some(function (scope) { var snippets = snippetMap[scope]; if (snippets) snippet = snippets[name]; @@ -714,59 +577,172 @@ var SnippetManager = function() { }, this); return snippet; }; - -}).call(SnippetManager.prototype); - - -var TabstopManager = function(editor) { - if (editor.tabstopManager) - return editor.tabstopManager; - editor.tabstopManager = this; - this.$onChange = this.onChange.bind(this); - this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; - this.$onChangeSession = this.onChangeSession.bind(this); - this.$onAfterExec = this.onAfterExec.bind(this); - this.attach(editor); + return SnippetManager; +}()); +oop.implement(SnippetManager.prototype, EventEmitter); +var processSnippetText = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var tabString = editor.session.getTabString(); + var indentString = line.match(/^\s*/)[0]; + if (cursor.column < indentString.length) + indentString = indentString.slice(0, cursor.column); + snippetText = snippetText.replace(/\r/g, ""); + var tokens = this.tokenizeTmSnippet(snippetText); + tokens = this.resolveVariables(tokens, editor); + tokens = tokens.map(function (x) { + if (x == "\n" && !options.excludeExtraIndent) + return x + indentString; + if (typeof x == "string") + return x.replace(/\t/g, tabString); + return x; + }); + var tabstops = []; + tokens.forEach(function (p, i) { + if (typeof p != "object") + return; + var id = p.tabstopId; + var ts = tabstops[id]; + if (!ts) { + ts = tabstops[id] = []; + ts.index = id; + ts.value = ""; + ts.parents = {}; + } + if (ts.indexOf(p) !== -1) + return; + if (p.choices && !ts.choices) + ts.choices = p.choices; + ts.push(p); + var i1 = tokens.indexOf(p, i + 1); + if (i1 === -1) + return; + var value = tokens.slice(i + 1, i1); + var isNested = value.some(function (t) { return typeof t === "object"; }); + if (isNested && !ts.value) { + ts.value = value; + } + else if (value.length && (!ts.value || typeof ts.value !== "string")) { + ts.value = value.join(""); + } + }); + tabstops.forEach(function (ts) { ts.length = 0; }); + var expanding = {}; + function copyValue(val) { + var copy = []; + for (var i = 0; i < val.length; i++) { + var p = val[i]; + if (typeof p == "object") { + if (expanding[p.tabstopId]) + continue; + var j = val.lastIndexOf(p, i - 1); + p = copy[j] || { tabstopId: p.tabstopId }; + } + copy[i] = p; + } + return copy; + } + for (var i = 0; i < tokens.length; i++) { + var p = tokens[i]; + if (typeof p != "object") + continue; + var id = p.tabstopId; + var ts = tabstops[id]; + var i1 = tokens.indexOf(p, i + 1); + if (expanding[id]) { + if (expanding[id] === p) { + delete expanding[id]; + Object.keys(expanding).forEach(function (parentId) { + ts.parents[parentId] = true; + }); + } + continue; + } + expanding[id] = p; + var value = ts.value; + if (typeof value !== "string") + value = copyValue(value); + else if (p.fmt) + value = this.tmStrFormat(value, p, editor); + tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); + if (ts.indexOf(p) === -1) + ts.push(p); + } + var row = 0, column = 0; + var text = ""; + tokens.forEach(function (t) { + if (typeof t === "string") { + var lines = t.split("\n"); + if (lines.length > 1) { + column = lines[lines.length - 1].length; + row += lines.length - 1; + } + else + column += t.length; + text += t; + } + else if (t) { + if (!t.start) + t.start = { row: row, column: column }; + else + t.end = { row: row, column: column }; + } + }); + return { + text: text, + tabstops: tabstops, + tokens: tokens + }; }; -(function() { - this.attach = function(editor) { +var TabstopManager = /** @class */ (function () { + function TabstopManager(editor) { this.index = 0; this.ranges = []; this.tabstops = []; + if (editor.tabstopManager) + return editor.tabstopManager; + editor.tabstopManager = this; + this.$onChange = this.onChange.bind(this); + this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; + this.$onChangeSession = this.onChangeSession.bind(this); + this.$onAfterExec = this.onAfterExec.bind(this); + this.attach(editor); + } + TabstopManager.prototype.attach = function (editor) { this.$openTabstops = null; this.selectedTabstop = null; - this.editor = editor; + this.session = editor.session; this.editor.on("change", this.$onChange); this.editor.on("changeSelection", this.$onChangeSelection); this.editor.on("changeSession", this.$onChangeSession); this.editor.commands.on("afterExec", this.$onAfterExec); this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); }; - this.detach = function() { + TabstopManager.prototype.detach = function () { this.tabstops.forEach(this.removeTabstopMarkers, this); - this.ranges = null; - this.tabstops = null; + this.ranges.length = 0; + this.tabstops.length = 0; this.selectedTabstop = null; - this.editor.removeListener("change", this.$onChange); - this.editor.removeListener("changeSelection", this.$onChangeSelection); - this.editor.removeListener("changeSession", this.$onChangeSession); - this.editor.commands.removeListener("afterExec", this.$onAfterExec); + this.editor.off("change", this.$onChange); + this.editor.off("changeSelection", this.$onChangeSelection); + this.editor.off("changeSession", this.$onChangeSession); + this.editor.commands.off("afterExec", this.$onAfterExec); this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); this.editor.tabstopManager = null; + this.session = null; this.editor = null; }; - - this.onChange = function(delta) { + TabstopManager.prototype.onChange = function (delta) { var isRemove = delta.action[0] == "r"; var selectedTabstop = this.selectedTabstop || {}; var parents = selectedTabstop.parents || {}; - var tabstops = (this.tabstops || []).slice(); + var tabstops = this.tabstops.slice(); for (var i = 0; i < tabstops.length; i++) { var ts = tabstops[i]; var active = ts == selectedTabstop || parents[ts.index]; ts.rangeList.$bias = active ? 0 : 1; - if (delta.action == "remove" && ts !== selectedTabstop) { var parentActive = ts.parents && ts.parents[selectedTabstop.index]; var startIndex = ts.rangeList.pointIndex(delta.start, parentActive); @@ -779,16 +755,16 @@ var TabstopManager = function(editor) { } ts.rangeList.$onChange(delta); } - var session = this.editor.session; + var session = this.session; if (!this.$inChange && isRemove && session.getLength() == 1 && !session.getValue()) this.detach(); }; - this.updateLinkedFields = function() { + TabstopManager.prototype.updateLinkedFields = function () { var ts = this.selectedTabstop; if (!ts || !ts.hasLinkedRanges || !ts.firstNonLinked) return; this.$inChange = true; - var session = this.editor.session; + var session = this.session; var text = session.getTextRange(ts.firstNonLinked); for (var i = 0; i < ts.length; i++) { var range = ts[i]; @@ -800,11 +776,11 @@ var TabstopManager = function(editor) { } this.$inChange = false; }; - this.onAfterExec = function(e) { + TabstopManager.prototype.onAfterExec = function (e) { if (e.command && !e.command.readOnly) this.updateLinkedFields(); }; - this.onChangeSelection = function() { + TabstopManager.prototype.onChangeSelection = function () { if (!this.editor) return; var lead = this.editor.selection.lead; @@ -820,20 +796,22 @@ var TabstopManager = function(editor) { } this.detach(); }; - this.onChangeSession = function() { + TabstopManager.prototype.onChangeSession = function () { this.detach(); }; - this.tabNext = function(dir) { + TabstopManager.prototype.tabNext = function (dir) { var max = this.tabstops.length; var index = this.index + (dir || 1); index = Math.min(Math.max(index, 1), max); if (index == max) index = 0; this.selectTabstop(index); - if (index === 0) + this.updateTabstopMarkers(); + if (index === 0) { this.detach(); + } }; - this.selectTabstop = function(index) { + TabstopManager.prototype.selectTabstop = function (index) { this.$openTabstops = null; var ts = this.tabstops[this.index]; if (ts) @@ -842,10 +820,10 @@ var TabstopManager = function(editor) { ts = this.tabstops[this.index]; if (!ts || !ts.length) return; - this.selectedTabstop = ts; var range = ts.firstNonLinked || ts; - if (ts.choices) range.cursor = range.start; + if (ts.choices) + range.cursor = range.start; if (!this.editor.inVirtualSelectionMode) { var sel = this.editor.multiSelect; sel.toSingleRange(range); @@ -854,17 +832,16 @@ var TabstopManager = function(editor) { continue; sel.addRange(ts[i].clone(), true); } - } else { + } + else { this.editor.selection.fromOrientedRange(range); } - this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); if (this.selectedTabstop && this.selectedTabstop.choices) - this.editor.execCommand("startAutocomplete", {matches: this.selectedTabstop.choices}); + this.editor.execCommand("startAutocomplete", { matches: this.selectedTabstop.choices }); }; - this.addTabstops = function(tabstops, start, end) { + TabstopManager.prototype.addTabstops = function (tabstops, start, end) { var useLink = this.useLink || !this.editor.getOption("enableMultiselect"); - if (!this.$openTabstops) this.$openTabstops = []; if (!tabstops[0]) { @@ -874,13 +851,13 @@ var TabstopManager = function(editor) { tabstops[0] = [p]; tabstops[0].index = 0; } - var i = this.index; var arg = [i + 1, 0]; var ranges = this.ranges; - tabstops.forEach(function(ts, index) { + var snippetId = this.snippetId = (this.snippetId || 0) + 1; + tabstops.forEach(function (ts, index) { var dest = this.$openTabstops[index] || ts; - + dest.snippetId = snippetId; for (var i = 0; i < ts.length; i++) { var p = ts[i]; var range = Range.fromPoints(p.start, p.end || p.start); @@ -896,7 +873,8 @@ var TabstopManager = function(editor) { if (p.fmtString || (dest.firstNonLinked && useLink)) { range.linked = true; dest.hasLinkedRanges = true; - } else if (!dest.firstNonLinked) + } + else if (!dest.firstNonLinked) dest.firstNonLinked = range; } if (!dest.firstNonLinked) @@ -910,36 +888,51 @@ var TabstopManager = function(editor) { dest.rangeList.$bias = 0; dest.rangeList.addList(dest); }, this); - if (arg.length > 2) { if (this.tabstops.length) arg.push(arg.splice(2, 1)[0]); this.tabstops.splice.apply(this.tabstops, arg); } }; - - this.addTabstopMarkers = function(ts) { - var session = this.editor.session; - ts.forEach(function(range) { - if (!range.markerId) + TabstopManager.prototype.addTabstopMarkers = function (ts) { + var session = this.session; + ts.forEach(function (range) { + if (!range.markerId) range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); }); }; - this.removeTabstopMarkers = function(ts) { - var session = this.editor.session; - ts.forEach(function(range) { + TabstopManager.prototype.removeTabstopMarkers = function (ts) { + var session = this.session; + ts.forEach(function (range) { session.removeMarker(range.markerId); range.markerId = null; }); }; - this.removeRange = function(range) { + TabstopManager.prototype.updateTabstopMarkers = function () { + if (!this.selectedTabstop) + return; + var currentSnippetId = this.selectedTabstop.snippetId; + if (this.selectedTabstop.index === 0) { + currentSnippetId--; + } + this.tabstops.forEach(function (ts) { + if (ts.snippetId === currentSnippetId) + this.addTabstopMarkers(ts); + else + this.removeTabstopMarkers(ts); + }, this); + }; + TabstopManager.prototype.removeRange = function (range) { var i = range.tabstop.indexOf(range); - if (i != -1) range.tabstop.splice(i, 1); + if (i != -1) + range.tabstop.splice(i, 1); i = this.ranges.indexOf(range); - if (i != -1) this.ranges.splice(i, 1); + if (i != -1) + this.ranges.splice(i, 1); i = range.tabstop.rangeList.ranges.indexOf(range); - if (i != -1) range.tabstop.splice(i, 1); - this.editor.session.removeMarker(range.markerId); + if (i != -1) + range.tabstop.splice(i, 1); + this.session.removeMarker(range.markerId); if (!range.tabstop.length) { i = this.tabstops.indexOf(range.tabstop); if (i != -1) @@ -948,428 +941,546 @@ var TabstopManager = function(editor) { this.detach(); } }; - - this.keyboardHandler = new HashHandler(); - this.keyboardHandler.bindKeys({ - "Tab": function(editor) { - if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) - return; - editor.tabstopManager.tabNext(1); - editor.renderer.scrollCursorIntoView(); - }, - "Shift-Tab": function(editor) { - editor.tabstopManager.tabNext(-1); - editor.renderer.scrollCursorIntoView(); - }, - "Esc": function(editor) { - editor.tabstopManager.detach(); - } - }); -}).call(TabstopManager.prototype); - - - -var movePoint = function(point, diff) { + return TabstopManager; +}()); +TabstopManager.prototype.keyboardHandler = new HashHandler(); +TabstopManager.prototype.keyboardHandler.bindKeys({ + "Tab": function (editor) { + if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) + return; + editor.tabstopManager.tabNext(1); + editor.renderer.scrollCursorIntoView(); + }, + "Shift-Tab": function (editor) { + editor.tabstopManager.tabNext(-1); + editor.renderer.scrollCursorIntoView(); + }, + "Esc": function (editor) { + editor.tabstopManager.detach(); + } +}); +var movePoint = function (point, diff) { if (point.row == 0) point.column += diff.column; point.row += diff.row; }; - -var moveRelative = function(point, start) { +var moveRelative = function (point, start) { if (point.row == start.row) point.column -= start.column; point.row -= start.row; }; - - -dom.importCssString("\ -.ace_snippet-marker {\ - -moz-box-sizing: border-box;\ - box-sizing: border-box;\ - background: rgba(194, 193, 208, 0.09);\ - border: 1px dotted rgba(211, 208, 235, 0.62);\ - position: absolute;\ -}", "snippets.css", false); - +dom.importCssString("\n.ace_snippet-marker {\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n background: rgba(194, 193, 208, 0.09);\n border: 1px dotted rgba(211, 208, 235, 0.62);\n position: absolute;\n}", "snippets.css", false); exports.snippetManager = new SnippetManager(); - - var Editor = require("./editor").Editor; -(function() { - this.insertSnippet = function(content, options) { +(function () { + this.insertSnippet = function (content, options) { return exports.snippetManager.insertSnippet(this, content, options); }; - this.expandSnippet = function(options) { + this.expandSnippet = function (options) { return exports.snippetManager.expandWithTab(this, options); }; }).call(Editor.prototype); }); -define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/config","ace/lib/useragent"], function(require, exports, module){"use strict"; var Renderer = require("../virtual_renderer").VirtualRenderer; var Editor = require("../editor").Editor; var Range = require("../range").Range; var event = require("../lib/event"); var lang = require("../lib/lang"); var dom = require("../lib/dom"); - -var $singleLineEditor = function(el) { +var nls = require("../config").nls; +var userAgent = require("./../lib/useragent"); +var getAriaId = function (index) { + return "suggest-aria-id:".concat(index); +}; +var popupAriaRole = userAgent.isSafari ? "menu" : "listbox"; +var optionAriaRole = userAgent.isSafari ? "menuitem" : "option"; +var ariaActiveState = userAgent.isSafari ? "aria-current" : "aria-selected"; +var $singleLineEditor = function (el) { var renderer = new Renderer(el); - renderer.$maxLines = 4; - var editor = new Editor(renderer); - editor.setHighlightActiveLine(false); editor.setShowPrintMargin(false); editor.renderer.setShowGutter(false); editor.renderer.setHighlightGutterLine(false); - editor.$mouseHandler.$focusTimeout = 0; editor.$highlightTagPending = true; - return editor; }; +var AcePopup = /** @class */ (function () { + function AcePopup(parentNode) { + var el = dom.createElement("div"); + var popup = $singleLineEditor(el); + if (parentNode) { + parentNode.appendChild(el); + } + el.style.display = "none"; + popup.renderer.content.style.cursor = "default"; + popup.renderer.setStyle("ace_autocomplete"); + popup.renderer.$textLayer.element.setAttribute("role", popupAriaRole); + popup.renderer.$textLayer.element.setAttribute("aria-roledescription", nls("autocomplete.popup.aria-roledescription", "Autocomplete suggestions")); + popup.renderer.$textLayer.element.setAttribute("aria-label", nls("autocomplete.popup.aria-label", "Autocomplete suggestions")); + popup.renderer.textarea.setAttribute("aria-hidden", "true"); + popup.setOption("displayIndentGuides", false); + popup.setOption("dragDelay", 150); + var noop = function () { }; + popup.focus = noop; + popup.$isFocused = true; + popup.renderer.$cursorLayer.restartTimer = noop; + popup.renderer.$cursorLayer.element.style.opacity = "0"; + popup.renderer.$maxLines = 8; + popup.renderer.$keepTextAreaAtCursor = false; + popup.setHighlightActiveLine(false); + popup.session.highlight(""); + popup.session.$searchHighlight.clazz = "ace_highlight-marker"; + popup.on("mousedown", function (e) { + var pos = e.getDocumentPosition(); + popup.selection.moveToPosition(pos); + selectionMarker.start.row = selectionMarker.end.row = pos.row; + e.stop(); + }); + var lastMouseEvent; + var hoverMarker = new Range(-1, 0, -1, Infinity); + var selectionMarker = new Range(-1, 0, -1, Infinity); + selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine"); + popup.setSelectOnHover = function (val) { + if (!val) { + hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine"); + } + else if (hoverMarker.id) { + popup.session.removeMarker(hoverMarker.id); + hoverMarker.id = null; + } + }; + popup.setSelectOnHover(false); + popup.on("mousemove", function (e) { + if (!lastMouseEvent) { + lastMouseEvent = e; + return; + } + if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) { + return; + } + lastMouseEvent = e; + lastMouseEvent.scrollTop = popup.renderer.scrollTop; + popup.isMouseOver = true; + var row = lastMouseEvent.getDocumentPosition().row; + if (hoverMarker.start.row != row) { + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row); + } + }); + popup.renderer.on("beforeRender", function () { + if (lastMouseEvent && hoverMarker.start.row != -1) { + lastMouseEvent.$pos = null; + var row = lastMouseEvent.getDocumentPosition().row; + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row, true); + } + }); + popup.renderer.on("afterRender", function () { + var t = popup.renderer.$textLayer; + for (var row = t.config.firstRow, l = t.config.lastRow; row <= l; row++) { + var popupRowElement = /** @type {HTMLElement|null} */ (t.element.childNodes[row - t.config.firstRow]); + popupRowElement.setAttribute("role", optionAriaRole); + popupRowElement.setAttribute("aria-roledescription", nls("autocomplete.popup.item.aria-roledescription", "item")); + popupRowElement.setAttribute("aria-setsize", popup.data.length); + popupRowElement.setAttribute("aria-describedby", "doc-tooltip"); + popupRowElement.setAttribute("aria-posinset", row + 1); + var rowData = popup.getData(row); + if (rowData) { + var ariaLabel = "".concat(rowData.caption || rowData.value).concat(rowData.meta ? ", ".concat(rowData.meta) : ''); + popupRowElement.setAttribute("aria-label", ariaLabel); + } + var highlightedSpans = popupRowElement.querySelectorAll(".ace_completion-highlight"); + highlightedSpans.forEach(function (span) { + span.setAttribute("role", "mark"); + }); + } + }); + popup.renderer.on("afterRender", function () { + var row = popup.getRow(); + var t = popup.renderer.$textLayer; + var selected = /** @type {HTMLElement|null} */ (t.element.childNodes[row - t.config.firstRow]); + var el = document.activeElement; // Active element is textarea of main editor + if (selected !== popup.selectedNode && popup.selectedNode) { + dom.removeCssClass(popup.selectedNode, "ace_selected"); + popup.selectedNode.removeAttribute(ariaActiveState); + popup.selectedNode.removeAttribute("id"); + } + el.removeAttribute("aria-activedescendant"); + popup.selectedNode = selected; + if (selected) { + var ariaId = getAriaId(row); + dom.addCssClass(selected, "ace_selected"); + selected.id = ariaId; + t.element.setAttribute("aria-activedescendant", ariaId); + el.setAttribute("aria-activedescendant", ariaId); + selected.setAttribute(ariaActiveState, "true"); + } + }); + var hideHoverMarker = function () { setHoverMarker(-1); }; + var setHoverMarker = function (row, suppressRedraw) { + if (row !== hoverMarker.start.row) { + hoverMarker.start.row = hoverMarker.end.row = row; + if (!suppressRedraw) + popup.session._emit("changeBackMarker"); + popup._emit("changeHoverMarker"); + } + }; + popup.getHoveredRow = function () { + return hoverMarker.start.row; + }; + event.addListener(popup.container, "mouseout", function () { + popup.isMouseOver = false; + hideHoverMarker(); + }); + popup.on("hide", hideHoverMarker); + popup.on("changeSelection", hideHoverMarker); + popup.session.doc.getLength = function () { + return popup.data.length; + }; + popup.session.doc.getLine = function (i) { + var data = popup.data[i]; + if (typeof data == "string") + return data; + return (data && data.value) || ""; + }; + var bgTokenizer = popup.session.bgTokenizer; + bgTokenizer.$tokenizeRow = function (row) { + var data = popup.data[row]; + var tokens = []; + if (!data) + return tokens; + if (typeof data == "string") + data = { value: data }; + var caption = data.caption || data.value || data.name; + function addToken(value, className) { + value && tokens.push({ + type: (data.className || "") + (className || ""), + value: value + }); + } + var lower = caption.toLowerCase(); + var filterText = (popup.filterText || "").toLowerCase(); + var lastIndex = 0; + var lastI = 0; + for (var i = 0; i <= filterText.length; i++) { + if (i != lastI && (data.matchMask & (1 << i) || i == filterText.length)) { + var sub = filterText.slice(lastI, i); + lastI = i; + var index = lower.indexOf(sub, lastIndex); + if (index == -1) + continue; + addToken(caption.slice(lastIndex, index), ""); + lastIndex = index + sub.length; + addToken(caption.slice(index, lastIndex), "completion-highlight"); + } + } + addToken(caption.slice(lastIndex, caption.length), ""); + tokens.push({ type: "completion-spacer", value: " " }); + if (data.meta) + tokens.push({ type: "completion-meta", value: data.meta }); + if (data.message) + tokens.push({ type: "completion-message", value: data.message }); + return tokens; + }; + bgTokenizer.$updateOnChange = noop; + bgTokenizer.start = noop; + popup.session.$computeWidth = function () { + return this.screenWidth = 0; + }; + popup.isOpen = false; + popup.isTopdown = false; + popup.autoSelect = true; + popup.filterText = ""; + popup.isMouseOver = false; + popup.data = []; + popup.setData = function (list, filterText) { + popup.filterText = filterText || ""; + popup.setValue(lang.stringRepeat("\n", list.length), -1); + popup.data = list || []; + popup.setRow(0); + }; + popup.getData = function (row) { + return popup.data[row]; + }; + popup.getRow = function () { + return selectionMarker.start.row; + }; + popup.setRow = function (line) { + line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length - 1, line)); + if (selectionMarker.start.row != line) { + popup.selection.clearSelection(); + selectionMarker.start.row = selectionMarker.end.row = line || 0; + popup.session._emit("changeBackMarker"); + popup.moveCursorTo(line || 0, 0); + if (popup.isOpen) + popup._signal("select"); + } + }; + popup.on("changeSelection", function () { + if (popup.isOpen) + popup.setRow(popup.selection.lead.row); + popup.renderer.scrollCursorIntoView(); + }); + popup.hide = function () { + this.container.style.display = "none"; + popup.anchorPos = null; + popup.anchor = null; + if (popup.isOpen) { + popup.isOpen = false; + this._signal("hide"); + } + }; + popup.tryShow = function (pos, lineHeight, anchor, forceShow) { + if (!forceShow && popup.isOpen && popup.anchorPos && popup.anchor && + popup.anchorPos.top === pos.top && popup.anchorPos.left === pos.left && + popup.anchor === anchor) { + return true; + } + var el = this.container; + var scrollBarSize = this.renderer.scrollBar.width || 10; + var screenHeight = window.innerHeight - scrollBarSize; + var screenWidth = window.innerWidth - scrollBarSize; + var renderer = this.renderer; + var maxH = renderer.$maxLines * lineHeight * 1.4; + var dims = { top: 0, bottom: 0, left: 0 }; + var spaceBelow = screenHeight - pos.top - 3 * this.$borderSize - lineHeight; + var spaceAbove = pos.top - 3 * this.$borderSize; + if (!anchor) { + if (spaceAbove <= spaceBelow || spaceBelow >= maxH) { + anchor = "bottom"; + } + else { + anchor = "top"; + } + } + if (anchor === "top") { + dims.bottom = pos.top - this.$borderSize; + dims.top = dims.bottom - maxH; + } + else if (anchor === "bottom") { + dims.top = pos.top + lineHeight + this.$borderSize; + dims.bottom = dims.top + maxH; + } + var fitsX = dims.top >= 0 && dims.bottom <= screenHeight; + if (!forceShow && !fitsX) { + return false; + } + if (!fitsX) { + if (anchor === "top") { + renderer.$maxPixelHeight = spaceAbove; + } + else { + renderer.$maxPixelHeight = spaceBelow; + } + } + else { + renderer.$maxPixelHeight = null; + } + if (anchor === "top") { + el.style.top = ""; + el.style.bottom = (screenHeight + scrollBarSize - dims.bottom) + "px"; + popup.isTopdown = false; + } + else { + el.style.top = dims.top + "px"; + el.style.bottom = ""; + popup.isTopdown = true; + } + el.style.display = ""; + var left = pos.left; + if (left + el.offsetWidth > screenWidth) + left = screenWidth - el.offsetWidth; + el.style.left = left + "px"; + el.style.right = ""; + dom.$fixPositionBug(el); + if (!popup.isOpen) { + popup.isOpen = true; + this._signal("show"); + lastMouseEvent = null; + } + popup.anchorPos = pos; + popup.anchor = anchor; + return true; + }; + popup.show = function (pos, lineHeight, topdownOnly) { + this.tryShow(pos, lineHeight, topdownOnly ? "bottom" : undefined, true); + }; + popup.goTo = function (where) { + var row = this.getRow(); + var max = this.session.getLength() - 1; + switch (where) { + case "up": + row = row <= 0 ? max : row - 1; + break; + case "down": + row = row >= max ? -1 : row + 1; + break; + case "start": + row = 0; + break; + case "end": + row = max; + break; + } + this.setRow(row); + }; + popup.getTextLeftOffset = function () { + return this.$borderSize + this.renderer.$padding + this.$imageSize; + }; + popup.$imageSize = 0; + popup.$borderSize = 1; + return popup; + } + return AcePopup; +}()); +dom.importCssString("\n.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\n background-color: #CAD6FA;\n z-index: 1;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\n background-color: #3a674e;\n}\n.ace_editor.ace_autocomplete .ace_line-hover {\n border: 1px solid #abbffe;\n margin-top: -1px;\n background: rgba(233,233,253,0.4);\n position: absolute;\n z-index: 2;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_line-hover {\n border: 1px solid rgba(109, 150, 13, 0.8);\n background: rgba(58, 103, 78, 0.62);\n}\n.ace_completion-meta {\n opacity: 0.5;\n margin-left: 0.9em;\n}\n.ace_completion-message {\n margin-left: 0.9em;\n color: blue;\n}\n.ace_editor.ace_autocomplete .ace_completion-highlight{\n color: #2d69c7;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{\n color: #93ca12;\n}\n.ace_editor.ace_autocomplete {\n width: 300px;\n z-index: 200000;\n border: 1px lightgray solid;\n position: fixed;\n box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n line-height: 1.4;\n background: #fefefe;\n color: #111;\n}\n.ace_dark.ace_editor.ace_autocomplete {\n border: 1px #484747 solid;\n box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51);\n line-height: 1.4;\n background: #25282c;\n color: #c1c1c1;\n}\n.ace_autocomplete .ace_text-layer {\n width: calc(100% - 8px);\n}\n.ace_autocomplete .ace_line {\n display: flex;\n align-items: center;\n}\n.ace_autocomplete .ace_line > * {\n min-width: 0;\n flex: 0 0 auto;\n}\n.ace_autocomplete .ace_line .ace_ {\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.ace_autocomplete .ace_completion-spacer {\n flex: 1;\n}\n.ace_autocomplete.ace_loading:after {\n content: \"\";\n position: absolute;\n top: 0px;\n height: 2px;\n width: 8%;\n background: blue;\n z-index: 100;\n animation: ace_progress 3s infinite linear;\n animation-delay: 300ms;\n transform: translateX(-100%) scaleX(1);\n}\n@keyframes ace_progress {\n 0% { transform: translateX(-100%) scaleX(1) }\n 50% { transform: translateX(625%) scaleX(2) } \n 100% { transform: translateX(1500%) scaleX(3) } \n}\n@media (prefers-reduced-motion) {\n .ace_autocomplete.ace_loading:after {\n transform: translateX(625%) scaleX(2);\n animation: none;\n }\n}\n", "autocompletion.css", false); +exports.AcePopup = AcePopup; +exports.$singleLineEditor = $singleLineEditor; +exports.getAriaId = getAriaId; -var AcePopup = function(parentNode) { - var el = dom.createElement("div"); - var popup = new $singleLineEditor(el); - - if (parentNode) - parentNode.appendChild(el); - el.style.display = "none"; - popup.renderer.content.style.cursor = "default"; - popup.renderer.setStyle("ace_autocomplete"); - - popup.setOption("displayIndentGuides", false); - popup.setOption("dragDelay", 150); - - var noop = function(){}; - - popup.focus = noop; - popup.$isFocused = true; - - popup.renderer.$cursorLayer.restartTimer = noop; - popup.renderer.$cursorLayer.element.style.opacity = 0; - - popup.renderer.$maxLines = 8; - popup.renderer.$keepTextAreaAtCursor = false; +}); - popup.setHighlightActiveLine(false); - popup.session.highlight(""); - popup.session.$searchHighlight.clazz = "ace_highlight-marker"; +define("ace/autocomplete/inline_screenreader",["require","exports","module"], function(require, exports, module){"use strict"; +var AceInlineScreenReader = /** @class */ (function () { + function AceInlineScreenReader(editor) { + this.editor = editor; + this.screenReaderDiv = document.createElement("div"); + this.screenReaderDiv.classList.add("ace_screenreader-only"); + this.editor.container.appendChild(this.screenReaderDiv); + } + AceInlineScreenReader.prototype.setScreenReaderContent = function (content) { + if (!this.popup && this.editor.completer && /**@type{import("../autocomplete").Autocomplete}*/ (this.editor.completer).popup) { + this.popup = /**@type{import("../autocomplete").Autocomplete}*/ (this.editor.completer).popup; + this.popup.renderer.on("afterRender", function () { + var row = this.popup.getRow(); + var t = this.popup.renderer.$textLayer; + var selected = t.element.childNodes[row - t.config.firstRow]; + if (selected) { + var idString = "doc-tooltip "; + for (var lineIndex = 0; lineIndex < this._lines.length; lineIndex++) { + idString += "ace-inline-screenreader-line-".concat(lineIndex, " "); + } + selected.setAttribute("aria-describedby", idString); + } + }.bind(this)); + } + while (this.screenReaderDiv.firstChild) { + this.screenReaderDiv.removeChild(this.screenReaderDiv.firstChild); + } + this._lines = content.split(/\r\n|\r|\n/); + var codeElement = this.createCodeBlock(); + this.screenReaderDiv.appendChild(codeElement); + }; + AceInlineScreenReader.prototype.destroy = function () { + this.screenReaderDiv.remove(); + }; + AceInlineScreenReader.prototype.createCodeBlock = function () { + var container = document.createElement("pre"); + container.setAttribute("id", "ace-inline-screenreader"); + for (var lineIndex = 0; lineIndex < this._lines.length; lineIndex++) { + var codeElement = document.createElement("code"); + codeElement.setAttribute("id", "ace-inline-screenreader-line-".concat(lineIndex)); + var line = document.createTextNode(this._lines[lineIndex]); + codeElement.appendChild(line); + container.appendChild(codeElement); + } + return container; + }; + return AceInlineScreenReader; +}()); +exports.AceInlineScreenReader = AceInlineScreenReader; - popup.on("mousedown", function(e) { - var pos = e.getDocumentPosition(); - popup.selection.moveToPosition(pos); - selectionMarker.start.row = selectionMarker.end.row = pos.row; - e.stop(); - }); +}); - var lastMouseEvent; - var hoverMarker = new Range(-1,0,-1,Infinity); - var selectionMarker = new Range(-1,0,-1,Infinity); - selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine"); - popup.setSelectOnHover = function(val) { - if (!val) { - hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine"); - } else if (hoverMarker.id) { - popup.session.removeMarker(hoverMarker.id); - hoverMarker.id = null; - } - }; - popup.setSelectOnHover(false); - popup.on("mousemove", function(e) { - if (!lastMouseEvent) { - lastMouseEvent = e; - return; +define("ace/autocomplete/inline",["require","exports","module","ace/snippets","ace/autocomplete/inline_screenreader"], function(require, exports, module){"use strict"; +var snippetManager = require("../snippets").snippetManager; +var AceInlineScreenReader = require("./inline_screenreader").AceInlineScreenReader; +var AceInline = /** @class */ (function () { + function AceInline() { + this.editor = null; + } + AceInline.prototype.show = function (editor, completion, prefix) { + prefix = prefix || ""; + if (editor && this.editor && this.editor !== editor) { + this.hide(); + this.editor = null; + this.inlineScreenReader = null; } - if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) { - return; + if (!editor || !completion) { + return false; } - lastMouseEvent = e; - lastMouseEvent.scrollTop = popup.renderer.scrollTop; - var row = lastMouseEvent.getDocumentPosition().row; - if (hoverMarker.start.row != row) { - if (!hoverMarker.id) - popup.setRow(row); - setHoverMarker(row); + if (!this.inlineScreenReader) { + this.inlineScreenReader = new AceInlineScreenReader(editor); } - }); - popup.renderer.on("beforeRender", function() { - if (lastMouseEvent && hoverMarker.start.row != -1) { - lastMouseEvent.$pos = null; - var row = lastMouseEvent.getDocumentPosition().row; - if (!hoverMarker.id) - popup.setRow(row); - setHoverMarker(row, true); + var displayText = completion.snippet ? snippetManager.getDisplayTextForSnippet(editor, completion.snippet) : completion.value; + if (completion.hideInlinePreview || !displayText || !displayText.startsWith(prefix)) { + return false; } - }); - popup.renderer.on("afterRender", function() { - var row = popup.getRow(); - var t = popup.renderer.$textLayer; - var selected = t.element.childNodes[row - t.config.firstRow]; - if (selected !== t.selectedNode && t.selectedNode) - dom.removeCssClass(t.selectedNode, "ace_selected"); - t.selectedNode = selected; - if (selected) - dom.addCssClass(selected, "ace_selected"); - }); - var hideHoverMarker = function() { setHoverMarker(-1); }; - var setHoverMarker = function(row, suppressRedraw) { - if (row !== hoverMarker.start.row) { - hoverMarker.start.row = hoverMarker.end.row = row; - if (!suppressRedraw) - popup.session._emit("changeBackMarker"); - popup._emit("changeHoverMarker"); + this.editor = editor; + this.inlineScreenReader.setScreenReaderContent(displayText); + displayText = displayText.slice(prefix.length); + if (displayText === "") { + editor.removeGhostText(); + } + else { + editor.setGhostText(displayText); } + return true; }; - popup.getHoveredRow = function() { - return hoverMarker.start.row; + AceInline.prototype.isOpen = function () { + if (!this.editor) { + return false; + } + return !!this.editor.renderer.$ghostText; }; - - event.addListener(popup.container, "mouseout", hideHoverMarker); - popup.on("hide", hideHoverMarker); - popup.on("changeSelection", hideHoverMarker); - - popup.session.doc.getLength = function() { - return popup.data.length; - }; - popup.session.doc.getLine = function(i) { - var data = popup.data[i]; - if (typeof data == "string") - return data; - return (data && data.value) || ""; - }; - - var bgTokenizer = popup.session.bgTokenizer; - bgTokenizer.$tokenizeRow = function(row) { - var data = popup.data[row]; - var tokens = []; - if (!data) - return tokens; - if (typeof data == "string") - data = {value: data}; - var caption = data.caption || data.value || data.name; - - function addToken(value, className) { - value && tokens.push({ - type: (data.className || "") + (className || ""), - value: value - }); - } - - var lower = caption.toLowerCase(); - var filterText = (popup.filterText || "").toLowerCase(); - var lastIndex = 0; - var lastI = 0; - for (var i = 0; i <= filterText.length; i++) { - if (i != lastI && (data.matchMask & (1 << i) || i == filterText.length)) { - var sub = filterText.slice(lastI, i); - lastI = i; - var index = lower.indexOf(sub, lastIndex); - if (index == -1) continue; - addToken(caption.slice(lastIndex, index), ""); - lastIndex = index + sub.length; - addToken(caption.slice(index, lastIndex), "completion-highlight"); - } - } - addToken(caption.slice(lastIndex, caption.length), ""); - - if (data.meta) - tokens.push({type: "completion-meta", value: data.meta}); - if (data.message) - tokens.push({type: "completion-message", value: data.message}); - - return tokens; - }; - bgTokenizer.$updateOnChange = noop; - bgTokenizer.start = noop; - - popup.session.$computeWidth = function() { - return this.screenWidth = 0; - }; - popup.isOpen = false; - popup.isTopdown = false; - popup.autoSelect = true; - popup.filterText = ""; - - popup.data = []; - popup.setData = function(list, filterText) { - popup.filterText = filterText || ""; - popup.setValue(lang.stringRepeat("\n", list.length), -1); - popup.data = list || []; - popup.setRow(0); - }; - popup.getData = function(row) { - return popup.data[row]; - }; - - popup.getRow = function() { - return selectionMarker.start.row; - }; - popup.setRow = function(line) { - line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length, line)); - if (selectionMarker.start.row != line) { - popup.selection.clearSelection(); - selectionMarker.start.row = selectionMarker.end.row = line || 0; - popup.session._emit("changeBackMarker"); - popup.moveCursorTo(line || 0, 0); - if (popup.isOpen) - popup._signal("select"); - } - }; - - popup.on("changeSelection", function() { - if (popup.isOpen) - popup.setRow(popup.selection.lead.row); - popup.renderer.scrollCursorIntoView(); - }); - - popup.hide = function() { - this.container.style.display = "none"; - this._signal("hide"); - popup.isOpen = false; - }; - popup.show = function(pos, lineHeight, topdownOnly) { - var el = this.container; - var screenHeight = window.innerHeight; - var screenWidth = window.innerWidth; - var renderer = this.renderer; - var maxH = renderer.$maxLines * lineHeight * 1.4; - var top = pos.top + this.$borderSize; - var allowTopdown = top > screenHeight / 2 && !topdownOnly; - if (allowTopdown && top + lineHeight + maxH > screenHeight) { - renderer.$maxPixelHeight = top - 2 * this.$borderSize; - el.style.top = ""; - el.style.bottom = screenHeight - top + "px"; - popup.isTopdown = false; - } else { - top += lineHeight; - renderer.$maxPixelHeight = screenHeight - top - 0.2 * lineHeight; - el.style.top = top + "px"; - el.style.bottom = ""; - popup.isTopdown = true; + AceInline.prototype.hide = function () { + if (!this.editor) { + return false; } - - el.style.display = ""; - - var left = pos.left; - if (left + el.offsetWidth > screenWidth) - left = screenWidth - el.offsetWidth; - - el.style.left = left + "px"; - - this._signal("show"); - lastMouseEvent = null; - popup.isOpen = true; + this.editor.removeGhostText(); + return true; }; - - popup.goTo = function(where) { - var row = this.getRow(); - var max = this.session.getLength() - 1; - - switch(where) { - case "up": row = row <= 0 ? max : row - 1; break; - case "down": row = row >= max ? -1 : row + 1; break; - case "start": row = 0; break; - case "end": row = max; break; + AceInline.prototype.destroy = function () { + this.hide(); + this.editor = null; + if (this.inlineScreenReader) { + this.inlineScreenReader.destroy(); + this.inlineScreenReader = null; } - - this.setRow(row); - }; - - - popup.getTextLeftOffset = function() { - return this.$borderSize + this.renderer.$padding + this.$imageSize; }; + return AceInline; +}()); +exports.AceInline = AceInline; - popup.$imageSize = 0; - popup.$borderSize = 1; - - return popup; -}; - -dom.importCssString("\ -.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ - background-color: #CAD6FA;\ - z-index: 1;\ -}\ -.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ - background-color: #3a674e;\ -}\ -.ace_editor.ace_autocomplete .ace_line-hover {\ - border: 1px solid #abbffe;\ - margin-top: -1px;\ - background: rgba(233,233,253,0.4);\ - position: absolute;\ - z-index: 2;\ -}\ -.ace_dark.ace_editor.ace_autocomplete .ace_line-hover {\ - border: 1px solid rgba(109, 150, 13, 0.8);\ - background: rgba(58, 103, 78, 0.62);\ -}\ -.ace_completion-meta {\ - opacity: 0.5;\ - margin: 0.9em;\ -}\ -.ace_completion-message {\ - color: blue;\ -}\ -.ace_editor.ace_autocomplete .ace_completion-highlight{\ - color: #2d69c7;\ -}\ -.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{\ - color: #93ca12;\ -}\ -.ace_editor.ace_autocomplete {\ - width: 300px;\ - z-index: 200000;\ - border: 1px lightgray solid;\ - position: fixed;\ - box-shadow: 2px 3px 5px rgba(0,0,0,.2);\ - line-height: 1.4;\ - background: #fefefe;\ - color: #111;\ -}\ -.ace_dark.ace_editor.ace_autocomplete {\ - border: 1px #484747 solid;\ - box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51);\ - line-height: 1.4;\ - background: #25282c;\ - color: #c1c1c1;\ -}", "autocompletion.css", false); - -exports.AcePopup = AcePopup; -exports.$singleLineEditor = $singleLineEditor; }); -define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module) { -"use strict"; - -exports.parForEach = function(array, fn, callback) { +define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module){"use strict"; +exports.parForEach = function (array, fn, callback) { var completed = 0; var arLength = array.length; if (arLength === 0) callback(); for (var i = 0; i < arLength; i++) { - fn(array[i], function(result, err) { + fn(array[i], function (result, err) { completed++; if (completed === arLength) callback(result, err); }); } }; - var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\u2000\u2070-\uFFFF]/; - -exports.retrievePrecedingIdentifier = function(text, pos, regex) { +exports.retrievePrecedingIdentifier = function (text, pos, regex) { regex = regex || ID_REGEX; var buf = []; - for (var i = pos-1; i >= 0; i--) { + for (var i = pos - 1; i >= 0; i--) { if (regex.test(text[i])) buf.push(text[i]); else @@ -1377,8 +1488,7 @@ exports.retrievePrecedingIdentifier = function(text, pos, regex) { } return buf.reverse().join(""); }; - -exports.retrieveFollowingIdentifier = function(text, pos, regex) { +exports.retrieveFollowingIdentifier = function (text, pos, regex) { regex = regex || ID_REGEX; var buf = []; for (var i = pos; i < text.length; i++) { @@ -1389,14 +1499,13 @@ exports.retrieveFollowingIdentifier = function(text, pos, regex) { } return buf; }; - exports.getCompletionPrefix = function (editor) { var pos = editor.getCursorPosition(); var line = editor.session.getLine(pos.row); var prefix; - editor.completers.forEach(function(completer) { + editor.completers.forEach(function (completer) { if (completer.identifierRegexps) { - completer.identifierRegexps.forEach(function(identifierRegex) { + completer.identifierRegexps.forEach(function (identifierRegex) { if (!prefix && identifierRegex) prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex); }.bind(this)); @@ -1404,112 +1513,292 @@ exports.getCompletionPrefix = function (editor) { }.bind(this)); return prefix || this.retrievePrecedingIdentifier(line, pos.column); }; +exports.triggerAutocomplete = function (editor, previousChar) { + var previousChar = previousChar == null + ? editor.session.getPrecedingCharacter() + : previousChar; + return editor.completers.some(function (completer) { + if (completer.triggerCharacters && Array.isArray(completer.triggerCharacters)) { + return completer.triggerCharacters.includes(previousChar); + } + }); +}; }); -define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/lang","ace/lib/dom","ace/snippets","ace/config"], function(require, exports, module) { -"use strict"; - +define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/inline","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/lang","ace/lib/dom","ace/snippets","ace/config","ace/lib/event","ace/lib/scroll"], function(require, exports, module){"use strict"; var HashHandler = require("./keyboard/hash_handler").HashHandler; var AcePopup = require("./autocomplete/popup").AcePopup; +var AceInline = require("./autocomplete/inline").AceInline; +var getAriaId = require("./autocomplete/popup").getAriaId; var util = require("./autocomplete/util"); var lang = require("./lib/lang"); var dom = require("./lib/dom"); var snippetManager = require("./snippets").snippetManager; var config = require("./config"); - -var Autocomplete = function() { - this.autoInsert = false; - this.autoSelect = true; - this.exactMatch = false; - this.gatherCompletionsId = 0; - this.keyboardHandler = new HashHandler(); - this.keyboardHandler.bindKeys(this.commands); - - this.blurListener = this.blurListener.bind(this); - this.changeListener = this.changeListener.bind(this); - this.mousedownListener = this.mousedownListener.bind(this); - this.mousewheelListener = this.mousewheelListener.bind(this); - - this.changeTimer = lang.delayedCall(function() { - this.updateCompletions(true); - }.bind(this)); - - this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50); +var event = require("./lib/event"); +var preventParentScroll = require("./lib/scroll").preventParentScroll; +var destroyCompleter = function (e, editor) { + editor.completer && editor.completer.destroy(); }; - -(function() { - - this.$init = function() { - this.popup = new AcePopup(document.body || document.documentElement); - this.popup.on("click", function(e) { +var Autocomplete = /** @class */ (function () { + function Autocomplete() { + this.autoInsert = false; + this.autoSelect = true; + this.autoShown = false; + this.exactMatch = false; + this.inlineEnabled = false; + this.keyboardHandler = new HashHandler(); + this.keyboardHandler.bindKeys(this.commands); + this.parentNode = null; + this.setSelectOnHover = false; + this.hasSeen = new Set(); + this.showLoadingState = false; + this.stickySelectionDelay = 500; + this.blurListener = this.blurListener.bind(this); + this.changeListener = this.changeListener.bind(this); + this.mousedownListener = this.mousedownListener.bind(this); + this.mousewheelListener = this.mousewheelListener.bind(this); + this.onLayoutChange = this.onLayoutChange.bind(this); + this.changeTimer = lang.delayedCall(function () { + this.updateCompletions(true); + }.bind(this)); + this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50); + this.popupTimer = lang.delayedCall(this.$updatePopupPosition.bind(this), 50); + this.stickySelectionTimer = lang.delayedCall(function () { + this.stickySelection = true; + }.bind(this), this.stickySelectionDelay); + this.$firstOpenTimer = lang.delayedCall(/**@this{Autocomplete}*/ function () { + var initialPosition = this.completionProvider && this.completionProvider.initialPosition; + if (this.autoShown || (this.popup && this.popup.isOpen) || !initialPosition || this.editor.completers.length === 0) + return; + this.completions = new FilteredList(Autocomplete.completionsForLoading); + this.openPopup(this.editor, initialPosition.prefix, false); + this.popup.renderer.setStyle("ace_loading", true); + }.bind(this), this.stickySelectionDelay); + } + Object.defineProperty(Autocomplete, "completionsForLoading", { + get: function () { + return [{ + caption: config.nls("autocomplete.loading", "Loading..."), + value: "" + }]; + }, + enumerable: false, + configurable: true + }); + Autocomplete.prototype.$init = function () { + this.popup = new AcePopup(this.parentNode || document.body || document.documentElement); + this.popup.on("click", function (e) { this.insertMatch(); e.stop(); }.bind(this)); this.popup.focus = this.editor.focus.bind(this.editor); - this.popup.on("show", this.tooltipTimer.bind(null, null)); - this.popup.on("select", this.tooltipTimer.bind(null, null)); + this.popup.on("show", this.$onPopupShow.bind(this)); + this.popup.on("hide", this.$onHidePopup.bind(this)); + this.popup.on("select", this.$onPopupChange.bind(this)); + event.addListener(this.popup.container, "mouseout", this.mouseOutListener.bind(this)); this.popup.on("changeHoverMarker", this.tooltipTimer.bind(null, null)); + this.popup.renderer.on("afterRender", this.$onPopupRender.bind(this)); return this.popup; }; - - this.getPopup = function() { + Autocomplete.prototype.$initInline = function () { + if (!this.inlineEnabled || this.inlineRenderer) + return; + this.inlineRenderer = new AceInline(); + return this.inlineRenderer; + }; + Autocomplete.prototype.getPopup = function () { return this.popup || this.$init(); }; - - this.openPopup = function(editor, prefix, keepPopupPosition) { + Autocomplete.prototype.$onHidePopup = function () { + if (this.inlineRenderer) { + this.inlineRenderer.hide(); + } + this.hideDocTooltip(); + this.stickySelectionTimer.cancel(); + this.popupTimer.cancel(); + this.stickySelection = false; + }; + Autocomplete.prototype.$seen = function (completion) { + if (!this.hasSeen.has(completion) && completion && completion.completer && completion.completer.onSeen && typeof completion.completer.onSeen === "function") { + completion.completer.onSeen(this.editor, completion); + this.hasSeen.add(completion); + } + }; + Autocomplete.prototype.$onPopupChange = function (hide) { + if (this.inlineRenderer && this.inlineEnabled) { + var completion = hide ? null : this.popup.getData(this.popup.getRow()); + this.$updateGhostText(completion); + if (this.popup.isMouseOver && this.setSelectOnHover) { + this.tooltipTimer.call(null, null); + return; + } + this.popupTimer.schedule(); + this.tooltipTimer.schedule(); + } + else { + this.popupTimer.call(null, null); + this.tooltipTimer.call(null, null); + } + }; + Autocomplete.prototype.$updateGhostText = function (completion) { + var row = this.base.row; + var column = this.base.column; + var cursorColumn = this.editor.getCursorPosition().column; + var prefix = this.editor.session.getLine(row).slice(column, cursorColumn); + if (!this.inlineRenderer.show(this.editor, completion, prefix)) { + this.inlineRenderer.hide(); + } + else { + this.$seen(completion); + } + }; + Autocomplete.prototype.$onPopupRender = function () { + var inlineEnabled = this.inlineRenderer && this.inlineEnabled; + if (this.completions && this.completions.filtered && this.completions.filtered.length > 0) { + for (var i = this.popup.getFirstVisibleRow(); i <= this.popup.getLastVisibleRow(); i++) { + var completion = this.popup.getData(i); + if (completion && (!inlineEnabled || completion.hideInlinePreview)) { + this.$seen(completion); + } + } + } + }; + Autocomplete.prototype.$onPopupShow = function (hide) { + this.$onPopupChange(hide); + this.stickySelection = false; + if (this.stickySelectionDelay >= 0) + this.stickySelectionTimer.schedule(this.stickySelectionDelay); + }; + Autocomplete.prototype.observeLayoutChanges = function () { + if (this.$elements || !this.editor) + return; + window.addEventListener("resize", this.onLayoutChange, { passive: true }); + window.addEventListener("wheel", this.mousewheelListener); + var el = this.editor.container.parentNode; + var elements = []; + while (el) { + elements.push(el); + el.addEventListener("scroll", this.onLayoutChange, { passive: true }); + el = el.parentNode; + } + this.$elements = elements; + }; + Autocomplete.prototype.unObserveLayoutChanges = function () { + var _this = this; + window.removeEventListener("resize", this.onLayoutChange, { passive: true }); + window.removeEventListener("wheel", this.mousewheelListener); + this.$elements && this.$elements.forEach(function (el) { + el.removeEventListener("scroll", _this.onLayoutChange, { passive: true }); + }); + this.$elements = null; + }; + Autocomplete.prototype.onLayoutChange = function () { + if (!this.popup.isOpen) + return this.unObserveLayoutChanges(); + this.$updatePopupPosition(); + this.updateDocTooltip(); + }; + Autocomplete.prototype.$updatePopupPosition = function () { + var editor = this.editor; + var renderer = editor.renderer; + var lineHeight = renderer.layerConfig.lineHeight; + var pos = renderer.$cursorLayer.getPixelPosition(this.base, true); + pos.left -= this.popup.getTextLeftOffset(); + var rect = editor.container.getBoundingClientRect(); + pos.top += rect.top - renderer.layerConfig.offset; + pos.left += rect.left - editor.renderer.scrollLeft; + pos.left += renderer.gutterWidth; + var posGhostText = { + top: pos.top, + left: pos.left + }; + if (renderer.$ghostText && renderer.$ghostTextWidget) { + if (this.base.row === renderer.$ghostText.position.row) { + posGhostText.top += renderer.$ghostTextWidget.el.offsetHeight; + } + } + var editorContainerBottom = editor.container.getBoundingClientRect().bottom - lineHeight; + var lowestPosition = editorContainerBottom < posGhostText.top ? + { top: editorContainerBottom, left: posGhostText.left } : + posGhostText; + if (this.popup.tryShow(lowestPosition, lineHeight, "bottom")) { + return; + } + if (this.popup.tryShow(pos, lineHeight, "top")) { + return; + } + this.popup.show(pos, lineHeight); + }; + Autocomplete.prototype.openPopup = function (editor, prefix, keepPopupPosition) { + this.$firstOpenTimer.cancel(); if (!this.popup) this.$init(); - + if (this.inlineEnabled && !this.inlineRenderer) + this.$initInline(); this.popup.autoSelect = this.autoSelect; - + this.popup.setSelectOnHover(this.setSelectOnHover); + var oldRow = this.popup.getRow(); + var previousSelectedItem = this.popup.data[oldRow]; this.popup.setData(this.completions.filtered, this.completions.filterText); - + if (this.editor.textInput.setAriaOptions) { + this.editor.textInput.setAriaOptions({ + activeDescendant: getAriaId(this.popup.getRow()), + inline: this.inlineEnabled + }); + } editor.keyBinding.addKeyboardHandler(this.keyboardHandler); - - var renderer = editor.renderer; - this.popup.setRow(this.autoSelect ? 0 : -1); + var newRow; + if (this.stickySelection) + newRow = this.popup.data.indexOf(previousSelectedItem); + if (!newRow || newRow === -1) + newRow = 0; + this.popup.setRow(this.autoSelect ? newRow : -1); + if (newRow === oldRow && previousSelectedItem !== this.completions.filtered[newRow]) + this.$onPopupChange(); + var inlineEnabled = this.inlineRenderer && this.inlineEnabled; + if (newRow === oldRow && inlineEnabled) { + var completion = this.popup.getData(this.popup.getRow()); + this.$updateGhostText(completion); + } if (!keepPopupPosition) { this.popup.setTheme(editor.getTheme()); this.popup.setFontSize(editor.getFontSize()); - - var lineHeight = renderer.layerConfig.lineHeight; - - var pos = renderer.$cursorLayer.getPixelPosition(this.base, true); - pos.left -= this.popup.getTextLeftOffset(); - - var rect = editor.container.getBoundingClientRect(); - pos.top += rect.top - renderer.layerConfig.offset; - pos.left += rect.left - editor.renderer.scrollLeft; - pos.left += renderer.gutterWidth; - - this.popup.show(pos, lineHeight); - } else if (keepPopupPosition && !prefix) { - this.detach(); + this.$updatePopupPosition(); + if (this.tooltipNode) { + this.updateDocTooltip(); + } } this.changeTimer.cancel(); - }; - - this.detach = function() { - this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); - this.editor.off("changeSelection", this.changeListener); - this.editor.off("blur", this.blurListener); - this.editor.off("mousedown", this.mousedownListener); - this.editor.off("mousewheel", this.mousewheelListener); + this.observeLayoutChanges(); + }; + Autocomplete.prototype.detach = function () { + if (this.editor) { + this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); + this.editor.off("changeSelection", this.changeListener); + this.editor.off("blur", this.blurListener); + this.editor.off("mousedown", this.mousedownListener); + this.editor.off("mousewheel", this.mousewheelListener); + } + this.$firstOpenTimer.cancel(); this.changeTimer.cancel(); this.hideDocTooltip(); - - this.gatherCompletionsId += 1; + if (this.completionProvider) { + this.completionProvider.detach(); + } if (this.popup && this.popup.isOpen) this.popup.hide(); - + if (this.popup && this.popup.renderer) { + this.popup.renderer.off("afterRender", this.$onPopupRender); + } if (this.base) this.base.detach(); this.activated = false; - this.completions = this.base = null; + this.completionProvider = this.completions = this.base = null; + this.unObserveLayoutChanges(); }; - - this.changeListener = function(e) { + Autocomplete.prototype.changeListener = function (e) { var cursor = this.editor.selection.lead; if (cursor.row != this.base.row || cursor.column < this.base.column) { this.detach(); @@ -1519,284 +1808,250 @@ var Autocomplete = function() { else this.detach(); }; - - this.blurListener = function(e) { + Autocomplete.prototype.blurListener = function (e) { var el = document.activeElement; var text = this.editor.textInput.getElement(); var fromTooltip = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget); var container = this.popup && this.popup.container; if (el != text && el.parentNode != container && !fromTooltip - && el != this.tooltipNode && e.relatedTarget != text - ) { + && el != this.tooltipNode && e.relatedTarget != text) { this.detach(); } }; - - this.mousedownListener = function(e) { + Autocomplete.prototype.mousedownListener = function (e) { this.detach(); }; - - this.mousewheelListener = function(e) { - this.detach(); + Autocomplete.prototype.mousewheelListener = function (e) { + if (this.popup && !this.popup.isMouseOver) + this.detach(); }; - - this.goTo = function(where) { + Autocomplete.prototype.mouseOutListener = function (e) { + if (this.popup.isOpen) + this.$updatePopupPosition(); + }; + Autocomplete.prototype.goTo = function (where) { this.popup.goTo(where); }; - - this.insertMatch = function(data, options) { + Autocomplete.prototype.insertMatch = function (data, options) { if (!data) data = this.popup.getData(this.popup.getRow()); if (!data) return false; - + if (data.value === "") // Explicitly given nothing to insert, e.g. "No suggestion state" + return this.detach(); var completions = this.completions; - this.editor.startOperation({command: {name: "insertMatch"}}); - if (data.completer && data.completer.insertMatch) { - data.completer.insertMatch(this.editor, data); - } else { - if (!completions) - return false; - if (completions.filterText) { - var ranges = this.editor.selection.getAllRanges(); - for (var i = 0, range; range = ranges[i]; i++) { - range.start.column -= completions.filterText.length; - this.editor.session.remove(range); - } - } - if (data.snippet) - snippetManager.insertSnippet(this.editor, data.snippet); - else - this.editor.execCommand("insertstring", data.value || data); - } + var result = this.getCompletionProvider().insertMatch(this.editor, data, completions.filterText, options); if (this.completions == completions) this.detach(); - this.editor.endOperation(); - }; - - - this.commands = { - "Up": function(editor) { editor.completer.goTo("up"); }, - "Down": function(editor) { editor.completer.goTo("down"); }, - "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); }, - "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); }, - - "Esc": function(editor) { editor.completer.detach(); }, - "Return": function(editor) { return editor.completer.insertMatch(); }, - "Shift-Return": function(editor) { editor.completer.insertMatch(null, {deleteSuffix: true}); }, - "Tab": function(editor) { - var result = editor.completer.insertMatch(); - if (!result && !editor.tabstopManager) - editor.completer.goTo("down"); - else - return result; - }, - - "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); }, - "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); } - }; - - this.gatherCompletions = function(editor, callback) { - var session = editor.getSession(); - var pos = editor.getCursorPosition(); - - var prefix = util.getCompletionPrefix(editor); - - this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length); - this.base.$insertRight = true; - - var matches = []; - var total = editor.completers.length; - editor.completers.forEach(function(completer, i) { - completer.getCompletions(editor, session, pos, prefix, function(err, results) { - if (!err && results) - matches = matches.concat(results); - callback(null, { - prefix: util.getCompletionPrefix(editor), - matches: matches, - finished: (--total === 0) - }); - }); - }); - return true; + return result; }; - - this.showPopup = function(editor, options) { + Autocomplete.prototype.showPopup = function (editor, options) { if (this.editor) this.detach(); - this.activated = true; - this.editor = editor; if (editor.completer != this) { if (editor.completer) editor.completer.detach(); editor.completer = this; } - editor.on("changeSelection", this.changeListener); editor.on("blur", this.blurListener); editor.on("mousedown", this.mousedownListener); editor.on("mousewheel", this.mousewheelListener); - this.updateCompletions(false, options); }; - - this.updateCompletions = function(keepPopupPosition, options) { + Autocomplete.prototype.getCompletionProvider = function (initialPosition) { + if (!this.completionProvider) + this.completionProvider = new CompletionProvider(initialPosition); + return this.completionProvider; + }; + Autocomplete.prototype.gatherCompletions = function (editor, callback) { + return this.getCompletionProvider().gatherCompletions(editor, callback); + }; + Autocomplete.prototype.updateCompletions = function (keepPopupPosition, options) { if (keepPopupPosition && this.base && this.completions) { var pos = this.editor.getCursorPosition(); - var prefix = this.editor.session.getTextRange({start: this.base, end: pos}); + var prefix = this.editor.session.getTextRange({ start: this.base, end: pos }); if (prefix == this.completions.filterText) return; this.completions.setFilter(prefix); if (!this.completions.filtered.length) return this.detach(); if (this.completions.filtered.length == 1 - && this.completions.filtered[0].value == prefix - && !this.completions.filtered[0].snippet) + && this.completions.filtered[0].value == prefix + && !this.completions.filtered[0].snippet) return this.detach(); this.openPopup(this.editor, prefix, keepPopupPosition); return; } - if (options && options.matches) { var pos = this.editor.getSelectionRange().start; this.base = this.editor.session.doc.createAnchor(pos.row, pos.column); this.base.$insertRight = true; this.completions = new FilteredList(options.matches); + this.getCompletionProvider().completions = this.completions; return this.openPopup(this.editor, "", keepPopupPosition); } - var _id = this.gatherCompletionsId; - var detachIfFinished = function(results) { - if (!results.finished) return; - return this.detach(); - }.bind(this); - - var processResults = function(results) { - var prefix = results.prefix; - var matches = results.matches; - - this.completions = new FilteredList(matches); - - if (this.exactMatch) - this.completions.exactMatch = true; - - this.completions.setFilter(prefix); - var filtered = this.completions.filtered; - if (!filtered.length) - return detachIfFinished(results); - if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet) - return detachIfFinished(results); - if (this.autoInsert && filtered.length == 1 && results.finished) - return this.insertMatch(filtered[0]); - - this.openPopup(this.editor, prefix, keepPopupPosition); - }.bind(this); - - var isImmediate = true; - var immediateResults = null; - this.gatherCompletions(this.editor, function(err, results) { - var prefix = results.prefix; - var matches = results && results.matches; - - if (!matches || !matches.length) - return detachIfFinished(results); - if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId) - return; - if (isImmediate) { - immediateResults = results; - return; + var session = this.editor.getSession(); + var pos = this.editor.getCursorPosition(); + var prefix = util.getCompletionPrefix(this.editor); + this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length); + this.base.$insertRight = true; + var completionOptions = { + exactMatch: this.exactMatch, + ignoreCaption: this.ignoreCaption + }; + this.getCompletionProvider({ + prefix: prefix, + pos: pos + }).provideCompletions(this.editor, completionOptions, + function (err, completions, finished) { + var filtered = completions.filtered; + var prefix = util.getCompletionPrefix(this.editor); + this.$firstOpenTimer.cancel(); + if (finished) { + if (!filtered.length) { + var emptyMessage = !this.autoShown && this.emptyMessage; + if (typeof emptyMessage == "function") + emptyMessage = this.emptyMessage(prefix); + if (emptyMessage) { + var completionsForEmpty = [{ + caption: emptyMessage, + value: "" + } + ]; + this.completions = new FilteredList(completionsForEmpty); + this.openPopup(this.editor, prefix, keepPopupPosition); + this.popup.renderer.setStyle("ace_loading", false); + this.popup.renderer.setStyle("ace_empty-message", true); + return; + } + return this.detach(); + } + if (filtered.length == 1 && filtered[0].value == prefix + && !filtered[0].snippet) + return this.detach(); + if (this.autoInsert && !this.autoShown && filtered.length == 1) + return this.insertMatch(filtered[0]); } - - processResults(results); + this.completions = !finished && this.showLoadingState ? + new FilteredList(Autocomplete.completionsForLoading.concat(filtered), completions.filterText) : + completions; + this.openPopup(this.editor, prefix, keepPopupPosition); + this.popup.renderer.setStyle("ace_empty-message", false); + this.popup.renderer.setStyle("ace_loading", !finished); }.bind(this)); - - isImmediate = false; - if (immediateResults) { - var results = immediateResults; - immediateResults = null; - processResults(results); + if (this.showLoadingState && !this.autoShown && !(this.popup && this.popup.isOpen)) { + this.$firstOpenTimer.delay(this.stickySelectionDelay / 2); } }; - - this.cancelContextMenu = function() { + Autocomplete.prototype.cancelContextMenu = function () { this.editor.$mouseHandler.cancelContextMenu(); }; - - this.updateDocTooltip = function() { + Autocomplete.prototype.updateDocTooltip = function () { var popup = this.popup; - var all = popup.data; + var all = this.completions && this.completions.filtered; var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]); var doc = null; if (!selected || !this.editor || !this.popup.isOpen) return this.hideDocTooltip(); - this.editor.completers.some(function(completer) { - if (completer.getDocTooltip) + var completersLength = this.editor.completers.length; + for (var i = 0; i < completersLength; i++) { + var completer = this.editor.completers[i]; + if (completer.getDocTooltip && selected.completerId === completer.id) { doc = completer.getDocTooltip(selected); - return doc; - }); + break; + } + } if (!doc && typeof selected != "string") doc = selected; - if (typeof doc == "string") - doc = {docText: doc}; + doc = { docText: doc }; if (!doc || !(doc.docHTML || doc.docText)) return this.hideDocTooltip(); this.showDocTooltip(doc); }; - - this.showDocTooltip = function(item) { + Autocomplete.prototype.showDocTooltip = function (item) { if (!this.tooltipNode) { this.tooltipNode = dom.createElement("div"); - this.tooltipNode.className = "ace_tooltip ace_doc-tooltip"; - this.tooltipNode.style.margin = 0; + this.tooltipNode.style.margin = "0"; this.tooltipNode.style.pointerEvents = "auto"; + this.tooltipNode.style.overscrollBehavior = "contain"; this.tooltipNode.tabIndex = -1; this.tooltipNode.onblur = this.blurListener.bind(this); this.tooltipNode.onclick = this.onTooltipClick.bind(this); + this.tooltipNode.id = "doc-tooltip"; + this.tooltipNode.setAttribute("role", "tooltip"); + this.tooltipNode.addEventListener("wheel", preventParentScroll); } - + var theme = this.editor.renderer.theme; + this.tooltipNode.className = "ace_tooltip ace_doc-tooltip " + + (theme.isDark ? "ace_dark " : "") + (theme.cssClass || ""); + // default tooltip style is too specific to override with css, so manually set background to match theme + this.tooltipNode.style.backgroundColor = getComputedStyle(this.editor.container).backgroundColor; var tooltipNode = this.tooltipNode; if (item.docHTML) { tooltipNode.innerHTML = item.docHTML; - } else if (item.docText) { + } + else if (item.docText) { tooltipNode.textContent = item.docText; } - if (!tooltipNode.parentNode) - document.body.appendChild(tooltipNode); + this.popup.container.appendChild(this.tooltipNode); var popup = this.popup; var rect = popup.container.getBoundingClientRect(); - tooltipNode.style.top = popup.container.style.top; - tooltipNode.style.bottom = popup.container.style.bottom; - - tooltipNode.style.display = "block"; - if (window.innerWidth - rect.right < 320) { - if (rect.left < 320) { - if(popup.isTopdown) { - tooltipNode.style.top = rect.bottom + "px"; - tooltipNode.style.left = rect.left + "px"; - tooltipNode.style.right = ""; - tooltipNode.style.bottom = ""; - } else { - tooltipNode.style.top = popup.container.offsetTop - tooltipNode.offsetHeight + "px"; - tooltipNode.style.left = rect.left + "px"; - tooltipNode.style.right = ""; - tooltipNode.style.bottom = ""; - } - } else { - tooltipNode.style.right = window.innerWidth - rect.left + "px"; - tooltipNode.style.left = ""; + var targetWidth = 400; + var targetHeight = 300; + var scrollBarSize = popup.renderer.scrollBar.width || 10; + var leftSize = rect.left; + var rightSize = window.innerWidth - rect.right - scrollBarSize; + var topSize = popup.isTopdown ? window.innerHeight - scrollBarSize - rect.bottom : rect.top; + var scores = [ + Math.min(rightSize / targetWidth, 1), + Math.min(leftSize / targetWidth, 1), + Math.min(topSize / targetHeight, 1) * 0.9, + ]; + var max = Math.max.apply(Math, scores); + var tooltipStyle = tooltipNode.style; + tooltipStyle.display = "block"; + if (max == scores[0] || scores[0] >= 1) { + tooltipStyle.left = (rect.right + 1) + "px"; + tooltipStyle.right = ""; + tooltipStyle.maxWidth = targetWidth * max + "px"; + tooltipStyle.top = rect.top + "px"; + tooltipStyle.bottom = ""; + tooltipStyle.maxHeight = Math.min(window.innerHeight - scrollBarSize - rect.top, targetHeight) + "px"; + } + else if (max == scores[1] || scores[1] >= 1) { + tooltipStyle.right = window.innerWidth - rect.left + "px"; + tooltipStyle.left = ""; + tooltipStyle.maxWidth = targetWidth * max + "px"; + tooltipStyle.top = rect.top + "px"; + tooltipStyle.bottom = ""; + tooltipStyle.maxHeight = Math.min(window.innerHeight - scrollBarSize - rect.top, targetHeight) + "px"; + } + else if (max == scores[2]) { + tooltipStyle.left = rect.left + "px"; + tooltipStyle.right = ""; + tooltipStyle.maxWidth = Math.min(targetWidth, window.innerWidth - rect.left) + "px"; + if (popup.isTopdown) { + tooltipStyle.top = rect.bottom + "px"; + tooltipStyle.bottom = ""; + tooltipStyle.maxHeight = Math.min(window.innerHeight - scrollBarSize - rect.bottom, targetHeight) + "px"; + } + else { + tooltipStyle.top = ""; + tooltipStyle.bottom = (window.innerHeight - rect.top) + "px"; + tooltipStyle.maxHeight = Math.min(rect.top, targetHeight) + "px"; } - } else { - tooltipNode.style.left = (rect.right + 1) + "px"; - tooltipNode.style.right = ""; } + dom.$fixPositionBug(tooltipNode); }; - - this.hideDocTooltip = function() { + Autocomplete.prototype.hideDocTooltip = function () { this.tooltipTimer.cancel(); - if (!this.tooltipNode) return; + if (!this.tooltipNode) + return; var el = this.tooltipNode; if (!this.editor.isFocused() && document.activeElement == el) this.editor.focus(); @@ -1804,8 +2059,7 @@ var Autocomplete = function() { if (el.parentNode) el.parentNode.removeChild(el); }; - - this.onTooltipClick = function(e) { + Autocomplete.prototype.onTooltipClick = function (e) { var a = e.target; while (a && a != this.tooltipNode) { if (a.nodeName == "A" && a.href) { @@ -1816,8 +2070,7 @@ var Autocomplete = function() { a = a.parentNode; } }; - - this.destroy = function() { + Autocomplete.prototype.destroy = function () { this.detach(); if (this.popup) { this.popup.destroy(); @@ -1825,92 +2078,260 @@ var Autocomplete = function() { if (el && el.parentNode) el.parentNode.removeChild(el); } - if (this.editor && this.editor.completer == this) - this.editor.completer == null; - this.popup = null; + if (this.editor && this.editor.completer == this) { + this.editor.off("destroy", destroyCompleter); + this.editor.completer = null; + } + this.inlineRenderer = this.popup = this.editor = null; }; - -}).call(Autocomplete.prototype); - - -Autocomplete.for = function(editor) { - if (editor.completer) { - return editor.completer; - } - if (config.get("sharedPopups")) { - if (!Autocomplete.$shared) - Autocomplete.$sharedInstance = new Autocomplete(); - editor.completer = Autocomplete.$sharedInstance; - } else { - editor.completer = new Autocomplete(); - editor.once("destroy", function(e, editor) { + Autocomplete.for = function (editor) { + if (editor.completer instanceof Autocomplete) { + return editor.completer; + } + if (editor.completer) { editor.completer.destroy(); - }); - } - return editor.completer; + editor.completer = null; + } + if (config.get("sharedPopups")) { + if (!Autocomplete["$sharedInstance"]) + Autocomplete["$sharedInstance"] = new Autocomplete(); + editor.completer = Autocomplete["$sharedInstance"]; + } + else { + editor.completer = new Autocomplete(); + editor.once("destroy", destroyCompleter); + } + return editor.completer; + }; + return Autocomplete; +}()); +Autocomplete.prototype.commands = { + "Up": function (editor) { editor.completer.goTo("up"); }, + "Down": function (editor) { editor.completer.goTo("down"); }, + "Ctrl-Up|Ctrl-Home": function (editor) { editor.completer.goTo("start"); }, + "Ctrl-Down|Ctrl-End": function (editor) { editor.completer.goTo("end"); }, + "Esc": function (editor) { editor.completer.detach(); }, + "Return": function (editor) { return editor.completer.insertMatch(); }, + "Shift-Return": function (editor) { editor.completer.insertMatch(null, { deleteSuffix: true }); }, + "Tab": function (editor) { + var result = editor.completer.insertMatch(); + if (!result && !editor.tabstopManager) + editor.completer.goTo("down"); + else + return result; + }, + "Backspace": function (editor) { + editor.execCommand("backspace"); + var prefix = util.getCompletionPrefix(editor); + if (!prefix && editor.completer) + editor.completer.detach(); + }, + "PageUp": function (editor) { editor.completer.popup.gotoPageUp(); }, + "PageDown": function (editor) { editor.completer.popup.gotoPageDown(); } }; - Autocomplete.startCommand = { name: "startAutocomplete", - exec: function(editor, options) { + exec: function (editor, options) { var completer = Autocomplete.for(editor); completer.autoInsert = false; completer.autoSelect = true; + completer.autoShown = false; completer.showPopup(editor, options); completer.cancelContextMenu(); }, bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space" }; - -var FilteredList = function(array, filterText) { - this.all = array; - this.filtered = array; - this.filterText = filterText || ""; - this.exactMatch = false; -}; -(function(){ - this.setFilter = function(str) { +var CompletionProvider = /** @class */ (function () { + function CompletionProvider(initialPosition) { + this.initialPosition = initialPosition; + this.active = true; + } + CompletionProvider.prototype.insertByIndex = function (editor, index, options) { + if (!this.completions || !this.completions.filtered) { + return false; + } + return this.insertMatch(editor, this.completions.filtered[index], options); + }; + CompletionProvider.prototype.insertMatch = function (editor, data, options) { + if (!data) + return false; + editor.startOperation({ command: { name: "insertMatch" } }); + if (data.completer && data.completer.insertMatch) { + data.completer.insertMatch(editor, data); + } + else { + if (!this.completions) + return false; + var replaceBefore = this.completions.filterText.length; + var replaceAfter = 0; + if (data.range && data.range.start.row === data.range.end.row) { + replaceBefore -= this.initialPosition.prefix.length; + replaceBefore += this.initialPosition.pos.column - data.range.start.column; + replaceAfter += data.range.end.column - this.initialPosition.pos.column; + } + if (replaceBefore || replaceAfter) { + var ranges; + if (editor.selection.getAllRanges) { + ranges = editor.selection.getAllRanges(); + } + else { + ranges = [editor.getSelectionRange()]; + } + for (var i = 0, range; range = ranges[i]; i++) { + range.start.column -= replaceBefore; + range.end.column += replaceAfter; + editor.session.remove(range); + } + } + if (data.snippet) { + snippetManager.insertSnippet(editor, data.snippet); + } + else { + this.$insertString(editor, data); + } + if (data.completer && data.completer.onInsert && typeof data.completer.onInsert == "function") { + data.completer.onInsert(editor, data); + } + if (data.command && data.command === "startAutocomplete") { + editor.execCommand(data.command); + } + } + editor.endOperation(); + return true; + }; + CompletionProvider.prototype.$insertString = function (editor, data) { + var text = data.value || data; + editor.execCommand("insertstring", text); + }; + CompletionProvider.prototype.gatherCompletions = function (editor, callback) { + var session = editor.getSession(); + var pos = editor.getCursorPosition(); + var prefix = util.getCompletionPrefix(editor); + var matches = []; + this.completers = editor.completers; + var total = editor.completers.length; + editor.completers.forEach(function (completer, i) { + completer.getCompletions(editor, session, pos, prefix, function (err, results) { + if (completer.hideInlinePreview) + results = results.map(function (result) { + return Object.assign(result, { hideInlinePreview: completer.hideInlinePreview }); + }); + if (!err && results) + matches = matches.concat(results); + callback(null, { + prefix: util.getCompletionPrefix(editor), + matches: matches, + finished: (--total === 0) + }); + }); + }); + return true; + }; + CompletionProvider.prototype.provideCompletions = function (editor, options, callback) { + var processResults = function (results) { + var prefix = results.prefix; + var matches = results.matches; + this.completions = new FilteredList(matches); + if (options.exactMatch) + this.completions.exactMatch = true; + if (options.ignoreCaption) + this.completions.ignoreCaption = true; + this.completions.setFilter(prefix); + if (results.finished || this.completions.filtered.length) + callback(null, this.completions, results.finished); + }.bind(this); + var isImmediate = true; + var immediateResults = null; + this.gatherCompletions(editor, function (err, results) { + if (!this.active) { + return; + } + if (err) { + callback(err, [], true); + this.detach(); + } + var prefix = results.prefix; + if (prefix.indexOf(results.prefix) !== 0) + return; + if (isImmediate) { + immediateResults = results; + return; + } + processResults(results); + }.bind(this)); + isImmediate = false; + if (immediateResults) { + var results = immediateResults; + immediateResults = null; + processResults(results); + } + }; + CompletionProvider.prototype.detach = function () { + this.active = false; + this.completers && this.completers.forEach(function (completer) { + if (typeof completer.cancel === "function") { + completer.cancel(); + } + }); + }; + return CompletionProvider; +}()); +var FilteredList = /** @class */ (function () { + function FilteredList(array, filterText) { + this.all = array; + this.filtered = array; + this.filterText = filterText || ""; + this.exactMatch = false; + this.ignoreCaption = false; + } + FilteredList.prototype.setFilter = function (str) { if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0) var matches = this.filtered; else var matches = this.all; - this.filterText = str; matches = this.filterCompletions(matches, this.filterText); - matches = matches.sort(function(a, b) { - return b.exactMatch - a.exactMatch || b.$score - a.$score + matches = matches.sort(function (a, b) { + return b.exactMatch - a.exactMatch || b.$score - a.$score || (a.caption || a.value).localeCompare(b.caption || b.value); }); var prev = null; - matches = matches.filter(function(item){ + matches = matches.filter(function (item) { var caption = item.snippet || item.caption || item.value; - if (caption === prev) return false; + if (caption === prev) + return false; prev = caption; return true; }); - this.filtered = matches; }; - this.filterCompletions = function(items, needle) { + FilteredList.prototype.filterCompletions = function (items, needle) { var results = []; var upper = needle.toUpperCase(); var lower = needle.toLowerCase(); loop: for (var i = 0, item; item = items[i]; i++) { - var caption = item.caption || item.value || item.snippet; - if (!caption) continue; + if (item.skipFilter) { + item.$score = item.score; + results.push(item); + continue; + } + var caption = (!this.ignoreCaption && item.caption) || item.value || item.snippet; + if (!caption) + continue; var lastIndex = -1; var matchMask = 0; var penalty = 0; var index, distance; - if (this.exactMatch) { if (needle !== caption.substr(0, needle.length)) continue loop; - } else { + } + else { var fullMatchIndex = caption.toLowerCase().indexOf(lower); if (fullMatchIndex > -1) { penalty = fullMatchIndex; - } else { + } + else { for (var j = 0; j < needle.length; j++) { var i1 = caption.indexOf(lower[j], lastIndex + 1); var i2 = caption.indexOf(upper[j], lastIndex + 1); @@ -1933,113 +2354,229 @@ var FilteredList = function(array, filterText) { item.$score = (item.score || 0) - penalty; results.push(item); } - var keywords = []; + var snippetNames = Object.create(null); + var keywordNames = Object.create(null); for (var i=0, j=results.length; i=0;){ - if (!results[i]) continue - if (results[i].meta=='local' && keywords.indexOf(results[i].caption)!=-1){ + if (!results[i]) continue; + var name = results[i].caption || results[i].value || results[i].name; + if (results[i].meta=='local' && (snippetNames[name] || keywordNames[name])){ + results.splice(i,1) + } else if (results[i].meta=='keyword' && snippetNames[name]){ results.splice(i,1) } } - return results; }; -}).call(FilteredList.prototype); - + return FilteredList; +}()); exports.Autocomplete = Autocomplete; +exports.CompletionProvider = CompletionProvider; exports.FilteredList = FilteredList; }); -define("ace/autocomplete/text_completer",["require","exports","module","ace/range"], function(require, exports, module) { - var Range = require("../range").Range; - - var splitRegex = /[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/; - - function getWordIndex(doc, pos) { - var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos)); - return textBefore.split(splitRegex).length - 1; +define("ace/marker_group",["require","exports","module"], function(require, exports, module){"use strict"; +var MarkerGroup = /** @class */ (function () { + function MarkerGroup(session, options) { + if (options) + this.markerType = options.markerType; + this.markers = []; + this.session = session; + session.addDynamicMarker(this); } - function wordDistance(doc, pos) { - var prefixPos = getWordIndex(doc, pos); - var words = doc.getValue().split(splitRegex); - var wordScores = Object.create(null); - - var currentWord = words[prefixPos]; + MarkerGroup.prototype.getMarkerAtPosition = function (pos) { + return this.markers.find(function (marker) { + return marker.range.contains(pos.row, pos.column); + }); + }; + MarkerGroup.prototype.markersComparator = function (a, b) { + return a.range.start.row - b.range.start.row; + }; + MarkerGroup.prototype.setMarkers = function (markers) { + this.markers = markers.sort(this.markersComparator).slice(0, this.MAX_MARKERS); + this.session._signal("changeBackMarker"); + }; + MarkerGroup.prototype.update = function (html, markerLayer, session, config) { + if (!this.markers || !this.markers.length) + return; + var visibleRangeStartRow = config.firstRow, visibleRangeEndRow = config.lastRow; + var foldLine; + var markersOnOneLine = 0; + var lastRow = 0; + for (var i = 0; i < this.markers.length; i++) { + var marker = this.markers[i]; + if (marker.range.end.row < visibleRangeStartRow) + continue; + if (marker.range.start.row > visibleRangeEndRow) + continue; + if (marker.range.start.row === lastRow) { + markersOnOneLine++; + } + else { + lastRow = marker.range.start.row; + markersOnOneLine = 0; + } + if (markersOnOneLine > 200) { + continue; + } + var markerVisibleRange = marker.range.clipRows(visibleRangeStartRow, visibleRangeEndRow); + if (markerVisibleRange.start.row === markerVisibleRange.end.row + && markerVisibleRange.start.column === markerVisibleRange.end.column) { + continue; // visible range is empty + } + var screenRange = markerVisibleRange.toScreenRange(session); + if (screenRange.isEmpty()) { + foldLine = session.getNextFoldLine(markerVisibleRange.end.row, foldLine); + if (foldLine && foldLine.end.row > markerVisibleRange.end.row) { + visibleRangeStartRow = foldLine.end.row; + } + continue; + } + if (this.markerType === "fullLine") { + markerLayer.drawFullLineMarker(html, screenRange, marker.className, config); + } + else if (screenRange.isMultiLine()) { + if (this.markerType === "line") + markerLayer.drawMultiLineMarker(html, screenRange, marker.className, config); + else + markerLayer.drawTextMarker(html, screenRange, marker.className, config); + } + else { + markerLayer.drawSingleLineMarker(html, screenRange, marker.className + " ace_br15", config); + } + } + }; + return MarkerGroup; +}()); +MarkerGroup.prototype.MAX_MARKERS = 10000; +exports.MarkerGroup = MarkerGroup; - words.forEach(function(word, idx) { - if (!word || word === currentWord) return; +}); - var distance = Math.abs(prefixPos - idx); - var score = words.length - distance; - if (wordScores[word]) { - wordScores[word] = Math.max(score, wordScores[word]); - } else { - wordScores[word] = score; - } - }); - return wordScores; - } +define("ace/autocomplete/text_completer",["require","exports","module","ace/range"], function(require, exports, module){var Range = require("../range").Range; +var splitRegex = /[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/; +function getWordIndex(doc, pos) { + var textBefore = doc.getTextRange(Range.fromPoints({ + row: 0, + column: 0 + }, pos)); + return textBefore.split(splitRegex).length - 1; +} +function wordDistance(doc, pos) { + var prefixPos = getWordIndex(doc, pos); + var words = doc.getValue().split(splitRegex); + var wordScores = Object.create(null); + var currentWord = words[prefixPos]; + words.forEach(function (word, idx) { + if (!word || word === currentWord) + return; + var distance = Math.abs(prefixPos - idx); + var score = words.length - distance; + if (wordScores[word]) { + wordScores[word] = Math.max(score, wordScores[word]); + } + else { + wordScores[word] = score; + } + }); + return wordScores; +} +exports.id = "textCompleter"; +exports.getCompletions = function (editor, session, pos, prefix, callback) { + var wordScore = wordDistance(session, pos); + var wordList = Object.keys(wordScore); + callback(null, wordList.map(function (word) { + return { + caption: word, + value: word, + score: wordScore[word], + meta: "local" + }; + })); +}; - exports.getCompletions = function(editor, session, pos, prefix, callback) { - var wordScore = wordDistance(session, pos); - var wordList = Object.keys(wordScore); - callback(null, wordList.map(function(word) { - return { - caption: word, - value: word, - score: wordScore[word], - meta: "local" - }; - })); - }; }); -define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/lib/lang","ace/autocomplete/util","ace/autocomplete/text_completer","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/lib/lang","ace/autocomplete/util","ace/marker_group","ace/autocomplete/text_completer","ace/editor","ace/config"], function(require, exports, module){/** + * ## Language Tools extension for Ace Editor + * + * Provides autocompletion, snippets, and language intelligence features for the Ace code editor. + * This extension integrates multiple completion providers including keyword completion, snippet expansion, + * and text-based completion to enhance the coding experience with contextual suggestions and automated code generation. + * + * **Configuration Options:** + * - `enableBasicAutocompletion`: Enable/disable basic completion functionality + * - `enableLiveAutocompletion`: Enable/disable real-time completion suggestions + * - `enableSnippets`: Enable/disable snippet expansion with Tab key + * - `liveAutocompletionDelay`: Delay before showing live completion popup + * - `liveAutocompletionThreshold`: Minimum prefix length to trigger completion + * + * **Usage:** + * ```javascript + * editor.setOptions({ + * enableBasicAutocompletion: true, + * enableLiveAutocompletion: true, + * enableSnippets: true + * }); + * ``` + * + * @module + */ "use strict"; - var snippetManager = require("../snippets").snippetManager; var Autocomplete = require("../autocomplete").Autocomplete; var config = require("../config"); var lang = require("../lib/lang"); var util = require("../autocomplete/util"); - +var MarkerGroup = require("../marker_group").MarkerGroup; var textCompleter = require("../autocomplete/text_completer"); var keyWordCompleter = { - getCompletions: function(editor, session, pos, prefix, callback) { + getCompletions: function (editor, session, pos, prefix, callback) { if (session.$mode.completer) { return session.$mode.completer.getCompletions(editor, session, pos, prefix, callback); } var state = editor.session.getState(pos.row); var completions = session.$mode.getCompletions(state, session, pos, prefix); + completions = completions.map(function (el) { + el.completerId = keyWordCompleter.id; + return el; + }); callback(null, completions); - } + }, + id: "keywordCompleter" }; - -var transformSnippetTooltip = function(str) { +var transformSnippetTooltip = function (str) { + // resolve leaf placeholders (no nested ${...} in their default text) first, + // then repeat until stable so nested groups collapse regardless of depth var record = {}; - return str.replace(/\${(\d+)(:(.*?))?}/g, function(_, p1, p2, p3) { - return (record[p1] = p3 || ''); - }).replace(/\$(\d+?)/g, function (_, p1) { - return record[p1]; + var prev; + do { + prev = str; + str = str.replace(/\${(\d+)(:([^{}]*))?}/g, function (_, p1, p2, p3) { + return (record[p1] = p3 || ''); + }); + } while (str !== prev); + return str.replace(/\$(\d+?)/g, function (_, p1) { + return record[p1] || ''; }); }; - var snippetCompleter = { - getCompletions: function(editor, session, pos, prefix, callback) { + getCompletions: function (editor, session, pos, prefix, callback) { var scopes = []; var token = session.getTokenAt(pos.row, pos.column); if (token && token.type.match(/(tag-name|tag-open|tag-whitespace|attribute-name|attribute-value)\.xml$/)) scopes.push('html-tag'); else scopes = snippetManager.getActiveScopes(editor); - var snippetMap = snippetManager.snippetMap; var completions = []; - scopes.forEach(function(scope) { + scopes.forEach(function (scope) { var snippets = snippetMap[scope] || []; for (var i = snippets.length; i--;) { var s = snippets[i]; @@ -2050,128 +2587,150 @@ var snippetCompleter = { caption: caption, snippet: s.content, meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet", - type: "snippet" + completerId: snippetCompleter.id }); } }, this); callback(null, completions); }, - getDocTooltip: function(item) { - if (item.type == "snippet" && !item.docHTML) { + getDocTooltip: function (item) { + if (item.snippet && !item.docHTML) { item.docHTML = [ "", lang.escapeHTML(item.caption), "", "
", lang.escapeHTML(transformSnippetTooltip(item.snippet)) ].join(""); } - } + }, + id: "snippetCompleter" }; - var completers = [snippetCompleter, textCompleter, keyWordCompleter]; -exports.setCompleters = function(val) { +exports.setCompleters = function (val) { completers.length = 0; - if (val) completers.push.apply(completers, val); + if (val) + completers.push.apply(completers, val); }; -exports.addCompleter = function(completer) { +exports.addCompleter = function (completer) { completers.push(completer); }; exports.textCompleter = textCompleter; exports.keyWordCompleter = keyWordCompleter; exports.snippetCompleter = snippetCompleter; - var expandSnippet = { name: "expandSnippet", - exec: function(editor) { + exec: function (editor) { return snippetManager.expandWithTab(editor); }, bindKey: "Tab" }; - -var onChangeMode = function(e, editor) { +var onChangeMode = function (e, editor) { loadSnippetsForMode(editor.session.$mode); }; - -var loadSnippetsForMode = function(mode) { +var loadSnippetsForMode = function (mode) { if (typeof mode == "string") mode = config.$modes[mode]; if (!mode) return; if (!snippetManager.files) snippetManager.files = {}; - loadSnippetFile(mode.$id, mode.snippetFileId); if (mode.modes) mode.modes.forEach(loadSnippetsForMode); }; - -var loadSnippetFile = function(id, snippetFilePath) { +var loadSnippetFile = function (id, snippetFilePath) { if (!snippetFilePath || !id || snippetManager.files[id]) return; snippetManager.files[id] = {}; - config.loadModule(snippetFilePath, function(m) { - if (!m) return; + config.loadModule(snippetFilePath, function (m) { + if (!m) + return; snippetManager.files[id] = m; if (!m.snippets && m.snippetText) m.snippets = snippetManager.parseSnippetFile(m.snippetText); snippetManager.register(m.snippets || [], m.scope); if (m.includeScopes) { snippetManager.snippetMap[m.scope].includeScopes = m.includeScopes; - m.includeScopes.forEach(function(x) { + m.includeScopes.forEach(function (x) { loadSnippetsForMode("ace/mode/" + x); }); } }); }; - -var doLiveAutocomplete = function(e) { +var doLiveAutocomplete = function (e) { var editor = e.editor; var hasCompleter = editor.completer && editor.completer.activated; if (e.command.name === "backspace") { if (hasCompleter && !util.getCompletionPrefix(editor)) editor.completer.detach(); } - else if (e.command.name === "insertstring") { - var prefix = util.getCompletionPrefix(editor); - if (prefix && !hasCompleter) { - var completer = Autocomplete.for(editor); - completer.autoInsert = false; - completer.showPopup(editor); + else if (e.command.name === "insertstring" && !hasCompleter) { + lastExecEvent = e; + var delay = e.editor.$liveAutocompletionDelay; + if (delay) { + liveAutocompleteTimer.delay(delay); + } + else { + showLiveAutocomplete(e); } } }; - +var lastExecEvent; +var liveAutocompleteTimer = lang.delayedCall(function () { + showLiveAutocomplete(lastExecEvent); +}, 0); +var showLiveAutocomplete = function (e) { + var editor = e.editor; + var prefix = util.getCompletionPrefix(editor); + var previousChar = e.args; + var triggerAutocomplete = util.triggerAutocomplete(editor, previousChar); + if (prefix && prefix.length >= editor.$liveAutocompletionThreshold || triggerAutocomplete) { + var completer = Autocomplete.for(editor); + completer.autoShown = true; + completer.showPopup(editor); + } +}; var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { enableBasicAutocompletion: { - set: function(val) { + set: function (val) { if (val) { + Autocomplete.for(this); if (!this.completers) - this.completers = Array.isArray(val)? val: completers; + this.completers = Array.isArray(val) ? val : completers; this.commands.addCommand(Autocomplete.startCommand); - } else { + } + else { this.commands.removeCommand(Autocomplete.startCommand); } }, value: false }, enableLiveAutocompletion: { - set: function(val) { + set: function (val) { if (val) { if (!this.completers) - this.completers = Array.isArray(val)? val: completers; + this.completers = Array.isArray(val) ? val : completers; this.commands.on('afterExec', doLiveAutocomplete); - } else { - this.commands.removeListener('afterExec', doLiveAutocomplete); + } + else { + this.commands.off('afterExec', doLiveAutocomplete); } }, value: false }, + liveAutocompletionDelay: { + initialValue: 0 + }, + liveAutocompletionThreshold: { + initialValue: 0 + }, enableSnippets: { - set: function(val) { + set: function (val) { if (val) { this.commands.addCommand(expandSnippet); this.on("changeMode", onChangeMode); onChangeMode(null, this); - } else { + } + else { this.commands.removeCommand(expandSnippet); this.off("changeMode", onChangeMode); } @@ -2179,6 +2738,8 @@ require("../config").defineOptions(Editor.prototype, "editor", { value: false } }); +exports.MarkerGroup = MarkerGroup; + }); (function() { window.require(["ace/ext/language_tools"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { @@ -2186,4 +2747,3 @@ require("../config").defineOptions(Editor.prototype, "editor", { } }); })(); - \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-linking.js b/app/Resources/ui/js/ace/ext-linking.js index 147efe94..4afb8488 100644 --- a/app/Resources/ui/js/ace/ext-linking.js +++ b/app/Resources/ui/js/ace/ext-linking.js @@ -1,14 +1,22 @@ -define("ace/ext/linking",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { - +define("ace/ext/linking",["require","exports","module","ace/editor","ace/config"], function(require, exports, module){/** + * ## Interactive Linking Extension + * + * Enables clickable links and hover interactions in the editor when the Control key is pressed. Provides + * keyboard-accelerated navigation by detecting tokens under the cursor and emitting custom events that can be handled + * by external code to implement go-to-definition, symbol navigation, or other link-based functionality. + * + * **Enable:** `editor.setOption("enableLinking", true)` + * @module + */ var Editor = require("../editor").Editor; - require("../config").defineOptions(Editor.prototype, "editor", { enableLinking: { - set: function(val) { + set: function (val) { if (val) { this.on("click", onClick); this.on("mousemove", onMouseMove); - } else { + } + else { this.off("click", onClick); this.off("mousemove", onMouseMove); } @@ -16,41 +24,35 @@ require("../config").defineOptions(Editor.prototype, "editor", { value: false } }); - exports.previousLinkingHover = false; - function onMouseMove(e) { var editor = e.editor; var ctrl = e.getAccelKey(); - if (ctrl) { var editor = e.editor; var docPos = e.getDocumentPosition(); var session = editor.session; var token = session.getTokenAt(docPos.row, docPos.column); - if (exports.previousLinkingHover && exports.previousLinkingHover != token) { editor._emit("linkHoverOut"); } - editor._emit("linkHover", {position: docPos, token: token}); + editor._emit("linkHover", { position: docPos, token: token }); exports.previousLinkingHover = token; - } else if (exports.previousLinkingHover) { + } + else if (exports.previousLinkingHover) { editor._emit("linkHoverOut"); exports.previousLinkingHover = false; } } - function onClick(e) { var ctrl = e.getAccelKey(); var button = e.getButton(); - if (button == 0 && ctrl) { var editor = e.editor; var docPos = e.getDocumentPosition(); var session = editor.session; var token = session.getTokenAt(docPos.row, docPos.column); - - editor._emit("linkClick", {position: docPos, token: token}); + editor._emit("linkClick", { position: docPos, token: token }); } } diff --git a/app/Resources/ui/js/ace/ext-modelist.js b/app/Resources/ui/js/ace/ext-modelist.js index 20a8fa7a..de5fc016 100644 --- a/app/Resources/ui/js/ace/ext-modelist.js +++ b/app/Resources/ui/js/ace/ext-modelist.js @@ -1,6 +1,14 @@ -define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/modelist",["require","exports","module"], function(require, exports, module){/** + * ## File mode detection utility + * + * Provides automatic detection of editor syntax modes based on file paths and extensions. Maps file extensions to + * appropriate Ace Editor syntax highlighting modes for over 100 programming languages and file formats including + * JavaScript, TypeScript, HTML, CSS, Python, Java, C++, and many others. Supports complex extension patterns and + * provides fallback mechanisms for unknown file types. + * + * @module + */ "use strict"; - var modes = []; function getModeForPath(path) { var mode = modesByName.text; @@ -13,203 +21,225 @@ function getModeForPath(path) { } return mode; } - -var Mode = function(name, caption, extensions) { - this.name = name; - this.caption = caption; - this.mode = "ace/mode/" + name; - this.extensions = extensions; - var re; - if (/\^/.test(extensions)) { - re = extensions.replace(/\|(\^)?/g, function(a, b){ - return "$|" + (b ? "^" : "^.*\\."); - }) + "$"; - } else { - re = "^.*\\.(" + extensions + ")$"; +var Mode = /** @class */ (function () { + function Mode(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function (a, b) { + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } + else { + re = "\\.(" + extensions + ")$"; + } + this.extRe = new RegExp(re, "gi"); } - - this.extRe = new RegExp(re, "gi"); -}; - -Mode.prototype.supportsFile = function(filename) { - return filename.match(this.extRe); -}; + Mode.prototype.supportsFile = function (filename) { + return filename.match(this.extRe); + }; + return Mode; +}()); var supportedModes = { - ABAP: ["abap"], - ABC: ["abc"], - ActionScript:["as"], - ADA: ["ada|adb"], - Alda: ["alda"], + ABAP: ["abap"], + ABC: ["abc"], + ActionScript: ["as"], + ADA: ["ada|adb"], + Alda: ["alda"], Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], - Apex: ["apex|cls|trigger|tgr"], - AQL: ["aql"], - AsciiDoc: ["asciidoc|adoc"], - ASL: ["dsl|asl|asl.json"], - Assembly_x86:["asm|a"], - AutoHotKey: ["ahk"], - BatchFile: ["bat|cmd"], - C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], - C9Search: ["c9search_results"], - Cirru: ["cirru|cr"], - Clojure: ["clj|cljs"], - Cobol: ["CBL|COB"], - coffee: ["coffee|cf|cson|^Cakefile"], - ColdFusion: ["cfm"], - Crystal: ["cr"], - CSharp: ["cs"], + Apex: ["apex|cls|trigger|tgr"], + AQL: ["aql"], + AsciiDoc: ["asciidoc|adoc"], + ASL: ["dsl|asl|asl.json"], + Assembly_ARM32: ["s"], + Assembly_x86: ["asm|a"], + Astro: ["astro"], + AutoHotKey: ["ahk"], + Basic: ["bas|bak"], + BatchFile: ["bat|cmd"], + BibTeX: ["bib"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cedar: ["cedar"], + CedarSchema: ["cedarschema"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Clue: ["clue"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm|cfc"], + Crystal: ["cr"], + CSharp: ["cs"], Csound_Document: ["csd"], Csound_Orchestra: ["orc"], Csound_Score: ["sco"], - CSS: ["css"], - Curly: ["curly"], - D: ["d|di"], - Dart: ["dart"], - Diff: ["diff|patch"], - Dockerfile: ["^Dockerfile"], - Dot: ["dot"], - Drools: ["drl"], - Edifact: ["edi"], - Eiffel: ["e|ge"], - EJS: ["ejs"], - Elixir: ["ex|exs"], - Elm: ["elm"], - Erlang: ["erl|hrl"], - Forth: ["frt|fs|ldr|fth|4th"], - Fortran: ["f|f90"], - FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], - FSL: ["fsl"], - FTL: ["ftl"], - Gcode: ["gcode"], - Gherkin: ["feature"], - Gitignore: ["^.gitignore"], - Glsl: ["glsl|frag|vert"], - Gobstones: ["gbs"], - golang: ["go"], + CSS: ["css"], + CSV: ["csv"], + Curly: ["curly"], + Cuttlefish: ["conf"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Django: ["djt|html.djt|dj.html|djhtml"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Edifact: ["edi"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Flix: ["flix"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], + FSL: ["fsl"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], GraphQLSchema: ["gql"], - Groovy: ["groovy"], - HAML: ["haml"], - Handlebars: ["hbs|handlebars|tpl|mustache"], - Haskell: ["hs"], + GROQ: ["groq"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], Haskell_Cabal: ["cabal"], - haXe: ["hx"], - Hjson: ["hjson"], - HTML: ["html|htm|xhtml|vue|we|wpy"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml|we|wpy"], HTML_Elixir: ["eex|html.eex"], - HTML_Ruby: ["erb|rhtml|html.erb"], - INI: ["ini|conf|cfg|prefs"], - Io: ["io"], - Ion: ["ion"], - Jack: ["jack"], - Jade: ["jade|pug"], - Java: ["java"], - JavaScript: ["js|jsm|jsx|cjs|mjs"], - JSON: ["json"], - JSON5: ["json5"], - JSONiq: ["jq"], - JSP: ["jsp"], - JSSM: ["jssm|jssm_state"], - JSX: ["jsx"], - Julia: ["jl"], - Kotlin: ["kt|kts"], - LaTeX: ["tex|latex|ltx|bib"], - Latte: ["latte"], - LESS: ["less"], - Liquid: ["liquid"], - Lisp: ["lisp"], - LiveScript: ["ls"], - Log: ["log"], - LogiQL: ["logic|lql"], - LSL: ["lsl"], - Lua: ["lua"], - LuaPage: ["lp"], - Lucene: ["lucene"], - Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], - Markdown: ["md|markdown"], - Mask: ["mask"], - MATLAB: ["matlab"], - Maze: ["mz"], - MediaWiki: ["wiki|mediawiki"], - MEL: ["mel"], - MIPS: ["s|asm"], - MIXAL: ["mixal"], - MUSHCode: ["mc|mush"], - MySQL: ["mysql"], - Nginx: ["nginx|conf"], - Nim: ["nim"], - Nix: ["nix"], - NSIS: ["nsi|nsh"], - Nunjucks: ["nunjucks|nunjs|nj|njk"], - ObjectiveC: ["m|mm"], - OCaml: ["ml|mli"], - PartiQL: ["partiql|pql"], - Pascal: ["pas|p"], - Perl: ["pl|pm"], - pgSQL: ["pgsql"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Ion: ["ion"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|cjs|mjs"], + JEXL: ["jexl"], + JSON: ["json"], + JSON5: ["json5"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSSM: ["jssm|jssm_state"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + Latte: ["latte"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + LogiQL: ["logic|lql"], + Logtalk: ["lgt"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MediaWiki: ["wiki|mediawiki"], + MEL: ["mel"], + MIPS: ["s|asm"], + MIXAL: ["mixal"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Mariadb: ["mariadb"], + Nasal: ["nas"], + Nginx: ["nginx|conf"], + Nim: ["nim"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + Nunjucks: ["nunjucks|nunjs|nj|njk"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + Odin: ["odin"], + PartiQL: ["partiql|pql"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], PHP_Laravel_blade: ["blade.php"], - PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], - Pig: ["pig"], - Powershell: ["ps1"], - Praat: ["praat|praatscript|psc|proc"], - Prisma: ["prisma"], - Prolog: ["plg|prolog"], - Properties: ["properties"], - Protobuf: ["proto"], - Puppet: ["epp|pp"], - Python: ["py"], - QML: ["qml"], - R: ["r"], - Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], - Razor: ["cshtml|asp"], - RDoc: ["Rd"], - Red: ["red|reds"], - RHTML: ["Rhtml"], - Robot: ["robot|resource"], - RST: ["rst"], - Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], - Rust: ["rs"], - SaC: ["sac"], - SASS: ["sass"], - SCAD: ["scad"], - Scala: ["scala|sbt"], - Scheme: ["scm|sm|rkt|oak|scheme"], - Scrypt: ["scrypt"], - SCSS: ["scss"], - SH: ["sh|bash|^.bashrc"], - SJS: ["sjs"], - Slim: ["slim|skim"], - Smarty: ["smarty|tpl"], - Smithy: ["smithy"], - snippets: ["snippets"], - Soy_Template:["soy"], - Space: ["space"], - SQL: ["sql"], - SQLServer: ["sqlserver"], - Stylus: ["styl|stylus"], - SVG: ["svg"], - Swift: ["swift"], - Tcl: ["tcl"], - Terraform: ["tf", "tfvars", "terragrunt"], - Tex: ["tex"], - Text: ["txt"], - Textile: ["textile"], - Toml: ["toml"], - TSX: ["tsx"], - Twig: ["twig|swig"], - Typescript: ["ts|typescript|str"], - Vala: ["vala"], - VBScript: ["vbs|vb"], - Velocity: ["vm"], - Verilog: ["v|vh|sv|svh"], - VHDL: ["vhd|vhdl"], + Pig: ["pig"], + PLSQL: ["plsql"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prisma: ["prisma"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + PRQL: ["prql"], + Puppet: ["epp|pp"], + Python: ["py"], + QML: ["qml"], + R: ["r"], + Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + Red: ["red|reds"], + RHTML: ["Rhtml"], + Robot: ["robot|resource"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SaC: ["sac"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala|sbt"], + Scheme: ["scm|sm|rkt|oak|scheme"], + Scrypt: ["scrypt"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Slim: ["slim|skim"], + Smarty: ["smarty|tpl"], + Smithy: ["smithy"], + snippets: ["snippets"], + Soy_Template: ["soy"], + Space: ["space"], + SPARQL: ["rq"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Terraform: ["tf", "tfvars", "terragrunt"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSV: ["tsv"], + TSX: ["tsx"], + Turtle: ["ttl"], + Twig: ["twig|swig"], + Typescript: ["ts|mts|cts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], Visualforce: ["vfp|component|page"], - Wollok: ["wlk|wpgm|wtest"], - XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], - XQuery: ["xq"], - YAML: ["yaml|yml"], - Zeek: ["zeek|bro"], - Django: ["html"] + Vue: ["vue"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Zeek: ["zeek|bro"], + Zig: ["zig"] }; - var nameOverrides = { ObjectiveC: "Objective-C", CSharp: "C#", @@ -226,7 +256,6 @@ var nameOverrides = { Perl6: "Perl 6", AutoHotKey: "AutoHotkey / AutoIt" }; - var modesByName = {}; for (var name in supportedModes) { var data = supportedModes[name]; @@ -236,12 +265,9 @@ for (var name in supportedModes) { modesByName[filename] = mode; modes.push(mode); } - -module.exports = { - getModeForPath: getModeForPath, - modes: modes, - modesByName: modesByName -}; +exports.getModeForPath = getModeForPath; +exports.modes = modes; +exports.modesByName = modesByName; }); (function() { window.require(["ace/ext/modelist"], function(m) { diff --git a/app/Resources/ui/js/ace/ext-options.js b/app/Resources/ui/js/ace/ext-options.js index be4b96da..5547085f 100644 --- a/app/Resources/ui/js/ace/ext-options.js +++ b/app/Resources/ui/js/ace/ext-options.js @@ -1,80 +1,42 @@ -define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/ext/menu_tools/settings_menu.css",["require","exports","module"], function(require, exports, module){module.exports = "#ace_settingsmenu, #kbshortcutmenu {\n background-color: #F7F7F7;\n color: black;\n box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\n padding: 1em 0.5em 2em 1em;\n overflow: auto;\n position: absolute;\n margin: 0;\n bottom: 0;\n right: 0;\n top: 0;\n z-index: 9991;\n cursor: default;\n}\n\n.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\n box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\n background-color: rgba(255, 255, 255, 0.6);\n color: black;\n}\n\n.ace_optionsMenuEntry:hover {\n background-color: rgba(100, 100, 100, 0.1);\n transition: all 0.3s\n}\n\n.ace_closeButton {\n background: rgba(245, 146, 146, 0.5);\n border: 1px solid #F48A8A;\n border-radius: 50%;\n padding: 7px;\n position: absolute;\n right: -8px;\n top: -8px;\n z-index: 100000;\n}\n.ace_closeButton{\n background: rgba(245, 146, 146, 0.9);\n}\n.ace_optionsMenuKey {\n color: darkslateblue;\n font-weight: bold;\n}\n.ace_optionsMenuCommand {\n color: darkcyan;\n font-weight: normal;\n}\n.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\n vertical-align: middle;\n}\n\n.ace_optionsMenuEntry button[ace_selected_button=true] {\n background: #e7e7e7;\n box-shadow: 1px 0px 2px 0px #adadad inset;\n border-color: #adadad;\n}\n.ace_optionsMenuEntry button {\n background: white;\n border: 1px solid lightgray;\n margin: 0px;\n}\n.ace_optionsMenuEntry button:hover{\n background: #f0f0f0;\n}"; + +}); + +define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/ext/menu_tools/settings_menu.css"], function(require, exports, module){/** + * ## Overlay Page utility + * + * Provides modal overlay functionality for displaying editor extension interfaces. Creates a full-screen overlay with + * configurable backdrop behavior, keyboard navigation (ESC to close), and focus management. Used by various extensions + * to display menus, settings panels, and other interactive content over the editor interface. + * + * **Usage:** + * ```javascript + * var overlayPage = require('./overlay_page').overlayPage; + * var contentElement = document.createElement('div'); + * contentElement.innerHTML = '

Settings

'; + * + * var overlay = overlayPage(editor, contentElement, function() { + * console.log('Overlay closed'); + * }); + * ``` + * + * @module + */ 'use strict'; var dom = require("../../lib/dom"); -var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ -background-color: #F7F7F7;\ -color: black;\ -box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ -padding: 1em 0.5em 2em 1em;\ -overflow: auto;\ -position: absolute;\ -margin: 0;\ -bottom: 0;\ -right: 0;\ -top: 0;\ -z-index: 9991;\ -cursor: default;\ -}\ -.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ -box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ -background-color: rgba(255, 255, 255, 0.6);\ -color: black;\ -}\ -.ace_optionsMenuEntry:hover {\ -background-color: rgba(100, 100, 100, 0.1);\ -transition: all 0.3s\ -}\ -.ace_closeButton {\ -background: rgba(245, 146, 146, 0.5);\ -border: 1px solid #F48A8A;\ -border-radius: 50%;\ -padding: 7px;\ -position: absolute;\ -right: -8px;\ -top: -8px;\ -z-index: 100000;\ -}\ -.ace_closeButton{\ -background: rgba(245, 146, 146, 0.9);\ -}\ -.ace_optionsMenuKey {\ -color: darkslateblue;\ -font-weight: bold;\ -}\ -.ace_optionsMenuCommand {\ -color: darkcyan;\ -font-weight: normal;\ -}\ -.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\ -vertical-align: middle;\ -}\ -.ace_optionsMenuEntry button[ace_selected_button=true] {\ -background: #e7e7e7;\ -box-shadow: 1px 0px 2px 0px #adadad inset;\ -border-color: #adadad;\ -}\ -.ace_optionsMenuEntry button {\ -background: white;\ -border: 1px solid lightgray;\ -margin: 0px;\ -}\ -.ace_optionsMenuEntry button:hover{\ -background: #f0f0f0;\ -}"; +var cssText = require("./settings_menu.css"); dom.importCssString(cssText, "settings_menu.css", false); - module.exports.overlayPage = function overlayPage(editor, contentElement, callback) { var closer = document.createElement('div'); var ignoreFocusOut = false; - function documentEscListener(e) { if (e.keyCode === 27) { close(); } } - function close() { - if (!closer) return; + if (!closer) + return; document.removeEventListener('keydown', documentEscListener); closer.parentNode.removeChild(closer); if (editor) { @@ -90,22 +52,19 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba contentElement.style.pointerEvents = "auto"; } } - closer.style.cssText = 'margin: 0; padding: 0; ' + 'position: fixed; top:0; bottom:0; left:0; right:0;' + 'z-index: 9990; ' + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : ''); - closer.addEventListener('click', function(e) { + closer.addEventListener('click', function (e) { if (!ignoreFocusOut) { close(); } }); document.addEventListener('keydown', documentEscListener); - contentElement.addEventListener('click', function (e) { e.stopPropagation(); }); - closer.appendChild(contentElement); document.body.appendChild(closer); if (editor) { @@ -119,9 +78,58 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba }); -define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/settings_menu",["require","exports","module","ace/ext/options","ace/ext/menu_tools/overlay_page","ace/editor"], function(require, exports, module){/** + * ## Interactive Settings Menu Extension + * + * Provides settings interface for the Ace editor that displays dynamically generated configuration options based on + * the current editor state. The menu appears as an overlay panel allowing users to modify editor options, themes, + * modes, and other settings through an intuitive graphical interface. + * + * **Usage:** + * ```javascript + * editor.showSettingsMenu(); + * ``` + * + * The extension automatically registers the `showSettingsMenu` command and method + * on the editor instance when initialized. + * + * @author + * Matthew Christopher Kastor-Inare III
+ * + * @module + */ "use strict"; +var OptionPanel = require("./options").OptionPanel; +var overlayPage = require('./menu_tools/overlay_page').overlayPage; +function showSettingsMenu(editor) { + if (!document.getElementById('ace_settingsmenu')) { + var options = new OptionPanel(editor); + options.render(); + options.container.id = "ace_settingsmenu"; + overlayPage(editor, options.container); + options.container.querySelector("select,input,button,checkbox").focus(); + } +} +module.exports.init = function () { + var Editor = require("../editor").Editor; + Editor.prototype.showSettingsMenu = function () { + showSettingsMenu(this); + }; +}; + +}); +define("ace/ext/modelist",["require","exports","module"], function(require, exports, module){/** + * ## File mode detection utility + * + * Provides automatic detection of editor syntax modes based on file paths and extensions. Maps file extensions to + * appropriate Ace Editor syntax highlighting modes for over 100 programming languages and file formats including + * JavaScript, TypeScript, HTML, CSS, Python, Java, C++, and many others. Supports complex extension patterns and + * provides fallback mechanisms for unknown file types. + * + * @module + */ +"use strict"; var modes = []; function getModeForPath(path) { var mode = modesByName.text; @@ -134,203 +142,225 @@ function getModeForPath(path) { } return mode; } - -var Mode = function(name, caption, extensions) { - this.name = name; - this.caption = caption; - this.mode = "ace/mode/" + name; - this.extensions = extensions; - var re; - if (/\^/.test(extensions)) { - re = extensions.replace(/\|(\^)?/g, function(a, b){ - return "$|" + (b ? "^" : "^.*\\."); - }) + "$"; - } else { - re = "^.*\\.(" + extensions + ")$"; +var Mode = /** @class */ (function () { + function Mode(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function (a, b) { + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } + else { + re = "\\.(" + extensions + ")$"; + } + this.extRe = new RegExp(re, "gi"); } - - this.extRe = new RegExp(re, "gi"); -}; - -Mode.prototype.supportsFile = function(filename) { - return filename.match(this.extRe); -}; + Mode.prototype.supportsFile = function (filename) { + return filename.match(this.extRe); + }; + return Mode; +}()); var supportedModes = { - ABAP: ["abap"], - ABC: ["abc"], - ActionScript:["as"], - ADA: ["ada|adb"], - Alda: ["alda"], + ABAP: ["abap"], + ABC: ["abc"], + ActionScript: ["as"], + ADA: ["ada|adb"], + Alda: ["alda"], Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], - Apex: ["apex|cls|trigger|tgr"], - AQL: ["aql"], - AsciiDoc: ["asciidoc|adoc"], - ASL: ["dsl|asl|asl.json"], - Assembly_x86:["asm|a"], - AutoHotKey: ["ahk"], - BatchFile: ["bat|cmd"], - C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], - C9Search: ["c9search_results"], - Cirru: ["cirru|cr"], - Clojure: ["clj|cljs"], - Cobol: ["CBL|COB"], - coffee: ["coffee|cf|cson|^Cakefile"], - ColdFusion: ["cfm"], - Crystal: ["cr"], - CSharp: ["cs"], + Apex: ["apex|cls|trigger|tgr"], + AQL: ["aql"], + AsciiDoc: ["asciidoc|adoc"], + ASL: ["dsl|asl|asl.json"], + Assembly_ARM32: ["s"], + Assembly_x86: ["asm|a"], + Astro: ["astro"], + AutoHotKey: ["ahk"], + Basic: ["bas|bak"], + BatchFile: ["bat|cmd"], + BibTeX: ["bib"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cedar: ["cedar"], + CedarSchema: ["cedarschema"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Clue: ["clue"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm|cfc"], + Crystal: ["cr"], + CSharp: ["cs"], Csound_Document: ["csd"], Csound_Orchestra: ["orc"], Csound_Score: ["sco"], - CSS: ["css"], - Curly: ["curly"], - D: ["d|di"], - Dart: ["dart"], - Diff: ["diff|patch"], - Dockerfile: ["^Dockerfile"], - Dot: ["dot"], - Drools: ["drl"], - Edifact: ["edi"], - Eiffel: ["e|ge"], - EJS: ["ejs"], - Elixir: ["ex|exs"], - Elm: ["elm"], - Erlang: ["erl|hrl"], - Forth: ["frt|fs|ldr|fth|4th"], - Fortran: ["f|f90"], - FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], - FSL: ["fsl"], - FTL: ["ftl"], - Gcode: ["gcode"], - Gherkin: ["feature"], - Gitignore: ["^.gitignore"], - Glsl: ["glsl|frag|vert"], - Gobstones: ["gbs"], - golang: ["go"], + CSS: ["css"], + CSV: ["csv"], + Curly: ["curly"], + Cuttlefish: ["conf"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Django: ["djt|html.djt|dj.html|djhtml"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Edifact: ["edi"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Flix: ["flix"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], + FSL: ["fsl"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], GraphQLSchema: ["gql"], - Groovy: ["groovy"], - HAML: ["haml"], - Handlebars: ["hbs|handlebars|tpl|mustache"], - Haskell: ["hs"], + GROQ: ["groq"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], Haskell_Cabal: ["cabal"], - haXe: ["hx"], - Hjson: ["hjson"], - HTML: ["html|htm|xhtml|vue|we|wpy"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml|we|wpy"], HTML_Elixir: ["eex|html.eex"], - HTML_Ruby: ["erb|rhtml|html.erb"], - INI: ["ini|conf|cfg|prefs"], - Io: ["io"], - Ion: ["ion"], - Jack: ["jack"], - Jade: ["jade|pug"], - Java: ["java"], - JavaScript: ["js|jsm|jsx|cjs|mjs"], - JSON: ["json"], - JSON5: ["json5"], - JSONiq: ["jq"], - JSP: ["jsp"], - JSSM: ["jssm|jssm_state"], - JSX: ["jsx"], - Julia: ["jl"], - Kotlin: ["kt|kts"], - LaTeX: ["tex|latex|ltx|bib"], - Latte: ["latte"], - LESS: ["less"], - Liquid: ["liquid"], - Lisp: ["lisp"], - LiveScript: ["ls"], - Log: ["log"], - LogiQL: ["logic|lql"], - LSL: ["lsl"], - Lua: ["lua"], - LuaPage: ["lp"], - Lucene: ["lucene"], - Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], - Markdown: ["md|markdown"], - Mask: ["mask"], - MATLAB: ["matlab"], - Maze: ["mz"], - MediaWiki: ["wiki|mediawiki"], - MEL: ["mel"], - MIPS: ["s|asm"], - MIXAL: ["mixal"], - MUSHCode: ["mc|mush"], - MySQL: ["mysql"], - Nginx: ["nginx|conf"], - Nim: ["nim"], - Nix: ["nix"], - NSIS: ["nsi|nsh"], - Nunjucks: ["nunjucks|nunjs|nj|njk"], - ObjectiveC: ["m|mm"], - OCaml: ["ml|mli"], - PartiQL: ["partiql|pql"], - Pascal: ["pas|p"], - Perl: ["pl|pm"], - pgSQL: ["pgsql"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Ion: ["ion"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|cjs|mjs"], + JEXL: ["jexl"], + JSON: ["json"], + JSON5: ["json5"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSSM: ["jssm|jssm_state"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + Latte: ["latte"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + LogiQL: ["logic|lql"], + Logtalk: ["lgt"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MediaWiki: ["wiki|mediawiki"], + MEL: ["mel"], + MIPS: ["s|asm"], + MIXAL: ["mixal"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Mariadb: ["mariadb"], + Nasal: ["nas"], + Nginx: ["nginx|conf"], + Nim: ["nim"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + Nunjucks: ["nunjucks|nunjs|nj|njk"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + Odin: ["odin"], + PartiQL: ["partiql|pql"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], PHP_Laravel_blade: ["blade.php"], - PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], - Pig: ["pig"], - Powershell: ["ps1"], - Praat: ["praat|praatscript|psc|proc"], - Prisma: ["prisma"], - Prolog: ["plg|prolog"], - Properties: ["properties"], - Protobuf: ["proto"], - Puppet: ["epp|pp"], - Python: ["py"], - QML: ["qml"], - R: ["r"], - Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], - Razor: ["cshtml|asp"], - RDoc: ["Rd"], - Red: ["red|reds"], - RHTML: ["Rhtml"], - Robot: ["robot|resource"], - RST: ["rst"], - Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], - Rust: ["rs"], - SaC: ["sac"], - SASS: ["sass"], - SCAD: ["scad"], - Scala: ["scala|sbt"], - Scheme: ["scm|sm|rkt|oak|scheme"], - Scrypt: ["scrypt"], - SCSS: ["scss"], - SH: ["sh|bash|^.bashrc"], - SJS: ["sjs"], - Slim: ["slim|skim"], - Smarty: ["smarty|tpl"], - Smithy: ["smithy"], - snippets: ["snippets"], - Soy_Template:["soy"], - Space: ["space"], - SQL: ["sql"], - SQLServer: ["sqlserver"], - Stylus: ["styl|stylus"], - SVG: ["svg"], - Swift: ["swift"], - Tcl: ["tcl"], - Terraform: ["tf", "tfvars", "terragrunt"], - Tex: ["tex"], - Text: ["txt"], - Textile: ["textile"], - Toml: ["toml"], - TSX: ["tsx"], - Twig: ["twig|swig"], - Typescript: ["ts|typescript|str"], - Vala: ["vala"], - VBScript: ["vbs|vb"], - Velocity: ["vm"], - Verilog: ["v|vh|sv|svh"], - VHDL: ["vhd|vhdl"], + Pig: ["pig"], + PLSQL: ["plsql"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prisma: ["prisma"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + PRQL: ["prql"], + Puppet: ["epp|pp"], + Python: ["py"], + QML: ["qml"], + R: ["r"], + Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + Red: ["red|reds"], + RHTML: ["Rhtml"], + Robot: ["robot|resource"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SaC: ["sac"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala|sbt"], + Scheme: ["scm|sm|rkt|oak|scheme"], + Scrypt: ["scrypt"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Slim: ["slim|skim"], + Smarty: ["smarty|tpl"], + Smithy: ["smithy"], + snippets: ["snippets"], + Soy_Template: ["soy"], + Space: ["space"], + SPARQL: ["rq"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Terraform: ["tf", "tfvars", "terragrunt"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSV: ["tsv"], + TSX: ["tsx"], + Turtle: ["ttl"], + Twig: ["twig|swig"], + Typescript: ["ts|mts|cts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], Visualforce: ["vfp|component|page"], - Wollok: ["wlk|wpgm|wtest"], - XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], - XQuery: ["xq"], - YAML: ["yaml|yml"], - Zeek: ["zeek|bro"], - Django: ["html"] + Vue: ["vue"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Zeek: ["zeek|bro"], + Zig: ["zig"] }; - var nameOverrides = { ObjectiveC: "Objective-C", CSharp: "C#", @@ -347,7 +377,6 @@ var nameOverrides = { Perl6: "Perl 6", AutoHotKey: "AutoHotkey / AutoIt" }; - var modesByName = {}; for (var name in supportedModes) { var data = supportedModes[name]; @@ -357,63 +386,73 @@ for (var name in supportedModes) { modesByName[filename] = mode; modes.push(mode); } - -module.exports = { - getModeForPath: getModeForPath, - modes: modes, - modesByName: modesByName -}; +exports.getModeForPath = getModeForPath; +exports.modes = modes; +exports.modesByName = modesByName; }); -define("ace/ext/themelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/themelist",["require","exports","module"], function(require, exports, module){/** + * ## Theme enumeration utility + * + * Provides theme management for the Ace Editor by generating and organizing available themes into + * categorized collections. Automatically maps theme data into structured objects containing theme metadata including + * display captions, theme paths, brightness classification (dark/light), and normalized names. Exports both an + * indexed theme collection and a complete themes array for easy integration with theme selection components + * and configuration systems. + * + * @author + * Matthew Christopher Kastor-Inare III
+ * @module + */ "use strict"; - var themeData = [ - ["Chrome" ], - ["Clouds" ], - ["Crimson Editor" ], - ["Dawn" ], - ["Dreamweaver" ], - ["Eclipse" ], - ["GitHub" ], - ["IPlastic" ], + ["Chrome"], + ["Clouds"], + ["Crimson Editor"], + ["Dawn"], + ["Dreamweaver"], + ["Eclipse"], + ["GitHub Light Default"], + ["GitHub (Legacy)", "github", "light"], + ["IPlastic"], ["Solarized Light"], - ["TextMate" ], - ["Tomorrow" ], - ["XCode" ], + ["TextMate"], + ["Tomorrow"], + ["XCode"], ["Kuroir"], ["KatzenMilch"], - ["SQL Server" ,"sqlserver" , "light"], - ["Ambiance" ,"ambiance" , "dark"], - ["Chaos" ,"chaos" , "dark"], - ["Clouds Midnight" ,"clouds_midnight" , "dark"], - ["Dracula" ,"" , "dark"], - ["Cobalt" ,"cobalt" , "dark"], - ["Gruvbox" ,"gruvbox" , "dark"], - ["Green on Black" ,"gob" , "dark"], - ["idle Fingers" ,"idle_fingers" , "dark"], - ["krTheme" ,"kr_theme" , "dark"], - ["Merbivore" ,"merbivore" , "dark"], - ["Merbivore Soft" ,"merbivore_soft" , "dark"], - ["Mono Industrial" ,"mono_industrial" , "dark"], - ["Monokai" ,"monokai" , "dark"], - ["Nord Dark" ,"nord_dark" , "dark"], - ["One Dark" ,"one_dark" , "dark"], - ["Pastel on dark" ,"pastel_on_dark" , "dark"], - ["Solarized Dark" ,"solarized_dark" , "dark"], - ["Terminal" ,"terminal" , "dark"], - ["Tomorrow Night" ,"tomorrow_night" , "dark"], - ["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"], - ["Tomorrow Night Bright","tomorrow_night_bright" , "dark"], - ["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"], - ["Twilight" ,"twilight" , "dark"], - ["Vibrant Ink" ,"vibrant_ink" , "dark"] + ["SQL Server", "sqlserver", "light"], + ["CloudEditor", "cloud_editor", "light"], + ["Ambiance", "ambiance", "dark"], + ["Chaos", "chaos", "dark"], + ["Clouds Midnight", "clouds_midnight", "dark"], + ["Dracula", "", "dark"], + ["Cobalt", "cobalt", "dark"], + ["Gruvbox", "gruvbox", "dark"], + ["Green on Black", "gob", "dark"], + ["idle Fingers", "idle_fingers", "dark"], + ["krTheme", "kr_theme", "dark"], + ["Merbivore", "merbivore", "dark"], + ["Merbivore Soft", "merbivore_soft", "dark"], + ["Mono Industrial", "mono_industrial", "dark"], + ["Monokai", "monokai", "dark"], + ["Nord Dark", "nord_dark", "dark"], + ["One Dark", "one_dark", "dark"], + ["Pastel on dark", "pastel_on_dark", "dark"], + ["Solarized Dark", "solarized_dark", "dark"], + ["Terminal", "terminal", "dark"], + ["Tomorrow Night", "tomorrow_night", "dark"], + ["Tomorrow Night Blue", "tomorrow_night_blue", "dark"], + ["Tomorrow Night Bright", "tomorrow_night_bright", "dark"], + ["Tomorrow Night 80s", "tomorrow_night_eighties", "dark"], + ["Twilight", "twilight", "dark"], + ["Vibrant Ink", "vibrant_ink", "dark"], + ["GitHub Dark", "github_dark", "dark"], + ["CloudEditor Dark", "cloud_editor_dark", "dark"] ]; - - exports.themesByName = {}; -exports.themes = themeData.map(function(data) { +exports.themes = themeData.map(function (data) { var name = data[1] || data[0].replace(/ /g, "_").toLowerCase(); var theme = { caption: data[0], @@ -427,30 +466,39 @@ exports.themes = themeData.map(function(data) { }); -define("ace/ext/options",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/lib/oop","ace/config","ace/lib/event_emitter","ace/ext/modelist","ace/ext/themelist"], function(require, exports, module) { +define("ace/ext/options",["require","exports","module","ace/ext/settings_menu","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/lib/oop","ace/config","ace/lib/event_emitter","ace/ext/modelist","ace/ext/themelist"], function(require, exports, module){/** + * ## Settings Menu extension + * + * Provides a settings panel for configuring editor options through an interactive UI. + * Creates a tabular interface with grouped configuration options including themes, modes, keybindings, + * font settings, display preferences, and advanced editor behaviors. Supports dynamic option rendering + * with various input types (dropdowns, checkboxes, number inputs, button bars) and real-time updates. + * + * **Usage:** + * ```javascript + * var OptionPanel = require("ace/ext/settings_menu").OptionPanel; + * var panel = new OptionPanel(editor); + * panel.render(); + * ``` + * + * @module + */ "use strict"; - require("./menu_tools/overlay_page"); - var dom = require("../lib/dom"); var oop = require("../lib/oop"); var config = require("../config"); var EventEmitter = require("../lib/event_emitter").EventEmitter; var buildDom = dom.buildDom; - var modelist = require("./modelist"); var themelist = require("./themelist"); - var themes = { Bright: [], Dark: [] }; -themelist.themes.forEach(function(x) { +themelist.themes.forEach(function (x) { themes[x.isDark ? "Dark" : "Bright"].push({ caption: x.caption, value: x.theme }); }); - -var modes = modelist.modes.map(function(x){ - return { caption: x.caption, value: x.mode }; +var modes = modelist.modes.map(function (x) { + return { caption: x.caption, value: x.mode }; }); - - var optionGroups = { Main: { Mode: { @@ -467,11 +515,11 @@ var optionGroups = { type: "buttonBar", path: "keyboardHandler", items: [ - { caption : "Ace", value : null }, - { caption : "Vim", value : "ace/keyboard/vim" }, - { caption : "Emacs", value : "ace/keyboard/emacs" }, - { caption : "Sublime", value : "ace/keyboard/sublime" }, - { caption : "VSCode", value : "ace/keyboard/vscode" } + { caption: "Ace", value: null }, + { caption: "Vim", value: "ace/keyboard/vim" }, + { caption: "Emacs", value: "ace/keyboard/emacs" }, + { caption: "Sublime", value: "ace/keyboard/sublime" }, + { caption: "VSCode", value: "ace/keyboard/vscode" } ] }, "Font Size": { @@ -479,53 +527,53 @@ var optionGroups = { type: "number", defaultValue: 12, defaults: [ - {caption: "12px", value: 12}, - {caption: "24px", value: 24} + { caption: "12px", value: 12 }, + { caption: "24px", value: 24 } ] }, "Soft Wrap": { type: "buttonBar", path: "wrap", items: [ - { caption : "Off", value : "off" }, - { caption : "View", value : "free" }, - { caption : "margin", value : "printMargin" }, - { caption : "40", value : "40" } + { caption: "Off", value: "off" }, + { caption: "View", value: "free" }, + { caption: "margin", value: "printMargin" }, + { caption: "40", value: "40" } ] }, "Cursor Style": { path: "cursorStyle", items: [ - { caption : "Ace", value : "ace" }, - { caption : "Slim", value : "slim" }, - { caption : "Smooth", value : "smooth" }, - { caption : "Smooth And Slim", value : "smooth slim" }, - { caption : "Wide", value : "wide" } + { caption: "Ace", value: "ace" }, + { caption: "Slim", value: "slim" }, + { caption: "Smooth", value: "smooth" }, + { caption: "Smooth And Slim", value: "smooth slim" }, + { caption: "Wide", value: "wide" } ] }, "Folding": { path: "foldStyle", items: [ - { caption : "Manual", value : "manual" }, - { caption : "Mark begin", value : "markbegin" }, - { caption : "Mark begin and end", value : "markbeginend" } + { caption: "Manual", value: "manual" }, + { caption: "Mark begin", value: "markbegin" }, + { caption: "Mark begin and end", value: "markbeginend" } ] }, "Soft Tabs": [{ - path: "useSoftTabs" - }, { - ariaLabel: "Tab Size", - path: "tabSize", - type: "number", - values: [2, 3, 4, 8, 16] - }], + path: "useSoftTabs" + }, { + ariaLabel: "Tab Size", + path: "tabSize", + type: "number", + values: [2, 3, 4, 8, 16] + }], "Overscroll": { type: "buttonBar", path: "scrollPastEnd", items: [ - { caption : "None", value : 0 }, - { caption : "Half", value : 0.5 }, - { caption : "Full", value : 1 } + { caption: "None", value: 0 }, + { caption: "Half", value: 0.5 }, + { caption: "Full", value: 1 } ] } }, @@ -556,6 +604,9 @@ var optionGroups = { "Show Indent Guides": { path: "displayIndentGuides" }, + "Highlight Indent Guides": { + path: "highlightIndentGuides" + }, "Persistent HScrollbar": { path: "hScrollBarAlwaysVisible" }, @@ -578,12 +629,12 @@ var optionGroups = { path: "fixedWidthGutter" }, "Show Print Margin": [{ - path: "showPrintMargin" - }, { - ariaLabel: "Print Margin", - type: "number", - path: "printMarginColumn" - }], + path: "showPrintMargin" + }, { + ariaLabel: "Print Margin", + type: "number", + path: "printMarginColumn" + }], "Indented Soft Wrap": { path: "indentedSoftWrap" }, @@ -599,9 +650,9 @@ var optionGroups = { "Merge Undo Deltas": { path: "mergeUndoDeltas", items: [ - { caption : "Always", value : "always" }, - { caption : "Never", value : "false" }, - { caption : "Timed", value : "true" } + { caption: "Always", value: "always" }, + { caption: "Never", value: "false" }, + { caption: "Timed", value: "true" } ] }, "Elastic Tabstops": { @@ -618,144 +669,148 @@ var optionGroups = { }, "Live Autocompletion": { path: "enableLiveAutocompletion" + }, + "Custom scrollbar": { + path: "customScrollbar" + }, + "Use SVG gutter icons": { + path: "useSvgGutterIcons" + }, + "Annotations for folded lines": { + path: "showFoldedAnnotations" + }, + "Keyboard Accessibility Mode": { + path: "enableKeyboardAccessibility" } } }; - - -var OptionPanel = function(editor, element) { - this.editor = editor; - this.container = element || document.createElement("div"); - this.groups = []; - this.options = {}; -}; - -(function() { - - oop.implement(this, EventEmitter); - - this.add = function(config) { +var OptionPanel = /** @class */ (function () { + function OptionPanel(editor, element) { + this.editor = editor; + this.container = element || document.createElement("div"); + this.groups = []; + this.options = {}; + } + OptionPanel.prototype.add = function (config) { if (config.Main) oop.mixin(optionGroups.Main, config.Main); if (config.More) oop.mixin(optionGroups.More, config.More); }; - - this.render = function() { + OptionPanel.prototype.render = function () { this.container.innerHTML = ""; - buildDom(["table", {role: "presentation", id: "controls"}, + buildDom(["table", { role: "presentation", id: "controls" }, this.renderOptionGroup(optionGroups.Main), - ["tr", null, ["td", {colspan: 2}, - ["table", {role: "presentation", id: "more-controls"}, - this.renderOptionGroup(optionGroups.More) - ] - ]], - ["tr", null, ["td", {colspan: 2}, "version " + config.version]] + ["tr", null, ["td", { colspan: 2 }, + ["table", { role: "presentation", id: "more-controls" }, + this.renderOptionGroup(optionGroups.More) + ] + ]], + ["tr", null, ["td", { colspan: 2 }, "version " + config.version]] ], this.container); }; - - this.renderOptionGroup = function(group) { - return Object.keys(group).map(function(key, i) { + OptionPanel.prototype.renderOptionGroup = function (group) { + return Object.keys(group).map(function (key, i) { var item = group[key]; if (!item.position) item.position = i / 10000; if (!item.label) item.label = key; return item; - }).sort(function(a, b) { + }).sort(function (a, b) { return a.position - b.position; - }).map(function(item) { + }).map(function (item) { return this.renderOption(item.label, item); }, this); }; - - this.renderOptionControl = function(key, option) { + OptionPanel.prototype.renderOptionControl = function (key, option) { var self = this; if (Array.isArray(option)) { - return option.map(function(x) { + return option.map(function (x) { return self.renderOptionControl(key, x); }); } var control; - var value = self.getOption(option); - if (option.values && option.type != "checkbox") { if (typeof option.values == "string") option.values = option.values.split("|"); - option.items = option.values.map(function(v) { + option.items = option.values.map(function (v) { return { value: v, name: v }; }); } - if (option.type == "buttonBar") { - control = ["div", {role: "group", "aria-labelledby": option.path + "-label"}, option.items.map(function(item) { - return ["button", { - value: item.value, - ace_selected_button: value == item.value, - 'aria-pressed': value == item.value, - onclick: function() { - self.setOption(option, item.value); - var nodes = this.parentNode.querySelectorAll("[ace_selected_button]"); - for (var i = 0; i < nodes.length; i++) { - nodes[i].removeAttribute("ace_selected_button"); - nodes[i].setAttribute("aria-pressed", false); - } - this.setAttribute("ace_selected_button", true); - this.setAttribute("aria-pressed", true); - } - }, item.desc || item.caption || item.name]; - })]; - } else if (option.type == "number") { - control = ["input", {type: "number", value: value || option.defaultValue, style:"width:3em", oninput: function() { - self.setOption(option, parseInt(this.value)); - }}]; + control = ["div", { role: "group", "aria-labelledby": option.path + "-label" }, option.items.map(function (item) { + return ["button", { + value: item.value, + ace_selected_button: value == item.value, + 'aria-pressed': value == item.value, + onclick: function () { + self.setOption(option, item.value); + var nodes = this.parentNode.querySelectorAll("[ace_selected_button]"); + for (var i = 0; i < nodes.length; i++) { + nodes[i].removeAttribute("ace_selected_button"); + nodes[i].setAttribute("aria-pressed", false); + } + this.setAttribute("ace_selected_button", true); + this.setAttribute("aria-pressed", true); + } + }, item.desc || item.caption || item.name]; + })]; + } + else if (option.type == "number") { + control = ["input", { type: "number", value: value || option.defaultValue, style: "width:3em", oninput: function () { + self.setOption(option, parseInt(this.value)); + } }]; if (option.ariaLabel) { control[1]["aria-label"] = option.ariaLabel; - } else { + } + else { control[1].id = key; } if (option.defaults) { - control = [control, option.defaults.map(function(item) { - return ["button", {onclick: function() { - var input = this.parentNode.firstChild; - input.value = item.value; - input.oninput(); - }}, item.caption]; - })]; + control = [control, option.defaults.map(function (item) { + return ["button", { onclick: function () { + var input = this.parentNode.firstChild; + input.value = item.value; + input.oninput(); + } }, item.caption]; + })]; } - } else if (option.items) { - var buildItems = function(items) { - return items.map(function(item) { + } + else if (option.items) { + var buildItems = function (items) { + return items.map(function (item) { return ["option", { value: item.value || item.name }, item.desc || item.caption || item.name]; }); }; - - var items = Array.isArray(option.items) + var items = Array.isArray(option.items) ? buildItems(option.items) - : Object.keys(option.items).map(function(key) { - return ["optgroup", {"label": key}, buildItems(option.items[key])]; + : Object.keys(option.items).map(function (key) { + return ["optgroup", { "label": key }, buildItems(option.items[key])]; }); - control = ["select", { id: key, value: value, onchange: function() { - self.setOption(option, this.value); - } }, items]; - } else { + control = ["select", { id: key, value: value, onchange: function () { + self.setOption(option, this.value); + } }, items]; + } + else { if (typeof option.values == "string") option.values = option.values.split("|"); - if (option.values) value = value == option.values[1]; - control = ["input", { type: "checkbox", id: key, checked: value || null, onchange: function() { - var value = this.checked; - if (option.values) value = option.values[value ? 1 : 0]; - self.setOption(option, value); - }}]; + if (option.values) + value = value == option.values[1]; + control = ["input", { type: "checkbox", id: key, checked: value || null, onchange: function () { + var value = this.checked; + if (option.values) + value = option.values[value ? 1 : 0]; + self.setOption(option, value); + } }]; if (option.type == "checkedNumber") { control = [control, []]; } } return control; }; - - this.renderOption = function(key, option) { + OptionPanel.prototype.renderOption = function (key, option) { if (option.path && !option.onchange && !this.editor.$options[option.path]) return; var path = Array.isArray(option) ? option[0].path : option.path; @@ -763,36 +818,39 @@ var OptionPanel = function(editor, element) { var safeKey = "-" + path; var safeId = path + "-label"; var control = this.renderOptionControl(safeKey, option); - return ["tr", {class: "ace_optionsMenuEntry"}, ["td", - ["label", {for: safeKey, id: safeId}, key] - ], ["td", control]]; + return ["tr", { class: "ace_optionsMenuEntry" }, ["td", + ["label", { for: safeKey, id: safeId }, key] + ], ["td", control]]; }; - - this.setOption = function(option, value) { + OptionPanel.prototype.setOption = function (option, value) { if (typeof option == "string") option = this.options[option]; - if (value == "false") value = false; - if (value == "true") value = true; - if (value == "null") value = null; - if (value == "undefined") value = undefined; + if (value == "false") + value = false; + if (value == "true") + value = true; + if (value == "null") + value = null; + if (value == "undefined") + value = undefined; if (typeof value == "string" && parseFloat(value).toString() == value) value = parseFloat(value); if (option.onchange) option.onchange(value); else if (option.path) this.editor.setOption(option.path, value); - this._signal("setOption", {name: option.path, value: value}); + this._signal("setOption", { name: option.path, value: value }); }; - - this.getOption = function(option) { + OptionPanel.prototype.getOption = function (option) { if (option.getValue) return option.getValue(); return this.editor.getOption(option.path); }; - -}).call(OptionPanel.prototype); - + return OptionPanel; +}()); +oop.implement(OptionPanel.prototype, EventEmitter); exports.OptionPanel = OptionPanel; +exports.optionGroups = optionGroups; }); (function() { window.require(["ace/ext/options"], function(m) { diff --git a/app/Resources/ui/js/ace/ext-prompt.js b/app/Resources/ui/js/ace/ext-prompt.js index 247c16a0..5489f39a 100644 --- a/app/Resources/ui/js/ace/ext-prompt.js +++ b/app/Resources/ui/js/ace/ext-prompt.js @@ -1,437 +1,369 @@ -define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/lib/keys"], function(require, exports, module) { -"use strict"; -var keys = require("../../lib/keys"); -module.exports.getEditorKeybordShortcuts = function(editor) { - var KEY_MODS = keys.KEY_MODS; - var keybindings = []; - var commandMap = {}; - editor.keyBinding.$handlers.forEach(function(handler) { - var ckb = handler.commandKeyBinding; - for (var i in ckb) { - var key = i.replace(/(^|-)\w/g, function(x) { return x.toUpperCase(); }); - var commands = ckb[i]; - if (!Array.isArray(commands)) - commands = [commands]; - commands.forEach(function(command) { - if (typeof command != "string") - command = command.name; - if (commandMap[command]) { - commandMap[command].key += "|" + key; - } else { - commandMap[command] = {key: key, command: command}; - keybindings.push(commandMap[command]); - } - }); - } - }); - return keybindings; -}; - -}); - -define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/config","ace/lib/useragent"], function(require, exports, module){"use strict"; var Renderer = require("../virtual_renderer").VirtualRenderer; var Editor = require("../editor").Editor; var Range = require("../range").Range; var event = require("../lib/event"); var lang = require("../lib/lang"); var dom = require("../lib/dom"); - -var $singleLineEditor = function(el) { +var nls = require("../config").nls; +var userAgent = require("./../lib/useragent"); +var getAriaId = function (index) { + return "suggest-aria-id:".concat(index); +}; +var popupAriaRole = userAgent.isSafari ? "menu" : "listbox"; +var optionAriaRole = userAgent.isSafari ? "menuitem" : "option"; +var ariaActiveState = userAgent.isSafari ? "aria-current" : "aria-selected"; +var $singleLineEditor = function (el) { var renderer = new Renderer(el); - renderer.$maxLines = 4; - var editor = new Editor(renderer); - editor.setHighlightActiveLine(false); editor.setShowPrintMargin(false); editor.renderer.setShowGutter(false); editor.renderer.setHighlightGutterLine(false); - editor.$mouseHandler.$focusTimeout = 0; editor.$highlightTagPending = true; - return editor; }; - -var AcePopup = function(parentNode) { - var el = dom.createElement("div"); - var popup = new $singleLineEditor(el); - - if (parentNode) - parentNode.appendChild(el); - el.style.display = "none"; - popup.renderer.content.style.cursor = "default"; - popup.renderer.setStyle("ace_autocomplete"); - - popup.setOption("displayIndentGuides", false); - popup.setOption("dragDelay", 150); - - var noop = function(){}; - - popup.focus = noop; - popup.$isFocused = true; - - popup.renderer.$cursorLayer.restartTimer = noop; - popup.renderer.$cursorLayer.element.style.opacity = 0; - - popup.renderer.$maxLines = 8; - popup.renderer.$keepTextAreaAtCursor = false; - - popup.setHighlightActiveLine(false); - popup.session.highlight(""); - popup.session.$searchHighlight.clazz = "ace_highlight-marker"; - - popup.on("mousedown", function(e) { - var pos = e.getDocumentPosition(); - popup.selection.moveToPosition(pos); - selectionMarker.start.row = selectionMarker.end.row = pos.row; - e.stop(); - }); - - var lastMouseEvent; - var hoverMarker = new Range(-1,0,-1,Infinity); - var selectionMarker = new Range(-1,0,-1,Infinity); - selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine"); - popup.setSelectOnHover = function(val) { - if (!val) { - hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine"); - } else if (hoverMarker.id) { - popup.session.removeMarker(hoverMarker.id); - hoverMarker.id = null; - } - }; - popup.setSelectOnHover(false); - popup.on("mousemove", function(e) { - if (!lastMouseEvent) { +var AcePopup = /** @class */ (function () { + function AcePopup(parentNode) { + var el = dom.createElement("div"); + var popup = $singleLineEditor(el); + if (parentNode) { + parentNode.appendChild(el); + } + el.style.display = "none"; + popup.renderer.content.style.cursor = "default"; + popup.renderer.setStyle("ace_autocomplete"); + popup.renderer.$textLayer.element.setAttribute("role", popupAriaRole); + popup.renderer.$textLayer.element.setAttribute("aria-roledescription", nls("autocomplete.popup.aria-roledescription", "Autocomplete suggestions")); + popup.renderer.$textLayer.element.setAttribute("aria-label", nls("autocomplete.popup.aria-label", "Autocomplete suggestions")); + popup.renderer.textarea.setAttribute("aria-hidden", "true"); + popup.setOption("displayIndentGuides", false); + popup.setOption("dragDelay", 150); + var noop = function () { }; + popup.focus = noop; + popup.$isFocused = true; + popup.renderer.$cursorLayer.restartTimer = noop; + popup.renderer.$cursorLayer.element.style.opacity = "0"; + popup.renderer.$maxLines = 8; + popup.renderer.$keepTextAreaAtCursor = false; + popup.setHighlightActiveLine(false); + popup.session.highlight(""); + popup.session.$searchHighlight.clazz = "ace_highlight-marker"; + popup.on("mousedown", function (e) { + var pos = e.getDocumentPosition(); + popup.selection.moveToPosition(pos); + selectionMarker.start.row = selectionMarker.end.row = pos.row; + e.stop(); + }); + var lastMouseEvent; + var hoverMarker = new Range(-1, 0, -1, Infinity); + var selectionMarker = new Range(-1, 0, -1, Infinity); + selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine"); + popup.setSelectOnHover = function (val) { + if (!val) { + hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine"); + } + else if (hoverMarker.id) { + popup.session.removeMarker(hoverMarker.id); + hoverMarker.id = null; + } + }; + popup.setSelectOnHover(false); + popup.on("mousemove", function (e) { + if (!lastMouseEvent) { + lastMouseEvent = e; + return; + } + if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) { + return; + } lastMouseEvent = e; - return; - } - if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) { - return; - } - lastMouseEvent = e; - lastMouseEvent.scrollTop = popup.renderer.scrollTop; - var row = lastMouseEvent.getDocumentPosition().row; - if (hoverMarker.start.row != row) { - if (!hoverMarker.id) - popup.setRow(row); - setHoverMarker(row); - } - }); - popup.renderer.on("beforeRender", function() { - if (lastMouseEvent && hoverMarker.start.row != -1) { - lastMouseEvent.$pos = null; + lastMouseEvent.scrollTop = popup.renderer.scrollTop; + popup.isMouseOver = true; var row = lastMouseEvent.getDocumentPosition().row; - if (!hoverMarker.id) - popup.setRow(row); - setHoverMarker(row, true); - } - }); - popup.renderer.on("afterRender", function() { - var row = popup.getRow(); - var t = popup.renderer.$textLayer; - var selected = t.element.childNodes[row - t.config.firstRow]; - if (selected !== t.selectedNode && t.selectedNode) - dom.removeCssClass(t.selectedNode, "ace_selected"); - t.selectedNode = selected; - if (selected) - dom.addCssClass(selected, "ace_selected"); - }); - var hideHoverMarker = function() { setHoverMarker(-1); }; - var setHoverMarker = function(row, suppressRedraw) { - if (row !== hoverMarker.start.row) { - hoverMarker.start.row = hoverMarker.end.row = row; - if (!suppressRedraw) - popup.session._emit("changeBackMarker"); - popup._emit("changeHoverMarker"); - } - }; - popup.getHoveredRow = function() { - return hoverMarker.start.row; - }; - - event.addListener(popup.container, "mouseout", hideHoverMarker); - popup.on("hide", hideHoverMarker); - popup.on("changeSelection", hideHoverMarker); - - popup.session.doc.getLength = function() { - return popup.data.length; - }; - popup.session.doc.getLine = function(i) { - var data = popup.data[i]; - if (typeof data == "string") - return data; - return (data && data.value) || ""; - }; - - var bgTokenizer = popup.session.bgTokenizer; - bgTokenizer.$tokenizeRow = function(row) { - var data = popup.data[row]; - var tokens = []; - if (!data) + if (hoverMarker.start.row != row) { + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row); + } + }); + popup.renderer.on("beforeRender", function () { + if (lastMouseEvent && hoverMarker.start.row != -1) { + lastMouseEvent.$pos = null; + var row = lastMouseEvent.getDocumentPosition().row; + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row, true); + } + }); + popup.renderer.on("afterRender", function () { + var t = popup.renderer.$textLayer; + for (var row = t.config.firstRow, l = t.config.lastRow; row <= l; row++) { + var popupRowElement = /** @type {HTMLElement|null} */ (t.element.childNodes[row - t.config.firstRow]); + popupRowElement.setAttribute("role", optionAriaRole); + popupRowElement.setAttribute("aria-roledescription", nls("autocomplete.popup.item.aria-roledescription", "item")); + popupRowElement.setAttribute("aria-setsize", popup.data.length); + popupRowElement.setAttribute("aria-describedby", "doc-tooltip"); + popupRowElement.setAttribute("aria-posinset", row + 1); + var rowData = popup.getData(row); + if (rowData) { + var ariaLabel = "".concat(rowData.caption || rowData.value).concat(rowData.meta ? ", ".concat(rowData.meta) : ''); + popupRowElement.setAttribute("aria-label", ariaLabel); + } + var highlightedSpans = popupRowElement.querySelectorAll(".ace_completion-highlight"); + highlightedSpans.forEach(function (span) { + span.setAttribute("role", "mark"); + }); + } + }); + popup.renderer.on("afterRender", function () { + var row = popup.getRow(); + var t = popup.renderer.$textLayer; + var selected = /** @type {HTMLElement|null} */ (t.element.childNodes[row - t.config.firstRow]); + var el = document.activeElement; // Active element is textarea of main editor + if (selected !== popup.selectedNode && popup.selectedNode) { + dom.removeCssClass(popup.selectedNode, "ace_selected"); + popup.selectedNode.removeAttribute(ariaActiveState); + popup.selectedNode.removeAttribute("id"); + } + el.removeAttribute("aria-activedescendant"); + popup.selectedNode = selected; + if (selected) { + var ariaId = getAriaId(row); + dom.addCssClass(selected, "ace_selected"); + selected.id = ariaId; + t.element.setAttribute("aria-activedescendant", ariaId); + el.setAttribute("aria-activedescendant", ariaId); + selected.setAttribute(ariaActiveState, "true"); + } + }); + var hideHoverMarker = function () { setHoverMarker(-1); }; + var setHoverMarker = function (row, suppressRedraw) { + if (row !== hoverMarker.start.row) { + hoverMarker.start.row = hoverMarker.end.row = row; + if (!suppressRedraw) + popup.session._emit("changeBackMarker"); + popup._emit("changeHoverMarker"); + } + }; + popup.getHoveredRow = function () { + return hoverMarker.start.row; + }; + event.addListener(popup.container, "mouseout", function () { + popup.isMouseOver = false; + hideHoverMarker(); + }); + popup.on("hide", hideHoverMarker); + popup.on("changeSelection", hideHoverMarker); + popup.session.doc.getLength = function () { + return popup.data.length; + }; + popup.session.doc.getLine = function (i) { + var data = popup.data[i]; + if (typeof data == "string") + return data; + return (data && data.value) || ""; + }; + var bgTokenizer = popup.session.bgTokenizer; + bgTokenizer.$tokenizeRow = function (row) { + var data = popup.data[row]; + var tokens = []; + if (!data) + return tokens; + if (typeof data == "string") + data = { value: data }; + var caption = data.caption || data.value || data.name; + function addToken(value, className) { + value && tokens.push({ + type: (data.className || "") + (className || ""), + value: value + }); + } + var lower = caption.toLowerCase(); + var filterText = (popup.filterText || "").toLowerCase(); + var lastIndex = 0; + var lastI = 0; + for (var i = 0; i <= filterText.length; i++) { + if (i != lastI && (data.matchMask & (1 << i) || i == filterText.length)) { + var sub = filterText.slice(lastI, i); + lastI = i; + var index = lower.indexOf(sub, lastIndex); + if (index == -1) + continue; + addToken(caption.slice(lastIndex, index), ""); + lastIndex = index + sub.length; + addToken(caption.slice(index, lastIndex), "completion-highlight"); + } + } + addToken(caption.slice(lastIndex, caption.length), ""); + tokens.push({ type: "completion-spacer", value: " " }); + if (data.meta) + tokens.push({ type: "completion-meta", value: data.meta }); + if (data.message) + tokens.push({ type: "completion-message", value: data.message }); return tokens; - if (typeof data == "string") - data = {value: data}; - var caption = data.caption || data.value || data.name; - - function addToken(value, className) { - value && tokens.push({ - type: (data.className || "") + (className || ""), - value: value - }); - } - - var lower = caption.toLowerCase(); - var filterText = (popup.filterText || "").toLowerCase(); - var lastIndex = 0; - var lastI = 0; - for (var i = 0; i <= filterText.length; i++) { - if (i != lastI && (data.matchMask & (1 << i) || i == filterText.length)) { - var sub = filterText.slice(lastI, i); - lastI = i; - var index = lower.indexOf(sub, lastIndex); - if (index == -1) continue; - addToken(caption.slice(lastIndex, index), ""); - lastIndex = index + sub.length; - addToken(caption.slice(index, lastIndex), "completion-highlight"); - } - } - addToken(caption.slice(lastIndex, caption.length), ""); - - if (data.meta) - tokens.push({type: "completion-meta", value: data.meta}); - if (data.message) - tokens.push({type: "completion-message", value: data.message}); - - return tokens; - }; - bgTokenizer.$updateOnChange = noop; - bgTokenizer.start = noop; - - popup.session.$computeWidth = function() { - return this.screenWidth = 0; - }; - popup.isOpen = false; - popup.isTopdown = false; - popup.autoSelect = true; - popup.filterText = ""; - - popup.data = []; - popup.setData = function(list, filterText) { - popup.filterText = filterText || ""; - popup.setValue(lang.stringRepeat("\n", list.length), -1); - popup.data = list || []; - popup.setRow(0); - }; - popup.getData = function(row) { - return popup.data[row]; - }; - - popup.getRow = function() { - return selectionMarker.start.row; - }; - popup.setRow = function(line) { - line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length, line)); - if (selectionMarker.start.row != line) { - popup.selection.clearSelection(); - selectionMarker.start.row = selectionMarker.end.row = line || 0; - popup.session._emit("changeBackMarker"); - popup.moveCursorTo(line || 0, 0); - if (popup.isOpen) - popup._signal("select"); - } - }; - - popup.on("changeSelection", function() { - if (popup.isOpen) - popup.setRow(popup.selection.lead.row); - popup.renderer.scrollCursorIntoView(); - }); - - popup.hide = function() { - this.container.style.display = "none"; - this._signal("hide"); + }; + bgTokenizer.$updateOnChange = noop; + bgTokenizer.start = noop; + popup.session.$computeWidth = function () { + return this.screenWidth = 0; + }; popup.isOpen = false; - }; - popup.show = function(pos, lineHeight, topdownOnly) { - var el = this.container; - var screenHeight = window.innerHeight; - var screenWidth = window.innerWidth; - var renderer = this.renderer; - var maxH = renderer.$maxLines * lineHeight * 1.4; - var top = pos.top + this.$borderSize; - var allowTopdown = top > screenHeight / 2 && !topdownOnly; - if (allowTopdown && top + lineHeight + maxH > screenHeight) { - renderer.$maxPixelHeight = top - 2 * this.$borderSize; - el.style.top = ""; - el.style.bottom = screenHeight - top + "px"; - popup.isTopdown = false; - } else { - top += lineHeight; - renderer.$maxPixelHeight = screenHeight - top - 0.2 * lineHeight; - el.style.top = top + "px"; - el.style.bottom = ""; - popup.isTopdown = true; - } - - el.style.display = ""; - - var left = pos.left; - if (left + el.offsetWidth > screenWidth) - left = screenWidth - el.offsetWidth; - - el.style.left = left + "px"; - - this._signal("show"); - lastMouseEvent = null; - popup.isOpen = true; - }; - - popup.goTo = function(where) { - var row = this.getRow(); - var max = this.session.getLength() - 1; - - switch(where) { - case "up": row = row <= 0 ? max : row - 1; break; - case "down": row = row >= max ? -1 : row + 1; break; - case "start": row = 0; break; - case "end": row = max; break; - } - - this.setRow(row); - }; - - - popup.getTextLeftOffset = function() { - return this.$borderSize + this.renderer.$padding + this.$imageSize; - }; - - popup.$imageSize = 0; - popup.$borderSize = 1; - - return popup; -}; - -dom.importCssString("\ -.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ - background-color: #CAD6FA;\ - z-index: 1;\ -}\ -.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ - background-color: #3a674e;\ -}\ -.ace_editor.ace_autocomplete .ace_line-hover {\ - border: 1px solid #abbffe;\ - margin-top: -1px;\ - background: rgba(233,233,253,0.4);\ - position: absolute;\ - z-index: 2;\ -}\ -.ace_dark.ace_editor.ace_autocomplete .ace_line-hover {\ - border: 1px solid rgba(109, 150, 13, 0.8);\ - background: rgba(58, 103, 78, 0.62);\ -}\ -.ace_completion-meta {\ - opacity: 0.5;\ - margin: 0.9em;\ -}\ -.ace_completion-message {\ - color: blue;\ -}\ -.ace_editor.ace_autocomplete .ace_completion-highlight{\ - color: #2d69c7;\ -}\ -.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{\ - color: #93ca12;\ -}\ -.ace_editor.ace_autocomplete {\ - width: 300px;\ - z-index: 200000;\ - border: 1px lightgray solid;\ - position: fixed;\ - box-shadow: 2px 3px 5px rgba(0,0,0,.2);\ - line-height: 1.4;\ - background: #fefefe;\ - color: #111;\ -}\ -.ace_dark.ace_editor.ace_autocomplete {\ - border: 1px #484747 solid;\ - box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51);\ - line-height: 1.4;\ - background: #25282c;\ - color: #c1c1c1;\ -}", "autocompletion.css", false); - -exports.AcePopup = AcePopup; -exports.$singleLineEditor = $singleLineEditor; -}); - -define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module) { -"use strict"; - -exports.parForEach = function(array, fn, callback) { - var completed = 0; - var arLength = array.length; - if (arLength === 0) - callback(); - for (var i = 0; i < arLength; i++) { - fn(array[i], function(result, err) { - completed++; - if (completed === arLength) - callback(result, err); + popup.isTopdown = false; + popup.autoSelect = true; + popup.filterText = ""; + popup.isMouseOver = false; + popup.data = []; + popup.setData = function (list, filterText) { + popup.filterText = filterText || ""; + popup.setValue(lang.stringRepeat("\n", list.length), -1); + popup.data = list || []; + popup.setRow(0); + }; + popup.getData = function (row) { + return popup.data[row]; + }; + popup.getRow = function () { + return selectionMarker.start.row; + }; + popup.setRow = function (line) { + line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length - 1, line)); + if (selectionMarker.start.row != line) { + popup.selection.clearSelection(); + selectionMarker.start.row = selectionMarker.end.row = line || 0; + popup.session._emit("changeBackMarker"); + popup.moveCursorTo(line || 0, 0); + if (popup.isOpen) + popup._signal("select"); + } + }; + popup.on("changeSelection", function () { + if (popup.isOpen) + popup.setRow(popup.selection.lead.row); + popup.renderer.scrollCursorIntoView(); }); + popup.hide = function () { + this.container.style.display = "none"; + popup.anchorPos = null; + popup.anchor = null; + if (popup.isOpen) { + popup.isOpen = false; + this._signal("hide"); + } + }; + popup.tryShow = function (pos, lineHeight, anchor, forceShow) { + if (!forceShow && popup.isOpen && popup.anchorPos && popup.anchor && + popup.anchorPos.top === pos.top && popup.anchorPos.left === pos.left && + popup.anchor === anchor) { + return true; + } + var el = this.container; + var scrollBarSize = this.renderer.scrollBar.width || 10; + var screenHeight = window.innerHeight - scrollBarSize; + var screenWidth = window.innerWidth - scrollBarSize; + var renderer = this.renderer; + var maxH = renderer.$maxLines * lineHeight * 1.4; + var dims = { top: 0, bottom: 0, left: 0 }; + var spaceBelow = screenHeight - pos.top - 3 * this.$borderSize - lineHeight; + var spaceAbove = pos.top - 3 * this.$borderSize; + if (!anchor) { + if (spaceAbove <= spaceBelow || spaceBelow >= maxH) { + anchor = "bottom"; + } + else { + anchor = "top"; + } + } + if (anchor === "top") { + dims.bottom = pos.top - this.$borderSize; + dims.top = dims.bottom - maxH; + } + else if (anchor === "bottom") { + dims.top = pos.top + lineHeight + this.$borderSize; + dims.bottom = dims.top + maxH; + } + var fitsX = dims.top >= 0 && dims.bottom <= screenHeight; + if (!forceShow && !fitsX) { + return false; + } + if (!fitsX) { + if (anchor === "top") { + renderer.$maxPixelHeight = spaceAbove; + } + else { + renderer.$maxPixelHeight = spaceBelow; + } + } + else { + renderer.$maxPixelHeight = null; + } + if (anchor === "top") { + el.style.top = ""; + el.style.bottom = (screenHeight + scrollBarSize - dims.bottom) + "px"; + popup.isTopdown = false; + } + else { + el.style.top = dims.top + "px"; + el.style.bottom = ""; + popup.isTopdown = true; + } + el.style.display = ""; + var left = pos.left; + if (left + el.offsetWidth > screenWidth) + left = screenWidth - el.offsetWidth; + el.style.left = left + "px"; + el.style.right = ""; + dom.$fixPositionBug(el); + if (!popup.isOpen) { + popup.isOpen = true; + this._signal("show"); + lastMouseEvent = null; + } + popup.anchorPos = pos; + popup.anchor = anchor; + return true; + }; + popup.show = function (pos, lineHeight, topdownOnly) { + this.tryShow(pos, lineHeight, topdownOnly ? "bottom" : undefined, true); + }; + popup.goTo = function (where) { + var row = this.getRow(); + var max = this.session.getLength() - 1; + switch (where) { + case "up": + row = row <= 0 ? max : row - 1; + break; + case "down": + row = row >= max ? -1 : row + 1; + break; + case "start": + row = 0; + break; + case "end": + row = max; + break; + } + this.setRow(row); + }; + popup.getTextLeftOffset = function () { + return this.$borderSize + this.renderer.$padding + this.$imageSize; + }; + popup.$imageSize = 0; + popup.$borderSize = 1; + return popup; } -}; - -var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\u2000\u2070-\uFFFF]/; - -exports.retrievePrecedingIdentifier = function(text, pos, regex) { - regex = regex || ID_REGEX; - var buf = []; - for (var i = pos-1; i >= 0; i--) { - if (regex.test(text[i])) - buf.push(text[i]); - else - break; - } - return buf.reverse().join(""); -}; - -exports.retrieveFollowingIdentifier = function(text, pos, regex) { - regex = regex || ID_REGEX; - var buf = []; - for (var i = pos; i < text.length; i++) { - if (regex.test(text[i])) - buf.push(text[i]); - else - break; - } - return buf; -}; - -exports.getCompletionPrefix = function (editor) { - var pos = editor.getCursorPosition(); - var line = editor.session.getLine(pos.row); - var prefix; - editor.completers.forEach(function(completer) { - if (completer.identifierRegexps) { - completer.identifierRegexps.forEach(function(identifierRegex) { - if (!prefix && identifierRegex) - prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex); - }.bind(this)); - } - }.bind(this)); - return prefix || this.retrievePrecedingIdentifier(line, pos.column); -}; + return AcePopup; +}()); +dom.importCssString("\n.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\n background-color: #CAD6FA;\n z-index: 1;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\n background-color: #3a674e;\n}\n.ace_editor.ace_autocomplete .ace_line-hover {\n border: 1px solid #abbffe;\n margin-top: -1px;\n background: rgba(233,233,253,0.4);\n position: absolute;\n z-index: 2;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_line-hover {\n border: 1px solid rgba(109, 150, 13, 0.8);\n background: rgba(58, 103, 78, 0.62);\n}\n.ace_completion-meta {\n opacity: 0.5;\n margin-left: 0.9em;\n}\n.ace_completion-message {\n margin-left: 0.9em;\n color: blue;\n}\n.ace_editor.ace_autocomplete .ace_completion-highlight{\n color: #2d69c7;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{\n color: #93ca12;\n}\n.ace_editor.ace_autocomplete {\n width: 300px;\n z-index: 200000;\n border: 1px lightgray solid;\n position: fixed;\n box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n line-height: 1.4;\n background: #fefefe;\n color: #111;\n}\n.ace_dark.ace_editor.ace_autocomplete {\n border: 1px #484747 solid;\n box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51);\n line-height: 1.4;\n background: #25282c;\n color: #c1c1c1;\n}\n.ace_autocomplete .ace_text-layer {\n width: calc(100% - 8px);\n}\n.ace_autocomplete .ace_line {\n display: flex;\n align-items: center;\n}\n.ace_autocomplete .ace_line > * {\n min-width: 0;\n flex: 0 0 auto;\n}\n.ace_autocomplete .ace_line .ace_ {\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.ace_autocomplete .ace_completion-spacer {\n flex: 1;\n}\n.ace_autocomplete.ace_loading:after {\n content: \"\";\n position: absolute;\n top: 0px;\n height: 2px;\n width: 8%;\n background: blue;\n z-index: 100;\n animation: ace_progress 3s infinite linear;\n animation-delay: 300ms;\n transform: translateX(-100%) scaleX(1);\n}\n@keyframes ace_progress {\n 0% { transform: translateX(-100%) scaleX(1) }\n 50% { transform: translateX(625%) scaleX(2) } \n 100% { transform: translateX(1500%) scaleX(3) } \n}\n@media (prefers-reduced-motion) {\n .ace_autocomplete.ace_loading:after {\n transform: translateX(625%) scaleX(2);\n animation: none;\n }\n}\n", "autocompletion.css", false); +exports.AcePopup = AcePopup; +exports.$singleLineEditor = $singleLineEditor; +exports.getAriaId = getAriaId; }); -define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module) { -"use strict"; +define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module){"use strict"; var dom = require("./lib/dom"); var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; @@ -441,107 +373,100 @@ var RangeList = require("./range_list").RangeList; var HashHandler = require("./keyboard/hash_handler").HashHandler; var Tokenizer = require("./tokenizer").Tokenizer; var clipboard = require("./clipboard"); - var VARIABLES = { - CURRENT_WORD: function(editor) { + CURRENT_WORD: function (editor) { return editor.session.getTextRange(editor.session.getWordRange()); }, - SELECTION: function(editor, name, indentation) { + SELECTION: function (editor, name, indentation) { var text = editor.session.getTextRange(); if (indentation) return text.replace(/\n\r?([ \t]*\S)/g, "\n" + indentation + "$1"); return text; }, - CURRENT_LINE: function(editor) { + CURRENT_LINE: function (editor) { return editor.session.getLine(editor.getCursorPosition().row); }, - PREV_LINE: function(editor) { + PREV_LINE: function (editor) { return editor.session.getLine(editor.getCursorPosition().row - 1); }, - LINE_INDEX: function(editor) { + LINE_INDEX: function (editor) { return editor.getCursorPosition().row; }, - LINE_NUMBER: function(editor) { + LINE_NUMBER: function (editor) { return editor.getCursorPosition().row + 1; }, - SOFT_TABS: function(editor) { + SOFT_TABS: function (editor) { return editor.session.getUseSoftTabs() ? "YES" : "NO"; }, - TAB_SIZE: function(editor) { + TAB_SIZE: function (editor) { return editor.session.getTabSize(); }, - CLIPBOARD: function(editor) { + CLIPBOARD: function (editor) { return clipboard.getText && clipboard.getText(); }, - FILENAME: function(editor) { + FILENAME: function (editor) { return /[^/\\]*$/.exec(this.FILEPATH(editor))[0]; }, - FILENAME_BASE: function(editor) { + FILENAME_BASE: function (editor) { return /[^/\\]*$/.exec(this.FILEPATH(editor))[0].replace(/\.[^.]*$/, ""); }, - DIRECTORY: function(editor) { + DIRECTORY: function (editor) { return this.FILEPATH(editor).replace(/[^/\\]*$/, ""); }, - FILEPATH: function(editor) { return "/not implemented.txt"; }, - WORKSPACE_NAME: function() { return "Unknown"; }, - FULLNAME: function() { return "Unknown"; }, - BLOCK_COMMENT_START: function(editor) { + FILEPATH: function (editor) { return "/not implemented.txt"; }, + WORKSPACE_NAME: function () { return "Unknown"; }, + FULLNAME: function () { return "Unknown"; }, + BLOCK_COMMENT_START: function (editor) { var mode = editor.session.$mode || {}; return mode.blockComment && mode.blockComment.start || ""; }, - BLOCK_COMMENT_END: function(editor) { + BLOCK_COMMENT_END: function (editor) { var mode = editor.session.$mode || {}; return mode.blockComment && mode.blockComment.end || ""; }, - LINE_COMMENT: function(editor) { + LINE_COMMENT: function (editor) { var mode = editor.session.$mode || {}; return mode.lineCommentStart || ""; }, - CURRENT_YEAR: date.bind(null, {year: "numeric"}), - CURRENT_YEAR_SHORT: date.bind(null, {year: "2-digit"}), - CURRENT_MONTH: date.bind(null, {month: "numeric"}), - CURRENT_MONTH_NAME: date.bind(null, {month: "long"}), - CURRENT_MONTH_NAME_SHORT: date.bind(null, {month: "short"}), - CURRENT_DATE: date.bind(null, {day: "2-digit"}), - CURRENT_DAY_NAME: date.bind(null, {weekday: "long"}), - CURRENT_DAY_NAME_SHORT: date.bind(null, {weekday: "short"}), - CURRENT_HOUR: date.bind(null, {hour: "2-digit", hour12: false}), - CURRENT_MINUTE: date.bind(null, {minute: "2-digit"}), - CURRENT_SECOND: date.bind(null, {second: "2-digit"}) + CURRENT_YEAR: date.bind(null, { year: "numeric" }), + CURRENT_YEAR_SHORT: date.bind(null, { year: "2-digit" }), + CURRENT_MONTH: date.bind(null, { month: "numeric" }), + CURRENT_MONTH_NAME: date.bind(null, { month: "long" }), + CURRENT_MONTH_NAME_SHORT: date.bind(null, { month: "short" }), + CURRENT_DATE: date.bind(null, { day: "2-digit" }), + CURRENT_DAY_NAME: date.bind(null, { weekday: "long" }), + CURRENT_DAY_NAME_SHORT: date.bind(null, { weekday: "short" }), + CURRENT_HOUR: date.bind(null, { hour: "2-digit", hour12: false }), + CURRENT_MINUTE: date.bind(null, { minute: "2-digit" }), + CURRENT_SECOND: date.bind(null, { second: "2-digit" }) }; - VARIABLES.SELECTED_TEXT = VARIABLES.SELECTION; - function date(dateFormat) { var str = new Date().toLocaleString("en-us", dateFormat); return str.length == 1 ? "0" + str : str; } - -var SnippetManager = function() { - this.snippetMap = {}; - this.snippetNameMap = {}; -}; - -(function() { - oop.implement(this, EventEmitter); - - this.getTokenizer = function() { - return SnippetManager.$tokenizer || this.createTokenizer(); - }; - - this.createTokenizer = function() { +var SnippetManager = /** @class */ (function () { + function SnippetManager() { + this.snippetMap = {}; + this.snippetNameMap = {}; + this.variables = VARIABLES; + } + SnippetManager.prototype.getTokenizer = function () { + return SnippetManager["$tokenizer"] || this.createTokenizer(); + }; + SnippetManager.prototype.createTokenizer = function () { function TabstopToken(str) { str = str.substr(1); if (/^\d+$/.test(str)) - return [{tabstopId: parseInt(str, 10)}]; - return [{text: str}]; + return [{ tabstopId: parseInt(str, 10) }]; + return [{ text: str }]; } function escape(ch) { return "(?:[^\\\\" + ch + "]|\\\\.)"; } var formatMatcher = { - regex: "/(" + escape("/") + "+)/", - onMatch: function(val, state, stack) { + regex: "/(" + escape("/") + "+)/", + onMatch: function (val, state, stack) { var ts = stack[0]; ts.fmtString = true; ts.guard = val.slice(1, -1); @@ -550,118 +475,115 @@ var SnippetManager = function() { }, next: "formatString" }; - - SnippetManager.$tokenizer = new Tokenizer({ + SnippetManager["$tokenizer"] = new Tokenizer({ start: [ - {regex: /\\./, onMatch: function(val, state, stack) { - var ch = val[1]; - if (ch == "}" && stack.length) { - val = ch; - } else if ("`$\\".indexOf(ch) != -1) { - val = ch; - } - return [val]; - }}, - {regex: /}/, onMatch: function(val, state, stack) { - return [stack.length ? stack.shift() : val]; - }}, - {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, - {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { - var t = TabstopToken(str.substr(1)); - stack.unshift(t[0]); - return t; - }, next: "snippetVar"}, - {regex: /\n/, token: "newline", merge: false} + { regex: /\\./, onMatch: function (val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) { + val = ch; + } + else if ("`$\\".indexOf(ch) != -1) { + val = ch; + } + return [val]; + } }, + { regex: /}/, onMatch: function (val, state, stack) { + return [stack.length ? stack.shift() : val]; + } }, + { regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken }, + { regex: /\$\{[\dA-Z_a-z]+/, onMatch: function (str, state, stack) { + var t = TabstopToken(str.substr(1)); + stack.unshift(t[0]); + return t; + }, next: "snippetVar" }, + { regex: /\n/, token: "newline", merge: false } ], snippetVar: [ - {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { - var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function(operator) { - return operator.length == 2 ? operator[1] : "\x00"; - }).split("\x00").map(function(value){ - return {value: value}; - }); - stack[0].choices = choices; - return [choices[0]]; - }, next: "start"}, + { regex: "\\|" + escape("\\|") + "*\\|", onMatch: function (val, state, stack) { + var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function (operator) { + return operator.length == 2 ? operator[1] : "\x00"; + }).split("\x00").map(function (value) { + return { value: value }; + }); + stack[0].choices = choices; + return [choices[0]]; + }, next: "start" }, formatMatcher, - {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} + { regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start" } ], formatString: [ - {regex: /:/, onMatch: function(val, state, stack) { - if (stack.length && stack[0].expectElse) { - stack[0].expectElse = false; - stack[0].ifEnd = {elseEnd: stack[0]}; - return [stack[0].ifEnd]; - } - return ":"; - }}, - {regex: /\\./, onMatch: function(val, state, stack) { - var ch = val[1]; - if (ch == "}" && stack.length) - val = ch; - else if ("`$\\".indexOf(ch) != -1) - val = ch; - else if (ch == "n") - val = "\n"; - else if (ch == "t") - val = "\t"; - else if ("ulULE".indexOf(ch) != -1) - val = {changeCase: ch, local: ch > "a"}; - return [val]; - }}, - {regex: "/\\w*}", onMatch: function(val, state, stack) { - var next = stack.shift(); - if (next) - next.flag = val.slice(1, -1); - this.next = next && next.tabstopId ? "start" : ""; - return [next || val]; - }, next: "start"}, - {regex: /\$(?:\d+|\w+)/, onMatch: function(val, state, stack) { - return [{text: val.slice(1)}]; - }}, - {regex: /\${\w+/, onMatch: function(val, state, stack) { - var token = {text: val.slice(2)}; - stack.unshift(token); - return [token]; - }, next: "formatStringVar"}, - {regex: /\n/, token: "newline", merge: false}, - {regex: /}/, onMatch: function(val, state, stack) { - var next = stack.shift(); - this.next = next && next.tabstopId ? "start" : ""; - return [next || val]; - }, next: "start"} + { regex: /:/, onMatch: function (val, state, stack) { + if (stack.length && stack[0].expectElse) { + stack[0].expectElse = false; + stack[0].ifEnd = { elseEnd: stack[0] }; + return [stack[0].ifEnd]; + } + return ":"; + } }, + { regex: /\\./, onMatch: function (val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) + val = ch; + else if ("`$\\".indexOf(ch) != -1) + val = ch; + else if (ch == "n") + val = "\n"; + else if (ch == "t") + val = "\t"; + else if ("ulULE".indexOf(ch) != -1) + val = { changeCase: ch, local: ch > "a" }; + return [val]; + } }, + { regex: "/\\w*}", onMatch: function (val, state, stack) { + var next = stack.shift(); + if (next) + next.flag = val.slice(1, -1); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start" }, + { regex: /\$(?:\d+|\w+)/, onMatch: function (val, state, stack) { + return [{ text: val.slice(1) }]; + } }, + { regex: /\${\w+/, onMatch: function (val, state, stack) { + var token = { text: val.slice(2) }; + stack.unshift(token); + return [token]; + }, next: "formatStringVar" }, + { regex: /\n/, token: "newline", merge: false }, + { regex: /}/, onMatch: function (val, state, stack) { + var next = stack.shift(); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start" } ], formatStringVar: [ - {regex: /:\/\w+}/, onMatch: function(val, state, stack) { - var ts = stack[0]; - ts.formatFunction = val.slice(2, -1); - return [stack.shift()]; - }, next: "formatString"}, + { regex: /:\/\w+}/, onMatch: function (val, state, stack) { + var ts = stack[0]; + ts.formatFunction = val.slice(2, -1); + return [stack.shift()]; + }, next: "formatString" }, formatMatcher, - {regex: /:[\?\-+]?/, onMatch: function(val, state, stack) { - if (val[1] == "+") - stack[0].ifEnd = stack[0]; - if (val[1] == "?") - stack[0].expectElse = true; - }, next: "formatString"}, - {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString"} + { regex: /:[\?\-+]?/, onMatch: function (val, state, stack) { + if (val[1] == "+") + stack[0].ifEnd = stack[0]; + if (val[1] == "?") + stack[0].expectElse = true; + }, next: "formatString" }, + { regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString" } ] }); - return SnippetManager.$tokenizer; + return SnippetManager["$tokenizer"]; }; - - this.tokenizeTmSnippet = function(str, startState) { - return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { + SnippetManager.prototype.tokenizeTmSnippet = function (str, startState) { + return this.getTokenizer().getLineTokens(str, startState).tokens.map(function (x) { return x.value || x; }); }; - - this.getVariableValue = function(editor, name, indentation) { + SnippetManager.prototype.getVariableValue = function (editor, name, indentation) { if (/^\d+$/.test(name)) return (this.variables.__ || {})[name] || ""; if (/^[A-Z]\d+$/.test(name)) return (this.variables[name[0] + "__"] || {})[name.substr(1)] || ""; - name = name.replace(/^TM_/, ""); if (!this.variables.hasOwnProperty(name)) return ""; @@ -670,21 +592,20 @@ var SnippetManager = function() { value = this.variables[name](editor, name, indentation); return value == null ? "" : value; }; - - this.variables = VARIABLES; - this.tmStrFormat = function(str, ch, editor) { - if (!ch.fmt) return str; + SnippetManager.prototype.tmStrFormat = function (str, ch, editor) { + if (!ch.fmt) + return str; var flag = ch.flag || ""; var re = ch.guard; re = new RegExp(re, flag.replace(/[^gim]/g, "")); var fmtTokens = typeof ch.fmt == "string" ? this.tokenizeTmSnippet(ch.fmt, "formatString") : ch.fmt; var _self = this; - var formatted = str.replace(re, function() { + var formatted = str.replace(re, function () { var oldArgs = _self.variables.__; _self.variables.__ = [].slice.call(arguments); var fmtParts = _self.resolveVariables(fmtTokens, editor); var gChangeCase = "E"; - for (var i = 0; i < fmtParts.length; i++) { + for (var i = 0; i < fmtParts.length; i++) { var ch = fmtParts[i]; if (typeof ch == "object") { fmtParts[i] = ""; @@ -697,12 +618,15 @@ var SnippetManager = function() { fmtParts[i] = next[0].toLowerCase(); fmtParts[i + 1] = next.substr(1); } - } else if (ch.changeCase) { + } + else if (ch.changeCase) { gChangeCase = ch.changeCase; } - } else if (gChangeCase == "U") { + } + else if (gChangeCase == "U") { fmtParts[i] = ch.toUpperCase(); - } else if (gChangeCase == "L") { + } + else if (gChangeCase == "L") { fmtParts[i] = ch.toLowerCase(); } } @@ -711,16 +635,14 @@ var SnippetManager = function() { }); return formatted; }; - - this.tmFormatFunction = function(str, ch, editor) { + SnippetManager.prototype.tmFormatFunction = function (str, ch, editor) { if (ch.formatFunction == "upcase") return str.toUpperCase(); if (ch.formatFunction == "downcase") return str.toLowerCase(); return str; }; - - this.resolveVariables = function(snippet, editor) { + SnippetManager.prototype.resolveVariables = function (snippet, editor) { var result = []; var indentation = ""; var afterNewLine = true; @@ -738,34 +660,37 @@ var SnippetManager = function() { } continue; } - if (!ch) continue; + if (!ch) + continue; afterNewLine = false; - if (ch.fmtString) { var j = snippet.indexOf(ch, i + 1); - if (j == -1) j = snippet.length; + if (j == -1) + j = snippet.length; ch.fmt = snippet.slice(i + 1, j); i = j; } - if (ch.text) { var value = this.getVariableValue(editor, ch.text, indentation) + ""; if (ch.fmtString) value = this.tmStrFormat(value, ch, editor); if (ch.formatFunction) value = this.tmFormatFunction(value, ch, editor); - if (value && !ch.ifEnd) { result.push(value); gotoNext(ch); - } else if (!value && ch.ifEnd) { + } + else if (!value && ch.ifEnd) { gotoNext(ch.ifEnd); } - } else if (ch.elseEnd) { + } + else if (ch.elseEnd) { gotoNext(ch.elseEnd); - } else if (ch.tabstopId != null) { + } + else if (ch.tabstopId != null) { result.push(ch); - } else if (ch.changeCase != null) { + } + else if (ch.changeCase != null) { result.push(ch); } } @@ -776,142 +701,35 @@ var SnippetManager = function() { } return result; }; - - this.insertSnippetForSelection = function(editor, snippetText) { - var cursor = editor.getCursorPosition(); - var line = editor.session.getLine(cursor.row); - var tabString = editor.session.getTabString(); - var indentString = line.match(/^\s*/)[0]; - - if (cursor.column < indentString.length) - indentString = indentString.slice(0, cursor.column); - - snippetText = snippetText.replace(/\r/g, ""); - var tokens = this.tokenizeTmSnippet(snippetText); - tokens = this.resolveVariables(tokens, editor); - tokens = tokens.map(function(x) { - if (x == "\n") - return x + indentString; - if (typeof x == "string") - return x.replace(/\t/g, tabString); - return x; - }); - var tabstops = []; - tokens.forEach(function(p, i) { - if (typeof p != "object") - return; - var id = p.tabstopId; - var ts = tabstops[id]; - if (!ts) { - ts = tabstops[id] = []; - ts.index = id; - ts.value = ""; - ts.parents = {}; - } - if (ts.indexOf(p) !== -1) - return; - if (p.choices && !ts.choices) - ts.choices = p.choices; - ts.push(p); - var i1 = tokens.indexOf(p, i + 1); - if (i1 === -1) - return; - - var value = tokens.slice(i + 1, i1); - var isNested = value.some(function(t) {return typeof t === "object";}); - if (isNested && !ts.value) { - ts.value = value; - } else if (value.length && (!ts.value || typeof ts.value !== "string")) { - ts.value = value.join(""); - } - }); - tabstops.forEach(function(ts) {ts.length = 0;}); - var expanding = {}; - function copyValue(val) { - var copy = []; - for (var i = 0; i < val.length; i++) { - var p = val[i]; - if (typeof p == "object") { - if (expanding[p.tabstopId]) - continue; - var j = val.lastIndexOf(p, i - 1); - p = copy[j] || {tabstopId: p.tabstopId}; - } - copy[i] = p; - } - return copy; - } - for (var i = 0; i < tokens.length; i++) { - var p = tokens[i]; - if (typeof p != "object") - continue; - var id = p.tabstopId; - var ts = tabstops[id]; - var i1 = tokens.indexOf(p, i + 1); - if (expanding[id]) { - if (expanding[id] === p) { - delete expanding[id]; - Object.keys(expanding).forEach(function(parentId) { - ts.parents[parentId] = true; - }); - } - continue; - } - expanding[id] = p; - var value = ts.value; - if (typeof value !== "string") - value = copyValue(value); - else if (p.fmt) - value = this.tmStrFormat(value, p, editor); - tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); - - if (ts.indexOf(p) === -1) - ts.push(p); - } - var row = 0, column = 0; - var text = ""; - tokens.forEach(function(t) { - if (typeof t === "string") { - var lines = t.split("\n"); - if (lines.length > 1){ - column = lines[lines.length - 1].length; - row += lines.length - 1; - } else - column += t.length; - text += t; - } else if (t) { - if (!t.start) - t.start = {row: row, column: column}; - else - t.end = {row: row, column: column}; - } - }); + SnippetManager.prototype.getDisplayTextForSnippet = function (editor, snippetText) { + var processedSnippet = processSnippetText.call(this, editor, snippetText); + return processedSnippet.text; + }; + SnippetManager.prototype.insertSnippetForSelection = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } + var processedSnippet = processSnippetText.call(this, editor, snippetText, options); var range = editor.getSelectionRange(); - var end = editor.session.replace(range, text); - + var end = editor.session.replace(range, processedSnippet.text); var tabstopManager = new TabstopManager(editor); var selectionId = editor.inVirtualSelectionMode && editor.selection.index; - tabstopManager.addTabstops(tabstops, range.start, end, selectionId); + tabstopManager.addTabstops(processedSnippet.tabstops, range.start, end, selectionId); }; - - this.insertSnippet = function(editor, snippetText) { + SnippetManager.prototype.insertSnippet = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } var self = this; if (editor.inVirtualSelectionMode) - return self.insertSnippetForSelection(editor, snippetText); - - editor.forEachSelection(function() { - self.insertSnippetForSelection(editor, snippetText); - }, null, {keepOrder: true}); - + return self.insertSnippetForSelection(editor, snippetText, options); + editor.forEachSelection(function () { + self.insertSnippetForSelection(editor, snippetText, options); + }, null, { keepOrder: true }); if (editor.tabstopManager) editor.tabstopManager.tabNext(); }; - - this.$getScope = function(editor) { + SnippetManager.prototype.$getScope = function (editor) { var scope = editor.session.$mode.$id || ""; scope = scope.split("/").pop(); if (scope === "html" || scope === "php") { - if (scope === "php" && !editor.session.$mode.inlinePhp) + if (scope === "php" && !editor.session.$mode.inlinePhp) scope = "html"; var c = editor.getCursorPosition(); var state = editor.session.getState(c.row); @@ -927,11 +745,9 @@ var SnippetManager = function() { scope = "php"; } } - return scope; }; - - this.getActiveScopes = function(editor) { + SnippetManager.prototype.getActiveScopes = function (editor) { var scope = this.$getScope(editor); var scopes = [scope]; var snippetMap = this.snippetMap; @@ -941,26 +757,23 @@ var SnippetManager = function() { scopes.push("_"); return scopes; }; - - this.expandWithTab = function(editor, options) { + SnippetManager.prototype.expandWithTab = function (editor, options) { var self = this; - var result = editor.forEachSelection(function() { + var result = editor.forEachSelection(function () { return self.expandSnippetForSelection(editor, options); - }, null, {keepOrder: true}); + }, null, { keepOrder: true }); if (result && editor.tabstopManager) editor.tabstopManager.tabNext(); return result; }; - - this.expandSnippetForSelection = function(editor, options) { + SnippetManager.prototype.expandSnippetForSelection = function (editor, options) { var cursor = editor.getCursorPosition(); var line = editor.session.getLine(cursor.row); var before = line.substring(0, cursor.column); var after = line.substr(cursor.column); - var snippetMap = this.snippetMap; var snippet; - this.getActiveScopes(editor).some(function(scope) { + this.getActiveScopes(editor).some(function (scope) { var snippets = snippetMap[scope]; if (snippets) snippet = this.findMatchingSnippet(snippets, before, after); @@ -970,20 +783,14 @@ var SnippetManager = function() { return false; if (options && options.dryRun) return true; - editor.session.doc.removeInLine(cursor.row, - cursor.column - snippet.replaceBefore.length, - cursor.column + snippet.replaceAfter.length - ); - + editor.session.doc.removeInLine(cursor.row, cursor.column - snippet.replaceBefore.length, cursor.column + snippet.replaceAfter.length); this.variables.M__ = snippet.matchBefore; this.variables.T__ = snippet.matchAfter; this.insertSnippetForSelection(editor, snippet.content); - this.variables.M__ = this.variables.T__ = null; return true; }; - - this.findMatchingSnippet = function(snippetList, before, after) { + SnippetManager.prototype.findMatchingSnippet = function (snippetList, before, after) { for (var i = snippetList.length; i--;) { var s = snippetList[i]; if (s.startRe && !s.startRe.test(before)) @@ -992,7 +799,6 @@ var SnippetManager = function() { continue; if (!s.startRe && !s.endRe) continue; - s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; @@ -1000,21 +806,15 @@ var SnippetManager = function() { return s; } }; - - this.snippetMap = {}; - this.snippetNameMap = {}; - this.register = function(snippets, scope) { + SnippetManager.prototype.register = function (snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; var self = this; - - if (!snippets) + if (!snippets) snippets = []; - function wrapRegexp(src) { if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) src = "(?:" + src + ")"; - return src || ""; } function guardedRegexp(re, guard, opening) { @@ -1024,14 +824,14 @@ var SnippetManager = function() { re = guard + re; if (re && re[re.length - 1] != "$") re = re + "$"; - } else { + } + else { re = re + guard; if (re && re[0] != "^") re = "^" + re; } return new RegExp(re); } - function addSnippet(s) { if (!s.scope) s.scope = scope || "_"; @@ -1040,7 +840,6 @@ var SnippetManager = function() { snippetMap[scope] = []; snippetNameMap[scope] = {}; } - var map = snippetNameMap[scope]; if (s.name) { var old = map[s.name]; @@ -1049,48 +848,40 @@ var SnippetManager = function() { map[s.name] = s; } snippetMap[scope].push(s); - if (s.prefix) s.tabTrigger = s.prefix; - if (!s.content && s.body) s.content = Array.isArray(s.body) ? s.body.join("\n") : s.body; - if (s.tabTrigger && !s.trigger) { if (!s.guard && /^\w/.test(s.tabTrigger)) s.guard = "\\b"; s.trigger = lang.escapeRegExp(s.tabTrigger); } - if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard) return; - s.startRe = guardedRegexp(s.trigger, s.guard, true); s.triggerRe = new RegExp(s.trigger); - s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); s.endTriggerRe = new RegExp(s.endTrigger); } - if (Array.isArray(snippets)) { snippets.forEach(addSnippet); - } else { - Object.keys(snippets).forEach(function(key) { + } + else { + Object.keys(snippets).forEach(function (key) { addSnippet(snippets[key]); }); } - - this._signal("registerSnippets", {scope: scope}); + this._signal("registerSnippets", { scope: scope }); }; - this.unregister = function(snippets, scope) { + SnippetManager.prototype.unregister = function (snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; - function removeSnippet(s) { - var nameMap = snippetNameMap[s.scope||scope]; + var nameMap = snippetNameMap[s.scope || scope]; if (nameMap && nameMap[s.name]) { delete nameMap[s.name]; - var map = snippetMap[s.scope||scope]; + var map = snippetMap[s.scope || scope]; var i = map && map.indexOf(s); if (i >= 0) map.splice(i, 1); @@ -1101,9 +892,9 @@ var SnippetManager = function() { else if (Array.isArray(snippets)) snippets.forEach(removeSnippet); }; - this.parseSnippetFile = function(str) { + SnippetManager.prototype.parseSnippetFile = function (str) { str = str.replace(/\r/g, ""); - var list = [], snippet = {}; + var list = [], /**@type{Snippet}*/ snippet = {}; var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; var m; while (m = re.exec(str)) { @@ -1111,12 +902,15 @@ var SnippetManager = function() { try { snippet = JSON.parse(m[1]); list.push(snippet); - } catch (e) {} - } if (m[4]) { + } + catch (e) { } + } + if (m[4]) { snippet.content = m[4].replace(/^\t/gm, ""); list.push(snippet); snippet = {}; - } else { + } + else { var key = m[2], val = m[3]; if (key == "regex") { var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; @@ -1124,21 +918,23 @@ var SnippetManager = function() { snippet.trigger = guardRe.exec(val)[1]; snippet.endTrigger = guardRe.exec(val)[1]; snippet.endGuard = guardRe.exec(val)[1]; - } else if (key == "snippet") { + } + else if (key == "snippet") { snippet.tabTrigger = val.match(/^\S*/)[0]; if (!snippet.name) snippet.name = val; - } else if (key) { + } + else if (key) { snippet[key] = val; } } } return list; }; - this.getSnippetByName = function(name, editor) { + SnippetManager.prototype.getSnippetByName = function (name, editor) { var snippetMap = this.snippetNameMap; var snippet; - this.getActiveScopes(editor).some(function(scope) { + this.getActiveScopes(editor).some(function (scope) { var snippets = snippetMap[scope]; if (snippets) snippet = snippets[name]; @@ -1146,59 +942,172 @@ var SnippetManager = function() { }, this); return snippet; }; - -}).call(SnippetManager.prototype); - - -var TabstopManager = function(editor) { - if (editor.tabstopManager) - return editor.tabstopManager; - editor.tabstopManager = this; - this.$onChange = this.onChange.bind(this); - this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; - this.$onChangeSession = this.onChangeSession.bind(this); - this.$onAfterExec = this.onAfterExec.bind(this); - this.attach(editor); + return SnippetManager; +}()); +oop.implement(SnippetManager.prototype, EventEmitter); +var processSnippetText = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var tabString = editor.session.getTabString(); + var indentString = line.match(/^\s*/)[0]; + if (cursor.column < indentString.length) + indentString = indentString.slice(0, cursor.column); + snippetText = snippetText.replace(/\r/g, ""); + var tokens = this.tokenizeTmSnippet(snippetText); + tokens = this.resolveVariables(tokens, editor); + tokens = tokens.map(function (x) { + if (x == "\n" && !options.excludeExtraIndent) + return x + indentString; + if (typeof x == "string") + return x.replace(/\t/g, tabString); + return x; + }); + var tabstops = []; + tokens.forEach(function (p, i) { + if (typeof p != "object") + return; + var id = p.tabstopId; + var ts = tabstops[id]; + if (!ts) { + ts = tabstops[id] = []; + ts.index = id; + ts.value = ""; + ts.parents = {}; + } + if (ts.indexOf(p) !== -1) + return; + if (p.choices && !ts.choices) + ts.choices = p.choices; + ts.push(p); + var i1 = tokens.indexOf(p, i + 1); + if (i1 === -1) + return; + var value = tokens.slice(i + 1, i1); + var isNested = value.some(function (t) { return typeof t === "object"; }); + if (isNested && !ts.value) { + ts.value = value; + } + else if (value.length && (!ts.value || typeof ts.value !== "string")) { + ts.value = value.join(""); + } + }); + tabstops.forEach(function (ts) { ts.length = 0; }); + var expanding = {}; + function copyValue(val) { + var copy = []; + for (var i = 0; i < val.length; i++) { + var p = val[i]; + if (typeof p == "object") { + if (expanding[p.tabstopId]) + continue; + var j = val.lastIndexOf(p, i - 1); + p = copy[j] || { tabstopId: p.tabstopId }; + } + copy[i] = p; + } + return copy; + } + for (var i = 0; i < tokens.length; i++) { + var p = tokens[i]; + if (typeof p != "object") + continue; + var id = p.tabstopId; + var ts = tabstops[id]; + var i1 = tokens.indexOf(p, i + 1); + if (expanding[id]) { + if (expanding[id] === p) { + delete expanding[id]; + Object.keys(expanding).forEach(function (parentId) { + ts.parents[parentId] = true; + }); + } + continue; + } + expanding[id] = p; + var value = ts.value; + if (typeof value !== "string") + value = copyValue(value); + else if (p.fmt) + value = this.tmStrFormat(value, p, editor); + tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); + if (ts.indexOf(p) === -1) + ts.push(p); + } + var row = 0, column = 0; + var text = ""; + tokens.forEach(function (t) { + if (typeof t === "string") { + var lines = t.split("\n"); + if (lines.length > 1) { + column = lines[lines.length - 1].length; + row += lines.length - 1; + } + else + column += t.length; + text += t; + } + else if (t) { + if (!t.start) + t.start = { row: row, column: column }; + else + t.end = { row: row, column: column }; + } + }); + return { + text: text, + tabstops: tabstops, + tokens: tokens + }; }; -(function() { - this.attach = function(editor) { +var TabstopManager = /** @class */ (function () { + function TabstopManager(editor) { this.index = 0; this.ranges = []; this.tabstops = []; + if (editor.tabstopManager) + return editor.tabstopManager; + editor.tabstopManager = this; + this.$onChange = this.onChange.bind(this); + this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; + this.$onChangeSession = this.onChangeSession.bind(this); + this.$onAfterExec = this.onAfterExec.bind(this); + this.attach(editor); + } + TabstopManager.prototype.attach = function (editor) { this.$openTabstops = null; this.selectedTabstop = null; - this.editor = editor; + this.session = editor.session; this.editor.on("change", this.$onChange); this.editor.on("changeSelection", this.$onChangeSelection); this.editor.on("changeSession", this.$onChangeSession); this.editor.commands.on("afterExec", this.$onAfterExec); this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); }; - this.detach = function() { + TabstopManager.prototype.detach = function () { this.tabstops.forEach(this.removeTabstopMarkers, this); - this.ranges = null; - this.tabstops = null; + this.ranges.length = 0; + this.tabstops.length = 0; this.selectedTabstop = null; - this.editor.removeListener("change", this.$onChange); - this.editor.removeListener("changeSelection", this.$onChangeSelection); - this.editor.removeListener("changeSession", this.$onChangeSession); - this.editor.commands.removeListener("afterExec", this.$onAfterExec); + this.editor.off("change", this.$onChange); + this.editor.off("changeSelection", this.$onChangeSelection); + this.editor.off("changeSession", this.$onChangeSession); + this.editor.commands.off("afterExec", this.$onAfterExec); this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); this.editor.tabstopManager = null; + this.session = null; this.editor = null; }; - - this.onChange = function(delta) { + TabstopManager.prototype.onChange = function (delta) { var isRemove = delta.action[0] == "r"; var selectedTabstop = this.selectedTabstop || {}; var parents = selectedTabstop.parents || {}; - var tabstops = (this.tabstops || []).slice(); + var tabstops = this.tabstops.slice(); for (var i = 0; i < tabstops.length; i++) { var ts = tabstops[i]; var active = ts == selectedTabstop || parents[ts.index]; ts.rangeList.$bias = active ? 0 : 1; - if (delta.action == "remove" && ts !== selectedTabstop) { var parentActive = ts.parents && ts.parents[selectedTabstop.index]; var startIndex = ts.rangeList.pointIndex(delta.start, parentActive); @@ -1211,16 +1120,16 @@ var TabstopManager = function(editor) { } ts.rangeList.$onChange(delta); } - var session = this.editor.session; + var session = this.session; if (!this.$inChange && isRemove && session.getLength() == 1 && !session.getValue()) this.detach(); }; - this.updateLinkedFields = function() { + TabstopManager.prototype.updateLinkedFields = function () { var ts = this.selectedTabstop; if (!ts || !ts.hasLinkedRanges || !ts.firstNonLinked) return; this.$inChange = true; - var session = this.editor.session; + var session = this.session; var text = session.getTextRange(ts.firstNonLinked); for (var i = 0; i < ts.length; i++) { var range = ts[i]; @@ -1232,11 +1141,11 @@ var TabstopManager = function(editor) { } this.$inChange = false; }; - this.onAfterExec = function(e) { + TabstopManager.prototype.onAfterExec = function (e) { if (e.command && !e.command.readOnly) this.updateLinkedFields(); }; - this.onChangeSelection = function() { + TabstopManager.prototype.onChangeSelection = function () { if (!this.editor) return; var lead = this.editor.selection.lead; @@ -1252,20 +1161,22 @@ var TabstopManager = function(editor) { } this.detach(); }; - this.onChangeSession = function() { + TabstopManager.prototype.onChangeSession = function () { this.detach(); }; - this.tabNext = function(dir) { + TabstopManager.prototype.tabNext = function (dir) { var max = this.tabstops.length; var index = this.index + (dir || 1); index = Math.min(Math.max(index, 1), max); if (index == max) index = 0; this.selectTabstop(index); - if (index === 0) + this.updateTabstopMarkers(); + if (index === 0) { this.detach(); + } }; - this.selectTabstop = function(index) { + TabstopManager.prototype.selectTabstop = function (index) { this.$openTabstops = null; var ts = this.tabstops[this.index]; if (ts) @@ -1274,10 +1185,10 @@ var TabstopManager = function(editor) { ts = this.tabstops[this.index]; if (!ts || !ts.length) return; - this.selectedTabstop = ts; var range = ts.firstNonLinked || ts; - if (ts.choices) range.cursor = range.start; + if (ts.choices) + range.cursor = range.start; if (!this.editor.inVirtualSelectionMode) { var sel = this.editor.multiSelect; sel.toSingleRange(range); @@ -1286,17 +1197,16 @@ var TabstopManager = function(editor) { continue; sel.addRange(ts[i].clone(), true); } - } else { + } + else { this.editor.selection.fromOrientedRange(range); } - this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); if (this.selectedTabstop && this.selectedTabstop.choices) - this.editor.execCommand("startAutocomplete", {matches: this.selectedTabstop.choices}); + this.editor.execCommand("startAutocomplete", { matches: this.selectedTabstop.choices }); }; - this.addTabstops = function(tabstops, start, end) { + TabstopManager.prototype.addTabstops = function (tabstops, start, end) { var useLink = this.useLink || !this.editor.getOption("enableMultiselect"); - if (!this.$openTabstops) this.$openTabstops = []; if (!tabstops[0]) { @@ -1306,13 +1216,13 @@ var TabstopManager = function(editor) { tabstops[0] = [p]; tabstops[0].index = 0; } - var i = this.index; var arg = [i + 1, 0]; var ranges = this.ranges; - tabstops.forEach(function(ts, index) { + var snippetId = this.snippetId = (this.snippetId || 0) + 1; + tabstops.forEach(function (ts, index) { var dest = this.$openTabstops[index] || ts; - + dest.snippetId = snippetId; for (var i = 0; i < ts.length; i++) { var p = ts[i]; var range = Range.fromPoints(p.start, p.end || p.start); @@ -1328,7 +1238,8 @@ var TabstopManager = function(editor) { if (p.fmtString || (dest.firstNonLinked && useLink)) { range.linked = true; dest.hasLinkedRanges = true; - } else if (!dest.firstNonLinked) + } + else if (!dest.firstNonLinked) dest.firstNonLinked = range; } if (!dest.firstNonLinked) @@ -1342,36 +1253,51 @@ var TabstopManager = function(editor) { dest.rangeList.$bias = 0; dest.rangeList.addList(dest); }, this); - if (arg.length > 2) { if (this.tabstops.length) arg.push(arg.splice(2, 1)[0]); this.tabstops.splice.apply(this.tabstops, arg); } }; - - this.addTabstopMarkers = function(ts) { - var session = this.editor.session; - ts.forEach(function(range) { - if (!range.markerId) + TabstopManager.prototype.addTabstopMarkers = function (ts) { + var session = this.session; + ts.forEach(function (range) { + if (!range.markerId) range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); }); }; - this.removeTabstopMarkers = function(ts) { - var session = this.editor.session; - ts.forEach(function(range) { + TabstopManager.prototype.removeTabstopMarkers = function (ts) { + var session = this.session; + ts.forEach(function (range) { session.removeMarker(range.markerId); range.markerId = null; }); }; - this.removeRange = function(range) { + TabstopManager.prototype.updateTabstopMarkers = function () { + if (!this.selectedTabstop) + return; + var currentSnippetId = this.selectedTabstop.snippetId; + if (this.selectedTabstop.index === 0) { + currentSnippetId--; + } + this.tabstops.forEach(function (ts) { + if (ts.snippetId === currentSnippetId) + this.addTabstopMarkers(ts); + else + this.removeTabstopMarkers(ts); + }, this); + }; + TabstopManager.prototype.removeRange = function (range) { var i = range.tabstop.indexOf(range); - if (i != -1) range.tabstop.splice(i, 1); + if (i != -1) + range.tabstop.splice(i, 1); i = this.ranges.indexOf(range); - if (i != -1) this.ranges.splice(i, 1); + if (i != -1) + this.ranges.splice(i, 1); i = range.tabstop.rangeList.ranges.indexOf(range); - if (i != -1) range.tabstop.splice(i, 1); - this.editor.session.removeMarker(range.markerId); + if (i != -1) + range.tabstop.splice(i, 1); + this.session.removeMarker(range.markerId); if (!range.tabstop.length) { i = this.tabstops.indexOf(range.tabstop); if (i != -1) @@ -1380,167 +1306,499 @@ var TabstopManager = function(editor) { this.detach(); } }; - - this.keyboardHandler = new HashHandler(); - this.keyboardHandler.bindKeys({ - "Tab": function(editor) { - if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) - return; - editor.tabstopManager.tabNext(1); - editor.renderer.scrollCursorIntoView(); - }, - "Shift-Tab": function(editor) { - editor.tabstopManager.tabNext(-1); - editor.renderer.scrollCursorIntoView(); - }, - "Esc": function(editor) { - editor.tabstopManager.detach(); - } - }); -}).call(TabstopManager.prototype); - - - -var movePoint = function(point, diff) { + return TabstopManager; +}()); +TabstopManager.prototype.keyboardHandler = new HashHandler(); +TabstopManager.prototype.keyboardHandler.bindKeys({ + "Tab": function (editor) { + if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) + return; + editor.tabstopManager.tabNext(1); + editor.renderer.scrollCursorIntoView(); + }, + "Shift-Tab": function (editor) { + editor.tabstopManager.tabNext(-1); + editor.renderer.scrollCursorIntoView(); + }, + "Esc": function (editor) { + editor.tabstopManager.detach(); + } +}); +var movePoint = function (point, diff) { if (point.row == 0) point.column += diff.column; point.row += diff.row; }; - -var moveRelative = function(point, start) { +var moveRelative = function (point, start) { if (point.row == start.row) point.column -= start.column; point.row -= start.row; }; - - -dom.importCssString("\ -.ace_snippet-marker {\ - -moz-box-sizing: border-box;\ - box-sizing: border-box;\ - background: rgba(194, 193, 208, 0.09);\ - border: 1px dotted rgba(211, 208, 235, 0.62);\ - position: absolute;\ -}", "snippets.css", false); - +dom.importCssString("\n.ace_snippet-marker {\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n background: rgba(194, 193, 208, 0.09);\n border: 1px dotted rgba(211, 208, 235, 0.62);\n position: absolute;\n}", "snippets.css", false); exports.snippetManager = new SnippetManager(); - - var Editor = require("./editor").Editor; -(function() { - this.insertSnippet = function(content, options) { +(function () { + this.insertSnippet = function (content, options) { return exports.snippetManager.insertSnippet(this, content, options); }; - this.expandSnippet = function(options) { + this.expandSnippet = function (options) { return exports.snippetManager.expandWithTab(this, options); }; }).call(Editor.prototype); }); -define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/lang","ace/lib/dom","ace/snippets","ace/config"], function(require, exports, module) { -"use strict"; +define("ace/autocomplete/inline_screenreader",["require","exports","module"], function(require, exports, module){"use strict"; +var AceInlineScreenReader = /** @class */ (function () { + function AceInlineScreenReader(editor) { + this.editor = editor; + this.screenReaderDiv = document.createElement("div"); + this.screenReaderDiv.classList.add("ace_screenreader-only"); + this.editor.container.appendChild(this.screenReaderDiv); + } + AceInlineScreenReader.prototype.setScreenReaderContent = function (content) { + if (!this.popup && this.editor.completer && /**@type{import("../autocomplete").Autocomplete}*/ (this.editor.completer).popup) { + this.popup = /**@type{import("../autocomplete").Autocomplete}*/ (this.editor.completer).popup; + this.popup.renderer.on("afterRender", function () { + var row = this.popup.getRow(); + var t = this.popup.renderer.$textLayer; + var selected = t.element.childNodes[row - t.config.firstRow]; + if (selected) { + var idString = "doc-tooltip "; + for (var lineIndex = 0; lineIndex < this._lines.length; lineIndex++) { + idString += "ace-inline-screenreader-line-".concat(lineIndex, " "); + } + selected.setAttribute("aria-describedby", idString); + } + }.bind(this)); + } + while (this.screenReaderDiv.firstChild) { + this.screenReaderDiv.removeChild(this.screenReaderDiv.firstChild); + } + this._lines = content.split(/\r\n|\r|\n/); + var codeElement = this.createCodeBlock(); + this.screenReaderDiv.appendChild(codeElement); + }; + AceInlineScreenReader.prototype.destroy = function () { + this.screenReaderDiv.remove(); + }; + AceInlineScreenReader.prototype.createCodeBlock = function () { + var container = document.createElement("pre"); + container.setAttribute("id", "ace-inline-screenreader"); + for (var lineIndex = 0; lineIndex < this._lines.length; lineIndex++) { + var codeElement = document.createElement("code"); + codeElement.setAttribute("id", "ace-inline-screenreader-line-".concat(lineIndex)); + var line = document.createTextNode(this._lines[lineIndex]); + codeElement.appendChild(line); + container.appendChild(codeElement); + } + return container; + }; + return AceInlineScreenReader; +}()); +exports.AceInlineScreenReader = AceInlineScreenReader; + +}); + +define("ace/autocomplete/inline",["require","exports","module","ace/snippets","ace/autocomplete/inline_screenreader"], function(require, exports, module){"use strict"; +var snippetManager = require("../snippets").snippetManager; +var AceInlineScreenReader = require("./inline_screenreader").AceInlineScreenReader; +var AceInline = /** @class */ (function () { + function AceInline() { + this.editor = null; + } + AceInline.prototype.show = function (editor, completion, prefix) { + prefix = prefix || ""; + if (editor && this.editor && this.editor !== editor) { + this.hide(); + this.editor = null; + this.inlineScreenReader = null; + } + if (!editor || !completion) { + return false; + } + if (!this.inlineScreenReader) { + this.inlineScreenReader = new AceInlineScreenReader(editor); + } + var displayText = completion.snippet ? snippetManager.getDisplayTextForSnippet(editor, completion.snippet) : completion.value; + if (completion.hideInlinePreview || !displayText || !displayText.startsWith(prefix)) { + return false; + } + this.editor = editor; + this.inlineScreenReader.setScreenReaderContent(displayText); + displayText = displayText.slice(prefix.length); + if (displayText === "") { + editor.removeGhostText(); + } + else { + editor.setGhostText(displayText); + } + return true; + }; + AceInline.prototype.isOpen = function () { + if (!this.editor) { + return false; + } + return !!this.editor.renderer.$ghostText; + }; + AceInline.prototype.hide = function () { + if (!this.editor) { + return false; + } + this.editor.removeGhostText(); + return true; + }; + AceInline.prototype.destroy = function () { + this.hide(); + this.editor = null; + if (this.inlineScreenReader) { + this.inlineScreenReader.destroy(); + this.inlineScreenReader = null; + } + }; + return AceInline; +}()); +exports.AceInline = AceInline; + +}); + +define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module){"use strict"; +exports.parForEach = function (array, fn, callback) { + var completed = 0; + var arLength = array.length; + if (arLength === 0) + callback(); + for (var i = 0; i < arLength; i++) { + fn(array[i], function (result, err) { + completed++; + if (completed === arLength) + callback(result, err); + }); + } +}; +var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\u2000\u2070-\uFFFF]/; +exports.retrievePrecedingIdentifier = function (text, pos, regex) { + regex = regex || ID_REGEX; + var buf = []; + for (var i = pos - 1; i >= 0; i--) { + if (regex.test(text[i])) + buf.push(text[i]); + else + break; + } + return buf.reverse().join(""); +}; +exports.retrieveFollowingIdentifier = function (text, pos, regex) { + regex = regex || ID_REGEX; + var buf = []; + for (var i = pos; i < text.length; i++) { + if (regex.test(text[i])) + buf.push(text[i]); + else + break; + } + return buf; +}; +exports.getCompletionPrefix = function (editor) { + var pos = editor.getCursorPosition(); + var line = editor.session.getLine(pos.row); + var prefix; + editor.completers.forEach(function (completer) { + if (completer.identifierRegexps) { + completer.identifierRegexps.forEach(function (identifierRegex) { + if (!prefix && identifierRegex) + prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex); + }.bind(this)); + } + }.bind(this)); + return prefix || this.retrievePrecedingIdentifier(line, pos.column); +}; +exports.triggerAutocomplete = function (editor, previousChar) { + var previousChar = previousChar == null + ? editor.session.getPrecedingCharacter() + : previousChar; + return editor.completers.some(function (completer) { + if (completer.triggerCharacters && Array.isArray(completer.triggerCharacters)) { + return completer.triggerCharacters.includes(previousChar); + } + }); +}; + +}); +define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/inline","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/lang","ace/lib/dom","ace/snippets","ace/config","ace/lib/event","ace/lib/scroll"], function(require, exports, module){"use strict"; var HashHandler = require("./keyboard/hash_handler").HashHandler; var AcePopup = require("./autocomplete/popup").AcePopup; +var AceInline = require("./autocomplete/inline").AceInline; +var getAriaId = require("./autocomplete/popup").getAriaId; var util = require("./autocomplete/util"); var lang = require("./lib/lang"); var dom = require("./lib/dom"); var snippetManager = require("./snippets").snippetManager; var config = require("./config"); - -var Autocomplete = function() { - this.autoInsert = false; - this.autoSelect = true; - this.exactMatch = false; - this.gatherCompletionsId = 0; - this.keyboardHandler = new HashHandler(); - this.keyboardHandler.bindKeys(this.commands); - - this.blurListener = this.blurListener.bind(this); - this.changeListener = this.changeListener.bind(this); - this.mousedownListener = this.mousedownListener.bind(this); - this.mousewheelListener = this.mousewheelListener.bind(this); - - this.changeTimer = lang.delayedCall(function() { - this.updateCompletions(true); - }.bind(this)); - - this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50); +var event = require("./lib/event"); +var preventParentScroll = require("./lib/scroll").preventParentScroll; +var destroyCompleter = function (e, editor) { + editor.completer && editor.completer.destroy(); }; - -(function() { - - this.$init = function() { - this.popup = new AcePopup(document.body || document.documentElement); - this.popup.on("click", function(e) { +var Autocomplete = /** @class */ (function () { + function Autocomplete() { + this.autoInsert = false; + this.autoSelect = true; + this.autoShown = false; + this.exactMatch = false; + this.inlineEnabled = false; + this.keyboardHandler = new HashHandler(); + this.keyboardHandler.bindKeys(this.commands); + this.parentNode = null; + this.setSelectOnHover = false; + this.hasSeen = new Set(); + this.showLoadingState = false; + this.stickySelectionDelay = 500; + this.blurListener = this.blurListener.bind(this); + this.changeListener = this.changeListener.bind(this); + this.mousedownListener = this.mousedownListener.bind(this); + this.mousewheelListener = this.mousewheelListener.bind(this); + this.onLayoutChange = this.onLayoutChange.bind(this); + this.changeTimer = lang.delayedCall(function () { + this.updateCompletions(true); + }.bind(this)); + this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50); + this.popupTimer = lang.delayedCall(this.$updatePopupPosition.bind(this), 50); + this.stickySelectionTimer = lang.delayedCall(function () { + this.stickySelection = true; + }.bind(this), this.stickySelectionDelay); + this.$firstOpenTimer = lang.delayedCall(/**@this{Autocomplete}*/ function () { + var initialPosition = this.completionProvider && this.completionProvider.initialPosition; + if (this.autoShown || (this.popup && this.popup.isOpen) || !initialPosition || this.editor.completers.length === 0) + return; + this.completions = new FilteredList(Autocomplete.completionsForLoading); + this.openPopup(this.editor, initialPosition.prefix, false); + this.popup.renderer.setStyle("ace_loading", true); + }.bind(this), this.stickySelectionDelay); + } + Object.defineProperty(Autocomplete, "completionsForLoading", { + get: function () { + return [{ + caption: config.nls("autocomplete.loading", "Loading..."), + value: "" + }]; + }, + enumerable: false, + configurable: true + }); + Autocomplete.prototype.$init = function () { + this.popup = new AcePopup(this.parentNode || document.body || document.documentElement); + this.popup.on("click", function (e) { this.insertMatch(); e.stop(); }.bind(this)); this.popup.focus = this.editor.focus.bind(this.editor); - this.popup.on("show", this.tooltipTimer.bind(null, null)); - this.popup.on("select", this.tooltipTimer.bind(null, null)); + this.popup.on("show", this.$onPopupShow.bind(this)); + this.popup.on("hide", this.$onHidePopup.bind(this)); + this.popup.on("select", this.$onPopupChange.bind(this)); + event.addListener(this.popup.container, "mouseout", this.mouseOutListener.bind(this)); this.popup.on("changeHoverMarker", this.tooltipTimer.bind(null, null)); + this.popup.renderer.on("afterRender", this.$onPopupRender.bind(this)); return this.popup; }; - - this.getPopup = function() { + Autocomplete.prototype.$initInline = function () { + if (!this.inlineEnabled || this.inlineRenderer) + return; + this.inlineRenderer = new AceInline(); + return this.inlineRenderer; + }; + Autocomplete.prototype.getPopup = function () { return this.popup || this.$init(); }; - - this.openPopup = function(editor, prefix, keepPopupPosition) { + Autocomplete.prototype.$onHidePopup = function () { + if (this.inlineRenderer) { + this.inlineRenderer.hide(); + } + this.hideDocTooltip(); + this.stickySelectionTimer.cancel(); + this.popupTimer.cancel(); + this.stickySelection = false; + }; + Autocomplete.prototype.$seen = function (completion) { + if (!this.hasSeen.has(completion) && completion && completion.completer && completion.completer.onSeen && typeof completion.completer.onSeen === "function") { + completion.completer.onSeen(this.editor, completion); + this.hasSeen.add(completion); + } + }; + Autocomplete.prototype.$onPopupChange = function (hide) { + if (this.inlineRenderer && this.inlineEnabled) { + var completion = hide ? null : this.popup.getData(this.popup.getRow()); + this.$updateGhostText(completion); + if (this.popup.isMouseOver && this.setSelectOnHover) { + this.tooltipTimer.call(null, null); + return; + } + this.popupTimer.schedule(); + this.tooltipTimer.schedule(); + } + else { + this.popupTimer.call(null, null); + this.tooltipTimer.call(null, null); + } + }; + Autocomplete.prototype.$updateGhostText = function (completion) { + var row = this.base.row; + var column = this.base.column; + var cursorColumn = this.editor.getCursorPosition().column; + var prefix = this.editor.session.getLine(row).slice(column, cursorColumn); + if (!this.inlineRenderer.show(this.editor, completion, prefix)) { + this.inlineRenderer.hide(); + } + else { + this.$seen(completion); + } + }; + Autocomplete.prototype.$onPopupRender = function () { + var inlineEnabled = this.inlineRenderer && this.inlineEnabled; + if (this.completions && this.completions.filtered && this.completions.filtered.length > 0) { + for (var i = this.popup.getFirstVisibleRow(); i <= this.popup.getLastVisibleRow(); i++) { + var completion = this.popup.getData(i); + if (completion && (!inlineEnabled || completion.hideInlinePreview)) { + this.$seen(completion); + } + } + } + }; + Autocomplete.prototype.$onPopupShow = function (hide) { + this.$onPopupChange(hide); + this.stickySelection = false; + if (this.stickySelectionDelay >= 0) + this.stickySelectionTimer.schedule(this.stickySelectionDelay); + }; + Autocomplete.prototype.observeLayoutChanges = function () { + if (this.$elements || !this.editor) + return; + window.addEventListener("resize", this.onLayoutChange, { passive: true }); + window.addEventListener("wheel", this.mousewheelListener); + var el = this.editor.container.parentNode; + var elements = []; + while (el) { + elements.push(el); + el.addEventListener("scroll", this.onLayoutChange, { passive: true }); + el = el.parentNode; + } + this.$elements = elements; + }; + Autocomplete.prototype.unObserveLayoutChanges = function () { + var _this = this; + window.removeEventListener("resize", this.onLayoutChange, { passive: true }); + window.removeEventListener("wheel", this.mousewheelListener); + this.$elements && this.$elements.forEach(function (el) { + el.removeEventListener("scroll", _this.onLayoutChange, { passive: true }); + }); + this.$elements = null; + }; + Autocomplete.prototype.onLayoutChange = function () { + if (!this.popup.isOpen) + return this.unObserveLayoutChanges(); + this.$updatePopupPosition(); + this.updateDocTooltip(); + }; + Autocomplete.prototype.$updatePopupPosition = function () { + var editor = this.editor; + var renderer = editor.renderer; + var lineHeight = renderer.layerConfig.lineHeight; + var pos = renderer.$cursorLayer.getPixelPosition(this.base, true); + pos.left -= this.popup.getTextLeftOffset(); + var rect = editor.container.getBoundingClientRect(); + pos.top += rect.top - renderer.layerConfig.offset; + pos.left += rect.left - editor.renderer.scrollLeft; + pos.left += renderer.gutterWidth; + var posGhostText = { + top: pos.top, + left: pos.left + }; + if (renderer.$ghostText && renderer.$ghostTextWidget) { + if (this.base.row === renderer.$ghostText.position.row) { + posGhostText.top += renderer.$ghostTextWidget.el.offsetHeight; + } + } + var editorContainerBottom = editor.container.getBoundingClientRect().bottom - lineHeight; + var lowestPosition = editorContainerBottom < posGhostText.top ? + { top: editorContainerBottom, left: posGhostText.left } : + posGhostText; + if (this.popup.tryShow(lowestPosition, lineHeight, "bottom")) { + return; + } + if (this.popup.tryShow(pos, lineHeight, "top")) { + return; + } + this.popup.show(pos, lineHeight); + }; + Autocomplete.prototype.openPopup = function (editor, prefix, keepPopupPosition) { + this.$firstOpenTimer.cancel(); if (!this.popup) this.$init(); - + if (this.inlineEnabled && !this.inlineRenderer) + this.$initInline(); this.popup.autoSelect = this.autoSelect; - + this.popup.setSelectOnHover(this.setSelectOnHover); + var oldRow = this.popup.getRow(); + var previousSelectedItem = this.popup.data[oldRow]; this.popup.setData(this.completions.filtered, this.completions.filterText); - + if (this.editor.textInput.setAriaOptions) { + this.editor.textInput.setAriaOptions({ + activeDescendant: getAriaId(this.popup.getRow()), + inline: this.inlineEnabled + }); + } editor.keyBinding.addKeyboardHandler(this.keyboardHandler); - - var renderer = editor.renderer; - this.popup.setRow(this.autoSelect ? 0 : -1); + var newRow; + if (this.stickySelection) + newRow = this.popup.data.indexOf(previousSelectedItem); + if (!newRow || newRow === -1) + newRow = 0; + this.popup.setRow(this.autoSelect ? newRow : -1); + if (newRow === oldRow && previousSelectedItem !== this.completions.filtered[newRow]) + this.$onPopupChange(); + var inlineEnabled = this.inlineRenderer && this.inlineEnabled; + if (newRow === oldRow && inlineEnabled) { + var completion = this.popup.getData(this.popup.getRow()); + this.$updateGhostText(completion); + } if (!keepPopupPosition) { this.popup.setTheme(editor.getTheme()); this.popup.setFontSize(editor.getFontSize()); - - var lineHeight = renderer.layerConfig.lineHeight; - - var pos = renderer.$cursorLayer.getPixelPosition(this.base, true); - pos.left -= this.popup.getTextLeftOffset(); - - var rect = editor.container.getBoundingClientRect(); - pos.top += rect.top - renderer.layerConfig.offset; - pos.left += rect.left - editor.renderer.scrollLeft; - pos.left += renderer.gutterWidth; - - this.popup.show(pos, lineHeight); - } else if (keepPopupPosition && !prefix) { - this.detach(); + this.$updatePopupPosition(); + if (this.tooltipNode) { + this.updateDocTooltip(); + } } this.changeTimer.cancel(); + this.observeLayoutChanges(); }; - - this.detach = function() { - this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); - this.editor.off("changeSelection", this.changeListener); - this.editor.off("blur", this.blurListener); - this.editor.off("mousedown", this.mousedownListener); - this.editor.off("mousewheel", this.mousewheelListener); + Autocomplete.prototype.detach = function () { + if (this.editor) { + this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); + this.editor.off("changeSelection", this.changeListener); + this.editor.off("blur", this.blurListener); + this.editor.off("mousedown", this.mousedownListener); + this.editor.off("mousewheel", this.mousewheelListener); + } + this.$firstOpenTimer.cancel(); this.changeTimer.cancel(); this.hideDocTooltip(); - - this.gatherCompletionsId += 1; + if (this.completionProvider) { + this.completionProvider.detach(); + } if (this.popup && this.popup.isOpen) this.popup.hide(); - + if (this.popup && this.popup.renderer) { + this.popup.renderer.off("afterRender", this.$onPopupRender); + } if (this.base) this.base.detach(); this.activated = false; - this.completions = this.base = null; + this.completionProvider = this.completions = this.base = null; + this.unObserveLayoutChanges(); }; - - this.changeListener = function(e) { + Autocomplete.prototype.changeListener = function (e) { var cursor = this.editor.selection.lead; if (cursor.row != this.base.row || cursor.column < this.base.column) { this.detach(); @@ -1550,284 +1808,248 @@ var Autocomplete = function() { else this.detach(); }; - - this.blurListener = function(e) { + Autocomplete.prototype.blurListener = function (e) { var el = document.activeElement; - var text = this.editor.textInput.getElement(); - var fromTooltip = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget); - var container = this.popup && this.popup.container; - if (el != text && el.parentNode != container && !fromTooltip - && el != this.tooltipNode && e.relatedTarget != text - ) { - this.detach(); - } - }; - - this.mousedownListener = function(e) { - this.detach(); - }; - - this.mousewheelListener = function(e) { - this.detach(); - }; - - this.goTo = function(where) { - this.popup.goTo(where); - }; - - this.insertMatch = function(data, options) { - if (!data) - data = this.popup.getData(this.popup.getRow()); - if (!data) - return false; - - var completions = this.completions; - this.editor.startOperation({command: {name: "insertMatch"}}); - if (data.completer && data.completer.insertMatch) { - data.completer.insertMatch(this.editor, data); - } else { - if (!completions) - return false; - if (completions.filterText) { - var ranges = this.editor.selection.getAllRanges(); - for (var i = 0, range; range = ranges[i]; i++) { - range.start.column -= completions.filterText.length; - this.editor.session.remove(range); - } - } - if (data.snippet) - snippetManager.insertSnippet(this.editor, data.snippet); - else - this.editor.execCommand("insertstring", data.value || data); - } - if (this.completions == completions) - this.detach(); - this.editor.endOperation(); - }; - - - this.commands = { - "Up": function(editor) { editor.completer.goTo("up"); }, - "Down": function(editor) { editor.completer.goTo("down"); }, - "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); }, - "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); }, - - "Esc": function(editor) { editor.completer.detach(); }, - "Return": function(editor) { return editor.completer.insertMatch(); }, - "Shift-Return": function(editor) { editor.completer.insertMatch(null, {deleteSuffix: true}); }, - "Tab": function(editor) { - var result = editor.completer.insertMatch(); - if (!result && !editor.tabstopManager) - editor.completer.goTo("down"); - else - return result; - }, - - "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); }, - "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); } - }; - - this.gatherCompletions = function(editor, callback) { - var session = editor.getSession(); - var pos = editor.getCursorPosition(); - - var prefix = util.getCompletionPrefix(editor); - - this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length); - this.base.$insertRight = true; - - var matches = []; - var total = editor.completers.length; - editor.completers.forEach(function(completer, i) { - completer.getCompletions(editor, session, pos, prefix, function(err, results) { - if (!err && results) - matches = matches.concat(results); - callback(null, { - prefix: util.getCompletionPrefix(editor), - matches: matches, - finished: (--total === 0) - }); - }); - }); - return true; + var text = this.editor.textInput.getElement(); + var fromTooltip = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget); + var container = this.popup && this.popup.container; + if (el != text && el.parentNode != container && !fromTooltip + && el != this.tooltipNode && e.relatedTarget != text) { + this.detach(); + } }; - - this.showPopup = function(editor, options) { + Autocomplete.prototype.mousedownListener = function (e) { + this.detach(); + }; + Autocomplete.prototype.mousewheelListener = function (e) { + if (this.popup && !this.popup.isMouseOver) + this.detach(); + }; + Autocomplete.prototype.mouseOutListener = function (e) { + if (this.popup.isOpen) + this.$updatePopupPosition(); + }; + Autocomplete.prototype.goTo = function (where) { + this.popup.goTo(where); + }; + Autocomplete.prototype.insertMatch = function (data, options) { + if (!data) + data = this.popup.getData(this.popup.getRow()); + if (!data) + return false; + if (data.value === "") // Explicitly given nothing to insert, e.g. "No suggestion state" + return this.detach(); + var completions = this.completions; + var result = this.getCompletionProvider().insertMatch(this.editor, data, completions.filterText, options); + if (this.completions == completions) + this.detach(); + return result; + }; + Autocomplete.prototype.showPopup = function (editor, options) { if (this.editor) this.detach(); - this.activated = true; - this.editor = editor; if (editor.completer != this) { if (editor.completer) editor.completer.detach(); editor.completer = this; } - editor.on("changeSelection", this.changeListener); editor.on("blur", this.blurListener); editor.on("mousedown", this.mousedownListener); editor.on("mousewheel", this.mousewheelListener); - this.updateCompletions(false, options); }; - - this.updateCompletions = function(keepPopupPosition, options) { + Autocomplete.prototype.getCompletionProvider = function (initialPosition) { + if (!this.completionProvider) + this.completionProvider = new CompletionProvider(initialPosition); + return this.completionProvider; + }; + Autocomplete.prototype.gatherCompletions = function (editor, callback) { + return this.getCompletionProvider().gatherCompletions(editor, callback); + }; + Autocomplete.prototype.updateCompletions = function (keepPopupPosition, options) { if (keepPopupPosition && this.base && this.completions) { var pos = this.editor.getCursorPosition(); - var prefix = this.editor.session.getTextRange({start: this.base, end: pos}); + var prefix = this.editor.session.getTextRange({ start: this.base, end: pos }); if (prefix == this.completions.filterText) return; this.completions.setFilter(prefix); if (!this.completions.filtered.length) return this.detach(); if (this.completions.filtered.length == 1 - && this.completions.filtered[0].value == prefix - && !this.completions.filtered[0].snippet) + && this.completions.filtered[0].value == prefix + && !this.completions.filtered[0].snippet) return this.detach(); this.openPopup(this.editor, prefix, keepPopupPosition); return; } - if (options && options.matches) { var pos = this.editor.getSelectionRange().start; this.base = this.editor.session.doc.createAnchor(pos.row, pos.column); this.base.$insertRight = true; this.completions = new FilteredList(options.matches); + this.getCompletionProvider().completions = this.completions; return this.openPopup(this.editor, "", keepPopupPosition); } - var _id = this.gatherCompletionsId; - var detachIfFinished = function(results) { - if (!results.finished) return; - return this.detach(); - }.bind(this); - - var processResults = function(results) { - var prefix = results.prefix; - var matches = results.matches; - - this.completions = new FilteredList(matches); - - if (this.exactMatch) - this.completions.exactMatch = true; - - this.completions.setFilter(prefix); - var filtered = this.completions.filtered; - if (!filtered.length) - return detachIfFinished(results); - if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet) - return detachIfFinished(results); - if (this.autoInsert && filtered.length == 1 && results.finished) - return this.insertMatch(filtered[0]); - - this.openPopup(this.editor, prefix, keepPopupPosition); - }.bind(this); - - var isImmediate = true; - var immediateResults = null; - this.gatherCompletions(this.editor, function(err, results) { - var prefix = results.prefix; - var matches = results && results.matches; - - if (!matches || !matches.length) - return detachIfFinished(results); - if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId) - return; - if (isImmediate) { - immediateResults = results; - return; + var session = this.editor.getSession(); + var pos = this.editor.getCursorPosition(); + var prefix = util.getCompletionPrefix(this.editor); + this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length); + this.base.$insertRight = true; + var completionOptions = { + exactMatch: this.exactMatch, + ignoreCaption: this.ignoreCaption + }; + this.getCompletionProvider({ + prefix: prefix, + pos: pos + }).provideCompletions(this.editor, completionOptions, + function (err, completions, finished) { + var filtered = completions.filtered; + var prefix = util.getCompletionPrefix(this.editor); + this.$firstOpenTimer.cancel(); + if (finished) { + if (!filtered.length) { + var emptyMessage = !this.autoShown && this.emptyMessage; + if (typeof emptyMessage == "function") + emptyMessage = this.emptyMessage(prefix); + if (emptyMessage) { + var completionsForEmpty = [{ + caption: emptyMessage, + value: "" + } + ]; + this.completions = new FilteredList(completionsForEmpty); + this.openPopup(this.editor, prefix, keepPopupPosition); + this.popup.renderer.setStyle("ace_loading", false); + this.popup.renderer.setStyle("ace_empty-message", true); + return; + } + return this.detach(); + } + if (filtered.length == 1 && filtered[0].value == prefix + && !filtered[0].snippet) + return this.detach(); + if (this.autoInsert && !this.autoShown && filtered.length == 1) + return this.insertMatch(filtered[0]); } - - processResults(results); + this.completions = !finished && this.showLoadingState ? + new FilteredList(Autocomplete.completionsForLoading.concat(filtered), completions.filterText) : + completions; + this.openPopup(this.editor, prefix, keepPopupPosition); + this.popup.renderer.setStyle("ace_empty-message", false); + this.popup.renderer.setStyle("ace_loading", !finished); }.bind(this)); - - isImmediate = false; - if (immediateResults) { - var results = immediateResults; - immediateResults = null; - processResults(results); + if (this.showLoadingState && !this.autoShown && !(this.popup && this.popup.isOpen)) { + this.$firstOpenTimer.delay(this.stickySelectionDelay / 2); } }; - - this.cancelContextMenu = function() { + Autocomplete.prototype.cancelContextMenu = function () { this.editor.$mouseHandler.cancelContextMenu(); }; - - this.updateDocTooltip = function() { + Autocomplete.prototype.updateDocTooltip = function () { var popup = this.popup; - var all = popup.data; + var all = this.completions && this.completions.filtered; var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]); var doc = null; if (!selected || !this.editor || !this.popup.isOpen) return this.hideDocTooltip(); - this.editor.completers.some(function(completer) { - if (completer.getDocTooltip) + var completersLength = this.editor.completers.length; + for (var i = 0; i < completersLength; i++) { + var completer = this.editor.completers[i]; + if (completer.getDocTooltip && selected.completerId === completer.id) { doc = completer.getDocTooltip(selected); - return doc; - }); + break; + } + } if (!doc && typeof selected != "string") doc = selected; - if (typeof doc == "string") - doc = {docText: doc}; + doc = { docText: doc }; if (!doc || !(doc.docHTML || doc.docText)) return this.hideDocTooltip(); this.showDocTooltip(doc); }; - - this.showDocTooltip = function(item) { + Autocomplete.prototype.showDocTooltip = function (item) { if (!this.tooltipNode) { this.tooltipNode = dom.createElement("div"); - this.tooltipNode.className = "ace_tooltip ace_doc-tooltip"; - this.tooltipNode.style.margin = 0; + this.tooltipNode.style.margin = "0"; this.tooltipNode.style.pointerEvents = "auto"; + this.tooltipNode.style.overscrollBehavior = "contain"; this.tooltipNode.tabIndex = -1; this.tooltipNode.onblur = this.blurListener.bind(this); this.tooltipNode.onclick = this.onTooltipClick.bind(this); + this.tooltipNode.id = "doc-tooltip"; + this.tooltipNode.setAttribute("role", "tooltip"); + this.tooltipNode.addEventListener("wheel", preventParentScroll); } - + var theme = this.editor.renderer.theme; + this.tooltipNode.className = "ace_tooltip ace_doc-tooltip " + + (theme.isDark ? "ace_dark " : "") + (theme.cssClass || ""); var tooltipNode = this.tooltipNode; if (item.docHTML) { tooltipNode.innerHTML = item.docHTML; - } else if (item.docText) { + } + else if (item.docText) { tooltipNode.textContent = item.docText; } - if (!tooltipNode.parentNode) - document.body.appendChild(tooltipNode); + this.popup.container.appendChild(this.tooltipNode); var popup = this.popup; var rect = popup.container.getBoundingClientRect(); - tooltipNode.style.top = popup.container.style.top; - tooltipNode.style.bottom = popup.container.style.bottom; - - tooltipNode.style.display = "block"; - if (window.innerWidth - rect.right < 320) { - if (rect.left < 320) { - if(popup.isTopdown) { - tooltipNode.style.top = rect.bottom + "px"; - tooltipNode.style.left = rect.left + "px"; - tooltipNode.style.right = ""; - tooltipNode.style.bottom = ""; - } else { - tooltipNode.style.top = popup.container.offsetTop - tooltipNode.offsetHeight + "px"; - tooltipNode.style.left = rect.left + "px"; - tooltipNode.style.right = ""; - tooltipNode.style.bottom = ""; - } - } else { - tooltipNode.style.right = window.innerWidth - rect.left + "px"; - tooltipNode.style.left = ""; + var targetWidth = 400; + var targetHeight = 300; + var scrollBarSize = popup.renderer.scrollBar.width || 10; + var leftSize = rect.left; + var rightSize = window.innerWidth - rect.right - scrollBarSize; + var topSize = popup.isTopdown ? window.innerHeight - scrollBarSize - rect.bottom : rect.top; + var scores = [ + Math.min(rightSize / targetWidth, 1), + Math.min(leftSize / targetWidth, 1), + Math.min(topSize / targetHeight, 1) * 0.9, + ]; + var max = Math.max.apply(Math, scores); + var tooltipStyle = tooltipNode.style; + tooltipStyle.display = "block"; + if (max == scores[0] || scores[0] >= 1) { + tooltipStyle.left = (rect.right + 1) + "px"; + tooltipStyle.right = ""; + tooltipStyle.maxWidth = targetWidth * max + "px"; + tooltipStyle.top = rect.top + "px"; + tooltipStyle.bottom = ""; + tooltipStyle.maxHeight = Math.min(window.innerHeight - scrollBarSize - rect.top, targetHeight) + "px"; + } + else if (max == scores[1] || scores[1] >= 1) { + tooltipStyle.right = window.innerWidth - rect.left + "px"; + tooltipStyle.left = ""; + tooltipStyle.maxWidth = targetWidth * max + "px"; + tooltipStyle.top = rect.top + "px"; + tooltipStyle.bottom = ""; + tooltipStyle.maxHeight = Math.min(window.innerHeight - scrollBarSize - rect.top, targetHeight) + "px"; + } + else if (max == scores[2]) { + tooltipStyle.left = rect.left + "px"; + tooltipStyle.right = ""; + tooltipStyle.maxWidth = Math.min(targetWidth, window.innerWidth - rect.left) + "px"; + if (popup.isTopdown) { + tooltipStyle.top = rect.bottom + "px"; + tooltipStyle.bottom = ""; + tooltipStyle.maxHeight = Math.min(window.innerHeight - scrollBarSize - rect.bottom, targetHeight) + "px"; + } + else { + tooltipStyle.top = ""; + tooltipStyle.bottom = (window.innerHeight - rect.top) + "px"; + tooltipStyle.maxHeight = Math.min(rect.top, targetHeight) + "px"; } - } else { - tooltipNode.style.left = (rect.right + 1) + "px"; - tooltipNode.style.right = ""; } + dom.$fixPositionBug(tooltipNode); }; - - this.hideDocTooltip = function() { + Autocomplete.prototype.hideDocTooltip = function () { this.tooltipTimer.cancel(); - if (!this.tooltipNode) return; + if (!this.tooltipNode) + return; var el = this.tooltipNode; if (!this.editor.isFocused() && document.activeElement == el) this.editor.focus(); @@ -1835,8 +2057,7 @@ var Autocomplete = function() { if (el.parentNode) el.parentNode.removeChild(el); }; - - this.onTooltipClick = function(e) { + Autocomplete.prototype.onTooltipClick = function (e) { var a = e.target; while (a && a != this.tooltipNode) { if (a.nodeName == "A" && a.href) { @@ -1847,8 +2068,7 @@ var Autocomplete = function() { a = a.parentNode; } }; - - this.destroy = function() { + Autocomplete.prototype.destroy = function () { this.detach(); if (this.popup) { this.popup.destroy(); @@ -1856,92 +2076,260 @@ var Autocomplete = function() { if (el && el.parentNode) el.parentNode.removeChild(el); } - if (this.editor && this.editor.completer == this) - this.editor.completer == null; - this.popup = null; + if (this.editor && this.editor.completer == this) { + this.editor.off("destroy", destroyCompleter); + this.editor.completer = null; + } + this.inlineRenderer = this.popup = this.editor = null; }; - -}).call(Autocomplete.prototype); - - -Autocomplete.for = function(editor) { - if (editor.completer) { - return editor.completer; - } - if (config.get("sharedPopups")) { - if (!Autocomplete.$shared) - Autocomplete.$sharedInstance = new Autocomplete(); - editor.completer = Autocomplete.$sharedInstance; - } else { - editor.completer = new Autocomplete(); - editor.once("destroy", function(e, editor) { + Autocomplete.for = function (editor) { + if (editor.completer instanceof Autocomplete) { + return editor.completer; + } + if (editor.completer) { editor.completer.destroy(); - }); - } - return editor.completer; + editor.completer = null; + } + if (config.get("sharedPopups")) { + if (!Autocomplete["$sharedInstance"]) + Autocomplete["$sharedInstance"] = new Autocomplete(); + editor.completer = Autocomplete["$sharedInstance"]; + } + else { + editor.completer = new Autocomplete(); + editor.once("destroy", destroyCompleter); + } + return editor.completer; + }; + return Autocomplete; +}()); +Autocomplete.prototype.commands = { + "Up": function (editor) { editor.completer.goTo("up"); }, + "Down": function (editor) { editor.completer.goTo("down"); }, + "Ctrl-Up|Ctrl-Home": function (editor) { editor.completer.goTo("start"); }, + "Ctrl-Down|Ctrl-End": function (editor) { editor.completer.goTo("end"); }, + "Esc": function (editor) { editor.completer.detach(); }, + "Return": function (editor) { return editor.completer.insertMatch(); }, + "Shift-Return": function (editor) { editor.completer.insertMatch(null, { deleteSuffix: true }); }, + "Tab": function (editor) { + var result = editor.completer.insertMatch(); + if (!result && !editor.tabstopManager) + editor.completer.goTo("down"); + else + return result; + }, + "Backspace": function (editor) { + editor.execCommand("backspace"); + var prefix = util.getCompletionPrefix(editor); + if (!prefix && editor.completer) + editor.completer.detach(); + }, + "PageUp": function (editor) { editor.completer.popup.gotoPageUp(); }, + "PageDown": function (editor) { editor.completer.popup.gotoPageDown(); } }; - Autocomplete.startCommand = { name: "startAutocomplete", - exec: function(editor, options) { + exec: function (editor, options) { var completer = Autocomplete.for(editor); completer.autoInsert = false; completer.autoSelect = true; + completer.autoShown = false; completer.showPopup(editor, options); completer.cancelContextMenu(); }, bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space" }; - -var FilteredList = function(array, filterText) { - this.all = array; - this.filtered = array; - this.filterText = filterText || ""; - this.exactMatch = false; -}; -(function(){ - this.setFilter = function(str) { +var CompletionProvider = /** @class */ (function () { + function CompletionProvider(initialPosition) { + this.initialPosition = initialPosition; + this.active = true; + } + CompletionProvider.prototype.insertByIndex = function (editor, index, options) { + if (!this.completions || !this.completions.filtered) { + return false; + } + return this.insertMatch(editor, this.completions.filtered[index], options); + }; + CompletionProvider.prototype.insertMatch = function (editor, data, options) { + if (!data) + return false; + editor.startOperation({ command: { name: "insertMatch" } }); + if (data.completer && data.completer.insertMatch) { + data.completer.insertMatch(editor, data); + } + else { + if (!this.completions) + return false; + var replaceBefore = this.completions.filterText.length; + var replaceAfter = 0; + if (data.range && data.range.start.row === data.range.end.row) { + replaceBefore -= this.initialPosition.prefix.length; + replaceBefore += this.initialPosition.pos.column - data.range.start.column; + replaceAfter += data.range.end.column - this.initialPosition.pos.column; + } + if (replaceBefore || replaceAfter) { + var ranges; + if (editor.selection.getAllRanges) { + ranges = editor.selection.getAllRanges(); + } + else { + ranges = [editor.getSelectionRange()]; + } + for (var i = 0, range; range = ranges[i]; i++) { + range.start.column -= replaceBefore; + range.end.column += replaceAfter; + editor.session.remove(range); + } + } + if (data.snippet) { + snippetManager.insertSnippet(editor, data.snippet); + } + else { + this.$insertString(editor, data); + } + if (data.completer && data.completer.onInsert && typeof data.completer.onInsert == "function") { + data.completer.onInsert(editor, data); + } + if (data.command && data.command === "startAutocomplete") { + editor.execCommand(data.command); + } + } + editor.endOperation(); + return true; + }; + CompletionProvider.prototype.$insertString = function (editor, data) { + var text = data.value || data; + editor.execCommand("insertstring", text); + }; + CompletionProvider.prototype.gatherCompletions = function (editor, callback) { + var session = editor.getSession(); + var pos = editor.getCursorPosition(); + var prefix = util.getCompletionPrefix(editor); + var matches = []; + this.completers = editor.completers; + var total = editor.completers.length; + editor.completers.forEach(function (completer, i) { + completer.getCompletions(editor, session, pos, prefix, function (err, results) { + if (completer.hideInlinePreview) + results = results.map(function (result) { + return Object.assign(result, { hideInlinePreview: completer.hideInlinePreview }); + }); + if (!err && results) + matches = matches.concat(results); + callback(null, { + prefix: util.getCompletionPrefix(editor), + matches: matches, + finished: (--total === 0) + }); + }); + }); + return true; + }; + CompletionProvider.prototype.provideCompletions = function (editor, options, callback) { + var processResults = function (results) { + var prefix = results.prefix; + var matches = results.matches; + this.completions = new FilteredList(matches); + if (options.exactMatch) + this.completions.exactMatch = true; + if (options.ignoreCaption) + this.completions.ignoreCaption = true; + this.completions.setFilter(prefix); + if (results.finished || this.completions.filtered.length) + callback(null, this.completions, results.finished); + }.bind(this); + var isImmediate = true; + var immediateResults = null; + this.gatherCompletions(editor, function (err, results) { + if (!this.active) { + return; + } + if (err) { + callback(err, [], true); + this.detach(); + } + var prefix = results.prefix; + if (prefix.indexOf(results.prefix) !== 0) + return; + if (isImmediate) { + immediateResults = results; + return; + } + processResults(results); + }.bind(this)); + isImmediate = false; + if (immediateResults) { + var results = immediateResults; + immediateResults = null; + processResults(results); + } + }; + CompletionProvider.prototype.detach = function () { + this.active = false; + this.completers && this.completers.forEach(function (completer) { + if (typeof completer.cancel === "function") { + completer.cancel(); + } + }); + }; + return CompletionProvider; +}()); +var FilteredList = /** @class */ (function () { + function FilteredList(array, filterText) { + this.all = array; + this.filtered = array; + this.filterText = filterText || ""; + this.exactMatch = false; + this.ignoreCaption = false; + } + FilteredList.prototype.setFilter = function (str) { if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0) var matches = this.filtered; else var matches = this.all; - this.filterText = str; matches = this.filterCompletions(matches, this.filterText); - matches = matches.sort(function(a, b) { - return b.exactMatch - a.exactMatch || b.$score - a.$score + matches = matches.sort(function (a, b) { + return b.exactMatch - a.exactMatch || b.$score - a.$score || (a.caption || a.value).localeCompare(b.caption || b.value); }); var prev = null; - matches = matches.filter(function(item){ + matches = matches.filter(function (item) { var caption = item.snippet || item.caption || item.value; - if (caption === prev) return false; + if (caption === prev) + return false; prev = caption; return true; }); - this.filtered = matches; }; - this.filterCompletions = function(items, needle) { + FilteredList.prototype.filterCompletions = function (items, needle) { var results = []; var upper = needle.toUpperCase(); var lower = needle.toLowerCase(); loop: for (var i = 0, item; item = items[i]; i++) { - var caption = item.caption || item.value || item.snippet; - if (!caption) continue; + if (item.skipFilter) { + item.$score = item.score; + results.push(item); + continue; + } + var caption = (!this.ignoreCaption && item.caption) || item.value || item.snippet; + if (!caption) + continue; var lastIndex = -1; var matchMask = 0; var penalty = 0; var index, distance; - if (this.exactMatch) { if (needle !== caption.substr(0, needle.length)) continue loop; - } else { + } + else { var fullMatchIndex = caption.toLowerCase().indexOf(lower); if (fullMatchIndex > -1) { penalty = fullMatchIndex; - } else { + } + else { for (var j = 0; j < needle.length; j++) { var i1 = caption.indexOf(lower[j], lastIndex + 1); var i2 = caption.indexOf(upper[j], lastIndex + 1); @@ -1964,104 +2352,55 @@ var FilteredList = function(array, filterText) { item.$score = (item.score || 0) - penalty; results.push(item); } - var keywords = []; - for (var i=0, j=results.length; i=0;){ - if (!results[i]) continue - if (results[i].meta=='local' && keywords.indexOf(results[i].caption)!=-1){ - results.splice(i,1) - } - } - return results; }; -}).call(FilteredList.prototype); - + return FilteredList; +}()); exports.Autocomplete = Autocomplete; +exports.CompletionProvider = CompletionProvider; exports.FilteredList = FilteredList; }); -define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/ext/menu_tools/settings_menu.css",["require","exports","module"], function(require, exports, module){module.exports = "#ace_settingsmenu, #kbshortcutmenu {\n background-color: #F7F7F7;\n color: black;\n box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\n padding: 1em 0.5em 2em 1em;\n overflow: auto;\n position: absolute;\n margin: 0;\n bottom: 0;\n right: 0;\n top: 0;\n z-index: 9991;\n cursor: default;\n}\n\n.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\n box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\n background-color: rgba(255, 255, 255, 0.6);\n color: black;\n}\n\n.ace_optionsMenuEntry:hover {\n background-color: rgba(100, 100, 100, 0.1);\n transition: all 0.3s\n}\n\n.ace_closeButton {\n background: rgba(245, 146, 146, 0.5);\n border: 1px solid #F48A8A;\n border-radius: 50%;\n padding: 7px;\n position: absolute;\n right: -8px;\n top: -8px;\n z-index: 100000;\n}\n.ace_closeButton{\n background: rgba(245, 146, 146, 0.9);\n}\n.ace_optionsMenuKey {\n color: darkslateblue;\n font-weight: bold;\n}\n.ace_optionsMenuCommand {\n color: darkcyan;\n font-weight: normal;\n}\n.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\n vertical-align: middle;\n}\n\n.ace_optionsMenuEntry button[ace_selected_button=true] {\n background: #e7e7e7;\n box-shadow: 1px 0px 2px 0px #adadad inset;\n border-color: #adadad;\n}\n.ace_optionsMenuEntry button {\n background: white;\n border: 1px solid lightgray;\n margin: 0px;\n}\n.ace_optionsMenuEntry button:hover{\n background: #f0f0f0;\n}"; + +}); + +define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/ext/menu_tools/settings_menu.css"], function(require, exports, module){/** + * ## Overlay Page utility + * + * Provides modal overlay functionality for displaying editor extension interfaces. Creates a full-screen overlay with + * configurable backdrop behavior, keyboard navigation (ESC to close), and focus management. Used by various extensions + * to display menus, settings panels, and other interactive content over the editor interface. + * + * **Usage:** + * ```javascript + * var overlayPage = require('./overlay_page').overlayPage; + * var contentElement = document.createElement('div'); + * contentElement.innerHTML = '

Settings

'; + * + * var overlay = overlayPage(editor, contentElement, function() { + * console.log('Overlay closed'); + * }); + * ``` + * + * @module + */ 'use strict'; var dom = require("../../lib/dom"); -var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ -background-color: #F7F7F7;\ -color: black;\ -box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ -padding: 1em 0.5em 2em 1em;\ -overflow: auto;\ -position: absolute;\ -margin: 0;\ -bottom: 0;\ -right: 0;\ -top: 0;\ -z-index: 9991;\ -cursor: default;\ -}\ -.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ -box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ -background-color: rgba(255, 255, 255, 0.6);\ -color: black;\ -}\ -.ace_optionsMenuEntry:hover {\ -background-color: rgba(100, 100, 100, 0.1);\ -transition: all 0.3s\ -}\ -.ace_closeButton {\ -background: rgba(245, 146, 146, 0.5);\ -border: 1px solid #F48A8A;\ -border-radius: 50%;\ -padding: 7px;\ -position: absolute;\ -right: -8px;\ -top: -8px;\ -z-index: 100000;\ -}\ -.ace_closeButton{\ -background: rgba(245, 146, 146, 0.9);\ -}\ -.ace_optionsMenuKey {\ -color: darkslateblue;\ -font-weight: bold;\ -}\ -.ace_optionsMenuCommand {\ -color: darkcyan;\ -font-weight: normal;\ -}\ -.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\ -vertical-align: middle;\ -}\ -.ace_optionsMenuEntry button[ace_selected_button=true] {\ -background: #e7e7e7;\ -box-shadow: 1px 0px 2px 0px #adadad inset;\ -border-color: #adadad;\ -}\ -.ace_optionsMenuEntry button {\ -background: white;\ -border: 1px solid lightgray;\ -margin: 0px;\ -}\ -.ace_optionsMenuEntry button:hover{\ -background: #f0f0f0;\ -}"; +var cssText = require("./settings_menu.css"); dom.importCssString(cssText, "settings_menu.css", false); - module.exports.overlayPage = function overlayPage(editor, contentElement, callback) { var closer = document.createElement('div'); var ignoreFocusOut = false; - function documentEscListener(e) { if (e.keyCode === 27) { close(); } } - function close() { - if (!closer) return; + if (!closer) + return; document.removeEventListener('keydown', documentEscListener); closer.parentNode.removeChild(closer); if (editor) { @@ -2077,22 +2416,19 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba contentElement.style.pointerEvents = "auto"; } } - closer.style.cssText = 'margin: 0; padding: 0; ' + 'position: fixed; top:0; bottom:0; left:0; right:0;' + 'z-index: 9990; ' + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : ''); - closer.addEventListener('click', function(e) { + closer.addEventListener('click', function (e) { if (!ignoreFocusOut) { close(); } }); document.addEventListener('keydown', documentEscListener); - contentElement.addEventListener('click', function (e) { e.stopPropagation(); }); - closer.appendChild(contentElement); document.body.appendChild(closer); if (editor) { @@ -2106,9 +2442,17 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba }); -define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/modelist",["require","exports","module"], function(require, exports, module){/** + * ## File mode detection utility + * + * Provides automatic detection of editor syntax modes based on file paths and extensions. Maps file extensions to + * appropriate Ace Editor syntax highlighting modes for over 100 programming languages and file formats including + * JavaScript, TypeScript, HTML, CSS, Python, Java, C++, and many others. Supports complex extension patterns and + * provides fallback mechanisms for unknown file types. + * + * @module + */ "use strict"; - var modes = []; function getModeForPath(path) { var mode = modesByName.text; @@ -2121,203 +2465,225 @@ function getModeForPath(path) { } return mode; } - -var Mode = function(name, caption, extensions) { - this.name = name; - this.caption = caption; - this.mode = "ace/mode/" + name; - this.extensions = extensions; - var re; - if (/\^/.test(extensions)) { - re = extensions.replace(/\|(\^)?/g, function(a, b){ - return "$|" + (b ? "^" : "^.*\\."); - }) + "$"; - } else { - re = "^.*\\.(" + extensions + ")$"; +var Mode = /** @class */ (function () { + function Mode(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function (a, b) { + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } + else { + re = "\\.(" + extensions + ")$"; + } + this.extRe = new RegExp(re, "gi"); } - - this.extRe = new RegExp(re, "gi"); -}; - -Mode.prototype.supportsFile = function(filename) { - return filename.match(this.extRe); -}; + Mode.prototype.supportsFile = function (filename) { + return filename.match(this.extRe); + }; + return Mode; +}()); var supportedModes = { - ABAP: ["abap"], - ABC: ["abc"], - ActionScript:["as"], - ADA: ["ada|adb"], - Alda: ["alda"], + ABAP: ["abap"], + ABC: ["abc"], + ActionScript: ["as"], + ADA: ["ada|adb"], + Alda: ["alda"], Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], - Apex: ["apex|cls|trigger|tgr"], - AQL: ["aql"], - AsciiDoc: ["asciidoc|adoc"], - ASL: ["dsl|asl|asl.json"], - Assembly_x86:["asm|a"], - AutoHotKey: ["ahk"], - BatchFile: ["bat|cmd"], - C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], - C9Search: ["c9search_results"], - Cirru: ["cirru|cr"], - Clojure: ["clj|cljs"], - Cobol: ["CBL|COB"], - coffee: ["coffee|cf|cson|^Cakefile"], - ColdFusion: ["cfm"], - Crystal: ["cr"], - CSharp: ["cs"], + Apex: ["apex|cls|trigger|tgr"], + AQL: ["aql"], + AsciiDoc: ["asciidoc|adoc"], + ASL: ["dsl|asl|asl.json"], + Assembly_ARM32: ["s"], + Assembly_x86: ["asm|a"], + Astro: ["astro"], + AutoHotKey: ["ahk"], + Basic: ["bas|bak"], + BatchFile: ["bat|cmd"], + BibTeX: ["bib"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cedar: ["cedar"], + CedarSchema: ["cedarschema"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Clue: ["clue"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm|cfc"], + Crystal: ["cr"], + CSharp: ["cs"], Csound_Document: ["csd"], Csound_Orchestra: ["orc"], Csound_Score: ["sco"], - CSS: ["css"], - Curly: ["curly"], - D: ["d|di"], - Dart: ["dart"], - Diff: ["diff|patch"], - Dockerfile: ["^Dockerfile"], - Dot: ["dot"], - Drools: ["drl"], - Edifact: ["edi"], - Eiffel: ["e|ge"], - EJS: ["ejs"], - Elixir: ["ex|exs"], - Elm: ["elm"], - Erlang: ["erl|hrl"], - Forth: ["frt|fs|ldr|fth|4th"], - Fortran: ["f|f90"], - FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], - FSL: ["fsl"], - FTL: ["ftl"], - Gcode: ["gcode"], - Gherkin: ["feature"], - Gitignore: ["^.gitignore"], - Glsl: ["glsl|frag|vert"], - Gobstones: ["gbs"], - golang: ["go"], + CSS: ["css"], + CSV: ["csv"], + Curly: ["curly"], + Cuttlefish: ["conf"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Django: ["djt|html.djt|dj.html|djhtml"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Edifact: ["edi"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Flix: ["flix"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], + FSL: ["fsl"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], GraphQLSchema: ["gql"], - Groovy: ["groovy"], - HAML: ["haml"], - Handlebars: ["hbs|handlebars|tpl|mustache"], - Haskell: ["hs"], + GROQ: ["groq"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], Haskell_Cabal: ["cabal"], - haXe: ["hx"], - Hjson: ["hjson"], - HTML: ["html|htm|xhtml|vue|we|wpy"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml|we|wpy"], HTML_Elixir: ["eex|html.eex"], - HTML_Ruby: ["erb|rhtml|html.erb"], - INI: ["ini|conf|cfg|prefs"], - Io: ["io"], - Ion: ["ion"], - Jack: ["jack"], - Jade: ["jade|pug"], - Java: ["java"], - JavaScript: ["js|jsm|jsx|cjs|mjs"], - JSON: ["json"], - JSON5: ["json5"], - JSONiq: ["jq"], - JSP: ["jsp"], - JSSM: ["jssm|jssm_state"], - JSX: ["jsx"], - Julia: ["jl"], - Kotlin: ["kt|kts"], - LaTeX: ["tex|latex|ltx|bib"], - Latte: ["latte"], - LESS: ["less"], - Liquid: ["liquid"], - Lisp: ["lisp"], - LiveScript: ["ls"], - Log: ["log"], - LogiQL: ["logic|lql"], - LSL: ["lsl"], - Lua: ["lua"], - LuaPage: ["lp"], - Lucene: ["lucene"], - Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], - Markdown: ["md|markdown"], - Mask: ["mask"], - MATLAB: ["matlab"], - Maze: ["mz"], - MediaWiki: ["wiki|mediawiki"], - MEL: ["mel"], - MIPS: ["s|asm"], - MIXAL: ["mixal"], - MUSHCode: ["mc|mush"], - MySQL: ["mysql"], - Nginx: ["nginx|conf"], - Nim: ["nim"], - Nix: ["nix"], - NSIS: ["nsi|nsh"], - Nunjucks: ["nunjucks|nunjs|nj|njk"], - ObjectiveC: ["m|mm"], - OCaml: ["ml|mli"], - PartiQL: ["partiql|pql"], - Pascal: ["pas|p"], - Perl: ["pl|pm"], - pgSQL: ["pgsql"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Ion: ["ion"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|cjs|mjs"], + JEXL: ["jexl"], + JSON: ["json"], + JSON5: ["json5"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSSM: ["jssm|jssm_state"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + Latte: ["latte"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + LogiQL: ["logic|lql"], + Logtalk: ["lgt"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MediaWiki: ["wiki|mediawiki"], + MEL: ["mel"], + MIPS: ["s|asm"], + MIXAL: ["mixal"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Mariadb: ["mariadb"], + Nasal: ["nas"], + Nginx: ["nginx|conf"], + Nim: ["nim"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + Nunjucks: ["nunjucks|nunjs|nj|njk"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + Odin: ["odin"], + PartiQL: ["partiql|pql"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], PHP_Laravel_blade: ["blade.php"], - PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], - Pig: ["pig"], - Powershell: ["ps1"], - Praat: ["praat|praatscript|psc|proc"], - Prisma: ["prisma"], - Prolog: ["plg|prolog"], - Properties: ["properties"], - Protobuf: ["proto"], - Puppet: ["epp|pp"], - Python: ["py"], - QML: ["qml"], - R: ["r"], - Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], - Razor: ["cshtml|asp"], - RDoc: ["Rd"], - Red: ["red|reds"], - RHTML: ["Rhtml"], - Robot: ["robot|resource"], - RST: ["rst"], - Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], - Rust: ["rs"], - SaC: ["sac"], - SASS: ["sass"], - SCAD: ["scad"], - Scala: ["scala|sbt"], - Scheme: ["scm|sm|rkt|oak|scheme"], - Scrypt: ["scrypt"], - SCSS: ["scss"], - SH: ["sh|bash|^.bashrc"], - SJS: ["sjs"], - Slim: ["slim|skim"], - Smarty: ["smarty|tpl"], - Smithy: ["smithy"], - snippets: ["snippets"], - Soy_Template:["soy"], - Space: ["space"], - SQL: ["sql"], - SQLServer: ["sqlserver"], - Stylus: ["styl|stylus"], - SVG: ["svg"], - Swift: ["swift"], - Tcl: ["tcl"], - Terraform: ["tf", "tfvars", "terragrunt"], - Tex: ["tex"], - Text: ["txt"], - Textile: ["textile"], - Toml: ["toml"], - TSX: ["tsx"], - Twig: ["twig|swig"], - Typescript: ["ts|typescript|str"], - Vala: ["vala"], - VBScript: ["vbs|vb"], - Velocity: ["vm"], - Verilog: ["v|vh|sv|svh"], - VHDL: ["vhd|vhdl"], + Pig: ["pig"], + PLSQL: ["plsql"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prisma: ["prisma"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + PRQL: ["prql"], + Puppet: ["epp|pp"], + Python: ["py"], + QML: ["qml"], + R: ["r"], + Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + Red: ["red|reds"], + RHTML: ["Rhtml"], + Robot: ["robot|resource"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SaC: ["sac"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala|sbt"], + Scheme: ["scm|sm|rkt|oak|scheme"], + Scrypt: ["scrypt"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Slim: ["slim|skim"], + Smarty: ["smarty|tpl"], + Smithy: ["smithy"], + snippets: ["snippets"], + Soy_Template: ["soy"], + Space: ["space"], + SPARQL: ["rq"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Terraform: ["tf", "tfvars", "terragrunt"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSV: ["tsv"], + TSX: ["tsx"], + Turtle: ["ttl"], + Twig: ["twig|swig"], + Typescript: ["ts|mts|cts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], Visualforce: ["vfp|component|page"], - Wollok: ["wlk|wpgm|wtest"], - XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], - XQuery: ["xq"], - YAML: ["yaml|yml"], - Zeek: ["zeek|bro"], - Django: ["html"] + Vue: ["vue"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Zeek: ["zeek|bro"], + Zig: ["zig"] }; - var nameOverrides = { ObjectiveC: "Objective-C", CSharp: "C#", @@ -2334,7 +2700,6 @@ var nameOverrides = { Perl6: "Perl 6", AutoHotKey: "AutoHotkey / AutoIt" }; - var modesByName = {}; for (var name in supportedModes) { var data = supportedModes[name]; @@ -2344,22 +2709,45 @@ for (var name in supportedModes) { modesByName[filename] = mode; modes.push(mode); } - -module.exports = { - getModeForPath: getModeForPath, - modes: modes, - modesByName: modesByName -}; +exports.getModeForPath = getModeForPath; +exports.modes = modes; +exports.modesByName = modesByName; }); -define("ace/ext/prompt",["require","exports","module","ace/range","ace/lib/dom","ace/ext/menu_tools/get_editor_keyboard_shortcuts","ace/autocomplete","ace/autocomplete/popup","ace/autocomplete/popup","ace/undomanager","ace/tokenizer","ace/ext/menu_tools/overlay_page","ace/ext/modelist"], function(require, exports, module) { +define("ace/ext/prompt",["require","exports","module","ace/config","ace/range","ace/lib/dom","ace/autocomplete","ace/autocomplete/popup","ace/autocomplete/popup","ace/undomanager","ace/tokenizer","ace/ext/menu_tools/overlay_page","ace/ext/modelist"], function(require, exports, module){/** + * ## User Input Prompt extension + * + * Provides customizable modal prompts for gathering user input with support for autocompletion, validation, and + * specialized input types. Includes built-in prompt types for navigation (goto line), command palette, and mode + * selection, with extensible architecture for custom prompt implementations. + * + * **Built-in Prompt Types:** + * - `gotoLine`: Navigate to specific line numbers with selection support + * - `commands`: Command palette with searchable editor commands and shortcuts + * - `modes`: Language mode selector with filtering capabilities + * + * **Usage:** + * ```javascript + * // Basic prompt + * prompt(editor, "Default value", { + * placeholder: "Enter text...", + * onAccept: (data) => console.log(data.value) + * }); + * + * // Built-in prompts + * prompt.gotoLine(editor); + * prompt.commands(editor); + * prompt.modes(editor); + * ``` + * + * @module + */ "use strict"; - +var nls = require("../config").nls; var Range = require("../range").Range; var dom = require("../lib/dom"); -var shortcuts = require("../ext/menu_tools/get_editor_keyboard_shortcuts"); -var FilteredList= require("../autocomplete").FilteredList; +var FilteredList = require("../autocomplete").FilteredList; var AcePopup = require('../autocomplete/popup').AcePopup; var $singleLineEditor = require('../autocomplete/popup').$singleLineEditor; var UndoManager = require("../undomanager").UndoManager; @@ -2367,7 +2755,6 @@ var Tokenizer = require("../tokenizer").Tokenizer; var overlayPage = require("./menu_tools/overlay_page").overlayPage; var modelist = require("./modelist"); var openPrompt; - function prompt(editor, message, options, callback) { if (typeof message == "object") { return prompt(editor, "", message, options); @@ -2380,15 +2767,12 @@ function prompt(editor, message, options, callback) { return; } if (options.$type) - return prompt[options.$type](editor, callback); - + return prompt[options.$type](editor, callback); var cmdLine = $singleLineEditor(); cmdLine.session.setUndoManager(new UndoManager()); - - var el = dom.buildDom(["div", {class: "ace_prompt_container" + (options.hasDescription ? " input-box-with-description" : "")}]); + var el = dom.buildDom(["div", { class: "ace_prompt_container" + (options.hasDescription ? " input-box-with-description" : "") }]); var overlay = overlayPage(editor, el, done); el.appendChild(cmdLine.container); - if (editor) { editor.cmdLine = cmdLine; cmdLine.setOption("fontSize", editor.getOption("fontSize")); @@ -2402,7 +2786,6 @@ function prompt(editor, message, options, callback) { end: cmdLine.session.doc.indexToPosition(options.selection[1]) }); } - if (options.getCompletions) { var popup = new AcePopup(); popup.renderer.setStyle("ace_autocomplete_inline"); @@ -2414,10 +2797,10 @@ function prompt(editor, message, options, callback) { popup.autoSelect = false; popup.renderer.$maxLines = 15; popup.setRow(-1); - popup.on("click", function(e) { + popup.on("click", function (e) { var data = popup.getData(popup.getRow()); - if (!data.error) { - cmdLine.setValue(data.value || data.name || data); + if (!data["error"]) { + cmdLine.setValue(data.value || data["name"] || data); accept(); e.stop(); } @@ -2425,33 +2808,29 @@ function prompt(editor, message, options, callback) { el.appendChild(popup.container); updateCompletions(); } - if (options.$rules) { var tokenizer = new Tokenizer(options.$rules); cmdLine.session.bgTokenizer.setTokenizer(tokenizer); } - if (options.placeholder) { cmdLine.setOption("placeholder", options.placeholder); } - if (options.hasDescription) { - var promptTextContainer = dom.buildDom(["div", {class: "ace_prompt_text_container"}]); + var promptTextContainer = dom.buildDom(["div", { class: "ace_prompt_text_container" }]); dom.buildDom(options.prompt || "Press 'Enter' to confirm or 'Escape' to cancel", promptTextContainer); el.appendChild(promptTextContainer); } - overlay.setIgnoreFocusOut(options.ignoreFocusOut); - function accept() { var val; if (popup && popup.getCursorPosition().row > 0) { val = valueFromRecentList(); - } else { + } + else { val = cmdLine.getValue(); } var curData = popup ? popup.getData(popup.getRow()) : val; - if (curData && !curData.error) { + if (curData && !curData["error"]) { done(); options.onAccept && options.onAccept({ value: val, @@ -2459,116 +2838,105 @@ function prompt(editor, message, options, callback) { }, cmdLine); } } - var keys = { "Enter": accept, - "Esc|Shift-Esc": function() { + "Esc|Shift-Esc": function () { options.onCancel && options.onCancel(cmdLine.getValue(), cmdLine); done(); } }; - if (popup) { Object.assign(keys, { - "Up": function(editor) { popup.goTo("up"); valueFromRecentList();}, - "Down": function(editor) { popup.goTo("down"); valueFromRecentList();}, - "Ctrl-Up|Ctrl-Home": function(editor) { popup.goTo("start"); valueFromRecentList();}, - "Ctrl-Down|Ctrl-End": function(editor) { popup.goTo("end"); valueFromRecentList();}, - "Tab": function(editor) { - popup.goTo("down"); valueFromRecentList(); + "Up": function (editor) { popup.goTo("up"); valueFromRecentList(); }, + "Down": function (editor) { popup.goTo("down"); valueFromRecentList(); }, + "Ctrl-Up|Ctrl-Home": function (editor) { popup.goTo("start"); valueFromRecentList(); }, + "Ctrl-Down|Ctrl-End": function (editor) { popup.goTo("end"); valueFromRecentList(); }, + "Tab": function (editor) { + popup.goTo("down"); + valueFromRecentList(); }, - "PageUp": function(editor) { popup.gotoPageUp(); valueFromRecentList();}, - "PageDown": function(editor) { popup.gotoPageDown(); valueFromRecentList();} + "PageUp": function (editor) { popup.gotoPageUp(); valueFromRecentList(); }, + "PageDown": function (editor) { popup.gotoPageDown(); valueFromRecentList(); } }); } - cmdLine.commands.bindKeys(keys); - function done() { overlay.close(); callback && callback(); openPrompt = null; } - - cmdLine.on("input", function() { + cmdLine.on("input", function () { options.onInput && options.onInput(); updateCompletions(); }); - function updateCompletions() { if (options.getCompletions) { var prefix; if (options.getPrefix) { prefix = options.getPrefix(cmdLine); } - var completions = options.getCompletions(cmdLine); popup.setData(completions, prefix); popup.resize(true); } } - function valueFromRecentList() { var current = popup.getData(popup.getRow()); - if (current && !current.error) + if (current && !current["error"]) return current.value || current.caption || current; } - cmdLine.resize(true); if (popup) { popup.resize(true); } cmdLine.focus(); - openPrompt = { close: done, name: options.name, editor: editor }; } - -prompt.gotoLine = function(editor, callback) { +prompt.gotoLine = function (editor, callback) { function stringifySelection(selection) { if (!Array.isArray(selection)) selection = [selection]; - return selection.map(function(r) { - var cursor = r.isBackwards ? r.start: r.end; - var anchor = r.isBackwards ? r.end: r.start; + return selection.map(function (r) { + var cursor = r.isBackwards ? r.start : r.end; + var anchor = r.isBackwards ? r.end : r.start; var row = anchor.row; var s = (row + 1) + ":" + anchor.column; - if (anchor.row == cursor.row) { if (anchor.column != cursor.column) s += ">" + ":" + cursor.column; - } else { + } + else { s += ">" + (cursor.row + 1) + ":" + cursor.column; } return s; }).reverse().join(", "); } - prompt(editor, ":" + stringifySelection(editor.selection.toJSON()), { name: "gotoLine", selection: [1, Number.MAX_VALUE], - onAccept: function(data) { + onAccept: function (data) { var value = data.value; - var _history = prompt.gotoLine._history; + var _history = prompt.gotoLine["_history"]; if (!_history) - prompt.gotoLine._history = _history = []; + prompt.gotoLine["_history"] = _history = []; if (_history.indexOf(value) != -1) _history.splice(_history.indexOf(value), 1); _history.unshift(value); - if (_history.length > 20) _history.length = 20; - - + if (_history.length > 20) + _history.length = 20; var pos = editor.getCursorPosition(); var ranges = []; - value.replace(/^:/, "").split(/,/).map(function(str) { + value.replace(/^:/, "").split(/,/).map(function (str) { var parts = str.split(/([<>:+-]|c?\d+)|[^c\d<>:+-]+/).filter(Boolean); var i = 0; function readPosition() { var c = parts[i++]; - if (!c) return; + if (!c) + return; if (c[0] == "c") { var index = parseInt(c.slice(1)) || 0; return editor.session.doc.indexToPosition(index); @@ -2585,7 +2953,7 @@ prompt.gotoLine = function(editor, callback) { column = parseInt(c) || 0; } } - return {row: row, column: column}; + return { row: row, column: column }; } pos = readPosition(); var range = Range.fromPoints(pos, pos); @@ -2601,21 +2969,15 @@ prompt.gotoLine = function(editor, callback) { }); editor.selection.fromJSON(ranges); var scrollTop = editor.renderer.scrollTop; - editor.renderer.scrollSelectionIntoView( - editor.selection.anchor, - editor.selection.cursor, - 0.5 - ); + editor.renderer.scrollSelectionIntoView(editor.selection.anchor, editor.selection.cursor, 0.5); editor.renderer.animateScrolling(scrollTop); }, - history: function() { - var undoManager = editor.session.getUndoManager(); - if (!prompt.gotoLine._history) + history: function () { + if (!prompt.gotoLine["_history"]) return []; - return prompt.gotoLine._history; - + return prompt.gotoLine["_history"]; }, - getCompletions: function(cmdLine) { + getCompletions: function (cmdLine) { var value = cmdLine.getValue(); var m = value.replace(/^:/, "").split(":"); var row = Math.min(parseInt(m[0]) || 1, editor.session.getLength()) - 1; @@ -2625,30 +2987,29 @@ prompt.gotoLine = function(editor, callback) { }, $rules: { start: [{ - regex: /\d+/, - token: "string" - }, { - regex: /[:,><+\-c]/, - token: "keyword" - }] + regex: /\d+/, + token: "string" + }, { + regex: /[:,><+\-c]/, + token: "keyword" + }] } }); }; - -prompt.commands = function(editor, callback) { +prompt.commands = function (editor, callback) { function normalizeName(name) { - return (name || "").replace(/^./, function(x) { + return (name || "").replace(/^./, function (x) { return x.toUpperCase(x); - }).replace(/[a-z][A-Z]/g, function(x) { + }).replace(/[a-z][A-Z]/g, function (x) { return x[0] + " " + x[1].toLowerCase(x); }); } function getEditorCommandsByName(excludeCommands) { var commandsByName = []; var commandMap = {}; - editor.keyBinding.$handlers.forEach(function(handler) { - var platform = handler.platform; - var cbn = handler.byName; + editor.keyBinding.$handlers.forEach(function (handler) { + var platform = handler["platform"]; + var cbn = handler["byName"]; for (var i in cbn) { var key = cbn[i].bindKey; if (typeof key !== "string") { @@ -2658,17 +3019,18 @@ prompt.commands = function(editor, callback) { var description = commands.description || normalizeName(commands.name); if (!Array.isArray(commands)) commands = [commands]; - commands.forEach(function(command) { + commands.forEach(function (command) { if (typeof command != "string") command = command.name; - var needle = excludeCommands.find(function(el) { + var needle = excludeCommands.find(function (el) { return el === command; }); if (!needle) { if (commandMap[command]) { commandMap[command].key += "|" + key; - } else { - commandMap[command] = {key: key, command: command, description: description}; + } + else { + commandMap[command] = { key: key, command: command, description: description }; commandsByName.push(commandMap[command]); } } @@ -2679,27 +3041,26 @@ prompt.commands = function(editor, callback) { } var excludeCommandsList = ["insertstring", "inserttext", "setIndentation", "paste"]; var shortcutsArray = getEditorCommandsByName(excludeCommandsList); - shortcutsArray = shortcutsArray.map(function(item) { - return {value: item.description, meta: item.key, command: item.command}; + shortcutsArray = shortcutsArray.map(function (item) { + return { value: item.description, meta: item.key, command: item.command }; }); - prompt(editor, "", { + prompt(editor, "", { name: "commands", selection: [0, Number.MAX_VALUE], maxHistoryCount: 5, - onAccept: function(data) { + onAccept: function (data) { if (data.item) { var commandName = data.item.command; this.addToHistory(data.item); - editor.execCommand(commandName); } }, - addToHistory: function(item) { + addToHistory: function (item) { var history = this.history(); history.unshift(item); delete item.message; for (var i = 1; i < history.length; i++) { - if (history[i]["command"] == item.command ) { + if (history[i]["command"] == item.command) { history.splice(i, 1); break; } @@ -2707,112 +3068,90 @@ prompt.commands = function(editor, callback) { if (this.maxHistoryCount > 0 && history.length > this.maxHistoryCount) { history.splice(history.length - 1, 1); } - prompt.commands.history = history; + prompt.commands["history"] = history; }, - history: function() { - return prompt.commands.history || []; + history: function () { + return prompt.commands["history"] || []; }, - getPrefix: function(cmdLine) { + getPrefix: function (cmdLine) { var currentPos = cmdLine.getCursorPosition(); var filterValue = cmdLine.getValue(); return filterValue.substring(0, currentPos.column); }, - getCompletions: function(cmdLine) { + getCompletions: function (cmdLine) { function getFilteredCompletions(commands, prefix) { var resultCommands = JSON.parse(JSON.stringify(commands)); - var filtered = new FilteredList(resultCommands); return filtered.filterCompletions(resultCommands, prefix); } - function getUniqueCommandList(commands, usedCommands) { if (!usedCommands || !usedCommands.length) { return commands; } var excludeCommands = []; - usedCommands.forEach(function(item) { + usedCommands.forEach(function (item) { excludeCommands.push(item.command); }); - var resultCommands = []; - - commands.forEach(function(item) { + commands.forEach(function (item) { if (excludeCommands.indexOf(item.command) === -1) { resultCommands.push(item); } }); - return resultCommands; } - var prefix = this.getPrefix(cmdLine); var recentlyUsedCommands = getFilteredCompletions(this.history(), prefix); var otherCommands = getUniqueCommandList(shortcutsArray, recentlyUsedCommands); otherCommands = getFilteredCompletions(otherCommands, prefix); - if (recentlyUsedCommands.length && otherCommands.length) { - recentlyUsedCommands[0]["message"] = " Recently used"; - otherCommands[0]["message"] = " Other commands"; + recentlyUsedCommands[0].message = nls("prompt.recently-used", "Recently used"); + otherCommands[0].message = nls("prompt.other-commands", "Other commands"); } - var completions = recentlyUsedCommands.concat(otherCommands); return completions.length > 0 ? completions : [{ - value: "No matching commands", - error: 1 - }]; + value: nls("prompt.no-matching-commands", "No matching commands"), + error: 1 + }]; } }); }; - -prompt.modes = function(editor, callback) { +prompt.modes = function (editor, callback) { var modesArray = modelist.modes; - modesArray = modesArray.map(function(item) { - return {value: item.caption, mode: item.name}; + modesArray = modesArray.map(function (item) { + return { value: item.caption, mode: item.name }; }); - prompt(editor, "", { + prompt(editor, "", { name: "modes", selection: [0, Number.MAX_VALUE], - onAccept: function(data) { + onAccept: function (data) { if (data.item) { var modeName = "ace/mode/" + data.item.mode; editor.session.setMode(modeName); } }, - getPrefix: function(cmdLine) { + getPrefix: function (cmdLine) { var currentPos = cmdLine.getCursorPosition(); var filterValue = cmdLine.getValue(); return filterValue.substring(0, currentPos.column); }, - getCompletions: function(cmdLine) { + getCompletions: function (cmdLine) { function getFilteredCompletions(modes, prefix) { var resultCommands = JSON.parse(JSON.stringify(modes)); - var filtered = new FilteredList(resultCommands); return filtered.filterCompletions(resultCommands, prefix); } - var prefix = this.getPrefix(cmdLine); var completions = getFilteredCompletions(modesArray, prefix); return completions.length > 0 ? completions : [{ - "caption": "No mode matching", - "value": "No mode matching", - "error": 1 - }]; + "caption": "No mode matching", + "value": "No mode matching", + "error": 1 + }]; } }); }; - -dom.importCssString(".ace_prompt_container {\ - max-width: 600px;\ - width: 100%;\ - margin: 20px auto;\ - padding: 3px;\ - background: white;\ - border-radius: 2px;\ - box-shadow: 0px 2px 3px 0px #555;\ -}", "promtp.css", false); - - +dom.importCssString(".ace_prompt_container {\n max-width: 603px;\n width: 100%;\n margin: 20px auto;\n padding: 3px;\n background: white;\n border-radius: 2px;\n box-shadow: 0px 2px 3px 0px #555;\n}", "promtp.css", false); exports.prompt = prompt; }); (function() { diff --git a/app/Resources/ui/js/ace/ext-rtl.js b/app/Resources/ui/js/ace/ext-rtl.js index 39ebfd9d..d5f8567f 100644 --- a/app/Resources/ui/js/ace/ext-rtl.js +++ b/app/Resources/ui/js/ace/ext-rtl.js @@ -1,33 +1,57 @@ -define("ace/ext/rtl",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/rtl",["require","exports","module","ace/editor","ace/config"], function(require, exports, module){/** + * ## Right-to-Left (RTL) text support extension + * + * Provides bidirectional text support enabling proper rendering and editing of RTL languages such as Arabic, Hebrew, + * and Persian. Handles text direction detection, cursor positioning, and ensures correct visual behavior for mixed + * LTR/RTL content. Includes keyboard shortcuts for manual text direction control and automatic + * RLE (Right-to-Left Embedding) marker management. + * + * **Configuration Options:** + * - `rtlText`: Enable automatic RTL text detection and handling + * - `rtl`: Force RTL direction for the entire editor + * + * **Keyboard Shortcuts:** + * - `Ctrl-Alt-Shift-L` (Win) / `Cmd-Alt-Shift-L` (Mac): Force left-to-right direction + * - `Ctrl-Alt-Shift-R` (Win) / `Cmd-Alt-Shift-R` (Mac): Force right-to-left direction + * + * **Usage:** + * ```javascript + * editor.setOptions({ + * rtlText: true, // Enable automatic RTL detection + * rtl: false // Or force RTL direction + * }); + * ``` + * + * @module + */ "use strict"; - var commands = [{ - name: "leftToRight", - bindKey: { win: "Ctrl-Alt-Shift-L", mac: "Command-Alt-Shift-L" }, - exec: function(editor) { - editor.session.$bidiHandler.setRtlDirection(editor, false); - }, - readOnly: true -}, { - name: "rightToLeft", - bindKey: { win: "Ctrl-Alt-Shift-R", mac: "Command-Alt-Shift-R" }, - exec: function(editor) { - editor.session.$bidiHandler.setRtlDirection(editor, true); - }, - readOnly: true -}]; - + name: "leftToRight", + bindKey: { win: "Ctrl-Alt-Shift-L", mac: "Command-Alt-Shift-L" }, + exec: function (editor) { + editor.session.$bidiHandler.setRtlDirection(editor, false); + }, + readOnly: true + }, { + name: "rightToLeft", + bindKey: { win: "Ctrl-Alt-Shift-R", mac: "Command-Alt-Shift-R" }, + exec: function (editor) { + editor.session.$bidiHandler.setRtlDirection(editor, true); + }, + readOnly: true + }]; var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { rtlText: { - set: function(val) { + set: function (val) { if (val) { this.on("change", onChange); this.on("changeSelection", onChangeSelection); this.renderer.on("afterRender", updateLineDirection); this.commands.on("exec", onCommandEmitted); this.commands.addCommands(commands); - } else { + } + else { this.off("change", onChange); this.off("changeSelection", onChangeSelection); this.renderer.off("afterRender", updateLineDirection); @@ -39,13 +63,14 @@ require("../config").defineOptions(Editor.prototype, "editor", { } }, rtl: { - set: function(val) { + set: function (val) { this.session.$bidiHandler.$isRtl = val; if (val) { this.setOption("rtlText", false); this.renderer.on("afterRender", updateLineDirection); this.session.$bidiHandler.seenBidi = true; - } else { + } + else { this.renderer.off("afterRender", updateLineDirection); clearTextLayer(this.renderer); } @@ -59,7 +84,8 @@ function onChangeSelection(e, editor) { if (lead.column === 0) { if (editor.session.$bidiHandler.isMoveLeftOperation && lead.row > 0) { editor.getSelection().moveCursorTo(lead.row - 1, editor.session.getLine(lead.row - 1).length); - } else { + } + else { if (editor.getSelection().isEmpty()) lead.column += 1; else @@ -68,7 +94,6 @@ function onChangeSelection(e, editor) { } } } - function onCommandEmitted(commadEvent) { commadEvent.editor.session.$bidiHandler.isMoveLeftOperation = /gotoleft|selectleft|backspace|removewordleft/.test(commadEvent.command.name); } @@ -82,26 +107,25 @@ function onChange(delta, editor) { } } } - function updateLineDirection(e, renderer) { var session = renderer.session; var $bidiHandler = session.$bidiHandler; var cells = renderer.$textLayer.$lines.cells; var width = renderer.layerConfig.width - renderer.layerConfig.padding + "px"; - cells.forEach(function(cell) { + cells.forEach(function (cell) { var style = cell.element.style; if ($bidiHandler && $bidiHandler.isRtlLine(cell.row)) { style.direction = "rtl"; style.textAlign = "right"; style.width = width; - } else { + } + else { style.direction = ""; style.textAlign = ""; style.width = ""; } }); } - function clearTextLayer(renderer) { var lines = renderer.$textLayer.$lines; lines.cells.forEach(clear); diff --git a/app/Resources/ui/js/ace/ext-searchbox.js b/app/Resources/ui/js/ace/ext-searchbox.js index 8be7e8c1..8bdfd1ed 100644 --- a/app/Resources/ui/js/ace/ext-searchbox.js +++ b/app/Resources/ui/js/ace/ext-searchbox.js @@ -1,214 +1,89 @@ -define("ace/ext/searchbox",["require","exports","module","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/keyboard/hash_handler","ace/lib/keys"], function(require, exports, module) { -"use strict"; +define("ace/ext/searchbox-css",["require","exports","module"], function(require, exports, module){module.exports = "\n\n/* ------------------------------------------------------------------------------------------\n * Editor Search Form\n * --------------------------------------------------------------------------------------- */\n.ace_search {\n background-color: #ddd;\n color: #666;\n border: 1px solid #cbcbcb;\n border-top: 0 none;\n overflow: hidden;\n margin: 0;\n padding: 4px 6px 0 4px;\n position: absolute;\n top: 0;\n z-index: 99;\n white-space: normal;\n}\n.ace_search.left {\n border-left: 0 none;\n border-radius: 0px 0px 5px 0px;\n left: 0;\n}\n.ace_search.right {\n border-radius: 0px 0px 0px 5px;\n border-right: 0 none;\n right: 0;\n}\n\n.ace_search_form, .ace_replace_form {\n margin: 0 20px 4px 0;\n overflow: hidden;\n line-height: 1.9;\n}\n.ace_replace_form {\n margin-right: 0;\n}\n.ace_search_form.ace_nomatch {\n outline: 1px solid red;\n}\n\n.ace_search_field {\n border-radius: 3px 0 0 3px;\n background-color: white;\n color: black;\n border: 1px solid #cbcbcb;\n border-right: 0 none;\n outline: 0;\n padding: 0;\n font-size: inherit;\n margin: 0;\n line-height: inherit;\n padding: 0 6px;\n min-width: 17em;\n vertical-align: top;\n min-height: 1.8em;\n box-sizing: content-box;\n}\n.ace_searchbtn {\n border: 1px solid #cbcbcb;\n line-height: inherit;\n display: inline-block;\n padding: 0 6px;\n background: #fff;\n border-right: 0 none;\n border-left: 1px solid #dcdcdc;\n cursor: pointer;\n margin: 0;\n position: relative;\n color: #666;\n}\n.ace_searchbtn:last-child {\n border-radius: 0 3px 3px 0;\n border-right: 1px solid #cbcbcb;\n}\n.ace_searchbtn:disabled {\n background: none;\n cursor: default;\n}\n.ace_searchbtn:hover {\n background-color: #eef1f6;\n}\n.ace_searchbtn.prev, .ace_searchbtn.next {\n padding: 0px 0.7em\n}\n.ace_searchbtn.prev:after, .ace_searchbtn.next:after {\n content: \"\";\n border: solid 2px #888;\n width: 0.5em;\n height: 0.5em;\n border-width: 2px 0 0 2px;\n display:inline-block;\n transform: rotate(-45deg);\n}\n.ace_searchbtn.next:after {\n border-width: 0 2px 2px 0 ;\n}\n.ace_searchbtn_close {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\n border-radius: 50%;\n border: 0 none;\n color: #656565;\n cursor: pointer;\n font: 16px/16px Arial;\n padding: 0;\n height: 14px;\n width: 14px;\n top: 9px;\n right: 7px;\n position: absolute;\n}\n.ace_searchbtn_close:hover {\n background-color: #656565;\n background-position: 50% 100%;\n color: white;\n}\n\n.ace_button {\n margin-left: 2px;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n -ms-user-select: none;\n user-select: none;\n overflow: hidden;\n opacity: 0.7;\n border: 1px solid rgba(100,100,100,0.23);\n padding: 1px;\n box-sizing: border-box!important;\n color: black;\n}\n\n.ace_button:hover {\n background-color: #eee;\n opacity:1;\n}\n.ace_button:active {\n background-color: #ddd;\n}\n\n.ace_button.checked {\n border-color: #3399ff;\n opacity:1;\n}\n\n.ace_search_options{\n margin-bottom: 3px;\n text-align: right;\n -webkit-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n -ms-user-select: none;\n user-select: none;\n clear: both;\n}\n\n.ace_search_counter {\n float: left;\n font-family: arial;\n padding: 0 8px;\n}"; + +}); +define("ace/ext/searchbox",["require","exports","module","ace/ext/searchbox","ace/ext/searchbox","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/ext/searchbox-css","ace/keyboard/hash_handler","ace/lib/keys","ace/config"], function(require, exports, module){/** + * ## Interactive search and replace UI extension for text editing + * + * Provides a floating search box interface with find/replace functionality including live search results, regex + * support, case sensitivity options, whole word matching, and scoped selection searching. Features keyboard shortcuts + * for quick access and navigation, with visual feedback for search matches and a counter showing current position + * in results. + * + * **Key Features:** + * - Real-time search with highlighted matches + * - Find and replace with individual or bulk operations + * - Advanced options: regex, case sensitivity, whole words, search in selection + * - Keyboard navigation and shortcuts + * - Visual match counter and no-match indicators + * + * **Usage:** + * ```javascript + * // Show search box + * require("ace/ext/searchbox").Search(editor); + * + * // Show with replace functionality + * require("ace/ext/searchbox").Search(editor, true); + * ``` + * + * @module + */ +"use strict"; var dom = require("../lib/dom"); var lang = require("../lib/lang"); var event = require("../lib/event"); -var searchboxCss = "\ -.ace_search {\ -background-color: #ddd;\ -color: #666;\ -border: 1px solid #cbcbcb;\ -border-top: 0 none;\ -overflow: hidden;\ -margin: 0;\ -padding: 4px 6px 0 4px;\ -position: absolute;\ -top: 0;\ -z-index: 99;\ -white-space: normal;\ -}\ -.ace_search.left {\ -border-left: 0 none;\ -border-radius: 0px 0px 5px 0px;\ -left: 0;\ -}\ -.ace_search.right {\ -border-radius: 0px 0px 0px 5px;\ -border-right: 0 none;\ -right: 0;\ -}\ -.ace_search_form, .ace_replace_form {\ -margin: 0 20px 4px 0;\ -overflow: hidden;\ -line-height: 1.9;\ -}\ -.ace_replace_form {\ -margin-right: 0;\ -}\ -.ace_search_form.ace_nomatch {\ -outline: 1px solid red;\ -}\ -.ace_search_field {\ -border-radius: 3px 0 0 3px;\ -background-color: white;\ -color: black;\ -border: 1px solid #cbcbcb;\ -border-right: 0 none;\ -outline: 0;\ -padding: 0;\ -font-size: inherit;\ -margin: 0;\ -line-height: inherit;\ -padding: 0 6px;\ -min-width: 17em;\ -vertical-align: top;\ -min-height: 1.8em;\ -box-sizing: content-box;\ -}\ -.ace_searchbtn {\ -border: 1px solid #cbcbcb;\ -line-height: inherit;\ -display: inline-block;\ -padding: 0 6px;\ -background: #fff;\ -border-right: 0 none;\ -border-left: 1px solid #dcdcdc;\ -cursor: pointer;\ -margin: 0;\ -position: relative;\ -color: #666;\ -}\ -.ace_searchbtn:last-child {\ -border-radius: 0 3px 3px 0;\ -border-right: 1px solid #cbcbcb;\ -}\ -.ace_searchbtn:disabled {\ -background: none;\ -cursor: default;\ -}\ -.ace_searchbtn:hover {\ -background-color: #eef1f6;\ -}\ -.ace_searchbtn.prev, .ace_searchbtn.next {\ -padding: 0px 0.7em\ -}\ -.ace_searchbtn.prev:after, .ace_searchbtn.next:after {\ -content: \"\";\ -border: solid 2px #888;\ -width: 0.5em;\ -height: 0.5em;\ -border-width: 2px 0 0 2px;\ -display:inline-block;\ -transform: rotate(-45deg);\ -}\ -.ace_searchbtn.next:after {\ -border-width: 0 2px 2px 0 ;\ -}\ -.ace_searchbtn_close {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\ -border-radius: 50%;\ -border: 0 none;\ -color: #656565;\ -cursor: pointer;\ -font: 16px/16px Arial;\ -padding: 0;\ -height: 14px;\ -width: 14px;\ -top: 9px;\ -right: 7px;\ -position: absolute;\ -}\ -.ace_searchbtn_close:hover {\ -background-color: #656565;\ -background-position: 50% 100%;\ -color: white;\ -}\ -.ace_button {\ -margin-left: 2px;\ -cursor: pointer;\ --webkit-user-select: none;\ --moz-user-select: none;\ --o-user-select: none;\ --ms-user-select: none;\ -user-select: none;\ -overflow: hidden;\ -opacity: 0.7;\ -border: 1px solid rgba(100,100,100,0.23);\ -padding: 1px;\ -box-sizing: border-box!important;\ -color: black;\ -}\ -.ace_button:hover {\ -background-color: #eee;\ -opacity:1;\ -}\ -.ace_button:active {\ -background-color: #ddd;\ -}\ -.ace_button.checked {\ -border-color: #3399ff;\ -opacity:1;\ -}\ -.ace_search_options{\ -margin-bottom: 3px;\ -text-align: right;\ --webkit-user-select: none;\ --moz-user-select: none;\ --o-user-select: none;\ --ms-user-select: none;\ -user-select: none;\ -clear: both;\ -}\ -.ace_search_counter {\ -float: left;\ -font-family: arial;\ -padding: 0 8px;\ -}"; +var searchboxCss = require("./searchbox-css"); var HashHandler = require("../keyboard/hash_handler").HashHandler; var keyUtil = require("../lib/keys"); - +var nls = require("../config").nls; var MAX_COUNT = 999; - dom.importCssString(searchboxCss, "ace_searchbox", false); - -var SearchBox = function(editor, range, showReplaceForm) { - var div = dom.createElement("div"); - dom.buildDom(["div", {class:"ace_search right"}, - ["span", {action: "hide", class: "ace_searchbtn_close"}], - ["div", {class: "ace_search_form"}, - ["input", {class: "ace_search_field", placeholder: "Search for", spellcheck: "false"}], - ["span", {action: "findPrev", class: "ace_searchbtn prev"}, "\u200b"], - ["span", {action: "findNext", class: "ace_searchbtn next"}, "\u200b"], - ["span", {action: "findAll", class: "ace_searchbtn", title: "Alt-Enter"}, "All"] - ], - ["div", {class: "ace_replace_form"}, - ["input", {class: "ace_search_field", placeholder: "Replace with", spellcheck: "false"}], - ["span", {action: "replaceAndFindNext", class: "ace_searchbtn"}, "Replace"], - ["span", {action: "replaceAll", class: "ace_searchbtn"}, "All"] - ], - ["div", {class: "ace_search_options"}, - ["span", {action: "toggleReplace", class: "ace_button", title: "Toggle Replace mode", - style: "float:left;margin-top:-2px;padding:0 5px;"}, "+"], - ["span", {class: "ace_search_counter"}], - ["span", {action: "toggleRegexpMode", class: "ace_button", title: "RegExp Search"}, ".*"], - ["span", {action: "toggleCaseSensitive", class: "ace_button", title: "CaseSensitive Search"}, "Aa"], - ["span", {action: "toggleWholeWords", class: "ace_button", title: "Whole Word Search"}, "\\b"], - ["span", {action: "searchInSelection", class: "ace_button", title: "Search In Selection"}, "S"] - ] - ], div); - this.element = div.firstChild; - - this.setSession = this.setSession.bind(this); - - this.$init(); - this.setEditor(editor); - dom.importCssString(searchboxCss, "ace_searchbox", editor.container); -}; - -(function() { - this.setEditor = function(editor) { +var SearchBox = /** @class */ (function () { + function SearchBox(editor, range, showReplaceForm) { + this.activeInput; + this.element = dom.buildDom(["div", { class: "ace_search right" }, + ["span", { action: "hide", class: "ace_searchbtn_close" }], + ["div", { class: "ace_search_form" }, + ["input", { class: "ace_search_field", placeholder: nls("search-box.find.placeholder", "Search for"), spellcheck: "false" }], + ["span", { action: "findPrev", class: "ace_searchbtn prev" }, "\u200b"], + ["span", { action: "findNext", class: "ace_searchbtn next" }, "\u200b"], + ["span", { action: "findAll", class: "ace_searchbtn", title: "Alt-Enter" }, nls("search-box.find-all.text", "All")] + ], + ["div", { class: "ace_replace_form" }, + ["input", { class: "ace_search_field", placeholder: nls("search-box.replace.placeholder", "Replace with"), spellcheck: "false" }], + ["span", { action: "replaceAndFindNext", class: "ace_searchbtn" }, nls("search-box.replace-next.text", "Replace")], + ["span", { action: "replaceAll", class: "ace_searchbtn" }, nls("search-box.replace-all.text", "All")] + ], + ["div", { class: "ace_search_options" }, + ["span", { action: "toggleReplace", class: "ace_button", title: nls("search-box.toggle-replace.title", "Toggle Replace mode"), + style: "float:left;margin-top:-2px;padding:0 5px;" }, "+"], + ["span", { class: "ace_search_counter" }], + ["span", { action: "toggleRegexpMode", class: "ace_button", title: nls("search-box.toggle-regexp.title", "RegExp Search") }, ".*"], + ["span", { action: "toggleCaseSensitive", class: "ace_button", title: nls("search-box.toggle-case.title", "CaseSensitive Search") }, "Aa"], + ["span", { action: "toggleWholeWords", class: "ace_button", title: nls("search-box.toggle-whole-word.title", "Whole Word Search") }, "\\b"], + ["span", { action: "searchInSelection", class: "ace_button", title: nls("search-box.toggle-in-selection.title", "Search In Selection") }, "S"] + ] + ]); + this.setSession = this.setSession.bind(this); + this.$onEditorInput = this.onEditorInput.bind(this); + this.$init(); + this.setEditor(editor); + dom.importCssString(searchboxCss, "ace_searchbox", editor.container); + event.addListener(this.element, "touchstart", function (e) { e.stopPropagation(); }, editor); + } + SearchBox.prototype.setEditor = function (editor) { editor.searchBox = this; editor.renderer.scroller.appendChild(this.element); this.editor = editor; }; - - this.setSession = function(e) { + SearchBox.prototype.setSession = function (e) { this.searchRange = null; this.$syncOptions(true); }; - - this.$initElements = function(sb) { + SearchBox.prototype.onEditorInput = function () { + this.find(false, false, true); + }; + SearchBox.prototype.$initElements = function (sb) { this.searchBox = sb.querySelector(".ace_search_form"); this.replaceBox = sb.querySelector(".ace_replace_form"); this.searchOption = sb.querySelector("[action=searchInSelection]"); @@ -220,20 +95,17 @@ var SearchBox = function(editor, range, showReplaceForm) { this.replaceInput = this.replaceBox.querySelector(".ace_search_field"); this.searchCounter = sb.querySelector(".ace_search_counter"); }; - - this.$init = function() { + SearchBox.prototype.$init = function () { var sb = this.element; - this.$initElements(sb); - var _this = this; - event.addListener(sb, "mousedown", function(e) { - setTimeout(function(){ + event.addListener(sb, "mousedown", function (e) { + setTimeout(function () { _this.activeInput.focus(); }, 0); event.stopPropagation(e); }); - event.addListener(sb, "click", function(e) { + event.addListener(sb, "click", function (e) { var t = e.target || e.srcElement; var action = t.getAttribute("action"); if (action && _this[action]) @@ -242,8 +114,7 @@ var SearchBox = function(editor, range, showReplaceForm) { _this.$searchBarKb.commands[action].exec(_this); event.stopPropagation(e); }); - - event.addCommandKeyListener(sb, function(e, hashId, keyCode) { + event.addCommandKeyListener(sb, function (e, hashId, keyCode) { var keyString = keyUtil.keyCodeToString(keyCode); var command = _this.$searchBarKb.findKeyCommand(hashId, keyString); if (command && command.exec) { @@ -251,122 +122,32 @@ var SearchBox = function(editor, range, showReplaceForm) { event.stopEvent(e); } }); - - this.$onChange = lang.delayedCall(function() { + this.$onChange = lang.delayedCall(function () { _this.find(false, false); }); - - event.addListener(this.searchInput, "input", function() { + event.addListener(this.searchInput, "input", function () { _this.$onChange.schedule(20); }); - event.addListener(this.searchInput, "focus", function() { + event.addListener(this.searchInput, "focus", function () { _this.activeInput = _this.searchInput; _this.searchInput.value && _this.highlight(); }); - event.addListener(this.replaceInput, "focus", function() { + event.addListener(this.replaceInput, "focus", function () { _this.activeInput = _this.replaceInput; _this.searchInput.value && _this.highlight(); }); }; - this.$closeSearchBarKb = new HashHandler([{ - bindKey: "Esc", - name: "closeSearchBar", - exec: function(editor) { - editor.searchBox.hide(); - } - }]); - this.$searchBarKb = new HashHandler(); - this.$searchBarKb.bindKeys({ - "Ctrl-f|Command-f": function(sb) { - var isReplace = sb.isReplace = !sb.isReplace; - sb.replaceBox.style.display = isReplace ? "" : "none"; - sb.replaceOption.checked = false; - sb.$syncOptions(); - sb.searchInput.focus(); - }, - "Ctrl-H|Command-Option-F": function(sb) { - if (sb.editor.getReadOnly()) - return; - sb.replaceOption.checked = true; - sb.$syncOptions(); - sb.replaceInput.focus(); - }, - "Ctrl-G|Command-G": function(sb) { - sb.findNext(); - }, - "Ctrl-Shift-G|Command-Shift-G": function(sb) { - sb.findPrev(); - }, - "esc": function(sb) { - setTimeout(function() { sb.hide();}); - }, - "Return": function(sb) { - if (sb.activeInput == sb.replaceInput) - sb.replace(); - sb.findNext(); - }, - "Shift-Return": function(sb) { - if (sb.activeInput == sb.replaceInput) - sb.replace(); - sb.findPrev(); - }, - "Alt-Return": function(sb) { - if (sb.activeInput == sb.replaceInput) - sb.replaceAll(); - sb.findAll(); - }, - "Tab": function(sb) { - (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus(); - } - }); - - this.$searchBarKb.addCommands([{ - name: "toggleRegexpMode", - bindKey: {win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/"}, - exec: function(sb) { - sb.regExpOption.checked = !sb.regExpOption.checked; - sb.$syncOptions(); - } - }, { - name: "toggleCaseSensitive", - bindKey: {win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I"}, - exec: function(sb) { - sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; - sb.$syncOptions(); - } - }, { - name: "toggleWholeWords", - bindKey: {win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W"}, - exec: function(sb) { - sb.wholeWordOption.checked = !sb.wholeWordOption.checked; - sb.$syncOptions(); - } - }, { - name: "toggleReplace", - exec: function(sb) { - sb.replaceOption.checked = !sb.replaceOption.checked; - sb.$syncOptions(); - } - }, { - name: "searchInSelection", - exec: function(sb) { - sb.searchOption.checked = !sb.searchRange; - sb.setSearchRange(sb.searchOption.checked && sb.editor.getSelectionRange()); - sb.$syncOptions(); - } - }]); - - this.setSearchRange = function(range) { + SearchBox.prototype.setSearchRange = function (range) { this.searchRange = range; if (range) { this.searchRangeMarker = this.editor.session.addMarker(range, "ace_active-line"); - } else if (this.searchRangeMarker) { + } + else if (this.searchRangeMarker) { this.editor.session.removeMarker(this.searchRangeMarker); this.searchRangeMarker = null; } }; - - this.$syncOptions = function(preventScroll) { + SearchBox.prototype.$syncOptions = function (preventScroll) { dom.setCssClass(this.replaceOption, "checked", this.searchRange); dom.setCssClass(this.searchOption, "checked", this.searchOption.checked); this.replaceOption.textContent = this.replaceOption.checked ? "-" : "+"; @@ -378,12 +159,13 @@ var SearchBox = function(editor, range, showReplaceForm) { this.replaceBox.style.display = this.replaceOption.checked && !readOnly ? "" : "none"; this.find(false, false, preventScroll); }; - - this.highlight = function(re) { + SearchBox.prototype.highlight = function (re) { this.editor.session.highlight(re || this.editor.$search.$options.re); this.editor.renderer.updateBackMarkers(); }; - this.find = function(skipCurrent, backwards, preventScroll) { + SearchBox.prototype.find = function (skipCurrent, backwards, preventScroll) { + if (!this.editor.session) + return; var range = this.editor.find(this.searchInput.value, { skipCurrent: skipCurrent, backwards: backwards, @@ -400,20 +182,23 @@ var SearchBox = function(editor, range, showReplaceForm) { this.highlight(); this.updateCounter(); }; - this.updateCounter = function() { + SearchBox.prototype.updateCounter = function () { var editor = this.editor; var regex = editor.$search.$options.re; + var supportsUnicodeFlag = regex.unicode; var all = 0; var before = 0; if (regex) { var value = this.searchRange ? editor.session.getTextRange(this.searchRange) : editor.getValue(); - + if (editor.$search.$isMultilineSearch(editor.getLastSearchOptions())) { + value = value.replace(/\r\n|\r|\n/g, "\n"); + editor.session.doc.$autoNewLine = "\n"; + } var offset = editor.session.doc.positionToIndex(editor.selection.anchor); if (this.searchRange) offset -= editor.session.doc.positionToIndex(this.searchRange.start); - var last = regex.lastIndex = 0; var m; while ((m = regex.exec(value))) { @@ -424,22 +209,22 @@ var SearchBox = function(editor, range, showReplaceForm) { if (all > MAX_COUNT) break; if (!m[0]) { - regex.lastIndex = last += 1; + regex.lastIndex = last += lang.skipEmptyMatch(value, last, supportsUnicodeFlag); if (last >= value.length) break; } } } - this.searchCounter.textContent = before + " of " + (all > MAX_COUNT ? MAX_COUNT + "+" : all); + this.searchCounter.textContent = nls("search-box.search-counter", "$0 of $1", [before, (all > MAX_COUNT ? MAX_COUNT + "+" : all)]); }; - this.findNext = function() { + SearchBox.prototype.findNext = function () { this.find(true, false); }; - this.findPrev = function() { + SearchBox.prototype.findPrev = function () { this.find(true, true); }; - this.findAll = function(){ - var range = this.editor.findAll(this.searchInput.value, { + SearchBox.prototype.findAll = function () { + var range = this.editor.findAll(this.searchInput.value, { regExp: this.regExpOption.checked, caseSensitive: this.caseSensitiveOption.checked, wholeWord: this.wholeWordOption.checked @@ -450,58 +235,144 @@ var SearchBox = function(editor, range, showReplaceForm) { this.highlight(); this.hide(); }; - this.replace = function() { + SearchBox.prototype.replace = function () { if (!this.editor.getReadOnly()) this.editor.replace(this.replaceInput.value); - }; - this.replaceAndFindNext = function() { + }; + SearchBox.prototype.replaceAndFindNext = function () { if (!this.editor.getReadOnly()) { this.editor.replace(this.replaceInput.value); this.findNext(); } }; - this.replaceAll = function() { + SearchBox.prototype.replaceAll = function () { if (!this.editor.getReadOnly()) this.editor.replaceAll(this.replaceInput.value); }; - - this.hide = function() { + SearchBox.prototype.hide = function () { this.active = false; this.setSearchRange(null); this.editor.off("changeSession", this.setSession); - + this.editor.off("input", this.$onEditorInput); this.element.style.display = "none"; this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb); this.editor.focus(); }; - this.show = function(value, isReplace) { + SearchBox.prototype.show = function (value, isReplace) { this.active = true; this.editor.on("changeSession", this.setSession); + this.editor.on("input", this.$onEditorInput); this.element.style.display = ""; this.replaceOption.checked = isReplace; - - if (value) + if (this.editor.$search.$options.regExp) + value = lang.escapeRegExp(value); + if (value != undefined) this.searchInput.value = value; - this.searchInput.focus(); this.searchInput.select(); - this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb); - this.$syncOptions(true); }; - - this.isFocused = function() { + SearchBox.prototype.isFocused = function () { var el = document.activeElement; return el == this.searchInput || el == this.replaceInput; }; -}).call(SearchBox.prototype); - + return SearchBox; +}()); +var $searchBarKb = new HashHandler(); +$searchBarKb.bindKeys({ + "Ctrl-f|Command-f": function (sb) { + var isReplace = sb.isReplace = !sb.isReplace; + sb.replaceBox.style.display = isReplace ? "" : "none"; + sb.replaceOption.checked = false; + sb.$syncOptions(); + sb.searchInput.focus(); + }, + "Ctrl-H|Command-Option-F": function (sb) { + if (sb.editor.getReadOnly()) + return; + sb.replaceOption.checked = true; + sb.$syncOptions(); + sb.replaceInput.focus(); + }, + "Ctrl-G|Command-G": function (sb) { + sb.findNext(); + }, + "Ctrl-Shift-G|Command-Shift-G": function (sb) { + sb.findPrev(); + }, + "esc": function (sb) { + setTimeout(function () { sb.hide(); }); + }, + "Return": function (sb) { + if (sb.activeInput == sb.replaceInput) + sb.replace(); + sb.findNext(); + }, + "Shift-Return": function (sb) { + if (sb.activeInput == sb.replaceInput) + sb.replace(); + sb.findPrev(); + }, + "Alt-Return": function (sb) { + if (sb.activeInput == sb.replaceInput) + sb.replaceAll(); + sb.findAll(); + }, + "Tab|Shift-Tab": function (sb) { + (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus(); + } +}); +$searchBarKb.addCommands([{ + name: "toggleRegexpMode", + bindKey: { win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/" }, + exec: function (sb) { + sb.regExpOption.checked = !sb.regExpOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleCaseSensitive", + bindKey: { win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I" }, + exec: function (sb) { + sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleWholeWords", + bindKey: { win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W" }, + exec: function (sb) { + sb.wholeWordOption.checked = !sb.wholeWordOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleReplace", + exec: function (sb) { + sb.replaceOption.checked = !sb.replaceOption.checked; + sb.$syncOptions(); + } + }, { + name: "searchInSelection", + exec: function (sb) { + sb.searchOption.checked = !sb.searchRange; + sb.setSearchRange(sb.searchOption.checked && sb.editor.getSelectionRange()); + sb.$syncOptions(); + } + }]); +var $closeSearchBarKb = new HashHandler([{ + bindKey: "Esc", + name: "closeSearchBar", + exec: function (editor) { + editor.searchBox.hide(); + } + }]); +SearchBox.prototype.$searchBarKb = $searchBarKb; +SearchBox.prototype.$closeSearchBarKb = $closeSearchBarKb; exports.SearchBox = SearchBox; - -exports.Search = function(editor, isReplace) { +exports.Search = function (editor, isReplace) { var sb = editor.searchBox || new SearchBox(editor); - sb.show(editor.session.getTextRange(), isReplace); + var range = editor.session.selection.getRange(); + var value = range.isMultiLine() ? "" : editor.session.getTextRange(range); + sb.show(value, isReplace); }; }); (function() { diff --git a/app/Resources/ui/js/ace/ext-settings_menu.js b/app/Resources/ui/js/ace/ext-settings_menu.js index e31c8867..c4479191 100644 --- a/app/Resources/ui/js/ace/ext-settings_menu.js +++ b/app/Resources/ui/js/ace/ext-settings_menu.js @@ -1,80 +1,42 @@ -define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/ext/menu_tools/settings_menu.css",["require","exports","module"], function(require, exports, module){module.exports = "#ace_settingsmenu, #kbshortcutmenu {\n background-color: #F7F7F7;\n color: black;\n box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\n padding: 1em 0.5em 2em 1em;\n overflow: auto;\n position: absolute;\n margin: 0;\n bottom: 0;\n right: 0;\n top: 0;\n z-index: 9991;\n cursor: default;\n}\n\n.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\n box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\n background-color: rgba(255, 255, 255, 0.6);\n color: black;\n}\n\n.ace_optionsMenuEntry:hover {\n background-color: rgba(100, 100, 100, 0.1);\n transition: all 0.3s\n}\n\n.ace_closeButton {\n background: rgba(245, 146, 146, 0.5);\n border: 1px solid #F48A8A;\n border-radius: 50%;\n padding: 7px;\n position: absolute;\n right: -8px;\n top: -8px;\n z-index: 100000;\n}\n.ace_closeButton{\n background: rgba(245, 146, 146, 0.9);\n}\n.ace_optionsMenuKey {\n color: darkslateblue;\n font-weight: bold;\n}\n.ace_optionsMenuCommand {\n color: darkcyan;\n font-weight: normal;\n}\n.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\n vertical-align: middle;\n}\n\n.ace_optionsMenuEntry button[ace_selected_button=true] {\n background: #e7e7e7;\n box-shadow: 1px 0px 2px 0px #adadad inset;\n border-color: #adadad;\n}\n.ace_optionsMenuEntry button {\n background: white;\n border: 1px solid lightgray;\n margin: 0px;\n}\n.ace_optionsMenuEntry button:hover{\n background: #f0f0f0;\n}"; + +}); + +define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/ext/menu_tools/settings_menu.css"], function(require, exports, module){/** + * ## Overlay Page utility + * + * Provides modal overlay functionality for displaying editor extension interfaces. Creates a full-screen overlay with + * configurable backdrop behavior, keyboard navigation (ESC to close), and focus management. Used by various extensions + * to display menus, settings panels, and other interactive content over the editor interface. + * + * **Usage:** + * ```javascript + * var overlayPage = require('./overlay_page').overlayPage; + * var contentElement = document.createElement('div'); + * contentElement.innerHTML = '

Settings

'; + * + * var overlay = overlayPage(editor, contentElement, function() { + * console.log('Overlay closed'); + * }); + * ``` + * + * @module + */ 'use strict'; var dom = require("../../lib/dom"); -var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ -background-color: #F7F7F7;\ -color: black;\ -box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ -padding: 1em 0.5em 2em 1em;\ -overflow: auto;\ -position: absolute;\ -margin: 0;\ -bottom: 0;\ -right: 0;\ -top: 0;\ -z-index: 9991;\ -cursor: default;\ -}\ -.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ -box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ -background-color: rgba(255, 255, 255, 0.6);\ -color: black;\ -}\ -.ace_optionsMenuEntry:hover {\ -background-color: rgba(100, 100, 100, 0.1);\ -transition: all 0.3s\ -}\ -.ace_closeButton {\ -background: rgba(245, 146, 146, 0.5);\ -border: 1px solid #F48A8A;\ -border-radius: 50%;\ -padding: 7px;\ -position: absolute;\ -right: -8px;\ -top: -8px;\ -z-index: 100000;\ -}\ -.ace_closeButton{\ -background: rgba(245, 146, 146, 0.9);\ -}\ -.ace_optionsMenuKey {\ -color: darkslateblue;\ -font-weight: bold;\ -}\ -.ace_optionsMenuCommand {\ -color: darkcyan;\ -font-weight: normal;\ -}\ -.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\ -vertical-align: middle;\ -}\ -.ace_optionsMenuEntry button[ace_selected_button=true] {\ -background: #e7e7e7;\ -box-shadow: 1px 0px 2px 0px #adadad inset;\ -border-color: #adadad;\ -}\ -.ace_optionsMenuEntry button {\ -background: white;\ -border: 1px solid lightgray;\ -margin: 0px;\ -}\ -.ace_optionsMenuEntry button:hover{\ -background: #f0f0f0;\ -}"; +var cssText = require("./settings_menu.css"); dom.importCssString(cssText, "settings_menu.css", false); - module.exports.overlayPage = function overlayPage(editor, contentElement, callback) { var closer = document.createElement('div'); var ignoreFocusOut = false; - function documentEscListener(e) { if (e.keyCode === 27) { close(); } } - function close() { - if (!closer) return; + if (!closer) + return; document.removeEventListener('keydown', documentEscListener); closer.parentNode.removeChild(closer); if (editor) { @@ -90,22 +52,19 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba contentElement.style.pointerEvents = "auto"; } } - closer.style.cssText = 'margin: 0; padding: 0; ' + 'position: fixed; top:0; bottom:0; left:0; right:0;' + 'z-index: 9990; ' + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : ''); - closer.addEventListener('click', function(e) { + closer.addEventListener('click', function (e) { if (!ignoreFocusOut) { close(); } }); document.addEventListener('keydown', documentEscListener); - contentElement.addEventListener('click', function (e) { e.stopPropagation(); }); - closer.appendChild(contentElement); document.body.appendChild(closer); if (editor) { @@ -119,9 +78,17 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba }); -define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/modelist",["require","exports","module"], function(require, exports, module){/** + * ## File mode detection utility + * + * Provides automatic detection of editor syntax modes based on file paths and extensions. Maps file extensions to + * appropriate Ace Editor syntax highlighting modes for over 100 programming languages and file formats including + * JavaScript, TypeScript, HTML, CSS, Python, Java, C++, and many others. Supports complex extension patterns and + * provides fallback mechanisms for unknown file types. + * + * @module + */ "use strict"; - var modes = []; function getModeForPath(path) { var mode = modesByName.text; @@ -134,203 +101,225 @@ function getModeForPath(path) { } return mode; } - -var Mode = function(name, caption, extensions) { - this.name = name; - this.caption = caption; - this.mode = "ace/mode/" + name; - this.extensions = extensions; - var re; - if (/\^/.test(extensions)) { - re = extensions.replace(/\|(\^)?/g, function(a, b){ - return "$|" + (b ? "^" : "^.*\\."); - }) + "$"; - } else { - re = "^.*\\.(" + extensions + ")$"; +var Mode = /** @class */ (function () { + function Mode(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function (a, b) { + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } + else { + re = "\\.(" + extensions + ")$"; + } + this.extRe = new RegExp(re, "gi"); } - - this.extRe = new RegExp(re, "gi"); -}; - -Mode.prototype.supportsFile = function(filename) { - return filename.match(this.extRe); -}; + Mode.prototype.supportsFile = function (filename) { + return filename.match(this.extRe); + }; + return Mode; +}()); var supportedModes = { - ABAP: ["abap"], - ABC: ["abc"], - ActionScript:["as"], - ADA: ["ada|adb"], - Alda: ["alda"], + ABAP: ["abap"], + ABC: ["abc"], + ActionScript: ["as"], + ADA: ["ada|adb"], + Alda: ["alda"], Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], - Apex: ["apex|cls|trigger|tgr"], - AQL: ["aql"], - AsciiDoc: ["asciidoc|adoc"], - ASL: ["dsl|asl|asl.json"], - Assembly_x86:["asm|a"], - AutoHotKey: ["ahk"], - BatchFile: ["bat|cmd"], - C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], - C9Search: ["c9search_results"], - Cirru: ["cirru|cr"], - Clojure: ["clj|cljs"], - Cobol: ["CBL|COB"], - coffee: ["coffee|cf|cson|^Cakefile"], - ColdFusion: ["cfm"], - Crystal: ["cr"], - CSharp: ["cs"], + Apex: ["apex|cls|trigger|tgr"], + AQL: ["aql"], + AsciiDoc: ["asciidoc|adoc"], + ASL: ["dsl|asl|asl.json"], + Assembly_ARM32: ["s"], + Assembly_x86: ["asm|a"], + Astro: ["astro"], + AutoHotKey: ["ahk"], + Basic: ["bas|bak"], + BatchFile: ["bat|cmd"], + BibTeX: ["bib"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cedar: ["cedar"], + CedarSchema: ["cedarschema"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Clue: ["clue"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm|cfc"], + Crystal: ["cr"], + CSharp: ["cs"], Csound_Document: ["csd"], Csound_Orchestra: ["orc"], Csound_Score: ["sco"], - CSS: ["css"], - Curly: ["curly"], - D: ["d|di"], - Dart: ["dart"], - Diff: ["diff|patch"], - Dockerfile: ["^Dockerfile"], - Dot: ["dot"], - Drools: ["drl"], - Edifact: ["edi"], - Eiffel: ["e|ge"], - EJS: ["ejs"], - Elixir: ["ex|exs"], - Elm: ["elm"], - Erlang: ["erl|hrl"], - Forth: ["frt|fs|ldr|fth|4th"], - Fortran: ["f|f90"], - FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], - FSL: ["fsl"], - FTL: ["ftl"], - Gcode: ["gcode"], - Gherkin: ["feature"], - Gitignore: ["^.gitignore"], - Glsl: ["glsl|frag|vert"], - Gobstones: ["gbs"], - golang: ["go"], + CSS: ["css"], + CSV: ["csv"], + Curly: ["curly"], + Cuttlefish: ["conf"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Django: ["djt|html.djt|dj.html|djhtml"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Edifact: ["edi"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Flix: ["flix"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], + FSL: ["fsl"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], GraphQLSchema: ["gql"], - Groovy: ["groovy"], - HAML: ["haml"], - Handlebars: ["hbs|handlebars|tpl|mustache"], - Haskell: ["hs"], + GROQ: ["groq"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], Haskell_Cabal: ["cabal"], - haXe: ["hx"], - Hjson: ["hjson"], - HTML: ["html|htm|xhtml|vue|we|wpy"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml|we|wpy"], HTML_Elixir: ["eex|html.eex"], - HTML_Ruby: ["erb|rhtml|html.erb"], - INI: ["ini|conf|cfg|prefs"], - Io: ["io"], - Ion: ["ion"], - Jack: ["jack"], - Jade: ["jade|pug"], - Java: ["java"], - JavaScript: ["js|jsm|jsx|cjs|mjs"], - JSON: ["json"], - JSON5: ["json5"], - JSONiq: ["jq"], - JSP: ["jsp"], - JSSM: ["jssm|jssm_state"], - JSX: ["jsx"], - Julia: ["jl"], - Kotlin: ["kt|kts"], - LaTeX: ["tex|latex|ltx|bib"], - Latte: ["latte"], - LESS: ["less"], - Liquid: ["liquid"], - Lisp: ["lisp"], - LiveScript: ["ls"], - Log: ["log"], - LogiQL: ["logic|lql"], - LSL: ["lsl"], - Lua: ["lua"], - LuaPage: ["lp"], - Lucene: ["lucene"], - Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], - Markdown: ["md|markdown"], - Mask: ["mask"], - MATLAB: ["matlab"], - Maze: ["mz"], - MediaWiki: ["wiki|mediawiki"], - MEL: ["mel"], - MIPS: ["s|asm"], - MIXAL: ["mixal"], - MUSHCode: ["mc|mush"], - MySQL: ["mysql"], - Nginx: ["nginx|conf"], - Nim: ["nim"], - Nix: ["nix"], - NSIS: ["nsi|nsh"], - Nunjucks: ["nunjucks|nunjs|nj|njk"], - ObjectiveC: ["m|mm"], - OCaml: ["ml|mli"], - PartiQL: ["partiql|pql"], - Pascal: ["pas|p"], - Perl: ["pl|pm"], - pgSQL: ["pgsql"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Ion: ["ion"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|cjs|mjs"], + JEXL: ["jexl"], + JSON: ["json"], + JSON5: ["json5"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSSM: ["jssm|jssm_state"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + Latte: ["latte"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + LogiQL: ["logic|lql"], + Logtalk: ["lgt"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MediaWiki: ["wiki|mediawiki"], + MEL: ["mel"], + MIPS: ["s|asm"], + MIXAL: ["mixal"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Mariadb: ["mariadb"], + Nasal: ["nas"], + Nginx: ["nginx|conf"], + Nim: ["nim"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + Nunjucks: ["nunjucks|nunjs|nj|njk"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + Odin: ["odin"], + PartiQL: ["partiql|pql"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], PHP_Laravel_blade: ["blade.php"], - PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], - Pig: ["pig"], - Powershell: ["ps1"], - Praat: ["praat|praatscript|psc|proc"], - Prisma: ["prisma"], - Prolog: ["plg|prolog"], - Properties: ["properties"], - Protobuf: ["proto"], - Puppet: ["epp|pp"], - Python: ["py"], - QML: ["qml"], - R: ["r"], - Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], - Razor: ["cshtml|asp"], - RDoc: ["Rd"], - Red: ["red|reds"], - RHTML: ["Rhtml"], - Robot: ["robot|resource"], - RST: ["rst"], - Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], - Rust: ["rs"], - SaC: ["sac"], - SASS: ["sass"], - SCAD: ["scad"], - Scala: ["scala|sbt"], - Scheme: ["scm|sm|rkt|oak|scheme"], - Scrypt: ["scrypt"], - SCSS: ["scss"], - SH: ["sh|bash|^.bashrc"], - SJS: ["sjs"], - Slim: ["slim|skim"], - Smarty: ["smarty|tpl"], - Smithy: ["smithy"], - snippets: ["snippets"], - Soy_Template:["soy"], - Space: ["space"], - SQL: ["sql"], - SQLServer: ["sqlserver"], - Stylus: ["styl|stylus"], - SVG: ["svg"], - Swift: ["swift"], - Tcl: ["tcl"], - Terraform: ["tf", "tfvars", "terragrunt"], - Tex: ["tex"], - Text: ["txt"], - Textile: ["textile"], - Toml: ["toml"], - TSX: ["tsx"], - Twig: ["twig|swig"], - Typescript: ["ts|typescript|str"], - Vala: ["vala"], - VBScript: ["vbs|vb"], - Velocity: ["vm"], - Verilog: ["v|vh|sv|svh"], - VHDL: ["vhd|vhdl"], + Pig: ["pig"], + PLSQL: ["plsql"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prisma: ["prisma"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + PRQL: ["prql"], + Puppet: ["epp|pp"], + Python: ["py"], + QML: ["qml"], + R: ["r"], + Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + Red: ["red|reds"], + RHTML: ["Rhtml"], + Robot: ["robot|resource"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SaC: ["sac"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala|sbt"], + Scheme: ["scm|sm|rkt|oak|scheme"], + Scrypt: ["scrypt"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Slim: ["slim|skim"], + Smarty: ["smarty|tpl"], + Smithy: ["smithy"], + snippets: ["snippets"], + Soy_Template: ["soy"], + Space: ["space"], + SPARQL: ["rq"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Terraform: ["tf", "tfvars", "terragrunt"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSV: ["tsv"], + TSX: ["tsx"], + Turtle: ["ttl"], + Twig: ["twig|swig"], + Typescript: ["ts|mts|cts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], Visualforce: ["vfp|component|page"], - Wollok: ["wlk|wpgm|wtest"], - XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], - XQuery: ["xq"], - YAML: ["yaml|yml"], - Zeek: ["zeek|bro"], - Django: ["html"] + Vue: ["vue"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Zeek: ["zeek|bro"], + Zig: ["zig"] }; - var nameOverrides = { ObjectiveC: "Objective-C", CSharp: "C#", @@ -347,7 +336,6 @@ var nameOverrides = { Perl6: "Perl 6", AutoHotKey: "AutoHotkey / AutoIt" }; - var modesByName = {}; for (var name in supportedModes) { var data = supportedModes[name]; @@ -357,63 +345,73 @@ for (var name in supportedModes) { modesByName[filename] = mode; modes.push(mode); } - -module.exports = { - getModeForPath: getModeForPath, - modes: modes, - modesByName: modesByName -}; +exports.getModeForPath = getModeForPath; +exports.modes = modes; +exports.modesByName = modesByName; }); -define("ace/ext/themelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/themelist",["require","exports","module"], function(require, exports, module){/** + * ## Theme enumeration utility + * + * Provides theme management for the Ace Editor by generating and organizing available themes into + * categorized collections. Automatically maps theme data into structured objects containing theme metadata including + * display captions, theme paths, brightness classification (dark/light), and normalized names. Exports both an + * indexed theme collection and a complete themes array for easy integration with theme selection components + * and configuration systems. + * + * @author + * Matthew Christopher Kastor-Inare III
+ * @module + */ "use strict"; - var themeData = [ - ["Chrome" ], - ["Clouds" ], - ["Crimson Editor" ], - ["Dawn" ], - ["Dreamweaver" ], - ["Eclipse" ], - ["GitHub" ], - ["IPlastic" ], + ["Chrome"], + ["Clouds"], + ["Crimson Editor"], + ["Dawn"], + ["Dreamweaver"], + ["Eclipse"], + ["GitHub Light Default"], + ["GitHub (Legacy)", "github", "light"], + ["IPlastic"], ["Solarized Light"], - ["TextMate" ], - ["Tomorrow" ], - ["XCode" ], + ["TextMate"], + ["Tomorrow"], + ["XCode"], ["Kuroir"], ["KatzenMilch"], - ["SQL Server" ,"sqlserver" , "light"], - ["Ambiance" ,"ambiance" , "dark"], - ["Chaos" ,"chaos" , "dark"], - ["Clouds Midnight" ,"clouds_midnight" , "dark"], - ["Dracula" ,"" , "dark"], - ["Cobalt" ,"cobalt" , "dark"], - ["Gruvbox" ,"gruvbox" , "dark"], - ["Green on Black" ,"gob" , "dark"], - ["idle Fingers" ,"idle_fingers" , "dark"], - ["krTheme" ,"kr_theme" , "dark"], - ["Merbivore" ,"merbivore" , "dark"], - ["Merbivore Soft" ,"merbivore_soft" , "dark"], - ["Mono Industrial" ,"mono_industrial" , "dark"], - ["Monokai" ,"monokai" , "dark"], - ["Nord Dark" ,"nord_dark" , "dark"], - ["One Dark" ,"one_dark" , "dark"], - ["Pastel on dark" ,"pastel_on_dark" , "dark"], - ["Solarized Dark" ,"solarized_dark" , "dark"], - ["Terminal" ,"terminal" , "dark"], - ["Tomorrow Night" ,"tomorrow_night" , "dark"], - ["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"], - ["Tomorrow Night Bright","tomorrow_night_bright" , "dark"], - ["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"], - ["Twilight" ,"twilight" , "dark"], - ["Vibrant Ink" ,"vibrant_ink" , "dark"] + ["SQL Server", "sqlserver", "light"], + ["CloudEditor", "cloud_editor", "light"], + ["Ambiance", "ambiance", "dark"], + ["Chaos", "chaos", "dark"], + ["Clouds Midnight", "clouds_midnight", "dark"], + ["Dracula", "", "dark"], + ["Cobalt", "cobalt", "dark"], + ["Gruvbox", "gruvbox", "dark"], + ["Green on Black", "gob", "dark"], + ["idle Fingers", "idle_fingers", "dark"], + ["krTheme", "kr_theme", "dark"], + ["Merbivore", "merbivore", "dark"], + ["Merbivore Soft", "merbivore_soft", "dark"], + ["Mono Industrial", "mono_industrial", "dark"], + ["Monokai", "monokai", "dark"], + ["Nord Dark", "nord_dark", "dark"], + ["One Dark", "one_dark", "dark"], + ["Pastel on dark", "pastel_on_dark", "dark"], + ["Solarized Dark", "solarized_dark", "dark"], + ["Terminal", "terminal", "dark"], + ["Tomorrow Night", "tomorrow_night", "dark"], + ["Tomorrow Night Blue", "tomorrow_night_blue", "dark"], + ["Tomorrow Night Bright", "tomorrow_night_bright", "dark"], + ["Tomorrow Night 80s", "tomorrow_night_eighties", "dark"], + ["Twilight", "twilight", "dark"], + ["Vibrant Ink", "vibrant_ink", "dark"], + ["GitHub Dark", "github_dark", "dark"], + ["CloudEditor Dark", "cloud_editor_dark", "dark"] ]; - - exports.themesByName = {}; -exports.themes = themeData.map(function(data) { +exports.themes = themeData.map(function (data) { var name = data[1] || data[0].replace(/ /g, "_").toLowerCase(); var theme = { caption: data[0], @@ -427,30 +425,39 @@ exports.themes = themeData.map(function(data) { }); -define("ace/ext/options",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/lib/oop","ace/config","ace/lib/event_emitter","ace/ext/modelist","ace/ext/themelist"], function(require, exports, module) { +define("ace/ext/options",["require","exports","module","ace/ext/settings_menu","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/lib/oop","ace/config","ace/lib/event_emitter","ace/ext/modelist","ace/ext/themelist"], function(require, exports, module){/** + * ## Settings Menu extension + * + * Provides a settings panel for configuring editor options through an interactive UI. + * Creates a tabular interface with grouped configuration options including themes, modes, keybindings, + * font settings, display preferences, and advanced editor behaviors. Supports dynamic option rendering + * with various input types (dropdowns, checkboxes, number inputs, button bars) and real-time updates. + * + * **Usage:** + * ```javascript + * var OptionPanel = require("ace/ext/settings_menu").OptionPanel; + * var panel = new OptionPanel(editor); + * panel.render(); + * ``` + * + * @module + */ "use strict"; - require("./menu_tools/overlay_page"); - var dom = require("../lib/dom"); var oop = require("../lib/oop"); var config = require("../config"); var EventEmitter = require("../lib/event_emitter").EventEmitter; var buildDom = dom.buildDom; - var modelist = require("./modelist"); var themelist = require("./themelist"); - var themes = { Bright: [], Dark: [] }; -themelist.themes.forEach(function(x) { +themelist.themes.forEach(function (x) { themes[x.isDark ? "Dark" : "Bright"].push({ caption: x.caption, value: x.theme }); }); - -var modes = modelist.modes.map(function(x){ - return { caption: x.caption, value: x.mode }; +var modes = modelist.modes.map(function (x) { + return { caption: x.caption, value: x.mode }; }); - - var optionGroups = { Main: { Mode: { @@ -467,11 +474,11 @@ var optionGroups = { type: "buttonBar", path: "keyboardHandler", items: [ - { caption : "Ace", value : null }, - { caption : "Vim", value : "ace/keyboard/vim" }, - { caption : "Emacs", value : "ace/keyboard/emacs" }, - { caption : "Sublime", value : "ace/keyboard/sublime" }, - { caption : "VSCode", value : "ace/keyboard/vscode" } + { caption: "Ace", value: null }, + { caption: "Vim", value: "ace/keyboard/vim" }, + { caption: "Emacs", value: "ace/keyboard/emacs" }, + { caption: "Sublime", value: "ace/keyboard/sublime" }, + { caption: "VSCode", value: "ace/keyboard/vscode" } ] }, "Font Size": { @@ -479,53 +486,53 @@ var optionGroups = { type: "number", defaultValue: 12, defaults: [ - {caption: "12px", value: 12}, - {caption: "24px", value: 24} + { caption: "12px", value: 12 }, + { caption: "24px", value: 24 } ] }, "Soft Wrap": { type: "buttonBar", path: "wrap", items: [ - { caption : "Off", value : "off" }, - { caption : "View", value : "free" }, - { caption : "margin", value : "printMargin" }, - { caption : "40", value : "40" } + { caption: "Off", value: "off" }, + { caption: "View", value: "free" }, + { caption: "margin", value: "printMargin" }, + { caption: "40", value: "40" } ] }, "Cursor Style": { path: "cursorStyle", items: [ - { caption : "Ace", value : "ace" }, - { caption : "Slim", value : "slim" }, - { caption : "Smooth", value : "smooth" }, - { caption : "Smooth And Slim", value : "smooth slim" }, - { caption : "Wide", value : "wide" } + { caption: "Ace", value: "ace" }, + { caption: "Slim", value: "slim" }, + { caption: "Smooth", value: "smooth" }, + { caption: "Smooth And Slim", value: "smooth slim" }, + { caption: "Wide", value: "wide" } ] }, "Folding": { path: "foldStyle", items: [ - { caption : "Manual", value : "manual" }, - { caption : "Mark begin", value : "markbegin" }, - { caption : "Mark begin and end", value : "markbeginend" } + { caption: "Manual", value: "manual" }, + { caption: "Mark begin", value: "markbegin" }, + { caption: "Mark begin and end", value: "markbeginend" } ] }, "Soft Tabs": [{ - path: "useSoftTabs" - }, { - ariaLabel: "Tab Size", - path: "tabSize", - type: "number", - values: [2, 3, 4, 8, 16] - }], + path: "useSoftTabs" + }, { + ariaLabel: "Tab Size", + path: "tabSize", + type: "number", + values: [2, 3, 4, 8, 16] + }], "Overscroll": { type: "buttonBar", path: "scrollPastEnd", items: [ - { caption : "None", value : 0 }, - { caption : "Half", value : 0.5 }, - { caption : "Full", value : 1 } + { caption: "None", value: 0 }, + { caption: "Half", value: 0.5 }, + { caption: "Full", value: 1 } ] } }, @@ -556,6 +563,9 @@ var optionGroups = { "Show Indent Guides": { path: "displayIndentGuides" }, + "Highlight Indent Guides": { + path: "highlightIndentGuides" + }, "Persistent HScrollbar": { path: "hScrollBarAlwaysVisible" }, @@ -578,12 +588,12 @@ var optionGroups = { path: "fixedWidthGutter" }, "Show Print Margin": [{ - path: "showPrintMargin" - }, { - ariaLabel: "Print Margin", - type: "number", - path: "printMarginColumn" - }], + path: "showPrintMargin" + }, { + ariaLabel: "Print Margin", + type: "number", + path: "printMarginColumn" + }], "Indented Soft Wrap": { path: "indentedSoftWrap" }, @@ -599,9 +609,9 @@ var optionGroups = { "Merge Undo Deltas": { path: "mergeUndoDeltas", items: [ - { caption : "Always", value : "always" }, - { caption : "Never", value : "false" }, - { caption : "Timed", value : "true" } + { caption: "Always", value: "always" }, + { caption: "Never", value: "false" }, + { caption: "Timed", value: "true" } ] }, "Elastic Tabstops": { @@ -618,144 +628,148 @@ var optionGroups = { }, "Live Autocompletion": { path: "enableLiveAutocompletion" + }, + "Custom scrollbar": { + path: "customScrollbar" + }, + "Use SVG gutter icons": { + path: "useSvgGutterIcons" + }, + "Annotations for folded lines": { + path: "showFoldedAnnotations" + }, + "Keyboard Accessibility Mode": { + path: "enableKeyboardAccessibility" } } }; - - -var OptionPanel = function(editor, element) { - this.editor = editor; - this.container = element || document.createElement("div"); - this.groups = []; - this.options = {}; -}; - -(function() { - - oop.implement(this, EventEmitter); - - this.add = function(config) { +var OptionPanel = /** @class */ (function () { + function OptionPanel(editor, element) { + this.editor = editor; + this.container = element || document.createElement("div"); + this.groups = []; + this.options = {}; + } + OptionPanel.prototype.add = function (config) { if (config.Main) oop.mixin(optionGroups.Main, config.Main); if (config.More) oop.mixin(optionGroups.More, config.More); }; - - this.render = function() { + OptionPanel.prototype.render = function () { this.container.innerHTML = ""; - buildDom(["table", {role: "presentation", id: "controls"}, + buildDom(["table", { role: "presentation", id: "controls" }, this.renderOptionGroup(optionGroups.Main), - ["tr", null, ["td", {colspan: 2}, - ["table", {role: "presentation", id: "more-controls"}, - this.renderOptionGroup(optionGroups.More) - ] - ]], - ["tr", null, ["td", {colspan: 2}, "version " + config.version]] + ["tr", null, ["td", { colspan: 2 }, + ["table", { role: "presentation", id: "more-controls" }, + this.renderOptionGroup(optionGroups.More) + ] + ]], + ["tr", null, ["td", { colspan: 2 }, "version " + config.version]] ], this.container); }; - - this.renderOptionGroup = function(group) { - return Object.keys(group).map(function(key, i) { + OptionPanel.prototype.renderOptionGroup = function (group) { + return Object.keys(group).map(function (key, i) { var item = group[key]; if (!item.position) item.position = i / 10000; if (!item.label) item.label = key; return item; - }).sort(function(a, b) { + }).sort(function (a, b) { return a.position - b.position; - }).map(function(item) { + }).map(function (item) { return this.renderOption(item.label, item); }, this); }; - - this.renderOptionControl = function(key, option) { + OptionPanel.prototype.renderOptionControl = function (key, option) { var self = this; if (Array.isArray(option)) { - return option.map(function(x) { + return option.map(function (x) { return self.renderOptionControl(key, x); }); } var control; - var value = self.getOption(option); - if (option.values && option.type != "checkbox") { if (typeof option.values == "string") option.values = option.values.split("|"); - option.items = option.values.map(function(v) { + option.items = option.values.map(function (v) { return { value: v, name: v }; }); } - if (option.type == "buttonBar") { - control = ["div", {role: "group", "aria-labelledby": option.path + "-label"}, option.items.map(function(item) { - return ["button", { - value: item.value, - ace_selected_button: value == item.value, - 'aria-pressed': value == item.value, - onclick: function() { - self.setOption(option, item.value); - var nodes = this.parentNode.querySelectorAll("[ace_selected_button]"); - for (var i = 0; i < nodes.length; i++) { - nodes[i].removeAttribute("ace_selected_button"); - nodes[i].setAttribute("aria-pressed", false); - } - this.setAttribute("ace_selected_button", true); - this.setAttribute("aria-pressed", true); - } - }, item.desc || item.caption || item.name]; - })]; - } else if (option.type == "number") { - control = ["input", {type: "number", value: value || option.defaultValue, style:"width:3em", oninput: function() { - self.setOption(option, parseInt(this.value)); - }}]; + control = ["div", { role: "group", "aria-labelledby": option.path + "-label" }, option.items.map(function (item) { + return ["button", { + value: item.value, + ace_selected_button: value == item.value, + 'aria-pressed': value == item.value, + onclick: function () { + self.setOption(option, item.value); + var nodes = this.parentNode.querySelectorAll("[ace_selected_button]"); + for (var i = 0; i < nodes.length; i++) { + nodes[i].removeAttribute("ace_selected_button"); + nodes[i].setAttribute("aria-pressed", false); + } + this.setAttribute("ace_selected_button", true); + this.setAttribute("aria-pressed", true); + } + }, item.desc || item.caption || item.name]; + })]; + } + else if (option.type == "number") { + control = ["input", { type: "number", value: value || option.defaultValue, style: "width:3em", oninput: function () { + self.setOption(option, parseInt(this.value)); + } }]; if (option.ariaLabel) { control[1]["aria-label"] = option.ariaLabel; - } else { + } + else { control[1].id = key; } if (option.defaults) { - control = [control, option.defaults.map(function(item) { - return ["button", {onclick: function() { - var input = this.parentNode.firstChild; - input.value = item.value; - input.oninput(); - }}, item.caption]; - })]; + control = [control, option.defaults.map(function (item) { + return ["button", { onclick: function () { + var input = this.parentNode.firstChild; + input.value = item.value; + input.oninput(); + } }, item.caption]; + })]; } - } else if (option.items) { - var buildItems = function(items) { - return items.map(function(item) { + } + else if (option.items) { + var buildItems = function (items) { + return items.map(function (item) { return ["option", { value: item.value || item.name }, item.desc || item.caption || item.name]; }); }; - - var items = Array.isArray(option.items) + var items = Array.isArray(option.items) ? buildItems(option.items) - : Object.keys(option.items).map(function(key) { - return ["optgroup", {"label": key}, buildItems(option.items[key])]; + : Object.keys(option.items).map(function (key) { + return ["optgroup", { "label": key }, buildItems(option.items[key])]; }); - control = ["select", { id: key, value: value, onchange: function() { - self.setOption(option, this.value); - } }, items]; - } else { + control = ["select", { id: key, value: value, onchange: function () { + self.setOption(option, this.value); + } }, items]; + } + else { if (typeof option.values == "string") option.values = option.values.split("|"); - if (option.values) value = value == option.values[1]; - control = ["input", { type: "checkbox", id: key, checked: value || null, onchange: function() { - var value = this.checked; - if (option.values) value = option.values[value ? 1 : 0]; - self.setOption(option, value); - }}]; + if (option.values) + value = value == option.values[1]; + control = ["input", { type: "checkbox", id: key, checked: value || null, onchange: function () { + var value = this.checked; + if (option.values) + value = option.values[value ? 1 : 0]; + self.setOption(option, value); + } }]; if (option.type == "checkedNumber") { control = [control, []]; } } return control; }; - - this.renderOption = function(key, option) { + OptionPanel.prototype.renderOption = function (key, option) { if (option.path && !option.onchange && !this.editor.$options[option.path]) return; var path = Array.isArray(option) ? option[0].path : option.path; @@ -763,40 +777,62 @@ var OptionPanel = function(editor, element) { var safeKey = "-" + path; var safeId = path + "-label"; var control = this.renderOptionControl(safeKey, option); - return ["tr", {class: "ace_optionsMenuEntry"}, ["td", - ["label", {for: safeKey, id: safeId}, key] - ], ["td", control]]; + return ["tr", { class: "ace_optionsMenuEntry" }, ["td", + ["label", { for: safeKey, id: safeId }, key] + ], ["td", control]]; }; - - this.setOption = function(option, value) { + OptionPanel.prototype.setOption = function (option, value) { if (typeof option == "string") option = this.options[option]; - if (value == "false") value = false; - if (value == "true") value = true; - if (value == "null") value = null; - if (value == "undefined") value = undefined; + if (value == "false") + value = false; + if (value == "true") + value = true; + if (value == "null") + value = null; + if (value == "undefined") + value = undefined; if (typeof value == "string" && parseFloat(value).toString() == value) value = parseFloat(value); if (option.onchange) option.onchange(value); else if (option.path) this.editor.setOption(option.path, value); - this._signal("setOption", {name: option.path, value: value}); + this._signal("setOption", { name: option.path, value: value }); }; - - this.getOption = function(option) { + OptionPanel.prototype.getOption = function (option) { if (option.getValue) return option.getValue(); return this.editor.getOption(option.path); }; - -}).call(OptionPanel.prototype); - + return OptionPanel; +}()); +oop.implement(OptionPanel.prototype, EventEmitter); exports.OptionPanel = OptionPanel; +exports.optionGroups = optionGroups; }); -define("ace/ext/settings_menu",["require","exports","module","ace/ext/options","ace/ext/menu_tools/overlay_page","ace/editor"], function(require, exports, module) { +define("ace/ext/settings_menu",["require","exports","module","ace/ext/options","ace/ext/menu_tools/overlay_page","ace/editor"], function(require, exports, module){/** + * ## Interactive Settings Menu Extension + * + * Provides settings interface for the Ace editor that displays dynamically generated configuration options based on + * the current editor state. The menu appears as an overlay panel allowing users to modify editor options, themes, + * modes, and other settings through an intuitive graphical interface. + * + * **Usage:** + * ```javascript + * editor.showSettingsMenu(); + * ``` + * + * The extension automatically registers the `showSettingsMenu` command and method + * on the editor instance when initialized. + * + * @author + * Matthew Christopher Kastor-Inare III
+ * + * @module + */ "use strict"; var OptionPanel = require("./options").OptionPanel; var overlayPage = require('./menu_tools/overlay_page').overlayPage; @@ -809,12 +845,13 @@ function showSettingsMenu(editor) { options.container.querySelector("select,input,button,checkbox").focus(); } } -module.exports.init = function() { +module.exports.init = function () { var Editor = require("../editor").Editor; - Editor.prototype.showSettingsMenu = function() { + Editor.prototype.showSettingsMenu = function () { showSettingsMenu(this); }; }; + }); (function() { window.require(["ace/ext/settings_menu"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/ext-spellcheck.js b/app/Resources/ui/js/ace/ext-spellcheck.js index 10d3901f..28fb2503 100644 --- a/app/Resources/ui/js/ace/ext-spellcheck.js +++ b/app/Resources/ui/js/ace/ext-spellcheck.js @@ -1,8 +1,18 @@ -define("ace/ext/spellcheck",["require","exports","module","ace/lib/event","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/spellcheck",["require","exports","module","ace/lib/event","ace/editor","ace/config"], function(require, exports, module){/** + * ## Browser spellcheck integration extension for native spelling correction + * + * Provides seamless integration with browser's native spellcheck functionality through context menu interactions. + * Enables right-click spelling suggestions on misspelled words while preserving editor functionality and text input + * handling. The extension bridges browser spellcheck capabilities with the editor's text manipulation system. + * + * **Enable:** `editor.setOption("spellcheck", true)` (enabled by default) + * or configure it during editor initialization in the options object. + * + * @module + */ "use strict"; var event = require("../lib/event"); - -exports.contextMenuHandler = function(e){ +exports.contextMenuHandler = function (e) { var host = e.target; var text = host.textInput.getElement(); if (!host.selection.isEmpty()) @@ -10,7 +20,6 @@ exports.contextMenuHandler = function(e){ var c = host.getCursorPosition(); var r = host.session.getWordRange(c.row, c.column); var w = host.session.getTextRange(r); - host.session.tokenRe.lastIndex = 0; if (!host.session.tokenRe.test(w)) return; @@ -20,14 +29,12 @@ exports.contextMenuHandler = function(e){ text.setSelectionRange(w.length, w.length + 1); text.setSelectionRange(0, 0); text.setSelectionRange(0, w.length); - var afterKeydown = false; event.addListener(text, "keydown", function onKeydown() { event.removeListener(text, "keydown", onKeydown); afterKeydown = true; }); - - host.textInput.setInputHandler(function(newVal) { + host.textInput.setInputHandler(function (newVal) { if (newVal == value) return ''; if (newVal.lastIndexOf(value, 0) === 0) @@ -44,14 +51,13 @@ exports.contextMenuHandler = function(e){ return ""; } } - return newVal; }); }; var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { spellcheck: { - set: function(val) { + set: function (val) { var text = this.textInput.getElement(); text.spellcheck = !!val; if (!val) diff --git a/app/Resources/ui/js/ace/ext-split.js b/app/Resources/ui/js/ace/ext-split.js index ca286bce..501b6556 100644 --- a/app/Resources/ui/js/ace/ext-split.js +++ b/app/Resources/ui/js/ace/ext-split.js @@ -1,124 +1,107 @@ -define("ace/split",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/editor","ace/virtual_renderer","ace/edit_session"], function(require, exports, module) { -"use strict"; - +define("ace/split",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/editor","ace/virtual_renderer","ace/edit_session"], function(require, exports, module){"use strict"; var oop = require("./lib/oop"); var lang = require("./lib/lang"); var EventEmitter = require("./lib/event_emitter").EventEmitter; - var Editor = require("./editor").Editor; var Renderer = require("./virtual_renderer").VirtualRenderer; var EditSession = require("./edit_session").EditSession; - - -var Split = function(container, theme, splits) { +var Split; +Split = function (container, theme, splits) { this.BELOW = 1; this.BESIDE = 0; - this.$container = container; this.$theme = theme; this.$splits = 0; this.$editorCSS = ""; this.$editors = []; this.$orientation = this.BESIDE; - this.setSplits(splits || 1); this.$cEditor = this.$editors[0]; - - - this.on("focus", function(editor) { + this.on("focus", function (editor) { this.$cEditor = editor; }.bind(this)); }; - -(function(){ - +(function () { oop.implement(this, EventEmitter); - - this.$createEditor = function() { + this.$createEditor = function () { var el = document.createElement("div"); el.className = this.$editorCSS; el.style.cssText = "position: absolute; top:0px; bottom:0px"; this.$container.appendChild(el); var editor = new Editor(new Renderer(el, this.$theme)); - - editor.on("focus", function() { + editor.on("focus", function () { this._emit("focus", editor); }.bind(this)); - this.$editors.push(editor); editor.setFontSize(this.$fontSize); return editor; }; - - this.setSplits = function(splits) { + this.setSplits = function (splits) { var editor; if (splits < 1) { throw "The number of splits have to be > 0!"; } - if (splits == this.$splits) { return; - } else if (splits > this.$splits) { + } + else if (splits > this.$splits) { while (this.$splits < this.$editors.length && this.$splits < splits) { editor = this.$editors[this.$splits]; this.$container.appendChild(editor.container); editor.setFontSize(this.$fontSize); - this.$splits ++; + this.$splits++; } while (this.$splits < splits) { this.$createEditor(); - this.$splits ++; + this.$splits++; } - } else { + } + else { while (this.$splits > splits) { editor = this.$editors[this.$splits - 1]; this.$container.removeChild(editor.container); - this.$splits --; + this.$splits--; } } this.resize(); }; - this.getSplits = function() { + this.getSplits = function () { return this.$splits; }; - this.getEditor = function(idx) { + this.getEditor = function (idx) { return this.$editors[idx]; }; - this.getCurrentEditor = function() { + this.getCurrentEditor = function () { return this.$cEditor; }; - this.focus = function() { + this.focus = function () { this.$cEditor.focus(); }; - this.blur = function() { + this.blur = function () { this.$cEditor.blur(); }; - this.setTheme = function(theme) { - this.$editors.forEach(function(editor) { + this.setTheme = function (theme) { + this.$editors.forEach(function (editor) { editor.setTheme(theme); }); }; - this.setKeyboardHandler = function(keybinding) { - this.$editors.forEach(function(editor) { + this.setKeyboardHandler = function (keybinding) { + this.$editors.forEach(function (editor) { editor.setKeyboardHandler(keybinding); }); }; - this.forEach = function(callback, scope) { + this.forEach = function (callback, scope) { this.$editors.forEach(callback, scope); }; - - this.$fontSize = ""; - this.setFontSize = function(size) { + this.setFontSize = function (size) { this.$fontSize = size; - this.forEach(function(editor) { - editor.setFontSize(size); + this.forEach(function (editor) { + editor.setFontSize(size); }); }; - - this.$cloneSession = function(session) { + this.$cloneSession = function (session) { var s = new EditSession(session.getDocument(), session.getMode()); - var undoManager = session.getUndoManager(); s.setUndoManager(undoManager); s.setTabSize(session.getTabSize()); @@ -127,44 +110,41 @@ var Split = function(container, theme, splits) { s.setBreakpoints(session.getBreakpoints()); s.setUseWrapMode(session.getUseWrapMode()); s.setUseWorker(session.getUseWorker()); - s.setWrapLimitRange(session.$wrapLimitRange.min, - session.$wrapLimitRange.max); + s.setWrapLimitRange(session.$wrapLimitRange.min, session.$wrapLimitRange.max); s.$foldData = session.$cloneFoldData(); - return s; }; - this.setSession = function(session, idx) { + this.setSession = function (session, idx) { var editor; if (idx == null) { editor = this.$cEditor; - } else { + } + else { editor = this.$editors[idx]; } - var isUsed = this.$editors.some(function(editor) { - return editor.session === session; + var isUsed = this.$editors.some(function (editor) { + return editor.session === session; }); - if (isUsed) { session = this.$cloneSession(session); } editor.setSession(session); return session; }; - this.getOrientation = function() { + this.getOrientation = function () { return this.$orientation; }; - this.setOrientation = function(orientation) { + this.setOrientation = function (orientation) { if (this.$orientation == orientation) { return; } this.$orientation = orientation; this.resize(); }; - this.resize = function() { + this.resize = function () { var width = this.$container.clientWidth; var height = this.$container.clientHeight; var editor; - if (this.$orientation == this.BESIDE) { var editorWidth = width / this.$splits; for (var i = 0; i < this.$splits; i++) { @@ -175,7 +155,8 @@ var Split = function(container, theme, splits) { editor.container.style.height = height + "px"; editor.resize(); } - } else { + } + else { var editorHeight = height / this.$splits; for (var i = 0; i < this.$splits; i++) { editor = this.$editors[i]; @@ -187,13 +168,28 @@ var Split = function(container, theme, splits) { } } }; - }).call(Split.prototype); - exports.Split = Split; + }); -define("ace/ext/split",["require","exports","module","ace/split"], function(require, exports, module) { +define("ace/ext/split",["require","exports","module","ace/ext/split","ace/split"], function(require, exports, module){/** + * ## Split editor container extension for multiple editor instances + * + * Provides functionality to create and manage multiple editor instances within a single container, + * arranged either horizontally (beside) or vertically (below). Enables synchronized editing sessions + * with shared configurations while maintaining independent cursor positions and selections. + * + * **Usage:** + * ```javascript + * var Split = require("ace/ext/split").Split; + * var split = new Split(container, theme, numberOfSplits); + * split.setOrientation(split.BESIDE); // or split.BELOW + * ``` + * + * @experimental + * @module + */ "use strict"; module.exports = require("../split"); diff --git a/app/Resources/ui/js/ace/ext-static_highlight.js b/app/Resources/ui/js/ace/ext-static_highlight.js index 93b0840b..fe52be58 100644 --- a/app/Resources/ui/js/ace/ext-static_highlight.js +++ b/app/Resources/ui/js/ace/ext-static_highlight.js @@ -1,112 +1,84 @@ -define("ace/ext/static_highlight",["require","exports","module","ace/edit_session","ace/layer/text","ace/config","ace/lib/dom","ace/lib/lang"], function(require, exports, module) { -"use strict"; +define("ace/ext/static-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace_static_highlight {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'Source Code Pro', 'source-code-pro', 'Droid Sans Mono', monospace;\n font-size: 12px;\n white-space: pre-wrap\n}\n\n.ace_static_highlight .ace_gutter {\n width: 2em;\n text-align: right;\n padding: 0 3px 0 0;\n margin-right: 3px;\n contain: none;\n}\n\n.ace_static_highlight.ace_show_gutter .ace_line {\n padding-left: 2.6em;\n}\n\n.ace_static_highlight .ace_line { position: relative; }\n\n.ace_static_highlight .ace_gutter-cell {\n -moz-user-select: -moz-none;\n -khtml-user-select: none;\n -webkit-user-select: none;\n user-select: none;\n top: 0;\n bottom: 0;\n left: 0;\n position: absolute;\n}\n\n\n.ace_static_highlight .ace_gutter-cell:before {\n content: counter(ace_line, decimal);\n counter-increment: ace_line;\n}\n.ace_static_highlight {\n counter-reset: ace_line;\n}\n"; + +}); +define("ace/ext/static_highlight",["require","exports","module","ace/edit_session","ace/layer/text","ace/ext/static-css","ace/config","ace/lib/dom","ace/lib/lang"], function(require, exports, module){/** + * ## Static syntax highlighting extension for code-to-HTML conversion + * + * Transforms code snippets into syntax-highlighted HTML with CSS styling without requiring a live editor instance. + * Uses a simplified DOM implementation to generate standalone HTML output suitable for static content generation, + * documentation, code export, and embedding highlighted code in web pages. Supports automatic language detection + * from CSS classes and custom modes/themes. + * + * @module + */ +"use strict"; var EditSession = require("../edit_session").EditSession; var TextLayer = require("../layer/text").Text; -var baseStyles = ".ace_static_highlight {\ -font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', 'Droid Sans Mono', monospace;\ -font-size: 12px;\ -white-space: pre-wrap\ -}\ -.ace_static_highlight .ace_gutter {\ -width: 2em;\ -text-align: right;\ -padding: 0 3px 0 0;\ -margin-right: 3px;\ -contain: none;\ -}\ -.ace_static_highlight.ace_show_gutter .ace_line {\ -padding-left: 2.6em;\ -}\ -.ace_static_highlight .ace_line { position: relative; }\ -.ace_static_highlight .ace_gutter-cell {\ --moz-user-select: -moz-none;\ --khtml-user-select: none;\ --webkit-user-select: none;\ -user-select: none;\ -top: 0;\ -bottom: 0;\ -left: 0;\ -position: absolute;\ -}\ -.ace_static_highlight .ace_gutter-cell:before {\ -content: counter(ace_line, decimal);\ -counter-increment: ace_line;\ -}\ -.ace_static_highlight {\ -counter-reset: ace_line;\ -}\ -"; +var baseStyles = require("./static-css"); var config = require("../config"); var dom = require("../lib/dom"); var escapeHTML = require("../lib/lang").escapeHTML; - -function Element(type) { - this.type = type; - this.style = {}; - this.textContent = ""; -} -Element.prototype.cloneNode = function() { - return this; -}; -Element.prototype.appendChild = function(child) { - this.textContent += child.toString(); -}; -Element.prototype.toString = function() { - var stringBuilder = []; - if (this.type != "fragment") { - stringBuilder.push("<", this.type); - if (this.className) - stringBuilder.push(" class='", this.className, "'"); - var styleStr = []; - for (var key in this.style) { - styleStr.push(key, ":", this.style[key]); - } - if (styleStr.length) - stringBuilder.push(" style='", styleStr.join(""), "'"); - stringBuilder.push(">"); - } - - if (this.textContent) { - stringBuilder.push(this.textContent); +var Element = /** @class */ (function () { + function Element(type) { this.className; + this.type = type; + this.style = {}; + this.textContent = ""; } - - if (this.type != "fragment") { - stringBuilder.push(""); - } - - return stringBuilder.join(""); -}; - - + Element.prototype.cloneNode = function () { + return this; + }; + Element.prototype.appendChild = function (child) { + this.textContent += child.toString(); + }; + Element.prototype.toString = function () { + var stringBuilder = []; + if (this.type != "fragment") { + stringBuilder.push("<", this.type); + if (this.className) + stringBuilder.push(" class='", this.className, "'"); + var styleStr = []; + for (var key in this.style) { + styleStr.push(key, ":", this.style[key]); + } + if (styleStr.length) + stringBuilder.push(" style='", styleStr.join(""), "'"); + stringBuilder.push(">"); + } + if (this.textContent) { + stringBuilder.push(this.textContent); + } + if (this.type != "fragment") { + stringBuilder.push(""); + } + return stringBuilder.join(""); + }; + return Element; +}()); var simpleDom = { - createTextNode: function(textContent, element) { + createTextNode: function (/** @type {string} */ textContent, /** @type {any} */ element) { return escapeHTML(textContent); }, - createElement: function(type) { + createElement: function (/** @type {string} */ type) { return new Element(type); }, - createFragment: function() { + createFragment: function () { return new Element("fragment"); } }; - -var SimpleTextLayer = function() { +var SimpleTextLayer = function () { this.config = {}; this.dom = simpleDom; }; SimpleTextLayer.prototype = TextLayer.prototype; - -var highlight = function(el, opts, callback) { +var highlight = function (el, opts, callback) { var m = el.className.match(/lang-(\w+)/); var mode = opts.mode || m && ("ace/mode/" + m[1]); if (!mode) return false; var theme = opts.theme || "ace/theme/textmate"; - var data = ""; var nodes = []; - if (el.firstElementChild) { var textLen = 0; for (var i = 0; i < el.childNodes.length; i++) { @@ -114,18 +86,19 @@ var highlight = function(el, opts, callback) { if (ch.nodeType == 3) { textLen += ch.data.length; data += ch.data; - } else { + } + else { nodes.push(textLen, ch); } } - } else { + } + else { data = el.textContent; if (opts.trim) data = data.trim(); } - highlight.render(data, mode, theme, opts.firstLineNumber, !opts.showGutter, function (highlighted) { - dom.importCssString(highlighted.css, "ace_highlight"); + dom.importCssString(highlighted.css, "ace_highlight", true); el.innerHTML = highlighted.html; var container = el.firstChild.firstChild; for (var i = 0; i < nodes.length; i += 2) { @@ -137,12 +110,12 @@ var highlight = function(el, opts, callback) { callback && callback(); }); }; -highlight.render = function(input, mode, theme, lineStart, disableGutter, callback) { +highlight.render = function (input, mode, theme, lineStart, disableGutter, callback) { var waiting = 1; var modeCache = EditSession.prototype.$modes; if (typeof theme == "string") { waiting++; - config.loadModule(['theme', theme], function(m) { + config.loadModule(['theme', theme], function (m) { theme = m; --waiting || done(); }); @@ -154,53 +127,46 @@ highlight.render = function(input, mode, theme, lineStart, disableGutter, callba } if (typeof mode == "string") { waiting++; - config.loadModule(['mode', mode], function(m) { - if (!modeCache[mode] || modeOptions) - modeCache[mode] = new m.Mode(modeOptions); - mode = modeCache[mode]; + config.loadModule(['mode', mode], function (m) { + if (!modeCache[ /**@type{string}*/(mode)] || modeOptions) + modeCache[ /**@type{string}*/(mode)] = new m.Mode(modeOptions); + mode = modeCache[ /**@type{string}*/(mode)]; --waiting || done(); }); } function done() { - var result = highlight.renderSync(input, mode, theme, lineStart, disableGutter); + var result = highlight.renderSync(input, mode, /**@type{Theme}*/ (theme), lineStart, disableGutter); return callback ? callback(result) : result; } return --waiting || done(); }; -highlight.renderSync = function(input, mode, theme, lineStart, disableGutter) { +highlight.renderSync = function (input, mode, theme, lineStart, disableGutter) { lineStart = parseInt(lineStart || 1, 10); - var session = new EditSession(""); session.setUseWorker(false); session.setMode(mode); - var textLayer = new SimpleTextLayer(); textLayer.setSession(session); - Object.keys(textLayer.$tabStrings).forEach(function(k) { + Object.keys(textLayer.$tabStrings).forEach(function (k) { if (typeof textLayer.$tabStrings[k] == "string") { var el = simpleDom.createFragment(); el.textContent = textLayer.$tabStrings[k]; textLayer.$tabStrings[k] = el; } }); - session.setValue(input); - var length = session.getLength(); - + var length = session.getLength(); var outerEl = simpleDom.createElement("div"); outerEl.className = theme.cssClass; - var innerEl = simpleDom.createElement("div"); innerEl.className = "ace_static_highlight" + (disableGutter ? "" : " ace_show_gutter"); innerEl.style["counter-reset"] = "ace_line " + (lineStart - 1); - for (var ix = 0; ix < length; ix++) { var lineEl = simpleDom.createElement("div"); lineEl.className = "ace_line"; - if (!disableGutter) { var gutterEl = simpleDom.createElement("span"); - gutterEl.className ="ace_gutter ace_gutter-cell"; + gutterEl.className = "ace_gutter ace_gutter-cell"; gutterEl.textContent = ""; lineEl.appendChild(gutterEl); } @@ -209,16 +175,15 @@ highlight.renderSync = function(input, mode, theme, lineStart, disableGutter) { innerEl.appendChild(lineEl); } outerEl.appendChild(innerEl); - return { css: baseStyles + theme.cssText, html: outerEl.toString(), session: session }; }; - module.exports = highlight; module.exports.highlight = highlight; + }); (function() { window.require(["ace/ext/static_highlight"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/ext-statusbar.js b/app/Resources/ui/js/ace/ext-statusbar.js index 936cc4fd..f8907928 100644 --- a/app/Resources/ui/js/ace/ext-statusbar.js +++ b/app/Resources/ui/js/ace/ext-statusbar.js @@ -1,49 +1,56 @@ -define("ace/ext/statusbar",["require","exports","module","ace/lib/dom","ace/lib/lang"], function(require, exports, module) { +define("ace/ext/statusbar",["require","exports","module","ace/ext/statusbar","ace/lib/dom","ace/lib/lang"], function(require, exports, module){/** + * ## Status bar extension for displaying editor state information + * + * Provides a lightweight status indicator that displays real-time information about the editor state including + * cursor position, selection details, recording status, and keyboard binding information. The status bar + * automatically updates on editor events and renders as an inline element that can be embedded in any parent container. + * + * **Usage:** + * ```javascript + * var StatusBar = require("ace/ext/statusbar").StatusBar; + * var statusBar = new StatusBar(editor, parentElement); + * ``` + * + * @module + */ "use strict"; var dom = require("../lib/dom"); var lang = require("../lib/lang"); - -var StatusBar = function(editor, parentNode) { - this.element = dom.createElement("div"); - this.element.className = "ace_status-indicator"; - this.element.style.cssText = "display: inline-block;"; - parentNode.appendChild(this.element); - - var statusUpdate = lang.delayedCall(function(){ - this.updateStatus(editor); - }.bind(this)).schedule.bind(null, 100); - - editor.on("changeStatus", statusUpdate); - editor.on("changeSelection", statusUpdate); - editor.on("keyboardActivity", statusUpdate); -}; - -(function(){ - this.updateStatus = function(editor) { +var StatusBar = /** @class */ (function () { + function StatusBar(editor, parentNode) { + this.element = dom.createElement("div"); + this.element.className = "ace_status-indicator"; + this.element.style.cssText = "display: inline-block;"; + parentNode.appendChild(this.element); + var statusUpdate = lang.delayedCall(function () { + this.updateStatus(editor); + }.bind(this)).schedule.bind(null, 100); + editor.on("changeStatus", statusUpdate); + editor.on("changeSelection", statusUpdate); + editor.on("keyboardActivity", statusUpdate); + } + StatusBar.prototype.updateStatus = function (editor) { var status = []; function add(str, separator) { str && status.push(str, separator || "|"); } - add(editor.keyBinding.getStatusText(editor)); if (editor.commands.recording) add("REC"); - var sel = editor.selection; var c = sel.lead; - if (!sel.isEmpty()) { var r = editor.getSelectionRange(); - add("(" + (r.end.row - r.start.row) + ":" +(r.end.column - r.start.column) + ")", " "); + add("(" + (r.end.row - r.start.row) + ":" + (r.end.column - r.start.column) + ")", " "); } - add(c.row + ":" + c.column, " "); + add(c.row + ":" + c.column, " "); if (sel.rangeCount) add("[" + sel.rangeCount + "]", " "); status.pop(); this.element.textContent = status.join(""); }; -}).call(StatusBar.prototype); - + return StatusBar; +}()); exports.StatusBar = StatusBar; }); (function() { diff --git a/app/Resources/ui/js/ace/ext-textarea.js b/app/Resources/ui/js/ace/ext-textarea.js index c4bc96bd..0a541c47 100644 --- a/app/Resources/ui/js/ace/ext-textarea.js +++ b/app/Resources/ui/js/ace/ext-textarea.js @@ -1,55 +1,67 @@ -define("ace/ext/textarea",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/net","ace/ace"], function(require, exports, module) { +define("ace/ext/textarea",["require","exports","module","ace/ext/textarea","ace/lib/event","ace/lib/useragent","ace/ace"], function(require, exports, module){/** + * ## Textarea transformation extension + * + * Transforms HTML textarea elements into fully-featured Ace editor instances while maintaining form compatibility + * and providing an interactive settings panel. Handles automatic resizing, form submission integration, and + * preserves the original textarea's styling properties. Includes a visual settings interface for configuring + * editor options like themes, modes, keybindings, and display preferences through an overlay panel. + * + * **Usage:** + * ```javascript + * var ace = require("ace/ext/textarea"); + * var editor = ace.transformTextarea(textareaElement, { + * mode: "javascript", + * theme: "monokai", + * wrap: true + * }); + * ``` + * + * @module + */ "use strict"; - var event = require("../lib/event"); var UA = require("../lib/useragent"); -var net = require("../lib/net"); var ace = require("../ace"); - module.exports = exports = ace; -var getCSSProperty = function(element, container, property) { +var getCSSProperty = function (element, container, property) { var ret = element.style[property]; - if (!ret) { if (window.getComputedStyle) { ret = window.getComputedStyle(element, '').getPropertyValue(property); - } else { + } + else { ret = element.currentStyle[property]; } } - if (!ret || ret == 'auto' || ret == 'intrinsic') { ret = container.style[property]; } return ret; }; - function applyStyles(elm, styles) { for (var style in styles) { elm.style[style] = styles[style]; } } - function setupContainer(element, getValue) { if (element.type != 'textarea') { throw new Error("Textarea required!"); } - var parentNode = element.parentNode; var container = document.createElement('div'); - var resizeEvent = function() { + var resizeEvent = function () { var style = 'position:relative;'; [ 'margin-top', 'margin-left', 'margin-right', 'margin-bottom' - ].forEach(function(item) { + ].forEach(function (item) { style += item + ':' + - getCSSProperty(element, container, item) + ';'; + getCSSProperty(element, container, item) + ';'; }); var width = getCSSProperty(element, container, 'width') || (element.clientWidth + "px"); - var height = getCSSProperty(element, container, 'height') || (element.clientHeight + "px"); + var height = getCSSProperty(element, container, 'height') || (element.clientHeight + "px"); style += 'height:' + height + ';width:' + width + ';'; style += 'display:inline-block;'; - container.setAttribute('style', style); + container.style.cssText = style; }; event.addListener(window, 'resize', resizeEvent); resizeEvent(); @@ -57,7 +69,7 @@ function setupContainer(element, getValue) { while (parentNode !== document) { if (parentNode.tagName.toUpperCase() === 'FORM') { var oldSumit = parentNode.onsubmit; - parentNode.onsubmit = function(evt) { + parentNode.onsubmit = function (evt) { element.value = getValue(); if (oldSumit) { oldSumit.call(this, evt); @@ -69,11 +81,10 @@ function setupContainer(element, getValue) { } return container; } - -exports.transformTextarea = function(element, options) { +exports.transformTextarea = function (element, options) { var isFocused = element.autofocus || document.activeElement == element; var session; - var container = setupContainer(element, function() { + var container = setupContainer(element, function () { return session.getValue(); }); element.style.display = 'none'; @@ -88,7 +99,6 @@ exports.transformTextarea = function(element, options) { position: "absolute" }); container.appendChild(editorDiv); - var settingOpener = document.createElement("div"); applyStyles(settingOpener, { position: "absolute", @@ -99,7 +109,6 @@ exports.transformTextarea = function(element, options) { borderColor: "lightblue gray gray #ceade6", zIndex: 101 }); - var settingDiv = document.createElement("div"); var settingDivStyles = { top: "0px", @@ -117,72 +126,57 @@ exports.transformTextarea = function(element, options) { }; if (!UA.isOldIE) { settingDivStyles.backgroundColor = "rgba(0, 0, 0, 0.6)"; - } else { + } + else { settingDivStyles.backgroundColor = "#333"; } - applyStyles(settingDiv, settingDivStyles); container.appendChild(settingDiv); - options = options || exports.defaultOptions; var editor = ace.edit(editorDiv); session = editor.getSession(); - session.setValue(element.value || element.innerHTML); if (isFocused) editor.focus(); container.appendChild(settingOpener); setupApi(editor, editorDiv, settingDiv, ace, options); setupSettingPanel(settingDiv, settingOpener, editor); - var state = ""; - event.addListener(settingOpener, "mousemove", function(e) { + event.addListener(settingOpener, "mousemove", function (e) { var rect = this.getBoundingClientRect(); var x = e.clientX - rect.left, y = e.clientY - rect.top; - if (x + y < (rect.width + rect.height)/2) { + if (x + y < (rect.width + rect.height) / 2) { this.style.cursor = "pointer"; state = "toggle"; - } else { + } + else { state = "resize"; this.style.cursor = "nw-resize"; } }); - - event.addListener(settingOpener, "mousedown", function(e) { + event.addListener(settingOpener, "mousedown", function (e) { e.preventDefault(); if (state == "toggle") { editor.setDisplaySettings(); return; } - container.style.zIndex = 100000; + container.style.zIndex = "100000"; var rect = container.getBoundingClientRect(); - var startX = rect.width + rect.left - e.clientX; - var startY = rect.height + rect.top - e.clientY; - event.capture(settingOpener, function(e) { + var startX = rect.width + rect.left - e.clientX; + var startY = rect.height + rect.top - e.clientY; + event.capture(settingOpener, function (e) { container.style.width = e.clientX - rect.left + startX + "px"; container.style.height = e.clientY - rect.top + startY + "px"; editor.resize(); - }, function() {}); + }, function () { }); }); - return editor; }; - -function load(url, module, callback) { - net.loadScript(url, function() { - require([module], callback); - }); -} - function setupApi(editor, editorDiv, settingDiv, ace, options) { - var session = editor.getSession(); - var renderer = editor.renderer; - function toBool(value) { return value === "true" || value == true; } - - editor.setDisplaySettings = function(display) { + editor.setDisplaySettings = function (display) { if (display == null) display = settingDiv.style.display == "none"; if (display) { @@ -192,21 +186,21 @@ function setupApi(editor, editorDiv, settingDiv, ace, options) { editor.removeListener("focus", onFocus); settingDiv.style.display = "none"; }); - } else { + } + else { editor.focus(); } }; - editor.$setOption = editor.setOption; editor.$getOption = editor.getOption; - editor.setOption = function(key, value) { + editor.setOption = function (key, value) { switch (key) { case "mode": editor.$setOption("mode", "ace/mode/" + value); - break; + break; case "theme": editor.$setOption("theme", "ace/theme/" + value); - break; + break; case "keybindings": switch (value) { case "vim": @@ -218,28 +212,23 @@ function setupApi(editor, editorDiv, settingDiv, ace, options) { default: editor.setKeyboardHandler(null); } - break; - + break; case "wrap": case "fontSize": editor.$setOption(key, value); - break; - + break; default: editor.$setOption(key, toBool(value)); } }; - - editor.getOption = function(key) { + editor.getOption = function (key) { switch (key) { case "mode": return editor.$getOption("mode").substr("ace/mode/".length); - break; - + break; case "theme": return editor.$getOption("theme").substr("ace/theme/".length); - break; - + break; case "keybindings": var value = editor.getKeyboardHandler(); switch (value && value.$id) { @@ -250,78 +239,73 @@ function setupApi(editor, editorDiv, settingDiv, ace, options) { default: return "ace"; } - break; - + break; default: return editor.$getOption(key); } }; - editor.setOptions(options); return editor; } - function setupSettingPanel(settingDiv, settingOpener, editor) { var BOOL = null; - var desc = { - mode: "Mode:", - wrap: "Soft Wrap:", - theme: "Theme:", - fontSize: "Font Size:", - showGutter: "Display Gutter:", - keybindings: "Keyboard", + mode: "Mode:", + wrap: "Soft Wrap:", + theme: "Theme:", + fontSize: "Font Size:", + showGutter: "Display Gutter:", + keybindings: "Keyboard", showPrintMargin: "Show Print Margin:", - useSoftTabs: "Use Soft Tabs:", - showInvisibles: "Show Invisibles" + useSoftTabs: "Use Soft Tabs:", + showInvisibles: "Show Invisibles" }; - var optionValues = { mode: { - text: "Plain", + text: "Plain", javascript: "JavaScript", - xml: "XML", - html: "HTML", - css: "CSS", - scss: "SCSS", - python: "Python", - php: "PHP", - java: "Java", - ruby: "Ruby", - c_cpp: "C/C++", - coffee: "CoffeeScript", - json: "json", - perl: "Perl", - clojure: "Clojure", - ocaml: "OCaml", - csharp: "C#", - haxe: "haXe", - svg: "SVG", - textile: "Textile", - groovy: "Groovy", - liquid: "Liquid", - Scala: "Scala" + xml: "XML", + html: "HTML", + css: "CSS", + scss: "SCSS", + python: "Python", + php: "PHP", + java: "Java", + ruby: "Ruby", + c_cpp: "C/C++", + coffee: "CoffeeScript", + json: "json", + perl: "Perl", + clojure: "Clojure", + ocaml: "OCaml", + csharp: "C#", + haxe: "haXe", + svg: "SVG", + textile: "Textile", + groovy: "Groovy", + liquid: "Liquid", + Scala: "Scala" }, theme: { - clouds: "Clouds", - clouds_midnight: "Clouds Midnight", - cobalt: "Cobalt", - crimson_editor: "Crimson Editor", - dawn: "Dawn", - gob: "Green on Black", - eclipse: "Eclipse", - idle_fingers: "Idle Fingers", - kr_theme: "Kr Theme", - merbivore: "Merbivore", - merbivore_soft: "Merbivore Soft", - mono_industrial: "Mono Industrial", - monokai: "Monokai", - pastel_on_dark: "Pastel On Dark", - solarized_dark: "Solarized Dark", - solarized_light: "Solarized Light", - textmate: "Textmate", - twilight: "Twilight", - vibrant_ink: "Vibrant Ink" + clouds: "Clouds", + clouds_midnight: "Clouds Midnight", + cobalt: "Cobalt", + crimson_editor: "Crimson Editor", + dawn: "Dawn", + gob: "Green on Black", + eclipse: "Eclipse", + idle_fingers: "Idle Fingers", + kr_theme: "Kr Theme", + merbivore: "Merbivore", + merbivore_soft: "Merbivore Soft", + mono_industrial: "Mono Industrial", + monokai: "Monokai", + pastel_on_dark: "Pastel On Dark", + solarized_dark: "Solarized Dark", + solarized_light: "Solarized Light", + textmate: "Textmate", + twilight: "Twilight", + vibrant_ink: "Vibrant Ink" }, showGutter: BOOL, fontSize: { @@ -332,48 +316,37 @@ function setupSettingPanel(settingDiv, settingOpener, editor) { "16px": "16px" }, wrap: { - off: "Off", - 40: "40", - 80: "80", - free: "Free" + off: "Off", + 40: "40", + 80: "80", + free: "Free" }, keybindings: { ace: "ace", vim: "vim", emacs: "emacs" }, - showPrintMargin: BOOL, - useSoftTabs: BOOL, - showInvisibles: BOOL + showPrintMargin: BOOL, + useSoftTabs: BOOL, + showInvisibles: BOOL }; - var table = []; table.push(""); - function renderOption(builder, option, obj, cValue) { if (!obj) { - builder.push( - "" - ); + builder.push(""); return; } builder.push(""); } - for (var option in exports.defaultOptions) { table.push(""); table.push("
SettingValue
", desc[option], ""); @@ -382,12 +355,11 @@ function setupSettingPanel(settingDiv, settingOpener, editor) { } table.push("
"); settingDiv.innerHTML = table.join(""); - - var onChange = function(e) { + var onChange = function (e) { var select = e.currentTarget; editor.setOption(select.title, select.value); }; - var onClick = function(e) { + var onClick = function (e) { var cb = e.currentTarget; editor.setOption(cb.title, cb.checked); }; @@ -397,27 +369,25 @@ function setupSettingPanel(settingDiv, settingOpener, editor) { var cbs = settingDiv.getElementsByTagName("input"); for (var i = 0; i < cbs.length; i++) cbs[i].onclick = onClick; - - var button = document.createElement("input"); button.type = "button"; button.value = "Hide"; - event.addListener(button, "click", function() { + event.addListener(button, "click", function () { editor.setDisplaySettings(false); }); settingDiv.appendChild(button); settingDiv.hideButton = button; } exports.defaultOptions = { - mode: "javascript", - theme: "textmate", - wrap: "off", - fontSize: "12px", - showGutter: "false", - keybindings: "ace", - showPrintMargin: "false", - useSoftTabs: "true", - showInvisibles: "false" + mode: "javascript", + theme: "textmate", + wrap: "off", + fontSize: "12px", + showGutter: "false", + keybindings: "ace", + showPrintMargin: "false", + useSoftTabs: "true", + showInvisibles: "false" }; }); (function() { diff --git a/app/Resources/ui/js/ace/ext-themelist.js b/app/Resources/ui/js/ace/ext-themelist.js index 6412884d..87fb0bfc 100644 --- a/app/Resources/ui/js/ace/ext-themelist.js +++ b/app/Resources/ui/js/ace/ext-themelist.js @@ -1,51 +1,64 @@ -define("ace/ext/themelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/themelist",["require","exports","module"], function(require, exports, module){/** + * ## Theme enumeration utility + * + * Provides theme management for the Ace Editor by generating and organizing available themes into + * categorized collections. Automatically maps theme data into structured objects containing theme metadata including + * display captions, theme paths, brightness classification (dark/light), and normalized names. Exports both an + * indexed theme collection and a complete themes array for easy integration with theme selection components + * and configuration systems. + * + * @author + * Matthew Christopher Kastor-Inare III
+ * @module + */ "use strict"; - var themeData = [ - ["Chrome" ], - ["Clouds" ], - ["Crimson Editor" ], - ["Dawn" ], - ["Dreamweaver" ], - ["Eclipse" ], - ["GitHub" ], - ["IPlastic" ], + ["Chrome"], + ["Clouds"], + ["Crimson Editor"], + ["Dawn"], + ["Dreamweaver"], + ["Eclipse"], + ["GitHub Light Default"], + ["GitHub (Legacy)", "github", "light"], + ["IPlastic"], ["Solarized Light"], - ["TextMate" ], - ["Tomorrow" ], - ["XCode" ], + ["TextMate"], + ["Tomorrow"], + ["XCode"], ["Kuroir"], ["KatzenMilch"], - ["SQL Server" ,"sqlserver" , "light"], - ["Ambiance" ,"ambiance" , "dark"], - ["Chaos" ,"chaos" , "dark"], - ["Clouds Midnight" ,"clouds_midnight" , "dark"], - ["Dracula" ,"" , "dark"], - ["Cobalt" ,"cobalt" , "dark"], - ["Gruvbox" ,"gruvbox" , "dark"], - ["Green on Black" ,"gob" , "dark"], - ["idle Fingers" ,"idle_fingers" , "dark"], - ["krTheme" ,"kr_theme" , "dark"], - ["Merbivore" ,"merbivore" , "dark"], - ["Merbivore Soft" ,"merbivore_soft" , "dark"], - ["Mono Industrial" ,"mono_industrial" , "dark"], - ["Monokai" ,"monokai" , "dark"], - ["Nord Dark" ,"nord_dark" , "dark"], - ["One Dark" ,"one_dark" , "dark"], - ["Pastel on dark" ,"pastel_on_dark" , "dark"], - ["Solarized Dark" ,"solarized_dark" , "dark"], - ["Terminal" ,"terminal" , "dark"], - ["Tomorrow Night" ,"tomorrow_night" , "dark"], - ["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"], - ["Tomorrow Night Bright","tomorrow_night_bright" , "dark"], - ["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"], - ["Twilight" ,"twilight" , "dark"], - ["Vibrant Ink" ,"vibrant_ink" , "dark"] + ["SQL Server", "sqlserver", "light"], + ["CloudEditor", "cloud_editor", "light"], + ["Ambiance", "ambiance", "dark"], + ["Chaos", "chaos", "dark"], + ["Clouds Midnight", "clouds_midnight", "dark"], + ["Dracula", "", "dark"], + ["Cobalt", "cobalt", "dark"], + ["Gruvbox", "gruvbox", "dark"], + ["Green on Black", "gob", "dark"], + ["idle Fingers", "idle_fingers", "dark"], + ["krTheme", "kr_theme", "dark"], + ["Merbivore", "merbivore", "dark"], + ["Merbivore Soft", "merbivore_soft", "dark"], + ["Mono Industrial", "mono_industrial", "dark"], + ["Monokai", "monokai", "dark"], + ["Nord Dark", "nord_dark", "dark"], + ["One Dark", "one_dark", "dark"], + ["Pastel on dark", "pastel_on_dark", "dark"], + ["Solarized Dark", "solarized_dark", "dark"], + ["Terminal", "terminal", "dark"], + ["Tomorrow Night", "tomorrow_night", "dark"], + ["Tomorrow Night Blue", "tomorrow_night_blue", "dark"], + ["Tomorrow Night Bright", "tomorrow_night_bright", "dark"], + ["Tomorrow Night 80s", "tomorrow_night_eighties", "dark"], + ["Twilight", "twilight", "dark"], + ["Vibrant Ink", "vibrant_ink", "dark"], + ["GitHub Dark", "github_dark", "dark"], + ["CloudEditor Dark", "cloud_editor_dark", "dark"] ]; - - exports.themesByName = {}; -exports.themes = themeData.map(function(data) { +exports.themes = themeData.map(function (data) { var name = data[1] || data[0].replace(/ /g, "_").toLowerCase(); var theme = { caption: data[0], diff --git a/app/Resources/ui/js/ace/ext-whitespace.js b/app/Resources/ui/js/ace/ext-whitespace.js index f6d45930..c04738d7 100644 --- a/app/Resources/ui/js/ace/ext-whitespace.js +++ b/app/Resources/ui/js/ace/ext-whitespace.js @@ -1,8 +1,15 @@ -define("ace/ext/whitespace",["require","exports","module","ace/lib/lang"], function(require, exports, module) { +define("ace/ext/whitespace",["require","exports","module","ace/lib/lang"], function(require, exports, module){/** + * ## Whitespace management and indentation utilities extension + * + * Provides whitespace handling capabilities including automatic indentation detection, trailing whitespace trimming, + * and indentation format conversion. Analyzes code patterns to determine optimal tab settings and offers commands for + * maintaining consistent code formatting across different indentation styles (spaces vs. tabs) and sizes. + * + * @module + */ "use strict"; - var lang = require("../lib/lang"); -exports.$detectIndentation = function(lines, fallback) { +exports.$detectIndentation = function (lines, fallback) { var stats = []; var changes = []; var tabIndents = 0; @@ -12,17 +19,16 @@ exports.$detectIndentation = function(lines, fallback) { var line = lines[i]; if (!/^\s*[^*+\-\s]/.test(line)) continue; - if (line[0] == "\t") { tabIndents++; prevSpaces = -Number.MAX_VALUE; - } else { + } + else { var spaces = line.match(/^ */)[0].length; if (spaces && line[spaces] != "\t") { var diff = spaces - prevSpaces; - if (diff > 0 && !(prevSpaces%diff) && !(spaces%diff)) + if (diff > 0 && !(prevSpaces % diff) && !(spaces % diff)) changes[diff] = (changes[diff] || 0) + 1; - stats[spaces] = (stats[spaces] || 0) + 1; } prevSpaces = spaces; @@ -30,17 +36,14 @@ exports.$detectIndentation = function(lines, fallback) { while (i < max && line[line.length - 1] == "\\") line = lines[i++]; } - function getScore(indent) { var score = 0; for (var i = indent; i < stats.length; i += indent) score += stats[i] || 0; return score; } - - var changesTotal = changes.reduce(function(a,b){return a+b;}, 0); - - var first = {score: 0, length: 0}; + var changesTotal = changes.reduce(function (a, b) { return a + b; }, 0); + var first = { score: 0, length: 0 }; var spaceIndents = 0; for (var i = 1; i < 12; i++) { var score = getScore(i); @@ -49,110 +52,97 @@ exports.$detectIndentation = function(lines, fallback) { score = stats[1] ? 0.9 : 0.8; if (!stats.length) score = 0; - } else + } + else score /= spaceIndents; - if (changes[i]) score += changes[i] / changesTotal; - if (score > first.score) - first = {score: score, length: i}; + first = { score: score, length: i }; } - if (first.score && first.score > 1.4) var tabLength = first.length; - if (tabIndents > spaceIndents + 1) { if (tabLength == 1 || spaceIndents < tabIndents / 4 || first.score < 1.8) tabLength = undefined; - return {ch: "\t", length: tabLength}; + return { ch: "\t", length: tabLength }; } if (spaceIndents > tabIndents + 1) - return {ch: " ", length: tabLength}; + return { ch: " ", length: tabLength }; }; - -exports.detectIndentation = function(session) { +exports.detectIndentation = function (session) { var lines = session.getLines(0, 1000); var indent = exports.$detectIndentation(lines) || {}; - if (indent.ch) session.setUseSoftTabs(indent.ch == " "); - if (indent.length) session.setTabSize(indent.length); return indent; }; -exports.trimTrailingSpace = function(session, options) { +exports.trimTrailingSpace = function (session, options) { var doc = session.getDocument(); var lines = doc.getAllLines(); - var min = options && options.trimEmpty ? -1 : 0; var cursors = [], ci = -1; if (options && options.keepCursorPosition) { if (session.selection.rangeCount) { - session.selection.rangeList.ranges.forEach(function(x, i, ranges) { - var next = ranges[i + 1]; - if (next && next.cursor.row == x.cursor.row) - return; - cursors.push(x.cursor); + session.selection.rangeList.ranges.forEach(function (x, i, ranges) { + var next = ranges[i + 1]; + if (next && next.cursor.row == x.cursor.row) + return; + cursors.push(x.cursor); }); - } else { + } + else { cursors.push(session.selection.getCursor()); } ci = 0; } var cursorRow = cursors[ci] && cursors[ci].row; - - for (var i = 0, l=lines.length; i < l; i++) { + for (var i = 0, l = lines.length; i < l; i++) { var line = lines[i]; var index = line.search(/\s+$/); - if (i == cursorRow) { if (index < cursors[ci].column && index > min) - index = cursors[ci].column; + index = cursors[ci].column; ci++; cursorRow = cursors[ci] ? cursors[ci].row : -1; } - if (index > min) doc.removeInLine(i, index, line.length); } }; - -exports.convertIndentation = function(session, ch, len) { +exports.convertIndentation = function (session, ch, len) { var oldCh = session.getTabString()[0]; var oldLen = session.getTabSize(); - if (!len) len = oldLen; - if (!ch) ch = oldCh; - - var tab = ch == "\t" ? ch: lang.stringRepeat(ch, len); - + if (!len) + len = oldLen; + if (!ch) + ch = oldCh; + var tab = ch == "\t" ? ch : lang.stringRepeat(ch, len); var doc = session.doc; var lines = doc.getAllLines(); - var cache = {}; var spaceCache = {}; - for (var i = 0, l=lines.length; i < l; i++) { + for (var i = 0, l = lines.length; i < l; i++) { var line = lines[i]; var match = line.match(/^\s*/)[0]; if (match) { var w = session.$getStringScreenWidth(match)[0]; - var tabCount = Math.floor(w/oldLen); - var reminder = w%oldLen; + var tabCount = Math.floor(w / oldLen); + var reminder = w % oldLen; var toInsert = cache[tabCount] || (cache[tabCount] = lang.stringRepeat(tab, tabCount)); toInsert += spaceCache[reminder] || (spaceCache[reminder] = lang.stringRepeat(" ", reminder)); - if (toInsert != match) { doc.removeInLine(i, 0, match.length); - doc.insertInLine({row: i, column: 0}, toInsert); + doc.insertInLine({ row: i, column: 0 }, toInsert); } } } session.setTabSize(len); session.setUseSoftTabs(ch == " "); }; - -exports.$parseStringArg = function(text) { +exports.$parseStringArg = function (text) { var indent = {}; if (/t/.test(text)) indent.ch = "\t"; @@ -163,8 +153,7 @@ exports.$parseStringArg = function(text) { indent.length = parseInt(m[0], 10); return indent; }; - -exports.$parseArg = function(arg) { +exports.$parseArg = function (arg) { if (!arg) return {}; if (typeof arg == "string") @@ -173,35 +162,34 @@ exports.$parseArg = function(arg) { return exports.$parseStringArg(arg.text); return arg; }; - exports.commands = [{ - name: "detectIndentation", - description: "Detect indentation from content", - exec: function(editor) { - exports.detectIndentation(editor.session); - } -}, { - name: "trimTrailingSpace", - description: "Trim trailing whitespace", - exec: function(editor, args) { - exports.trimTrailingSpace(editor.session, args); - } -}, { - name: "convertIndentation", - description: "Convert indentation to ...", - exec: function(editor, arg) { - var indent = exports.$parseArg(arg); - exports.convertIndentation(editor.session, indent.ch, indent.length); - } -}, { - name: "setIndentation", - description: "Set indentation", - exec: function(editor, arg) { - var indent = exports.$parseArg(arg); - indent.length && editor.session.setTabSize(indent.length); - indent.ch && editor.session.setUseSoftTabs(indent.ch == " "); - } -}]; + name: "detectIndentation", + description: "Detect indentation from content", + exec: function (editor) { + exports.detectIndentation(editor.session); + } + }, { + name: "trimTrailingSpace", + description: "Trim trailing whitespace", + exec: function (editor, args) { + exports.trimTrailingSpace(editor.session, args); + } + }, { + name: "convertIndentation", + description: "Convert indentation to ...", + exec: function (editor, arg) { + var indent = exports.$parseArg(arg); + exports.convertIndentation(editor.session, indent.ch, indent.length); + } + }, { + name: "setIndentation", + description: "Set indentation", + exec: function (editor, arg) { + var indent = exports.$parseArg(arg); + indent.length && editor.session.setTabSize(indent.length); + indent.ch && editor.session.setUseSoftTabs(indent.ch == " "); + } + }]; }); (function() { window.require(["ace/ext/whitespace"], function(m) { diff --git a/app/Resources/ui/js/ace/keybinding-emacs.js b/app/Resources/ui/js/ace/keybinding-emacs.js index 07ffa85c..17228e23 100644 --- a/app/Resources/ui/js/ace/keybinding-emacs.js +++ b/app/Resources/ui/js/ace/keybinding-emacs.js @@ -1,25 +1,38 @@ -define("ace/occur",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/edit_session","ace/search_highlight","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/occur",["require","exports","module","ace/lib/oop","ace/search","ace/edit_session","ace/search_highlight","ace/lib/dom"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); var oop = require("./lib/oop"); -var Range = require("./range").Range; var Search = require("./search").Search; var EditSession = require("./edit_session").EditSession; var SearchHighlight = require("./search_highlight").SearchHighlight; -function Occur() {} - -oop.inherits(Occur, Search); - -(function() { - this.enter = function(editor, options) { - if (!options.needle) return false; +var Occur = /** @class */ (function (_super) { + __extends(Occur, _super); + function Occur() { + return _super !== null && _super.apply(this, arguments) || this; + } + Occur.prototype.enter = function (editor, options) { + if (!options.needle) + return false; var pos = editor.getCursorPosition(); this.displayOccurContent(editor, options); var translatedPos = this.originalToOccurPosition(editor.session, pos); editor.moveCursorToPosition(translatedPos); return true; }; - this.exit = function(editor, options) { + Occur.prototype.exit = function (editor, options) { var pos = options.translatePosition && editor.getCursorPosition(); var translatedPos = pos && this.occurToOriginalPosition(editor.session, pos); this.displayOriginalContent(editor); @@ -27,18 +40,15 @@ oop.inherits(Occur, Search); editor.moveCursorToPosition(translatedPos); return true; }; - - this.highlight = function(sess, regexp) { - var hl = sess.$occurHighlight = sess.$occurHighlight || sess.addDynamicMarker( - new SearchHighlight(null, "ace_occur-highlight", "text")); + Occur.prototype.highlight = function (sess, regexp) { + var hl = sess.$occurHighlight = sess.$occurHighlight || sess.addDynamicMarker(new SearchHighlight(null, "ace_occur-highlight", "text")); hl.setRegexp(regexp); sess._emit("changeBackMarker"); // force highlight layer redraw }; - - this.displayOccurContent = function(editor, options) { + Occur.prototype.displayOccurContent = function (editor, options) { this.$originalSession = editor.session; var found = this.matchingLines(editor.session, options); - var lines = found.map(function(foundLine) { return foundLine.content; }); + var lines = found.map(function (foundLine) { return foundLine.content; }); var occurSession = new EditSession(lines.join('\n')); occurSession.$occur = this; occurSession.$occurMatchingLines = found; @@ -48,44 +58,43 @@ oop.inherits(Occur, Search); this.highlight(occurSession, options.re); occurSession._emit('changeBackMarker'); }; - - this.displayOriginalContent = function(editor) { + Occur.prototype.displayOriginalContent = function (editor) { editor.setSession(this.$originalSession); this.$originalSession.$useEmacsStyleLineStart = this.$useEmacsStyleLineStart; }; - this.originalToOccurPosition = function(session, pos) { + Occur.prototype.originalToOccurPosition = function (session, pos) { var lines = session.$occurMatchingLines; - var nullPos = {row: 0, column: 0}; - if (!lines) return nullPos; + var nullPos = { row: 0, column: 0 }; + if (!lines) + return nullPos; for (var i = 0; i < lines.length; i++) { if (lines[i].row === pos.row) - return {row: i, column: pos.column}; + return { row: i, column: pos.column }; } return nullPos; }; - this.occurToOriginalPosition = function(session, pos) { + Occur.prototype.occurToOriginalPosition = function (session, pos) { var lines = session.$occurMatchingLines; if (!lines || !lines[pos.row]) return pos; - return {row: lines[pos.row].row, column: pos.column}; + return { row: lines[pos.row].row, column: pos.column }; }; - - this.matchingLines = function(session, options) { + Occur.prototype.matchingLines = function (session, options) { options = oop.mixin({}, options); - if (!session || !options.needle) return []; + if (!session || !options.needle) + return []; var search = new Search(); search.set(options); - return search.findAll(session).reduce(function(lines, range) { + return search.findAll(session).reduce(function (lines, range) { var row = range.start.row; - var last = lines[lines.length-1]; + var last = lines[lines.length - 1]; return last && last.row === row ? lines : - lines.concat({row: row, content: session.getLine(row)}); + lines.concat({ row: row, content: session.getLine(row) }); }, []); }; - -}).call(Occur.prototype); - + return Occur; +}(Search)); var dom = require('./lib/dom'); dom.importCssString(".ace_occur-highlight {\n\ border-radius: 4px;\n\ @@ -99,18 +108,14 @@ dom.importCssString(".ace_occur-highlight {\n\ background-color: rgb(80, 140, 85);\n\ box-shadow: 0 0 4px rgb(60, 120, 70);\n\ }\n", "incremental-occur-highlighting", false); - exports.Occur = Occur; }); -define("ace/commands/occur_commands",["require","exports","module","ace/config","ace/occur","ace/keyboard/hash_handler","ace/lib/oop"], function(require, exports, module) { - -var config = require("../config"), - Occur = require("../occur").Occur; +define("ace/commands/occur_commands",["require","exports","module","ace/config","ace/occur","ace/keyboard/hash_handler","ace/lib/oop"], function(require, exports, module){var config = require("../config"), Occur = require("../occur").Occur; var occurStartCommand = { name: "occur", - exec: function(editor, options) { + exec: function (editor, options) { var alreadyInOccur = !!editor.session.$occur; var occurSessionActive = new Occur().enter(editor, options); if (occurSessionActive && !alreadyInOccur) @@ -118,214 +123,195 @@ var occurStartCommand = { }, readOnly: true }; - var occurCommands = [{ - name: "occurexit", - bindKey: 'esc|Ctrl-G', - exec: function(editor) { - var occur = editor.session.$occur; - if (!occur) return; - occur.exit(editor, {}); - if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor); - }, - readOnly: true -}, { - name: "occuraccept", - bindKey: 'enter', - exec: function(editor) { - var occur = editor.session.$occur; - if (!occur) return; - occur.exit(editor, {translatePosition: true}); - if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor); - }, - readOnly: true -}]; - + name: "occurexit", + bindKey: 'esc|Ctrl-G', + exec: function (editor) { + var occur = editor.session.$occur; + if (!occur) + return; + occur.exit(editor, {}); + if (!editor.session.$occur) + OccurKeyboardHandler.uninstallFrom(editor); + }, + readOnly: true + }, { + name: "occuraccept", + bindKey: 'enter', + exec: function (editor) { + var occur = editor.session.$occur; + if (!occur) + return; + occur.exit(editor, { translatePosition: true }); + if (!editor.session.$occur) + OccurKeyboardHandler.uninstallFrom(editor); + }, + readOnly: true + }]; var HashHandler = require("../keyboard/hash_handler").HashHandler; var oop = require("../lib/oop"); - - -function OccurKeyboardHandler() {} - +function OccurKeyboardHandler() { } oop.inherits(OccurKeyboardHandler, HashHandler); - -(function() { - +(function () { this.isOccurHandler = true; - - this.attach = function(editor) { + this.attach = function (editor) { HashHandler.call(this, occurCommands, editor.commands.platform); this.$editor = editor; }; - var handleKeyboard$super = this.handleKeyboard; - this.handleKeyboard = function(data, hashId, key, keyCode) { + this.handleKeyboard = function (data, hashId, key, keyCode) { var cmd = handleKeyboard$super.call(this, data, hashId, key, keyCode); return (cmd && cmd.command) ? cmd : undefined; }; - }).call(OccurKeyboardHandler.prototype); - -OccurKeyboardHandler.installIn = function(editor) { +OccurKeyboardHandler.installIn = function (editor) { var handler = new this(); editor.keyBinding.addKeyboardHandler(handler); editor.commands.addCommands(occurCommands); }; - -OccurKeyboardHandler.uninstallFrom = function(editor) { +OccurKeyboardHandler.uninstallFrom = function (editor) { editor.commands.removeCommands(occurCommands); var handler = editor.getKeyboardHandler(); if (handler.isOccurHandler) editor.keyBinding.removeKeyboardHandler(handler); }; - exports.occurStartCommand = occurStartCommand; }); -define("ace/commands/incremental_search_commands",["require","exports","module","ace/config","ace/lib/oop","ace/keyboard/hash_handler","ace/commands/occur_commands"], function(require, exports, module) { - -var config = require("../config"); +define("ace/commands/incremental_search_commands",["require","exports","module","ace/config","ace/lib/oop","ace/keyboard/hash_handler","ace/commands/occur_commands"], function(require, exports, module){var config = require("../config"); var oop = require("../lib/oop"); var HashHandler = require("../keyboard/hash_handler").HashHandler; var occurStartCommand = require("./occur_commands").occurStartCommand; exports.iSearchStartCommands = [{ - name: "iSearch", - bindKey: {win: "Ctrl-F", mac: "Command-F"}, - exec: function(editor, options) { - config.loadModule(["core", "ace/incremental_search"], function(e) { - var iSearch = e.iSearch = e.iSearch || new e.IncrementalSearch(); - iSearch.activate(editor, options.backwards); - if (options.jumpToFirstMatch) iSearch.next(options); - }); - }, - readOnly: true -}, { - name: "iSearchBackwards", - exec: function(editor, jumpToNext) { editor.execCommand('iSearch', {backwards: true}); }, - readOnly: true -}, { - name: "iSearchAndGo", - bindKey: {win: "Ctrl-K", mac: "Command-G"}, - exec: function(editor, jumpToNext) { editor.execCommand('iSearch', {jumpToFirstMatch: true, useCurrentOrPrevSearch: true}); }, - readOnly: true -}, { - name: "iSearchBackwardsAndGo", - bindKey: {win: "Ctrl-Shift-K", mac: "Command-Shift-G"}, - exec: function(editor) { editor.execCommand('iSearch', {jumpToFirstMatch: true, backwards: true, useCurrentOrPrevSearch: true}); }, - readOnly: true -}]; + name: "iSearch", + bindKey: { win: "Ctrl-F", mac: "Command-F" }, + exec: function (editor, options) { + config.loadModule(["core", "ace/incremental_search"], function (e) { + var iSearch = e.iSearch = e.iSearch || new e.IncrementalSearch(); + iSearch.activate(editor, options.backwards); + if (options.jumpToFirstMatch) + iSearch.next(options); + }); + }, + readOnly: true + }, { + name: "iSearchBackwards", + exec: function (editor, jumpToNext) { editor.execCommand('iSearch', { backwards: true }); }, + readOnly: true + }, { + name: "iSearchAndGo", + bindKey: { win: "Ctrl-K", mac: "Command-G" }, + exec: function (editor, jumpToNext) { editor.execCommand('iSearch', { jumpToFirstMatch: true, useCurrentOrPrevSearch: true }); }, + readOnly: true + }, { + name: "iSearchBackwardsAndGo", + bindKey: { win: "Ctrl-Shift-K", mac: "Command-Shift-G" }, + exec: function (editor) { editor.execCommand('iSearch', { jumpToFirstMatch: true, backwards: true, useCurrentOrPrevSearch: true }); }, + readOnly: true + }]; exports.iSearchCommands = [{ - name: "restartSearch", - bindKey: {win: "Ctrl-F", mac: "Command-F"}, - exec: function(iSearch) { - iSearch.cancelSearch(true); - } -}, { - name: "searchForward", - bindKey: {win: "Ctrl-S|Ctrl-K", mac: "Ctrl-S|Command-G"}, - exec: function(iSearch, options) { - options.useCurrentOrPrevSearch = true; - iSearch.next(options); - } -}, { - name: "searchBackward", - bindKey: {win: "Ctrl-R|Ctrl-Shift-K", mac: "Ctrl-R|Command-Shift-G"}, - exec: function(iSearch, options) { - options.useCurrentOrPrevSearch = true; - options.backwards = true; - iSearch.next(options); - } -}, { - name: "extendSearchTerm", - exec: function(iSearch, string) { - iSearch.addString(string); - } -}, { - name: "extendSearchTermSpace", - bindKey: "space", - exec: function(iSearch) { iSearch.addString(' '); } -}, { - name: "shrinkSearchTerm", - bindKey: "backspace", - exec: function(iSearch) { - iSearch.removeChar(); - } -}, { - name: 'confirmSearch', - bindKey: 'return', - exec: function(iSearch) { iSearch.deactivate(); } -}, { - name: 'cancelSearch', - bindKey: 'esc|Ctrl-G', - exec: function(iSearch) { iSearch.deactivate(true); } -}, { - name: 'occurisearch', - bindKey: 'Ctrl-O', - exec: function(iSearch) { - var options = oop.mixin({}, iSearch.$options); - iSearch.deactivate(); - occurStartCommand.exec(iSearch.$editor, options); - } -}, { - name: "yankNextWord", - bindKey: "Ctrl-w", - exec: function(iSearch) { - var ed = iSearch.$editor, - range = ed.selection.getRangeOfMovements(function(sel) { sel.moveCursorWordRight(); }), - string = ed.session.getTextRange(range); - iSearch.addString(string); - } -}, { - name: "yankNextChar", - bindKey: "Ctrl-Alt-y", - exec: function(iSearch) { - var ed = iSearch.$editor, - range = ed.selection.getRangeOfMovements(function(sel) { sel.moveCursorRight(); }), - string = ed.session.getTextRange(range); - iSearch.addString(string); - } -}, { - name: 'recenterTopBottom', - bindKey: 'Ctrl-l', - exec: function(iSearch) { iSearch.$editor.execCommand('recenterTopBottom'); } -}, { - name: 'selectAllMatches', - bindKey: 'Ctrl-space', - exec: function(iSearch) { - var ed = iSearch.$editor, - hl = ed.session.$isearchHighlight, - ranges = hl && hl.cache ? hl.cache - .reduce(function(ranges, ea) { - return ranges.concat(ea ? ea : []); }, []) : []; - iSearch.deactivate(false); - ranges.forEach(ed.selection.addRange.bind(ed.selection)); - } -}, { - name: 'searchAsRegExp', - bindKey: 'Alt-r', - exec: function(iSearch) { - iSearch.convertNeedleToRegExp(); - } -}].map(function(cmd) { + name: "restartSearch", + bindKey: { win: "Ctrl-F", mac: "Command-F" }, + exec: function (iSearch) { + iSearch.cancelSearch(true); + } + }, { + name: "searchForward", + bindKey: { win: "Ctrl-S|Ctrl-K", mac: "Ctrl-S|Command-G" }, + exec: function (iSearch, options) { + options.useCurrentOrPrevSearch = true; + iSearch.next(options); + } + }, { + name: "searchBackward", + bindKey: { win: "Ctrl-R|Ctrl-Shift-K", mac: "Ctrl-R|Command-Shift-G" }, + exec: function (iSearch, options) { + options.useCurrentOrPrevSearch = true; + options.backwards = true; + iSearch.next(options); + } + }, { + name: "extendSearchTerm", + exec: function (iSearch, string) { + iSearch.addString(string); + } + }, { + name: "extendSearchTermSpace", + bindKey: "space", + exec: function (iSearch) { iSearch.addString(' '); } + }, { + name: "shrinkSearchTerm", + bindKey: "backspace", + exec: function (iSearch) { + iSearch.removeChar(); + } + }, { + name: 'confirmSearch', + bindKey: 'return', + exec: function (iSearch) { iSearch.deactivate(); } + }, { + name: 'cancelSearch', + bindKey: 'esc|Ctrl-G', + exec: function (iSearch) { iSearch.deactivate(true); } + }, { + name: 'occurisearch', + bindKey: 'Ctrl-O', + exec: function (iSearch) { + var options = oop.mixin({}, iSearch.$options); + iSearch.deactivate(); + occurStartCommand.exec(iSearch.$editor, options); + } + }, { + name: "yankNextWord", + bindKey: "Ctrl-w", + exec: function (iSearch) { + var ed = iSearch.$editor, range = ed.selection.getRangeOfMovements(function (sel) { sel.moveCursorWordRight(); }), string = ed.session.getTextRange(range); + iSearch.addString(string); + } + }, { + name: "yankNextChar", + bindKey: "Ctrl-Alt-y", + exec: function (iSearch) { + var ed = iSearch.$editor, range = ed.selection.getRangeOfMovements(function (sel) { sel.moveCursorRight(); }), string = ed.session.getTextRange(range); + iSearch.addString(string); + } + }, { + name: 'recenterTopBottom', + bindKey: 'Ctrl-l', + exec: function (iSearch) { iSearch.$editor.execCommand('recenterTopBottom'); } + }, { + name: 'selectAllMatches', + bindKey: 'Ctrl-space', + exec: function (iSearch) { + var ed = iSearch.$editor, hl = ed.session.$isearchHighlight, ranges = hl && hl.cache ? hl.cache + .reduce(function (ranges, ea) { + return ranges.concat(ea ? ea : []); + }, []) : []; + iSearch.deactivate(false); + ranges.forEach(ed.selection.addRange.bind(ed.selection)); + } + }, { + name: 'searchAsRegExp', + bindKey: 'Alt-r', + exec: function (iSearch) { + iSearch.convertNeedleToRegExp(); + } + }].map(function (cmd) { cmd.readOnly = true; cmd.isIncrementalSearchCommand = true; cmd.scrollIntoView = "animate-cursor"; return cmd; }); - function IncrementalSearchKeyboardHandler(iSearch) { this.$iSearch = iSearch; } - oop.inherits(IncrementalSearchKeyboardHandler, HashHandler); - -(function() { - - this.attach = function(editor) { +(function () { + this.attach = function (editor) { var iSearch = this.$iSearch; HashHandler.call(this, exports.iSearchCommands, editor.commands.platform); - this.$commandExecHandler = editor.commands.on('exec', function(e) { + this.$commandExecHandler = editor.commands.on('exec', function (e) { if (!e.command.isIncrementalSearchCommand) return iSearch.deactivate(); e.stopPropagation(); @@ -337,89 +323,97 @@ oop.inherits(IncrementalSearchKeyboardHandler, HashHandler); return result; }); }; - - this.detach = function(editor) { - if (!this.$commandExecHandler) return; + this.detach = function (editor) { + if (!this.$commandExecHandler) + return; editor.commands.off('exec', this.$commandExecHandler); delete this.$commandExecHandler; }; - var handleKeyboard$super = this.handleKeyboard; - this.handleKeyboard = function(data, hashId, key, keyCode) { - if (((hashId === 1/*ctrl*/ || hashId === 8/*command*/) && key === 'v') - || (hashId === 1/*ctrl*/ && key === 'y')) return null; + this.handleKeyboard = function (data, hashId, key, keyCode) { + if (((hashId === 1 /*ctrl*/ || hashId === 8 /*command*/) && key === 'v') + || (hashId === 1 /*ctrl*/ && key === 'y')) + return null; var cmd = handleKeyboard$super.call(this, data, hashId, key, keyCode); - if (cmd && cmd.command) { return cmd; } + if (cmd && cmd.command) { + return cmd; + } if (hashId == -1) { var extendCmd = this.commands.extendSearchTerm; - if (extendCmd) { return {command: extendCmd, args: key}; } + if (extendCmd) { + return { command: extendCmd, args: key }; + } } return false; }; - }).call(IncrementalSearchKeyboardHandler.prototype); - - exports.IncrementalSearchKeyboardHandler = IncrementalSearchKeyboardHandler; }); -define("ace/incremental_search",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/search_highlight","ace/commands/incremental_search_commands","ace/lib/dom","ace/commands/command_manager","ace/editor","ace/config"], function(require, exports, module) { -"use strict"; - -var oop = require("./lib/oop"); +define("ace/incremental_search",["require","exports","module","ace/range","ace/search","ace/search_highlight","ace/commands/incremental_search_commands","ace/lib/dom","ace/commands/command_manager","ace/editor","ace/config"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); var Range = require("./range").Range; var Search = require("./search").Search; var SearchHighlight = require("./search_highlight").SearchHighlight; var iSearchCommandModule = require("./commands/incremental_search_commands"); var ISearchKbd = iSearchCommandModule.IncrementalSearchKeyboardHandler; -function IncrementalSearch() { - this.$options = {wrap: false, skipCurrent: false}; - this.$keyboardHandler = new ISearchKbd(this); -} - -oop.inherits(IncrementalSearch, Search); - function isRegExp(obj) { return obj instanceof RegExp; } - function regExpToObject(re) { - var string = String(re), - start = string.indexOf('/'), - flagStart = string.lastIndexOf('/'); + var string = String(re), start = string.indexOf('/'), flagStart = string.lastIndexOf('/'); return { - expression: string.slice(start+1, flagStart), - flags: string.slice(flagStart+1) + expression: string.slice(start + 1, flagStart), + flags: string.slice(flagStart + 1) }; } - function stringToRegExp(string, flags) { try { return new RegExp(string, flags); - } catch (e) { return string; } + } + catch (e) { + return string; + } } - function objectToRegExp(obj) { return stringToRegExp(obj.expression, obj.flags); } - -(function() { - - this.activate = function(editor, backwards) { +var IncrementalSearch = /** @class */ (function (_super) { + __extends(IncrementalSearch, _super); + function IncrementalSearch() { + var _this = _super.call(this) || this; + _this.$options = { wrap: false, skipCurrent: false }; + _this.$keyboardHandler = new ISearchKbd(_this); + return _this; + } + IncrementalSearch.prototype.activate = function (editor, backwards) { this.$editor = editor; this.$startPos = this.$currentPos = editor.getCursorPosition(); this.$options.needle = ''; this.$options.backwards = backwards; editor.keyBinding.addKeyboardHandler(this.$keyboardHandler); - this.$originalEditorOnPaste = editor.onPaste; + this.$originalEditorOnPaste = editor.onPaste; editor.onPaste = this.onPaste.bind(this); this.$mousedownHandler = editor.on('mousedown', this.onMouseDown.bind(this)); this.selectionFix(editor); this.statusMessage(true); }; - - this.deactivate = function(reset) { + IncrementalSearch.prototype.deactivate = function (reset) { this.cancelSearch(reset); var editor = this.$editor; editor.keyBinding.removeKeyboardHandler(this.$keyboardHandler); @@ -430,37 +424,33 @@ function objectToRegExp(obj) { editor.onPaste = this.$originalEditorOnPaste; this.message(''); }; - - this.selectionFix = function(editor) { + IncrementalSearch.prototype.selectionFix = function (editor) { if (editor.selection.isEmpty() && !editor.session.$emacsMark) { editor.clearSelection(); } }; - - this.highlight = function(regexp) { - var sess = this.$editor.session, - hl = sess.$isearchHighlight = sess.$isearchHighlight || sess.addDynamicMarker( - new SearchHighlight(null, "ace_isearch-result", "text")); + IncrementalSearch.prototype.highlight = function (regexp) { + var sess = this.$editor.session, hl = sess.$isearchHighlight = sess.$isearchHighlight || sess.addDynamicMarker(new SearchHighlight(null, "ace_isearch-result", "text")); hl.setRegexp(regexp); sess._emit("changeBackMarker"); // force highlight layer redraw }; - - this.cancelSearch = function(reset) { + IncrementalSearch.prototype.cancelSearch = function (reset) { var e = this.$editor; this.$prevNeedle = this.$options.needle; this.$options.needle = ''; if (reset) { e.moveCursorToPosition(this.$startPos); this.$currentPos = this.$startPos; - } else { + } + else { e.pushEmacsMark && e.pushEmacsMark(this.$startPos, false); } this.highlight(null); return Range.fromPoints(this.$currentPos, this.$currentPos); }; - - this.highlightAndFindWithNeedle = function(moveToNext, needleUpdateFunc) { - if (!this.$editor) return null; + IncrementalSearch.prototype.highlightAndFindWithNeedle = function (moveToNext, needleUpdateFunc) { + if (!this.$editor) + return null; var options = this.$options; if (needleUpdateFunc) { options.needle = needleUpdateFunc.call(this, options.needle || '') || ''; @@ -470,113 +460,86 @@ function objectToRegExp(obj) { return this.cancelSearch(true); } options.start = this.$currentPos; - var session = this.$editor.session, - found = this.find(session), - shouldSelect = this.$editor.emacsMark ? - !!this.$editor.emacsMark() : !this.$editor.selection.isEmpty(); + var session = this.$editor.session, found = this.find(session), shouldSelect = this.$editor.emacsMark ? + !!this.$editor.emacsMark() : !this.$editor.selection.isEmpty(); if (found) { - if (options.backwards) found = Range.fromPoints(found.end, found.start); + if (options.backwards) + found = Range.fromPoints(found.end, found.start); this.$editor.selection.setRange(Range.fromPoints(shouldSelect ? this.$startPos : found.end, found.end)); - if (moveToNext) this.$currentPos = found.end; + if (moveToNext) + this.$currentPos = found.end; this.highlight(options.re); } - this.statusMessage(found); - return found; }; - - this.addString = function(s) { - return this.highlightAndFindWithNeedle(false, function(needle) { + IncrementalSearch.prototype.addString = function (s) { + return this.highlightAndFindWithNeedle(false, function (needle) { if (!isRegExp(needle)) - return needle + s; + return needle + s; var reObj = regExpToObject(needle); reObj.expression += s; return objectToRegExp(reObj); }); }; - - this.removeChar = function(c) { - return this.highlightAndFindWithNeedle(false, function(needle) { + IncrementalSearch.prototype.removeChar = function (c) { + return this.highlightAndFindWithNeedle(false, function (needle) { if (!isRegExp(needle)) - return needle.substring(0, needle.length-1); + return needle.substring(0, needle.length - 1); var reObj = regExpToObject(needle); - reObj.expression = reObj.expression.substring(0, reObj.expression.length-1); + reObj.expression = reObj.expression.substring(0, reObj.expression.length - 1); return objectToRegExp(reObj); }); }; - - this.next = function(options) { + IncrementalSearch.prototype.next = function (options) { options = options || {}; this.$options.backwards = !!options.backwards; this.$currentPos = this.$editor.getCursorPosition(); - return this.highlightAndFindWithNeedle(true, function(needle) { + return this.highlightAndFindWithNeedle(true, function (needle) { return options.useCurrentOrPrevSearch && needle.length === 0 ? this.$prevNeedle || '' : needle; }); }; - - this.onMouseDown = function(evt) { + IncrementalSearch.prototype.onMouseDown = function (evt) { this.deactivate(); return true; }; - - this.onPaste = function(text) { + IncrementalSearch.prototype.onPaste = function (text) { this.addString(text); }; - - this.convertNeedleToRegExp = function() { - return this.highlightAndFindWithNeedle(false, function(needle) { + IncrementalSearch.prototype.convertNeedleToRegExp = function () { + return this.highlightAndFindWithNeedle(false, function (needle) { return isRegExp(needle) ? needle : stringToRegExp(needle, 'ig'); }); }; - - this.convertNeedleToString = function() { - return this.highlightAndFindWithNeedle(false, function(needle) { + IncrementalSearch.prototype.convertNeedleToString = function () { + return this.highlightAndFindWithNeedle(false, function (needle) { return isRegExp(needle) ? regExpToObject(needle).expression : needle; }); }; - - this.statusMessage = function(found) { + IncrementalSearch.prototype.statusMessage = function (found) { var options = this.$options, msg = ''; msg += options.backwards ? 'reverse-' : ''; msg += 'isearch: ' + options.needle; msg += found ? '' : ' (not found)'; this.message(msg); }; - - this.message = function(msg) { + IncrementalSearch.prototype.message = function (msg) { if (this.$editor.showCommandLine) { this.$editor.showCommandLine(msg); this.$editor.focus(); } }; - -}).call(IncrementalSearch.prototype); - - + return IncrementalSearch; +}(Search)); exports.IncrementalSearch = IncrementalSearch; - var dom = require('./lib/dom'); -dom.importCssString("\ -.ace_marker-layer .ace_isearch-result {\ - position: absolute;\ - z-index: 6;\ - box-sizing: border-box;\ -}\ -div.ace_isearch-result {\ - border-radius: 4px;\ - background-color: rgba(255, 200, 0, 0.5);\ - box-shadow: 0 0 4px rgb(255, 200, 0);\ -}\ -.ace_dark div.ace_isearch-result {\ - background-color: rgb(100, 110, 160);\ - box-shadow: 0 0 4px rgb(80, 90, 140);\ -}", "incremental-search-highlighting", false); +dom.importCssString("\n.ace_marker-layer .ace_isearch-result {\n position: absolute;\n z-index: 6;\n box-sizing: border-box;\n}\ndiv.ace_isearch-result {\n border-radius: 4px;\n background-color: rgba(255, 200, 0, 0.5);\n box-shadow: 0 0 4px rgb(255, 200, 0);\n}\n.ace_dark div.ace_isearch-result {\n background-color: rgb(100, 110, 160);\n box-shadow: 0 0 4px rgb(80, 90, 140);\n}", "incremental-search-highlighting", false); var commands = require("./commands/command_manager"); -(function() { - this.setupIncrementalSearch = function(editor, val) { - if (this.usesIncrementalSearch == val) return; +(function () { + this.setupIncrementalSearch = function (editor, val) { + if (this.usesIncrementalSearch == val) + return; this.usesIncrementalSearch = val; var iSearchCommands = iSearchCommandModule.iSearchStartCommands; var method = val ? 'addCommands' : 'removeCommands'; @@ -586,114 +549,72 @@ var commands = require("./commands/command_manager"); var Editor = require("./editor").Editor; require("./config").defineOptions(Editor.prototype, "editor", { useIncrementalSearch: { - set: function(val) { - this.keyBinding.$handlers.forEach(function(handler) { + set: function (val) { + this.keyBinding.$handlers.forEach(function (handler) { if (handler.setupIncrementalSearch) { handler.setupIncrementalSearch(this, val); } }); - this._emit('incrementalSearchSettingChanged', {isEnabled: val}); + this._emit('incrementalSearchSettingChanged', { isEnabled: val }); } } }); }); -define("ace/keyboard/emacs",["require","exports","module","ace/lib/dom","ace/incremental_search","ace/commands/incremental_search_commands","ace/keyboard/hash_handler","ace/lib/keys"], function(require, exports, module) { -"use strict"; - +define("ace/keyboard/emacs",["require","exports","module","ace/lib/dom","ace/incremental_search","ace/commands/incremental_search_commands","ace/keyboard/hash_handler","ace/lib/keys"], function(require, exports, module){"use strict"; var dom = require("../lib/dom"); require("../incremental_search"); var iSearchCommandModule = require("../commands/incremental_search_commands"); - - var HashHandler = require("./hash_handler").HashHandler; exports.handler = new HashHandler(); - exports.handler.isEmacs = true; exports.handler.$id = "ace/keyboard/emacs"; - -var initialized = false; +dom.importCssString("\n.emacs-mode .ace_cursor{\n border: 1px rgba(50,250,50,0.8) solid!important;\n box-sizing: border-box!important;\n background-color: rgba(0,250,0,0.9);\n opacity: 0.5;\n}\n.emacs-mode .ace_hidden-cursors .ace_cursor{\n opacity: 1;\n background-color: transparent;\n}\n.emacs-mode .ace_overwrite-cursors .ace_cursor {\n opacity: 1;\n background-color: transparent;\n border-width: 0 0 2px 2px !important;\n}\n.emacs-mode .ace_text-layer {\n z-index: 4\n}\n.emacs-mode .ace_cursor-layer {\n z-index: 2\n}", 'emacsMode', false); var $formerLongWords; var $formerLineStart; - -exports.handler.attach = function(editor) { - if (!initialized) { - initialized = true; - dom.importCssString('\ - .emacs-mode .ace_cursor{\ - border: 1px rgba(50,250,50,0.8) solid!important;\ - box-sizing: border-box!important;\ - background-color: rgba(0,250,0,0.9);\ - opacity: 0.5;\ - }\ - .emacs-mode .ace_hidden-cursors .ace_cursor{\ - opacity: 1;\ - background-color: transparent;\ - }\ - .emacs-mode .ace_overwrite-cursors .ace_cursor {\ - opacity: 1;\ - background-color: transparent;\ - border-width: 0 0 2px 2px !important;\ - }\ - .emacs-mode .ace_text-layer {\ - z-index: 4\ - }\ - .emacs-mode .ace_cursor-layer {\ - z-index: 2\ - }', 'emacsMode' - ); - } +exports.handler.attach = function (editor) { $formerLongWords = editor.session.$selectLongWords; editor.session.$selectLongWords = true; $formerLineStart = editor.session.$useEmacsStyleLineStart; editor.session.$useEmacsStyleLineStart = true; - editor.session.$emacsMark = null; // the active mark editor.session.$emacsMarkRing = editor.session.$emacsMarkRing || []; - - editor.emacsMark = function() { + editor.emacsMark = function () { return this.session.$emacsMark; }; - - editor.setEmacsMark = function(p) { + editor.setEmacsMark = function (p) { this.session.$emacsMark = p; }; - - editor.pushEmacsMark = function(p, activate) { + editor.pushEmacsMark = function (p, activate) { var prevMark = this.session.$emacsMark; if (prevMark) - this.session.$emacsMarkRing.push(prevMark); - if (!p || activate) this.setEmacsMark(p); - else this.session.$emacsMarkRing.push(p); + pushUnique(this.session.$emacsMarkRing, prevMark); + if (!p || activate) + this.setEmacsMark(p); + else + pushUnique(this.session.$emacsMarkRing, p); }; - - editor.popEmacsMark = function() { + editor.popEmacsMark = function () { var mark = this.emacsMark(); - if (mark) { this.setEmacsMark(null); return mark; } + if (mark) { + this.setEmacsMark(null); + return mark; + } return this.session.$emacsMarkRing.pop(); }; - - editor.getLastEmacsMark = function(p) { + editor.getLastEmacsMark = function (p) { return this.session.$emacsMark || this.session.$emacsMarkRing.slice(-1)[0]; }; - - editor.emacsMarkForSelection = function(replacement) { - var sel = this.selection, - multiRangeLength = this.multiSelect ? - this.multiSelect.getAllRanges().length : 1, - selIndex = sel.index || 0, - markRing = this.session.$emacsMarkRing, - markIndex = markRing.length - (multiRangeLength - selIndex), - lastMark = markRing[markIndex] || sel.anchor; + editor.emacsMarkForSelection = function (replacement) { + var sel = this.selection, multiRangeLength = this.multiSelect ? + this.multiSelect.getAllRanges().length : 1, selIndex = sel.index || 0, markRing = this.session.$emacsMarkRing, markIndex = markRing.length - (multiRangeLength - selIndex), lastMark = markRing[markIndex] || sel.anchor; if (replacement) { - markRing.splice(markIndex, 1, - "row" in replacement && "column" in replacement ? - replacement : undefined); + markRing.splice(markIndex, 1, "row" in replacement && "column" in replacement ? + replacement : undefined); } return lastMark; }; - editor.on("click", $resetMarkMode); editor.on("changeSession", $kbSessionChange); editor.renderer.$blockCursor = true; @@ -704,8 +625,14 @@ exports.handler.attach = function(editor) { editor.on('copy', this.onCopy); editor.on('paste', this.onPaste); }; - -exports.handler.detach = function(editor) { +function pushUnique(ring, mark) { + var last = ring[ring.length - 1]; + if (last && last.row === mark.row && last.column === mark.column) { + return; + } + ring.push(mark); +} +exports.handler.detach = function (editor) { editor.renderer.$blockCursor = false; editor.session.$selectLongWords = $formerLongWords; editor.session.$useEmacsStyleLineStart = $formerLineStart; @@ -717,85 +644,76 @@ exports.handler.detach = function(editor) { editor.off('paste', this.onPaste); editor.$emacsModeHandler = null; }; - -var $kbSessionChange = function(e) { +var $kbSessionChange = function (e) { if (e.oldSession) { e.oldSession.$selectLongWords = $formerLongWords; e.oldSession.$useEmacsStyleLineStart = $formerLineStart; } - $formerLongWords = e.session.$selectLongWords; e.session.$selectLongWords = true; $formerLineStart = e.session.$useEmacsStyleLineStart; e.session.$useEmacsStyleLineStart = true; - if (!e.session.hasOwnProperty('$emacsMark')) e.session.$emacsMark = null; if (!e.session.hasOwnProperty('$emacsMarkRing')) e.session.$emacsMarkRing = []; }; - -var $resetMarkMode = function(e) { +var $resetMarkMode = function (e) { e.editor.session.$emacsMark = null; }; - var keys = require("../lib/keys").KEY_MODS; -var eMods = {C: "ctrl", S: "shift", M: "alt", CMD: "command"}; +var eMods = { C: "ctrl", S: "shift", M: "alt", CMD: "command" }; var combinations = ["C-S-M-CMD", - "S-M-CMD", "C-M-CMD", "C-S-CMD", "C-S-M", - "M-CMD", "S-CMD", "S-M", "C-CMD", "C-M", "C-S", - "CMD", "M", "S", "C"]; -combinations.forEach(function(c) { + "S-M-CMD", "C-M-CMD", "C-S-CMD", "C-S-M", + "M-CMD", "S-CMD", "S-M", "C-CMD", "C-M", "C-S", + "CMD", "M", "S", "C"]; +combinations.forEach(function (c) { var hashId = 0; - c.split("-").forEach(function(c) { + c.split("-").forEach(function (c) { hashId = hashId | keys[eMods[c]]; }); eMods[hashId] = c.toLowerCase() + "-"; }); - -exports.handler.onCopy = function(e, editor) { - if (editor.$handlesEmacsOnCopy) return; +exports.handler.onCopy = function (e, editor) { + if (editor.$handlesEmacsOnCopy) + return; editor.$handlesEmacsOnCopy = true; exports.handler.commands.killRingSave.exec(editor); editor.$handlesEmacsOnCopy = false; }; - -exports.handler.onPaste = function(e, editor) { +exports.handler.onPaste = function (e, editor) { editor.pushEmacsMark(editor.getCursorPosition()); }; - -exports.handler.bindKey = function(key, command) { +exports.handler.bindKey = function (key, command) { if (typeof key == "object") key = key[this.platform]; if (!key) return; - var ckb = this.commandKeyBinding; - key.split("|").forEach(function(keyPart) { + key.split("|").forEach(function (keyPart) { keyPart = keyPart.toLowerCase(); ckb[keyPart] = command; - var keyParts = keyPart.split(" ").slice(0,-1); - keyParts.reduce(function(keyMapKeys, keyPart, i) { - var prefix = keyMapKeys[i-1] ? keyMapKeys[i-1] + ' ' : ''; + var keyParts = keyPart.split(" ").slice(0, -1); + keyParts.reduce(function (keyMapKeys, keyPart, i) { + var prefix = keyMapKeys[i - 1] ? keyMapKeys[i - 1] + ' ' : ''; return keyMapKeys.concat([prefix + keyPart]); - }, []).forEach(function(keyPart) { - if (!ckb[keyPart]) ckb[keyPart] = "null"; + }, []).forEach(function (keyPart) { + if (!ckb[keyPart]) + ckb[keyPart] = "null"; }); }, this); }; - -exports.handler.getStatusText = function(editor, data) { - var str = ""; - if (data.count) - str += data.count; - if (data.keyChain) - str += " " + data.keyChain; - return str; +exports.handler.getStatusText = function (editor, data) { + var str = ""; + if (data.count) + str += data.count; + if (data.keyChain) + str += " " + data.keyChain; + return str; }; - -exports.handler.handleKeyboard = function(data, hashId, key, keyCode) { - if (keyCode === -1) return undefined; - +exports.handler.handleKeyboard = function (data, hashId, key, keyCode) { + if (keyCode === -1) + return undefined; var editor = data.editor; editor._signal("changeStatus"); if (hashId == -1) { @@ -803,40 +721,42 @@ exports.handler.handleKeyboard = function(data, hashId, key, keyCode) { if (data.count) { var str = new Array(data.count + 1).join(key); data.count = null; - return {command: "insertstring", args: str}; + return { command: "insertstring", args: str }; } } - var modifier = eMods[hashId]; if (modifier == "c-" || data.count) { var count = parseInt(key[key.length - 1]); if (typeof count === 'number' && !isNaN(count)) { data.count = Math.max(data.count, 0) || 0; data.count = 10 * data.count + count; - return {command: "null"}; + return { command: "null" }; } } - if (modifier) key = modifier + key; - if (data.keyChain) key = data.keyChain += " " + key; + if (modifier) + key = modifier + key; + if (data.keyChain) + key = data.keyChain += " " + key; var command = this.commandKeyBinding[key]; data.keyChain = command == "null" ? key : ""; - if (!command) return undefined; - if (command === "null") return {command: "null"}; - + if (!command) + return undefined; + if (command === "null") + return { command: "null" }; if (command === "universalArgument") { data.count = -4; - return {command: "null"}; + return { command: "null" }; } var args; if (typeof command !== "string") { args = command.args; - if (command.command) command = command.command; + if (command.command) + command = command.command; if (command === "goorselect") { command = editor.emacsMark() ? args[1] : args[0]; args = null; } } - if (typeof command === "string") { if (command === "insertstring" || command === "splitline" || @@ -844,15 +764,13 @@ exports.handler.handleKeyboard = function(data, hashId, key, keyCode) { editor.pushEmacsMark(); } command = this.commands[command] || editor.commands.commands[command]; - if (!command) return undefined; + if (!command) + return undefined; } - if (!command.readOnly && !command.isYank) data.lastCommand = null; - if (!command.readOnly && editor.emacsMark()) editor.setEmacsMark(null); - if (data.count) { var count = data.count; data.count = 0; @@ -860,147 +778,134 @@ exports.handler.handleKeyboard = function(data, hashId, key, keyCode) { return { args: args, command: { - exec: function(editor, args) { + exec: function (editor, args) { for (var i = 0; i < count; i++) command.exec(editor, args); }, multiSelectAction: command.multiSelectAction } }; - } else { - if (!args) args = {}; - if (typeof args === 'object') args.count = count; + } + else { + if (!args) + args = {}; + if (typeof args === 'object') + args.count = count; } } - - return {command: command, args: args}; + return { command: command, args: args }; }; - exports.emacsKeys = { - "Up|C-p" : {command: "goorselect", args: ["golineup","selectup"]}, - "Down|C-n" : {command: "goorselect", args: ["golinedown","selectdown"]}, - "Left|C-b" : {command: "goorselect", args: ["gotoleft","selectleft"]}, - "Right|C-f" : {command: "goorselect", args: ["gotoright","selectright"]}, - "C-Left|M-b" : {command: "goorselect", args: ["gotowordleft","selectwordleft"]}, - "C-Right|M-f" : {command: "goorselect", args: ["gotowordright","selectwordright"]}, - "Home|C-a" : {command: "goorselect", args: ["gotolinestart","selecttolinestart"]}, - "End|C-e" : {command: "goorselect", args: ["gotolineend","selecttolineend"]}, - "C-Home|S-M-,": {command: "goorselect", args: ["gotostart","selecttostart"]}, - "C-End|S-M-." : {command: "goorselect", args: ["gotoend","selecttoend"]}, - "S-Up|S-C-p" : "selectup", - "S-Down|S-C-n" : "selectdown", - "S-Left|S-C-b" : "selectleft", - "S-Right|S-C-f" : "selectright", - "S-C-Left|S-M-b" : "selectwordleft", - "S-C-Right|S-M-f" : "selectwordright", - "S-Home|S-C-a" : "selecttolinestart", - "S-End|S-C-e" : "selecttolineend", - "S-C-Home" : "selecttostart", - "S-C-End" : "selecttoend", - - "C-l" : "recenterTopBottom", - "M-s" : "centerselection", + "Up|C-p": { command: "goorselect", args: ["golineup", "selectup"] }, + "Down|C-n": { command: "goorselect", args: ["golinedown", "selectdown"] }, + "Left|C-b": { command: "goorselect", args: ["gotoleft", "selectleft"] }, + "Right|C-f": { command: "goorselect", args: ["gotoright", "selectright"] }, + "C-Left|M-b": { command: "goorselect", args: ["gotowordleft", "selectwordleft"] }, + "C-Right|M-f": { command: "goorselect", args: ["gotowordright", "selectwordright"] }, + "Home|C-a": { command: "goorselect", args: ["gotolinestart", "selecttolinestart"] }, + "End|C-e": { command: "goorselect", args: ["gotolineend", "selecttolineend"] }, + "C-Home|S-M-,": { command: "goorselect", args: ["gotostart", "selecttostart"] }, + "C-End|S-M-.": { command: "goorselect", args: ["gotoend", "selecttoend"] }, + "S-Up|S-C-p": "selectup", + "S-Down|S-C-n": "selectdown", + "S-Left|S-C-b": "selectleft", + "S-Right|S-C-f": "selectright", + "S-C-Left|S-M-b": "selectwordleft", + "S-C-Right|S-M-f": "selectwordright", + "S-Home|S-C-a": "selecttolinestart", + "S-End|S-C-e": "selecttolineend", + "S-C-Home": "selecttostart", + "S-C-End": "selecttoend", + "C-l": "recenterTopBottom", + "M-s": "centerselection", "M-g": "gotoline", "C-x C-p": "selectall", - "C-Down": {command: "goorselect", args: ["gotopagedown","selectpagedown"]}, - "C-Up": {command: "goorselect", args: ["gotopageup","selectpageup"]}, - "PageDown|C-v": {command: "goorselect", args: ["gotopagedown","selectpagedown"]}, - "PageUp|M-v": {command: "goorselect", args: ["gotopageup","selectpageup"]}, + "C-Down": { command: "goorselect", args: ["gotopagedown", "selectpagedown"] }, + "C-Up": { command: "goorselect", args: ["gotopageup", "selectpageup"] }, + "PageDown|C-v": { command: "goorselect", args: ["gotopagedown", "selectpagedown"] }, + "PageUp|M-v": { command: "goorselect", args: ["gotopageup", "selectpageup"] }, "S-C-Down": "selectpagedown", "S-C-Up": "selectpageup", - "C-s": "iSearch", "C-r": "iSearchBackwards", - "M-C-s": "findnext", "M-C-r": "findprevious", "S-M-5": "replace", "Backspace": "backspace", "Delete|C-d": "del", - "Return|C-m": {command: "insertstring", args: "\n"}, // "newline" + "Return|C-m": { command: "insertstring", args: "\n" }, // "newline" "C-o": "splitline", - - "M-d|C-Delete": {command: "killWord", args: "right"}, - "C-Backspace|M-Backspace|M-Delete": {command: "killWord", args: "left"}, + "M-d|C-Delete": { command: "killWord", args: "right" }, + "C-Backspace|M-Backspace|M-Delete": { command: "killWord", args: "left" }, "C-k": "killLine", - "C-y|S-Delete": "yank", "M-y": "yankRotate", "C-g": "keyboardQuit", - "C-w|C-S-W": "killRegion", "M-w": "killRingSave", "C-Space": "setMark", "C-x C-x": "exchangePointAndMark", - "C-t": "transposeletters", - "M-u": "touppercase", // Doesn't work + "M-u": "touppercase", // Doesn't work "M-l": "tolowercase", - "M-/": "autocomplete", // Doesn't work + "M-/": "autocomplete", // Doesn't work "C-u": "universalArgument", - "M-;": "togglecomment", - "C-/|C-x u|S-C--|C-z": "undo", "S-C-/|S-C-x u|C--|S-C-z": "redo", // infinite undo? - "C-x r": "selectRectangularRegion", - "M-x": {command: "focusCommandLine", args: "M-x "} + "C-x r": "selectRectangularRegion", + "M-x": { command: "focusCommandLine", args: "M-x " } }; - - exports.handler.bindKeys(exports.emacsKeys); - exports.handler.addCommands({ - recenterTopBottom: function(editor) { + recenterTopBottom: function (editor) { var renderer = editor.renderer; var pos = renderer.$cursorLayer.getPixelPosition(); var h = renderer.$size.scrollerHeight - renderer.lineHeight; var scrollTop = renderer.scrollTop; if (Math.abs(pos.top - scrollTop) < 2) { scrollTop = pos.top - h; - } else if (Math.abs(pos.top - scrollTop - h * 0.5) < 2) { + } + else if (Math.abs(pos.top - scrollTop - h * 0.5) < 2) { scrollTop = pos.top; - } else { + } + else { scrollTop = pos.top - h * 0.5; } editor.session.setScrollTop(scrollTop); }, - selectRectangularRegion: function(editor) { + selectRectangularRegion: function (editor) { editor.multiSelect.toggleBlockSelection(); }, - setMark: { - exec: function(editor, args) { - + setMark: { + exec: function (editor, args) { if (args && args.count) { - if (editor.inMultiSelectMode) editor.forEachSelection(moveToMark); - else moveToMark(); + if (editor.inMultiSelectMode) + editor.forEachSelection(moveToMark); + else + moveToMark(); moveToMark(); return; } - - var mark = editor.emacsMark(), - ranges = editor.selection.getAllRanges(), - rangePositions = ranges.map(function(r) { return {row: r.start.row, column: r.start.column}; }), - transientMarkModeActive = true, - hasNoSelection = ranges.every(function(range) { return range.isEmpty(); }); + var mark = editor.emacsMark(), ranges = editor.selection.getAllRanges(), rangePositions = ranges.map(function (r) { return { row: r.start.row, column: r.start.column }; }), transientMarkModeActive = true, hasNoSelection = ranges.every(function (range) { return range.isEmpty(); }); if (transientMarkModeActive && (mark || !hasNoSelection)) { - if (editor.inMultiSelectMode) editor.forEachSelection({exec: editor.clearSelection.bind(editor)}); - else editor.clearSelection(); - if (mark) editor.pushEmacsMark(null); + if (editor.inMultiSelectMode) + editor.forEachSelection({ exec: editor.clearSelection.bind(editor) }); + else + editor.clearSelection(); + if (mark) + editor.pushEmacsMark(null); return; } - if (!mark) { - rangePositions.forEach(function(pos) { editor.pushEmacsMark(pos); }); - editor.setEmacsMark(rangePositions[rangePositions.length-1]); + rangePositions.forEach(function (pos) { editor.pushEmacsMark(pos); }); + editor.setEmacsMark(rangePositions[rangePositions.length - 1]); return; } - function moveToMark() { var mark = editor.popEmacsMark(); mark && editor.moveCursorToPosition(mark); } - }, readOnly: true, handlesCount: true @@ -1012,12 +917,12 @@ exports.handler.addCommands({ sel.setSelectionRange(sel.getRange(), !sel.isBackwards()); return; } - if (args.count) { // replace mark and point - var pos = {row: sel.lead.row, column: sel.lead.column}; + var pos = { row: sel.lead.row, column: sel.lead.column }; sel.clearSelection(); sel.moveCursorToPosition(editor.emacsMarkForSelection(pos)); - } else { // create selection to last mark + } + else { // create selection to last mark sel.selectToPosition(editor.emacsMarkForSelection()); } }, @@ -1026,30 +931,27 @@ exports.handler.addCommands({ multiSelectAction: "forEach" }, killWord: { - exec: function(editor, dir) { + exec: function (editor, dir) { editor.clearSelection(); if (dir == "left") editor.selection.selectWordLeft(); else editor.selection.selectWordRight(); - var range = editor.getSelectionRange(); var text = editor.session.getTextRange(range); exports.killRing.add(text); - editor.session.remove(range); editor.clearSelection(); }, multiSelectAction: "forEach" }, - killLine: function(editor) { + killLine: function (editor) { editor.pushEmacsMark(null); editor.clearSelection(); var range = editor.getSelectionRange(); var line = editor.session.getLine(range.start.row); range.end.column = line.length; line = line.substr(range.start.column); - var foldLine = editor.session.getFoldLine(range.start.row); if (foldLine && range.end.row != foldLine.end.row) { range.end.row = foldLine.end.row; @@ -1065,15 +967,14 @@ exports.handler.addCommands({ exports.killRing.append(text); else exports.killRing.add(text); - editor.session.remove(range); editor.clearSelection(); }, - yank: function(editor) { + yank: function (editor) { editor.onPaste(exports.killRing.get() || ''); editor.keyBinding.$data.lastCommand = "yank"; }, - yankRotate: function(editor) { + yankRotate: function (editor) { if (editor.keyBinding.$data.lastCommand != "yank") return; editor.undo(); @@ -1082,7 +983,7 @@ exports.handler.addCommands({ editor.keyBinding.$data.lastCommand = "yank"; }, killRegion: { - exec: function(editor) { + exec: function (editor) { exports.killRing.add(editor.getCopyText()); editor.commands.byName.cut.exec(editor); editor.setEmacsMark(null); @@ -1091,69 +992,66 @@ exports.handler.addCommands({ multiSelectAction: "forEach" }, killRingSave: { - exec: function(editor) { - + exec: function (editor) { editor.$handlesEmacsOnCopy = true; - var marks = editor.session.$emacsMarkRing.slice(), - deselectedMarks = []; + var marks = editor.session.$emacsMarkRing.slice(), deselectedMarks = []; exports.killRing.add(editor.getCopyText()); - - setTimeout(function() { + setTimeout(function () { function deselect() { - var sel = editor.selection, range = sel.getRange(), - pos = sel.isBackwards() ? range.end : range.start; - deselectedMarks.push({row: pos.row, column: pos.column}); + var sel = editor.selection, range = sel.getRange(), pos = sel.isBackwards() ? range.end : range.start; + deselectedMarks.push({ row: pos.row, column: pos.column }); sel.clearSelection(); } editor.$handlesEmacsOnCopy = false; - if (editor.inMultiSelectMode) editor.forEachSelection({exec: deselect}); - else deselect(); + if (editor.inMultiSelectMode) + editor.forEachSelection({ exec: deselect }); + else + deselect(); editor.setEmacsMark(null); editor.session.$emacsMarkRing = marks.concat(deselectedMarks.reverse()); }, 0); }, readOnly: true }, - keyboardQuit: function(editor) { + keyboardQuit: function (editor) { editor.selection.clearSelection(); editor.setEmacsMark(null); editor.keyBinding.$data.count = null; }, - focusCommandLine: function(editor, arg) { + focusCommandLine: function (editor, arg) { if (editor.showCommandLine) editor.showCommandLine(arg); } }); - exports.handler.addCommands(iSearchCommandModule.iSearchStartCommands); - var commands = exports.handler.commands; commands.yank.isYank = true; commands.yankRotate.isYank = true; - exports.killRing = { $data: [], - add: function(str) { + add: function (str) { str && this.$data.push(str); if (this.$data.length > 30) this.$data.shift(); }, - append: function(str) { + append: function (str) { var idx = this.$data.length - 1; var text = this.$data[idx] || ""; - if (str) text += str; - if (text) this.$data[idx] = text; + if (str) + text += str; + if (text) + this.$data[idx] = text; }, - get: function(n) { + get: function (n) { n = n || 1; - return this.$data.slice(this.$data.length-n, this.$data.length).reverse().join('\n'); + return this.$data.slice(this.$data.length - n, this.$data.length).reverse().join('\n'); }, - pop: function() { + pop: function () { if (this.$data.length > 1) this.$data.pop(); return this.get(); }, - rotate: function() { + rotate: function () { this.$data.unshift(this.$data.pop()); return this.get(); } diff --git a/app/Resources/ui/js/ace/keybinding-sublime.js b/app/Resources/ui/js/ace/keybinding-sublime.js index 21fcb380..be4430e1 100644 --- a/app/Resources/ui/js/ace/keybinding-sublime.js +++ b/app/Resources/ui/js/ace/keybinding-sublime.js @@ -1,20 +1,17 @@ -define("ace/keyboard/sublime",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module) { -"use strict"; - +define("ace/keyboard/sublime",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module){"use strict"; var HashHandler = require("../keyboard/hash_handler").HashHandler; - function moveBySubWords(editor, direction, extend) { var selection = editor.selection; var row = selection.lead.row; var column = selection.lead.column; - var line = editor.session.getLine(row); if (!line[column + direction]) { var method = (extend ? "selectWord" : "moveCursorShortWord") + (direction == 1 ? "Right" : "Left"); return editor.selection[method](); } - if (direction == -1) column--; + if (direction == -1) + column--; while (line[column]) { var type = getType(line[column]) + getType(line[column + direction]); column += direction; @@ -27,7 +24,8 @@ function moveBySubWords(editor, direction, extend) { if (getType(line[column - 1]) == "W") { column -= 1; break; - } else { + } + else { continue; } } @@ -37,375 +35,364 @@ function moveBySubWords(editor, direction, extend) { if (/w[s_oW]|_[sWo]|o[s_wW]|s[W]|W[so]/.test(type)) break; } - if (direction == -1) column++; + if (direction == -1) + column++; if (extend) editor.selection.moveCursorTo(row, column); else editor.selection.moveTo(row, column); - function getType(x) { - if (!x) return "-"; - if (/\s/.test(x)) return "s"; - if (x == "_") return "_"; - if (x.toUpperCase() == x && x.toLowerCase() != x) return "W"; - if (x.toUpperCase() != x && x.toLowerCase() == x) return "w"; + if (!x) + return "-"; + if (/\s/.test(x)) + return "s"; + if (x == "_") + return "_"; + if (x.toUpperCase() == x && x.toLowerCase() != x) + return "W"; + if (x.toUpperCase() != x && x.toLowerCase() == x) + return "w"; return "o"; } } - exports.handler = new HashHandler(); - exports.handler.addCommands([{ - name: "find_all_under", - exec: function(editor) { - if (editor.selection.isEmpty()) - editor.selection.selectWord(); - editor.findAll(); + name: "find_all_under", + exec: function (editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + editor.findAll(); + }, + readOnly: true + }, { + name: "find_under", + exec: function (editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + editor.findNext(); + }, + readOnly: true + }, { + name: "find_under_prev", + exec: function (editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + editor.findPrevious(); + }, + readOnly: true + }, { + name: "find_under_expand", + exec: function (editor) { + editor.selectMore(1, false, true); + }, + scrollIntoView: "animate", + readOnly: true + }, { + name: "find_under_expand_skip", + exec: function (editor) { + editor.selectMore(1, true, true); + }, + scrollIntoView: "animate", + readOnly: true + }, { + name: "delete_to_hard_bol", + exec: function (editor) { + var pos = editor.selection.getCursor(); + editor.session.remove({ + start: { row: pos.row, column: 0 }, + end: pos + }); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "delete_to_hard_eol", + exec: function (editor) { + var pos = editor.selection.getCursor(); + editor.session.remove({ + start: pos, + end: { row: pos.row, column: Infinity } + }); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "moveToWordStartLeft", + exec: function (editor) { + editor.selection.moveCursorLongWordLeft(); + editor.clearSelection(); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "moveToWordEndRight", + exec: function (editor) { + editor.selection.moveCursorLongWordRight(); + editor.clearSelection(); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "selectToWordStartLeft", + exec: function (editor) { + var sel = editor.selection; + sel.$moveSelection(sel.moveCursorLongWordLeft); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "selectToWordEndRight", + exec: function (editor) { + var sel = editor.selection; + sel.$moveSelection(sel.moveCursorLongWordRight); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "selectSubWordRight", + exec: function (editor) { + moveBySubWords(editor, 1, true); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectSubWordLeft", + exec: function (editor) { + moveBySubWords(editor, -1, true); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "moveSubWordRight", + exec: function (editor) { + moveBySubWords(editor, 1); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "moveSubWordLeft", + exec: function (editor) { + moveBySubWords(editor, -1); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }]); +[{ + bindKey: { mac: "cmd-k cmd-backspace|cmd-backspace", win: "ctrl-shift-backspace|ctrl-k ctrl-backspace" }, + name: "removetolinestarthard" + }, { + bindKey: { mac: "cmd-k cmd-k|cmd-delete|ctrl-k", win: "ctrl-shift-delete|ctrl-k ctrl-k" }, + name: "removetolineendhard" + }, { + bindKey: { mac: "cmd-shift-d", win: "ctrl-shift-d" }, + name: "duplicateSelection" + }, { + bindKey: { mac: "cmd-l", win: "ctrl-l" }, + name: "expandtoline" }, - readOnly: true -}, { - name: "find_under", - exec: function(editor) { - if (editor.selection.isEmpty()) - editor.selection.selectWord(); - editor.findNext(); + { + bindKey: { mac: "cmd-shift-a", win: "ctrl-shift-a" }, + name: "expandSelection", + args: { to: "tag" } + }, { + bindKey: { mac: "cmd-shift-j", win: "ctrl-shift-j" }, + name: "expandSelection", + args: { to: "indentation" } + }, { + bindKey: { mac: "ctrl-shift-m", win: "ctrl-shift-m" }, + name: "expandSelection", + args: { to: "brackets" } + }, { + bindKey: { mac: "cmd-shift-space", win: "ctrl-shift-space" }, + name: "expandSelection", + args: { to: "scope" } }, - readOnly: true -}, { - name: "find_under_prev", - exec: function(editor) { - if (editor.selection.isEmpty()) - editor.selection.selectWord(); - editor.findPrevious(); + { + bindKey: { mac: "ctrl-cmd-g", win: "alt-f3" }, + name: "find_all_under" + }, { + bindKey: { mac: "alt-cmd-g", win: "ctrl-f3" }, + name: "find_under" + }, { + bindKey: { mac: "shift-alt-cmd-g", win: "ctrl-shift-f3" }, + name: "find_under_prev" + }, { + bindKey: { mac: "cmd-g", win: "f3" }, + name: "findnext" + }, { + bindKey: { mac: "shift-cmd-g", win: "shift-f3" }, + name: "findprevious" + }, { + bindKey: { mac: "cmd-d", win: "ctrl-d" }, + name: "find_under_expand" + }, { + bindKey: { mac: "cmd-k cmd-d", win: "ctrl-k ctrl-d" }, + name: "find_under_expand_skip" }, - readOnly: true -}, { - name: "find_under_expand", - exec: function(editor) { - editor.selectMore(1, false, true); + { + bindKey: { mac: "cmd-alt-[", win: "ctrl-shift-[" }, + name: "toggleFoldWidget" + }, { + bindKey: { mac: "cmd-alt-]", win: "ctrl-shift-]" }, + name: "unfold" + }, { + bindKey: { mac: "cmd-k cmd-0|cmd-k cmd-j", win: "ctrl-k ctrl-0|ctrl-k ctrl-j" }, + name: "unfoldall" + }, { + bindKey: { mac: "cmd-k cmd-1", win: "ctrl-k ctrl-1" }, + name: "foldOther", + args: { level: 1 } }, - scrollIntoView: "animate", - readOnly: true -}, { - name: "find_under_expand_skip", - exec: function(editor) { - editor.selectMore(1, true, true); + { + bindKey: { win: "ctrl-left", mac: "alt-left" }, + name: "moveToWordStartLeft" + }, { + bindKey: { win: "ctrl-right", mac: "alt-right" }, + name: "moveToWordEndRight" + }, { + bindKey: { win: "ctrl-shift-left", mac: "alt-shift-left" }, + name: "selectToWordStartLeft" + }, { + bindKey: { win: "ctrl-shift-right", mac: "alt-shift-right" }, + name: "selectToWordEndRight" }, - scrollIntoView: "animate", - readOnly: true -}, { - name: "delete_to_hard_bol", - exec: function(editor) { - var pos = editor.selection.getCursor(); - editor.session.remove({ - start: { row: pos.row, column: 0 }, - end: pos - }); + { + bindKey: { mac: "ctrl-alt-shift-right|ctrl-shift-right", win: "alt-shift-right" }, + name: "selectSubWordRight" + }, { + bindKey: { mac: "ctrl-alt-shift-left|ctrl-shift-left", win: "alt-shift-left" }, + name: "selectSubWordLeft" + }, { + bindKey: { mac: "ctrl-alt-right|ctrl-right", win: "alt-right" }, + name: "moveSubWordRight" + }, { + bindKey: { mac: "ctrl-alt-left|ctrl-left", win: "alt-left" }, + name: "moveSubWordLeft" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "delete_to_hard_eol", - exec: function(editor) { - var pos = editor.selection.getCursor(); - editor.session.remove({ - start: pos, - end: { row: pos.row, column: Infinity } - }); + { + bindKey: { mac: "ctrl-m", win: "ctrl-m" }, + name: "jumptomatching", + args: { to: "brackets" } }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "moveToWordStartLeft", - exec: function(editor) { - editor.selection.moveCursorLongWordLeft(); - editor.clearSelection(); + { + bindKey: { mac: "ctrl-f6", win: "ctrl-f6" }, + name: "goToNextError" + }, { + bindKey: { mac: "ctrl-shift-f6", win: "ctrl-shift-f6" }, + name: "goToPreviousError" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "moveToWordEndRight", - exec: function(editor) { - editor.selection.moveCursorLongWordRight(); - editor.clearSelection(); + { + bindKey: { mac: "ctrl-o" }, + name: "splitline" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "selectToWordStartLeft", - exec: function(editor) { - var sel = editor.selection; - sel.$moveSelection(sel.moveCursorLongWordLeft); + { + bindKey: { mac: "ctrl-shift-w", win: "alt-shift-w" }, + name: "surrowndWithTag" + }, { + bindKey: { mac: "cmd-alt-.", win: "alt-." }, + name: "close_tag" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "selectToWordEndRight", - exec: function(editor) { - var sel = editor.selection; - sel.$moveSelection(sel.moveCursorLongWordRight); + { + bindKey: { mac: "cmd-j", win: "ctrl-j" }, + name: "joinlines" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "selectSubWordRight", - exec: function(editor) { - moveBySubWords(editor, 1, true); + { + bindKey: { mac: "ctrl--", win: "alt--" }, + name: "jumpBack" + }, { + bindKey: { mac: "ctrl-shift--", win: "alt-shift--" }, + name: "jumpForward" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectSubWordLeft", - exec: function(editor) { - moveBySubWords(editor, -1, true); + { + bindKey: { mac: "cmd-k cmd-l", win: "ctrl-k ctrl-l" }, + name: "tolowercase" + }, { + bindKey: { mac: "cmd-k cmd-u", win: "ctrl-k ctrl-u" }, + name: "touppercase" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "moveSubWordRight", - exec: function(editor) { - moveBySubWords(editor, 1); + { + bindKey: { mac: "cmd-shift-v", win: "ctrl-shift-v" }, + name: "paste_and_indent" + }, { + bindKey: { mac: "cmd-k cmd-v|cmd-alt-v", win: "ctrl-k ctrl-v" }, + name: "paste_from_history" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "moveSubWordLeft", - exec: function(editor) { - moveBySubWords(editor, -1); + { + bindKey: { mac: "cmd-shift-enter", win: "ctrl-shift-enter" }, + name: "addLineBefore" + }, { + bindKey: { mac: "cmd-enter", win: "ctrl-enter" }, + name: "addLineAfter" + }, { + bindKey: { mac: "ctrl-shift-k", win: "ctrl-shift-k" }, + name: "removeline" + }, { + bindKey: { mac: "ctrl-alt-up", win: "ctrl-up" }, + name: "scrollup" + }, { + bindKey: { mac: "ctrl-alt-down", win: "ctrl-down" }, + name: "scrolldown" + }, { + bindKey: { mac: "cmd-a", win: "ctrl-a" }, + name: "selectall" + }, { + bindKey: { linux: "alt-shift-down", mac: "ctrl-shift-down", win: "ctrl-alt-down" }, + name: "addCursorBelow" + }, { + bindKey: { linux: "alt-shift-up", mac: "ctrl-shift-up", win: "ctrl-alt-up" }, + name: "addCursorAbove" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}]); - - -[{ - bindKey: { mac: "cmd-k cmd-backspace|cmd-backspace", win: "ctrl-shift-backspace|ctrl-k ctrl-backspace" }, - name: "removetolinestarthard" -}, { - bindKey: { mac: "cmd-k cmd-k|cmd-delete|ctrl-k", win: "ctrl-shift-delete|ctrl-k ctrl-k" }, - name: "removetolineendhard" -}, { - bindKey: { mac: "cmd-shift-d", win: "ctrl-shift-d" }, - name: "duplicateSelection" -}, { - bindKey: { mac: "cmd-l", win: "ctrl-l" }, - name: "expandtoline" -}, -{ - bindKey: {mac: "cmd-shift-a", win: "ctrl-shift-a"}, - name: "expandSelection", - args: {to: "tag"} -}, { - bindKey: {mac: "cmd-shift-j", win: "ctrl-shift-j"}, - name: "expandSelection", - args: {to: "indentation"} -}, { - bindKey: {mac: "ctrl-shift-m", win: "ctrl-shift-m"}, - name: "expandSelection", - args: {to: "brackets"} -}, { - bindKey: {mac: "cmd-shift-space", win: "ctrl-shift-space"}, - name: "expandSelection", - args: {to: "scope"} -}, -{ - bindKey: { mac: "ctrl-cmd-g", win: "alt-f3" }, - name: "find_all_under" -}, { - bindKey: { mac: "alt-cmd-g", win: "ctrl-f3" }, - name: "find_under" -}, { - bindKey: { mac: "shift-alt-cmd-g", win: "ctrl-shift-f3" }, - name: "find_under_prev" -}, { - bindKey: { mac: "cmd-g", win: "f3" }, - name: "findnext" -}, { - bindKey: { mac: "shift-cmd-g", win: "shift-f3" }, - name: "findprevious" -}, { - bindKey: { mac: "cmd-d", win: "ctrl-d" }, - name: "find_under_expand" -}, { - bindKey: { mac: "cmd-k cmd-d", win: "ctrl-k ctrl-d" }, - name: "find_under_expand_skip" -}, -{ - bindKey: { mac: "cmd-alt-[", win: "ctrl-shift-[" }, - name: "toggleFoldWidget" -}, { - bindKey: { mac: "cmd-alt-]", win: "ctrl-shift-]" }, - name: "unfold" -}, { - bindKey: { mac: "cmd-k cmd-0|cmd-k cmd-j", win: "ctrl-k ctrl-0|ctrl-k ctrl-j" }, - name: "unfoldall" -}, { - bindKey: { mac: "cmd-k cmd-1", win: "ctrl-k ctrl-1" }, - name: "foldOther", - args: { level: 1 } -}, -{ - bindKey: { win: "ctrl-left", mac: "alt-left" }, - name: "moveToWordStartLeft" -}, { - bindKey: { win: "ctrl-right", mac: "alt-right" }, - name: "moveToWordEndRight" -}, { - bindKey: { win: "ctrl-shift-left", mac: "alt-shift-left" }, - name: "selectToWordStartLeft" -}, { - bindKey: { win: "ctrl-shift-right", mac: "alt-shift-right" }, - name: "selectToWordEndRight" -}, -{ - bindKey: {mac: "ctrl-alt-shift-right|ctrl-shift-right", win: "alt-shift-right"}, - name: "selectSubWordRight" -}, { - bindKey: {mac: "ctrl-alt-shift-left|ctrl-shift-left", win: "alt-shift-left"}, - name: "selectSubWordLeft" -}, { - bindKey: {mac: "ctrl-alt-right|ctrl-right", win: "alt-right"}, - name: "moveSubWordRight" -}, { - bindKey: {mac: "ctrl-alt-left|ctrl-left", win: "alt-left"}, - name: "moveSubWordLeft" -}, -{ - bindKey: { mac: "ctrl-m", win: "ctrl-m" }, - name: "jumptomatching", - args: { to: "brackets" } -}, -{ - bindKey: { mac: "ctrl-f6", win: "ctrl-f6" }, - name: "goToNextError" -}, { - bindKey: { mac: "ctrl-shift-f6", win: "ctrl-shift-f6" }, - name: "goToPreviousError" -}, - -{ - bindKey: { mac: "ctrl-o" }, - name: "splitline" -}, -{ - bindKey: {mac: "ctrl-shift-w", win: "alt-shift-w"}, - name: "surrowndWithTag" -},{ - bindKey: {mac: "cmd-alt-.", win: "alt-."}, - name: "close_tag" -}, -{ - bindKey: { mac: "cmd-j", win: "ctrl-j" }, - name: "joinlines" -}, - -{ - bindKey: {mac: "ctrl--", win: "alt--"}, - name: "jumpBack" -}, { - bindKey: {mac: "ctrl-shift--", win: "alt-shift--"}, - name: "jumpForward" -}, - -{ - bindKey: { mac: "cmd-k cmd-l", win: "ctrl-k ctrl-l" }, - name: "tolowercase" -}, { - bindKey: { mac: "cmd-k cmd-u", win: "ctrl-k ctrl-u" }, - name: "touppercase" -}, - -{ - bindKey: {mac: "cmd-shift-v", win: "ctrl-shift-v"}, - name: "paste_and_indent" -}, { - bindKey: {mac: "cmd-k cmd-v|cmd-alt-v", win: "ctrl-k ctrl-v"}, - name: "paste_from_history" -}, - -{ - bindKey: { mac: "cmd-shift-enter", win: "ctrl-shift-enter" }, - name: "addLineBefore" -}, { - bindKey: { mac: "cmd-enter", win: "ctrl-enter" }, - name: "addLineAfter" -}, { - bindKey: { mac: "ctrl-shift-k", win: "ctrl-shift-k" }, - name: "removeline" -}, { - bindKey: { mac: "ctrl-alt-up", win: "ctrl-up" }, - name: "scrollup" -}, { - bindKey: { mac: "ctrl-alt-down", win: "ctrl-down" }, - name: "scrolldown" -}, { - bindKey: { mac: "cmd-a", win: "ctrl-a" }, - name: "selectall" -}, { - bindKey: { linux: "alt-shift-down", mac: "ctrl-shift-down", win: "ctrl-alt-down" }, - name: "addCursorBelow" -}, { - bindKey: { linux: "alt-shift-up", mac: "ctrl-shift-up", win: "ctrl-alt-up" }, - name: "addCursorAbove" -}, - - -{ - bindKey: { mac: "cmd-k cmd-c|ctrl-l", win: "ctrl-k ctrl-c" }, - name: "centerselection" -}, - -{ - bindKey: { mac: "f5", win: "f9" }, - name: "sortlines" -}, -{ - bindKey: {mac: "ctrl-f5", win: "ctrl-f9"}, - name: "sortlines", - args: {caseSensitive: true} -}, -{ - bindKey: { mac: "cmd-shift-l", win: "ctrl-shift-l" }, - name: "splitSelectionIntoLines" -}, { - bindKey: { mac: "ctrl-cmd-down", win: "ctrl-shift-down" }, - name: "movelinesdown" -}, { - bindKey: { mac: "ctrl-cmd-up", win: "ctrl-shift-up" }, - name: "movelinesup" -}, { - bindKey: { mac: "alt-down", win: "alt-down" }, - name: "modifyNumberDown" -}, { - bindKey: { mac: "alt-up", win: "alt-up" }, - name: "modifyNumberUp" -}, { - bindKey: { mac: "cmd-/", win: "ctrl-/" }, - name: "togglecomment" -}, { - bindKey: { mac: "cmd-alt-/", win: "ctrl-shift-/" }, - name: "toggleBlockComment" -}, - - -{ - bindKey: { linux: "ctrl-alt-q", mac: "ctrl-q", win: "ctrl-q" }, - name: "togglerecording" -}, { - bindKey: { linux: "ctrl-alt-shift-q", mac: "ctrl-shift-q", win: "ctrl-shift-q" }, - name: "replaymacro" -}, - -{ - bindKey: { mac: "ctrl-t", win: "ctrl-t" }, - name: "transpose" -} - -].forEach(function(binding) { + { + bindKey: { mac: "cmd-k cmd-c|ctrl-l", win: "ctrl-k ctrl-c" }, + name: "centerselection" + }, + { + bindKey: { mac: "f5", win: "f9" }, + name: "sortlines" + }, + { + bindKey: { mac: "ctrl-f5", win: "ctrl-f9" }, + name: "sortlines", + args: { caseSensitive: true } + }, + { + bindKey: { mac: "cmd-shift-l", win: "ctrl-shift-l" }, + name: "splitSelectionIntoLines" + }, { + bindKey: { mac: "ctrl-cmd-down", win: "ctrl-shift-down" }, + name: "movelinesdown" + }, { + bindKey: { mac: "ctrl-cmd-up", win: "ctrl-shift-up" }, + name: "movelinesup" + }, { + bindKey: { mac: "alt-down", win: "alt-down" }, + name: "modifyNumberDown" + }, { + bindKey: { mac: "alt-up", win: "alt-up" }, + name: "modifyNumberUp" + }, { + bindKey: { mac: "cmd-/", win: "ctrl-/" }, + name: "togglecomment" + }, { + bindKey: { mac: "cmd-alt-/", win: "ctrl-shift-/" }, + name: "toggleBlockComment" + }, + { + bindKey: { linux: "ctrl-alt-q", mac: "ctrl-q", win: "ctrl-q" }, + name: "togglerecording" + }, { + bindKey: { linux: "ctrl-alt-shift-q", mac: "ctrl-shift-q", win: "ctrl-shift-q" }, + name: "replaymacro" + }, + { + bindKey: { mac: "ctrl-t", win: "ctrl-t" }, + name: "transpose" + } +].forEach(function (binding) { var command = exports.handler.commands[binding.name]; if (command) command.bindKey = binding.bindKey; diff --git a/app/Resources/ui/js/ace/keybinding-vim.js b/app/Resources/ui/js/ace/keybinding-vim.js index bfb7e0ba..d0cded10 100644 --- a/app/Resources/ui/js/ace/keybinding-vim.js +++ b/app/Resources/ui/js/ace/keybinding-vim.js @@ -1,47 +1,52 @@ -define("ace/ext/hardwrap",["require","exports","module","ace/range","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/hardwrap",["require","exports","module","ace/range","ace/editor","ace/config"], function(require, exports, module){/** + * ## Text hard wrapping extension for automatic line breaking and text formatting. + * + * Provides intelligent line wrapping functionality that breaks long lines at configurable column limits while + * preserving indentation and optionally merging short adjacent lines. Supports both automatic wrapping during text + * input and manual formatting of selected text ranges. + * + * **Enable:** `editor.setOption("hardWrap", true)` + * or configure it during editor initialization in the options object. + * @module + */ "use strict"; - var Range = require("../range").Range; - function hardWrap(editor, options) { var max = options.column || editor.getOption("printMarginColumn"); var allowMerge = options.allowMerge != false; - var row = Math.min(options.startRow, options.endRow); var endRow = Math.max(options.startRow, options.endRow); - var session = editor.session; - while (row <= endRow) { var line = session.getLine(row); if (line.length > max) { var space = findSpace(line, max, 5); if (space) { var indentation = /^\s*/.exec(line)[0]; - session.replace(new Range(row,space.start,row,space.end), "\n" + indentation); + session.replace(new Range(row, space.start, row, space.end), "\n" + indentation); } endRow++; - } else if (allowMerge && /\S/.test(line) && row != endRow) { + } + else if (allowMerge && /\S/.test(line) && row != endRow) { var nextLine = session.getLine(row + 1); if (nextLine && /\S/.test(nextLine)) { var trimmedLine = line.replace(/\s+$/, ""); var trimmedNextLine = nextLine.replace(/^\s+/, ""); var mergedLine = trimmedLine + " " + trimmedNextLine; - var space = findSpace(mergedLine, max, 5); if (space && space.start > trimmedLine.length || mergedLine.length < max) { - var replaceRange = new Range(row,trimmedLine.length,row + 1,nextLine.length - trimmedNextLine.length); + var replaceRange = new Range(row, trimmedLine.length, row + 1, nextLine.length - trimmedNextLine.length); session.replace(replaceRange, " "); row--; endRow--; - } else if (trimmedLine.length < line.length) { + } + else if (trimmedLine.length < line.length) { session.remove(new Range(row, trimmedLine.length, row, line.length)); } } } row++; } - function findSpace(line, max, min) { if (line.length < max) return; @@ -73,92 +78,87 @@ function hardWrap(editor, options) { }; } if (spaceAfter && spaceAfter[2]) { - start = max + spaceAfter[2].length; + start = max + spaceAfter[2].length; return { start: start, end: start + spaceAfter[3].length }; } } - } - function wrapAfterInput(e) { if (e.command.name == "insertstring" && /\S/.test(e.args)) { var editor = e.editor; var cursor = editor.selection.cursor; - if (cursor.column <= editor.renderer.$printMarginColumn) return; + if (cursor.column <= editor.renderer.$printMarginColumn) + return; var lastDelta = editor.session.$undoManager.$lastDelta; - hardWrap(editor, { startRow: cursor.row, endRow: cursor.row, allowMerge: false }); - if (lastDelta != editor.session.$undoManager.$lastDelta) + if (lastDelta != editor.session.$undoManager.$lastDelta) editor.session.markUndoGroup(); } } - var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { hardWrap: { - set: function(val) { + set: function (val) { if (val) { this.commands.on("afterExec", wrapAfterInput); - } else { + } + else { this.commands.off("afterExec", wrapAfterInput); } }, value: false } }); - exports.hardWrap = hardWrap; }); -define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/dom","ace/lib/oop","ace/lib/keys","ace/lib/event","ace/search","ace/lib/useragent","ace/search_highlight","ace/commands/multi_select_commands","ace/mode/text","ace/ext/hardwrap","ace/multi_select"], function(require, exports, module) { - 'use strict'; - - function log() { +define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/dom","ace/lib/oop","ace/lib/keys","ace/lib/event","ace/search","ace/lib/useragent","ace/search_highlight","ace/commands/multi_select_commands","ace/mode/text","ace/ext/hardwrap","ace/multi_select"], function(require, exports, module){// CodeMirror, copyright (c) by Marijn Haverbeke and others +'use strict'; +function log() { var d = ""; function format(p) { - if (typeof p != "object") - return p + ""; - if ("line" in p) { - return p.line + ":" + p.ch; - } - if ("anchor" in p) { - return format(p.anchor) + "->" + format(p.head); - } - if (Array.isArray(p)) - return "[" + p.map(function(x) { - return format(x); - }) + "]"; - return JSON.stringify(p); + if (typeof p != "object") + return p + ""; + if ("line" in p) { + return p.line + ":" + p.ch; + } + if ("anchor" in p) { + return format(p.anchor) + "->" + format(p.head); + } + if (Array.isArray(p)) + return "[" + p.map(function (x) { + return format(x); + }) + "]"; + return JSON.stringify(p); } for (var i = 0; i < arguments.length; i++) { - var p = arguments[i]; - var f = format(p); - d += f + " "; + var p = arguments[i]; + var f = format(p); + d += f + " "; } console.log(d); - } - var Range = require("../range").Range; - var EventEmitter = require("../lib/event_emitter").EventEmitter; - var dom = require("../lib/dom"); - var oop = require("../lib/oop"); - var KEYS = require("../lib/keys"); - var event = require("../lib/event"); - var Search = require("../search").Search; - var useragent = require("../lib/useragent"); - var SearchHighlight = require("../search_highlight").SearchHighlight; - var multiSelectCommands = require("../commands/multi_select_commands"); - var TextModeTokenRe = require("../mode/text").Mode.prototype.tokenRe; - var hardWrap = require("../ext/hardwrap").hardWrap; - require("../multi_select"); - - var CodeMirror = function(ace) { +} +var Range = require("../range").Range; +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var domLib = require("../lib/dom"); +var oop = require("../lib/oop"); +var KEYS = require("../lib/keys"); +var event = require("../lib/event"); +var Search = require("../search").Search; +var useragent = require("../lib/useragent"); +var SearchHighlight = require("../search_highlight").SearchHighlight; +var multiSelectCommands = require("../commands/multi_select_commands"); +var TextModeTokenRe = require("../mode/text").Mode.prototype.tokenRe; +var hardWrap = require("../ext/hardwrap").hardWrap; +require("../multi_select"); +var CodeMirror = function (ace) { this.ace = ace; this.state = {}; this.marks = {}; @@ -170,836 +170,882 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve this.ace.on('change', this.onChange); this.ace.on('changeSelection', this.onSelectionChange); this.ace.on('beforeEndOperation', this.onBeforeEndOperation); - }; - CodeMirror.Pos = function(line, ch) { - if (!(this instanceof Pos)) return new Pos(line, ch); - this.line = line; this.ch = ch; - }; - CodeMirror.defineOption = function(name, val, setter) {}; - CodeMirror.commands = { - redo: function(cm) { cm.ace.redo(); }, - undo: function(cm) { cm.ace.undo(); }, - newlineAndIndent: function(cm) { cm.ace.insert("\n"); }, - goLineLeft: function(cm) { cm.ace.selection.moveCursorLineStart(); }, - goLineRight: function(cm) { cm.ace.selection.moveCursorLineEnd(); } - }; - CodeMirror.keyMap = {}; - CodeMirror.addClass = CodeMirror.rmClass = function() {}; - CodeMirror.e_stop = CodeMirror.e_preventDefault = event.stopEvent; - CodeMirror.keyName = function(e) { +}; +CodeMirror.Pos = function (line, ch) { + if (!(this instanceof Pos)) + return new Pos(line, ch); + this.line = line; + this.ch = ch; +}; +CodeMirror.defineOption = function (name, val, setter) { }; +CodeMirror.commands = { + redo: function (cm) { cm.ace.redo(); }, + undo: function (cm) { cm.ace.undo(); }, + newlineAndIndent: function (cm) { cm.ace.insert("\n"); }, + goLineLeft: function (cm) { cm.ace.selection.moveCursorLineStart(); }, + goLineRight: function (cm) { cm.ace.selection.moveCursorLineEnd(); } +}; +CodeMirror.keyMap = {}; +CodeMirror.addClass = CodeMirror.rmClass = function () { }; +CodeMirror.e_stop = CodeMirror.e_preventDefault = event.stopEvent; +CodeMirror.keyName = function (e) { var key = (KEYS[e.keyCode] || e.key || ""); - if (key.length == 1) key = key.toUpperCase(); - key = event.getModifierString(e).replace(/(^|-)\w/g, function(m) { - return m.toUpperCase(); + if (key.length == 1) + key = key.toUpperCase(); + key = event.getModifierString(e).replace(/(^|-)\w/g, function (m) { + return m.toUpperCase(); }) + key; return key; - }; - CodeMirror.keyMap['default'] = function(key) { - return function(cm) { - var cmd = cm.ace.commands.commandKeyBinding[key.toLowerCase()]; - return cmd && cm.ace.execCommand(cmd) !== false; +}; +CodeMirror.keyMap['default'] = function (key) { + return function (cm) { + var cmd = cm.ace.commands.commandKeyBinding[key.toLowerCase()]; + return cmd && cm.ace.execCommand(cmd) !== false; }; - }; - CodeMirror.lookupKey = function lookupKey(key, map, handle) { - if (!map) map = "default"; +}; +CodeMirror.lookupKey = function lookupKey(key, map, handle) { + if (!map) + map = "default"; if (typeof map == "string") - map = CodeMirror.keyMap[map]; + map = CodeMirror.keyMap[map] || CodeMirror.keyMap['default']; var found = typeof map == "function" ? map(key) : map[key]; - if (found === false) return "nothing"; - if (found === "...") return "multi"; - if (found != null && handle(found)) return "handled"; - + if (found === false) + return "nothing"; + if (found === "...") + return "multi"; + if (found != null && handle(found)) + return "handled"; if (map.fallthrough) { - if (!Array.isArray(map.fallthrough)) - return lookupKey(key, map.fallthrough, handle); - for (var i = 0; i < map.fallthrough.length; i++) { - var result = lookupKey(key, map.fallthrough[i], handle); - if (result) return result; - } - } - }; - - - CodeMirror.findMatchingTag = function(cm, head) { - - }; - - CodeMirror.signal = function(o, name, e) { return o._signal(name, e) }; - CodeMirror.on = event.addListener; - CodeMirror.off = event.removeListener; - CodeMirror.isWordChar = function(ch) { - if (ch < "\x7f") return /^\w$/.test(ch); + if (!Array.isArray(map.fallthrough)) + return lookupKey(key, map.fallthrough, handle); + for (var i = 0; i < map.fallthrough.length; i++) { + var result = lookupKey(key, map.fallthrough[i], handle); + if (result) + return result; + } + } +}; +CodeMirror.findMatchingTag = function (cm, head) { + return cm.findMatchingTag(head); +}; +CodeMirror.findEnclosingTag = function (cm, head) { +}; +CodeMirror.signal = function (o, name, e) { return o._signal(name, e); }; +CodeMirror.on = event.addListener; +CodeMirror.off = event.removeListener; +CodeMirror.isWordChar = function (ch) { + if (ch < "\x7f") + return /^\w$/.test(ch); TextModeTokenRe.lastIndex = 0; return TextModeTokenRe.test(ch); - }; - -(function() { - oop.implement(CodeMirror.prototype, EventEmitter); - - this.destroy = function() { - this.ace.off('change', this.onChange); - this.ace.off('changeSelection', this.onSelectionChange); - this.ace.off('beforeEndOperation', this.onBeforeEndOperation); - this.removeOverlay(); - }; - this.virtualSelectionMode = function() { - return this.ace.inVirtualSelectionMode && this.ace.selection.index; - }; - this.onChange = function(delta) { - var change = { text: delta.action[0] == 'i' ? delta.lines : [] }; - var curOp = this.curOp = this.curOp || {}; - if (!curOp.changeHandlers) - curOp.changeHandlers = this._eventRegistry["change"] && this._eventRegistry["change"].slice(); - if (!curOp.lastChange) { - curOp.lastChange = curOp.change = change; - } else { - curOp.lastChange.next = curOp.lastChange = change; - } - this.$updateMarkers(delta); - }; - this.onSelectionChange = function() { - var curOp = this.curOp = this.curOp || {}; - if (!curOp.cursorActivityHandlers) - curOp.cursorActivityHandlers = this._eventRegistry["cursorActivity"] && this._eventRegistry["cursorActivity"].slice(); - this.curOp.cursorActivity = true; - if (this.ace.inMultiSelectMode) { - this.ace.keyBinding.removeKeyboardHandler(multiSelectCommands.keyboardHandler); - } - }; - this.operation = function(fn, force) { - if (!force && this.curOp || force && this.curOp && this.curOp.force) { - return fn(); - } - if (force || !this.ace.curOp) { - if (this.curOp) - this.onBeforeEndOperation(); - } - if (!this.ace.curOp) { - var prevOp = this.ace.prevOp; - this.ace.startOperation({ - command: { name: "vim", scrollIntoView: "cursor" } - }); - } - var curOp = this.curOp = this.curOp || {}; - this.curOp.force = force; - var result = fn(); - if (this.ace.curOp && this.ace.curOp.command.name == "vim") { - if (this.state.dialog) - this.ace.curOp.command.scrollIntoView = false; - this.ace.endOperation(); - if (!curOp.cursorActivity && !curOp.lastChange && prevOp) - this.ace.prevOp = prevOp; - } - if (force || !this.ace.curOp) { - if (this.curOp) - this.onBeforeEndOperation(); - } - return result; - }; - this.onBeforeEndOperation = function() { - var op = this.curOp; - if (op) { - if (op.change) { this.signal("change", op.change, op); } - if (op && op.cursorActivity) { this.signal("cursorActivity", null, op); } - this.curOp = null; - } - }; - - this.signal = function(eventName, e, handlers) { - var listeners = handlers ? handlers[eventName + "Handlers"] - : (this._eventRegistry || {})[eventName]; - if (!listeners) - return; - listeners = listeners.slice(); - for (var i=0; i 0) { - point.row += rowShift; - point.column += point.row == end.row ? colShift : 0; - continue; - } - if (!isInsert && cmp2 <= 0) { - point.row = start.row; - point.column = start.column; - if (cmp2 === 0) - point.bias = 1; - } - } - }; - var Marker = function(cm, id, row, column) { - this.cm = cm; - this.id = id; - this.row = row; - this.column = column; - cm.marks[this.id] = this; - }; - Marker.prototype.clear = function() { delete this.cm.marks[this.id] }; - Marker.prototype.find = function() { return toCmPos(this) }; - this.setBookmark = function(cursor, options) { - var bm = new Marker(this, this.$uid++, cursor.line, cursor.ch); - if (!options || !options.insertLeft) - bm.$insertRight = true; - this.marks[bm.id] = bm; - return bm; - }; - this.moveH = function(increment, unit) { - if (unit == 'char') { - var sel = this.ace.selection; - sel.clearSelection(); - sel.moveCursorBy(0, increment); - } - }; - this.findPosV = function(start, amount, unit, goalColumn) { - if (unit == 'page') { - var renderer = this.ace.renderer; - var config = renderer.layerConfig; - amount = amount * Math.floor(config.height / config.lineHeight); - unit = 'line'; - } - if (unit == 'line') { - var screenPos = this.ace.session.documentToScreenPosition(start.line, start.ch); - if (goalColumn != null) - screenPos.column = goalColumn; - screenPos.row += amount; - screenPos.row = Math.min(Math.max(0, screenPos.row), this.ace.session.getScreenLength() - 1); - var pos = this.ace.session.screenToDocumentPosition(screenPos.row, screenPos.column); - return toCmPos(pos); - } else { - debugger; - } - }; - this.charCoords = function(pos, mode) { - if (mode == 'div' || !mode) { - var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch); - return {left: sc.column, top: sc.row}; - }if (mode == 'local') { - var renderer = this.ace.renderer; - var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch); - var lh = renderer.layerConfig.lineHeight; - var cw = renderer.layerConfig.characterWidth; - var top = lh * sc.row; - return {left: sc.column * cw, top: top, bottom: top + lh}; - } - }; - this.coordsChar = function(pos, mode) { - var renderer = this.ace.renderer; - if (mode == 'local') { - var row = Math.max(0, Math.floor(pos.top / renderer.lineHeight)); - var col = Math.max(0, Math.floor(pos.left / renderer.characterWidth)); - var ch = renderer.session.screenToDocumentPosition(row, col); - return toCmPos(ch); - } else if (mode == 'div') { - throw "not implemented"; - } - }; - this.getSearchCursor = function(query, pos, caseFold) { - var caseSensitive = false; - var isRegexp = false; - if (query instanceof RegExp && !query.global) { - caseSensitive = !query.ignoreCase; - query = query.source; - isRegexp = true; - } - if (query == "\\n") { query = "\n"; isRegexp = false; } - var search = new Search(); - if (pos.ch == undefined) pos.ch = Number.MAX_VALUE; - var acePos = {row: pos.line, column: pos.ch}; - var cm = this; - var last = null; - return { - findNext: function() { return this.find(false) }, - findPrevious: function() {return this.find(true) }, - find: function(back) { - search.setOptions({ - needle: query, - caseSensitive: caseSensitive, - wrap: false, - backwards: back, - regExp: isRegexp, - start: last || acePos +}; +(function () { + oop.implement(CodeMirror.prototype, EventEmitter); + this.destroy = function () { + this.ace.off('change', this.onChange); + this.ace.off('changeSelection', this.onSelectionChange); + this.ace.off('beforeEndOperation', this.onBeforeEndOperation); + this.removeOverlay(); + }; + this.virtualSelectionMode = function () { + return this.ace.inVirtualSelectionMode && this.ace.selection.index; + }; + this.onChange = function (delta) { + if (this.$lineHandleChanges) { + this.$lineHandleChanges.push(delta); + } + var change = { text: delta.action[0] == 'i' ? delta.lines : [] }; + var curOp = this.curOp = this.curOp || {}; + if (!curOp.changeHandlers) + curOp.changeHandlers = this._eventRegistry["change"] && this._eventRegistry["change"].slice(); + if (!curOp.lastChange) { + curOp.lastChange = curOp.change = change; + } + else { + curOp.lastChange.next = curOp.lastChange = change; + } + this.$updateMarkers(delta); + }; + this.onSelectionChange = function () { + var curOp = this.curOp = this.curOp || {}; + if (!curOp.cursorActivityHandlers) + curOp.cursorActivityHandlers = this._eventRegistry["cursorActivity"] && this._eventRegistry["cursorActivity"].slice(); + this.curOp.cursorActivity = true; + if (this.ace.inMultiSelectMode) { + this.ace.keyBinding.removeKeyboardHandler(multiSelectCommands.keyboardHandler); + } + }; + this.operation = function (fn, force) { + if (!force && this.curOp || force && this.curOp && this.curOp.force) { + return fn(); + } + if (force || !this.ace.curOp) { + if (this.curOp) + this.onBeforeEndOperation(); + } + if (!this.ace.curOp) { + var prevOp = this.ace.prevOp; + this.ace.startOperation({ + command: { name: "vim", scrollIntoView: "cursor" } + }); + } + var curOp = this.curOp = this.curOp || {}; + this.curOp.force = force; + var result = fn(); + if (this.ace.curOp && this.ace.curOp.command.name == "vim") { + if (this.state.dialog) + this.ace.curOp.command.scrollIntoView = this.ace.curOp.vimDialogScroll; + this.ace.endOperation(); + if (!curOp.cursorActivity && !curOp.lastChange && prevOp) + this.ace.prevOp = prevOp; + } + if (force || !this.ace.curOp) { + if (this.curOp) + this.onBeforeEndOperation(); + } + return result; + }; + this.onBeforeEndOperation = function () { + var op = this.curOp; + if (op) { + if (op.change) { + this.signal("change", op.change, op); + } + if (op && op.cursorActivity) { + this.signal("cursorActivity", null, op); + } + this.curOp = null; + } + }; + this.signal = function (eventName, e, handlers) { + var listeners = handlers ? handlers[eventName + "Handlers"] + : (this._eventRegistry || {})[eventName]; + if (!listeners) + return; + listeners = listeners.slice(); + for (var i = 0; i < listeners.length; i++) + listeners[i](this, e); + }; + this.firstLine = function () { return 0; }; + this.lastLine = function () { return this.ace.session.getLength() - 1; }; + this.lineCount = function () { return this.ace.session.getLength(); }; + this.setCursor = function (line, ch) { + if (typeof line === 'object') { + ch = line.ch; + line = line.line; + } + var shouldScroll = !this.curOp && !this.ace.inVirtualSelectionMode; + if (!this.ace.inVirtualSelectionMode) + this.ace.exitMultiSelectMode(); + this.ace.session.unfold({ row: line, column: ch }); + this.ace.selection.moveTo(line, ch); + if (shouldScroll) { + this.ace.renderer.scrollCursorIntoView(); + this.ace.endOperation(); + } + }; + this.getCursor = function (p) { + var sel = this.ace.selection; + var pos = p == 'anchor' ? (sel.isEmpty() ? sel.lead : sel.anchor) : + p == 'head' || !p ? sel.lead : sel.getRange()[p]; + return toCmPos(pos); + }; + this.listSelections = function (p) { + var ranges = this.ace.multiSelect.rangeList.ranges; + if (!ranges.length || this.ace.inVirtualSelectionMode) + return [{ anchor: this.getCursor('anchor'), head: this.getCursor('head') }]; + return ranges.map(function (r) { + return { + anchor: this.clipPos(toCmPos(r.cursor == r.end ? r.start : r.end)), + head: this.clipPos(toCmPos(r.cursor)) + }; + }, this); + }; + this.setSelections = function (p, primIndex) { + var sel = this.ace.multiSelect; + var ranges = p.map(function (x) { + var anchor = toAcePos(x.anchor); + var head = toAcePos(x.head); + var r = Range.comparePoints(anchor, head) < 0 + ? new Range.fromPoints(anchor, head) + : new Range.fromPoints(head, anchor); + r.cursor = Range.comparePoints(r.start, head) ? r.end : r.start; + return r; }); - var range = search.find(cm.ace.session); - last = range; - return last && [!last.isEmpty()]; - }, - from: function() { return last && toCmPos(last.start) }, - to: function() { return last && toCmPos(last.end) }, - replace: function(text) { - if (last) { - last.end = cm.ace.session.doc.replace(last, text); - } - } + if (this.ace.inVirtualSelectionMode) { + this.ace.selection.fromOrientedRange(ranges[0]); + return; + } + if (!primIndex) { + ranges = ranges.reverse(); + } + else if (ranges[primIndex]) { + ranges.push(ranges.splice(primIndex, 1)[0]); + } + sel.toSingleRange(ranges[0].clone()); + var session = this.ace.session; + for (var i = 0; i < ranges.length; i++) { + var range = session.$clipRangeToDocument(ranges[i]); // todo why ace doesn't do this? + sel.addRange(range); + } }; - }; - this.scrollTo = function(x, y) { - var renderer = this.ace.renderer; - var config = renderer.layerConfig; - var maxHeight = config.maxHeight; - maxHeight -= (renderer.$size.scrollerHeight - renderer.lineHeight) * renderer.$scrollPastEnd; - if (y != null) this.ace.session.setScrollTop(Math.max(0, Math.min(y, maxHeight))); - if (x != null) this.ace.session.setScrollLeft(Math.max(0, Math.min(x, config.width))); - }; - this.scrollInfo = function() { return 0; }; - this.scrollIntoView = function(pos, margin) { - if (pos) { - var renderer = this.ace.renderer; - var viewMargin = { "top": 0, "bottom": margin }; - renderer.scrollCursorIntoView(toAcePos(pos), - (renderer.lineHeight * 2) / renderer.$size.scrollerHeight, viewMargin); - } - }; - this.getLine = function(row) { return this.ace.session.getLine(row) }; - this.getRange = function(s, e) { - return this.ace.session.getTextRange(new Range(s.line, s.ch, e.line, e.ch)); - }; - this.replaceRange = function(text, s, e) { - if (!e) e = s; - var range = new Range(s.line, s.ch, e.line, e.ch); - this.ace.session.$clipRangeToDocument(range); - return this.ace.session.replace(range, text); - }; - this.replaceSelection = - this.replaceSelections = function(p) { - var sel = this.ace.selection; - if (this.ace.inVirtualSelectionMode) { - this.ace.session.replace(sel.getRange(), p[0] || ""); - return; - } - sel.inVirtualSelectionMode = true; - var ranges = sel.rangeList.ranges; - if (!ranges.length) ranges = [this.ace.multiSelect.getRange()]; - for (var i = ranges.length; i--;) - this.ace.session.replace(ranges[i], p[i] || ""); - sel.inVirtualSelectionMode = false; - }; - this.getSelection = function() { - return this.ace.getSelectedText(); - }; - this.getSelections = function() { - return this.listSelections().map(function(x) { - return this.getRange(x.anchor, x.head); - }, this); - }; - this.getInputField = function() { - return this.ace.textInput.getElement(); - }; - this.getWrapperElement = function() { - return this.ace.container; - }; - var optMap = { - indentWithTabs: "useSoftTabs", - indentUnit: "tabSize", - tabSize: "tabSize", - firstLineNumber: "firstLineNumber", - readOnly: "readOnly" - }; - this.setOption = function(name, val) { - this.state[name] = val; - switch (name) { - case 'indentWithTabs': - name = optMap[name]; - val = !val; - break; - case 'keyMap': - this.state.$keyMap = val; - return; - break; - default: - name = optMap[name]; - } - if (name) - this.ace.setOption(name, val); - }; - this.getOption = function(name) { - var val; - var aceOpt = optMap[name]; - if (aceOpt) - val = this.ace.getOption(aceOpt); - switch (name) { - case 'indentWithTabs': - name = optMap[name]; - return !val; - case 'keyMap': - return this.state.$keyMap || 'vim'; - } - return aceOpt ? val : this.state[name]; - }; - this.toggleOverwrite = function(on) { - this.state.overwrite = on; - return this.ace.setOverwrite(on); - }; - this.addOverlay = function(o) { - if (!this.$searchHighlight || !this.$searchHighlight.session) { - var highlight = new SearchHighlight(null, "ace_highlight-marker", "text"); - var marker = this.ace.session.addDynamicMarker(highlight); - highlight.id = marker.id; - highlight.session = this.ace.session; - highlight.destroy = function(o) { - highlight.session.off("change", highlight.updateOnChange); - highlight.session.off("changeEditor", highlight.destroy); - highlight.session.removeMarker(highlight.id); - highlight.session = null; - }; - highlight.updateOnChange = function(delta) { - var row = delta.start.row; - if (row == delta.end.row) highlight.cache[row] = undefined; - else highlight.cache.splice(row, highlight.cache.length); - }; - highlight.session.on("changeEditor", highlight.destroy); - highlight.session.on("change", highlight.updateOnChange); - } - var re = new RegExp(o.query.source, "gmi"); - this.$searchHighlight = o.highlight = highlight; - this.$searchHighlight.setRegexp(re); - this.ace.renderer.updateBackMarkers(); - }; - this.removeOverlay = function(o) { - if (this.$searchHighlight && this.$searchHighlight.session) { - this.$searchHighlight.destroy(); - } - }; - this.getScrollInfo = function() { - var renderer = this.ace.renderer; - var config = renderer.layerConfig; - return { - left: renderer.scrollLeft, - top: renderer.scrollTop, - height: config.maxHeight, - width: config.width, - clientHeight: config.height, - clientWidth: config.width + this.setSelection = function (a, h, options) { + var sel = this.ace.selection; + sel.moveTo(a.line, a.ch); + sel.selectTo(h.line, h.ch); + if (options && options.origin == '*mouse') { + this.onBeforeEndOperation(); + } + }; + this.somethingSelected = function (p) { + return !this.ace.selection.isEmpty(); + }; + this.clipPos = function (p) { + var pos = this.ace.session.$clipPositionToDocument(p.line, p.ch); + return toCmPos(pos); + }; + this.foldCode = function (pos) { + this.ace.session.$toggleFoldWidget(pos.line, {}); + }; + this.markText = function (cursor) { + return { clear: function () { }, find: function () { } }; + }; + this.$updateMarkers = function (delta) { + var isInsert = delta.action == "insert"; + var start = delta.start; + var end = delta.end; + var rowShift = (end.row - start.row) * (isInsert ? 1 : -1); + var colShift = (end.column - start.column) * (isInsert ? 1 : -1); + if (isInsert) + end = start; + for (var i in this.marks) { + var point = this.marks[i]; + var cmp = Range.comparePoints(point, start); + if (cmp < 0) { + continue; // delta starts after the range + } + if (cmp === 0) { + if (isInsert) { + if (!point.$insertRight) { + cmp = 1; + } + else if (point.bias == 1) { + cmp = 1; + } + else { + point.bias = -1; + continue; + } + } + } + var cmp2 = isInsert ? cmp : Range.comparePoints(point, end); + if (cmp2 > 0) { + point.row += rowShift; + point.column += point.row == end.row ? colShift : 0; + continue; + } + if (!isInsert && cmp2 <= 0) { + point.row = start.row; + point.column = start.column; + if (cmp2 === 0) + point.bias = 1; + } + } + }; + var Marker = function (cm, id, row, column) { + this.cm = cm; + this.id = id; + this.row = row; + this.column = column; + cm.marks[this.id] = this; + }; + Marker.prototype.clear = function () { delete this.cm.marks[this.id]; }; + Marker.prototype.find = function () { return toCmPos(this); }; + this.setBookmark = function (cursor, options) { + var bm = new Marker(this, this.$uid++, cursor.line, cursor.ch); + if (!options || !options.insertLeft) + bm.$insertRight = true; + this.marks[bm.id] = bm; + return bm; + }; + this.moveH = function (increment, unit) { + if (unit == 'char') { + var sel = this.ace.selection; + sel.clearSelection(); + sel.moveCursorBy(0, increment); + } + }; + this.findPosV = function (start, amount, unit, goalColumn) { + if (unit == 'page') { + var renderer = this.ace.renderer; + var config = renderer.layerConfig; + amount = amount * Math.floor(config.height / config.lineHeight); + unit = 'line'; + } + if (unit == 'line') { + var screenPos = this.ace.session.documentToScreenPosition(start.line, start.ch); + if (goalColumn != null) + screenPos.column = goalColumn; + screenPos.row += amount; + screenPos.row = Math.min(Math.max(0, screenPos.row), this.ace.session.getScreenLength() - 1); + var pos = this.ace.session.screenToDocumentPosition(screenPos.row, screenPos.column); + return toCmPos(pos); + } + else { + debugger; + } + }; + this.charCoords = function (pos, mode) { + if (mode == 'div' || !mode) { + var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch); + return { left: sc.column, top: sc.row }; + } + if (mode == 'local') { + var renderer = this.ace.renderer; + var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch); + var lh = renderer.layerConfig.lineHeight; + var cw = renderer.layerConfig.characterWidth; + var top = lh * sc.row; + return { left: sc.column * cw, top: top, bottom: top + lh }; + } + }; + this.coordsChar = function (pos, mode) { + var renderer = this.ace.renderer; + if (mode == 'local') { + var row = Math.max(0, Math.floor(pos.top / renderer.lineHeight)); + var col = Math.max(0, Math.floor(pos.left / renderer.characterWidth)); + var ch = renderer.session.screenToDocumentPosition(row, col); + return toCmPos(ch); + } + else if (mode == 'div') { + throw "not implemented"; + } + }; + this.getSearchCursor = function (query, pos, caseFold) { + var caseSensitive = false; + var isRegexp = false; + if (query instanceof RegExp && !query.global) { + caseSensitive = !query.ignoreCase; + query = query.source; + isRegexp = true; + } + if (query == "\\n") { + query = "\n"; + isRegexp = false; + } + var search = new Search(); + if (pos.ch == undefined) + pos.ch = Number.MAX_VALUE; + var acePos = { row: pos.line, column: pos.ch }; + var cm = this; + var last = null; + return { + findNext: function () { return this.find(false); }, + findPrevious: function () { return this.find(true); }, + find: function (back) { + search.setOptions({ + needle: query, + caseSensitive: caseSensitive, + wrap: false, + backwards: back, + regExp: isRegexp, + start: last || acePos + }); + var range = search.find(cm.ace.session); + last = range; + return last && [!last.isEmpty()]; + }, + from: function () { return last && toCmPos(last.start); }, + to: function () { return last && toCmPos(last.end); }, + replace: function (text) { + if (last) { + last.end = cm.ace.session.doc.replace(last, text); + } + } + }; + }; + this.scrollTo = function (x, y) { + var renderer = this.ace.renderer; + var config = renderer.layerConfig; + var maxHeight = config.maxHeight; + maxHeight -= (renderer.$size.scrollerHeight - renderer.lineHeight) * renderer.$scrollPastEnd; + if (y != null) + this.ace.session.setScrollTop(Math.max(0, Math.min(y, maxHeight))); + if (x != null) + this.ace.session.setScrollLeft(Math.max(0, Math.min(x, config.width))); + }; + this.scrollInfo = function () { return 0; }; + this.scrollIntoView = function (pos, margin) { + if (pos) { + var renderer = this.ace.renderer; + var viewMargin = { "top": 0, "bottom": margin }; + renderer.scrollCursorIntoView(toAcePos(pos), (renderer.lineHeight * 2) / renderer.$size.scrollerHeight, viewMargin); + } + }; + this.getLine = function (row) { return this.ace.session.getLine(row); }; + this.getRange = function (s, e) { + return this.ace.session.getTextRange(new Range(s.line, s.ch, e.line, e.ch)); + }; + this.replaceRange = function (text, s, e) { + if (!e) + e = s; + var range = new Range(s.line, s.ch, e.line, e.ch); + this.ace.session.$clipRangeToDocument(range); + return this.ace.session.replace(range, text); + }; + this.replaceSelection = + this.replaceSelections = function (p) { + var strings = Array.isArray(p) && p; + var sel = this.ace.selection; + if (this.ace.inVirtualSelectionMode) { + this.ace.session.replace(sel.getRange(), strings ? p[0] || "" : p); + return; + } + sel.inVirtualSelectionMode = true; + var ranges = sel.rangeList.ranges; + if (!ranges.length) + ranges = [this.ace.multiSelect.getRange()]; + for (var i = ranges.length; i--;) + this.ace.session.replace(ranges[i], strings ? p[i] || "" : p); + sel.inVirtualSelectionMode = false; + }; + this.getSelection = function () { + return this.ace.getSelectedText(); + }; + this.getSelections = function () { + return this.listSelections().map(function (x) { + return this.getRange(x.anchor, x.head); + }, this); + }; + this.getInputField = function () { + return this.ace.textInput.getElement(); + }; + this.getWrapperElement = function () { + return this.ace.container; + }; + var optMap = { + indentWithTabs: "useSoftTabs", + indentUnit: "tabSize", + tabSize: "tabSize", + firstLineNumber: "firstLineNumber", + readOnly: "readOnly" + }; + this.setOption = function (name, val) { + this.state[name] = val; + switch (name) { + case 'indentWithTabs': + name = optMap[name]; + val = !val; + break; + case 'keyMap': + this.state.$keyMap = val; + return; + break; + default: + name = optMap[name]; + } + if (name) + this.ace.setOption(name, val); + }; + this.getOption = function (name) { + var val; + var aceOpt = optMap[name]; + if (aceOpt) + val = this.ace.getOption(aceOpt); + switch (name) { + case 'indentWithTabs': + name = optMap[name]; + return !val; + case 'keyMap': + return this.state.$keyMap || 'vim'; + } + return aceOpt ? val : this.state[name]; + }; + this.toggleOverwrite = function (on) { + this.state.overwrite = on; + return this.ace.setOverwrite(on); + }; + this.addOverlay = function (o) { + if (!this.$searchHighlight || !this.$searchHighlight.session) { + var highlight = new SearchHighlight(null, "ace_highlight-marker", "text"); + var marker = this.ace.session.addDynamicMarker(highlight); + highlight.id = marker.id; + highlight.session = this.ace.session; + highlight.destroy = function (o) { + highlight.session.off("change", highlight.updateOnChange); + highlight.session.off("changeEditor", highlight.destroy); + highlight.session.removeMarker(highlight.id); + highlight.session = null; + }; + highlight.updateOnChange = function (delta) { + var row = delta.start.row; + if (row == delta.end.row) + highlight.cache[row] = undefined; + else + highlight.cache.splice(row, highlight.cache.length); + }; + highlight.session.on("changeEditor", highlight.destroy); + highlight.session.on("change", highlight.updateOnChange); + } + var re = new RegExp(o.query.source, "gmi"); + this.$searchHighlight = o.highlight = highlight; + this.$searchHighlight.setRegexp(re); + this.ace.renderer.updateBackMarkers(); + }; + this.removeOverlay = function (o) { + if (this.$searchHighlight && this.$searchHighlight.session) { + this.$searchHighlight.destroy(); + } + }; + this.getScrollInfo = function () { + var renderer = this.ace.renderer; + var config = renderer.layerConfig; + return { + left: renderer.scrollLeft, + top: renderer.scrollTop, + height: config.maxHeight, + width: config.width, + clientHeight: config.height, + clientWidth: config.width + }; + }; + this.getValue = function () { + return this.ace.getValue(); + }; + this.setValue = function (v) { + return this.ace.setValue(v, -1); + }; + this.getTokenTypeAt = function (pos) { + var token = this.ace.session.getTokenAt(pos.line, pos.ch); + return token && /comment|string/.test(token.type) ? "string" : ""; + }; + this.findMatchingBracket = function (pos) { + var m = this.ace.session.findMatchingBracket(toAcePos(pos)); + return { to: m && toCmPos(m) }; + }; + this.findMatchingTag = function (pos) { + var m = this.ace.session.getMatchingTags(toAcePos(pos)); + if (!m) + return; + return { + open: { + from: toCmPos(m.openTag.start), + to: toCmPos(m.openTag.end) + }, + close: { + from: toCmPos(m.closeTag.start), + to: toCmPos(m.closeTag.end) + } + }; + }; + this.indentLine = function (line, method) { + if (method === true) + this.ace.session.indentRows(line, line, "\t"); + else if (method === false) + this.ace.session.outdentRows(new Range(line, 0, line, 0)); + }; + this.indexFromPos = function (pos) { + return this.ace.session.doc.positionToIndex(toAcePos(pos)); + }; + this.posFromIndex = function (index) { + return toCmPos(this.ace.session.doc.indexToPosition(index)); + }; + this.focus = function (index) { + return this.ace.textInput.focus(); + }; + this.blur = function (index) { + return this.ace.blur(); + }; + this.defaultTextHeight = function (index) { + return this.ace.renderer.layerConfig.lineHeight; + }; + this.scanForBracket = function (pos, dir, _, options) { + var re = options.bracketRegex.source; + var tokenRe = /paren|text|operator|tag/; + if (dir == 1) { + var m = this.ace.session.$findClosingBracket(re.slice(1, 2), toAcePos(pos), tokenRe); + } + else { + var m = this.ace.session.$findOpeningBracket(re.slice(-2, -1), { row: pos.line, column: pos.ch + 1 }, tokenRe); + if (!m && options.bracketRegex && options.bracketRegex.test(this.getLine(pos.line)[pos.ch - 1])) { + m = { row: pos.line, column: pos.ch - 1 }; + } + } + return m && { pos: toCmPos(m) }; + }; + this.refresh = function () { + return this.ace.resize(true); + }; + this.getMode = function () { + return { name: this.getOption("mode") }; + }; + this.execCommand = function (name) { + if (CodeMirror.commands.hasOwnProperty(name)) + return CodeMirror.commands[name](this); + if (name == "indentAuto") + return this.ace.execCommand("autoindent"); + console.log(name + " is not implemented"); + }; + this.getLineNumber = function (handle) { + var deltas = this.$lineHandleChanges; + if (!deltas) + return null; + var row = handle.row; + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (delta.start.row != delta.end.row) { + if (delta.action[0] == "i") { + if (delta.start.row < row) + row += delta.end.row - delta.start.row; + } + else { + if (delta.start.row < row) { + if (row < delta.end.row || row == delta.end.row && delta.start.column > 0) { + return null; + } + row -= delta.end.row - delta.start.row; + } + } + } + } + return row; + }; + this.getLineHandle = function (row) { + if (!this.$lineHandleChanges) + this.$lineHandleChanges = []; + return { text: this.ace.session.getLine(row), row: row }; + }; + this.releaseLineHandles = function () { + this.$lineHandleChanges = undefined; + }; + this.getLastEditEnd = function () { + var undoManager = this.ace.session.$undoManager; + if (undoManager && undoManager.$lastDelta) + return toCmPos(undoManager.$lastDelta.end); }; - }; - this.getValue = function() { - return this.ace.getValue(); - }; - this.setValue = function(v) { - return this.ace.setValue(v, -1); - }; - this.getTokenTypeAt = function(pos) { - var token = this.ace.session.getTokenAt(pos.line, pos.ch); - return token && /comment|string/.test(token.type) ? "string" : ""; - }; - this.findMatchingBracket = function(pos) { - var m = this.ace.session.findMatchingBracket(toAcePos(pos)); - return {to: m && toCmPos(m)}; - }; - this.indentLine = function(line, method) { - if (method === true) - this.ace.session.indentRows(line, line, "\t"); - else if (method === false) - this.ace.session.outdentRows(new Range(line, 0, line, 0)); - }; - this.indexFromPos = function(pos) { - return this.ace.session.doc.positionToIndex(toAcePos(pos)); - }; - this.posFromIndex = function(index) { - return toCmPos(this.ace.session.doc.indexToPosition(index)); - }; - this.focus = function(index) { - return this.ace.textInput.focus(); - }; - this.blur = function(index) { - return this.ace.blur(); - }; - this.defaultTextHeight = function(index) { - return this.ace.renderer.layerConfig.lineHeight; - }; - this.scanForBracket = function(pos, dir, _, options) { - var re = options.bracketRegex.source; - var tokenRe = /paren|text|operator|tag/; - if (dir == 1) { - var m = this.ace.session.$findClosingBracket(re.slice(1, 2), toAcePos(pos), tokenRe); - } else { - var m = this.ace.session.$findOpeningBracket(re.slice(-2, -1), {row: pos.line, column: pos.ch + 1}, tokenRe); - } - return m && {pos: toCmPos(m)}; - }; - this.refresh = function() { - return this.ace.resize(true); - }; - this.getMode = function() { - return { name : this.getOption("mode") }; - }; - this.execCommand = function(name) { - if (CodeMirror.commands.hasOwnProperty(name)) return CodeMirror.commands[name](this); - if (name == "indentAuto") return this.ace.execCommand("autoindent"); - console.log(name + " is not implemented"); - }; - this.getLineNumber = function(handle) { - return handle.row; - } - this.getLineHandle = function(row) { - return {text: this.ace.session.getLine(row), row: row}; - } }).call(CodeMirror.prototype); - function toAcePos(cmPos) { - return {row: cmPos.line, column: cmPos.ch}; - } - function toCmPos(acePos) { +function toAcePos(cmPos) { + return { row: cmPos.line, column: cmPos.ch }; +} +function toCmPos(acePos) { return new Pos(acePos.row, acePos.column); - } - - var StringStream = CodeMirror.StringStream = function(string, tabSize) { +} +var StringStream = CodeMirror.StringStream = function (string, tabSize) { this.pos = this.start = 0; this.string = string; this.tabSize = tabSize || 8; this.lastColumnPos = this.lastColumnValue = 0; this.lineStart = 0; - }; - - StringStream.prototype = { - eol: function() {return this.pos >= this.string.length;}, - sol: function() {return this.pos == this.lineStart;}, - 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() { - throw "not implemented"; - }, - indentation: function() { - throw "not implemented"; - }, - 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; - } +}; +StringStream.prototype = { + eol: function () { return this.pos >= this.string.length; }, + sol: function () { return this.pos == this.lineStart; }, + 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 () { + throw "not implemented"; + }, + indentation: function () { + throw "not implemented"; + }, + 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);}, - hideFirstChars: function(n, inner) { - this.lineStart += n; - try { return inner(); } - finally { this.lineStart -= n; } + current: function () { return this.string.slice(this.start, this.pos); }, + hideFirstChars: function (n, inner) { + this.lineStart += n; + try { + return inner(); + } + finally { + this.lineStart -= n; + } } - }; -CodeMirror.defineExtension = function(name, fn) { - CodeMirror.prototype[name] = fn; }; -dom.importCssString(".normal-mode .ace_cursor{\ - border: none;\ - background-color: rgba(255,0,0,0.5);\ -}\ -.normal-mode .ace_hidden-cursors .ace_cursor{\ - background-color: transparent;\ - border: 1px solid red;\ - opacity: 0.7\ -}\ -.ace_dialog {\ - position: absolute;\ - left: 0; right: 0;\ - background: inherit;\ - z-index: 15;\ - padding: .1em .8em;\ - overflow: hidden;\ - color: inherit;\ -}\ -.ace_dialog-top {\ - border-bottom: 1px solid #444;\ - top: 0;\ -}\ -.ace_dialog-bottom {\ - border-top: 1px solid #444;\ - bottom: 0;\ -}\ -.ace_dialog input {\ - border: none;\ - outline: none;\ - background: transparent;\ - width: 20em;\ - color: inherit;\ - font-family: monospace;\ -}", "vimMode", false); -(function() { - function dialogDiv(cm, template, bottom) { - var wrap = cm.ace.container; - var dialog; - dialog = wrap.appendChild(document.createElement("div")); - if (bottom) - dialog.className = "ace_dialog ace_dialog-bottom"; - else - dialog.className = "ace_dialog ace_dialog-top"; - - if (typeof template == "string") { - dialog.innerHTML = template; - } else { // Assuming it's a detached DOM element. - dialog.appendChild(template); - } - return dialog; - } - - function closeNotification(cm, newVal) { - if (cm.state.currentNotificationClose) - cm.state.currentNotificationClose(); - cm.state.currentNotificationClose = newVal; - } - - CodeMirror.defineExtension("openDialog", function(template, callback, options) { - if (this.virtualSelectionMode()) return; - if (!options) options = {}; - - closeNotification(this, null); - - var dialog = dialogDiv(this, template, options.bottom); - var closed = false, me = this; - this.state.dialog = dialog; - function close(newVal) { - if (typeof newVal == 'string') { - inp.value = newVal; - } else { - if (closed) return; - - if (newVal && newVal.type == "blur") { - if (document.activeElement === inp) +CodeMirror.defineExtension = function (name, fn) { + CodeMirror.prototype[name] = fn; +}; +domLib.importCssString(".normal-mode .ace_cursor{\n border: none;\n background-color: rgba(255,0,0,0.5);\n}\n.normal-mode .ace_hidden-cursors .ace_cursor{\n background-color: transparent;\n border: 1px solid red;\n opacity: 0.7\n}\n.ace_dialog {\n position: absolute;\n left: 0; right: 0;\n background: inherit;\n z-index: 15;\n padding: .1em .8em;\n overflow: hidden;\n color: inherit;\n}\n.ace_dialog-top {\n border-bottom: 1px solid #444;\n top: 0;\n}\n.ace_dialog-bottom {\n border-top: 1px solid #444;\n bottom: 0;\n}\n.ace_dialog input {\n border: none;\n outline: none;\n background: transparent;\n width: 20em;\n color: inherit;\n font-family: monospace;\n}", "vimMode", false); +(function () { + function dialogDiv(cm, template, bottom) { + var wrap = cm.ace.container; + var dialog; + dialog = wrap.appendChild(document.createElement("div")); + if (bottom) + dialog.className = "ace_dialog ace_dialog-bottom"; + else + dialog.className = "ace_dialog ace_dialog-top"; + if (typeof template == "string") { + dialog.innerHTML = template; + } + else { // Assuming it's a detached DOM element. + dialog.appendChild(template); + } + return dialog; + } + function closeNotification(cm, newVal) { + if (cm.state.currentNotificationClose) + cm.state.currentNotificationClose(); + cm.state.currentNotificationClose = newVal; + } + CodeMirror.defineExtension("openDialog", function (template, callback, options) { + if (this.virtualSelectionMode()) return; + if (!options) + options = {}; + closeNotification(this, null); + var dialog = dialogDiv(this, template, options.bottom); + var closed = false, me = this; + this.state.dialog = dialog; + function close(newVal) { + if (typeof newVal == 'string') { + inp.value = newVal; + } + else { + if (closed) + return; + if (newVal && newVal.type == "blur") { + if (document.activeElement === inp) + return; + } + if (me.state.dialog == dialog) { + me.state.dialog = null; + me.focus(); + } + closed = true; + dialog.remove(); + if (options.onClose) + options.onClose(dialog); + var cm = me; + if (cm.state.vim) { + cm.state.vim.status = null; + cm.ace._signal("changeStatus"); + cm.ace.renderer.$loop.schedule(cm.ace.renderer.CHANGE_CURSOR); + } + } } - - if (me.state.dialog == dialog) { - me.state.dialog = null; - me.focus(); + var inp = dialog.getElementsByTagName("input")[0], button; + if (inp) { + if (options.value) { + inp.value = options.value; + if (options.selectValueOnOpen !== false) + inp.select(); + } + if (options.onInput) + CodeMirror.on(inp, "input", function (e) { options.onInput(e, inp.value, close); }); + if (options.onKeyUp) + CodeMirror.on(inp, "keyup", function (e) { options.onKeyUp(e, inp.value, close); }); + CodeMirror.on(inp, "keydown", function (e) { + if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { + return; + } + if (e.keyCode == 13) + callback(inp.value); + if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { + CodeMirror.e_stop(e); + close(); + } + }); + if (options.closeOnBlur !== false) + CodeMirror.on(inp, "blur", close); + inp.focus(); + } + else if (button = dialog.getElementsByTagName("button")[0]) { + CodeMirror.on(button, "click", function () { + close(); + me.focus(); + }); + if (options.closeOnBlur !== false) + CodeMirror.on(button, "blur", close); + button.focus(); } - closed = true; - dialog.remove(); - - if (options.onClose) options.onClose(dialog); - var cm = me; - if (cm.state.vim) { - cm.state.vim.status = null; - cm.ace._signal("changeStatus"); - cm.ace.renderer.$loop.schedule(cm.ace.renderer.CHANGE_CURSOR); + return close; + }); + CodeMirror.defineExtension("openNotification", function (template, options) { + if (this.virtualSelectionMode()) + return; + closeNotification(this, close); + var dialog = dialogDiv(this, template, options && options.bottom); + var closed = false, doneTimer; + var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; + function close() { + if (closed) + return; + closed = true; + clearTimeout(doneTimer); + dialog.remove(); } - } - } - - var inp = dialog.getElementsByTagName("input")[0], button; - if (inp) { - if (options.value) { - inp.value = options.value; - if (options.selectValueOnOpen !== false) inp.select(); - } - - if (options.onInput) - CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);}); - if (options.onKeyUp) - CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);}); - - CodeMirror.on(inp, "keydown", function(e) { - if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; } - if (e.keyCode == 13) callback(inp.value); - if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { - CodeMirror.e_stop(e); - close(); - } - }); - - if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close); - - inp.focus(); - } else if (button = dialog.getElementsByTagName("button")[0]) { - CodeMirror.on(button, "click", function() { - close(); - me.focus(); - }); - - if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); - - button.focus(); - } - return close; - }); - - CodeMirror.defineExtension("openNotification", function(template, options) { - if (this.virtualSelectionMode()) return; - closeNotification(this, close); - var dialog = dialogDiv(this, template, options && options.bottom); - var closed = false, doneTimer; - var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; - - function close() { - if (closed) return; - closed = true; - clearTimeout(doneTimer); - dialog.remove(); - } - - CodeMirror.on(dialog, 'click', function(e) { - CodeMirror.e_preventDefault(e); - close(); + CodeMirror.on(dialog, 'click', function (e) { + CodeMirror.e_preventDefault(e); + close(); + }); + if (duration) + doneTimer = setTimeout(close, duration); + return close; }); - - if (duration) - doneTimer = setTimeout(close, duration); - - return close; - }); })(); - - - var Pos = CodeMirror.Pos; - - function transformCursor(cm, range) { - var vim = cm.state.vim; - if (!vim || vim.insertMode) return range.head; - var head = vim.sel.head; - if (!head) return range.head; - - if (vim.visualBlock) { - if (range.head.line != head.line) { - return; - } - } - if (range.from() == range.anchor && !range.empty()) { - if (range.head.line == head.line && range.head.ch != head.ch) - return new Pos(range.head.line, range.head.ch - 1); +var Pos = CodeMirror.Pos; +function updateSelectionForSurrogateCharacters(cm, curStart, curEnd) { + if (curStart.line === curEnd.line && curStart.ch >= curEnd.ch - 1) { + var text = cm.getLine(curStart.line); + var charCode = text.charCodeAt(curStart.ch); + if (0xD800 <= charCode && charCode <= 0xD8FF) { + curEnd.ch += 1; + } } - - return range.head; - } - - var defaultKeymap = [ + return { start: curStart, end: curEnd }; +} +var defaultKeymap = [ { keys: '', type: 'keyToKey', toKeys: 'h' }, { keys: '', type: 'keyToKey', toKeys: 'l' }, { keys: '', type: 'keyToKey', toKeys: 'k' }, @@ -1007,22 +1053,22 @@ dom.importCssString(".normal-mode .ace_cursor{\ { keys: 'g', type: 'keyToKey', toKeys: 'gk' }, { keys: 'g', type: 'keyToKey', toKeys: 'gj' }, { keys: '', type: 'keyToKey', toKeys: 'l' }, - { keys: '', type: 'keyToKey', toKeys: 'h', context: 'normal'}, - { keys: '', type: 'keyToKey', toKeys: 'x', context: 'normal'}, + { keys: '', type: 'keyToKey', toKeys: 'h' }, + { keys: '', type: 'keyToKey', toKeys: 'x' }, { keys: '', type: 'keyToKey', toKeys: 'W' }, - { keys: '', type: 'keyToKey', toKeys: 'B', context: 'normal' }, + { keys: '', type: 'keyToKey', toKeys: 'B' }, { keys: '', type: 'keyToKey', toKeys: 'w' }, - { keys: '', type: 'keyToKey', toKeys: 'b', context: 'normal' }, + { keys: '', type: 'keyToKey', toKeys: 'b' }, { keys: '', type: 'keyToKey', toKeys: 'j' }, { keys: '', type: 'keyToKey', toKeys: 'k' }, { keys: '', type: 'keyToKey', toKeys: '' }, { keys: '', type: 'keyToKey', toKeys: '' }, { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, - { keys: '', type: 'keyToKey', toKeys: '' }, // ace_patch ipad keyboard sends C-Esc instead of C-[ + { keys: '', type: 'keyToKey', toKeys: '' }, // ipad keyboard sends C-Esc instead of C-[ { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, { keys: 's', type: 'keyToKey', toKeys: 'cl', context: 'normal' }, - { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual'}, + { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual' }, { keys: 'S', type: 'keyToKey', toKeys: 'cc', context: 'normal' }, { keys: 'S', type: 'keyToKey', toKeys: 'VdO', context: 'visual' }, { keys: '', type: 'keyToKey', toKeys: '0' }, @@ -1030,152 +1076,168 @@ dom.importCssString(".normal-mode .ace_cursor{\ { keys: '', type: 'keyToKey', toKeys: '' }, { keys: '', type: 'keyToKey', toKeys: '' }, { keys: '', type: 'keyToKey', toKeys: 'j^', context: 'normal' }, - { keys: '', type: 'keyToKey', toKeys: 'i', context: 'normal'}, + { keys: '', type: 'keyToKey', toKeys: 'i', context: 'normal' }, { keys: '', type: 'action', action: 'toggleOverwrite', context: 'insert' }, - { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true }}, - { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true }}, - { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true }}, - { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false }}, - { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true }}, - { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true }}, - { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true }}, - { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true }}, - { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false }}, - { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false }}, - { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true }}, - { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true }}, - { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true }}, - { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }}, - { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true }}, - { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true }}, - { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }}, - { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true }}, - { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true }}, - { keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false }}, - { keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true }}, - { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true }}, - { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false }}, - { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true }}, - { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true }}, - { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }}, - { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }}, - {keys: "g$", type: "motion", motion: "moveToEndOfDisplayLine"}, - {keys: "g^", type: "motion", motion: "moveToStartOfDisplayLine"}, - {keys: "g0", type: "motion", motion: "moveToStartOfDisplayLine"}, + { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true } }, + { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true } }, + { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true } }, + { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false } }, + { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true } }, + { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true } }, + { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true } }, + { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true } }, + { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false } }, + { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false } }, + { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true } }, + { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true } }, + { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true } }, + { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false } }, + { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true } }, + { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true } }, + { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true } }, + { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true } }, + { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true } }, + { keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false } }, + { keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true } }, + { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true } }, + { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false } }, + { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true } }, + { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true } }, + { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true } }, + { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true } }, + { keys: "g$", type: "motion", motion: "moveToEndOfDisplayLine" }, + { keys: "g^", type: "motion", motion: "moveToStartOfDisplayLine" }, + { keys: "g0", type: "motion", motion: "moveToStartOfDisplayLine" }, { keys: '0', type: 'motion', motion: 'moveToStartOfLine' }, { keys: '^', type: 'motion', motion: 'moveToFirstNonWhiteSpaceCharacter' }, - { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true }}, - { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar:true }}, - { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }}, - { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true }}, - { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true }}, - { keys: 'f', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true , inclusive: true }}, - { keys: 'F', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false }}, - { keys: 't', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true }}, - { keys: 'T', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false }}, - { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true }}, - { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false }}, - { keys: '\'', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true, linewise: true}}, - { keys: '`', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true}}, + { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar: true } }, + { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar: true } }, + { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar: true, repeatOffset: -1 } }, + { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true } }, + { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true } }, + { keys: 'f', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true, inclusive: true } }, + { keys: 'F', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false } }, + { keys: 't', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true } }, + { keys: 'T', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false } }, + { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true } }, + { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false } }, + { keys: '\'', type: 'motion', motion: 'goToMark', motionArgs: { toJumplist: true, linewise: true } }, + { keys: '`', type: 'motion', motion: 'goToMark', motionArgs: { toJumplist: true } }, { keys: ']`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } }, { keys: '[`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } }, { keys: ']\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } }, { keys: '[\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } }, - { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true}}, - { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true}}, - { keys: ']', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true}}, - { keys: '[', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true}}, - { keys: '|', type: 'motion', motion: 'moveToColumn'}, - { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context:'visual'}, - { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: {sameLine: true}, context:'visual'}, + { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true } }, + { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true } }, + { keys: ']', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true } }, + { keys: '[', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true } }, + { keys: '|', type: 'motion', motion: 'moveToColumn' }, + { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context: 'visual' }, + { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: { sameLine: true }, context: 'visual' }, { keys: 'd', type: 'operator', operator: 'delete' }, { keys: 'y', type: 'operator', operator: 'yank' }, { keys: 'c', type: 'operator', operator: 'change' }, { keys: '=', type: 'operator', operator: 'indentAuto' }, - { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true }}, - { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false }}, + { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true } }, + { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false } }, { keys: 'g~', type: 'operator', operator: 'changeCase' }, - { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, isEdit: true }, - { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, isEdit: true }, - { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true }}, - { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true }}, - { keys: 'gn', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: true }}, - { keys: 'gN', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: false }}, - { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }}, - { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }}, - { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, - { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual'}, - { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'expandToLine', motionArgs: { linewise: true }, context: 'normal'}, - { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual'}, - { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, - { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual'}, - { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal'}, - { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual'}, + { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: true }, isEdit: true }, + { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: false }, isEdit: true }, + { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true } }, + { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true } }, + { keys: 'gn', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: true } }, + { keys: 'gN', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: false } }, + { keys: 'gq', type: 'operator', operator: 'hardWrap' }, + { keys: 'gw', type: 'operator', operator: 'hardWrap', operatorArgs: { keepCursor: true } }, + { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false } }, + { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true } }, + { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal' }, + { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual' }, + { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'expandToLine', motionArgs: { linewise: true }, context: 'normal' }, + { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual' }, + { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal' }, + { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual' }, + { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal' }, + { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual' }, + { keys: '', type: 'operatorMotion', operator: 'delete', motion: 'moveToStartOfLine', context: 'insert' }, { keys: '', type: 'operatorMotion', operator: 'delete', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }, context: 'insert' }, { keys: '', type: 'idle', context: 'normal' }, - { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true }}, - { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false }}, - { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true }}, - { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true }}, + { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true } }, + { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false } }, + { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true } }, + { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true } }, { keys: 'a', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'charAfter' }, context: 'normal' }, { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'eol' }, context: 'normal' }, { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'endOfSelectedArea' }, context: 'visual' }, { keys: 'i', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'inplace' }, context: 'normal' }, { keys: 'gi', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'lastEdit' }, context: 'normal' }, - { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank'}, context: 'normal' }, - { keys: 'gI', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'bol'}, context: 'normal' }, + { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank' }, context: 'normal' }, + { keys: 'gI', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'bol' }, context: 'normal' }, { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'startOfSelectedArea' }, context: 'visual' }, { keys: 'o', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: true }, context: 'normal' }, { keys: 'O', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: false }, context: 'normal' }, { keys: 'v', type: 'action', action: 'toggleVisualMode' }, - { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true }}, - { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }}, - { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }}, + { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true } }, + { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true } }, + { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true } }, { keys: 'gv', type: 'action', action: 'reselectLastSelection' }, { keys: 'J', type: 'action', action: 'joinLines', isEdit: true }, { keys: 'gJ', type: 'action', action: 'joinLines', actionArgs: { keepSpaces: true }, isEdit: true }, - { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true }}, - { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true }}, + { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true } }, + { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true } }, { keys: 'r', type: 'action', action: 'replace', isEdit: true }, - { keys: '@', type: 'action', action: 'replayMacro' }, - { keys: 'q', type: 'action', action: 'enterMacroRecordMode' }, - { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }, context: 'normal'}, - { keys: 'R', type: 'operator', operator: 'change', operatorArgs: { linewise: true, fullLine: true }, context: 'visual', exitVisualBlock: true}, + { keys: '@', type: 'action', action: 'replayMacro' }, + { keys: 'q', type: 'action', action: 'enterMacroRecordMode' }, + { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }, context: 'normal' }, + { keys: 'R', type: 'operator', operator: 'change', operatorArgs: { linewise: true, fullLine: true }, context: 'visual', exitVisualBlock: true }, { keys: 'u', type: 'action', action: 'undo', context: 'normal' }, - { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, context: 'visual', isEdit: true }, - { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, context: 'visual', isEdit: true }, + { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: true }, context: 'visual', isEdit: true }, + { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: false }, context: 'visual', isEdit: true }, { keys: '', type: 'action', action: 'redo' }, - { keys: 'm', type: 'action', action: 'setMark' }, - { keys: '"', type: 'action', action: 'setRegister' }, - { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }}, + { keys: 'm', type: 'action', action: 'setMark' }, + { keys: '"', type: 'action', action: 'setRegister' }, + { keys: '', type: 'action', action: 'insertRegister', context: 'insert', isEdit: true }, + { keys: '', type: 'action', action: 'oneNormalCommand', context: 'insert' }, + { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' } }, { keys: 'z.', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, - { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }}, + { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' } }, { keys: 'z', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, - { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }}, - { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, + { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' } }, + { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, { keys: '.', type: 'action', action: 'repeatLastEdit' }, - { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: true, backtrack: false}}, - { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: false, backtrack: false}}, + { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: { increase: true, backtrack: false } }, + { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: { increase: false, backtrack: false } }, { keys: '', type: 'action', action: 'indent', actionArgs: { indentRight: true }, context: 'insert' }, { keys: '', type: 'action', action: 'indent', actionArgs: { indentRight: false }, context: 'insert' }, - { keys: 'a', type: 'motion', motion: 'textObjectManipulation' }, - { keys: 'i', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true }}, - { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }}, - { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }}, - { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }}, - { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }}, - { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }}, - { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }}, + { keys: 'a', type: 'motion', motion: 'textObjectManipulation' }, + { keys: 'i', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true } }, + { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true } }, + { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true } }, + { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true } }, + { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true } }, + { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true } }, + { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true } }, { keys: ':', type: 'ex' } - ]; - var defaultKeymapLength = defaultKeymap.length; - var defaultExCommandMap = [ +]; +var defaultKeymapLength = defaultKeymap.length; +var defaultExCommandMap = [ { name: 'colorscheme', shortName: 'colo' }, { name: 'map' }, { name: 'imap', shortName: 'im' }, { name: 'nmap', shortName: 'nm' }, { name: 'vmap', shortName: 'vm' }, + { name: 'omap', shortName: 'om' }, + { name: 'noremap', shortName: 'no' }, + { name: 'nnoremap', shortName: 'nn' }, + { name: 'vnoremap', shortName: 'vn' }, + { name: 'inoremap', shortName: 'ino' }, + { name: 'onoremap', shortName: 'ono' }, { name: 'unmap' }, + { name: 'mapclear', shortName: 'mapc' }, + { name: 'nmapclear', shortName: 'nmapc' }, + { name: 'vmapclear', shortName: 'vmapc' }, + { name: 'imapclear', shortName: 'imapc' }, + { name: 'omapclear', shortName: 'omapc' }, { name: 'write', shortName: 'w' }, { name: 'undo', shortName: 'u' }, { name: 'redo', shortName: 'red' }, @@ -1184,932 +1246,1115 @@ dom.importCssString(".normal-mode .ace_cursor{\ { name: 'setglobal', shortName: 'setg' }, { name: 'sort', shortName: 'sor' }, { name: 'substitute', shortName: 's', possiblyAsync: true }, + { name: 'startinsert', shortName: 'start' }, { name: 'nohlsearch', shortName: 'noh' }, { name: 'yank', shortName: 'y' }, { name: 'delmarks', shortName: 'delm' }, { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true }, { name: 'vglobal', shortName: 'v' }, + { name: 'delete', shortName: 'd' }, + { name: 'join', shortName: 'j' }, + { name: 'normal', shortName: 'norm' }, { name: 'global', shortName: 'g' } - ]; - - var Vim = function() { return vimApi; } //{ - function enterVimMode(cm) { - cm.setOption('disableInput', true); - cm.setOption('showCursorWhenSelecting', false); - CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); - cm.on('cursorActivity', onCursorActivity); - maybeInitVimState(cm); - CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm)); - } - - function leaveVimMode(cm) { - cm.setOption('disableInput', false); - cm.off('cursorActivity', onCursorActivity); - CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm)); - cm.state.vim = null; - } - - function detachVimMap(cm, next) { - if (this == CodeMirror.keyMap.vim) { - cm.options.$customCursor = null; - CodeMirror.rmClass(cm.getWrapperElement(), "cm-fat-cursor"); - } - - if (!next || next.attach != attachVimMap) - leaveVimMode(cm); - } - function attachVimMap(cm, prev) { - if (this == CodeMirror.keyMap.vim) { - if (cm.curOp) cm.curOp.selectionChanged = true; - cm.options.$customCursor = transformCursor; - CodeMirror.addClass(cm.getWrapperElement(), "cm-fat-cursor"); - } - - if (!prev || prev.attach != attachVimMap) - enterVimMode(cm); - } - CodeMirror.defineOption('vimMode', false, function(cm, val, prev) { - if (val && cm.getOption("keyMap") != "vim") - cm.setOption("keyMap", "vim"); - else if (!val && prev != CodeMirror.Init && /^vim/.test(cm.getOption("keyMap"))) - cm.setOption("keyMap", "default"); - }); - - function cmKey(key, cm) { - if (!cm) { return undefined; } - if (this[key]) { return this[key]; } - var vimKey = cmKeyToVimKey(key); - if (!vimKey) { - return false; - } - var cmd = vimApi.findKey(cm, vimKey); - if (typeof cmd == 'function') { - CodeMirror.signal(cm, 'vim-keypress', vimKey); - } - return cmd; - } - - var modifiers = {Shift:'S',Ctrl:'C',Alt:'A',Cmd:'D',Mod:'A',CapsLock:''}; - var specialKeys = {Enter:'CR',Backspace:'BS',Delete:'Del',Insert:'Ins'}; - function cmKeyToVimKey(key) { - if (key.charAt(0) == '\'') { - return key.charAt(1); - } - var pieces = key.split(/-(?!$)/); - var lastPiece = pieces[pieces.length - 1]; - if (pieces.length == 1 && pieces[0].length == 1) { - return false; - } else if (pieces.length == 2 && pieces[0] == 'Shift' && lastPiece.length == 1) { - return false; - } - var hasCharacter = false; - for (var i = 0; i < pieces.length; i++) { - var piece = pieces[i]; - if (piece in modifiers) { pieces[i] = modifiers[piece]; } - else { hasCharacter = true; } - if (piece in specialKeys) { pieces[i] = specialKeys[piece]; } - } - if (!hasCharacter) { - return false; - } - if (isUpperCase(lastPiece)) { - pieces[pieces.length - 1] = lastPiece.toLowerCase(); - } - return '<' + pieces.join('-') + '>'; - } - - function getOnPasteFn(cm) { - var vim = cm.state.vim; - if (!vim.onPasteFn) { - vim.onPasteFn = function() { - if (!vim.insertMode) { - cm.setCursor(offsetCursor(cm.getCursor(), 0, 1)); - actions.enterInsertMode(cm, {}, vim); - } +]; +var langmap = parseLangmap(''); +function enterVimMode(cm) { + cm.setOption('disableInput', true); + cm.setOption('showCursorWhenSelecting', false); + CodeMirror.signal(cm, "vim-mode-change", { mode: "normal" }); + cm.on('cursorActivity', onCursorActivity); + maybeInitVimState(cm); + CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm)); +} +function leaveVimMode(cm) { + cm.setOption('disableInput', false); + cm.off('cursorActivity', onCursorActivity); + CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm)); + cm.state.vim = null; + if (highlightTimeout) + clearTimeout(highlightTimeout); +} +function getOnPasteFn(cm) { + var vim = cm.state.vim; + if (!vim.onPasteFn) { + vim.onPasteFn = function () { + if (!vim.insertMode) { + cm.setCursor(offsetCursor(cm.getCursor(), 0, 1)); + actions.enterInsertMode(cm, {}, vim); + } }; - } - return vim.onPasteFn; } - - var numberRegex = /[\d]/; - var wordCharTest = [CodeMirror.isWordChar, function(ch) { - return ch && !CodeMirror.isWordChar(ch) && !/\s/.test(ch); - }], bigWordCharTest = [function(ch) { - return /\S/.test(ch); + return vim.onPasteFn; +} +var numberRegex = /[\d]/; +var wordCharTest = [CodeMirror.isWordChar, function (ch) { + return ch && !CodeMirror.isWordChar(ch) && !/\s/.test(ch); + }], bigWordCharTest = [function (ch) { + return /\S/.test(ch); }]; - function makeKeyRange(start, size) { - var keys = []; - for (var i = start; i < start + size; i++) { - keys.push(String.fromCharCode(i)); - } - return keys; - } - var upperCaseAlphabet = makeKeyRange(65, 26); - var lowerCaseAlphabet = makeKeyRange(97, 26); - var numbers = makeKeyRange(48, 10); - var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']); - var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '"', '.', ':', '_', '/']); - var upperCaseChars; - try { upperCaseChars = new RegExp("^[\\p{Lu}]$", "u"); } - catch (_) { upperCaseChars = /^[A-Z]$/; } - - function isLine(cm, line) { - return line >= cm.firstLine() && line <= cm.lastLine(); - } - function isLowerCase(k) { - return (/^[a-z]$/).test(k); - } - function isMatchableSymbol(k) { - return '()[]{}'.indexOf(k) != -1; - } - function isNumber(k) { - return numberRegex.test(k); - } - function isUpperCase(k) { - return upperCaseChars.test(k); - } - function isWhiteSpaceString(k) { - return (/^\s*$/).test(k); - } - function isEndOfSentenceSymbol(k) { - return '.?!'.indexOf(k) != -1; - } - function inArray(val, arr) { - for (var i = 0; i < arr.length; i++) { +var validMarks = ['<', '>']; +var validRegisters = ['-', '"', '.', ':', '_', '/', '+']; +var latinCharRegex = /^\w$/; +var upperCaseChars; +try { + upperCaseChars = new RegExp("^[\\p{Lu}]$", "u"); +} +catch (_) { + upperCaseChars = /^[A-Z]$/; +} +function isLine(cm, line) { + return line >= cm.firstLine() && line <= cm.lastLine(); +} +function isLowerCase(k) { + return (/^[a-z]$/).test(k); +} +function isMatchableSymbol(k) { + return '()[]{}'.indexOf(k) != -1; +} +function isNumber(k) { + return numberRegex.test(k); +} +function isUpperCase(k) { + return upperCaseChars.test(k); +} +function isWhiteSpaceString(k) { + return (/^\s*$/).test(k); +} +function isEndOfSentenceSymbol(k) { + return '.?!'.indexOf(k) != -1; +} +function inArray(val, arr) { + for (var i = 0; i < arr.length; i++) { if (arr[i] == val) { - return true; + return true; } - } - return false; } - - var options = {}; - function defineOption(name, defaultValue, type, aliases, callback) { - if (defaultValue === undefined && !callback) { + return false; +} +var options = {}; +function defineOption(name, defaultValue, type, aliases, callback) { + if (defaultValue === undefined && !callback) { throw Error('defaultValue is required unless callback is provided'); - } - if (!type) { type = 'string'; } - options[name] = { + } + if (!type) { + type = 'string'; + } + options[name] = { type: type, defaultValue: defaultValue, callback: callback - }; - if (aliases) { + }; + if (aliases) { for (var i = 0; i < aliases.length; i++) { - options[aliases[i]] = options[name]; + options[aliases[i]] = options[name]; } - } - if (defaultValue) { + } + if (defaultValue) { setOption(name, defaultValue); - } } - - function setOption(name, value, cm, cfg) { - var option = options[name]; - cfg = cfg || {}; - var scope = cfg.scope; - if (!option) { +} +function setOption(name, value, cm, cfg) { + var option = options[name]; + cfg = cfg || {}; + var scope = cfg.scope; + if (!option) { return new Error('Unknown option: ' + name); - } - if (option.type == 'boolean') { + } + if (option.type == 'boolean') { if (value && value !== true) { - return new Error('Invalid argument: ' + name + '=' + value); - } else if (value !== false) { - value = true; + return new Error('Invalid argument: ' + name + '=' + value); + } + else if (value !== false) { + value = true; } - } - if (option.callback) { + } + if (option.callback) { if (scope !== 'local') { - option.callback(value, undefined); + option.callback(value, undefined); } if (scope !== 'global' && cm) { - option.callback(value, cm); + option.callback(value, cm); } - } else { + } + else { if (scope !== 'local') { - option.value = option.type == 'boolean' ? !!value : value; + option.value = option.type == 'boolean' ? !!value : value; } if (scope !== 'global' && cm) { - cm.state.vim.options[name] = {value: value}; + cm.state.vim.options[name] = { value: value }; } - } } - - function getOption(name, cm, cfg) { - var option = options[name]; - cfg = cfg || {}; - var scope = cfg.scope; - if (!option) { +} +function getOption(name, cm, cfg) { + var option = options[name]; + cfg = cfg || {}; + var scope = cfg.scope; + if (!option) { return new Error('Unknown option: ' + name); - } - if (option.callback) { + } + if (option.callback) { var local = cm && option.callback(undefined, cm); if (scope !== 'global' && local !== undefined) { - return local; + return local; } if (scope !== 'local') { - return option.callback(); + return option.callback(); } return; - } else { + } + else { var local = (scope !== 'global') && (cm && cm.state.vim.options[name]); return (local || (scope !== 'local') && option || {}).value; - } } - - defineOption('filetype', undefined, 'string', ['ft'], function(name, cm) { - if (cm === undefined) { +} +defineOption('filetype', undefined, 'string', ['ft'], function (name, cm) { + if (cm === undefined) { return; - } - if (name === undefined) { + } + if (name === undefined) { var mode = cm.getOption('mode'); return mode == 'null' ? '' : mode; - } else { + } + else { var mode = name == '' ? 'null' : name; cm.setOption('mode', mode); - } - }); - - var createCircularJumpList = function() { - var size = 100; - var pointer = -1; - var head = 0; - var tail = 0; - var buffer = new Array(size); - function add(cm, oldCur, newCur) { + } +}); +defineOption('textwidth', 80, 'number', ['tw'], function (width, cm) { + if (cm === undefined) { + return; + } + if (width === undefined) { + var value = cm.getOption('textwidth'); + return value; + } + else { + var column = Math.round(width); + if (column > 1) { + cm.setOption('textwidth', column); + } + } +}); +var createCircularJumpList = function () { + var size = 100; + var pointer = -1; + var head = 0; + var tail = 0; + var buffer = new Array(size); + function add(cm, oldCur, newCur) { var current = pointer % size; var curMark = buffer[current]; function useNextSlot(cursor) { - var next = ++pointer % size; - var trashMark = buffer[next]; - if (trashMark) { - trashMark.clear(); - } - buffer[next] = cm.setBookmark(cursor); + var next = ++pointer % size; + var trashMark = buffer[next]; + if (trashMark) { + trashMark.clear(); + } + buffer[next] = cm.setBookmark(cursor); } if (curMark) { - var markPos = curMark.find(); - if (markPos && !cursorEqual(markPos, oldCur)) { + var markPos = curMark.find(); + if (markPos && !cursorEqual(markPos, oldCur)) { + useNextSlot(oldCur); + } + } + else { useNextSlot(oldCur); - } - } else { - useNextSlot(oldCur); } useNextSlot(newCur); head = pointer; tail = pointer - size + 1; if (tail < 0) { - tail = 0; + tail = 0; } - } - function move(cm, offset) { + } + function move(cm, offset) { pointer += offset; if (pointer > head) { - pointer = head; - } else if (pointer < tail) { - pointer = tail; + pointer = head; + } + else if (pointer < tail) { + pointer = tail; } var mark = buffer[(size + pointer) % size]; if (mark && !mark.find()) { - var inc = offset > 0 ? 1 : -1; - var newCur; - var oldCur = cm.getCursor(); - do { - pointer += inc; - mark = buffer[(size + pointer) % size]; - if (mark && - (newCur = mark.find()) && - !cursorEqual(oldCur, newCur)) { - break; - } - } while (pointer < head && pointer > tail); + var inc = offset > 0 ? 1 : -1; + var newCur; + var oldCur = cm.getCursor(); + do { + pointer += inc; + mark = buffer[(size + pointer) % size]; + if (mark && + (newCur = mark.find()) && + !cursorEqual(oldCur, newCur)) { + break; + } + } while (pointer < head && pointer > tail); } return mark; - } - function find(cm, offset) { + } + function find(cm, offset) { var oldPointer = pointer; var mark = move(cm, offset); pointer = oldPointer; return mark && mark.find(); - } - return { + } + return { cachedCursor: undefined, //used for # and * jumps add: add, find: find, move: move - }; }; - var createInsertModeChanges = function(c) { - if (c) { +}; +var createInsertModeChanges = function (c) { + if (c) { return { - changes: c.changes, - expectCursorActivityForChange: c.expectCursorActivityForChange + changes: c.changes, + expectCursorActivityForChange: c.expectCursorActivityForChange }; - } - return { + } + return { changes: [], expectCursorActivityForChange: false - }; }; - - function MacroModeState() { - this.latestRegister = undefined; - this.isPlaying = false; - this.isRecording = false; - this.replaySearchQueries = []; - this.onRecordingDone = undefined; - this.lastInsertModeChanges = createInsertModeChanges(); - } - MacroModeState.prototype = { - exitMacroRecordMode: function() { +}; +function MacroModeState() { + this.latestRegister = undefined; + this.isPlaying = false; + this.isRecording = false; + this.replaySearchQueries = []; + this.onRecordingDone = undefined; + this.lastInsertModeChanges = createInsertModeChanges(); +} +MacroModeState.prototype = { + exitMacroRecordMode: function () { var macroModeState = vimGlobalState.macroModeState; if (macroModeState.onRecordingDone) { - macroModeState.onRecordingDone(); // close dialog + macroModeState.onRecordingDone(); // close dialog } macroModeState.onRecordingDone = undefined; macroModeState.isRecording = false; - }, - enterMacroRecordMode: function(cm, registerName) { - var register = - vimGlobalState.registerController.getRegister(registerName); + }, + enterMacroRecordMode: function (cm, registerName) { + var register = vimGlobalState.registerController.getRegister(registerName); if (register) { - register.clear(); - this.latestRegister = registerName; - if (cm.openDialog) { - this.onRecordingDone = cm.openDialog( - document.createTextNode('(recording)['+registerName+']'), null, {bottom:true}); - } - this.isRecording = true; - } - } - }; - - function maybeInitVimState(cm) { - if (!cm.state.vim) { + register.clear(); + this.latestRegister = registerName; + if (cm.openDialog) { + var template = dom('span', { class: 'cm-vim-message' }, 'recording @' + registerName); + this.onRecordingDone = cm.openDialog(template, null, { bottom: true }); + } + this.isRecording = true; + } + } +}; +function maybeInitVimState(cm) { + if (!cm.state.vim) { cm.state.vim = { - inputState: new InputState(), - lastEditInputState: undefined, - lastEditActionCommand: undefined, - lastHPos: -1, - lastHSPos: -1, - lastMotion: null, - marks: {}, - insertMode: false, - insertModeRepeat: undefined, - visualMode: false, - visualLine: false, - visualBlock: false, - lastSelection: null, - lastPastedText: null, - sel: {}, - options: {} + inputState: new InputState(), + lastEditInputState: undefined, + lastEditActionCommand: undefined, + lastHPos: -1, + lastHSPos: -1, + lastMotion: null, + marks: {}, + insertMode: false, + insertModeReturn: false, + insertModeRepeat: undefined, + visualMode: false, + visualLine: false, + visualBlock: false, + lastSelection: null, + lastPastedText: null, + sel: {}, + options: {}, + expectLiteralNext: false }; - } - return cm.state.vim; } - var vimGlobalState; - function resetVimGlobalState() { - vimGlobalState = { + return cm.state.vim; +} +var vimGlobalState; +function resetVimGlobalState() { + vimGlobalState = { searchQuery: null, searchIsReversed: false, lastSubstituteReplacePart: undefined, jumpList: createCircularJumpList(), macroModeState: new MacroModeState, - lastCharacterSearch: {increment:0, forward:true, selectedCharacter:''}, + lastCharacterSearch: { increment: 0, forward: true, selectedCharacter: '' }, registerController: new RegisterController({}), searchHistoryController: new HistoryController(), - exCommandHistoryController : new HistoryController() - }; - for (var optionName in options) { + exCommandHistoryController: new HistoryController() + }; + for (var optionName in options) { var option = options[optionName]; option.value = option.defaultValue; - } } - - var lastInsertModeKeyTimer; - var vimApi= { - buildKeyMap: function() { - }, - getRegisterController: function() { +} +var lastInsertModeKeyTimer; +var vimApi = { + enterVimMode: enterVimMode, + leaveVimMode: leaveVimMode, + buildKeyMap: function () { + }, + getRegisterController: function () { return vimGlobalState.registerController; - }, - resetVimGlobalState_: resetVimGlobalState, - getVimGlobalState_: function() { + }, + resetVimGlobalState_: resetVimGlobalState, + getVimGlobalState_: function () { return vimGlobalState; - }, - maybeInitVimState_: maybeInitVimState, - - suppressErrorLogging: false, - - InsertModeKey: InsertModeKey, - map: function(lhs, rhs, ctx) { + }, + maybeInitVimState_: maybeInitVimState, + suppressErrorLogging: false, + InsertModeKey: InsertModeKey, + map: function (lhs, rhs, ctx) { exCommandDispatcher.map(lhs, rhs, ctx); - }, - unmap: function(lhs, ctx) { + }, + unmap: function (lhs, ctx) { return exCommandDispatcher.unmap(lhs, ctx); - }, - noremap: function(lhs, rhs, ctx) { - function toCtxArray(ctx) { - return ctx ? [ctx] : ['normal', 'insert', 'visual']; - } - var ctxsToMap = toCtxArray(ctx); + }, + noremap: function (lhs, rhs, ctx) { + exCommandDispatcher.map(lhs, rhs, ctx, true); + }, + mapclear: function (ctx) { var actualLength = defaultKeymap.length, origLength = defaultKeymapLength; - for (var i = actualLength - origLength; - i < actualLength && ctxsToMap.length; - i++) { - var mapping = defaultKeymap[i]; - if (mapping.keys == rhs && - (!ctx || !mapping.context || mapping.context === ctx) && - mapping.type.substr(0, 2) !== 'ex' && - mapping.type.substr(0, 3) !== 'key') { - var newMapping = {}; - for (var key in mapping) { - newMapping[key] = mapping[key]; - } - newMapping.keys = lhs; - if (ctx && !newMapping.context) { - newMapping.context = ctx; - } - this._mapCommand(newMapping); - var mappedCtxs = toCtxArray(mapping.context); - ctxsToMap = ctxsToMap.filter(function(el) { return mappedCtxs.indexOf(el) === -1; }); - } - } - }, - mapclear: function(ctx) { - var actualLength = defaultKeymap.length, - origLength = defaultKeymapLength; var userKeymap = defaultKeymap.slice(0, actualLength - origLength); defaultKeymap = defaultKeymap.slice(actualLength - origLength); if (ctx) { - for (var i = userKeymap.length - 1; i >= 0; i--) { - var mapping = userKeymap[i]; - if (ctx !== mapping.context) { - if (mapping.context) { - this._mapCommand(mapping); - } else { - var contexts = ['normal', 'insert', 'visual']; - for (var j in contexts) { - if (contexts[j] !== ctx) { - var newMapping = {}; - for (var key in mapping) { - newMapping[key] = mapping[key]; + for (var i = userKeymap.length - 1; i >= 0; i--) { + var mapping = userKeymap[i]; + if (ctx !== mapping.context) { + if (mapping.context) { + this._mapCommand(mapping); + } + else { + var contexts = ['normal', 'insert', 'visual']; + for (var j in contexts) { + if (contexts[j] !== ctx) { + var newMapping = {}; + for (var key in mapping) { + newMapping[key] = mapping[key]; + } + newMapping.context = contexts[j]; + this._mapCommand(newMapping); + } + } } - newMapping.context = contexts[j]; - this._mapCommand(newMapping); - } } - } } - } } - }, - setOption: setOption, - getOption: getOption, - defineOption: defineOption, - defineEx: function(name, prefix, func){ + }, + langmap: updateLangmap, + vimKeyFromEvent: vimKeyFromEvent, + setOption: setOption, + getOption: getOption, + defineOption: defineOption, + defineEx: function (name, prefix, func) { if (!prefix) { - prefix = name; - } else if (name.indexOf(prefix) !== 0) { - throw new Error('(Vim.defineEx) "'+prefix+'" is not a prefix of "'+name+'", command not registered'); - } - exCommands[name]=func; - exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'}; - }, - handleKey: function (cm, key, origin) { + prefix = name; + } + else if (name.indexOf(prefix) !== 0) { + throw new Error('(Vim.defineEx) "' + prefix + '" is not a prefix of "' + name + '", command not registered'); + } + exCommands[name] = func; + exCommandDispatcher.commandMap_[prefix] = { name: name, shortName: prefix, type: 'api' }; + }, + handleKey: function (cm, key, origin) { var command = this.findKey(cm, key, origin); if (typeof command === 'function') { - return command(); + return command(); } - }, - findKey: function(cm, key, origin) { + }, + multiSelectHandleKey: multiSelectHandleKey, + findKey: function (cm, key, origin) { var vim = maybeInitVimState(cm); function handleMacroRecording() { - var macroModeState = vimGlobalState.macroModeState; - if (macroModeState.isRecording) { - if (key == 'q') { - macroModeState.exitMacroRecordMode(); - clearInputState(cm); - return true; - } - if (origin != 'mapping') { - logKey(macroModeState, key); + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isRecording) { + if (key == 'q') { + macroModeState.exitMacroRecordMode(); + clearInputState(cm); + return true; + } + if (origin != 'mapping') { + logKey(macroModeState, key); + } } - } } function handleEsc() { - if (key == '') { - clearInputState(cm); - if (vim.visualMode) { - exitVisualMode(cm); - } else if (vim.insertMode) { - exitInsertMode(cm); + if (key == '') { + if (vim.visualMode) { + exitVisualMode(cm); + } + else if (vim.insertMode) { + exitInsertMode(cm); + } + else { + return; + } + clearInputState(cm); + return true; } - return true; - } } - function doKeyToKey(keys) { - var match; - while (keys) { - match = (/<\w+-.+?>|<\w+>|./).exec(keys); - key = match[0]; - keys = keys.substring(match.index + key.length); - vimApi.handleKey(cm, key, 'mapping'); - } - } - function handleKeyInsertMode() { - if (handleEsc()) { return true; } - var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; - var keysAreChars = key.length == 1; - var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); - while (keys.length > 1 && match.type != 'full') { - var keys = vim.inputState.keyBuffer = keys.slice(1); - var thisMatch = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); - if (thisMatch.type != 'none') { match = thisMatch; } - } - if (match.type == 'none') { clearInputState(cm); return false; } - else if (match.type == 'partial') { - if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); } - lastInsertModeKeyTimer = window.setTimeout( - function() { if (vim.insertMode && vim.inputState.keyBuffer) { clearInputState(cm); } }, - getOption('insertModeEscKeysTimeout')); - return !keysAreChars; - } - - if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); } - if (keysAreChars) { - var selections = cm.listSelections(); - for (var i = 0; i < selections.length; i++) { - var here = selections[i].head; - cm.replaceRange('', offsetCursor(here, 0, -(keys.length - 1)), here, '+input'); + if (handleEsc()) { + return true; } - vimGlobalState.macroModeState.lastInsertModeChanges.changes.pop(); - } - clearInputState(cm); - return match.command; + vim.inputState.keyBuffer.push(key); + var keys = vim.inputState.keyBuffer.join(""); + var keysAreChars = key.length == 1; + var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); + var changeQueue = vim.inputState.changeQueue; + if (match.type == 'none') { + clearInputState(cm); + return false; + } + else if (match.type == 'partial') { + if (match.expectLiteralNext) + vim.expectLiteralNext = true; + if (lastInsertModeKeyTimer) { + window.clearTimeout(lastInsertModeKeyTimer); + } + lastInsertModeKeyTimer = keysAreChars && window.setTimeout(function () { if (vim.insertMode && vim.inputState.keyBuffer.length) { + clearInputState(cm); + } }, getOption('insertModeEscKeysTimeout')); + if (keysAreChars) { + var selections = cm.listSelections(); + if (!changeQueue || changeQueue.removed.length != selections.length) + changeQueue = vim.inputState.changeQueue = new ChangeQueue; + changeQueue.inserted += key; + for (var i = 0; i < selections.length; i++) { + var from = cursorMin(selections[i].anchor, selections[i].head); + var to = cursorMax(selections[i].anchor, selections[i].head); + var text = cm.getRange(from, cm.state.overwrite ? offsetCursor(to, 0, 1) : to); + changeQueue.removed[i] = (changeQueue.removed[i] || "") + text; + } + } + return !keysAreChars; + } + vim.expectLiteralNext = false; + if (lastInsertModeKeyTimer) { + window.clearTimeout(lastInsertModeKeyTimer); + } + if (match.command && changeQueue) { + var selections = cm.listSelections(); + for (var i = 0; i < selections.length; i++) { + var here = selections[i].head; + cm.replaceRange(changeQueue.removed[i] || "", offsetCursor(here, 0, -changeQueue.inserted.length), here, '+input'); + } + vimGlobalState.macroModeState.lastInsertModeChanges.changes.pop(); + } + if (!match.command) + clearInputState(cm); + return match.command; } - function handleKeyNonInsertMode() { - if (handleMacroRecording() || handleEsc()) { return true; } - - var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; - if (/^[1-9]\d*$/.test(keys)) { return true; } - - var keysMatcher = /^(\d*)(.*)$/.exec(keys); - if (!keysMatcher) { clearInputState(cm); return false; } - var context = vim.visualMode ? 'visual' : - 'normal'; - var mainKey = keysMatcher[2] || keysMatcher[1]; - if (vim.inputState.operatorShortcut && vim.inputState.operatorShortcut.slice(-1) == mainKey) { - mainKey = vim.inputState.operatorShortcut; - } - var match = commandDispatcher.matchCommand(mainKey, defaultKeymap, vim.inputState, context); - if (match.type == 'none') { clearInputState(cm); return false; } - else if (match.type == 'partial') { return true; } - else if (match.type == 'clear') { clearInputState(cm); return true; } // ace_patch - - vim.inputState.keyBuffer = ''; - var keysMatcher = /^(\d*)(.*)$/.exec(keys); - if (keysMatcher[1] && keysMatcher[1] != '0') { - vim.inputState.pushRepeatDigit(keysMatcher[1]); - } - return match.command; + if (handleMacroRecording() || handleEsc()) { + return true; + } + vim.inputState.keyBuffer.push(key); + var keys = vim.inputState.keyBuffer.join(""); + if (/^[1-9]\d*$/.test(keys)) { + return true; + } + var keysMatcher = /^(\d*)(.*)$/.exec(keys); + if (!keysMatcher) { + clearInputState(cm); + return false; + } + var context = vim.visualMode ? 'visual' : + 'normal'; + var mainKey = keysMatcher[2] || keysMatcher[1]; + if (vim.inputState.operatorShortcut && vim.inputState.operatorShortcut.slice(-1) == mainKey) { + mainKey = vim.inputState.operatorShortcut; + } + var match = commandDispatcher.matchCommand(mainKey, defaultKeymap, vim.inputState, context); + if (match.type == 'none') { + clearInputState(cm); + return false; + } + else if (match.type == 'partial') { + if (match.expectLiteralNext) + vim.expectLiteralNext = true; + return true; + } + else if (match.type == 'clear') { + clearInputState(cm); + return true; + } + vim.expectLiteralNext = false; + vim.inputState.keyBuffer.length = 0; + keysMatcher = /^(\d*)(.*)$/.exec(keys); + if (keysMatcher[1] && keysMatcher[1] != '0') { + vim.inputState.pushRepeatDigit(keysMatcher[1]); + } + return match.command; } - var command; - if (vim.insertMode) { command = handleKeyInsertMode(); } - else { command = handleKeyNonInsertMode(); } + if (vim.insertMode) { + command = handleKeyInsertMode(); + } + else { + command = handleKeyNonInsertMode(); + } if (command === false) { - return undefined; //ace_patch - } else if (command === true) { - return function() { return true; }; - } else { - return function() { - if ((command.operator || command.isEdit) && cm.getOption('readOnly')) - return; // ace_patch - return cm.operation(function() { - cm.curOp.isVimOp = true; - try { - if (command.type == 'keyToKey') { - doKeyToKey(command.toKeys); - } else { - commandDispatcher.processCommand(cm, vim, command); - } - } catch (e) { - cm.state.vim = undefined; - maybeInitVimState(cm); - if (!vimApi.suppressErrorLogging) { - console['log'](e); - } - throw e; - } - return true; - }); - }; + return !vim.insertMode && key.length === 1 ? function () { return true; } : undefined; + } + else if (command === true) { + return function () { return true; }; + } + else { + return function () { + if ((command.operator || command.isEdit) && cm.getOption('readOnly')) + return; // ace_patch + return cm.operation(function () { + cm.curOp.isVimOp = true; + try { + if (command.type == 'keyToKey') { + doKeyToKey(cm, command.toKeys, command); + } + else { + commandDispatcher.processCommand(cm, vim, command); + } + } + catch (e) { + cm.state.vim = undefined; + maybeInitVimState(cm); + if (!vimApi.suppressErrorLogging) { + console['log'](e); + } + throw e; + } + return true; + }); + }; } - }, - handleEx: function(cm, input) { + }, + handleEx: function (cm, input) { exCommandDispatcher.processCommand(cm, input); - }, - - defineMotion: defineMotion, - defineAction: defineAction, - defineOperator: defineOperator, - mapCommand: mapCommand, - _mapCommand: _mapCommand, - - defineRegister: defineRegister, - - exitVisualMode: exitVisualMode, - exitInsertMode: exitInsertMode - }; - function InputState() { - this.prefixRepeat = []; - this.motionRepeat = []; - - this.operator = null; - this.operatorArgs = null; - this.motion = null; - this.motionArgs = null; - this.keyBuffer = []; // For matching multi-key commands. - this.registerName = null; // Defaults to the unnamed register. - } - InputState.prototype.pushRepeatDigit = function(n) { - if (!this.operator) { + }, + defineMotion: defineMotion, + defineAction: defineAction, + defineOperator: defineOperator, + mapCommand: mapCommand, + _mapCommand: _mapCommand, + defineRegister: defineRegister, + exitVisualMode: exitVisualMode, + exitInsertMode: exitInsertMode +}; +var keyToKeyStack = []; +var noremap = false; +var virtualPrompt; +function sendKeyToPrompt(key) { + if (key[0] == "<") { + var lowerKey = key.toLowerCase().slice(1, -1); + var parts = lowerKey.split('-'); + lowerKey = parts.pop() || ''; + if (lowerKey == 'lt') + key = '<'; + else if (lowerKey == 'space') + key = ' '; + else if (lowerKey == 'cr') + key = '\n'; + else if (vimToCmKeyMap[lowerKey]) { + var value = virtualPrompt.value; + var event = { + key: vimToCmKeyMap[lowerKey], + target: { + value: value, + selectionEnd: value.length, + selectionStart: value.length + } + }; + if (virtualPrompt.onKeyDown) { + virtualPrompt.onKeyDown(event, virtualPrompt.value, close); + } + if (virtualPrompt && virtualPrompt.onKeyUp) { + virtualPrompt.onKeyUp(event, virtualPrompt.value, close); + } + return; + } + } + if (key == '\n') { + var prompt = virtualPrompt; + virtualPrompt = null; + prompt.onClose && prompt.onClose(prompt.value); + } + else { + virtualPrompt.value = (virtualPrompt.value || '') + key; + } + function close(value) { + if (typeof value == 'string') { + virtualPrompt.value = value; + } + else { + virtualPrompt = null; + } + } +} +function doKeyToKey(cm, keys, fromKey) { + var noremapBefore = noremap; + if (fromKey) { + if (keyToKeyStack.indexOf(fromKey) != -1) + return; + keyToKeyStack.push(fromKey); + noremap = fromKey.noremap != false; + } + try { + var vim = maybeInitVimState(cm); + var keyRe = /<(?:[CSMA]-)*\w+>|./gi; + var match; + while ((match = keyRe.exec(keys))) { + var key = match[0]; + var wasInsert = vim.insertMode; + if (virtualPrompt) { + sendKeyToPrompt(key); + continue; + } + var result = vimApi.handleKey(cm, key, 'mapping'); + if (!result && wasInsert && vim.insertMode) { + if (key[0] == "<") { + var lowerKey = key.toLowerCase().slice(1, -1); + var parts = lowerKey.split('-'); + lowerKey = parts.pop() || ''; + if (lowerKey == 'lt') + key = '<'; + else if (lowerKey == 'space') + key = ' '; + else if (lowerKey == 'cr') + key = '\n'; + else if (vimToCmKeyMap.hasOwnProperty(lowerKey)) { + key = vimToCmKeyMap[lowerKey]; + sendCmKey(cm, key); + continue; + } + else { + key = key[0]; + keyRe.lastIndex = match.index + 1; + } + } + cm.replaceSelection(key); + } + } + } + finally { + keyToKeyStack.pop(); + noremap = keyToKeyStack.length ? noremapBefore : false; + if (!keyToKeyStack.length && virtualPrompt) { + var promptOptions = virtualPrompt; + virtualPrompt = null; + showPrompt(cm, promptOptions); + } + } +} +var specialKey = { + Return: 'CR', Backspace: 'BS', 'Delete': 'Del', Escape: 'Esc', Insert: 'Ins', + ArrowLeft: 'Left', ArrowRight: 'Right', ArrowUp: 'Up', ArrowDown: 'Down', + Enter: 'CR', ' ': 'Space' +}; +var ignoredKeys = { Shift: 1, Alt: 1, Command: 1, Control: 1, + CapsLock: 1, AltGraph: 1, Dead: 1, Unidentified: 1 }; +var vimToCmKeyMap = {}; +'Left|Right|Up|Down|End|Home'.split('|').concat(Object.keys(specialKey)).forEach(function (x) { + vimToCmKeyMap[(specialKey[x] || '').toLowerCase()] + = vimToCmKeyMap[x.toLowerCase()] = x; +}); +function vimKeyFromEvent(e, vim) { + var key = e.key; + if (ignoredKeys[key]) + return; + if (key.length > 1 && key[0] == "n") { + key = key.replace("Numpad", ""); + } + key = specialKey[key] || key; + var name = ''; + if (e.ctrlKey) { + name += 'C-'; + } + if (e.altKey) { + name += 'A-'; + } + if (e.metaKey) { + name += 'M-'; + } + if (CodeMirror.isMac && e.altKey && !e.metaKey && !e.ctrlKey) { + name = name.slice(2); + } + if ((name || key.length > 1) && e.shiftKey) { + name += 'S-'; + } + if (vim && !vim.expectLiteralNext && key.length == 1) { + if (langmap.keymap && key in langmap.keymap) { + if (langmap.remapCtrl != false || !name) + key = langmap.keymap[key]; + } + else if (key.charCodeAt(0) > 255) { + var code = e.code && e.code.slice(-1) || ""; + if (!e.shiftKey) + code = code.toLowerCase(); + if (code) + key = code; + } + } + name += key; + if (name.length > 1) { + name = '<' + name + '>'; + } + return name; +} +; +function updateLangmap(langmapString, remapCtrl) { + if (langmap.string !== langmapString) { + langmap = parseLangmap(langmapString); + } + langmap.remapCtrl = remapCtrl; +} +function parseLangmap(langmapString) { + var keymap = {}; + if (!langmapString) + return { keymap: keymap, string: '' }; + function getEscaped(list) { + return list.split(/\\?(.)/).filter(Boolean); + } + langmapString.split(/((?:[^\\,]|\\.)+),/).map(function (part) { + if (!part) + return; + var semicolon = part.split(/((?:[^\\;]|\\.)+);/); + if (semicolon.length == 3) { + var from = getEscaped(semicolon[1]); + var to = getEscaped(semicolon[2]); + if (from.length !== to.length) + return; // skip over malformed part + for (var i = 0; i < from.length; ++i) + keymap[from[i]] = to[i]; + } + else if (semicolon.length == 1) { + var pairs = getEscaped(part); + if (pairs.length % 2 !== 0) + return; // skip over malformed part + for (var i = 0; i < pairs.length; i += 2) + keymap[pairs[i]] = pairs[i + 1]; + } + }); + return { keymap: keymap, string: langmapString }; +} +defineOption('langmap', undefined, 'string', ['lmap'], function (name, cm) { + if (name === undefined) { + return langmap.string; + } + else { + updateLangmap(name); + } +}); +function InputState() { + this.prefixRepeat = []; + this.motionRepeat = []; + this.operator = null; + this.operatorArgs = null; + this.motion = null; + this.motionArgs = null; + this.keyBuffer = []; // For matching multi-key commands. + this.registerName = null; // Defaults to the unnamed register. + this.changeQueue = null; // For restoring text used by insert mode keybindings +} +InputState.prototype.pushRepeatDigit = function (n) { + if (!this.operator) { this.prefixRepeat = this.prefixRepeat.concat(n); - } else { + } + else { this.motionRepeat = this.motionRepeat.concat(n); - } - }; - InputState.prototype.getRepeat = function() { - var repeat = 0; - if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) { + } +}; +InputState.prototype.getRepeat = function () { + var repeat = 0; + if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) { repeat = 1; if (this.prefixRepeat.length > 0) { - repeat *= parseInt(this.prefixRepeat.join(''), 10); + repeat *= parseInt(this.prefixRepeat.join(''), 10); } if (this.motionRepeat.length > 0) { - repeat *= parseInt(this.motionRepeat.join(''), 10); + repeat *= parseInt(this.motionRepeat.join(''), 10); } - } - return repeat; - }; - - function clearInputState(cm, reason) { - cm.state.vim.inputState = new InputState(); - CodeMirror.signal(cm, 'vim-command-done', reason); - } - function Register(text, linewise, blockwise) { - this.clear(); - this.keyBuffer = [text || '']; - this.insertModeChanges = []; - this.searchQueries = []; - this.linewise = !!linewise; - this.blockwise = !!blockwise; - } - Register.prototype = { - setText: function(text, linewise, blockwise) { + } + return repeat; +}; +function clearInputState(cm, reason) { + cm.state.vim.inputState = new InputState(); + cm.state.vim.expectLiteralNext = false; + CodeMirror.signal(cm, 'vim-command-done', reason); +} +function ChangeQueue() { + this.removed = []; + this.inserted = ""; +} +function Register(text, linewise, blockwise) { + this.clear(); + this.keyBuffer = [text || '']; + this.insertModeChanges = []; + this.searchQueries = []; + this.linewise = !!linewise; + this.blockwise = !!blockwise; +} +Register.prototype = { + setText: function (text, linewise, blockwise) { this.keyBuffer = [text || '']; this.linewise = !!linewise; this.blockwise = !!blockwise; - }, - pushText: function(text, linewise) { + }, + pushText: function (text, linewise) { if (linewise) { - if (!this.linewise) { - this.keyBuffer.push('\n'); - } - this.linewise = true; + if (!this.linewise) { + this.keyBuffer.push('\n'); + } + this.linewise = true; } this.keyBuffer.push(text); - }, - pushInsertModeChanges: function(changes) { + }, + pushInsertModeChanges: function (changes) { this.insertModeChanges.push(createInsertModeChanges(changes)); - }, - pushSearchQuery: function(query) { + }, + pushSearchQuery: function (query) { this.searchQueries.push(query); - }, - clear: function() { + }, + clear: function () { this.keyBuffer = []; this.insertModeChanges = []; this.searchQueries = []; this.linewise = false; - }, - toString: function() { + }, + toString: function () { return this.keyBuffer.join(''); - } - }; - function defineRegister(name, register) { - var registers = vimGlobalState.registerController.registers; - if (!name || name.length != 1) { + } +}; +function defineRegister(name, register) { + var registers = vimGlobalState.registerController.registers; + if (!name || name.length != 1) { throw Error('Register name must be 1 character'); - } - registers[name] = register; - validRegisters.push(name); - } - function RegisterController(registers) { - this.registers = registers; - this.unnamedRegister = registers['"'] = new Register(); - registers['.'] = new Register(); - registers[':'] = new Register(); - registers['/'] = new Register(); - } - RegisterController.prototype = { - pushText: function(registerName, operator, text, linewise, blockwise) { - if (registerName === '_') return; - if (linewise && text.charAt(text.length - 1) !== '\n'){ - text += '\n'; + } + registers[name] = register; + validRegisters.push(name); +} +function RegisterController(registers) { + this.registers = registers; + this.unnamedRegister = registers['"'] = new Register(); + registers['.'] = new Register(); + registers[':'] = new Register(); + registers['/'] = new Register(); + registers['+'] = new Register(); +} +RegisterController.prototype = { + pushText: function (registerName, operator, text, linewise, blockwise) { + if (registerName === '_') + return; + if (linewise && text.charAt(text.length - 1) !== '\n') { + text += '\n'; } var register = this.isValidRegister(registerName) ? this.getRegister(registerName) : null; if (!register) { - switch (operator) { - case 'yank': - this.registers['0'] = new Register(text, linewise, blockwise); - break; - case 'delete': - case 'change': - if (text.indexOf('\n') == -1) { - this.registers['-'] = new Register(text, linewise); - } else { - this.shiftNumericRegisters_(); - this.registers['1'] = new Register(text, linewise); - } - break; - } - this.unnamedRegister.setText(text, linewise, blockwise); - return; + switch (operator) { + case 'yank': + this.registers['0'] = new Register(text, linewise, blockwise); + break; + case 'delete': + case 'change': + if (text.indexOf('\n') == -1) { + this.registers['-'] = new Register(text, linewise); + } + else { + this.shiftNumericRegisters_(); + this.registers['1'] = new Register(text, linewise); + } + break; + } + this.unnamedRegister.setText(text, linewise, blockwise); + return; } var append = isUpperCase(registerName); if (append) { - register.pushText(text, linewise); - } else { - register.setText(text, linewise, blockwise); + register.pushText(text, linewise); + } + else { + register.setText(text, linewise, blockwise); + } + if (registerName === '+' && typeof navigator !== 'undefined' && + typeof navigator.clipboard !== 'undefined' && + typeof navigator.clipboard.readText === 'function') { + navigator.clipboard.writeText(text); } this.unnamedRegister.setText(register.toString(), linewise); - }, - getRegister: function(name) { + }, + getRegister: function (name) { if (!this.isValidRegister(name)) { - return this.unnamedRegister; + return this.unnamedRegister; } name = name.toLowerCase(); if (!this.registers[name]) { - this.registers[name] = new Register(); + this.registers[name] = new Register(); } return this.registers[name]; - }, - isValidRegister: function(name) { - return name && inArray(name, validRegisters); - }, - shiftNumericRegisters_: function() { + }, + isValidRegister: function (name) { + return name && (inArray(name, validRegisters) || latinCharRegex.test(name)); + }, + shiftNumericRegisters_: function () { for (var i = 9; i >= 2; i--) { - this.registers[i] = this.getRegister('' + (i - 1)); + this.registers[i] = this.getRegister('' + (i - 1)); } - } - }; - function HistoryController() { - this.historyBuffer = []; - this.iterator = 0; - this.initialPrefix = null; } - HistoryController.prototype = { - nextMatch: function (input, up) { +}; +function HistoryController() { + this.historyBuffer = []; + this.iterator = 0; + this.initialPrefix = null; +} +HistoryController.prototype = { + nextMatch: function (input, up) { var historyBuffer = this.historyBuffer; var dir = up ? -1 : 1; - if (this.initialPrefix === null) this.initialPrefix = input; - for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i+= dir) { - var element = historyBuffer[i]; - for (var j = 0; j <= element.length; j++) { - if (this.initialPrefix == element.substring(0, j)) { - this.iterator = i; - return element; + if (this.initialPrefix === null) + this.initialPrefix = input; + for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i += dir) { + var element = historyBuffer[i]; + for (var j = 0; j <= element.length; j++) { + if (this.initialPrefix == element.substring(0, j)) { + this.iterator = i; + return element; + } } - } } if (i >= historyBuffer.length) { - this.iterator = historyBuffer.length; - return this.initialPrefix; + this.iterator = historyBuffer.length; + return this.initialPrefix; } - if (i < 0 ) return input; - }, - pushInput: function(input) { + if (i < 0) + return input; + }, + pushInput: function (input) { var index = this.historyBuffer.indexOf(input); - if (index > -1) this.historyBuffer.splice(index, 1); - if (input.length) this.historyBuffer.push(input); - }, - reset: function() { + if (index > -1) + this.historyBuffer.splice(index, 1); + if (input.length) + this.historyBuffer.push(input); + }, + reset: function () { this.initialPrefix = null; this.iterator = this.historyBuffer.length; - } - }; - var commandDispatcher = { - matchCommand: function(keys, keyMap, inputState, context) { + } +}; +var commandDispatcher = { + matchCommand: function (keys, keyMap, inputState, context) { var matches = commandMatches(keys, keyMap, context, inputState); if (!matches.full && !matches.partial) { - return {type: 'none'}; - } else if (!matches.full && matches.partial) { - return {type: 'partial'}; + return { type: 'none' }; + } + else if (!matches.full && matches.partial) { + return { + type: 'partial', + expectLiteralNext: matches.partial.length == 1 && matches.partial[0].keys.slice(-11) == '' // langmap literal logic + }; } - var bestMatch; for (var i = 0; i < matches.full.length; i++) { - var match = matches.full[i]; - if (!bestMatch) { - bestMatch = match; - } - } - if (bestMatch.keys.slice(-11) == '') { - var character = lastChar(keys); - if (!character || character.length > 1) return {type: 'clear'}; //ace_patch - inputState.selectedCharacter = character; - } - return {type: 'full', command: bestMatch}; - }, - processCommand: function(cm, vim, command) { + var match = matches.full[i]; + if (!bestMatch) { + bestMatch = match; + } + } + if (bestMatch.keys.slice(-11) == '' || bestMatch.keys.slice(-10) == '') { + var character = lastChar(keys); + if (!character || character.length > 1) + return { type: 'clear' }; + inputState.selectedCharacter = character; + } + return { type: 'full', command: bestMatch }; + }, + processCommand: function (cm, vim, command) { vim.inputState.repeatOverride = command.repeatOverride; switch (command.type) { - case 'motion': - this.processMotion(cm, vim, command); - break; - case 'operator': - this.processOperator(cm, vim, command); - break; - case 'operatorMotion': - this.processOperatorMotion(cm, vim, command); - break; - case 'action': - this.processAction(cm, vim, command); - break; - case 'search': - this.processSearch(cm, vim, command); - break; - case 'ex': - case 'keyToEx': - this.processEx(cm, vim, command); - break; - default: - break; + case 'motion': + this.processMotion(cm, vim, command); + break; + case 'operator': + this.processOperator(cm, vim, command); + break; + case 'operatorMotion': + this.processOperatorMotion(cm, vim, command); + break; + case 'action': + this.processAction(cm, vim, command); + break; + case 'search': + this.processSearch(cm, vim, command); + break; + case 'ex': + case 'keyToEx': + this.processEx(cm, vim, command); + break; + default: + break; } - }, - processMotion: function(cm, vim, command) { + }, + processMotion: function (cm, vim, command) { vim.inputState.motion = command.motion; vim.inputState.motionArgs = copyArgs(command.motionArgs); this.evalInput(cm, vim); - }, - processOperator: function(cm, vim, command) { + }, + processOperator: function (cm, vim, command) { var inputState = vim.inputState; if (inputState.operator) { - if (inputState.operator == command.operator) { - inputState.motion = 'expandToLine'; - inputState.motionArgs = { linewise: true }; - this.evalInput(cm, vim); - return; - } else { - clearInputState(cm); - } + if (inputState.operator == command.operator) { + inputState.motion = 'expandToLine'; + inputState.motionArgs = { linewise: true }; + this.evalInput(cm, vim); + return; + } + else { + clearInputState(cm); + } } inputState.operator = command.operator; inputState.operatorArgs = copyArgs(command.operatorArgs); if (command.keys.length > 1) { - inputState.operatorShortcut = command.keys; + inputState.operatorShortcut = command.keys; } if (command.exitVisualBlock) { vim.visualBlock = false; updateCmSelection(cm); } if (vim.visualMode) { - this.evalInput(cm, vim); + this.evalInput(cm, vim); } - }, - processOperatorMotion: function(cm, vim, command) { + }, + processOperatorMotion: function (cm, vim, command) { var visualMode = vim.visualMode; var operatorMotionArgs = copyArgs(command.operatorMotionArgs); if (operatorMotionArgs) { - if (visualMode && operatorMotionArgs.visualLine) { - vim.visualLine = true; - } + if (visualMode && operatorMotionArgs.visualLine) { + vim.visualLine = true; + } } this.processOperator(cm, vim, command); if (!visualMode) { - this.processMotion(cm, vim, command); + this.processMotion(cm, vim, command); } - }, - processAction: function(cm, vim, command) { + }, + processAction: function (cm, vim, command) { var inputState = vim.inputState; var repeat = inputState.getRepeat(); var repeatIsExplicit = !!repeat; var actionArgs = copyArgs(command.actionArgs) || {}; if (inputState.selectedCharacter) { - actionArgs.selectedCharacter = inputState.selectedCharacter; + actionArgs.selectedCharacter = inputState.selectedCharacter; } if (command.operator) { - this.processOperator(cm, vim, command); + this.processOperator(cm, vim, command); } if (command.motion) { - this.processMotion(cm, vim, command); + this.processMotion(cm, vim, command); } if (command.motion || command.operator) { - this.evalInput(cm, vim); + this.evalInput(cm, vim); } actionArgs.repeat = repeat || 1; actionArgs.repeatIsExplicit = repeatIsExplicit; @@ -2117,13 +2362,13 @@ dom.importCssString(".normal-mode .ace_cursor{\ clearInputState(cm); vim.lastMotion = null; if (command.isEdit) { - this.recordLastEdit(vim, inputState, command); + this.recordLastEdit(vim, inputState, command); } actions[command.action](cm, actionArgs, vim); - }, - processSearch: function(cm, vim, command) { + }, + processSearch: function (cm, vim, command) { if (!cm.getSearchCursor) { - return; + return; } var forward = command.searchArgs.forward; var wholeWordOnly = command.searchArgs.wholeWordOnly; @@ -2132,162 +2377,171 @@ dom.importCssString(".normal-mode .ace_cursor{\ var originalQuery = getSearchState(cm).getQuery(); var originalScrollPos = cm.getScrollInfo(); function handleQuery(query, ignoreCase, smartCase) { - vimGlobalState.searchHistoryController.pushInput(query); - vimGlobalState.searchHistoryController.reset(); - try { - updateSearchQuery(cm, query, ignoreCase, smartCase); - } catch (e) { - showConfirm(cm, 'Invalid regex: ' + query); - clearInputState(cm); - return; - } - commandDispatcher.processMotion(cm, vim, { - type: 'motion', - motion: 'findNext', - motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist } - }); + vimGlobalState.searchHistoryController.pushInput(query); + vimGlobalState.searchHistoryController.reset(); + try { + updateSearchQuery(cm, query, ignoreCase, smartCase); + } + catch (e) { + showConfirm(cm, 'Invalid regex: ' + query); + clearInputState(cm); + return; + } + commandDispatcher.processMotion(cm, vim, { + type: 'motion', + motion: 'findNext', + motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist } + }); } function onPromptClose(query) { - handleQuery(query, true /** ignoreCase */, true /** smartCase */); - var macroModeState = vimGlobalState.macroModeState; - if (macroModeState.isRecording) { - logSearchQuery(macroModeState, query); - } + handleQuery(query, true /** ignoreCase */, true /** smartCase */); + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isRecording) { + logSearchQuery(macroModeState, query); + } } function onPromptKeyUp(e, query, close) { - var keyName = CodeMirror.keyName(e), up, offset; - if (keyName == 'Up' || keyName == 'Down') { - up = keyName == 'Up' ? true : false; - offset = e.target ? e.target.selectionEnd : 0; - query = vimGlobalState.searchHistoryController.nextMatch(query, up) || ''; - close(query); - if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length); - } else { - if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') - vimGlobalState.searchHistoryController.reset(); - } - var parsedQuery; - try { - parsedQuery = updateSearchQuery(cm, query, - true /** ignoreCase */, true /** smartCase */); - } catch (e) { - } - if (parsedQuery) { - cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30); - } else { - clearSearchHighlight(cm); - cm.scrollTo(originalScrollPos.left, originalScrollPos.top); - } + var keyName = vimKeyFromEvent(e), up, offset; + if (keyName == '' || keyName == '') { + up = keyName == '' ? true : false; + offset = e.target ? e.target.selectionEnd : 0; + query = vimGlobalState.searchHistoryController.nextMatch(query, up) || ''; + close(query); + if (offset && e.target) + e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length); + } + else if (keyName && keyName != '' && keyName != '') { + vimGlobalState.searchHistoryController.reset(); + } + var parsedQuery; + try { + parsedQuery = updateSearchQuery(cm, query, true /** ignoreCase */, true /** smartCase */); + } + catch (e) { + } + if (parsedQuery) { + cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30); + } + else { + clearSearchHighlight(cm); + cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + } } function onPromptKeyDown(e, query, close) { - var keyName = CodeMirror.keyName(e); - if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || - (keyName == 'Backspace' && query == '')) { - vimGlobalState.searchHistoryController.pushInput(query); - vimGlobalState.searchHistoryController.reset(); - updateSearchQuery(cm, originalQuery); - clearSearchHighlight(cm); - cm.scrollTo(originalScrollPos.left, originalScrollPos.top); - CodeMirror.e_stop(e); - clearInputState(cm); - close(); - cm.focus(); - } else if (keyName == 'Up' || keyName == 'Down') { - CodeMirror.e_stop(e); - } else if (keyName == 'Ctrl-U') { - CodeMirror.e_stop(e); - close(''); - } + var keyName = vimKeyFromEvent(e); + if (keyName == '' || keyName == '' || keyName == '' || + (keyName == '' && query == '')) { + vimGlobalState.searchHistoryController.pushInput(query); + vimGlobalState.searchHistoryController.reset(); + updateSearchQuery(cm, originalQuery); + clearSearchHighlight(cm); + cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + CodeMirror.e_stop(e); + clearInputState(cm); + close(); + cm.focus(); + } + else if (keyName == '' || keyName == '') { + CodeMirror.e_stop(e); + } + else if (keyName == '') { + CodeMirror.e_stop(e); + close(''); + } } switch (command.searchArgs.querySrc) { - case 'prompt': - var macroModeState = vimGlobalState.macroModeState; - if (macroModeState.isPlaying) { - var query = macroModeState.replaySearchQueries.shift(); - handleQuery(query, true /** ignoreCase */, false /** smartCase */); - } else { - showPrompt(cm, { - onClose: onPromptClose, - prefix: promptPrefix, - desc: '(JavaScript regexp)', - onKeyUp: onPromptKeyUp, - onKeyDown: onPromptKeyDown - }); - } - break; - case 'wordUnderCursor': - var word = expandWordUnderCursor(cm, false /** inclusive */, - true /** forward */, false /** bigWord */, - true /** noSymbol */); - var isKeyword = true; - if (!word) { - word = expandWordUnderCursor(cm, false /** inclusive */, - true /** forward */, false /** bigWord */, - false /** noSymbol */); - isKeyword = false; - } - if (!word) { - return; - } - var query = cm.getLine(word.start.line).substring(word.start.ch, - word.end.ch); - if (isKeyword && wholeWordOnly) { - query = '\\b' + query + '\\b'; - } else { - query = escapeRegex(query); - } - vimGlobalState.jumpList.cachedCursor = cm.getCursor(); - cm.setCursor(word.start); - - handleQuery(query, true /** ignoreCase */, false /** smartCase */); - break; + case 'prompt': + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isPlaying) { + var query = macroModeState.replaySearchQueries.shift(); + handleQuery(query, true /** ignoreCase */, false /** smartCase */); + } + else { + showPrompt(cm, { + onClose: onPromptClose, + prefix: promptPrefix, + desc: '(JavaScript regexp)', + onKeyUp: onPromptKeyUp, + onKeyDown: onPromptKeyDown + }); + } + break; + case 'wordUnderCursor': + var word = expandWordUnderCursor(cm, { noSymbol: true }); + var isKeyword = true; + if (!word) { + word = expandWordUnderCursor(cm, { noSymbol: false }); + isKeyword = false; + } + if (!word) { + showConfirm(cm, 'No word under cursor'); + clearInputState(cm); + return; + } + var query = cm.getLine(word.start.line).substring(word.start.ch, word.end.ch); + if (isKeyword && wholeWordOnly) { + query = '\\b' + query + '\\b'; + } + else { + query = escapeRegex(query); + } + vimGlobalState.jumpList.cachedCursor = cm.getCursor(); + cm.setCursor(word.start); + handleQuery(query, true /** ignoreCase */, false /** smartCase */); + break; } - }, - processEx: function(cm, vim, command) { + }, + processEx: function (cm, vim, command) { function onPromptClose(input) { - vimGlobalState.exCommandHistoryController.pushInput(input); - vimGlobalState.exCommandHistoryController.reset(); - exCommandDispatcher.processCommand(cm, input); - } - function onPromptKeyDown(e, input, close) { - var keyName = CodeMirror.keyName(e), up, offset; - if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || - (keyName == 'Backspace' && input == '')) { vimGlobalState.exCommandHistoryController.pushInput(input); vimGlobalState.exCommandHistoryController.reset(); - CodeMirror.e_stop(e); - clearInputState(cm); - close(); - cm.focus(); - } - if (keyName == 'Up' || keyName == 'Down') { - CodeMirror.e_stop(e); - up = keyName == 'Up' ? true : false; - offset = e.target ? e.target.selectionEnd : 0; - input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || ''; - close(input); - if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length); - } else if (keyName == 'Ctrl-U') { - CodeMirror.e_stop(e); - close(''); - } else { - if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') - vimGlobalState.exCommandHistoryController.reset(); - } + exCommandDispatcher.processCommand(cm, input); + if (cm.state.vim) + clearInputState(cm); + } + function onPromptKeyDown(e, input, close) { + var keyName = vimKeyFromEvent(e), up, offset; + if (keyName == '' || keyName == '' || keyName == '' || + (keyName == '' && input == '')) { + vimGlobalState.exCommandHistoryController.pushInput(input); + vimGlobalState.exCommandHistoryController.reset(); + CodeMirror.e_stop(e); + clearInputState(cm); + close(); + cm.focus(); + } + if (keyName == '' || keyName == '') { + CodeMirror.e_stop(e); + up = keyName == '' ? true : false; + offset = e.target ? e.target.selectionEnd : 0; + input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || ''; + close(input); + if (offset && e.target) + e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length); + } + else if (keyName == '') { + CodeMirror.e_stop(e); + close(''); + } + else if (keyName && keyName != '' && keyName != '') { + vimGlobalState.exCommandHistoryController.reset(); + } } if (command.type == 'keyToEx') { - exCommandDispatcher.processCommand(cm, command.exArgs.input); - } else { - if (vim.visualMode) { - showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>', - onKeyDown: onPromptKeyDown, selectValueOnOpen: false}); - } else { - showPrompt(cm, { onClose: onPromptClose, prefix: ':', - onKeyDown: onPromptKeyDown}); - } - } - }, - evalInput: function(cm, vim) { + exCommandDispatcher.processCommand(cm, command.exArgs.input); + } + else { + if (vim.visualMode) { + showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>', + onKeyDown: onPromptKeyDown, selectValueOnOpen: false }); + } + else { + showPrompt(cm, { onClose: onPromptClose, prefix: ':', + onKeyDown: onPromptKeyDown }); + } + } + }, + evalInput: function (cm, vim) { var inputState = vim.inputState; var motion = inputState.motion; var motionArgs = inputState.motionArgs || {}; @@ -2295,552 +2549,598 @@ dom.importCssString(".normal-mode .ace_cursor{\ var operatorArgs = inputState.operatorArgs || {}; var registerName = inputState.registerName; var sel = vim.sel; - var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head): cm.getCursor('head')); + var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head) : cm.getCursor('head')); var origAnchor = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.anchor) : cm.getCursor('anchor')); var oldHead = copyCursor(origHead); var oldAnchor = copyCursor(origAnchor); var newHead, newAnchor; var repeat; if (operator) { - this.recordLastEdit(vim, inputState); + this.recordLastEdit(vim, inputState); } if (inputState.repeatOverride !== undefined) { - repeat = inputState.repeatOverride; - } else { - repeat = inputState.getRepeat(); + repeat = inputState.repeatOverride; + } + else { + repeat = inputState.getRepeat(); } if (repeat > 0 && motionArgs.explicitRepeat) { - motionArgs.repeatIsExplicit = true; - } else if (motionArgs.noRepeat || + motionArgs.repeatIsExplicit = true; + } + else if (motionArgs.noRepeat || (!motionArgs.explicitRepeat && repeat === 0)) { - repeat = 1; - motionArgs.repeatIsExplicit = false; + repeat = 1; + motionArgs.repeatIsExplicit = false; } if (inputState.selectedCharacter) { - motionArgs.selectedCharacter = operatorArgs.selectedCharacter = - inputState.selectedCharacter; + motionArgs.selectedCharacter = operatorArgs.selectedCharacter = + inputState.selectedCharacter; } motionArgs.repeat = repeat; clearInputState(cm); if (motion) { - var motionResult = motions[motion](cm, origHead, motionArgs, vim, inputState); - vim.lastMotion = motions[motion]; - if (!motionResult) { - return; - } - if (motionArgs.toJumplist) { - if (!operator && cm.ace.curOp != null) - cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace_patch - var jumpList = vimGlobalState.jumpList; - var cachedCursor = jumpList.cachedCursor; - if (cachedCursor) { - recordJumpPosition(cm, cachedCursor, motionResult); - delete jumpList.cachedCursor; - } else { - recordJumpPosition(cm, origHead, motionResult); - } - } - if (motionResult instanceof Array) { - newAnchor = motionResult[0]; - newHead = motionResult[1]; - } else { - newHead = motionResult; - } - if (!newHead) { - newHead = copyCursor(origHead); - } - if (vim.visualMode) { - if (!(vim.visualBlock && newHead.ch === Infinity)) { - newHead = clipCursorToContent(cm, newHead); - } - if (newAnchor) { - newAnchor = clipCursorToContent(cm, newAnchor); - } - newAnchor = newAnchor || oldAnchor; - sel.anchor = newAnchor; - sel.head = newHead; - updateCmSelection(cm); - updateMark(cm, vim, '<', - cursorIsBefore(newAnchor, newHead) ? newAnchor + var motionResult = motions[motion](cm, origHead, motionArgs, vim, inputState); + vim.lastMotion = motions[motion]; + if (!motionResult) { + return; + } + if (motionArgs.toJumplist) { + if (!operator && cm.ace.curOp != null) + cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace_patch + var jumpList = vimGlobalState.jumpList; + var cachedCursor = jumpList.cachedCursor; + if (cachedCursor) { + recordJumpPosition(cm, cachedCursor, motionResult); + delete jumpList.cachedCursor; + } + else { + recordJumpPosition(cm, origHead, motionResult); + } + } + if (motionResult instanceof Array) { + newAnchor = motionResult[0]; + newHead = motionResult[1]; + } + else { + newHead = motionResult; + } + if (!newHead) { + newHead = copyCursor(origHead); + } + if (vim.visualMode) { + if (!(vim.visualBlock && newHead.ch === Infinity)) { + newHead = clipCursorToContent(cm, newHead, oldHead); + } + if (newAnchor) { + newAnchor = clipCursorToContent(cm, newAnchor); + } + newAnchor = newAnchor || oldAnchor; + sel.anchor = newAnchor; + sel.head = newHead; + updateCmSelection(cm); + updateMark(cm, vim, '<', cursorIsBefore(newAnchor, newHead) ? newAnchor : newHead); - updateMark(cm, vim, '>', - cursorIsBefore(newAnchor, newHead) ? newHead + updateMark(cm, vim, '>', cursorIsBefore(newAnchor, newHead) ? newHead : newAnchor); - } else if (!operator) { - newHead = clipCursorToContent(cm, newHead); - cm.setCursor(newHead.line, newHead.ch); - } + } + else if (!operator) { + if (cm.ace.curOp) + cm.ace.curOp.vimDialogScroll = "center-animate"; // ace_patch + newHead = clipCursorToContent(cm, newHead, oldHead); + cm.setCursor(newHead.line, newHead.ch); + } } if (operator) { - if (operatorArgs.lastSel) { - newAnchor = oldAnchor; - var lastSel = operatorArgs.lastSel; - var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line); - var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch); - if (lastSel.visualLine) { - newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch); - } else if (lastSel.visualBlock) { - newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset); - } else if (lastSel.head.line == lastSel.anchor.line) { - newHead = new Pos(oldAnchor.line, oldAnchor.ch + chOffset); - } else { - newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + if (operatorArgs.lastSel) { + newAnchor = oldAnchor; + var lastSel = operatorArgs.lastSel; + var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line); + var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch); + if (lastSel.visualLine) { + newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + } + else if (lastSel.visualBlock) { + newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset); + } + else if (lastSel.head.line == lastSel.anchor.line) { + newHead = new Pos(oldAnchor.line, oldAnchor.ch + chOffset); + } + else { + newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + } + vim.visualMode = true; + vim.visualLine = lastSel.visualLine; + vim.visualBlock = lastSel.visualBlock; + sel = vim.sel = { + anchor: newAnchor, + head: newHead + }; + updateCmSelection(cm); } - vim.visualMode = true; - vim.visualLine = lastSel.visualLine; - vim.visualBlock = lastSel.visualBlock; - sel = vim.sel = { - anchor: newAnchor, - head: newHead - }; - updateCmSelection(cm); - } else if (vim.visualMode) { - operatorArgs.lastSel = { - anchor: copyCursor(sel.anchor), - head: copyCursor(sel.head), - visualBlock: vim.visualBlock, - visualLine: vim.visualLine - }; - } - var curStart, curEnd, linewise, mode; - var cmSel; - if (vim.visualMode) { - curStart = cursorMin(sel.head, sel.anchor); - curEnd = cursorMax(sel.head, sel.anchor); - linewise = vim.visualLine || operatorArgs.linewise; - mode = vim.visualBlock ? 'block' : - linewise ? 'line' : - 'char'; - cmSel = makeCmSelection(cm, { - anchor: curStart, - head: curEnd - }, mode); - if (linewise) { - var ranges = cmSel.ranges; - if (mode == 'block') { - for (var i = 0; i < ranges.length; i++) { - ranges[i].head.ch = lineLength(cm, ranges[i].head.line); - } - } else if (mode == 'line') { - ranges[0].head = new Pos(ranges[0].head.line + 1, 0); - } - } - } else { - curStart = copyCursor(newAnchor || oldAnchor); - curEnd = copyCursor(newHead || oldHead); - if (cursorIsBefore(curEnd, curStart)) { - var tmp = curStart; - curStart = curEnd; - curEnd = tmp; + else if (vim.visualMode) { + operatorArgs.lastSel = { + anchor: copyCursor(sel.anchor), + head: copyCursor(sel.head), + visualBlock: vim.visualBlock, + visualLine: vim.visualLine + }; } - linewise = motionArgs.linewise || operatorArgs.linewise; - if (linewise) { - expandSelectionToLine(cm, curStart, curEnd); - } else if (motionArgs.forward) { - clipToLine(cm, curStart, curEnd); - } - mode = 'char'; - var exclusive = !motionArgs.inclusive || linewise; - cmSel = makeCmSelection(cm, { - anchor: curStart, - head: curEnd - }, mode, exclusive); - } - cm.setSelections(cmSel.ranges, cmSel.primary); - vim.lastMotion = null; - operatorArgs.repeat = repeat; // For indent in visual mode. - operatorArgs.registerName = registerName; - operatorArgs.linewise = linewise; - var operatorMoveTo = operators[operator]( - cm, operatorArgs, cmSel.ranges, oldAnchor, newHead); - if (vim.visualMode) { - exitVisualMode(cm, operatorMoveTo != null); - } - if (operatorMoveTo) { - cm.setCursor(operatorMoveTo); - } - } - }, - recordLastEdit: function(vim, inputState, actionCommand) { + var curStart, curEnd, linewise, mode; + var cmSel; + if (vim.visualMode) { + curStart = cursorMin(sel.head, sel.anchor); + curEnd = cursorMax(sel.head, sel.anchor); + linewise = vim.visualLine || operatorArgs.linewise; + mode = vim.visualBlock ? 'block' : + linewise ? 'line' : + 'char'; + var newPositions = updateSelectionForSurrogateCharacters(cm, curStart, curEnd); + cmSel = makeCmSelection(cm, { + anchor: newPositions.start, + head: newPositions.end + }, mode); + if (linewise) { + var ranges = cmSel.ranges; + if (mode == 'block') { + for (var i = 0; i < ranges.length; i++) { + ranges[i].head.ch = lineLength(cm, ranges[i].head.line); + } + } + else if (mode == 'line') { + ranges[0].head = new Pos(ranges[0].head.line + 1, 0); + } + } + } + else { + curStart = copyCursor(newAnchor || oldAnchor); + curEnd = copyCursor(newHead || oldHead); + if (cursorIsBefore(curEnd, curStart)) { + var tmp = curStart; + curStart = curEnd; + curEnd = tmp; + } + linewise = motionArgs.linewise || operatorArgs.linewise; + if (linewise) { + expandSelectionToLine(cm, curStart, curEnd); + } + else if (motionArgs.forward) { + clipToLine(cm, curStart, curEnd); + } + mode = 'char'; + var exclusive = !motionArgs.inclusive || linewise; + var newPositions = updateSelectionForSurrogateCharacters(cm, curStart, curEnd); + cmSel = makeCmSelection(cm, { + anchor: newPositions.start, + head: newPositions.end + }, mode, exclusive); + } + cm.setSelections(cmSel.ranges, cmSel.primary); + vim.lastMotion = null; + operatorArgs.repeat = repeat; // For indent in visual mode. + operatorArgs.registerName = registerName; + operatorArgs.linewise = linewise; + var operatorMoveTo = operators[operator](cm, operatorArgs, cmSel.ranges, oldAnchor, newHead); + if (vim.visualMode) { + exitVisualMode(cm, operatorMoveTo != null); + } + if (operatorMoveTo) { + cm.setCursor(operatorMoveTo); + } + } + }, + recordLastEdit: function (vim, inputState, actionCommand) { var macroModeState = vimGlobalState.macroModeState; - if (macroModeState.isPlaying) { return; } + if (macroModeState.isPlaying) { + return; + } vim.lastEditInputState = inputState; vim.lastEditActionCommand = actionCommand; macroModeState.lastInsertModeChanges.changes = []; macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false; macroModeState.lastInsertModeChanges.visualBlock = vim.visualBlock ? vim.sel.head.line - vim.sel.anchor.line : 0; - } - }; - var motions = { - moveToTopLine: function(cm, _head, motionArgs) { - var line = getUserVisibleLines(cm).top + motionArgs.repeat -1; + } +}; +var motions = { + moveToTopLine: function (cm, _head, motionArgs) { + var line = getUserVisibleLines(cm).top + motionArgs.repeat - 1; return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); - }, - moveToMiddleLine: function(cm) { + }, + moveToMiddleLine: function (cm) { var range = getUserVisibleLines(cm); var line = Math.floor((range.top + range.bottom) * 0.5); return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); - }, - moveToBottomLine: function(cm, _head, motionArgs) { - var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1; + }, + moveToBottomLine: function (cm, _head, motionArgs) { + var line = getUserVisibleLines(cm).bottom - motionArgs.repeat + 1; return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); - }, - expandToLine: function(_cm, head, motionArgs) { + }, + expandToLine: function (_cm, head, motionArgs) { var cur = head; return new Pos(cur.line + motionArgs.repeat - 1, Infinity); - }, - findNext: function(cm, _head, motionArgs) { + }, + findNext: function (cm, _head, motionArgs) { var state = getSearchState(cm); var query = state.getQuery(); if (!query) { - return; + return; } var prev = !motionArgs.forward; prev = (state.isReversed()) ? !prev : prev; highlightSearchMatches(cm, query); - return findNext(cm, prev/** prev */, query, motionArgs.repeat); - }, - findAndSelectNextInclusive: function(cm, _head, motionArgs, vim, prevInputState) { + return findNext(cm, prev /** prev */, query, motionArgs.repeat); + }, + findAndSelectNextInclusive: function (cm, _head, motionArgs, vim, prevInputState) { var state = getSearchState(cm); var query = state.getQuery(); - if (!query) { - return; + return; } - var prev = !motionArgs.forward; prev = (state.isReversed()) ? !prev : prev; var next = findNextFromAndToInclusive(cm, prev, query, motionArgs.repeat, vim); if (!next) { - return; + return; } if (prevInputState.operator) { - return next; + return next; } - var from = next[0]; var to = new Pos(next[1].line, next[1].ch - 1); - if (vim.visualMode) { - if (vim.visualLine || vim.visualBlock) { + if (vim.visualLine || vim.visualBlock) { + vim.visualLine = false; + vim.visualBlock = false; + CodeMirror.signal(cm, "vim-mode-change", { mode: "visual", subMode: "" }); + } + var anchor = vim.sel.anchor; + if (anchor) { + if (state.isReversed()) { + if (motionArgs.forward) { + return [anchor, from]; + } + return [anchor, to]; + } + else { + if (motionArgs.forward) { + return [anchor, to]; + } + return [anchor, from]; + } + } + } + else { + vim.visualMode = true; vim.visualLine = false; vim.visualBlock = false; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: ""}); - } - var anchor = vim.sel.anchor; - if (anchor) { - if (state.isReversed()) { - if (motionArgs.forward) { - return [anchor, from]; - } - - return [anchor, to]; - } else { - if (motionArgs.forward) { - return [anchor, to]; - } - - return [anchor, from]; - } - } - } else { - vim.visualMode = true; - vim.visualLine = false; - vim.visualBlock = false; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: ""}); + CodeMirror.signal(cm, "vim-mode-change", { mode: "visual", subMode: "" }); } - return prev ? [to, from] : [from, to]; - }, - goToMark: function(cm, _head, motionArgs, vim) { + }, + goToMark: function (cm, _head, motionArgs, vim) { var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter); if (pos) { - return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos; + return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos; } return null; - }, - moveToOtherHighlightedEnd: function(cm, _head, motionArgs, vim) { + }, + moveToOtherHighlightedEnd: function (cm, _head, motionArgs, vim) { if (vim.visualBlock && motionArgs.sameLine) { - var sel = vim.sel; - return [ - clipCursorToContent(cm, new Pos(sel.anchor.line, sel.head.ch)), - clipCursorToContent(cm, new Pos(sel.head.line, sel.anchor.ch)) - ]; - } else { - return ([vim.sel.head, vim.sel.anchor]); - } - }, - jumpToMark: function(cm, head, motionArgs, vim) { + var sel = vim.sel; + return [ + clipCursorToContent(cm, new Pos(sel.anchor.line, sel.head.ch)), + clipCursorToContent(cm, new Pos(sel.head.line, sel.anchor.ch)) + ]; + } + else { + return ([vim.sel.head, vim.sel.anchor]); + } + }, + jumpToMark: function (cm, head, motionArgs, vim) { var best = head; for (var i = 0; i < motionArgs.repeat; i++) { - var cursor = best; - for (var key in vim.marks) { - if (!isLowerCase(key)) { - continue; - } - var mark = vim.marks[key].find(); - var isWrongDirection = (motionArgs.forward) ? - cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark); - - if (isWrongDirection) { - continue; - } - if (motionArgs.linewise && (mark.line == cursor.line)) { - continue; - } - - var equal = cursorEqual(cursor, best); - var between = (motionArgs.forward) ? - cursorIsBetween(cursor, mark, best) : - cursorIsBetween(best, mark, cursor); - - if (equal || between) { - best = mark; + var cursor = best; + for (var key in vim.marks) { + if (!isLowerCase(key)) { + continue; + } + var mark = vim.marks[key].find(); + var isWrongDirection = (motionArgs.forward) ? + cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark); + if (isWrongDirection) { + continue; + } + if (motionArgs.linewise && (mark.line == cursor.line)) { + continue; + } + var equal = cursorEqual(cursor, best); + var between = (motionArgs.forward) ? + cursorIsBetween(cursor, mark, best) : + cursorIsBetween(best, mark, cursor); + if (equal || between) { + best = mark; + } } - } } - if (motionArgs.linewise) { - best = new Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line))); + best = new Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line))); } return best; - }, - moveByCharacters: function(_cm, head, motionArgs) { + }, + moveByCharacters: function (_cm, head, motionArgs) { var cur = head; var repeat = motionArgs.repeat; var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat; return new Pos(cur.line, ch); - }, - moveByLines: function(cm, head, motionArgs, vim) { + }, + moveByLines: function (cm, head, motionArgs, vim) { var cur = head; var endCh = cur.ch; switch (vim.lastMotion) { - case this.moveByLines: - case this.moveByDisplayLines: - case this.moveByScroll: - case this.moveToColumn: - case this.moveToEol: - endCh = vim.lastHPos; - break; - default: - vim.lastHPos = endCh; - } - var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0); + case this.moveByLines: + case this.moveByDisplayLines: + case this.moveByScroll: + case this.moveToColumn: + case this.moveToEol: + endCh = vim.lastHPos; + break; + default: + vim.lastHPos = endCh; + } + var repeat = motionArgs.repeat + (motionArgs.repeatOffset || 0); var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat; var first = cm.firstLine(); var last = cm.lastLine(); - if (line < first && cur.line == first){ - return this.moveToStartOfLine(cm, head, motionArgs, vim); - } else if (line > last && cur.line == last){ + if (line < first && cur.line == first) { + return this.moveToStartOfLine(cm, head, motionArgs, vim); + } + else if (line > last && cur.line == last) { return moveToEol(cm, head, motionArgs, vim, true); } var fold = cm.ace.session.getFoldLine(line); if (fold) { - if (motionArgs.forward) { - if (line > fold.start.row) - line = fold.end.row + 1; - } else { - line = fold.start.row; - } - } - if (motionArgs.toFirstChar){ - endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line)); - vim.lastHPos = endCh; - } - vim.lastHSPos = cm.charCoords(new Pos(line, endCh),'div').left; + if (motionArgs.forward) { + if (line > fold.start.row) + line = fold.end.row + 1; + } + else { + line = fold.start.row; + } + } + if (motionArgs.toFirstChar) { + endCh = findFirstNonWhiteSpaceCharacter(cm.getLine(line)); + vim.lastHPos = endCh; + } + vim.lastHSPos = cm.charCoords(new Pos(line, endCh), 'div').left; return new Pos(line, endCh); - }, - moveByDisplayLines: function(cm, head, motionArgs, vim) { + }, + moveByDisplayLines: function (cm, head, motionArgs, vim) { var cur = head; switch (vim.lastMotion) { - case this.moveByDisplayLines: - case this.moveByScroll: - case this.moveByLines: - case this.moveToColumn: - case this.moveToEol: - break; - default: - vim.lastHSPos = cm.charCoords(cur,'div').left; + case this.moveByDisplayLines: + case this.moveByScroll: + case this.moveByLines: + case this.moveToColumn: + case this.moveToEol: + break; + default: + vim.lastHSPos = cm.charCoords(cur, 'div').left; } var repeat = motionArgs.repeat; - var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),'line',vim.lastHSPos); + var res = cm.findPosV(cur, (motionArgs.forward ? repeat : -repeat), 'line', vim.lastHSPos); if (res.hitSide) { - if (motionArgs.forward) { - var lastCharCoords = cm.charCoords(res, 'div'); - var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos }; - var res = cm.coordsChar(goalCoords, 'div'); - } else { - var resCoords = cm.charCoords(new Pos(cm.firstLine(), 0), 'div'); - resCoords.left = vim.lastHSPos; - res = cm.coordsChar(resCoords, 'div'); - } + if (motionArgs.forward) { + var lastCharCoords = cm.charCoords(res, 'div'); + var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos }; + var res = cm.coordsChar(goalCoords, 'div'); + } + else { + var resCoords = cm.charCoords(new Pos(cm.firstLine(), 0), 'div'); + resCoords.left = vim.lastHSPos; + res = cm.coordsChar(resCoords, 'div'); + } } vim.lastHPos = res.ch; return res; - }, - moveByPage: function(cm, head, motionArgs) { + }, + moveByPage: function (cm, head, motionArgs) { var curStart = head; var repeat = motionArgs.repeat; return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page'); - }, - moveByParagraph: function(cm, head, motionArgs) { + }, + moveByParagraph: function (cm, head, motionArgs) { var dir = motionArgs.forward ? 1 : -1; return findParagraph(cm, head, motionArgs.repeat, dir); - }, - moveBySentence: function(cm, head, motionArgs) { + }, + moveBySentence: function (cm, head, motionArgs) { var dir = motionArgs.forward ? 1 : -1; return findSentence(cm, head, motionArgs.repeat, dir); - }, - moveByScroll: function(cm, head, motionArgs, vim) { + }, + moveByScroll: function (cm, head, motionArgs, vim) { var scrollbox = cm.getScrollInfo(); var curEnd = null; var repeat = motionArgs.repeat; if (!repeat) { - repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight()); + repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight()); } var orig = cm.charCoords(head, 'local'); motionArgs.repeat = repeat; - var curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim); + curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim); if (!curEnd) { - return null; + return null; } var dest = cm.charCoords(curEnd, 'local'); cm.scrollTo(null, scrollbox.top + dest.top - orig.top); return curEnd; - }, - moveByWords: function(cm, head, motionArgs) { - return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward, - !!motionArgs.wordEnd, !!motionArgs.bigWord); - }, - moveTillCharacter: function(cm, _head, motionArgs) { + }, + moveByWords: function (cm, head, motionArgs) { + return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward, !!motionArgs.wordEnd, !!motionArgs.bigWord); + }, + moveTillCharacter: function (cm, head, motionArgs) { var repeat = motionArgs.repeat; - var curEnd = moveToCharacter(cm, repeat, motionArgs.forward, - motionArgs.selectedCharacter); + var curEnd = moveToCharacter(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter, head); var increment = motionArgs.forward ? -1 : 1; recordLastCharacterSearch(increment, motionArgs); - if (!curEnd) return null; + if (!curEnd) + return null; curEnd.ch += increment; return curEnd; - }, - moveToCharacter: function(cm, head, motionArgs) { + }, + moveToCharacter: function (cm, head, motionArgs) { var repeat = motionArgs.repeat; recordLastCharacterSearch(0, motionArgs); - return moveToCharacter(cm, repeat, motionArgs.forward, - motionArgs.selectedCharacter) || head; - }, - moveToSymbol: function(cm, head, motionArgs) { + return moveToCharacter(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter, head) || head; + }, + moveToSymbol: function (cm, head, motionArgs) { var repeat = motionArgs.repeat; - return findSymbol(cm, repeat, motionArgs.forward, - motionArgs.selectedCharacter) || head; - }, - moveToColumn: function(cm, head, motionArgs, vim) { + return findSymbol(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter) || head; + }, + moveToColumn: function (cm, head, motionArgs, vim) { var repeat = motionArgs.repeat; vim.lastHPos = repeat - 1; - vim.lastHSPos = cm.charCoords(head,'div').left; + vim.lastHSPos = cm.charCoords(head, 'div').left; return moveToColumn(cm, repeat); - }, - moveToEol: function(cm, head, motionArgs, vim) { + }, + moveToEol: function (cm, head, motionArgs, vim) { return moveToEol(cm, head, motionArgs, vim, false); - }, - moveToFirstNonWhiteSpaceCharacter: function(cm, head) { + }, + moveToFirstNonWhiteSpaceCharacter: function (cm, head) { var cursor = head; - return new Pos(cursor.line, - findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line))); - }, - moveToMatchedSymbol: function(cm, head) { + return new Pos(cursor.line, findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line))); + }, + moveToMatchedSymbol: function (cm, head) { var cursor = head; var line = cursor.line; var ch = cursor.ch; var lineText = cm.getLine(line); var symbol; for (; ch < lineText.length; ch++) { - symbol = lineText.charAt(ch); - if (symbol && isMatchableSymbol(symbol)) { - var style = cm.getTokenTypeAt(new Pos(line, ch + 1)); - if (style !== "string" && style !== "comment") { - break; + symbol = lineText.charAt(ch); + if (symbol && isMatchableSymbol(symbol)) { + var style = cm.getTokenTypeAt(new Pos(line, ch + 1)); + if (style !== "string" && style !== "comment") { + break; + } } - } } if (ch < lineText.length) { - var re = /[<>]/.test(lineText[ch]) ? /[(){}[\]<>]/ : /[(){}[\]]/; //ace_patch? - var matched = cm.findMatchingBracket(new Pos(line, ch+1), {bracketRegex: re}); - return matched.to; - } else { - return cursor; - } - }, - moveToStartOfLine: function(_cm, head) { + var re = /[<>]/.test(lineText[ch]) ? /[(){}[\]<>]/ : /[(){}[\]]/; //ace_patch? + var matched = cm.findMatchingBracket(new Pos(line, ch + 1), { bracketRegex: re }); + return matched.to; + } + else { + return cursor; + } + }, + moveToStartOfLine: function (_cm, head) { return new Pos(head.line, 0); - }, - moveToLineOrEdgeOfDocument: function(cm, _head, motionArgs) { + }, + moveToLineOrEdgeOfDocument: function (cm, _head, motionArgs) { var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine(); if (motionArgs.repeatIsExplicit) { - lineNum = motionArgs.repeat - cm.getOption('firstLineNumber'); + lineNum = motionArgs.repeat - cm.getOption('firstLineNumber'); } - return new Pos(lineNum, - findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum))); - }, - moveToStartOfDisplayLine: function(cm) { + return new Pos(lineNum, findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum))); + }, + moveToStartOfDisplayLine: function (cm) { cm.execCommand("goLineLeft"); return cm.getCursor(); - }, - moveToEndOfDisplayLine: function(cm) { + }, + moveToEndOfDisplayLine: function (cm) { cm.execCommand("goLineRight"); var head = cm.getCursor(); - if (head.sticky == "before") head.ch--; + if (head.sticky == "before") + head.ch--; return head; - }, - textObjectManipulation: function(cm, head, motionArgs, vim) { - var mirroredPairs = {'(': ')', ')': '(', - '{': '}', '}': '{', - '[': ']', ']': '[', - '<': '>', '>': '<'}; - var selfPaired = {'\'': true, '"': true, '`': true}; - + }, + textObjectManipulation: function (cm, head, motionArgs, vim) { + var mirroredPairs = { '(': ')', ')': '(', + '{': '}', '}': '{', + '[': ']', ']': '[', + '<': '>', '>': '<' }; + var selfPaired = { '\'': true, '"': true, '`': true }; var character = motionArgs.selectedCharacter; if (character == 'b') { - character = '('; - } else if (character == 'B') { - character = '{'; + character = '('; + } + else if (character == 'B') { + character = '{'; } var inclusive = !motionArgs.textObjectInner; - - var tmp; + var tmp, move; if (mirroredPairs[character]) { - tmp = selectCompanionObject(cm, head, character, inclusive); - } else if (selfPaired[character]) { - tmp = findBeginningAndEnd(cm, head, character, inclusive); - } else if (character === 'W') { - tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, - true /** bigWord */); - } else if (character === 'w') { - tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, - false /** bigWord */); - } else if (character === 'p') { - tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive); - motionArgs.linewise = true; - if (vim.visualMode) { - if (!vim.visualLine) { vim.visualLine = true; } - } else { - var operatorArgs = vim.inputState.operatorArgs; - if (operatorArgs) { operatorArgs.linewise = true; } - tmp.end.line--; - } - } else if (character === 't') { - tmp = expandTagUnderCursor(cm, head, inclusive); - } else { - return null; + move = true; + tmp = selectCompanionObject(cm, head, character, inclusive); + if (!tmp) { + var sc = cm.getSearchCursor(new RegExp("\\" + character, "g"), head); + if (sc.find()) { + tmp = selectCompanionObject(cm, sc.from(), character, inclusive); + } + } + } + else if (selfPaired[character]) { + move = true; + tmp = findBeginningAndEnd(cm, head, character, inclusive); + } + else if (character === 'W' || character === 'w') { + var repeat = motionArgs.repeat || 1; + while (repeat-- > 0) { + var repeated = expandWordUnderCursor(cm, { + inclusive: inclusive, + innerWord: !inclusive, + bigWord: character === 'W', + noSymbol: character === 'W', + multiline: true + }, tmp && tmp.end); + if (repeated) { + if (!tmp) + tmp = repeated; + tmp.end = repeated.end; + } + } + } + else if (character === 'p') { + tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive); + motionArgs.linewise = true; + if (vim.visualMode) { + if (!vim.visualLine) { + vim.visualLine = true; + } + } + else { + var operatorArgs = vim.inputState.operatorArgs; + if (operatorArgs) { + operatorArgs.linewise = true; + } + tmp.end.line--; + } + } + else if (character === 't') { + tmp = expandTagUnderCursor(cm, head, inclusive); + } + else if (character === 's') { + var content = cm.getLine(head.line); + if (head.ch > 0 && isEndOfSentenceSymbol(content[head.ch])) { + head.ch -= 1; + } + var end = getSentence(cm, head, motionArgs.repeat, 1, inclusive); + var start = getSentence(cm, head, motionArgs.repeat, -1, inclusive); + if (isWhiteSpaceString(cm.getLine(start.line)[start.ch]) + && isWhiteSpaceString(cm.getLine(end.line)[end.ch - 1])) { + start = { line: start.line, ch: start.ch + 1 }; + } + tmp = { start: start, end: end }; + } + if (!tmp) { + return null; } - if (!cm.state.vim.visualMode) { - return [tmp.start, tmp.end]; - } else { - return expandSelection(cm, tmp.start, tmp.end); + return [tmp.start, tmp.end]; } - }, - - repeatLastCharacterSearch: function(cm, head, motionArgs) { + else { + return expandSelection(cm, tmp.start, tmp.end, move); + } + }, + repeatLastCharacterSearch: function (cm, head, motionArgs) { var lastSearch = vimGlobalState.lastCharacterSearch; var repeat = motionArgs.repeat; var forward = motionArgs.forward === lastSearch.forward; @@ -2849,197 +3149,240 @@ dom.importCssString(".normal-mode .ace_cursor{\ motionArgs.inclusive = forward ? true : false; var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter); if (!curEnd) { - cm.moveH(increment, 'char'); - return head; + cm.moveH(increment, 'char'); + return head; } curEnd.ch += increment; return curEnd; - } - }; - - function defineMotion(name, fn) { - motions[name] = fn; } - - function fillArray(val, times) { - var arr = []; - for (var i = 0; i < times; i++) { +}; +function defineMotion(name, fn) { + motions[name] = fn; +} +function fillArray(val, times) { + var arr = []; + for (var i = 0; i < times; i++) { arr.push(val); - } - return arr; } - var operators = { - change: function(cm, args, ranges) { + return arr; +} +var operators = { + change: function (cm, args, ranges) { var finalHead, text; var vim = cm.state.vim; - var anchor = ranges[0].anchor, - head = ranges[0].head; + var anchor = ranges[0].anchor, head = ranges[0].head; if (!vim.visualMode) { - text = cm.getRange(anchor, head); - var lastState = vim.lastEditInputState || {}; - if (lastState.motion == "moveByWords" && !isWhiteSpaceString(text)) { - var match = (/\s+$/).exec(text); - if (match && lastState.motionArgs && lastState.motionArgs.forward) { - head = offsetCursor(head, 0, - match[0].length); - text = text.slice(0, - match[0].length); - } - } - var prevLineEnd = new Pos(anchor.line - 1, Number.MAX_VALUE); - var wasLastLine = cm.firstLine() == cm.lastLine(); - if (head.line > cm.lastLine() && args.linewise && !wasLastLine) { - cm.replaceRange('', prevLineEnd, head); - } else { + text = cm.getRange(anchor, head); + var lastState = vim.lastEditInputState || {}; + if (lastState.motion == "moveByWords" && !isWhiteSpaceString(text)) { + var match = (/\s+$/).exec(text); + if (match && lastState.motionArgs && lastState.motionArgs.forward) { + head = offsetCursor(head, 0, -match[0].length); + text = text.slice(0, -match[0].length); + } + } + if (args.linewise) { + anchor = new Pos(anchor.line, findFirstNonWhiteSpaceCharacter(cm.getLine(anchor.line))); + if (head.line > anchor.line) { + head = new Pos(head.line - 1, Number.MAX_VALUE); + } + } cm.replaceRange('', anchor, head); - } - if (args.linewise) { - if (!wasLastLine) { - cm.setCursor(prevLineEnd); - CodeMirror.commands.newlineAndIndent(cm); - } - anchor.ch = Number.MAX_VALUE; - } - finalHead = anchor; - } else if (args.fullLine) { + finalHead = anchor; + } + else if (args.fullLine) { head.ch = Number.MAX_VALUE; head.line--; - cm.setSelection(anchor, head) + cm.setSelection(anchor, head); text = cm.getSelection(); cm.replaceSelection(""); finalHead = anchor; - } else { - text = cm.getSelection(); - var replacement = fillArray('', ranges.length); - cm.replaceSelections(replacement); - finalHead = cursorMin(ranges[0].head, ranges[0].anchor); - } - vimGlobalState.registerController.pushText( - args.registerName, 'change', text, - args.linewise, ranges.length > 1); - actions.enterInsertMode(cm, {head: finalHead}, cm.state.vim); - }, - 'delete': function(cm, args, ranges) { + } + else { + text = cm.getSelection(); + var replacement = fillArray('', ranges.length); + cm.replaceSelections(replacement); + finalHead = cursorMin(ranges[0].head, ranges[0].anchor); + } + vimGlobalState.registerController.pushText(args.registerName, 'change', text, args.linewise, ranges.length > 1); + actions.enterInsertMode(cm, { head: finalHead }, cm.state.vim); + }, + 'delete': function (cm, args, ranges) { var finalHead, text; var vim = cm.state.vim; if (!vim.visualBlock) { - var anchor = ranges[0].anchor, - head = ranges[0].head; - if (args.linewise && - head.line != cm.firstLine() && - anchor.line == cm.lastLine() && - anchor.line == head.line - 1) { - if (anchor.line == cm.firstLine()) { - anchor.ch = 0; - } else { - anchor = new Pos(anchor.line - 1, lineLength(cm, anchor.line - 1)); - } - } - text = cm.getRange(anchor, head); - cm.replaceRange('', anchor, head); - finalHead = anchor; - if (args.linewise) { - finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor); - } - } else { - text = cm.getSelection(); - var replacement = fillArray('', ranges.length); - cm.replaceSelections(replacement); - finalHead = cursorMin(ranges[0].head, ranges[0].anchor); - } - vimGlobalState.registerController.pushText( - args.registerName, 'delete', text, - args.linewise, vim.visualBlock); + var anchor = ranges[0].anchor, head = ranges[0].head; + if (args.linewise && + head.line != cm.firstLine() && + anchor.line == cm.lastLine() && + anchor.line == head.line - 1) { + if (anchor.line == cm.firstLine()) { + anchor.ch = 0; + } + else { + anchor = new Pos(anchor.line - 1, lineLength(cm, anchor.line - 1)); + } + } + text = cm.getRange(anchor, head); + cm.replaceRange('', anchor, head); + finalHead = anchor; + if (args.linewise) { + finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor); + } + } + else { + text = cm.getSelection(); + var replacement = fillArray('', ranges.length); + cm.replaceSelections(replacement); + finalHead = cursorMin(ranges[0].head, ranges[0].anchor); + } + vimGlobalState.registerController.pushText(args.registerName, 'delete', text, args.linewise, vim.visualBlock); return clipCursorToContent(cm, finalHead); - }, - indent: function(cm, args, ranges) { + }, + indent: function (cm, args, ranges) { var vim = cm.state.vim; - var startLine = ranges[0].anchor.line; - var endLine = vim.visualBlock ? - ranges[ranges.length - 1].anchor.line : - ranges[0].head.line; var repeat = (vim.visualMode) ? args.repeat : 1; - if (args.linewise) { - endLine--; + if (vim.visualBlock) { + var tabSize = cm.getOption('tabSize'); + var indent = cm.getOption('indentWithTabs') ? '\t' : ' '.repeat(tabSize); + var cursor; + for (var i = ranges.length - 1; i >= 0; i--) { + cursor = cursorMin(ranges[i].anchor, ranges[i].head); + if (args.indentRight) { + cm.replaceRange(indent.repeat(repeat), cursor, cursor); + } + else { + var text = cm.getLine(cursor.line); + var end = 0; + for (var j = 0; j < repeat; j++) { + var ch = text[cursor.ch + end]; + if (ch == '\t') { + end++; + } + else if (ch == ' ') { + end++; + for (var k = 1; k < indent.length; k++) { + ch = text[cursor.ch + end]; + if (ch !== ' ') + break; + end++; + } + } + else { + break; + } + } + cm.replaceRange('', cursor, offsetCursor(cursor, 0, end)); + } + } + return cursor; + } + else if (cm.indentMore) { + for (var j = 0; j < repeat; j++) { + if (args.indentRight) + cm.indentMore(); + else + cm.indentLess(); + } } - for (var i = startLine; i <= endLine; i++) { - for (var j = 0; j < repeat; j++) { - cm.indentLine(i, args.indentRight); - } + else { + var startLine = ranges[0].anchor.line; + var endLine = vim.visualBlock ? + ranges[ranges.length - 1].anchor.line : + ranges[0].head.line; + if (args.linewise) { + endLine--; + } + for (var i = startLine; i <= endLine; i++) { + for (var j = 0; j < repeat; j++) { + cm.indentLine(i, args.indentRight); + } + } } return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor); - }, - indentAuto: function(cm, _args, ranges) { - if (ranges.length > 1) { // ace_patch - cm.setSelection(ranges[0].anchor, ranges[ranges.length - 1].head); - } + }, + indentAuto: function (cm, _args, ranges) { cm.execCommand("indentAuto"); return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor); - }, - changeCase: function(cm, args, ranges, oldAnchor, newHead) { + }, + hardWrap: function (cm, operatorArgs, ranges, oldAnchor, newHead) { + if (!cm.hardWrap) + return; + var from = ranges[0].anchor.line; + var to = ranges[0].head.line; + if (operatorArgs.linewise) + to--; + var endRow = cm.hardWrap({ from: from, to: to }); + if (endRow > from && operatorArgs.linewise) + endRow--; + return operatorArgs.keepCursor ? oldAnchor : new Pos(endRow, 0); + }, + changeCase: function (cm, args, ranges, oldAnchor, newHead) { var selections = cm.getSelections(); var swapped = []; var toLower = args.toLower; for (var j = 0; j < selections.length; j++) { - var toSwap = selections[j]; - var text = ''; - if (toLower === true) { - text = toSwap.toLowerCase(); - } else if (toLower === false) { - text = toSwap.toUpperCase(); - } else { - for (var i = 0; i < toSwap.length; i++) { - var character = toSwap.charAt(i); - text += isUpperCase(character) ? character.toLowerCase() : - character.toUpperCase(); - } - } - swapped.push(text); + var toSwap = selections[j]; + var text = ''; + if (toLower === true) { + text = toSwap.toLowerCase(); + } + else if (toLower === false) { + text = toSwap.toUpperCase(); + } + else { + for (var i = 0; i < toSwap.length; i++) { + var character = toSwap.charAt(i); + text += isUpperCase(character) ? character.toLowerCase() : + character.toUpperCase(); + } + } + swapped.push(text); } cm.replaceSelections(swapped); - if (args.shouldMoveCursor){ - return newHead; - } else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) { - return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor); - } else if (args.linewise){ - return oldAnchor; - } else { - return cursorMin(ranges[0].anchor, ranges[0].head); - } - }, - yank: function(cm, args, ranges, oldAnchor) { + if (args.shouldMoveCursor) { + return newHead; + } + else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) { + return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor); + } + else if (args.linewise) { + return oldAnchor; + } + else { + return cursorMin(ranges[0].anchor, ranges[0].head); + } + }, + yank: function (cm, args, ranges, oldAnchor) { var vim = cm.state.vim; var text = cm.getSelection(); var endPos = vim.visualMode - ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor) - : oldAnchor; - vimGlobalState.registerController.pushText( - args.registerName, 'yank', - text, args.linewise, vim.visualBlock); + ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor) + : oldAnchor; + vimGlobalState.registerController.pushText(args.registerName, 'yank', text, args.linewise, vim.visualBlock); return endPos; - } - }; - - function defineOperator(name, fn) { - operators[name] = fn; } - - var actions = { - jumpListWalk: function(cm, actionArgs, vim) { +}; +function defineOperator(name, fn) { + operators[name] = fn; +} +var actions = { + jumpListWalk: function (cm, actionArgs, vim) { if (vim.visualMode) { - return; + return; } var repeat = actionArgs.repeat; var forward = actionArgs.forward; var jumpList = vimGlobalState.jumpList; - var mark = jumpList.move(cm, forward ? repeat : -repeat); var markPos = mark ? mark.find() : undefined; markPos = markPos ? markPos : cm.getCursor(); cm.setCursor(markPos); cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace_patch - }, - scroll: function(cm, actionArgs, vim) { + }, + scroll: function (cm, actionArgs, vim) { if (vim.visualMode) { - return; + return; } var repeat = actionArgs.repeat || 1; var lineHeight = cm.defaultTextHeight(); @@ -3049,76 +3392,86 @@ dom.importCssString(".normal-mode .ace_cursor{\ var cursor = copyCursor(cm.getCursor()); var cursorCoords = cm.charCoords(cursor, 'local'); if (actionArgs.forward) { - if (newPos > cursorCoords.top) { - cursor.line += (newPos - cursorCoords.top) / lineHeight; - cursor.line = Math.ceil(cursor.line); - cm.setCursor(cursor); - cursorCoords = cm.charCoords(cursor, 'local'); - cm.scrollTo(null, cursorCoords.top); - } else { - cm.scrollTo(null, newPos); - } - } else { - var newBottom = newPos + cm.getScrollInfo().clientHeight; - if (newBottom < cursorCoords.bottom) { - cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight; - cursor.line = Math.floor(cursor.line); - cm.setCursor(cursor); - cursorCoords = cm.charCoords(cursor, 'local'); - cm.scrollTo( - null, cursorCoords.bottom - cm.getScrollInfo().clientHeight); - } else { - cm.scrollTo(null, newPos); - } - } - }, - scrollToCursor: function(cm, actionArgs) { + if (newPos > cursorCoords.top) { + cursor.line += (newPos - cursorCoords.top) / lineHeight; + cursor.line = Math.ceil(cursor.line); + cm.setCursor(cursor); + cursorCoords = cm.charCoords(cursor, 'local'); + cm.scrollTo(null, cursorCoords.top); + } + else { + cm.scrollTo(null, newPos); + } + } + else { + var newBottom = newPos + cm.getScrollInfo().clientHeight; + if (newBottom < cursorCoords.bottom) { + cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight; + cursor.line = Math.floor(cursor.line); + cm.setCursor(cursor); + cursorCoords = cm.charCoords(cursor, 'local'); + cm.scrollTo(null, cursorCoords.bottom - cm.getScrollInfo().clientHeight); + } + else { + cm.scrollTo(null, newPos); + } + } + }, + scrollToCursor: function (cm, actionArgs) { var lineNum = cm.getCursor().line; var charCoords = cm.charCoords(new Pos(lineNum, 0), 'local'); var height = cm.getScrollInfo().clientHeight; var y = charCoords.top; - var lineHeight = charCoords.bottom - y; switch (actionArgs.position) { - case 'center': y = y - (height / 2) + lineHeight; - break; - case 'bottom': y = y - height + lineHeight; - break; + case 'center': + y = charCoords.bottom - height / 2; + break; + case 'bottom': + var lineLastCharPos = new Pos(lineNum, cm.getLine(lineNum).length - 1); + var lineLastCharCoords = cm.charCoords(lineLastCharPos, 'local'); + var lineHeight = lineLastCharCoords.bottom - y; + y = y - height + lineHeight; + break; } cm.scrollTo(null, y); - }, - replayMacro: function(cm, actionArgs, vim) { + }, + replayMacro: function (cm, actionArgs, vim) { var registerName = actionArgs.selectedCharacter; var repeat = actionArgs.repeat; var macroModeState = vimGlobalState.macroModeState; if (registerName == '@') { - registerName = macroModeState.latestRegister; - } else { - macroModeState.latestRegister = registerName; + registerName = macroModeState.latestRegister; + } + else { + macroModeState.latestRegister = registerName; } - while(repeat--){ - executeMacroRegister(cm, vim, macroModeState, registerName); + while (repeat--) { + executeMacroRegister(cm, vim, macroModeState, registerName); } - }, - enterMacroRecordMode: function(cm, actionArgs) { + }, + enterMacroRecordMode: function (cm, actionArgs) { var macroModeState = vimGlobalState.macroModeState; var registerName = actionArgs.selectedCharacter; if (vimGlobalState.registerController.isValidRegister(registerName)) { - macroModeState.enterMacroRecordMode(cm, registerName); + macroModeState.enterMacroRecordMode(cm, registerName); + } + }, + toggleOverwrite: function (cm) { + if (!cm.state.overwrite) { + cm.toggleOverwrite(true); + cm.setOption('keyMap', 'vim-replace'); + CodeMirror.signal(cm, "vim-mode-change", { mode: "replace" }); + } + else { + cm.toggleOverwrite(false); + cm.setOption('keyMap', 'vim-insert'); + CodeMirror.signal(cm, "vim-mode-change", { mode: "insert" }); + } + }, + enterInsertMode: function (cm, actionArgs, vim) { + if (cm.getOption('readOnly')) { + return; } - }, - toggleOverwrite: function(cm) { - if (!cm.state.overwrite) { - cm.toggleOverwrite(true); - cm.setOption('keyMap', 'vim-replace'); - CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"}); - } else { - cm.toggleOverwrite(false); - cm.setOption('keyMap', 'vim-insert'); - CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"}); - } - }, - enterInsertMode: function(cm, actionArgs, vim) { - if (cm.getOption('readOnly')) { return; } vim.insertMode = true; vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1; var insertAt = (actionArgs) ? actionArgs.insertAt : null; @@ -3126,373 +3479,447 @@ dom.importCssString(".normal-mode .ace_cursor{\ var head = actionArgs.head || cm.getCursor('head'); var height = cm.listSelections().length; if (insertAt == 'eol') { - head = new Pos(head.line, lineLength(cm, head.line)); - } else if (insertAt == 'bol') { - head = new Pos(head.line, 0); - } else if (insertAt == 'charAfter') { - head = offsetCursor(head, 0, 1); - } else if (insertAt == 'firstNonBlank') { - head = motions.moveToFirstNonWhiteSpaceCharacter(cm, head); - } else if (insertAt == 'startOfSelectedArea') { - if (!vim.visualMode) - return; - if (!vim.visualBlock) { - if (sel.head.line < sel.anchor.line) { - head = sel.head; - } else { - head = new Pos(sel.anchor.line, 0); - } - } else { - head = new Pos( - Math.min(sel.head.line, sel.anchor.line), - Math.min(sel.head.ch, sel.anchor.ch)); - height = Math.abs(sel.head.line - sel.anchor.line) + 1; - } - } else if (insertAt == 'endOfSelectedArea') { + head = new Pos(head.line, lineLength(cm, head.line)); + } + else if (insertAt == 'bol') { + head = new Pos(head.line, 0); + } + else if (insertAt == 'charAfter') { + var newPosition = updateSelectionForSurrogateCharacters(cm, head, offsetCursor(head, 0, 1)); + head = newPosition.end; + } + else if (insertAt == 'firstNonBlank') { + var newPosition = updateSelectionForSurrogateCharacters(cm, head, motions.moveToFirstNonWhiteSpaceCharacter(cm, head)); + head = newPosition.end; + } + else if (insertAt == 'startOfSelectedArea') { if (!vim.visualMode) - return; - if (!vim.visualBlock) { - if (sel.head.line >= sel.anchor.line) { - head = offsetCursor(sel.head, 0, 1); - } else { - head = new Pos(sel.anchor.line, 0); - } - } else { - head = new Pos( - Math.min(sel.head.line, sel.anchor.line), - Math.max(sel.head.ch, sel.anchor.ch) + 1); - height = Math.abs(sel.head.line - sel.anchor.line) + 1; - } - } else if (insertAt == 'inplace') { - if (vim.visualMode){ - return; - } - } else if (insertAt == 'lastEdit') { - head = getLastEditPos(cm) || head; + return; + if (!vim.visualBlock) { + if (sel.head.line < sel.anchor.line) { + head = sel.head; + } + else { + head = new Pos(sel.anchor.line, 0); + } + } + else { + head = new Pos(Math.min(sel.head.line, sel.anchor.line), Math.min(sel.head.ch, sel.anchor.ch)); + height = Math.abs(sel.head.line - sel.anchor.line) + 1; + } + } + else if (insertAt == 'endOfSelectedArea') { + if (!vim.visualMode) + return; + if (!vim.visualBlock) { + if (sel.head.line >= sel.anchor.line) { + head = offsetCursor(sel.head, 0, 1); + } + else { + head = new Pos(sel.anchor.line, 0); + } + } + else { + head = new Pos(Math.min(sel.head.line, sel.anchor.line), Math.max(sel.head.ch, sel.anchor.ch) + 1); + height = Math.abs(sel.head.line - sel.anchor.line) + 1; + } + } + else if (insertAt == 'inplace') { + if (vim.visualMode) { + return; + } + } + else if (insertAt == 'lastEdit') { + head = getLastEditPos(cm) || head; } cm.setOption('disableInput', false); if (actionArgs && actionArgs.replace) { - cm.toggleOverwrite(true); - cm.setOption('keyMap', 'vim-replace'); - CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"}); - } else { - cm.toggleOverwrite(false); - cm.setOption('keyMap', 'vim-insert'); - CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"}); + cm.toggleOverwrite(true); + cm.setOption('keyMap', 'vim-replace'); + CodeMirror.signal(cm, "vim-mode-change", { mode: "replace" }); + } + else { + cm.toggleOverwrite(false); + cm.setOption('keyMap', 'vim-insert'); + CodeMirror.signal(cm, "vim-mode-change", { mode: "insert" }); } if (!vimGlobalState.macroModeState.isPlaying) { - cm.on('change', onChange); - CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); + cm.on('change', onChange); + if (vim.insertEnd) + vim.insertEnd.clear(); + vim.insertEnd = cm.setBookmark(head, { insertLeft: true }); + CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); } if (vim.visualMode) { - exitVisualMode(cm); + exitVisualMode(cm); } selectForInsert(cm, head, height); - }, - toggleVisualMode: function(cm, actionArgs, vim) { + }, + toggleVisualMode: function (cm, actionArgs, vim) { var repeat = actionArgs.repeat; var anchor = cm.getCursor(); var head; if (!vim.visualMode) { - vim.visualMode = true; - vim.visualLine = !!actionArgs.linewise; - vim.visualBlock = !!actionArgs.blockwise; - head = clipCursorToContent( - cm, new Pos(anchor.line, anchor.ch + repeat - 1)); - vim.sel = { - anchor: anchor, - head: head - }; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : ""}); - updateCmSelection(cm); - updateMark(cm, vim, '<', cursorMin(anchor, head)); - updateMark(cm, vim, '>', cursorMax(anchor, head)); - } else if (vim.visualLine ^ actionArgs.linewise || + vim.visualMode = true; + vim.visualLine = !!actionArgs.linewise; + vim.visualBlock = !!actionArgs.blockwise; + head = clipCursorToContent(cm, new Pos(anchor.line, anchor.ch + repeat - 1)); + var newPosition = updateSelectionForSurrogateCharacters(cm, anchor, head); + vim.sel = { + anchor: newPosition.start, + head: newPosition.end + }; + CodeMirror.signal(cm, "vim-mode-change", { mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : "" }); + updateCmSelection(cm); + updateMark(cm, vim, '<', cursorMin(anchor, head)); + updateMark(cm, vim, '>', cursorMax(anchor, head)); + } + else if (vim.visualLine ^ actionArgs.linewise || vim.visualBlock ^ actionArgs.blockwise) { - vim.visualLine = !!actionArgs.linewise; - vim.visualBlock = !!actionArgs.blockwise; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : ""}); - updateCmSelection(cm); - } else { - exitVisualMode(cm); - } - }, - reselectLastSelection: function(cm, _actionArgs, vim) { + vim.visualLine = !!actionArgs.linewise; + vim.visualBlock = !!actionArgs.blockwise; + CodeMirror.signal(cm, "vim-mode-change", { mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : "" }); + updateCmSelection(cm); + } + else { + exitVisualMode(cm); + } + }, + reselectLastSelection: function (cm, _actionArgs, vim) { var lastSelection = vim.lastSelection; if (vim.visualMode) { - updateLastSelection(cm, vim); + updateLastSelection(cm, vim); } if (lastSelection) { - var anchor = lastSelection.anchorMark.find(); - var head = lastSelection.headMark.find(); - if (!anchor || !head) { - return; - } - vim.sel = { - anchor: anchor, - head: head - }; - vim.visualMode = true; - vim.visualLine = lastSelection.visualLine; - vim.visualBlock = lastSelection.visualBlock; - updateCmSelection(cm); - updateMark(cm, vim, '<', cursorMin(anchor, head)); - updateMark(cm, vim, '>', cursorMax(anchor, head)); - CodeMirror.signal(cm, 'vim-mode-change', { - mode: 'visual', - subMode: vim.visualLine ? 'linewise' : - vim.visualBlock ? 'blockwise' : ''}); - } - }, - joinLines: function(cm, actionArgs, vim) { + var anchor = lastSelection.anchorMark.find(); + var head = lastSelection.headMark.find(); + if (!anchor || !head) { + return; + } + vim.sel = { + anchor: anchor, + head: head + }; + vim.visualMode = true; + vim.visualLine = lastSelection.visualLine; + vim.visualBlock = lastSelection.visualBlock; + updateCmSelection(cm); + updateMark(cm, vim, '<', cursorMin(anchor, head)); + updateMark(cm, vim, '>', cursorMax(anchor, head)); + CodeMirror.signal(cm, 'vim-mode-change', { + mode: 'visual', + subMode: vim.visualLine ? 'linewise' : + vim.visualBlock ? 'blockwise' : '' + }); + } + }, + joinLines: function (cm, actionArgs, vim) { var curStart, curEnd; if (vim.visualMode) { - curStart = cm.getCursor('anchor'); - curEnd = cm.getCursor('head'); - if (cursorIsBefore(curEnd, curStart)) { - var tmp = curEnd; - curEnd = curStart; - curStart = tmp; - } - curEnd.ch = lineLength(cm, curEnd.line) - 1; - } else { - var repeat = Math.max(actionArgs.repeat, 2); - curStart = cm.getCursor(); - curEnd = clipCursorToContent(cm, new Pos(curStart.line + repeat - 1, - Infinity)); + curStart = cm.getCursor('anchor'); + curEnd = cm.getCursor('head'); + if (cursorIsBefore(curEnd, curStart)) { + var tmp = curEnd; + curEnd = curStart; + curStart = tmp; + } + curEnd.ch = lineLength(cm, curEnd.line) - 1; + } + else { + var repeat = Math.max(actionArgs.repeat, 2); + curStart = cm.getCursor(); + curEnd = clipCursorToContent(cm, new Pos(curStart.line + repeat - 1, Infinity)); } var finalCh = 0; for (var i = curStart.line; i < curEnd.line; i++) { - finalCh = lineLength(cm, curStart.line); - var tmp = new Pos(curStart.line + 1, - lineLength(cm, curStart.line + 1)); - var text = cm.getRange(curStart, tmp); - text = actionArgs.keepSpaces - ? text.replace(/\n\r?/g, '') - : text.replace(/\n\s*/g, ' '); - cm.replaceRange(text, curStart, tmp); - } - var curFinalPos = new Pos(curStart.line, finalCh); + finalCh = lineLength(cm, curStart.line); + var text = ''; + var nextStartCh = 0; + if (!actionArgs.keepSpaces) { + var nextLine = cm.getLine(curStart.line + 1); + nextStartCh = nextLine.search(/\S/); + if (nextStartCh == -1) { + nextStartCh = nextLine.length; + } + else { + text = " "; + } + } + cm.replaceRange(text, new Pos(curStart.line, finalCh), new Pos(curStart.line + 1, nextStartCh)); + } + var curFinalPos = clipCursorToContent(cm, new Pos(curStart.line, finalCh)); if (vim.visualMode) { - exitVisualMode(cm, false); + exitVisualMode(cm, false); } cm.setCursor(curFinalPos); - }, - newLineAndEnterInsertMode: function(cm, actionArgs, vim) { + }, + newLineAndEnterInsertMode: function (cm, actionArgs, vim) { vim.insertMode = true; var insertAt = copyCursor(cm.getCursor()); if (insertAt.line === cm.firstLine() && !actionArgs.after) { - cm.replaceRange('\n', new Pos(cm.firstLine(), 0)); - cm.setCursor(cm.firstLine(), 0); - } else { - insertAt.line = (actionArgs.after) ? insertAt.line : - insertAt.line - 1; - insertAt.ch = lineLength(cm, insertAt.line); - cm.setCursor(insertAt); - var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment || - CodeMirror.commands.newlineAndIndent; - newlineFn(cm); + cm.replaceRange('\n', new Pos(cm.firstLine(), 0)); + cm.setCursor(cm.firstLine(), 0); + } + else { + insertAt.line = (actionArgs.after) ? insertAt.line : + insertAt.line - 1; + insertAt.ch = lineLength(cm, insertAt.line); + cm.setCursor(insertAt); + var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment || + CodeMirror.commands.newlineAndIndent; + newlineFn(cm); } this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim); - }, - paste: function(cm, actionArgs, vim) { + }, + paste: function (cm, actionArgs, vim) { + var _this = this; + var register = vimGlobalState.registerController.getRegister(actionArgs.registerName); + var fallback = function () { + var text = register.toString(); + _this.continuePaste(cm, actionArgs, vim, text, register); + }; + if (actionArgs.registerName === '+' && + typeof navigator !== 'undefined' && + typeof navigator.clipboard !== 'undefined' && + typeof navigator.clipboard.readText === 'function') { + navigator.clipboard.readText().then(function (value) { + _this.continuePaste(cm, actionArgs, vim, value, register); + }, function () { fallback(); }); + } + else { + fallback(); + } + }, + continuePaste: function (cm, actionArgs, vim, text, register) { var cur = copyCursor(cm.getCursor()); - var register = vimGlobalState.registerController.getRegister( - actionArgs.registerName); - var text = register.toString(); if (!text) { - return; + return; } if (actionArgs.matchIndent) { - var tabSize = cm.getOption("tabSize"); - var whitespaceLength = function(str) { - var tabs = (str.split("\t").length - 1); - var spaces = (str.split(" ").length - 1); - return tabs * tabSize + spaces * 1; - }; - var currentLine = cm.getLine(cm.getCursor().line); - var indent = whitespaceLength(currentLine.match(/^\s*/)[0]); - var chompedText = text.replace(/\n$/, ''); - var wasChomped = text !== chompedText; - var firstIndent = whitespaceLength(text.match(/^\s*/)[0]); - var text = chompedText.replace(/^\s*/gm, function(wspace) { - var newIndent = indent + (whitespaceLength(wspace) - firstIndent); - if (newIndent < 0) { - return ""; - } - else if (cm.getOption("indentWithTabs")) { - var quotient = Math.floor(newIndent / tabSize); - return Array(quotient + 1).join('\t'); - } - else { - return Array(newIndent + 1).join(' '); - } - }); - text += wasChomped ? "\n" : ""; + var tabSize = cm.getOption("tabSize"); + var whitespaceLength = function (str) { + var tabs = (str.split("\t").length - 1); + var spaces = (str.split(" ").length - 1); + return tabs * tabSize + spaces * 1; + }; + var currentLine = cm.getLine(cm.getCursor().line); + var indent = whitespaceLength(currentLine.match(/^\s*/)[0]); + var chompedText = text.replace(/\n$/, ''); + var wasChomped = text !== chompedText; + var firstIndent = whitespaceLength(text.match(/^\s*/)[0]); + var text = chompedText.replace(/^\s*/gm, function (wspace) { + var newIndent = indent + (whitespaceLength(wspace) - firstIndent); + if (newIndent < 0) { + return ""; + } + else if (cm.getOption("indentWithTabs")) { + var quotient = Math.floor(newIndent / tabSize); + return Array(quotient + 1).join('\t'); + } + else { + return Array(newIndent + 1).join(' '); + } + }); + text += wasChomped ? "\n" : ""; } if (actionArgs.repeat > 1) { - var text = Array(actionArgs.repeat + 1).join(text); + var text = Array(actionArgs.repeat + 1).join(text); } var linewise = register.linewise; var blockwise = register.blockwise; if (blockwise) { - text = text.split('\n'); - if (linewise) { - text.pop(); - } - for (var i = 0; i < text.length; i++) { - text[i] = (text[i] == '') ? ' ' : text[i]; - } - cur.ch += actionArgs.after ? 1 : 0; - cur.ch = Math.min(lineLength(cm, cur.line), cur.ch); - } else if (linewise) { - if(vim.visualMode) { - text = vim.visualLine ? text.slice(0, -1) : '\n' + text.slice(0, text.length - 1) + '\n'; - } else if (actionArgs.after) { - text = '\n' + text.slice(0, text.length - 1); - cur.ch = lineLength(cm, cur.line); - } else { - cur.ch = 0; - } - } else { - cur.ch += actionArgs.after ? 1 : 0; + text = text.split('\n'); + if (linewise) { + text.pop(); + } + for (var i = 0; i < text.length; i++) { + text[i] = (text[i] == '') ? ' ' : text[i]; + } + cur.ch += actionArgs.after ? 1 : 0; + cur.ch = Math.min(lineLength(cm, cur.line), cur.ch); + } + else if (linewise) { + if (vim.visualMode) { + text = vim.visualLine ? text.slice(0, -1) : '\n' + text.slice(0, text.length - 1) + '\n'; + } + else if (actionArgs.after) { + text = '\n' + text.slice(0, text.length - 1); + cur.ch = lineLength(cm, cur.line); + } + else { + cur.ch = 0; + } + } + else { + cur.ch += actionArgs.after ? 1 : 0; } var curPosFinal; - var idx; if (vim.visualMode) { - vim.lastPastedText = text; - var lastSelectionCurEnd; - var selectedArea = getSelectedAreaRange(cm, vim); - var selectionStart = selectedArea[0]; - var selectionEnd = selectedArea[1]; - var selectedText = cm.getSelection(); - var selections = cm.listSelections(); - var emptyStrings = new Array(selections.length).join('1').split('1'); - if (vim.lastSelection) { - lastSelectionCurEnd = vim.lastSelection.headMark.find(); - } - vimGlobalState.registerController.unnamedRegister.setText(selectedText); - if (blockwise) { - cm.replaceSelections(emptyStrings); - selectionEnd = new Pos(selectionStart.line + text.length-1, selectionStart.ch); - cm.setCursor(selectionStart); - selectBlock(cm, selectionEnd); - cm.replaceSelections(text); - curPosFinal = selectionStart; - } else if (vim.visualBlock) { - cm.replaceSelections(emptyStrings); - cm.setCursor(selectionStart); - cm.replaceRange(text, selectionStart, selectionStart); - curPosFinal = selectionStart; - } else { - cm.replaceRange(text, selectionStart, selectionEnd); - curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1); - } - if(lastSelectionCurEnd) { - vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd); - } - if (linewise) { - curPosFinal.ch=0; - } - } else { - if (blockwise) { - cm.setCursor(cur); - for (var i = 0; i < text.length; i++) { - var line = cur.line+i; - if (line > cm.lastLine()) { - cm.replaceRange('\n', new Pos(line, 0)); - } - var lastCh = lineLength(cm, line); - if (lastCh < cur.ch) { - extendLineToColumn(cm, line, cur.ch); - } - } - cm.setCursor(cur); - selectBlock(cm, new Pos(cur.line + text.length-1, cur.ch)); - cm.replaceSelections(text); - curPosFinal = cur; - } else { - cm.replaceRange(text, cur); - if (linewise && actionArgs.after) { - curPosFinal = new Pos( - cur.line + 1, - findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1))); - } else if (linewise && !actionArgs.after) { - curPosFinal = new Pos( - cur.line, - findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line))); - } else if (!linewise && actionArgs.after) { - idx = cm.indexFromPos(cur); - curPosFinal = cm.posFromIndex(idx + text.length - 1); - } else { - idx = cm.indexFromPos(cur); - curPosFinal = cm.posFromIndex(idx + text.length); - } - } + vim.lastPastedText = text; + var lastSelectionCurEnd; + var selectedArea = getSelectedAreaRange(cm, vim); + var selectionStart = selectedArea[0]; + var selectionEnd = selectedArea[1]; + var selectedText = cm.getSelection(); + var selections = cm.listSelections(); + var emptyStrings = new Array(selections.length).join('1').split('1'); + if (vim.lastSelection) { + lastSelectionCurEnd = vim.lastSelection.headMark.find(); + } + vimGlobalState.registerController.unnamedRegister.setText(selectedText); + if (blockwise) { + cm.replaceSelections(emptyStrings); + selectionEnd = new Pos(selectionStart.line + text.length - 1, selectionStart.ch); + cm.setCursor(selectionStart); + selectBlock(cm, selectionEnd); + cm.replaceSelections(text); + curPosFinal = selectionStart; + } + else if (vim.visualBlock) { + cm.replaceSelections(emptyStrings); + cm.setCursor(selectionStart); + cm.replaceRange(text, selectionStart, selectionStart); + curPosFinal = selectionStart; + } + else { + cm.replaceRange(text, selectionStart, selectionEnd); + curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1); + } + if (lastSelectionCurEnd) { + vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd); + } + if (linewise) { + curPosFinal.ch = 0; + } + } + else { + if (blockwise) { + cm.setCursor(cur); + for (var i = 0; i < text.length; i++) { + var line = cur.line + i; + if (line > cm.lastLine()) { + cm.replaceRange('\n', new Pos(line, 0)); + } + var lastCh = lineLength(cm, line); + if (lastCh < cur.ch) { + extendLineToColumn(cm, line, cur.ch); + } + } + cm.setCursor(cur); + selectBlock(cm, new Pos(cur.line + text.length - 1, cur.ch)); + cm.replaceSelections(text); + curPosFinal = cur; + } + else { + cm.replaceRange(text, cur); + if (linewise) { + var line = actionArgs.after ? cur.line + 1 : cur.line; + curPosFinal = new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); + } + else { + curPosFinal = copyCursor(cur); + if (!/\n/.test(text)) { + curPosFinal.ch += text.length - (actionArgs.after ? 1 : 0); + } + } + } } if (vim.visualMode) { - exitVisualMode(cm, false); + exitVisualMode(cm, false); } cm.setCursor(curPosFinal); - }, - undo: function(cm, actionArgs) { - cm.operation(function() { - repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)(); - cm.setCursor(cm.getCursor('anchor')); + }, + undo: function (cm, actionArgs) { + cm.operation(function () { + repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)(); + cm.setCursor(clipCursorToContent(cm, cm.getCursor('start'))); }); - }, - redo: function(cm, actionArgs) { + }, + redo: function (cm, actionArgs) { repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)(); - }, - setRegister: function(_cm, actionArgs, vim) { + }, + setRegister: function (_cm, actionArgs, vim) { vim.inputState.registerName = actionArgs.selectedCharacter; - }, - setMark: function(cm, actionArgs, vim) { + }, + insertRegister: function (cm, actionArgs, vim) { + var registerName = actionArgs.selectedCharacter; + var register = vimGlobalState.registerController.getRegister(registerName); + var text = register && register.toString(); + if (text) { + cm.replaceSelection(text); + } + }, + oneNormalCommand: function (cm, actionArgs, vim) { + exitInsertMode(cm, true); + vim.insertModeReturn = true; + CodeMirror.on(cm, 'vim-command-done', function handler() { + if (vim.visualMode) + return; + if (vim.insertModeReturn) { + vim.insertModeReturn = false; + if (!vim.insertMode) { + actions.enterInsertMode(cm, {}, vim); + } + } + CodeMirror.off(cm, 'vim-command-done', handler); + }); + }, + setMark: function (cm, actionArgs, vim) { var markName = actionArgs.selectedCharacter; updateMark(cm, vim, markName, cm.getCursor()); - }, - replace: function(cm, actionArgs, vim) { + }, + replace: function (cm, actionArgs, vim) { var replaceWith = actionArgs.selectedCharacter; var curStart = cm.getCursor(); var replaceTo; var curEnd; var selections = cm.listSelections(); if (vim.visualMode) { - curStart = cm.getCursor('start'); - curEnd = cm.getCursor('end'); - } else { - var line = cm.getLine(curStart.line); - replaceTo = curStart.ch + actionArgs.repeat; - if (replaceTo > line.length) { - replaceTo=line.length; - } - curEnd = new Pos(curStart.line, replaceTo); - } - if (replaceWith=='\n') { - if (!vim.visualMode) cm.replaceRange('', curStart, curEnd); - (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm); - } else { - var replaceWithStr = cm.getRange(curStart, curEnd); - replaceWithStr = replaceWithStr.replace(/[^\n]/g, replaceWith); - if (vim.visualBlock) { - var spaces = new Array(cm.getOption("tabSize")+1).join(' '); - replaceWithStr = cm.getSelection(); - replaceWithStr = replaceWithStr.replace(/\t/g, spaces).replace(/[^\n]/g, replaceWith).split('\n'); - cm.replaceSelections(replaceWithStr); - } else { - cm.replaceRange(replaceWithStr, curStart, curEnd); - } - if (vim.visualMode) { - curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ? - selections[0].anchor : selections[0].head; - cm.setCursor(curStart); - exitVisualMode(cm, false); - } else { - cm.setCursor(offsetCursor(curEnd, 0, -1)); - } + curStart = cm.getCursor('start'); + curEnd = cm.getCursor('end'); + } + else { + var line = cm.getLine(curStart.line); + replaceTo = curStart.ch + actionArgs.repeat; + if (replaceTo > line.length) { + replaceTo = line.length; + } + curEnd = new Pos(curStart.line, replaceTo); + } + var newPositions = updateSelectionForSurrogateCharacters(cm, curStart, curEnd); + curStart = newPositions.start; + curEnd = newPositions.end; + if (replaceWith == '\n') { + if (!vim.visualMode) + cm.replaceRange('', curStart, curEnd); + (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm); + } + else { + var replaceWithStr = cm.getRange(curStart, curEnd); + replaceWithStr = replaceWithStr.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, replaceWith); + replaceWithStr = replaceWithStr.replace(/[^\n]/g, replaceWith); + if (vim.visualBlock) { + var spaces = new Array(cm.getOption("tabSize") + 1).join(' '); + replaceWithStr = cm.getSelection(); + replaceWithStr = replaceWithStr.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, replaceWith); + replaceWithStr = replaceWithStr.replace(/\t/g, spaces).replace(/[^\n]/g, replaceWith).split('\n'); + cm.replaceSelections(replaceWithStr); + } + else { + cm.replaceRange(replaceWithStr, curStart, curEnd); + } + if (vim.visualMode) { + curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ? + selections[0].anchor : selections[0].head; + cm.setCursor(curStart); + exitVisualMode(cm, false); + } + else { + cm.setCursor(offsetCursor(curEnd, 0, -1)); + } } - }, - incrementNumberToken: function(cm, actionArgs) { + }, + incrementNumberToken: function (cm, actionArgs) { var cur = cm.getCursor(); var lineStr = cm.getLine(cur.line); var re = /(-?)(?:(0x)([\da-f]+)|(0b|0|)(\d+))/gi; @@ -3501,1921 +3928,2244 @@ dom.importCssString(".normal-mode .ace_cursor{\ var end; var numberStr; while ((match = re.exec(lineStr)) !== null) { - start = match.index; - end = start + match[0].length; - if (cur.ch < end)break; + start = match.index; + end = start + match[0].length; + if (cur.ch < end) + break; } - if (!actionArgs.backtrack && (end <= cur.ch))return; + if (!actionArgs.backtrack && (end <= cur.ch)) + return; if (match) { - var baseStr = match[2] || match[4] - var digits = match[3] || match[5] - var increment = actionArgs.increase ? 1 : -1; - var base = {'0b': 2, '0': 8, '': 10, '0x': 16}[baseStr.toLowerCase()]; - var number = parseInt(match[1] + digits, base) + (increment * actionArgs.repeat); - numberStr = number.toString(base); - var zeroPadding = baseStr ? new Array(digits.length - numberStr.length + 1 + match[1].length).join('0') : '' - if (numberStr.charAt(0) === '-') { - numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1); - } else { - numberStr = baseStr + zeroPadding + numberStr; - } - var from = new Pos(cur.line, start); - var to = new Pos(cur.line, end); - cm.replaceRange(numberStr, from, to); - } else { - return; + var baseStr = match[2] || match[4]; + var digits = match[3] || match[5]; + var increment = actionArgs.increase ? 1 : -1; + var base = { '0b': 2, '0': 8, '': 10, '0x': 16 }[baseStr.toLowerCase()]; + var number = parseInt(match[1] + digits, base) + (increment * actionArgs.repeat); + numberStr = number.toString(base); + var zeroPadding = baseStr ? new Array(digits.length - numberStr.length + 1 + match[1].length).join('0') : ''; + if (numberStr.charAt(0) === '-') { + numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1); + } + else { + numberStr = baseStr + zeroPadding + numberStr; + } + var from = new Pos(cur.line, start); + var to = new Pos(cur.line, end); + cm.replaceRange(numberStr, from, to); + } + else { + return; } cm.setCursor(new Pos(cur.line, start + numberStr.length - 1)); - }, - repeatLastEdit: function(cm, actionArgs, vim) { + }, + repeatLastEdit: function (cm, actionArgs, vim) { var lastEditInputState = vim.lastEditInputState; - if (!lastEditInputState) { return; } + if (!lastEditInputState) { + return; + } var repeat = actionArgs.repeat; if (repeat && actionArgs.repeatIsExplicit) { - vim.lastEditInputState.repeatOverride = repeat; - } else { - repeat = vim.lastEditInputState.repeatOverride || repeat; + vim.lastEditInputState.repeatOverride = repeat; + } + else { + repeat = vim.lastEditInputState.repeatOverride || repeat; } repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */); - }, - indent: function(cm, actionArgs) { + }, + indent: function (cm, actionArgs) { cm.indentLine(cm.getCursor().line, actionArgs.indentRight); - }, - exitInsertMode: exitInsertMode - }; - - function defineAction(name, fn) { - actions[name] = fn; - } - function clipCursorToContent(cm, cur) { - var vim = cm.state.vim; - var includeLineBreak = vim.insertMode || vim.visualMode; - var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() ); - var maxCh = lineLength(cm, line) - 1 + !!includeLineBreak; - var ch = Math.min(Math.max(0, cur.ch), maxCh); - return new Pos(line, ch); - } - function copyArgs(args) { - var ret = {}; - for (var prop in args) { + }, + exitInsertMode: exitInsertMode +}; +function defineAction(name, fn) { + actions[name] = fn; +} +function clipCursorToContent(cm, cur, oldCur) { + var vim = cm.state.vim; + var includeLineBreak = vim.insertMode || vim.visualMode; + var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine()); + var text = cm.getLine(line); + var maxCh = text.length - 1 + Number(!!includeLineBreak); + var ch = Math.min(Math.max(0, cur.ch), maxCh); + var charCode = text.charCodeAt(ch); + if (0xDC00 <= charCode && charCode <= 0xDFFF) { + var direction = 1; + if (oldCur && oldCur.line == line && oldCur.ch > ch) { + direction = -1; + } + ch += direction; + if (ch > maxCh) + ch -= 2; + } + return new Pos(line, ch); +} +function copyArgs(args) { + var ret = {}; + for (var prop in args) { if (args.hasOwnProperty(prop)) { - ret[prop] = args[prop]; + ret[prop] = args[prop]; } - } - return ret; } - function offsetCursor(cur, offsetLine, offsetCh) { - if (typeof offsetLine === 'object') { + return ret; +} +function offsetCursor(cur, offsetLine, offsetCh) { + if (typeof offsetLine === 'object') { offsetCh = offsetLine.ch; offsetLine = offsetLine.line; - } - return new Pos(cur.line + offsetLine, cur.ch + offsetCh); } - function commandMatches(keys, keyMap, context, inputState) { - var match, partial = [], full = []; - for (var i = 0; i < keyMap.length; i++) { + return new Pos(cur.line + offsetLine, cur.ch + offsetCh); +} +function commandMatches(keys, keyMap, context, inputState) { + if (inputState.operator) + context = "operatorPending"; + var match, partial = [], full = []; + var startIndex = noremap ? keyMap.length - defaultKeymapLength : 0; + for (var i = startIndex; i < keyMap.length; i++) { var command = keyMap[i]; if (context == 'insert' && command.context != 'insert' || - command.context && command.context != context || + (command.context && command.context != context) || inputState.operator && command.type == 'action' || - !(match = commandMatch(keys, command.keys))) { continue; } - if (match == 'partial') { partial.push(command); } - if (match == 'full') { full.push(command); } - } - return { + !(match = commandMatch(keys, command.keys))) { + continue; + } + if (match == 'partial') { + partial.push(command); + } + if (match == 'full') { + full.push(command); + } + } + return { partial: partial.length && partial, full: full.length && full - }; - } - function commandMatch(pressed, mapped) { - if (mapped.slice(-11) == '') { - var prefixLen = mapped.length - 11; + }; +} +function commandMatch(pressed, mapped) { + var isLastCharacter = mapped.slice(-11) == ''; + var isLastRegister = mapped.slice(-10) == ''; + if (isLastCharacter || isLastRegister) { + var prefixLen = mapped.length - (isLastCharacter ? 11 : 10); var pressedPrefix = pressed.slice(0, prefixLen); var mappedPrefix = mapped.slice(0, prefixLen); return pressedPrefix == mappedPrefix && pressed.length > prefixLen ? 'full' : - mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false; - } else { + mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false; + } + else { return pressed == mapped ? 'full' : - mapped.indexOf(pressed) == 0 ? 'partial' : false; - } - } - function lastChar(keys) { - var match = /^.*(<[^>]+>)$/.exec(keys); - var selectedCharacter = match ? match[1] : keys.slice(-1); - if (selectedCharacter.length > 1){ - switch(selectedCharacter){ - case '': - selectedCharacter='\n'; - break; - case '': - selectedCharacter=' '; - break; - default: - selectedCharacter=''; - break; - } - } - return selectedCharacter; + mapped.indexOf(pressed) == 0 ? 'partial' : false; } - function repeatFn(cm, fn, repeat) { - return function() { +} +function lastChar(keys) { + var match = /^.*(<[^>]+>)$/.exec(keys); + var selectedCharacter = match ? match[1] : keys.slice(-1); + if (selectedCharacter.length > 1) { + switch (selectedCharacter) { + case '': + selectedCharacter = '\n'; + break; + case '': + selectedCharacter = ' '; + break; + default: + selectedCharacter = ''; + break; + } + } + return selectedCharacter; +} +function repeatFn(cm, fn, repeat) { + return function () { for (var i = 0; i < repeat; i++) { - fn(cm); + fn(cm); } - }; - } - function copyCursor(cur) { - return new Pos(cur.line, cur.ch); - } - function cursorEqual(cur1, cur2) { - return cur1.ch == cur2.ch && cur1.line == cur2.line; - } - function cursorIsBefore(cur1, cur2) { - if (cur1.line < cur2.line) { + }; +} +function copyCursor(cur) { + return new Pos(cur.line, cur.ch); +} +function cursorEqual(cur1, cur2) { + return cur1.ch == cur2.ch && cur1.line == cur2.line; +} +function cursorIsBefore(cur1, cur2) { + if (cur1.line < cur2.line) { return true; - } - if (cur1.line == cur2.line && cur1.ch < cur2.ch) { + } + if (cur1.line == cur2.line && cur1.ch < cur2.ch) { return true; - } - return false; } - function cursorMin(cur1, cur2) { - if (arguments.length > 2) { + return false; +} +function cursorMin(cur1, cur2) { + if (arguments.length > 2) { cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1)); - } - return cursorIsBefore(cur1, cur2) ? cur1 : cur2; } - function cursorMax(cur1, cur2) { - if (arguments.length > 2) { + return cursorIsBefore(cur1, cur2) ? cur1 : cur2; +} +function cursorMax(cur1, cur2) { + if (arguments.length > 2) { cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1)); - } - return cursorIsBefore(cur1, cur2) ? cur2 : cur1; - } - function cursorIsBetween(cur1, cur2, cur3) { - var cur1before2 = cursorIsBefore(cur1, cur2); - var cur2before3 = cursorIsBefore(cur2, cur3); - return cur1before2 && cur2before3; } - function lineLength(cm, lineNum) { - return cm.getLine(lineNum).length; - } - function trim(s) { - if (s.trim) { + return cursorIsBefore(cur1, cur2) ? cur2 : cur1; +} +function cursorIsBetween(cur1, cur2, cur3) { + var cur1before2 = cursorIsBefore(cur1, cur2); + var cur2before3 = cursorIsBefore(cur2, cur3); + return cur1before2 && cur2before3; +} +function lineLength(cm, lineNum) { + return cm.getLine(lineNum).length; +} +function trim(s) { + if (s.trim) { return s.trim(); - } - return s.replace(/^\s+|\s+$/g, ''); - } - function escapeRegex(s) { - return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1'); - } - function extendLineToColumn(cm, lineNum, column) { - var endCh = lineLength(cm, lineNum); - var spaces = new Array(column-endCh+1).join(' '); - cm.setCursor(new Pos(lineNum, endCh)); - cm.replaceRange(spaces, cm.getCursor()); - } - function selectBlock(cm, selectionEnd) { - var selections = [], ranges = cm.listSelections(); - var head = copyCursor(cm.clipPos(selectionEnd)); - var isClipped = !cursorEqual(selectionEnd, head); - var curHead = cm.getCursor('head'); - var primIndex = getIndex(ranges, curHead); - var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor); - var max = ranges.length - 1; - var index = max - primIndex > primIndex ? max : 0; - var base = ranges[index].anchor; - - var firstLine = Math.min(base.line, head.line); - var lastLine = Math.max(base.line, head.line); - var baseCh = base.ch, headCh = head.ch; - - var dir = ranges[index].head.ch - baseCh; - var newDir = headCh - baseCh; - if (dir > 0 && newDir <= 0) { + } + return s.replace(/^\s+|\s+$/g, ''); +} +function escapeRegex(s) { + return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1'); +} +function extendLineToColumn(cm, lineNum, column) { + var endCh = lineLength(cm, lineNum); + var spaces = new Array(column - endCh + 1).join(' '); + cm.setCursor(new Pos(lineNum, endCh)); + cm.replaceRange(spaces, cm.getCursor()); +} +function selectBlock(cm, selectionEnd) { + var selections = [], ranges = cm.listSelections(); + var head = copyCursor(cm.clipPos(selectionEnd)); + var isClipped = !cursorEqual(selectionEnd, head); + var curHead = cm.getCursor('head'); + var primIndex = getIndex(ranges, curHead); + var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor); + var max = ranges.length - 1; + var index = max - primIndex > primIndex ? max : 0; + var base = ranges[index].anchor; + var firstLine = Math.min(base.line, head.line); + var lastLine = Math.max(base.line, head.line); + var baseCh = base.ch, headCh = head.ch; + var dir = ranges[index].head.ch - baseCh; + var newDir = headCh - baseCh; + if (dir > 0 && newDir <= 0) { baseCh++; - if (!isClipped) { headCh--; } - } else if (dir < 0 && newDir >= 0) { + if (!isClipped) { + headCh--; + } + } + else if (dir < 0 && newDir >= 0) { baseCh--; - if (!wasClipped) { headCh++; } - } else if (dir < 0 && newDir == -1) { + if (!wasClipped) { + headCh++; + } + } + else if (dir < 0 && newDir == -1) { baseCh--; headCh++; - } - for (var line = firstLine; line <= lastLine; line++) { - var range = {anchor: new Pos(line, baseCh), head: new Pos(line, headCh)}; + } + for (var line = firstLine; line <= lastLine; line++) { + var range = { anchor: new Pos(line, baseCh), head: new Pos(line, headCh) }; selections.push(range); - } - cm.setSelections(selections); - selectionEnd.ch = headCh; - base.ch = baseCh; - return base; - } - function selectForInsert(cm, head, height) { - var sel = []; - for (var i = 0; i < height; i++) { + } + cm.setSelections(selections); + selectionEnd.ch = headCh; + base.ch = baseCh; + return base; +} +function selectForInsert(cm, head, height) { + var sel = []; + for (var i = 0; i < height; i++) { var lineHead = offsetCursor(head, i, 0); - sel.push({anchor: lineHead, head: lineHead}); - } - cm.setSelections(sel, 0); + sel.push({ anchor: lineHead, head: lineHead }); } - function getIndex(ranges, cursor, end) { - for (var i = 0; i < ranges.length; i++) { + cm.setSelections(sel, 0); +} +function getIndex(ranges, cursor, end) { + for (var i = 0; i < ranges.length; i++) { var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor); var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor); if (atAnchor || atHead) { - return i; + return i; } - } - return -1; } - function getSelectedAreaRange(cm, vim) { - var lastSelection = vim.lastSelection; - var getCurrentSelectedAreaRange = function() { + return -1; +} +function getSelectedAreaRange(cm, vim) { + var lastSelection = vim.lastSelection; + var getCurrentSelectedAreaRange = function () { var selections = cm.listSelections(); - var start = selections[0]; - var end = selections[selections.length-1]; + var start = selections[0]; + var end = selections[selections.length - 1]; var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head; var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor; return [selectionStart, selectionEnd]; - }; - var getLastSelectedAreaRange = function() { + }; + var getLastSelectedAreaRange = function () { var selectionStart = cm.getCursor(); var selectionEnd = cm.getCursor(); var block = lastSelection.visualBlock; if (block) { - var width = block.width; - var height = block.height; - selectionEnd = new Pos(selectionStart.line + height, selectionStart.ch + width); - var selections = []; - for (var i = selectionStart.line; i < selectionEnd.line; i++) { - var anchor = new Pos(i, selectionStart.ch); - var head = new Pos(i, selectionEnd.ch); - var range = {anchor: anchor, head: head}; - selections.push(range); - } - cm.setSelections(selections); - } else { - var start = lastSelection.anchorMark.find(); - var end = lastSelection.headMark.find(); - var line = end.line - start.line; - var ch = end.ch - start.ch; - selectionEnd = {line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch}; - if (lastSelection.visualLine) { - selectionStart = new Pos(selectionStart.line, 0); - selectionEnd = new Pos(selectionEnd.line, lineLength(cm, selectionEnd.line)); - } - cm.setSelection(selectionStart, selectionEnd); + var width = block.width; + var height = block.height; + selectionEnd = new Pos(selectionStart.line + height, selectionStart.ch + width); + var selections = []; + for (var i = selectionStart.line; i < selectionEnd.line; i++) { + var anchor = new Pos(i, selectionStart.ch); + var head = new Pos(i, selectionEnd.ch); + var range = { anchor: anchor, head: head }; + selections.push(range); + } + cm.setSelections(selections); + } + else { + var start = lastSelection.anchorMark.find(); + var end = lastSelection.headMark.find(); + var line = end.line - start.line; + var ch = end.ch - start.ch; + selectionEnd = { line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch }; + if (lastSelection.visualLine) { + selectionStart = new Pos(selectionStart.line, 0); + selectionEnd = new Pos(selectionEnd.line, lineLength(cm, selectionEnd.line)); + } + cm.setSelection(selectionStart, selectionEnd); } return [selectionStart, selectionEnd]; - }; - if (!vim.visualMode) { + }; + if (!vim.visualMode) { return getLastSelectedAreaRange(); - } else { + } + else { return getCurrentSelectedAreaRange(); - } } - function updateLastSelection(cm, vim) { - var anchor = vim.sel.anchor; - var head = vim.sel.head; - if (vim.lastPastedText) { +} +function updateLastSelection(cm, vim) { + var anchor = vim.sel.anchor; + var head = vim.sel.head; + if (vim.lastPastedText) { head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length); vim.lastPastedText = null; - } - vim.lastSelection = {'anchorMark': cm.setBookmark(anchor), - 'headMark': cm.setBookmark(head), - 'anchor': copyCursor(anchor), - 'head': copyCursor(head), - 'visualMode': vim.visualMode, - 'visualLine': vim.visualLine, - 'visualBlock': vim.visualBlock}; - } - function expandSelection(cm, start, end) { - var sel = cm.state.vim.sel; - var head = sel.head; - var anchor = sel.anchor; - var tmp; - if (cursorIsBefore(end, start)) { + } + vim.lastSelection = { 'anchorMark': cm.setBookmark(anchor), + 'headMark': cm.setBookmark(head), + 'anchor': copyCursor(anchor), + 'head': copyCursor(head), + 'visualMode': vim.visualMode, + 'visualLine': vim.visualLine, + 'visualBlock': vim.visualBlock }; +} +function expandSelection(cm, start, end, move) { + var sel = cm.state.vim.sel; + var head = move ? start : sel.head; + var anchor = move ? start : sel.anchor; + var tmp; + if (cursorIsBefore(end, start)) { tmp = end; end = start; start = tmp; - } - if (cursorIsBefore(head, anchor)) { + } + if (cursorIsBefore(head, anchor)) { head = cursorMin(start, head); anchor = cursorMax(anchor, end); - } else { + } + else { anchor = cursorMin(start, anchor); head = cursorMax(head, end); head = offsetCursor(head, 0, -1); if (head.ch == -1 && head.line != cm.firstLine()) { - head = new Pos(head.line - 1, lineLength(cm, head.line - 1)); + head = new Pos(head.line - 1, lineLength(cm, head.line - 1)); } - } - return [anchor, head]; } - function updateCmSelection(cm, sel, mode) { - var vim = cm.state.vim; - sel = sel || vim.sel; - var mode = mode || + return [anchor, head]; +} +function updateCmSelection(cm, sel, mode) { + var vim = cm.state.vim; + sel = sel || vim.sel; + var mode = mode || vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char'; - var cmSel = makeCmSelection(cm, sel, mode); - cm.setSelections(cmSel.ranges, cmSel.primary); - } - function makeCmSelection(cm, sel, mode, exclusive) { - var head = copyCursor(sel.head); - var anchor = copyCursor(sel.anchor); - if (mode == 'char') { + var cmSel = makeCmSelection(cm, sel, mode); + cm.setSelections(cmSel.ranges, cmSel.primary); +} +function makeCmSelection(cm, sel, mode, exclusive) { + var head = copyCursor(sel.head); + var anchor = copyCursor(sel.anchor); + if (mode == 'char') { var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; head = offsetCursor(sel.head, 0, headOffset); anchor = offsetCursor(sel.anchor, 0, anchorOffset); return { - ranges: [{anchor: anchor, head: head}], - primary: 0 + ranges: [{ anchor: anchor, head: head }], + primary: 0 }; - } else if (mode == 'line') { + } + else if (mode == 'line') { if (!cursorIsBefore(sel.head, sel.anchor)) { - anchor.ch = 0; - - var lastLine = cm.lastLine(); - if (head.line > lastLine) { - head.line = lastLine; - } - head.ch = lineLength(cm, head.line); - } else { - head.ch = 0; - anchor.ch = lineLength(cm, anchor.line); + anchor.ch = 0; + var lastLine = cm.lastLine(); + if (head.line > lastLine) { + head.line = lastLine; + } + head.ch = lineLength(cm, head.line); + } + else { + head.ch = 0; + anchor.ch = lineLength(cm, anchor.line); } return { - ranges: [{anchor: anchor, head: head}], - primary: 0 + ranges: [{ anchor: anchor, head: head }], + primary: 0 }; - } else if (mode == 'block') { - var top = Math.min(anchor.line, head.line), - fromCh = anchor.ch, - bottom = Math.max(anchor.line, head.line), - toCh = head.ch; - if (fromCh < toCh) { toCh += 1 } - else { fromCh += 1 }; + } + else if (mode == 'block') { + var top = Math.min(anchor.line, head.line), fromCh = anchor.ch, bottom = Math.max(anchor.line, head.line), toCh = head.ch; + if (fromCh < toCh) { + toCh += 1; + } + else { + fromCh += 1; + } + ; var height = bottom - top + 1; var primary = head.line == top ? 0 : height - 1; var ranges = []; for (var i = 0; i < height; i++) { - ranges.push({ - anchor: new Pos(top + i, fromCh), - head: new Pos(top + i, toCh) - }); + ranges.push({ + anchor: new Pos(top + i, fromCh), + head: new Pos(top + i, toCh) + }); } return { - ranges: ranges, - primary: primary + ranges: ranges, + primary: primary }; - } } - function getHead(cm) { - var cur = cm.getCursor('head'); - if (cm.getSelection().length == 1) { +} +function getHead(cm) { + var cur = cm.getCursor('head'); + if (cm.getSelection().length == 1) { cur = cursorMin(cur, cm.getCursor('anchor')); - } - return cur; } - function exitVisualMode(cm, moveHead) { - var vim = cm.state.vim; - if (moveHead !== false) { - cm.setCursor(clipCursorToContent(cm, vim.sel.head)); - } - updateLastSelection(cm, vim); - vim.visualMode = false; - vim.visualLine = false; - vim.visualBlock = false; - if (!vim.insertMode) CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); - } - function clipToLine(cm, curStart, curEnd) { - var selection = cm.getRange(curStart, curEnd); - if (/\n\s*$/.test(selection)) { - var lines = selection.split('\n'); - lines.pop(); - var line; - for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) { - curEnd.line--; - curEnd.ch = 0; + return cur; +} +function exitVisualMode(cm, moveHead) { + var vim = cm.state.vim; + if (moveHead !== false) { + cm.setCursor(clipCursorToContent(cm, vim.sel.head)); + } + updateLastSelection(cm, vim); + vim.visualMode = false; + vim.visualLine = false; + vim.visualBlock = false; + if (!vim.insertMode) + CodeMirror.signal(cm, "vim-mode-change", { mode: "normal" }); +} +function clipToLine(cm, curStart, curEnd) { + var selection = cm.getRange(curStart, curEnd); + if (/\n\s*$/.test(selection)) { + var lines = selection.split('\n'); + lines.pop(); + var line; + for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) { + curEnd.line--; + curEnd.ch = 0; + } + if (line) { + curEnd.line--; + curEnd.ch = lineLength(cm, curEnd.line); + } + else { + curEnd.ch = 0; + } + } +} +function expandSelectionToLine(_cm, curStart, curEnd) { + curStart.ch = 0; + curEnd.ch = 0; + curEnd.line++; +} +function findFirstNonWhiteSpaceCharacter(text) { + if (!text) { + return 0; + } + var firstNonWS = text.search(/\S/); + return firstNonWS == -1 ? text.length : firstNonWS; +} +function expandWordUnderCursor(cm, _a, cursor) { + var inclusive = _a.inclusive, innerWord = _a.innerWord, bigWord = _a.bigWord, noSymbol = _a.noSymbol, multiline = _a.multiline; + var cur = cursor || getHead(cm); + var line = cm.getLine(cur.line); + var endLine = line; + var startLineNumber = cur.line; + var endLineNumber = startLineNumber; + var idx = cur.ch; + var wordOnNextLine; + var test = noSymbol ? wordCharTest[0] : bigWordCharTest[0]; + if (innerWord && /\s/.test(line.charAt(idx))) { + test = function (ch) { return /\s/.test(ch); }; + } + else { + while (!test(line.charAt(idx))) { + idx++; + if (idx >= line.length) { + if (!multiline) + return null; + idx--; + wordOnNextLine = findWord(cm, cur, true, bigWord, true); + break; + } } - if (line) { - curEnd.line--; - curEnd.ch = lineLength(cm, curEnd.line); - } else { - curEnd.ch = 0; + if (bigWord) { + test = bigWordCharTest[0]; + } + else { + test = wordCharTest[0]; + if (!test(line.charAt(idx))) { + test = wordCharTest[1]; + } } - } } - function expandSelectionToLine(_cm, curStart, curEnd) { - curStart.ch = 0; - curEnd.ch = 0; - curEnd.line++; + var end = idx, start = idx; + while (test(line.charAt(start)) && start >= 0) { + start--; } - - function findFirstNonWhiteSpaceCharacter(text) { - if (!text) { - return 0; - } - var firstNonWS = text.search(/\S/); - return firstNonWS == -1 ? text.length : firstNonWS; + start++; + if (wordOnNextLine) { + end = wordOnNextLine.to; + endLineNumber = wordOnNextLine.line; + endLine = cm.getLine(endLineNumber); + if (!endLine && end == 0) + end++; } - - function expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) { - var cur = getHead(cm); - var line = cm.getLine(cur.line); - var idx = cur.ch; - var test = noSymbol ? wordCharTest[0] : bigWordCharTest [0]; - while (!test(line.charAt(idx))) { - idx++; - if (idx >= line.length) { return null; } - } - - if (bigWord) { - test = bigWordCharTest[0]; - } else { - test = wordCharTest[0]; - if (!test(line.charAt(idx))) { - test = wordCharTest[1]; - } - } - - var end = idx, start = idx; - while (test(line.charAt(end)) && end < line.length) { end++; } - while (test(line.charAt(start)) && start >= 0) { start--; } - start++; - - if (inclusive) { + else { + while (test(line.charAt(end)) && end < line.length) { + end++; + } + } + if (inclusive) { var wordEnd = end; - while (/\s/.test(line.charAt(end)) && end < line.length) { end++; } - if (wordEnd == end) { - var wordStart = start; - while (/\s/.test(line.charAt(start - 1)) && start > 0) { start--; } - if (!start) { start = wordStart; } - } - } - return { start: new Pos(cur.line, start), end: new Pos(cur.line, end) }; - } - function expandTagUnderCursor(cm, head, inclusive) { - var cur = head; - if (!CodeMirror.findMatchingTag || !CodeMirror.findEnclosingTag) { + var startsWithSpace = cur.ch <= start && /\s/.test(line.charAt(cur.ch)); + if (!startsWithSpace) { + while (/\s/.test(endLine.charAt(end)) && end < endLine.length) { + end++; + } + } + if (wordEnd == end || startsWithSpace) { + var wordStart = start; + while (/\s/.test(line.charAt(start - 1)) && start > 0) { + start--; + } + if (!start && !startsWithSpace) { + start = wordStart; + } + } + } + return { start: new Pos(startLineNumber, start), end: new Pos(endLineNumber, end) }; +} +function expandTagUnderCursor(cm, head, inclusive) { + var cur = head; + if (!CodeMirror.findMatchingTag || !CodeMirror.findEnclosingTag) { return { start: cur, end: cur }; - } - - var tags = CodeMirror.findMatchingTag(cm, head) || CodeMirror.findEnclosingTag(cm, head); - if (!tags || !tags.open || !tags.close) { + } + var tags = CodeMirror.findMatchingTag(cm, head) || CodeMirror.findEnclosingTag(cm, head); + if (!tags || !tags.open || !tags.close) { return { start: cur, end: cur }; - } - - if (inclusive) { + } + if (inclusive) { return { start: tags.open.from, end: tags.close.to }; - } - return { start: tags.open.to, end: tags.close.from }; } - - function recordJumpPosition(cm, oldCur, newCur) { - if (!cursorEqual(oldCur, newCur)) { + return { start: tags.open.to, end: tags.close.from }; +} +function recordJumpPosition(cm, oldCur, newCur) { + if (!cursorEqual(oldCur, newCur)) { vimGlobalState.jumpList.add(cm, oldCur, newCur); - } - } - - function recordLastCharacterSearch(increment, args) { - vimGlobalState.lastCharacterSearch.increment = increment; - vimGlobalState.lastCharacterSearch.forward = args.forward; - vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter; } - - var symbolToMode = { - '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket', - '[': 'section', ']': 'section', - '*': 'comment', '/': 'comment', - 'm': 'method', 'M': 'method', - '#': 'preprocess' - }; - var findSymbolModes = { - bracket: { - isComplete: function(state) { - if (state.nextCh === state.symb) { - state.depth++; - if (state.depth >= 1)return true; - } else if (state.nextCh === state.reverseSymb) { - state.depth--; - } - return false; - } - }, - section: { - init: function(state) { - state.curMoveThrough = true; - state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}'; - }, - isComplete: function(state) { - return state.index === 0 && state.nextCh === state.symb; - } - }, - comment: { - isComplete: function(state) { - var found = state.lastCh === '*' && state.nextCh === '/'; - state.lastCh = state.nextCh; - return found; - } - }, - method: { - init: function(state) { - state.symb = (state.symb === 'm' ? '{' : '}'); - state.reverseSymb = state.symb === '{' ? '}' : '{'; +} +function recordLastCharacterSearch(increment, args) { + vimGlobalState.lastCharacterSearch.increment = increment; + vimGlobalState.lastCharacterSearch.forward = args.forward; + vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter; +} +var symbolToMode = { + '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket', + '[': 'section', ']': 'section', + '*': 'comment', '/': 'comment', + 'm': 'method', 'M': 'method', + '#': 'preprocess' +}; +var findSymbolModes = { + bracket: { + isComplete: function (state) { + if (state.nextCh === state.symb) { + state.depth++; + if (state.depth >= 1) + return true; + } + else if (state.nextCh === state.reverseSymb) { + state.depth--; + } + return false; + } + }, + section: { + init: function (state) { + state.curMoveThrough = true; + state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}'; }, - isComplete: function(state) { - if (state.nextCh === state.symb)return true; - return false; - } - }, - preprocess: { - init: function(state) { - state.index = 0; + isComplete: function (state) { + return state.index === 0 && state.nextCh === state.symb; + } + }, + comment: { + isComplete: function (state) { + var found = state.lastCh === '*' && state.nextCh === '/'; + state.lastCh = state.nextCh; + return found; + } + }, + method: { + init: function (state) { + state.symb = (state.symb === 'm' ? '{' : '}'); + state.reverseSymb = state.symb === '{' ? '}' : '{'; }, - isComplete: function(state) { - if (state.nextCh === '#') { - var token = state.lineText.match(/^#(\w+)/)[1]; - if (token === 'endif') { - if (state.forward && state.depth === 0) { - return true; - } - state.depth++; - } else if (token === 'if') { - if (!state.forward && state.depth === 0) { + isComplete: function (state) { + if (state.nextCh === state.symb) return true; - } - state.depth--; + return false; + } + }, + preprocess: { + init: function (state) { + state.index = 0; + }, + isComplete: function (state) { + if (state.nextCh === '#') { + var token = state.lineText.match(/^#(\w+)/)[1]; + if (token === 'endif') { + if (state.forward && state.depth === 0) { + return true; + } + state.depth++; + } + else if (token === 'if') { + if (!state.forward && state.depth === 0) { + return true; + } + state.depth--; + } + if (token === 'else' && state.depth === 0) + return true; } - if (token === 'else' && state.depth === 0)return true; - } - return false; + return false; } - } - }; - function findSymbol(cm, repeat, forward, symb) { - var cur = copyCursor(cm.getCursor()); - var increment = forward ? 1 : -1; - var endLine = forward ? cm.lineCount() : -1; - var curCh = cur.ch; - var line = cur.line; - var lineText = cm.getLine(line); - var state = { + } +}; +function findSymbol(cm, repeat, forward, symb) { + var cur = copyCursor(cm.getCursor()); + var increment = forward ? 1 : -1; + var endLine = forward ? cm.lineCount() : -1; + var curCh = cur.ch; + var line = cur.line; + var lineText = cm.getLine(line); + var state = { lineText: lineText, nextCh: lineText.charAt(curCh), lastCh: null, index: curCh, symb: symb, - reverseSymb: (forward ? { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb], + reverseSymb: (forward ? { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb], forward: forward, depth: 0, curMoveThrough: false - }; - var mode = symbolToMode[symb]; - if (!mode)return cur; - var init = findSymbolModes[mode].init; - var isComplete = findSymbolModes[mode].isComplete; - if (init) { init(state); } - while (line !== endLine && repeat) { + }; + var mode = symbolToMode[symb]; + if (!mode) + return cur; + var init = findSymbolModes[mode].init; + var isComplete = findSymbolModes[mode].isComplete; + if (init) { + init(state); + } + while (line !== endLine && repeat) { state.index += increment; state.nextCh = state.lineText.charAt(state.index); if (!state.nextCh) { - line += increment; - state.lineText = cm.getLine(line) || ''; - if (increment > 0) { - state.index = 0; - } else { - var lineLen = state.lineText.length; - state.index = (lineLen > 0) ? (lineLen-1) : 0; - } - state.nextCh = state.lineText.charAt(state.index); + line += increment; + state.lineText = cm.getLine(line) || ''; + if (increment > 0) { + state.index = 0; + } + else { + var lineLen = state.lineText.length; + state.index = (lineLen > 0) ? (lineLen - 1) : 0; + } + state.nextCh = state.lineText.charAt(state.index); } if (isComplete(state)) { - cur.line = line; - cur.ch = state.index; - repeat--; + cur.line = line; + cur.ch = state.index; + repeat--; } - } - if (state.nextCh || state.curMoveThrough) { + } + if (state.nextCh || state.curMoveThrough) { return new Pos(line, state.index); - } - return cur; - } - function findWord(cm, cur, forward, bigWord, emptyLineIsWord) { - var lineNum = cur.line; - var pos = cur.ch; - var line = cm.getLine(lineNum); - var dir = forward ? 1 : -1; - var charTests = bigWord ? bigWordCharTest: wordCharTest; - - if (emptyLineIsWord && line == '') { + } + return cur; +} +function findWord(cm, cur, forward, bigWord, emptyLineIsWord) { + var lineNum = cur.line; + var pos = cur.ch; + var line = cm.getLine(lineNum); + var dir = forward ? 1 : -1; + var charTests = bigWord ? bigWordCharTest : wordCharTest; + if (emptyLineIsWord && line == '') { lineNum += dir; line = cm.getLine(lineNum); if (!isLine(cm, lineNum)) { - return null; + return null; } pos = (forward) ? 0 : line.length; - } - - while (true) { + } + while (true) { if (emptyLineIsWord && line == '') { - return { from: 0, to: 0, line: lineNum }; + return { from: 0, to: 0, line: lineNum }; } var stop = (dir > 0) ? line.length : -1; var wordStart = stop, wordEnd = stop; while (pos != stop) { - var foundWord = false; - for (var i = 0; i < charTests.length && !foundWord; ++i) { - if (charTests[i](line.charAt(pos))) { - wordStart = pos; - while (pos != stop && charTests[i](line.charAt(pos))) { + var foundWord = false; + for (var i = 0; i < charTests.length && !foundWord; ++i) { + if (charTests[i](line.charAt(pos))) { + wordStart = pos; + while (pos != stop && charTests[i](line.charAt(pos))) { + pos += dir; + } + wordEnd = pos; + foundWord = wordStart != wordEnd; + if (wordStart == cur.ch && lineNum == cur.line && + wordEnd == wordStart + dir) { + continue; + } + else { + return { + from: Math.min(wordStart, wordEnd + 1), + to: Math.max(wordStart, wordEnd), + line: lineNum + }; + } + } + } + if (!foundWord) { pos += dir; - } - wordEnd = pos; - foundWord = wordStart != wordEnd; - if (wordStart == cur.ch && lineNum == cur.line && - wordEnd == wordStart + dir) { - continue; - } else { - return { - from: Math.min(wordStart, wordEnd + 1), - to: Math.max(wordStart, wordEnd), - line: lineNum }; - } - } - } - if (!foundWord) { - pos += dir; - } + } } lineNum += dir; if (!isLine(cm, lineNum)) { - return null; + return null; } line = cm.getLine(lineNum); pos = (dir > 0) ? 0 : line.length; - } } - function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) { - var curStart = copyCursor(cur); - var words = []; - if (forward && !wordEnd || !forward && wordEnd) { +} +function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) { + var curStart = copyCursor(cur); + var words = []; + if (forward && !wordEnd || !forward && wordEnd) { repeat++; - } - var emptyLineIsWord = !(forward && wordEnd); - for (var i = 0; i < repeat; i++) { + } + var emptyLineIsWord = !(forward && wordEnd); + for (var i = 0; i < repeat; i++) { var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord); if (!word) { - var eodCh = lineLength(cm, cm.lastLine()); - words.push(forward - ? {line: cm.lastLine(), from: eodCh, to: eodCh} - : {line: 0, from: 0, to: 0}); - break; + var eodCh = lineLength(cm, cm.lastLine()); + words.push(forward + ? { line: cm.lastLine(), from: eodCh, to: eodCh } + : { line: 0, from: 0, to: 0 }); + break; } words.push(word); cur = new Pos(word.line, forward ? (word.to - 1) : word.from); - } - var shortCircuit = words.length != repeat; - var firstWord = words[0]; - var lastWord = words.pop(); - if (forward && !wordEnd) { + } + var shortCircuit = words.length != repeat; + var firstWord = words[0]; + var lastWord = words.pop(); + if (forward && !wordEnd) { if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) { - lastWord = words.pop(); + lastWord = words.pop(); } return new Pos(lastWord.line, lastWord.from); - } else if (forward && wordEnd) { + } + else if (forward && wordEnd) { return new Pos(lastWord.line, lastWord.to - 1); - } else if (!forward && wordEnd) { + } + else if (!forward && wordEnd) { if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) { - lastWord = words.pop(); + lastWord = words.pop(); } return new Pos(lastWord.line, lastWord.to); - } else { + } + else { return new Pos(lastWord.line, lastWord.from); - } } - - function moveToEol(cm, head, motionArgs, vim, keepHPos) { - var cur = head; - var retval= new Pos(cur.line + motionArgs.repeat - 1, Infinity); - var end=cm.clipPos(retval); - end.ch--; - if (!keepHPos) { +} +function moveToEol(cm, head, motionArgs, vim, keepHPos) { + var cur = head; + var retval = new Pos(cur.line + motionArgs.repeat - 1, Infinity); + var end = cm.clipPos(retval); + end.ch--; + if (!keepHPos) { vim.lastHPos = Infinity; - vim.lastHSPos = cm.charCoords(end,'div').left; - } - return retval; + vim.lastHSPos = cm.charCoords(end, 'div').left; } - - function moveToCharacter(cm, repeat, forward, character) { - var cur = cm.getCursor(); - var start = cur.ch; - var idx; - for (var i = 0; i < repeat; i ++) { + return retval; +} +function moveToCharacter(cm, repeat, forward, character, head) { + var cur = head || cm.getCursor(); + var start = cur.ch; + var idx; + for (var i = 0; i < repeat; i++) { var line = cm.getLine(cur.line); idx = charIdxInLine(start, line, character, forward, true); if (idx == -1) { - return null; + return null; } start = idx; - } - return new Pos(cm.getCursor().line, idx); - } - - function moveToColumn(cm, repeat) { - var line = cm.getCursor().line; - return clipCursorToContent(cm, new Pos(line, repeat - 1)); } - - function updateMark(cm, vim, markName, pos) { - if (!inArray(markName, validMarks)) { + return new Pos(cm.getCursor().line, idx); +} +function moveToColumn(cm, repeat) { + var line = cm.getCursor().line; + return clipCursorToContent(cm, new Pos(line, repeat - 1)); +} +function updateMark(cm, vim, markName, pos) { + if (!inArray(markName, validMarks) && !latinCharRegex.test(markName)) { return; - } - if (vim.marks[markName]) { + } + if (vim.marks[markName]) { vim.marks[markName].clear(); - } - vim.marks[markName] = cm.setBookmark(pos); } - - function charIdxInLine(start, line, character, forward, includeChar) { - var idx; - if (forward) { + vim.marks[markName] = cm.setBookmark(pos); +} +function charIdxInLine(start, line, character, forward, includeChar) { + var idx; + if (forward) { idx = line.indexOf(character, start + 1); if (idx != -1 && !includeChar) { - idx -= 1; + idx -= 1; } - } else { + } + else { idx = line.lastIndexOf(character, start - 1); if (idx != -1 && !includeChar) { - idx += 1; + idx += 1; } - } - return idx; } - - function findParagraph(cm, head, repeat, dir, inclusive) { - var line = head.line; - var min = cm.firstLine(); - var max = cm.lastLine(); - var start, end, i = line; - function isEmpty(i) { return !/\S/.test(cm.getLine(i)); } // ace_patch - function isBoundary(i, dir, any) { - if (any) { return isEmpty(i) != isEmpty(i + dir); } + return idx; +} +function findParagraph(cm, head, repeat, dir, inclusive) { + var line = head.line; + var min = cm.firstLine(); + var max = cm.lastLine(); + var start, end, i = line; + function isEmpty(i) { return !/\S/.test(cm.getLine(i)); } // ace_patch + function isBoundary(i, dir, any) { + if (any) { + return isEmpty(i) != isEmpty(i + dir); + } return !isEmpty(i) && isEmpty(i + dir); - } - function skipFold(i) { - dir = dir > 0 ? 1 : -1; - var foldLine = cm.ace.session.getFoldLine(i); - if (foldLine) { - if (i + dir > foldLine.start.row && i + dir < foldLine.end.row) - dir = (dir > 0 ? foldLine.end.row : foldLine.start.row) - i; - } - } - if (dir) { + } + function skipFold(i) { + dir = dir > 0 ? 1 : -1; + var foldLine = cm.ace.session.getFoldLine(i); + if (foldLine) { + if (i + dir > foldLine.start.row && i + dir < foldLine.end.row) + dir = (dir > 0 ? foldLine.end.row : foldLine.start.row) - i; + } + } + if (dir) { while (min <= i && i <= max && repeat > 0) { - skipFold(i); - if (isBoundary(i, dir)) { repeat--; } - i += dir; + skipFold(i); + if (isBoundary(i, dir)) { + repeat--; + } + i += dir; } return new Pos(i, 0); - } - - var vim = cm.state.vim; - if (vim.visualLine && isBoundary(line, 1, true)) { + } + var vim = cm.state.vim; + if (vim.visualLine && isBoundary(line, 1, true)) { var anchor = vim.sel.anchor; if (isBoundary(anchor.line, -1, true)) { - if (!inclusive || anchor.line != line) { - line += 1; - } + if (!inclusive || anchor.line != line) { + line += 1; + } } - } - var startState = isEmpty(line); - for (i = line; i <= max && repeat; i++) { + } + var startState = isEmpty(line); + for (i = line; i <= max && repeat; i++) { if (isBoundary(i, 1, true)) { - if (!inclusive || isEmpty(i) != startState) { - repeat--; - } + if (!inclusive || isEmpty(i) != startState) { + repeat--; + } } - } - end = new Pos(i, 0); - if (i > max && !startState) { startState = true; } - else { inclusive = false; } - for (i = line; i > min; i--) { + } + end = new Pos(i, 0); + if (i > max && !startState) { + startState = true; + } + else { + inclusive = false; + } + for (i = line; i > min; i--) { if (!inclusive || isEmpty(i) == startState || i == line) { - if (isBoundary(i, -1, true)) { break; } + if (isBoundary(i, -1, true)) { + break; + } } - } - start = new Pos(i, 0); - return { start: start, end: end }; } - - function findSentence(cm, cur, repeat, dir) { - function nextChar(cm, idx) { + start = new Pos(i, 0); + return { start: start, end: end }; +} +function getSentence(cm, cur, repeat, dir, inclusive /*includes whitespace*/) { + function nextChar(curr) { + if (curr.pos + curr.dir < 0 || curr.pos + curr.dir >= curr.line.length) { + curr.line = null; + } + else { + curr.pos += curr.dir; + } + } + function forward(cm, ln, pos, dir) { + var line = cm.getLine(ln); + var curr = { + line: line, + ln: ln, + pos: pos, + dir: dir, + }; + if (curr.line === "") { + return { ln: curr.ln, pos: curr.pos }; + } + var lastSentencePos = curr.pos; + nextChar(curr); + while (curr.line !== null) { + lastSentencePos = curr.pos; + if (isEndOfSentenceSymbol(curr.line[curr.pos])) { + if (!inclusive) { + return { ln: curr.ln, pos: curr.pos + 1 }; + } + else { + nextChar(curr); + while (curr.line !== null) { + if (isWhiteSpaceString(curr.line[curr.pos])) { + lastSentencePos = curr.pos; + nextChar(curr); + } + else { + break; + } + } + return { ln: curr.ln, pos: lastSentencePos + 1 }; + } + } + nextChar(curr); + } + return { ln: curr.ln, pos: lastSentencePos + 1 }; + } + function reverse(cm, ln, pos, dir) { + var line = cm.getLine(ln); + var curr = { + line: line, + ln: ln, + pos: pos, + dir: dir, + }; + if (curr.line === "") { + return { ln: curr.ln, pos: curr.pos }; + } + var lastSentencePos = curr.pos; + nextChar(curr); + while (curr.line !== null) { + if (!isWhiteSpaceString(curr.line[curr.pos]) && !isEndOfSentenceSymbol(curr.line[curr.pos])) { + lastSentencePos = curr.pos; + } + else if (isEndOfSentenceSymbol(curr.line[curr.pos])) { + if (!inclusive) { + return { ln: curr.ln, pos: lastSentencePos }; + } + else { + if (isWhiteSpaceString(curr.line[curr.pos + 1])) { + return { ln: curr.ln, pos: curr.pos + 1 }; + } + else { + return { ln: curr.ln, pos: lastSentencePos }; + } + } + } + nextChar(curr); + } + curr.line = line; + if (inclusive && isWhiteSpaceString(curr.line[curr.pos])) { + return { ln: curr.ln, pos: curr.pos }; + } + else { + return { ln: curr.ln, pos: lastSentencePos }; + } + } + var curr_index = { + ln: cur.line, + pos: cur.ch, + }; + while (repeat > 0) { + if (dir < 0) { + curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir); + } + else { + curr_index = forward(cm, curr_index.ln, curr_index.pos, dir); + } + repeat--; + } + return new Pos(curr_index.ln, curr_index.pos); +} +function findSentence(cm, cur, repeat, dir) { + function nextChar(cm, idx) { if (idx.pos + idx.dir < 0 || idx.pos + idx.dir >= idx.line.length) { - idx.ln += idx.dir; - if (!isLine(cm, idx.ln)) { - idx.line = null; - idx.ln = null; - idx.pos = null; - return; - } - idx.line = cm.getLine(idx.ln); - idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1; + idx.ln += idx.dir; + if (!isLine(cm, idx.ln)) { + idx.line = null; + idx.ln = null; + idx.pos = null; + return; + } + idx.line = cm.getLine(idx.ln); + idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1; } else { - idx.pos += idx.dir; + idx.pos += idx.dir; } - } - function forward(cm, ln, pos, dir) { + } + function forward(cm, ln, pos, dir) { var line = cm.getLine(ln); var stop = (line === ""); - var curr = { - line: line, - ln: ln, - pos: pos, - dir: dir, - } - + line: line, + ln: ln, + pos: pos, + dir: dir, + }; var last_valid = { - ln: curr.ln, - pos: curr.pos, - } - + ln: curr.ln, + pos: curr.pos, + }; var skip_empty_lines = (curr.line === ""); nextChar(cm, curr); - while (curr.line !== null) { - last_valid.ln = curr.ln; - last_valid.pos = curr.pos; - - if (curr.line === "" && !skip_empty_lines) { - return { ln: curr.ln, pos: curr.pos, }; - } - else if (stop && curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { - return { ln: curr.ln, pos: curr.pos, }; - } - else if (isEndOfSentenceSymbol(curr.line[curr.pos]) - && !stop - && (curr.pos === curr.line.length - 1 - || isWhiteSpaceString(curr.line[curr.pos + 1]))) { - stop = true; - } - - nextChar(cm, curr); + last_valid.ln = curr.ln; + last_valid.pos = curr.pos; + if (curr.line === "" && !skip_empty_lines) { + return { ln: curr.ln, pos: curr.pos, }; + } + else if (stop && curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { + return { ln: curr.ln, pos: curr.pos, }; + } + else if (isEndOfSentenceSymbol(curr.line[curr.pos]) + && !stop + && (curr.pos === curr.line.length - 1 + || isWhiteSpaceString(curr.line[curr.pos + 1]))) { + stop = true; + } + nextChar(cm, curr); } var line = cm.getLine(last_valid.ln); last_valid.pos = 0; - for(var i = line.length - 1; i >= 0; --i) { - if (!isWhiteSpaceString(line[i])) { - last_valid.pos = i; - break; - } + for (var i = line.length - 1; i >= 0; --i) { + if (!isWhiteSpaceString(line[i])) { + last_valid.pos = i; + break; + } } - return last_valid; - - } - function reverse(cm, ln, pos, dir) { + } + function reverse(cm, ln, pos, dir) { var line = cm.getLine(ln); - var curr = { - line: line, - ln: ln, - pos: pos, - dir: dir, - } - + line: line, + ln: ln, + pos: pos, + dir: dir, + }; var last_valid = { - ln: curr.ln, - pos: null, + ln: curr.ln, + pos: null, }; - var skip_empty_lines = (curr.line === ""); nextChar(cm, curr); - while (curr.line !== null) { - - if (curr.line === "" && !skip_empty_lines) { - if (last_valid.pos !== null) { - return last_valid; + if (curr.line === "" && !skip_empty_lines) { + if (last_valid.pos !== null) { + return last_valid; + } + else { + return { ln: curr.ln, pos: curr.pos }; + } } - else { - return { ln: curr.ln, pos: curr.pos }; - } - } - else if (isEndOfSentenceSymbol(curr.line[curr.pos]) - && last_valid.pos !== null - && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) { - return last_valid; - } - else if (curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { - skip_empty_lines = false; - last_valid = { ln: curr.ln, pos: curr.pos } - } - - nextChar(cm, curr); + else if (isEndOfSentenceSymbol(curr.line[curr.pos]) + && last_valid.pos !== null + && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) { + return last_valid; + } + else if (curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { + skip_empty_lines = false; + last_valid = { ln: curr.ln, pos: curr.pos }; + } + nextChar(cm, curr); } var line = cm.getLine(last_valid.ln); last_valid.pos = 0; - for(var i = 0; i < line.length; ++i) { - if (!isWhiteSpaceString(line[i])) { - last_valid.pos = i; - break; - } + for (var i = 0; i < line.length; ++i) { + if (!isWhiteSpaceString(line[i])) { + last_valid.pos = i; + break; + } } return last_valid; - } - - var curr_index = { + } + var curr_index = { ln: cur.line, pos: cur.ch, - }; - - while (repeat > 0) { + }; + while (repeat > 0) { if (dir < 0) { - curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir); + curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir); } else { - curr_index = forward(cm, curr_index.ln, curr_index.pos, dir); + curr_index = forward(cm, curr_index.ln, curr_index.pos, dir); } repeat--; - } - - return new Pos(curr_index.ln, curr_index.pos); } - function selectCompanionObject(cm, head, symb, inclusive) { - var cur = head, start, end; - - var bracketRegexp = ({ + return new Pos(curr_index.ln, curr_index.pos); +} +function selectCompanionObject(cm, head, symb, inclusive) { + var cur = head, start, end; + var bracketRegexp = ({ '(': /[()]/, ')': /[()]/, '[': /[[\]]/, ']': /[[\]]/, '{': /[{}]/, '}': /[{}]/, - '<': /[<>]/, '>': /[<>]/})[symb]; - var openSym = ({ + '<': /[<>]/, '>': /[<>]/ + })[symb]; + var openSym = ({ '(': '(', ')': '(', '[': '[', ']': '[', '{': '{', '}': '{', - '<': '<', '>': '<'})[symb]; - var curChar = cm.getLine(cur.line).charAt(cur.ch); - var offset = curChar === openSym ? 1 : 0; - - start = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), -1, undefined, {'bracketRegex': bracketRegexp}); - end = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), 1, undefined, {'bracketRegex': bracketRegexp}); - - if (!start || !end) { - return { start: cur, end: cur }; - } - - start = start.pos; - end = end.pos; - - if ((start.line == end.line && start.ch > end.ch) - || (start.line > end.line)) { + '<': '<', '>': '<' + })[symb]; + var curChar = cm.getLine(cur.line).charAt(cur.ch); + var offset = curChar === openSym ? 1 : 0; + start = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), -1, undefined, { 'bracketRegex': bracketRegexp }); + end = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), 1, undefined, { 'bracketRegex': bracketRegexp }); + if (!start || !end) + return null; + start = start.pos; + end = end.pos; + if ((start.line == end.line && start.ch > end.ch) + || (start.line > end.line)) { var tmp = start; start = end; end = tmp; - } - - if (inclusive) { + } + if (inclusive) { end.ch += 1; - } else { + } + else { start.ch += 1; - } - - return { start: start, end: end }; - } - function findBeginningAndEnd(cm, head, symb, inclusive) { - var cur = copyCursor(head); - var line = cm.getLine(cur.line); - var chars = line.split(''); - var start, end, i, len; - var firstIndex = chars.indexOf(symb); - if (cur.ch < firstIndex) { + } + return { start: start, end: end }; +} +function findBeginningAndEnd(cm, head, symb, inclusive) { + var cur = copyCursor(head); + var line = cm.getLine(cur.line); + var chars = line.split(''); + var start, end, i, len; + var firstIndex = chars.indexOf(symb); + if (cur.ch < firstIndex) { cur.ch = firstIndex; - } - else if (firstIndex < cur.ch && chars[cur.ch] == symb) { - end = cur.ch; // assign end to the current cursor - --cur.ch; // make sure to look backwards - } - if (chars[cur.ch] == symb && !end) { + } + else if (firstIndex < cur.ch && chars[cur.ch] == symb) { + var stringAfter = /string/.test(cm.getTokenTypeAt(offsetCursor(head, 0, 1))); + var stringBefore = /string/.test(cm.getTokenTypeAt(head)); + var isStringStart = stringAfter && !stringBefore; + if (!isStringStart) { + end = cur.ch; // assign end to the current cursor + --cur.ch; // make sure to look backwards + } + } + if (chars[cur.ch] == symb && !end) { start = cur.ch + 1; // assign start to ahead of the cursor - } else { + } + else { for (i = cur.ch; i > -1 && !start; i--) { - if (chars[i] == symb) { - start = i + 1; - } + if (chars[i] == symb) { + start = i + 1; + } } - } - if (start && !end) { + } + if (start && !end) { for (i = start, len = chars.length; i < len && !end; i++) { - if (chars[i] == symb) { - end = i; - } + if (chars[i] == symb) { + end = i; + } } - } - if (!start || !end) { + } + if (!start || !end) { return { start: cur, end: cur }; - } - if (inclusive) { - --start; ++end; - } - - return { + } + if (inclusive) { + --start; + ++end; + } + return { start: new Pos(cur.line, start), end: new Pos(cur.line, end) - }; - } - defineOption('pcre', true, 'boolean'); - function SearchState() {} - SearchState.prototype = { - getQuery: function() { + }; +} +defineOption('pcre', true, 'boolean'); +function SearchState() { } +SearchState.prototype = { + getQuery: function () { return vimGlobalState.query; - }, - setQuery: function(query) { + }, + setQuery: function (query) { vimGlobalState.query = query; - }, - getOverlay: function() { + }, + getOverlay: function () { return this.searchOverlay; - }, - setOverlay: function(overlay) { + }, + setOverlay: function (overlay) { this.searchOverlay = overlay; - }, - isReversed: function() { + }, + isReversed: function () { return vimGlobalState.isReversed; - }, - setReversed: function(reversed) { + }, + setReversed: function (reversed) { vimGlobalState.isReversed = reversed; - }, - getScrollbarAnnotate: function() { + }, + getScrollbarAnnotate: function () { return this.annotate; - }, - setScrollbarAnnotate: function(annotate) { + }, + setScrollbarAnnotate: function (annotate) { this.annotate = annotate; - } - }; - function getSearchState(cm) { - var vim = cm.state.vim; - return vim.searchState_ || (vim.searchState_ = new SearchState()); - } - function splitBySlash(argString) { - return splitBySeparator(argString, '/'); - } - - function findUnescapedSlashes(argString) { - return findUnescapedSeparators(argString, '/'); } - - function splitBySeparator(argString, separator) { - var slashes = findUnescapedSeparators(argString, separator) || []; - if (!slashes.length) return []; - var tokens = []; - if (slashes[0] !== 0) return; - for (var i = 0; i < slashes.length; i++) { +}; +function getSearchState(cm) { + var vim = cm.state.vim; + return vim.searchState_ || (vim.searchState_ = new SearchState()); +} +function splitBySlash(argString) { + return splitBySeparator(argString, '/'); +} +function findUnescapedSlashes(argString) { + return findUnescapedSeparators(argString, '/'); +} +function splitBySeparator(argString, separator) { + var slashes = findUnescapedSeparators(argString, separator) || []; + if (!slashes.length) + return []; + var tokens = []; + if (slashes[0] !== 0) + return; + for (var i = 0; i < slashes.length; i++) { if (typeof slashes[i] == 'number') - tokens.push(argString.substring(slashes[i] + 1, slashes[i+1])); - } - return tokens; + tokens.push(argString.substring(slashes[i] + 1, slashes[i + 1])); } - - function findUnescapedSeparators(str, separator) { - if (!separator) + return tokens; +} +function findUnescapedSeparators(str, separator) { + if (!separator) separator = '/'; - - var escapeNextChar = false; - var slashes = []; - for (var i = 0; i < str.length; i++) { + var escapeNextChar = false; + var slashes = []; + for (var i = 0; i < str.length; i++) { var c = str.charAt(i); if (!escapeNextChar && c == separator) { - slashes.push(i); + slashes.push(i); } escapeNextChar = !escapeNextChar && (c == '\\'); - } - return slashes; - } - function translateRegex(str) { - var specials = '|(){'; - var unescape = '}'; - var escapeNextChar = false; - var out = []; - for (var i = -1; i < str.length; i++) { + } + return slashes; +} +function translateRegex(str) { + var specials = '|(){'; + var unescape = '}'; + var escapeNextChar = false; + var out = []; + for (var i = -1; i < str.length; i++) { var c = str.charAt(i) || ''; - var n = str.charAt(i+1) || ''; + var n = str.charAt(i + 1) || ''; var specialComesNext = (n && specials.indexOf(n) != -1); if (escapeNextChar) { - if (c !== '\\' || !specialComesNext) { - out.push(c); - } - escapeNextChar = false; - } else { - if (c === '\\') { - escapeNextChar = true; - if (n && unescape.indexOf(n) != -1) { - specialComesNext = true; - } - if (!specialComesNext || n === '\\') { - out.push(c); - } - } else { - out.push(c); - if (specialComesNext && n !== '\\') { - out.push('\\'); + if (c !== '\\' || !specialComesNext) { + out.push(c); + } + escapeNextChar = false; + } + else { + if (c === '\\') { + escapeNextChar = true; + if (n && unescape.indexOf(n) != -1) { + specialComesNext = true; + } + if (!specialComesNext || n === '\\') { + out.push(c); + } + } + else { + out.push(c); + if (specialComesNext && n !== '\\') { + out.push('\\'); + } } - } } - } - return out.join(''); } - var charUnescapes = {'\\n': '\n', '\\r': '\r', '\\t': '\t'}; - function translateRegexReplace(str) { - var escapeNextChar = false; - var out = []; - for (var i = -1; i < str.length; i++) { + return out.join(''); +} +var charUnescapes = { '\\n': '\n', '\\r': '\r', '\\t': '\t' }; +function translateRegexReplace(str) { + var escapeNextChar = false; + var out = []; + for (var i = -1; i < str.length; i++) { var c = str.charAt(i) || ''; - var n = str.charAt(i+1) || ''; + var n = str.charAt(i + 1) || ''; if (charUnescapes[c + n]) { - out.push(charUnescapes[c+n]); - i++; - } else if (escapeNextChar) { - out.push(c); - escapeNextChar = false; - } else { - if (c === '\\') { - escapeNextChar = true; - if ((isNumber(n) || n === '$')) { - out.push('$'); - } else if (n !== '/' && n !== '\\') { - out.push('\\'); - } - } else { - if (c === '$') { - out.push('$'); - } + out.push(charUnescapes[c + n]); + i++; + } + else if (escapeNextChar) { out.push(c); - if (n === '/') { - out.push('\\'); + escapeNextChar = false; + } + else { + if (c === '\\') { + escapeNextChar = true; + if ((isNumber(n) || n === '$')) { + out.push('$'); + } + else if (n !== '/' && n !== '\\') { + out.push('\\'); + } + } + else { + if (c === '$') { + out.push('$'); + } + out.push(c); + if (n === '/') { + out.push('\\'); + } } - } } - } - return out.join(''); } - var unescapes = {'\\/': '/', '\\\\': '\\', '\\n': '\n', '\\r': '\r', '\\t': '\t', '\\&':'&'}; - function unescapeRegexReplace(str) { - var stream = new CodeMirror.StringStream(str); - var output = []; - while (!stream.eol()) { + return out.join(''); +} +var unescapes = { '\\/': '/', '\\\\': '\\', '\\n': '\n', '\\r': '\r', '\\t': '\t', '\\&': '&' }; +function unescapeRegexReplace(str) { + var stream = new CodeMirror.StringStream(str); + var output = []; + while (!stream.eol()) { while (stream.peek() && stream.peek() != '\\') { - output.push(stream.next()); + output.push(stream.next()); } var matched = false; for (var matcher in unescapes) { - if (stream.match(matcher, true)) { - matched = true; - output.push(unescapes[matcher]); - break; - } + if (stream.match(matcher, true)) { + matched = true; + output.push(unescapes[matcher]); + break; + } } if (!matched) { - output.push(stream.next()); - } - } - return output.join(''); - } - function parseQuery(query, ignoreCase, smartCase) { - var lastSearchRegister = vimGlobalState.registerController.getRegister('/'); - lastSearchRegister.setText(query); - if (query instanceof RegExp) { return query; } - var slashes = findUnescapedSlashes(query); - var regexPart; - var forceIgnoreCase; - if (!slashes.length) { + output.push(stream.next()); + } + } + return output.join(''); +} +function parseQuery(query, ignoreCase, smartCase) { + var lastSearchRegister = vimGlobalState.registerController.getRegister('/'); + lastSearchRegister.setText(query); + if (query instanceof RegExp) { + return query; + } + var slashes = findUnescapedSlashes(query); + var regexPart; + var forceIgnoreCase; + if (!slashes.length) { regexPart = query; - } else { + } + else { regexPart = query.substring(0, slashes[0]); var flagsPart = query.substring(slashes[0]); forceIgnoreCase = (flagsPart.indexOf('i') != -1); - } - if (!regexPart) { + } + if (!regexPart) { return null; - } - if (!getOption('pcre')) { + } + if (!getOption('pcre')) { regexPart = translateRegex(regexPart); - } - if (smartCase) { + } + if (smartCase) { ignoreCase = (/^[^A-Z]*$/).test(regexPart); - } - var regexp = new RegExp(regexPart, - (ignoreCase || forceIgnoreCase) ? 'im' : 'm'); - return regexp; - } - function hdom(n) { - if (typeof n === 'string') n = document.createElement(n); - for (var a, i = 1; i < arguments.length; i++) { - if (!(a = arguments[i])) continue; - if (typeof a !== 'object') a = document.createTextNode(a); - if (a.nodeType) n.appendChild(a); - else for (var key in a) { - if (!Object.prototype.hasOwnProperty.call(a, key)) continue; - if (key[0] === '$') n.style[key.slice(1)] = a[key]; - else n.setAttribute(key, a[key]); - } - } - return n; } - - function showConfirm(cm, template) { - var pre = hdom('span', {$color: 'red', $whiteSpace: 'pre', class: 'cm-vim-message'}, template); //ace_patch span instead of pre - if (cm.openNotification) { - cm.openNotification(pre, {bottom: true, duration: 5000}); - } else { + var regexp = new RegExp(regexPart, (ignoreCase || forceIgnoreCase) ? 'im' : 'm'); + return regexp; +} +function dom(n) { + if (typeof n === 'string') + n = document.createElement(n); + for (var a, i = 1; i < arguments.length; i++) { + if (!(a = arguments[i])) + continue; + if (typeof a !== 'object') + a = document.createTextNode(a); + if (a.nodeType) + n.appendChild(a); + else + for (var key in a) { + if (!Object.prototype.hasOwnProperty.call(a, key)) + continue; + if (key[0] === '$') + n.style[key.slice(1)] = a[key]; + else + n.setAttribute(key, a[key]); + } + } + return n; +} +function showConfirm(cm, template) { + var pre = dom('div', { $color: 'red', $whiteSpace: 'pre', class: 'cm-vim-message' }, template); + if (cm.openNotification) { + cm.openNotification(pre, { bottom: true, duration: 5000 }); + } + else { alert(pre.innerText); - } } - - function makePrompt(prefix, desc) { - return hdom(document.createDocumentFragment(), - hdom('span', {$fontFamily: 'monospace', $whiteSpace: 'pre'}, - prefix, - hdom('input', {type: 'text', autocorrect: 'off', - autocapitalize: 'off', spellcheck: 'false'})), - desc && hdom('span', {$color: '#888'}, desc)); +} +function makePrompt(prefix, desc) { + return dom('div', { $display: 'flex' }, dom('span', { $fontFamily: 'monospace', $whiteSpace: 'pre', $flex: 1 }, prefix, dom('input', { type: 'text', autocorrect: 'off', + autocapitalize: 'off', spellcheck: 'false', $width: '100%' })), desc && dom('span', { $color: '#888' }, desc)); +} +function showPrompt(cm, options) { + if (keyToKeyStack.length) { + if (!options.value) + options.value = ''; + virtualPrompt = options; + return; } - - function showPrompt(cm, options) { - var template = makePrompt(options.prefix, options.desc); - if (cm.openDialog) { + var template = makePrompt(options.prefix, options.desc); + if (cm.openDialog) { cm.openDialog(template, options.onClose, { - onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp, - bottom: true, selectValueOnOpen: false, value: options.value + onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp, + bottom: true, selectValueOnOpen: false, value: options.value }); - } - else { + } + else { var shortText = ''; - if (typeof options.prefix != "string" && options.prefix) shortText += options.prefix.textContent; - if (options.desc) shortText += " " + options.desc; + if (typeof options.prefix != "string" && options.prefix) + shortText += options.prefix.textContent; + if (options.desc) + shortText += " " + options.desc; options.onClose(prompt(shortText, '')); - } } - - function regexEqual(r1, r2) { - if (r1 instanceof RegExp && r2 instanceof RegExp) { - var props = ['global', 'multiline', 'ignoreCase', 'source']; - for (var i = 0; i < props.length; i++) { - var prop = props[i]; - if (r1[prop] !== r2[prop]) { - return false; - } - } - return true; - } - return false; - } - function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) { - if (!rawQuery) { +} +function regexEqual(r1, r2) { + if (r1 instanceof RegExp && r2 instanceof RegExp) { + var props = ['global', 'multiline', 'ignoreCase', 'source']; + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + if (r1[prop] !== r2[prop]) { + return false; + } + } + return true; + } + return false; +} +function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) { + if (!rawQuery) { return; - } - var state = getSearchState(cm); - var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase); - if (!query) { + } + var state = getSearchState(cm); + var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase); + if (!query) { return; - } - highlightSearchMatches(cm, query); - if (regexEqual(query, state.getQuery())) { + } + highlightSearchMatches(cm, query); + if (regexEqual(query, state.getQuery())) { return query; - } - state.setQuery(query); - return query; } - function searchOverlay(query) { - if (query.source.charAt(0) == '^') { + state.setQuery(query); + return query; +} +function searchOverlay(query) { + if (query.source.charAt(0) == '^') { var matchSol = true; - } - return { - token: function(stream) { - if (matchSol && !stream.sol()) { - stream.skipToEnd(); - return; - } - var match = stream.match(query, false); - if (match) { - if (match[0].length == 0) { - stream.next(); - return 'searching'; - } - if (!stream.sol()) { - stream.backUp(1); - if (!query.exec(stream.next() + match[0])) { + } + return { + token: function (stream) { + if (matchSol && !stream.sol()) { + stream.skipToEnd(); + return; + } + var match = stream.match(query, false); + if (match) { + if (match[0].length == 0) { + stream.next(); + return 'searching'; + } + if (!stream.sol()) { + stream.backUp(1); + if (!query.exec(stream.next() + match[0])) { + stream.next(); + return null; + } + } + stream.match(query); + return 'searching'; + } + while (!stream.eol()) { stream.next(); - return null; - } - } - stream.match(query); - return 'searching'; - } - while (!stream.eol()) { - stream.next(); - if (stream.match(query, false)) break; - } + if (stream.match(query, false)) + break; + } }, query: query - }; - } - function highlightSearchMatches(cm, query) { - var searchState = getSearchState(cm); - var overlay = searchState.getOverlay(); - if (!overlay || query != overlay.query) { - if (overlay) { - cm.removeOverlay(overlay); - } - overlay = searchOverlay(query); - cm.addOverlay(overlay); - if (cm.showMatchesOnScrollbar) { - if (searchState.getScrollbarAnnotate()) { - searchState.getScrollbarAnnotate().clear(); - } - searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query)); - } - searchState.setOverlay(overlay); - } - } - function findNext(cm, prev, query, repeat) { - if (repeat === undefined) { repeat = 1; } - return cm.operation(function() { + }; +} +var highlightTimeout = 0; +function highlightSearchMatches(cm, query) { + clearTimeout(highlightTimeout); + var searchState = getSearchState(cm); + searchState.highlightTimeout = highlightTimeout; + highlightTimeout = setTimeout(function () { + if (!cm.state.vim) + return; + var searchState = getSearchState(cm); + searchState.highlightTimeout = null; + var overlay = searchState.getOverlay(); + if (!overlay || query != overlay.query) { + if (overlay) { + cm.removeOverlay(overlay); + } + overlay = searchOverlay(query); + cm.addOverlay(overlay); + if (cm.showMatchesOnScrollbar) { + if (searchState.getScrollbarAnnotate()) { + searchState.getScrollbarAnnotate().clear(); + } + searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query)); + } + searchState.setOverlay(overlay); + } + }, 50); +} +function findNext(cm, prev, query, repeat) { + if (repeat === undefined) { + repeat = 1; + } + return cm.operation(function () { var pos = cm.getCursor(); var cursor = cm.getSearchCursor(query, pos); for (var i = 0; i < repeat; i++) { - var found = cursor.find(prev); - if (i == 0 && found && cursorEqual(cursor.from(), pos)) { - var lastEndPos = prev ? cursor.from() : cursor.to(); - found = cursor.find(prev); - if (found && !found[0] && cursorEqual(cursor.from(), lastEndPos)) { - if (cm.getLine(lastEndPos.line).length == lastEndPos.ch) + var found = cursor.find(prev); + if (i == 0 && found && cursorEqual(cursor.from(), pos)) { + var lastEndPos = prev ? cursor.from() : cursor.to(); found = cursor.find(prev); + if (found && !found[0] && cursorEqual(cursor.from(), lastEndPos)) { + if (cm.getLine(lastEndPos.line).length == lastEndPos.ch) + found = cursor.find(prev); + } } - } - if (!found) { - cursor = cm.getSearchCursor(query, - (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) ); - if (!cursor.find(prev)) { - return; + if (!found) { + cursor = cm.getSearchCursor(query, (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0)); + if (!cursor.find(prev)) { + return; + } } - } } return cursor.from(); - }); + }); +} +function findNextFromAndToInclusive(cm, prev, query, repeat, vim) { + if (repeat === undefined) { + repeat = 1; } - function findNextFromAndToInclusive(cm, prev, query, repeat, vim) { - if (repeat === undefined) { repeat = 1; } - return cm.operation(function() { + return cm.operation(function () { var pos = cm.getCursor(); var cursor = cm.getSearchCursor(query, pos); var found = cursor.find(!prev); if (!vim.visualMode && found && cursorEqual(cursor.from(), pos)) { - cursor.find(!prev); + cursor.find(!prev); } - for (var i = 0; i < repeat; i++) { - found = cursor.find(prev); - if (!found) { - cursor = cm.getSearchCursor(query, - (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) ); - if (!cursor.find(prev)) { - return; + found = cursor.find(prev); + if (!found) { + cursor = cm.getSearchCursor(query, (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0)); + if (!cursor.find(prev)) { + return; + } } - } } return [cursor.from(), cursor.to()]; - }); - } - function clearSearchHighlight(cm) { - var state = getSearchState(cm); - cm.removeOverlay(getSearchState(cm).getOverlay()); - state.setOverlay(null); - if (state.getScrollbarAnnotate()) { + }); +} +function clearSearchHighlight(cm) { + var state = getSearchState(cm); + if (state.highlightTimeout) { + clearTimeout(state.highlightTimeout); + state.highlightTimeout = null; + } + cm.removeOverlay(getSearchState(cm).getOverlay()); + state.setOverlay(null); + if (state.getScrollbarAnnotate()) { state.getScrollbarAnnotate().clear(); state.setScrollbarAnnotate(null); - } } - function isInRange(pos, start, end) { - if (typeof pos != 'number') { +} +function isInRange(pos, start, end) { + if (typeof pos != 'number') { pos = pos.line; - } - if (start instanceof Array) { + } + if (start instanceof Array) { return inArray(pos, start); - } else { + } + else { if (typeof end == 'number') { - return (pos >= start && pos <= end); - } else { - return pos == start; + return (pos >= start && pos <= end); + } + else { + return pos == start; } - } } - function getUserVisibleLines(cm) { - var renderer = cm.ace.renderer; - return { +} +function getUserVisibleLines(cm) { + var renderer = cm.ace.renderer; + return { top: renderer.getFirstFullyVisibleRow(), bottom: renderer.getLastFullyVisibleRow() - } - } - - function getMarkPos(cm, vim, markName) { - if (markName == '\'' || markName == '`') { + }; +} +function getMarkPos(cm, vim, markName) { + if (markName == '\'' || markName == '`') { return vimGlobalState.jumpList.find(cm, -1) || new Pos(0, 0); - } else if (markName == '.') { + } + else if (markName == '.') { return getLastEditPos(cm); - } - - var mark = vim.marks[markName]; - return mark && mark.find(); } - - function getLastEditPos(cm) { - var undoManager = cm.ace.session.$undoManager; - if (undoManager && undoManager.$lastDelta) - return toCmPos(undoManager.$lastDelta.end); + var mark = vim.marks[markName]; + return mark && mark.find(); +} +function getLastEditPos(cm) { + if (cm.getLastEditEnd) { + return cm.getLastEditEnd(); } - - var ExCommandDispatcher = function() { - this.buildCommandMap_(); - }; - ExCommandDispatcher.prototype = { - processCommand: function(cm, input, opt_params) { + var done = cm.doc.history.done; + for (var i = done.length; i--;) { + if (done[i].changes) { + return copyCursor(done[i].changes[0].to); + } + } +} +var ExCommandDispatcher = function () { + this.buildCommandMap_(); +}; +ExCommandDispatcher.prototype = { + processCommand: function (cm, input, opt_params) { var that = this; cm.operation(function () { - cm.curOp.isVimOp = true; - that._processCommand(cm, input, opt_params); + cm.curOp.isVimOp = true; + that._processCommand(cm, input, opt_params); }); - }, - _processCommand: function(cm, input, opt_params) { + }, + _processCommand: function (cm, input, opt_params) { var vim = cm.state.vim; var commandHistoryRegister = vimGlobalState.registerController.getRegister(':'); var previousCommand = commandHistoryRegister.toString(); - if (vim.visualMode) { - exitVisualMode(cm); - } var inputStream = new CodeMirror.StringStream(input); commandHistoryRegister.setText(input); var params = opt_params || {}; params.input = input; try { - this.parseInput_(cm, inputStream, params); - } catch(e) { - showConfirm(cm, e.toString()); - throw e; + this.parseInput_(cm, inputStream, params); + } + catch (e) { + showConfirm(cm, e.toString()); + throw e; + } + if (vim.visualMode) { + exitVisualMode(cm); } var command; var commandName; if (!params.commandName) { - if (params.line !== undefined) { - commandName = 'move'; - } - } else { - command = this.matchCommand_(params.commandName); - if (command) { - commandName = command.name; - if (command.excludeFromCommandHistory) { - commandHistoryRegister.setText(previousCommand); - } - this.parseCommandArgs_(inputStream, params, command); - if (command.type == 'exToKey') { - for (var i = 0; i < command.toKeys.length; i++) { - vimApi.handleKey(cm, command.toKeys[i], 'mapping'); - } - return; - } else if (command.type == 'exToEx') { - this.processCommand(cm, command.toInput); - return; - } - } + if (params.line !== undefined) { + commandName = 'move'; + } + } + else { + command = this.matchCommand_(params.commandName); + if (command) { + commandName = command.name; + if (command.excludeFromCommandHistory) { + commandHistoryRegister.setText(previousCommand); + } + this.parseCommandArgs_(inputStream, params, command); + if (command.type == 'exToKey') { + doKeyToKey(cm, command.toKeys, command); + return; + } + else if (command.type == 'exToEx') { + this.processCommand(cm, command.toInput); + return; + } + } } if (!commandName) { - showConfirm(cm, 'Not an editor command ":' + input + '"'); - return; + showConfirm(cm, 'Not an editor command ":' + input + '"'); + return; } try { - exCommands[commandName](cm, params); - if ((!command || !command.possiblyAsync) && params.callback) { - params.callback(); - } - } catch(e) { - showConfirm(cm, e.toString()); - throw e; - } - }, - parseInput_: function(cm, inputStream, result) { + exCommands[commandName](cm, params); + if ((!command || !command.possiblyAsync) && params.callback) { + params.callback(); + } + } + catch (e) { + showConfirm(cm, e.toString()); + throw e; + } + }, + parseInput_: function (cm, inputStream, result) { inputStream.eatWhile(':'); if (inputStream.eat('%')) { - result.line = cm.firstLine(); - result.lineEnd = cm.lastLine(); - } else { - result.line = this.parseLineSpec_(cm, inputStream); - if (result.line !== undefined && inputStream.eat(',')) { - result.lineEnd = this.parseLineSpec_(cm, inputStream); - } + result.line = cm.firstLine(); + result.lineEnd = cm.lastLine(); + } + else { + result.line = this.parseLineSpec_(cm, inputStream); + if (result.line !== undefined && inputStream.eat(',')) { + result.lineEnd = this.parseLineSpec_(cm, inputStream); + } + } + if (result.line == undefined) { + if (cm.state.vim.visualMode) { + var pos = getMarkPos(cm, cm.state.vim, '<'); + result.selectionLine = pos && pos.line; + pos = getMarkPos(cm, cm.state.vim, '>'); + result.selectionLineEnd = pos && pos.line; + } + else { + result.selectionLine = cm.getCursor().line; + } + } + else { + result.selectionLine = result.line; + result.selectionLineEnd = result.lineEnd; } var commandMatch = inputStream.match(/^(\w+|!!|@@|[!#&*<=>@~])/); if (commandMatch) { - result.commandName = commandMatch[1]; - } else { - result.commandName = inputStream.match(/.*/)[0]; + result.commandName = commandMatch[1]; + } + else { + result.commandName = inputStream.match(/.*/)[0]; } - return result; - }, - parseLineSpec_: function(cm, inputStream) { + }, + parseLineSpec_: function (cm, inputStream) { var numberMatch = inputStream.match(/^(\d+)/); if (numberMatch) { - return parseInt(numberMatch[1], 10) - 1; + return parseInt(numberMatch[1], 10) - 1; } switch (inputStream.next()) { - case '.': - return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); - case '$': - return this.parseLineSpecOffset_(inputStream, cm.lastLine()); - case '\'': - var markName = inputStream.next(); - var markPos = getMarkPos(cm, cm.state.vim, markName); - if (!markPos) throw new Error('Mark not set'); - return this.parseLineSpecOffset_(inputStream, markPos.line); - case '-': - case '+': - inputStream.backUp(1); - return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); - default: - inputStream.backUp(1); - return undefined; - } - }, - parseLineSpecOffset_: function(inputStream, line) { + case '.': + return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); + case '$': + return this.parseLineSpecOffset_(inputStream, cm.lastLine()); + case '\'': + var markName = inputStream.next(); + var markPos = getMarkPos(cm, cm.state.vim, markName); + if (!markPos) + throw new Error('Mark not set'); + return this.parseLineSpecOffset_(inputStream, markPos.line); + case '-': + case '+': + inputStream.backUp(1); + return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); + default: + inputStream.backUp(1); + return undefined; + } + }, + parseLineSpecOffset_: function (inputStream, line) { var offsetMatch = inputStream.match(/^([+-])?(\d+)/); if (offsetMatch) { - var offset = parseInt(offsetMatch[2], 10); - if (offsetMatch[1] == "-") { - line -= offset; - } else { - line += offset; - } + var offset = parseInt(offsetMatch[2], 10); + if (offsetMatch[1] == "-") { + line -= offset; + } + else { + line += offset; + } } return line; - }, - parseCommandArgs_: function(inputStream, params, command) { + }, + parseCommandArgs_: function (inputStream, params, command) { if (inputStream.eol()) { - return; + return; } params.argString = inputStream.match(/.*/)[0]; var delim = command.argDelimiter || /\s+/; var args = trim(params.argString).split(delim); if (args.length && args[0]) { - params.args = args; + params.args = args; } - }, - matchCommand_: function(commandName) { + }, + matchCommand_: function (commandName) { for (var i = commandName.length; i > 0; i--) { - var prefix = commandName.substring(0, i); - if (this.commandMap_[prefix]) { - var command = this.commandMap_[prefix]; - if (command.name.indexOf(commandName) === 0) { - return command; + var prefix = commandName.substring(0, i); + if (this.commandMap_[prefix]) { + var command = this.commandMap_[prefix]; + if (command.name.indexOf(commandName) === 0) { + return command; + } } - } } return null; - }, - buildCommandMap_: function() { + }, + buildCommandMap_: function () { this.commandMap_ = {}; for (var i = 0; i < defaultExCommandMap.length; i++) { - var command = defaultExCommandMap[i]; - var key = command.shortName || command.name; - this.commandMap_[key] = command; + var command = defaultExCommandMap[i]; + var key = command.shortName || command.name; + this.commandMap_[key] = command; } - }, - map: function(lhs, rhs, ctx) { + }, + map: function (lhs, rhs, ctx, noremap) { if (lhs != ':' && lhs.charAt(0) == ':') { - if (ctx) { throw Error('Mode not supported for ex mappings'); } - var commandName = lhs.substring(1); - if (rhs != ':' && rhs.charAt(0) == ':') { - this.commandMap_[commandName] = { - name: commandName, - type: 'exToEx', - toInput: rhs.substring(1), - user: true - }; - } else { - this.commandMap_[commandName] = { - name: commandName, - type: 'exToKey', - toKeys: rhs, - user: true - }; - } - } else { - if (rhs != ':' && rhs.charAt(0) == ':') { - var mapping = { - keys: lhs, - type: 'keyToEx', - exArgs: { input: rhs.substring(1) } - }; - if (ctx) { mapping.context = ctx; } - defaultKeymap.unshift(mapping); - } else { + if (ctx) { + throw Error('Mode not supported for ex mappings'); + } + var commandName = lhs.substring(1); + if (rhs != ':' && rhs.charAt(0) == ':') { + this.commandMap_[commandName] = { + name: commandName, + type: 'exToEx', + toInput: rhs.substring(1), + user: true + }; + } + else { + this.commandMap_[commandName] = { + name: commandName, + type: 'exToKey', + toKeys: rhs, + user: true + }; + } + } + else { var mapping = { - keys: lhs, - type: 'keyToKey', - toKeys: rhs + keys: lhs, + type: 'keyToKey', + toKeys: rhs, + noremap: !!noremap }; - if (ctx) { mapping.context = ctx; } + if (ctx) { + mapping.context = ctx; + } defaultKeymap.unshift(mapping); - } } - }, - unmap: function(lhs, ctx) { + }, + unmap: function (lhs, ctx) { if (lhs != ':' && lhs.charAt(0) == ':') { - if (ctx) { throw Error('Mode not supported for ex mappings'); } - var commandName = lhs.substring(1); - if (this.commandMap_[commandName] && this.commandMap_[commandName].user) { - delete this.commandMap_[commandName]; - return true; - } - } else { - var keys = lhs; - for (var i = 0; i < defaultKeymap.length; i++) { - if (keys == defaultKeymap[i].keys - && defaultKeymap[i].context === ctx) { - defaultKeymap.splice(i, 1); - return true; - } - } - } - } - }; - - var exCommands = { - colorscheme: function(cm, params) { + if (ctx) { + throw Error('Mode not supported for ex mappings'); + } + var commandName = lhs.substring(1); + if (this.commandMap_[commandName] && this.commandMap_[commandName].user) { + delete this.commandMap_[commandName]; + return true; + } + } + else { + var keys = lhs; + for (var i = 0; i < defaultKeymap.length; i++) { + if (keys == defaultKeymap[i].keys + && defaultKeymap[i].context === ctx) { + defaultKeymap.splice(i, 1); + return true; + } + } + } + } +}; +var exCommands = { + colorscheme: function (cm, params) { if (!params.args || params.args.length < 1) { - showConfirm(cm, cm.getOption('theme')); - return; + showConfirm(cm, cm.getOption('theme')); + return; } cm.setOption('theme', params.args[0]); - }, - map: function(cm, params, ctx) { + }, + map: function (cm, params, ctx, defaultOnly) { var mapArgs = params.args; if (!mapArgs || mapArgs.length < 2) { - if (cm) { - showConfirm(cm, 'Invalid mapping: ' + params.input); - } - return; - } - exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx); - }, - imap: function(cm, params) { this.map(cm, params, 'insert'); }, - nmap: function(cm, params) { this.map(cm, params, 'normal'); }, - vmap: function(cm, params) { this.map(cm, params, 'visual'); }, - unmap: function(cm, params, ctx) { + if (cm) { + showConfirm(cm, 'Invalid mapping: ' + params.input); + } + return; + } + exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx, defaultOnly); + }, + imap: function (cm, params) { this.map(cm, params, 'insert'); }, + nmap: function (cm, params) { this.map(cm, params, 'normal'); }, + vmap: function (cm, params) { this.map(cm, params, 'visual'); }, + omap: function (cm, params) { this.map(cm, params, 'operatorPending'); }, + noremap: function (cm, params) { this.map(cm, params, undefined, true); }, + inoremap: function (cm, params) { this.map(cm, params, 'insert', true); }, + nnoremap: function (cm, params) { this.map(cm, params, 'normal', true); }, + vnoremap: function (cm, params) { this.map(cm, params, 'visual', true); }, + onoremap: function (cm, params) { this.map(cm, params, 'operatorPending', true); }, + unmap: function (cm, params, ctx) { var mapArgs = params.args; if (!mapArgs || mapArgs.length < 1 || !exCommandDispatcher.unmap(mapArgs[0], ctx)) { - if (cm) { - showConfirm(cm, 'No such mapping: ' + params.input); - } + if (cm) { + showConfirm(cm, 'No such mapping: ' + params.input); + } } - }, - move: function(cm, params) { + }, + mapclear: function (cm, params) { vimApi.mapclear(); }, + imapclear: function (cm, params) { vimApi.mapclear('insert'); }, + nmapclear: function (cm, params) { vimApi.mapclear('normal'); }, + vmapclear: function (cm, params) { vimApi.mapclear('visual'); }, + omapclear: function (cm, params) { vimApi.mapclear('operatorPending'); }, + move: function (cm, params) { commandDispatcher.processCommand(cm, cm.state.vim, { type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, - linewise: true }, - repeatOverride: params.line+1}); - }, - set: function(cm, params) { + linewise: true }, + repeatOverride: params.line + 1 + }); + }, + set: function (cm, params) { var setArgs = params.args; var setCfg = params.setCfg || {}; if (!setArgs || setArgs.length < 1) { - if (cm) { - showConfirm(cm, 'Invalid mapping: ' + params.input); - } - return; + if (cm) { + showConfirm(cm, 'Invalid mapping: ' + params.input); + } + return; } var expr = setArgs[0].split('='); var optionName = expr[0]; var value = expr[1]; var forceGet = false; - + var forceToggle = false; if (optionName.charAt(optionName.length - 1) == '?') { - if (value) { throw Error('Trailing characters: ' + params.argString); } - optionName = optionName.substring(0, optionName.length - 1); - forceGet = true; + if (value) { + throw Error('Trailing characters: ' + params.argString); + } + optionName = optionName.substring(0, optionName.length - 1); + forceGet = true; + } + else if (optionName.charAt(optionName.length - 1) == '!') { + optionName = optionName.substring(0, optionName.length - 1); + forceToggle = true; } if (value === undefined && optionName.substring(0, 2) == 'no') { - optionName = optionName.substring(2); - value = false; + optionName = optionName.substring(2); + value = false; } - var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean'; - if (optionIsBoolean && value == undefined) { - value = true; + if (optionIsBoolean) { + if (forceToggle) { + value = !getOption(optionName, cm, setCfg); + } + else if (value == undefined) { + value = true; + } } if (!optionIsBoolean && value === undefined || forceGet) { - var oldValue = getOption(optionName, cm, setCfg); - if (oldValue instanceof Error) { - showConfirm(cm, oldValue.message); - } else if (oldValue === true || oldValue === false) { - showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName); - } else { - showConfirm(cm, ' ' + optionName + '=' + oldValue); - } - } else { - var setOptionReturn = setOption(optionName, value, cm, setCfg); - if (setOptionReturn instanceof Error) { - showConfirm(cm, setOptionReturn.message); - } - } - }, - setlocal: function (cm, params) { - params.setCfg = {scope: 'local'}; + var oldValue = getOption(optionName, cm, setCfg); + if (oldValue instanceof Error) { + showConfirm(cm, oldValue.message); + } + else if (oldValue === true || oldValue === false) { + showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName); + } + else { + showConfirm(cm, ' ' + optionName + '=' + oldValue); + } + } + else { + var setOptionReturn = setOption(optionName, value, cm, setCfg); + if (setOptionReturn instanceof Error) { + showConfirm(cm, setOptionReturn.message); + } + } + }, + setlocal: function (cm, params) { + params.setCfg = { scope: 'local' }; this.set(cm, params); - }, - setglobal: function (cm, params) { - params.setCfg = {scope: 'global'}; + }, + setglobal: function (cm, params) { + params.setCfg = { scope: 'global' }; this.set(cm, params); - }, - registers: function(cm, params) { + }, + registers: function (cm, params) { var regArgs = params.args; var registers = vimGlobalState.registerController.registers; var regInfo = '----------Registers----------\n\n'; if (!regArgs) { - for (var registerName in registers) { - var text = registers[registerName].toString(); - if (text.length) { - regInfo += '"' + registerName + ' ' + text + '\n' - } - } - } else { - var registerName; - regArgs = regArgs.join(''); - for (var i = 0; i < regArgs.length; i++) { - registerName = regArgs.charAt(i); - if (!vimGlobalState.registerController.isValidRegister(registerName)) { - continue; - } - var register = registers[registerName] || new Register(); - regInfo += '"' + registerName + ' ' + register.toString() + '\n' - } + for (var registerName in registers) { + var text = registers[registerName].toString(); + if (text.length) { + regInfo += '"' + registerName + ' ' + text + '\n'; + } + } + } + else { + var registerName; + regArgs = regArgs.join(''); + for (var i = 0; i < regArgs.length; i++) { + registerName = regArgs.charAt(i); + if (!vimGlobalState.registerController.isValidRegister(registerName)) { + continue; + } + var register = registers[registerName] || new Register(); + regInfo += '"' + registerName + ' ' + register.toString() + '\n'; + } } showConfirm(cm, regInfo); - }, - sort: function(cm, params) { + }, + sort: function (cm, params) { var reverse, ignoreCase, unique, number, pattern; function parseArgs() { - if (params.argString) { - var args = new CodeMirror.StringStream(params.argString); - if (args.eat('!')) { reverse = true; } - if (args.eol()) { return; } - if (!args.eatSpace()) { return 'Invalid arguments'; } - var opts = args.match(/([dinuox]+)?\s*(\/.+\/)?\s*/); - if (!opts && !args.eol()) { return 'Invalid arguments'; } - if (opts[1]) { - ignoreCase = opts[1].indexOf('i') != -1; - unique = opts[1].indexOf('u') != -1; - var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1 && 1; - var hex = opts[1].indexOf('x') != -1 && 1; - var octal = opts[1].indexOf('o') != -1 && 1; - if (decimal + hex + octal > 1) { return 'Invalid arguments'; } - number = decimal && 'decimal' || hex && 'hex' || octal && 'octal'; - } - if (opts[2]) { - pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : ''); - } - } + if (params.argString) { + var args = new CodeMirror.StringStream(params.argString); + if (args.eat('!')) { + reverse = true; + } + if (args.eol()) { + return; + } + if (!args.eatSpace()) { + return 'Invalid arguments'; + } + var opts = args.match(/([dinuox]+)?\s*(\/.+\/)?\s*/); + if (!opts && !args.eol()) { + return 'Invalid arguments'; + } + if (opts[1]) { + ignoreCase = opts[1].indexOf('i') != -1; + unique = opts[1].indexOf('u') != -1; + var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1 && 1; + var hex = opts[1].indexOf('x') != -1 && 1; + var octal = opts[1].indexOf('o') != -1 && 1; + if (decimal + hex + octal > 1) { + return 'Invalid arguments'; + } + number = decimal && 'decimal' || hex && 'hex' || octal && 'octal'; + } + if (opts[2]) { + pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : ''); + } + } } var err = parseArgs(); if (err) { - showConfirm(cm, err + ': ' + params.argString); - return; + showConfirm(cm, err + ': ' + params.argString); + return; } var lineStart = params.line || cm.firstLine(); var lineEnd = params.lineEnd || params.line || cm.lastLine(); - if (lineStart == lineEnd) { return; } + if (lineStart == lineEnd) { + return; + } var curStart = new Pos(lineStart, 0); var curEnd = new Pos(lineEnd, lineLength(cm, lineEnd)); var text = cm.getRange(curStart, curEnd).split('\n'); var numberRegex = pattern ? pattern : - (number == 'decimal') ? /(-?)([\d]+)/ : - (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i : - (number == 'octal') ? /([0-7]+)/ : null; + (number == 'decimal') ? /(-?)([\d]+)/ : + (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i : + (number == 'octal') ? /([0-7]+)/ : null; var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null; var numPart = [], textPart = []; if (number || pattern) { - for (var i = 0; i < text.length; i++) { - var matchPart = pattern ? text[i].match(pattern) : null; - if (matchPart && matchPart[0] != '') { - numPart.push(matchPart); - } else if (!pattern && numberRegex.exec(text[i])) { - numPart.push(text[i]); - } else { - textPart.push(text[i]); - } - } - } else { - textPart = text; + for (var i = 0; i < text.length; i++) { + var matchPart = pattern ? text[i].match(pattern) : null; + if (matchPart && matchPart[0] != '') { + numPart.push(matchPart); + } + else if (!pattern && numberRegex.exec(text[i])) { + numPart.push(text[i]); + } + else { + textPart.push(text[i]); + } + } + } + else { + textPart = text; } function compareFn(a, b) { - if (reverse) { var tmp; tmp = a; a = b; b = tmp; } - if (ignoreCase) { a = a.toLowerCase(); b = b.toLowerCase(); } - var anum = number && numberRegex.exec(a); - var bnum = number && numberRegex.exec(b); - if (!anum) { return a < b ? -1 : 1; } - anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix); - bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix); - return anum - bnum; + if (reverse) { + var tmp; + tmp = a; + a = b; + b = tmp; + } + if (ignoreCase) { + a = a.toLowerCase(); + b = b.toLowerCase(); + } + var anum = number && numberRegex.exec(a); + var bnum = number && numberRegex.exec(b); + if (!anum) { + return a < b ? -1 : 1; + } + anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix); + bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix); + return anum - bnum; } function comparePatternFn(a, b) { - if (reverse) { var tmp; tmp = a; a = b; b = tmp; } - if (ignoreCase) { a[0] = a[0].toLowerCase(); b[0] = b[0].toLowerCase(); } - return (a[0] < b[0]) ? -1 : 1; + if (reverse) { + var tmp; + tmp = a; + a = b; + b = tmp; + } + if (ignoreCase) { + a[0] = a[0].toLowerCase(); + b[0] = b[0].toLowerCase(); + } + return (a[0] < b[0]) ? -1 : 1; } numPart.sort(pattern ? comparePatternFn : compareFn); if (pattern) { - for (var i = 0; i < numPart.length; i++) { - numPart[i] = numPart[i].input; - } - } else if (!number) { textPart.sort(compareFn); } + for (var i = 0; i < numPart.length; i++) { + numPart[i] = numPart[i].input; + } + } + else if (!number) { + textPart.sort(compareFn); + } text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart); if (unique) { // Remove duplicate lines - var textOld = text; - var lastLine; - text = []; - for (var i = 0; i < textOld.length; i++) { - if (textOld[i] != lastLine) { - text.push(textOld[i]); + var textOld = text; + var lastLine; + text = []; + for (var i = 0; i < textOld.length; i++) { + if (textOld[i] != lastLine) { + text.push(textOld[i]); + } + lastLine = textOld[i]; + } + } + cm.replaceRange(text.join('\n'), curStart, curEnd); + }, + vglobal: function (cm, params) { + this.global(cm, params); + }, + normal: function (cm, params) { + var argString = params.argString; + if (argString && argString[0] == '!') { + argString = argString.slice(1); + noremap = true; + } + argString = argString.trimStart(); + if (!argString) { + showConfirm(cm, 'Argument is required.'); + return; + } + var line = params.line; + if (typeof line == 'number') { + var lineEnd = isNaN(params.lineEnd) ? line : params.lineEnd; + for (var i = line; i <= lineEnd; i++) { + cm.setCursor(i, 0); + doKeyToKey(cm, params.argString.trimStart()); + if (cm.state.vim.insertMode) { + exitInsertMode(cm, true); + } } - lastLine = textOld[i]; - } } - cm.replaceRange(text.join('\n'), curStart, curEnd); - }, - vglobal: function(cm, params) { - this.global(cm, params); - }, - global: function(cm, params) { + else { + doKeyToKey(cm, params.argString.trimStart()); + if (cm.state.vim.insertMode) { + exitInsertMode(cm, true); + } + } + }, + global: function (cm, params) { var argString = params.argString; if (!argString) { - showConfirm(cm, 'Regular Expression missing from global'); - return; + showConfirm(cm, 'Regular Expression missing from global'); + return; } var inverted = params.commandName[0] === 'v'; + if (argString[0] === '!' && params.commandName[0] === 'g') { + inverted = true; + argString = argString.slice(1); + } var lineStart = (params.line !== undefined) ? params.line : cm.firstLine(); var lineEnd = params.lineEnd || params.line || cm.lastLine(); var tokens = splitBySlash(argString); var regexPart = argString, cmd; if (tokens.length) { - regexPart = tokens[0]; - cmd = tokens.slice(1, tokens.length).join('/'); + regexPart = tokens[0]; + cmd = tokens.slice(1, tokens.length).join('/'); } if (regexPart) { - try { - updateSearchQuery(cm, regexPart, true /** ignoreCase */, - true /** smartCase */); - } catch (e) { - showConfirm(cm, 'Invalid regex: ' + regexPart); - return; - } + try { + updateSearchQuery(cm, regexPart, true /** ignoreCase */, true /** smartCase */); + } + catch (e) { + showConfirm(cm, 'Invalid regex: ' + regexPart); + return; + } } var query = getSearchState(cm).getQuery(); var matchedLines = []; for (var i = lineStart; i <= lineEnd; i++) { - var line = cm.getLineHandle(i); - var matched = query.test(line.text); - if (matched !== inverted) { - matchedLines.push(cmd ? line : line.text); - } + var line = cm.getLine(i); + var matched = query.test(line); + if (matched !== inverted) { + matchedLines.push(cmd ? cm.getLineHandle(i) : line); + } } if (!cmd) { - showConfirm(cm, matchedLines.join('\n')); - return; + showConfirm(cm, matchedLines.join('\n')); + return; } var index = 0; - var nextCommand = function() { - if (index < matchedLines.length) { - var line = matchedLines[index++]; - var lineNum = cm.getLineNumber(line); - if (lineNum == null) { - nextCommand(); - return; - } - var command = (lineNum + 1) + cmd; - exCommandDispatcher.processCommand(cm, command, { - callback: nextCommand - }); - } + var nextCommand = function () { + if (index < matchedLines.length) { + var lineHandle = matchedLines[index++]; + var lineNum = cm.getLineNumber(lineHandle); + if (lineNum == null) { + nextCommand(); + return; + } + var command = (lineNum + 1) + cmd; + exCommandDispatcher.processCommand(cm, command, { + callback: nextCommand + }); + } + else if (cm.releaseLineHandles) { + cm.releaseLineHandles(); + } }; nextCommand(); - }, - substitute: function(cm, params) { + }, + substitute: function (cm, params) { if (!cm.getSearchCursor) { - throw new Error('Search feature not available. Requires searchcursor.js or ' + - 'any other getSearchCursor implementation.'); + throw new Error('Search feature not available. Requires searchcursor.js or ' + + 'any other getSearchCursor implementation.'); } var argString = params.argString; var tokens = argString ? splitBySeparator(argString, argString[0]) : []; @@ -5423,157 +6173,173 @@ dom.importCssString(".normal-mode .ace_cursor{\ var confirm = false; // Whether to confirm each replace. var global = false; // True to replace all instances on a line, false to replace only 1. if (tokens.length) { - regexPart = tokens[0]; - if (getOption('pcre') && regexPart !== '') { - regexPart = new RegExp(regexPart).source; //normalize not escaped characters - } - replacePart = tokens[1]; - if (replacePart !== undefined) { - if (getOption('pcre')) { - replacePart = unescapeRegexReplace(replacePart.replace(/([^\\])&/g,"$1$$&")); - } else { - replacePart = translateRegexReplace(replacePart); - } - vimGlobalState.lastSubstituteReplacePart = replacePart; - } - trailing = tokens[2] ? tokens[2].split(' ') : []; - } else { - if (argString && argString.length) { - showConfirm(cm, 'Substitutions should be of the form ' + - ':s/pattern/replace/'); - return; - } - } - if (trailing) { - flagsPart = trailing[0]; - count = parseInt(trailing[1]); - if (flagsPart) { - if (flagsPart.indexOf('c') != -1) { - confirm = true; + regexPart = tokens[0]; + if (getOption('pcre') && regexPart !== '') { + regexPart = new RegExp(regexPart).source; //normalize not escaped characters + } + replacePart = tokens[1]; + if (replacePart !== undefined) { + if (getOption('pcre')) { + replacePart = unescapeRegexReplace(replacePart.replace(/([^\\])&/g, "$1$$&")); + } + else { + replacePart = translateRegexReplace(replacePart); + } + vimGlobalState.lastSubstituteReplacePart = replacePart; } - if (flagsPart.indexOf('g') != -1) { - global = true; + trailing = tokens[2] ? tokens[2].split(' ') : []; + } + else { + if (argString && argString.length) { + showConfirm(cm, 'Substitutions should be of the form ' + + ':s/pattern/replace/'); + return; } - if (getOption('pcre')) { - regexPart = regexPart + '/' + flagsPart; - } else { - regexPart = regexPart.replace(/\//g, "\\/") + '/' + flagsPart; + } + if (trailing) { + flagsPart = trailing[0]; + count = parseInt(trailing[1]); + if (flagsPart) { + if (flagsPart.indexOf('c') != -1) { + confirm = true; + } + if (flagsPart.indexOf('g') != -1) { + global = true; + } + if (getOption('pcre')) { + regexPart = regexPart + '/' + flagsPart; + } + else { + regexPart = regexPart.replace(/\//g, "\\/") + '/' + flagsPart; + } } - } } if (regexPart) { - try { - updateSearchQuery(cm, regexPart, true /** ignoreCase */, - true /** smartCase */); - } catch (e) { - showConfirm(cm, 'Invalid regex: ' + regexPart); - return; - } + try { + updateSearchQuery(cm, regexPart, true /** ignoreCase */, true /** smartCase */); + } + catch (e) { + showConfirm(cm, 'Invalid regex: ' + regexPart); + return; + } } replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart; if (replacePart === undefined) { - showConfirm(cm, 'No previous substitute regular expression'); - return; + showConfirm(cm, 'No previous substitute regular expression'); + return; } var state = getSearchState(cm); var query = state.getQuery(); var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line; var lineEnd = params.lineEnd || lineStart; if (lineStart == cm.firstLine() && lineEnd == cm.lastLine()) { - lineEnd = Infinity; + lineEnd = Infinity; } if (count) { - lineStart = lineEnd; - lineEnd = lineStart + count - 1; + lineStart = lineEnd; + lineEnd = lineStart + count - 1; } var startPos = clipCursorToContent(cm, new Pos(lineStart, 0)); var cursor = cm.getSearchCursor(query, startPos); doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback); - }, - redo: CodeMirror.commands.redo, - undo: CodeMirror.commands.undo, - write: function(cm) { + }, + startinsert: function (cm, params) { + doKeyToKey(cm, params.argString == '!' ? 'A' : 'i', {}); + }, + redo: CodeMirror.commands.redo, + undo: CodeMirror.commands.undo, + write: function (cm) { if (CodeMirror.commands.save) { - CodeMirror.commands.save(cm); - } else if (cm.save) { - cm.save(); + CodeMirror.commands.save(cm); + } + else if (cm.save) { + cm.save(); } - }, - nohlsearch: function(cm) { + }, + nohlsearch: function (cm) { clearSearchHighlight(cm); - }, - yank: function (cm) { + }, + yank: function (cm) { var cur = copyCursor(cm.getCursor()); var line = cur.line; var lineText = cm.getLine(line); - vimGlobalState.registerController.pushText( - '0', 'yank', lineText, true, true); - }, - delmarks: function(cm, params) { + vimGlobalState.registerController.pushText('0', 'yank', lineText, true, true); + }, + delete: function (cm, params) { + var line = params.selectionLine; + var lineEnd = isNaN(params.selectionLineEnd) ? line : params.selectionLineEnd; + operators.delete(cm, { linewise: true }, [ + { anchor: new Pos(line, 0), + head: new Pos(lineEnd + 1, 0) } + ]); + }, + join: function (cm, params) { + var line = params.selectionLine; + var lineEnd = isNaN(params.selectionLineEnd) ? line : params.selectionLineEnd; + cm.setCursor(new Pos(line, 0)); + actions.joinLines(cm, { repeat: lineEnd - line }, cm.state.vim); + }, + delmarks: function (cm, params) { if (!params.argString || !trim(params.argString)) { - showConfirm(cm, 'Argument required'); - return; + showConfirm(cm, 'Argument required'); + return; } - var state = cm.state.vim; var stream = new CodeMirror.StringStream(trim(params.argString)); while (!stream.eol()) { - stream.eatSpace(); - var count = stream.pos; - - if (!stream.match(/[a-zA-Z]/, false)) { - showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); - return; - } - - var sym = stream.next(); - if (stream.match('-', true)) { + stream.eatSpace(); + var count = stream.pos; if (!stream.match(/[a-zA-Z]/, false)) { - showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); - return; - } - - var startMark = sym; - var finishMark = stream.next(); - if (isLowerCase(startMark) && isLowerCase(finishMark) || - isUpperCase(startMark) && isUpperCase(finishMark)) { - var start = startMark.charCodeAt(0); - var finish = finishMark.charCodeAt(0); - if (start >= finish) { showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); return; - } - for (var j = 0; j <= finish - start; j++) { - var mark = String.fromCharCode(start + j); - delete state.marks[mark]; - } - } else { - showConfirm(cm, 'Invalid argument: ' + startMark + '-'); - return; - } - } else { - delete state.marks[sym]; - } - } - } - }; - - var exCommandDispatcher = new ExCommandDispatcher(); - function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query, - replaceWith, callback) { - cm.state.vim.exMode = true; - var done = false; - var lastPos, modifiedLineNumber, joined; - function replaceAll() { - cm.operation(function() { - while (!done) { - replace(); - next(); - } - stop(); + } + var sym = stream.next(); + if (stream.match('-', true)) { + if (!stream.match(/[a-zA-Z]/, false)) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + var startMark = sym; + var finishMark = stream.next(); + if (isLowerCase(startMark) && isLowerCase(finishMark) || + isUpperCase(startMark) && isUpperCase(finishMark)) { + var start = startMark.charCodeAt(0); + var finish = finishMark.charCodeAt(0); + if (start >= finish) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + for (var j = 0; j <= finish - start; j++) { + var mark = String.fromCharCode(start + j); + delete state.marks[mark]; + } + } + else { + showConfirm(cm, 'Invalid argument: ' + startMark + '-'); + return; + } + } + else { + delete state.marks[sym]; + } + } + } +}; +var exCommandDispatcher = new ExCommandDispatcher(); +function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query, replaceWith, callback) { + cm.state.vim.exMode = true; + var done = false; + var lastPos, modifiedLineNumber, joined; + function replaceAll() { + cm.operation(function () { + while (!done) { + replace(); + next(); + } + stop(); }); - } - function replace() { + } + function replace() { var text = cm.getRange(searchCursor.from(), searchCursor.to()); var newText = text.replace(query, replaceWith); var unmodifiedLineNumber = searchCursor.to().line; @@ -5581,698 +6347,750 @@ dom.importCssString(".normal-mode .ace_cursor{\ modifiedLineNumber = searchCursor.to().line; lineEnd += modifiedLineNumber - unmodifiedLineNumber; joined = modifiedLineNumber < unmodifiedLineNumber; - } - function findNextValidMatch() { + } + function findNextValidMatch() { var lastMatchTo = lastPos && copyCursor(searchCursor.to()); var match = searchCursor.findNext(); if (match && !match[0] && lastMatchTo && cursorEqual(searchCursor.from(), lastMatchTo)) { - match = searchCursor.findNext(); + match = searchCursor.findNext(); } return match; - } - function next() { - while(findNextValidMatch() && - isInRange(searchCursor.from(), lineStart, lineEnd)) { - if (!global && searchCursor.from().line == modifiedLineNumber && !joined) { - continue; - } - cm.scrollIntoView(searchCursor.from(), 30); - cm.setSelection(searchCursor.from(), searchCursor.to()); - lastPos = searchCursor.from(); - done = false; - return; + } + function next() { + while (findNextValidMatch() && + isInRange(searchCursor.from(), lineStart, lineEnd)) { + if (!global && searchCursor.from().line == modifiedLineNumber && !joined) { + continue; + } + cm.scrollIntoView(searchCursor.from(), 30); + cm.setSelection(searchCursor.from(), searchCursor.to()); + lastPos = searchCursor.from(); + done = false; + return; } done = true; - } - function stop(close) { - if (close) { close(); } + } + function stop(close) { + if (close) { + close(); + } cm.focus(); if (lastPos) { - cm.setCursor(lastPos); - var vim = cm.state.vim; - vim.exMode = false; - vim.lastHPos = vim.lastHSPos = lastPos.ch; - } - if (callback) { callback(); } - } - function onPromptKeyDown(e, _value, close) { + cm.setCursor(lastPos); + var vim = cm.state.vim; + vim.exMode = false; + vim.lastHPos = vim.lastHSPos = lastPos.ch; + } + if (callback) { + callback(); + } + } + function onPromptKeyDown(e, _value, close) { CodeMirror.e_stop(e); - var keyName = CodeMirror.keyName(e); + var keyName = vimKeyFromEvent(e); switch (keyName) { - case 'Y': - replace(); next(); break; - case 'N': - next(); break; - case 'A': - var savedCallback = callback; - callback = undefined; - cm.operation(replaceAll); - callback = savedCallback; - break; - case 'L': - replace(); - case 'Q': - case 'Esc': - case 'Ctrl-C': - case 'Ctrl-[': + case 'y': + replace(); + next(); + break; + case 'n': + next(); + break; + case 'a': + var savedCallback = callback; + callback = undefined; + cm.operation(replaceAll); + callback = savedCallback; + break; + case 'l': + replace(); + case 'q': + case '': + case '': + case '': + stop(close); + break; + } + if (done) { stop(close); - break; } - if (done) { stop(close); } return true; - } - next(); - if (done) { + } + next(); + if (done) { showConfirm(cm, 'No matches for ' + query.source); return; - } - if (!confirm) { + } + if (!confirm) { replaceAll(); - if (callback) { callback(); } + if (callback) { + callback(); + } return; - } - showPrompt(cm, { - prefix: hdom('span', 'replace with ', hdom('strong', replaceWith), ' (y/n/a/q/l)'), - onKeyDown: onPromptKeyDown - }); } - - CodeMirror.keyMap.vim = { - attach: attachVimMap, - detach: detachVimMap, - call: cmKey - }; - - function exitInsertMode(cm) { - var vim = cm.state.vim; - var macroModeState = vimGlobalState.macroModeState; - var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.'); - var isPlaying = macroModeState.isPlaying; - var lastChange = macroModeState.lastInsertModeChanges; - if (!isPlaying) { + showPrompt(cm, { + prefix: dom('span', 'replace with ', dom('strong', replaceWith), ' (y/n/a/q/l)'), + onKeyDown: onPromptKeyDown + }); +} +function exitInsertMode(cm, keepCursor) { + var vim = cm.state.vim; + var macroModeState = vimGlobalState.macroModeState; + var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.'); + var isPlaying = macroModeState.isPlaying; + var lastChange = macroModeState.lastInsertModeChanges; + if (!isPlaying) { cm.off('change', onChange); + if (vim.insertEnd) + vim.insertEnd.clear(); + vim.insertEnd = null; CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); - } - if (!isPlaying && vim.insertModeRepeat > 1) { - repeatLastEdit(cm, vim, vim.insertModeRepeat - 1, - true /** repeatForInsert */); + } + if (!isPlaying && vim.insertModeRepeat > 1) { + repeatLastEdit(cm, vim, vim.insertModeRepeat - 1, true /** repeatForInsert */); vim.lastEditInputState.repeatOverride = vim.insertModeRepeat; - } - delete vim.insertModeRepeat; - vim.insertMode = false; - cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1); - cm.setOption('keyMap', 'vim'); - cm.setOption('disableInput', true); - cm.toggleOverwrite(false); // exit replace mode if we were in it. - insertModeChangeRegister.setText(lastChange.changes.join('')); - CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); - if (macroModeState.isRecording) { - logInsertModeChange(macroModeState); - } } - - function _mapCommand(command) { - defaultKeymap.unshift(command); + delete vim.insertModeRepeat; + vim.insertMode = false; + if (!keepCursor) { + cm.setCursor(cm.getCursor().line, cm.getCursor().ch - 1); + } + cm.setOption('keyMap', 'vim'); + cm.setOption('disableInput', true); + cm.toggleOverwrite(false); // exit replace mode if we were in it. + insertModeChangeRegister.setText(lastChange.changes.join('')); + CodeMirror.signal(cm, "vim-mode-change", { mode: "normal" }); + if (macroModeState.isRecording) { + logInsertModeChange(macroModeState); } - - function mapCommand(keys, type, name, args, extra) { - var command = {keys: keys, type: type}; - command[type] = name; - command[type + "Args"] = args; - for (var key in extra) +} +function _mapCommand(command) { + defaultKeymap.unshift(command); +} +function mapCommand(keys, type, name, args, extra) { + var command = { keys: keys, type: type }; + command[type] = name; + command[type + "Args"] = args; + for (var key in extra) command[key] = extra[key]; - _mapCommand(command); - } - defineOption('insertModeEscKeysTimeout', 200, 'number'); - - CodeMirror.keyMap['vim-insert'] = { - fallthrough: ['default'], - attach: attachVimMap, - detach: detachVimMap, - call: cmKey - }; - - CodeMirror.keyMap['vim-replace'] = { - 'Backspace': 'goCharLeft', - fallthrough: ['vim-insert'], - attach: attachVimMap, - detach: detachVimMap, - call: cmKey - }; - - function executeMacroRegister(cm, vim, macroModeState, registerName) { - var register = vimGlobalState.registerController.getRegister(registerName); - if (registerName == ':') { + _mapCommand(command); +} +defineOption('insertModeEscKeysTimeout', 200, 'number'); +function executeMacroRegister(cm, vim, macroModeState, registerName) { + var register = vimGlobalState.registerController.getRegister(registerName); + if (registerName == ':') { if (register.keyBuffer[0]) { - exCommandDispatcher.processCommand(cm, register.keyBuffer[0]); + exCommandDispatcher.processCommand(cm, register.keyBuffer[0]); } macroModeState.isPlaying = false; return; - } - var keyBuffer = register.keyBuffer; - var imc = 0; - macroModeState.isPlaying = true; - macroModeState.replaySearchQueries = register.searchQueries.slice(0); - for (var i = 0; i < keyBuffer.length; i++) { + } + var keyBuffer = register.keyBuffer; + var imc = 0; + macroModeState.isPlaying = true; + macroModeState.replaySearchQueries = register.searchQueries.slice(0); + for (var i = 0; i < keyBuffer.length; i++) { var text = keyBuffer[i]; var match, key; while (text) { - match = (/<\w+-.+?>|<\w+>|./).exec(text); - key = match[0]; - text = text.substring(match.index + key.length); - vimApi.handleKey(cm, key, 'macro'); - if (vim.insertMode) { - var changes = register.insertModeChanges[imc++].changes; - vimGlobalState.macroModeState.lastInsertModeChanges.changes = - changes; - repeatInsertModeChanges(cm, changes, 1); - exitInsertMode(cm); - } - } - } - macroModeState.isPlaying = false; + match = (/<\w+-.+?>|<\w+>|./).exec(text); + key = match[0]; + text = text.substring(match.index + key.length); + vimApi.handleKey(cm, key, 'macro'); + if (vim.insertMode) { + var changes = register.insertModeChanges[imc++].changes; + vimGlobalState.macroModeState.lastInsertModeChanges.changes = + changes; + repeatInsertModeChanges(cm, changes, 1); + exitInsertMode(cm); + } + } } - - function logKey(macroModeState, key) { - if (macroModeState.isPlaying) { return; } - var registerName = macroModeState.latestRegister; - var register = vimGlobalState.registerController.getRegister(registerName); - if (register) { + macroModeState.isPlaying = false; +} +function logKey(macroModeState, key) { + if (macroModeState.isPlaying) { + return; + } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register) { register.pushText(key); - } } - - function logInsertModeChange(macroModeState) { - if (macroModeState.isPlaying) { return; } - var registerName = macroModeState.latestRegister; - var register = vimGlobalState.registerController.getRegister(registerName); - if (register && register.pushInsertModeChanges) { +} +function logInsertModeChange(macroModeState) { + if (macroModeState.isPlaying) { + return; + } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register && register.pushInsertModeChanges) { register.pushInsertModeChanges(macroModeState.lastInsertModeChanges); - } } - - function logSearchQuery(macroModeState, query) { - if (macroModeState.isPlaying) { return; } - var registerName = macroModeState.latestRegister; - var register = vimGlobalState.registerController.getRegister(registerName); - if (register && register.pushSearchQuery) { +} +function logSearchQuery(macroModeState, query) { + if (macroModeState.isPlaying) { + return; + } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register && register.pushSearchQuery) { register.pushSearchQuery(query); - } - } - function onChange(cm, changeObj) { - var macroModeState = vimGlobalState.macroModeState; - var lastChange = macroModeState.lastInsertModeChanges; - if (!macroModeState.isPlaying) { - while(changeObj) { - lastChange.expectCursorActivityForChange = true; - if (lastChange.ignoreCount > 1) { - lastChange.ignoreCount--; - } else if (changeObj.origin == '+input' || changeObj.origin == 'paste' - || changeObj.origin === undefined /* only in testing */) { - var selectionCount = cm.listSelections().length; - if (selectionCount > 1) - lastChange.ignoreCount = selectionCount; - var text = changeObj.text.join('\n'); - if (lastChange.maybeReset) { - lastChange.changes = []; - lastChange.maybeReset = false; - } - if (text) { - if (cm.state.overwrite && !/\n/.test(text)) { - lastChange.changes.push([text]); - } else { - lastChange.changes.push(text); - } - } - } - changeObj = changeObj.next; - } - } - } - function onCursorActivity(cm) { - var vim = cm.state.vim; - if (vim.insertMode) { + } +} +function onChange(cm, changeObj) { + var macroModeState = vimGlobalState.macroModeState; + var lastChange = macroModeState.lastInsertModeChanges; + if (!macroModeState.isPlaying) { + var vim = cm.state.vim; + while (changeObj) { + lastChange.expectCursorActivityForChange = true; + if (lastChange.ignoreCount > 1) { + lastChange.ignoreCount--; + } + else if (changeObj.origin == '+input' || changeObj.origin == 'paste' + || changeObj.origin === undefined /* only in testing */) { + var selectionCount = cm.listSelections().length; + if (selectionCount > 1) + lastChange.ignoreCount = selectionCount; + var text = changeObj.text.join('\n'); + if (lastChange.maybeReset) { + lastChange.changes = []; + lastChange.maybeReset = false; + } + if (text) { + if (cm.state.overwrite && !/\n/.test(text)) { + lastChange.changes.push([text]); + } + else { + if (text.length > 1) { + var insertEnd = vim && vim.insertEnd && vim.insertEnd.find(); + var cursor = cm.getCursor(); + if (insertEnd && insertEnd.line == cursor.line) { + var offset = insertEnd.ch - cursor.ch; + if (offset > 0 && offset < text.length) { + lastChange.changes.push([text, offset]); + text = ''; + } + } + } + if (text) + lastChange.changes.push(text); + } + } + } + changeObj = changeObj.next; + } + } +} +function onCursorActivity(cm) { + var vim = cm.state.vim; + if (vim.insertMode) { var macroModeState = vimGlobalState.macroModeState; - if (macroModeState.isPlaying) { return; } + if (macroModeState.isPlaying) { + return; + } var lastChange = macroModeState.lastInsertModeChanges; if (lastChange.expectCursorActivityForChange) { - lastChange.expectCursorActivityForChange = false; - } else { - lastChange.maybeReset = true; + lastChange.expectCursorActivityForChange = false; + } + else { + lastChange.maybeReset = true; + if (vim.insertEnd) + vim.insertEnd.clear(); + vim.insertEnd = cm.setBookmark(cm.getCursor(), { insertLeft: true }); } - } else if (!cm.curOp.isVimOp) { + } + else if (!cm.curOp.isVimOp) { handleExternalSelection(cm, vim); - } } - function handleExternalSelection(cm, vim, keepHPos) { - var anchor = cm.getCursor('anchor'); - var head = cm.getCursor('head'); - if (vim.visualMode && !cm.somethingSelected()) { +} +function handleExternalSelection(cm, vim, keepHPos) { + var anchor = cm.getCursor('anchor'); + var head = cm.getCursor('head'); + if (vim.visualMode && !cm.somethingSelected()) { exitVisualMode(cm, false); - } else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) { + } + else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) { vim.visualMode = true; vim.visualLine = false; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual"}); - } - if (vim.visualMode) { + CodeMirror.signal(cm, "vim-mode-change", { mode: "visual" }); + } + if (vim.visualMode) { var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; head = offsetCursor(head, 0, headOffset); anchor = offsetCursor(anchor, 0, anchorOffset); vim.sel = { - anchor: anchor, - head: head + anchor: anchor, + head: head }; updateMark(cm, vim, '<', cursorMin(head, anchor)); updateMark(cm, vim, '>', cursorMax(head, anchor)); - } else if (!vim.insertMode && !keepHPos) { + } + else if (!vim.insertMode && !keepHPos) { vim.lastHPos = cm.getCursor().ch; - } } - function InsertModeKey(keyName) { - this.keyName = keyName; +} +function InsertModeKey(keyName, e) { + this.keyName = keyName; + this.key = e.key; + this.ctrlKey = e.ctrlKey; + this.altKey = e.altKey; + this.metaKey = e.metaKey; + this.shiftKey = e.shiftKey; +} +function onKeyEventTargetKeyDown(e) { + var macroModeState = vimGlobalState.macroModeState; + var lastChange = macroModeState.lastInsertModeChanges; + var keyName = CodeMirror.keyName ? CodeMirror.keyName(e) : e.key; + if (!keyName) { + return; } - function onKeyEventTargetKeyDown(e) { - var macroModeState = vimGlobalState.macroModeState; - var lastChange = macroModeState.lastInsertModeChanges; - var keyName = CodeMirror.keyName(e); - if (!keyName) { return; } - function onKeyFound() { + if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) { if (lastChange.maybeReset) { - lastChange.changes = []; - lastChange.maybeReset = false; + lastChange.changes = []; + lastChange.maybeReset = false; } - lastChange.changes.push(new InsertModeKey(keyName)); - return true; - } - if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) { - CodeMirror.lookupKey(keyName, 'vim-insert', onKeyFound); - } - } - function repeatLastEdit(cm, vim, repeat, repeatForInsert) { - var macroModeState = vimGlobalState.macroModeState; - macroModeState.isPlaying = true; - var isAction = !!vim.lastEditActionCommand; - var cachedInputState = vim.inputState; - function repeatCommand() { + lastChange.changes.push(new InsertModeKey(keyName, e)); + } +} +function repeatLastEdit(cm, vim, repeat, repeatForInsert) { + var macroModeState = vimGlobalState.macroModeState; + macroModeState.isPlaying = true; + var isAction = !!vim.lastEditActionCommand; + var cachedInputState = vim.inputState; + function repeatCommand() { if (isAction) { - commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand); - } else { - commandDispatcher.evalInput(cm, vim); + commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand); + } + else { + commandDispatcher.evalInput(cm, vim); } - } - function repeatInsert(repeat) { + } + function repeatInsert(repeat) { if (macroModeState.lastInsertModeChanges.changes.length > 0) { - repeat = !vim.lastEditActionCommand ? 1 : repeat; - var changeObject = macroModeState.lastInsertModeChanges; - repeatInsertModeChanges(cm, changeObject.changes, repeat); + repeat = !vim.lastEditActionCommand ? 1 : repeat; + var changeObject = macroModeState.lastInsertModeChanges; + repeatInsertModeChanges(cm, changeObject.changes, repeat); } - } - vim.inputState = vim.lastEditInputState; - if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) { + } + vim.inputState = vim.lastEditInputState; + if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) { for (var i = 0; i < repeat; i++) { - repeatCommand(); - repeatInsert(1); + repeatCommand(); + repeatInsert(1); } - } else { + } + else { if (!repeatForInsert) { - repeatCommand(); + repeatCommand(); } repeatInsert(repeat); - } - vim.inputState = cachedInputState; - if (vim.insertMode && !repeatForInsert) { + } + vim.inputState = cachedInputState; + if (vim.insertMode && !repeatForInsert) { exitInsertMode(cm); - } - macroModeState.isPlaying = false; } - - function repeatInsertModeChanges(cm, changes, repeat) { - function keyHandler(binding) { + macroModeState.isPlaying = false; +} +function sendCmKey(cm, key) { + CodeMirror.lookupKey(key, 'vim-insert', function keyHandler(binding) { if (typeof binding == 'string') { - CodeMirror.commands[binding](cm); - } else { - binding(cm); + CodeMirror.commands[binding](cm); + } + else { + binding(cm); } return true; - } - var head = cm.getCursor('head'); - var visualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.visualBlock; - if (visualBlock) { + }); +} +function repeatInsertModeChanges(cm, changes, repeat) { + var head = cm.getCursor('head'); + var visualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.visualBlock; + if (visualBlock) { selectForInsert(cm, head, visualBlock + 1); repeat = cm.listSelections().length; cm.setCursor(head); - } - for (var i = 0; i < repeat; i++) { + } + for (var i = 0; i < repeat; i++) { if (visualBlock) { - cm.setCursor(offsetCursor(head, i, 0)); + cm.setCursor(offsetCursor(head, i, 0)); } for (var j = 0; j < changes.length; j++) { - var change = changes[j]; - if (change instanceof InsertModeKey) { - CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler); - } else if (typeof change == "string") { - cm.replaceSelection(change); - } else { - var start = cm.getCursor(); - var end = offsetCursor(start, 0, change[0].length); - cm.replaceRange(change[0], start, end); - cm.setCursor(end); - } - } - } - if (visualBlock) { + var change = changes[j]; + if (change instanceof InsertModeKey) { + sendCmKey(cm, change.keyName, change); + } + else if (typeof change == "string") { + cm.replaceSelection(change); + } + else { + var start = cm.getCursor(); + var end = offsetCursor(start, 0, change[0].length - (change[1] || 0)); + cm.replaceRange(change[0], start, change[1] ? start : end); + cm.setCursor(end); + } + } + } + if (visualBlock) { cm.setCursor(offsetCursor(head, 0, 1)); - } } - - resetVimGlobalState(); - CodeMirror.Vim = Vim(); - - Vim = CodeMirror.Vim; - - var specialKey = {'return':'CR',backspace:'BS','delete':'Del',esc:'Esc', - left:'Left',right:'Right',up:'Up',down:'Down',space: 'Space',insert: 'Ins', - home:'Home',end:'End',pageup:'PageUp',pagedown:'PageDown', enter: 'CR' - }; - function lookupKey(hashId, key, e) { +} +CodeMirror.Vim = vimApi; +var specialKeyAce = { 'return': 'CR', backspace: 'BS', 'delete': 'Del', esc: 'Esc', + left: 'Left', right: 'Right', up: 'Up', down: 'Down', space: 'Space', insert: 'Ins', + home: 'Home', end: 'End', pageup: 'PageUp', pagedown: 'PageDown', enter: 'CR' +}; +function lookupKey(hashId, key, e, vim) { if (key.length > 1 && key[0] == "n") { - key = key.replace("numpad", ""); + key = key.replace("numpad", ""); } - key = specialKey[key] || key; + key = specialKeyAce[key] || key; var name = ''; - if (e.ctrlKey) { name += 'C-'; } - if (e.altKey) { name += 'A-'; } - if ((name || key.length > 1) && e.shiftKey) { name += 'S-'; } - + if (e.ctrlKey) { + name += 'C-'; + } + if (e.altKey) { + name += 'A-'; + } + if ((name || key.length > 1) && e.shiftKey) { + name += 'S-'; + } + if (vim && !vim.expectLiteralNext && key.length == 1) { + if (langmap.keymap && key in langmap.keymap) { + if (langmap.remapCtrl !== false || !name) + key = langmap.keymap[key]; + } + else if (key.charCodeAt(0) > 255) { + var code = e.code && e.code.slice(-1) || ""; + if (!e.shiftKey) + code = code.toLowerCase(); + if (code) + key = code; + } + } name += key; - if (name.length > 1) { name = '<' + name + '>'; } + if (name.length > 1) { + name = '<' + name + '>'; + } return name; - } - var handleKey = Vim.handleKey.bind(Vim); - Vim.handleKey = function(cm, key, origin) { - return cm.operation(function() { - return handleKey(cm, key, origin); +} +var handleKey = vimApi.handleKey.bind(vimApi); +vimApi.handleKey = function (cm, key, origin) { + return cm.operation(function () { + return handleKey(cm, key, origin); }, true); - } - function cloneVimState(state) { +}; +function cloneVimState(state) { var n = new state.constructor(); - Object.keys(state).forEach(function(key) { - var o = state[key]; - if (Array.isArray(o)) - o = o.slice(); - else if (o && typeof o == "object" && o.constructor != Object) - o = cloneVimState(o); - n[key] = o; + Object.keys(state).forEach(function (key) { + if (key == "insertEnd") + return; + var o = state[key]; + if (Array.isArray(o)) + o = o.slice(); + else if (o && typeof o == "object" && o.constructor != Object) + o = cloneVimState(o); + n[key] = o; }); if (state.sel) { - n.sel = { - head: state.sel.head && copyCursor(state.sel.head), - anchor: state.sel.anchor && copyCursor(state.sel.anchor) - }; + n.sel = { + head: state.sel.head && copyCursor(state.sel.head), + anchor: state.sel.anchor && copyCursor(state.sel.anchor) + }; } return n; - } - function multiSelectHandleKey(cm, key, origin) { +} +function multiSelectHandleKey(cm, key, origin) { var isHandled = false; - var vim = Vim.maybeInitVimState_(cm); + var vim = vimApi.maybeInitVimState_(cm); var visualBlock = vim.visualBlock || vim.wasInVisualBlock; - var wasMultiselect = cm.ace.inMultiSelectMode; if (vim.wasInVisualBlock && !wasMultiselect) { - vim.wasInVisualBlock = false; - } else if (wasMultiselect && vim.visualBlock) { - vim.wasInVisualBlock = true; + vim.wasInVisualBlock = false; + } + else if (wasMultiselect && vim.visualBlock) { + vim.wasInVisualBlock = true; } - if (key == '' && !vim.insertMode && !vim.visualMode && wasMultiselect) { - cm.ace.exitMultiSelectMode(); - } else if (visualBlock || !wasMultiselect || cm.ace.inVirtualSelectionMode) { - isHandled = Vim.handleKey(cm, key, origin); - } else { - var old = cloneVimState(vim); - cm.operation(function() { - cm.ace.forEachSelection(function() { - var sel = cm.ace.selection; - cm.state.vim.lastHPos = sel.$desiredColumn == null ? sel.lead.column : sel.$desiredColumn; - var head = cm.getCursor("head"); - var anchor = cm.getCursor("anchor"); - var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; - var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; - head = offsetCursor(head, 0, headOffset); - anchor = offsetCursor(anchor, 0, anchorOffset); - cm.state.vim.sel.head = head; - cm.state.vim.sel.anchor = anchor; - - isHandled = handleKey(cm, key, origin); - sel.$desiredColumn = cm.state.vim.lastHPos == -1 ? null : cm.state.vim.lastHPos; - if (cm.virtualSelectionMode()) { - cm.state.vim = cloneVimState(old); - } - }); - if (cm.curOp.cursorActivity && !isHandled) - cm.curOp.cursorActivity = false; - }, true); + cm.ace.exitMultiSelectMode(); + } + else if (visualBlock || !wasMultiselect || cm.ace.inVirtualSelectionMode) { + isHandled = vimApi.handleKey(cm, key, origin); + } + else { + var old = cloneVimState(vim); + var changeQueueList = vim.inputState.changeQueueList || []; + cm.operation(function () { + cm.curOp.isVimOp = true; + var index = 0; + cm.ace.forEachSelection(function () { + var sel = cm.ace.selection; + cm.state.vim.lastHPos = sel.$desiredColumn == null ? sel.lead.column : sel.$desiredColumn; + cm.state.vim.inputState.changeQueue = changeQueueList[index]; + var head = cm.getCursor("head"); + var anchor = cm.getCursor("anchor"); + var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; + var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; + head = offsetCursor(head, 0, headOffset); + anchor = offsetCursor(anchor, 0, anchorOffset); + cm.state.vim.sel.head = head; + cm.state.vim.sel.anchor = anchor; + isHandled = handleKey(cm, key, origin); + sel.$desiredColumn = cm.state.vim.lastHPos == -1 ? null : cm.state.vim.lastHPos; + if (cm.ace.inVirtualSelectionMode) { + changeQueueList[index] = cm.state.vim.inputState.changeQueue; + } + if (cm.virtualSelectionMode()) { + cm.state.vim = cloneVimState(old); + } + index++; + }); + if (cm.curOp.cursorActivity && !isHandled) + cm.curOp.cursorActivity = false; + vim.status = cm.state.vim.status; + cm.state.vim = vim; + vim.inputState.changeQueueList = changeQueueList; + vim.inputState.changeQueue = null; + }, true); } if (isHandled && !vim.visualMode && !vim.insert && vim.visualMode != cm.somethingSelected()) { - handleExternalSelection(cm, vim, true); + handleExternalSelection(cm, vim, true); } return isHandled; - } - exports.CodeMirror = CodeMirror; - var getVim = Vim.maybeInitVimState_; - exports.handler = { +} +resetVimGlobalState(); +exports.CodeMirror = CodeMirror; +var getVim = vimApi.maybeInitVimState_; +exports.handler = { $id: "ace/keyboard/vim", - drawCursor: function(element, pixelPos, config, sel, session) { - var vim = this.state.vim || {}; - var w = config.characterWidth; - var h = config.lineHeight; - var top = pixelPos.top; - var left = pixelPos.left; - if (!vim.insertMode) { - var isbackwards = !sel.cursor - ? session.selection.isBackwards() || session.selection.isEmpty() - : Range.comparePoints(sel.cursor, sel.start) <= 0; - if (!isbackwards && left > w) - left -= w; - } - if (!vim.insertMode && vim.status) { - h = h / 2; - top += h; - } - dom.translate(element, left, top); - dom.setStyle(element.style, "width", w + "px"); - dom.setStyle(element.style, "height", h + "px"); - }, - handleKeyboard: function(data, hashId, key, keyCode, e) { - var editor = data.editor; - var cm = editor.state.cm; - var vim = getVim(cm); - if (keyCode == -1) return; - if (!vim.insertMode) { - if (hashId == -1) { - if (key.charCodeAt(0) > 0xFF) { - if (data.inputKey) { - key = data.inputKey; - if (key && data.inputHash == 4) - key = key.toUpperCase(); - } - } - data.inputChar = key; - } - else if (hashId == 4 || hashId == 0) { - if (data.inputKey == key && data.inputHash == hashId && data.inputChar) { - key = data.inputChar; - hashId = -1 - } - else { - data.inputChar = null; - data.inputKey = key; - data.inputHash = hashId; - } + drawCursor: function (element, pixelPos, config, sel, session) { + var vim = this.state.vim || {}; + var w = config.characterWidth; + var h = config.lineHeight; + var top = pixelPos.top; + var left = pixelPos.left; + if (!vim.insertMode) { + var isbackwards = !sel.cursor + ? session.selection.isBackwards() || session.selection.isEmpty() + : Range.comparePoints(sel.cursor, sel.start) <= 0; + if (!isbackwards && left > w) + left -= w; + } + if (!vim.insertMode && vim.status) { + h = h / 2; + top += h; + } + domLib.translate(element, left, top); + domLib.setStyle(element.style, "width", w + "px"); + domLib.setStyle(element.style, "height", h + "px"); + }, + $getDirectionForHighlight: function (editor) { + var cm = editor.state.cm; + var vim = getVim(cm); + if (!vim.insertMode) { + return editor.session.selection.isBackwards() || editor.session.selection.isEmpty(); } - else { - data.inputChar = data.inputKey = null; - } - } - - if (cm.state.overwrite && vim.insertMode && key == "backspace" && hashId == 0) { - return {command: "gotoleft"} - } - if (key == "c" && hashId == 1) { // key == "ctrl-c" - if (!useragent.isMac && editor.getCopyText()) { - editor.once("copy", function() { - if (vim.insertMode) editor.selection.clearSelection(); - else cm.operation(function() { exitVisualMode(cm); }); - }); - return {command: "null", passEvent: true}; - } - } - - if (key == "esc" && !vim.insertMode && !vim.visualMode && !cm.ace.inMultiSelectMode) { - var searchState = getSearchState(cm); - var overlay = searchState.getOverlay(); - if (overlay) cm.removeOverlay(overlay); - } - - if (hashId == -1 || hashId & 1 || hashId === 0 && key.length > 1) { - var insertMode = vim.insertMode; - var name = lookupKey(hashId, key, e || {}); - if (vim.status == null) - vim.status = ""; - var isHandled = multiSelectHandleKey(cm, name, 'user'); - vim = getVim(cm); // may be changed by multiSelectHandleKey - if (isHandled && vim.status != null) - vim.status += name; - else if (vim.status == null) - vim.status = ""; - cm._signal("changeStatus"); - if (!isHandled && (hashId != -1 || insertMode)) - return; - return {command: "null", passEvent: !isHandled}; - } - }, - attach: function(editor) { - if (!editor.state) editor.state = {}; - var cm = new CodeMirror(editor); - editor.state.cm = cm; - editor.$vimModeHandler = this; - CodeMirror.keyMap.vim.attach(cm); - getVim(cm).status = null; - cm.on('vim-command-done', function() { - if (cm.virtualSelectionMode()) return; + }, + handleKeyboard: function (data, hashId, key, keyCode, e) { + var editor = data.editor; + var cm = editor.state.cm; + var vim = getVim(cm); + if (keyCode == -1) + return; + if (!vim.insertMode) { + if (hashId == -1) { + if (key.charCodeAt(0) > 0xFF) { + if (data.inputKey) { + key = data.inputKey; + if (key && data.inputHash == 4) + key = key.toUpperCase(); + } + } + data.inputChar = key; + } + else if (hashId == 4 || hashId == 0) { + if (data.inputKey == key && data.inputHash == hashId && data.inputChar) { + key = data.inputChar; + hashId = -1; + } + else { + data.inputChar = null; + data.inputKey = key; + data.inputHash = hashId; + } + } + else { + data.inputChar = data.inputKey = null; + } + } + if (cm.state.overwrite && vim.insertMode && key == "backspace" && hashId == 0) { + return { command: "gotoleft" }; + } + if (key == "c" && hashId == 1) { // key == "ctrl-c" + if (!useragent.isMac && editor.getCopyText()) { + editor.once("copy", function () { + if (vim.insertMode) + editor.selection.clearSelection(); + else + cm.operation(function () { exitVisualMode(cm); }); + }); + return { command: "null", passEvent: true }; + } + } + if (key == "esc" && !vim.insertMode && !vim.visualMode && !cm.ace.inMultiSelectMode) { + var searchState = getSearchState(cm); + var overlay = searchState.getOverlay(); + if (overlay) + cm.removeOverlay(overlay); + } + if (hashId == -1 || hashId & 1 || hashId === 0 && key.length > 1) { + var insertMode = vim.insertMode; + var name = lookupKey(hashId, key, e || {}, vim); + if (vim.status == null) + vim.status = ""; + var isHandled = multiSelectHandleKey(cm, name, 'user'); + vim = getVim(cm); // may be changed by multiSelectHandleKey + if (isHandled && vim.status != null) + vim.status += name; + else if (vim.status == null) + vim.status = ""; + cm._signal("changeStatus"); + if (!isHandled && (hashId != -1 || insertMode)) + return; + return { command: "null", passEvent: !isHandled }; + } + }, + attach: function (editor) { + if (!editor.state) + editor.state = {}; + var cm = new CodeMirror(editor); + editor.state.cm = cm; + editor.$vimModeHandler = this; + enterVimMode(cm); getVim(cm).status = null; - cm.ace._signal("changeStatus"); - cm.ace.session.markUndoGroup(); - }); - cm.on("changeStatus", function() { - cm.ace.renderer.updateCursor(); - cm.ace._signal("changeStatus"); - }); - cm.on("vim-mode-change", function() { - if (cm.virtualSelectionMode()) return; + cm.on('vim-command-done', function () { + if (cm.virtualSelectionMode()) + return; + getVim(cm).status = null; + cm.ace._signal("changeStatus"); + cm.ace.session.markUndoGroup(); + }); + cm.on("changeStatus", function () { + cm.ace.renderer.updateCursor(); + cm.ace._signal("changeStatus"); + }); + cm.on("vim-mode-change", function () { + if (cm.virtualSelectionMode()) + return; + updateInputMode(); + cm._signal("changeStatus"); + }); + function updateInputMode() { + var isIntsert = getVim(cm).insertMode; + cm.ace.renderer.setStyle("normal-mode", !isIntsert); + editor.textInput.setCommandMode(!isIntsert); + editor.renderer.$keepTextAreaAtCursor = isIntsert; + editor.renderer.$blockCursor = !isIntsert; + } updateInputMode(); - cm._signal("changeStatus"); - }); - function updateInputMode() { - var isIntsert = getVim(cm).insertMode; - cm.ace.renderer.setStyle("normal-mode", !isIntsert); - editor.textInput.setCommandMode(!isIntsert); - editor.renderer.$keepTextAreaAtCursor = isIntsert; - editor.renderer.$blockCursor = !isIntsert; - } - updateInputMode(); - editor.renderer.$cursorLayer.drawCursor = this.drawCursor.bind(cm); - }, - detach: function(editor) { - var cm = editor.state.cm; - CodeMirror.keyMap.vim.detach(cm); - cm.destroy(); - editor.state.cm = null; - editor.$vimModeHandler = null; - editor.renderer.$cursorLayer.drawCursor = null; - editor.renderer.setStyle("normal-mode", false); - editor.textInput.setCommandMode(false); - editor.renderer.$keepTextAreaAtCursor = true; - }, - getStatusText: function(editor) { - var cm = editor.state.cm; - var vim = getVim(cm); - if (vim.insertMode) - return "INSERT"; - var status = ""; - if (vim.visualMode) { - status += "VISUAL"; - if (vim.visualLine) - status += " LINE"; - if (vim.visualBlock) - status += " BLOCK"; - } - if (vim.status) - status += (status ? " " : "") + vim.status; - return status; - } - }; - Vim.defineOption({ + editor.renderer.$cursorLayer.drawCursor = this.drawCursor.bind(cm); + }, + detach: function (editor) { + var cm = editor.state.cm; + leaveVimMode(cm); + cm.destroy(); + editor.state.cm = null; + editor.$vimModeHandler = null; + editor.renderer.$cursorLayer.drawCursor = null; + editor.renderer.setStyle("normal-mode", false); + editor.textInput.setCommandMode(false); + editor.renderer.$keepTextAreaAtCursor = true; + }, + getStatusText: function (editor) { + var cm = editor.state.cm; + var vim = getVim(cm); + if (vim.insertMode) + return "INSERT"; + var status = ""; + if (vim.visualMode) { + status += "VISUAL"; + if (vim.visualLine) + status += " LINE"; + if (vim.visualBlock) + status += " BLOCK"; + } + if (vim.status) + status += (status ? " " : "") + vim.status; + return status; + } +}; +vimApi.defineOption({ name: "wrap", - set: function(value, cm) { - if (cm) {cm.ace.setOption("wrap", value)} + set: function (value, cm) { + if (cm) { + cm.ace.setOption("wrap", value); + } }, type: "boolean" - }, false); - Vim.defineEx('write', 'w', function() { - console.log(':write is not implemented') - }); - defaultKeymap.push( - { keys: 'zc', type: 'action', action: 'fold', actionArgs: { open: false } }, - { keys: 'zC', type: 'action', action: 'fold', actionArgs: { open: false, all: true } }, - { keys: 'zo', type: 'action', action: 'fold', actionArgs: { open: true } }, - { keys: 'zO', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, - { keys: 'za', type: 'action', action: 'fold', actionArgs: { toggle: true } }, - { keys: 'zA', type: 'action', action: 'fold', actionArgs: { toggle: true, all: true } }, - { keys: 'zf', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, - { keys: 'zd', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, - - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorAbove" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorBelow" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorAboveSkipCurrent" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorBelowSkipCurrent" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectMoreBefore" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectMoreAfter" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectNextBefore" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectNextAfter" } } - ); - - defaultKeymap.push({ +}, false); +vimApi.defineEx('write', 'w', function () { + console.log(':write is not implemented'); +}); +defaultKeymap.push({ keys: 'zc', type: 'action', action: 'fold', actionArgs: { open: false } }, { keys: 'zC', type: 'action', action: 'fold', actionArgs: { open: false, all: true } }, { keys: 'zo', type: 'action', action: 'fold', actionArgs: { open: true } }, { keys: 'zO', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, { keys: 'za', type: 'action', action: 'fold', actionArgs: { toggle: true } }, { keys: 'zA', type: 'action', action: 'fold', actionArgs: { toggle: true, all: true } }, { keys: 'zf', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, { keys: 'zd', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorAbove" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorBelow" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorAboveSkipCurrent" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorBelowSkipCurrent" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectMoreBefore" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectMoreAfter" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectNextBefore" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectNextAfter" } }); +defaultKeymap.push({ keys: 'gq', type: 'operator', operator: 'hardWrap' - }); - Vim.defineOperator("hardWrap", function(cm, operatorArgs, ranges, oldAnchor, newHead) { +}); +vimApi.defineOperator("hardWrap", function (cm, operatorArgs, ranges, oldAnchor, newHead) { var anchor = ranges[0].anchor.line; var head = ranges[0].head.line; - if (operatorArgs.linewise) head--; - hardWrap(cm.ace, {startRow: anchor, endRow: head}); + if (operatorArgs.linewise) + head--; + hardWrap(cm.ace, { startRow: anchor, endRow: head }); return Pos(head, 0); - }); - defineOption('textwidth', undefined, 'number', ['tw'], function(width, cm) { +}); +defineOption('textwidth', undefined, 'number', ['tw'], function (width, cm) { if (cm === undefined) { - return; + return; } if (width === undefined) { - var value = cm.ace.getOption('printMarginColumn'); - return value; - } else { - var column = Math.round(width); - if (column > 1) { - cm.ace.setOption('printMarginColumn', column); - } - } - }); - - actions.aceCommand = function(cm, actionArgs, vim) { + var value = cm.ace.getOption('printMarginColumn'); + return value; + } + else { + var column = Math.round(width); + if (column > 1) { + cm.ace.setOption('printMarginColumn', column); + } + } +}); +actions.aceCommand = function (cm, actionArgs, vim) { cm.vimCmd = actionArgs; if (cm.ace.inVirtualSelectionMode) - cm.ace.on("beforeEndOperation", delayedExecAceCommand); + cm.ace.on("beforeEndOperation", delayedExecAceCommand); else - delayedExecAceCommand(null, cm.ace); - }; - function delayedExecAceCommand(op, ace) { + delayedExecAceCommand(null, cm.ace); +}; +function delayedExecAceCommand(op, ace) { ace.off("beforeEndOperation", delayedExecAceCommand); var cmd = ace.state.cm.vimCmd; if (cmd) { - ace.execCommand(cmd.exec ? cmd : cmd.name, cmd.args); + ace.execCommand(cmd.exec ? cmd : cmd.name, cmd.args); } ace.curOp = ace.prevOp; - } - actions.fold = function(cm, actionArgs, vim) { +} +actions.fold = function (cm, actionArgs, vim) { cm.ace.execCommand(['toggleFoldWidget', 'toggleFoldWidget', 'foldOther', 'unfoldall' - ][(actionArgs.all ? 2 : 0) + (actionArgs.open ? 1 : 0)]); - }; + ][(actionArgs.all ? 2 : 0) + (actionArgs.open ? 1 : 0)]); +}; +defaultKeymapLength = defaultKeymap.length; // ace_patch +exports.handler.defaultKeymap = defaultKeymap; +exports.handler.actions = actions; +exports.Vim = vimApi; - exports.handler.defaultKeymap = defaultKeymap; - exports.handler.actions = actions; - exports.Vim = Vim; }); (function() { window.require(["ace/keyboard/vim"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/keybinding-vscode.js b/app/Resources/ui/js/ace/keybinding-vscode.js index 5ab34483..1098cf85 100644 --- a/app/Resources/ui/js/ace/keybinding-vscode.js +++ b/app/Resources/ui/js/ace/keybinding-vscode.js @@ -1,251 +1,244 @@ -define("ace/keyboard/vscode",["require","exports","module","ace/keyboard/hash_handler","ace/config"], function(require, exports, module) { -"use strict"; - +define("ace/keyboard/vscode",["require","exports","module","ace/keyboard/hash_handler","ace/config"], function(require, exports, module){"use strict"; var HashHandler = require("../keyboard/hash_handler").HashHandler; var config = require("../config"); - exports.handler = new HashHandler(); exports.handler.$id = "ace/keyboard/vscode"; - exports.handler.addCommands([{ - name: "toggleWordWrap", - exec: function(editor) { - var wrapUsed = editor.session.getUseWrapMode(); - editor.session.setUseWrapMode(!wrapUsed); - }, - readOnly: true -}, { - name: "navigateToLastEditLocation", - exec: function(editor) { - var lastDelta = editor.session.getUndoManager().$lastDelta; - var range = (lastDelta.action == "remove")? lastDelta.start: lastDelta.end; - editor.moveCursorTo(range.row, range.column); - editor.clearSelection(); - } -}, { - name: "replaceAll", - exec: function (editor) { - if (!editor.searchBox) { - config.loadModule("ace/ext/searchbox", function(e) { - e.Search(editor, true); - }); - } else { - if (editor.searchBox.active === true && editor.searchBox.replaceOption.checked === true) { - editor.searchBox.replaceAll(); + name: "toggleWordWrap", + exec: function (editor) { + var wrapUsed = editor.session.getUseWrapMode(); + editor.session.setUseWrapMode(!wrapUsed); + }, + readOnly: true + }, { + name: "navigateToLastEditLocation", + exec: function (editor) { + var lastDelta = editor.session.getUndoManager().$lastDelta; + var range = (lastDelta.action == "remove") ? lastDelta.start : lastDelta.end; + editor.moveCursorTo(range.row, range.column); + editor.clearSelection(); + } + }, { + name: "replaceAll", + exec: function (editor) { + if (!editor.searchBox) { + config.loadModule("ace/ext/searchbox", function (e) { + e.Search(editor, true); + }); + } + else { + if (editor.searchBox.active === true && editor.searchBox.replaceOption.checked === true) { + editor.searchBox.replaceAll(); + } } } - } -}, { - name: "replaceOne", - exec: function (editor) { - if (!editor.searchBox) { - config.loadModule("ace/ext/searchbox", function(e) { - e.Search(editor, true); - }); - } else { - if (editor.searchBox.active === true && editor.searchBox.replaceOption.checked === true) { - editor.searchBox.replace(); + }, { + name: "replaceOne", + exec: function (editor) { + if (!editor.searchBox) { + config.loadModule("ace/ext/searchbox", function (e) { + e.Search(editor, true); + }); + } + else { + if (editor.searchBox.active === true && editor.searchBox.replaceOption.checked === true) { + editor.searchBox.replace(); + } } } - } -}, { - name: "selectAllMatches", - exec: function (editor) { - if (!editor.searchBox) { - config.loadModule("ace/ext/searchbox", function(e) { + }, { + name: "selectAllMatches", + exec: function (editor) { + if (!editor.searchBox) { + config.loadModule("ace/ext/searchbox", function (e) { + e.Search(editor, false); + }); + } + else { + if (editor.searchBox.active === true) { + editor.searchBox.findAll(); + } + } + } + }, { + name: "toggleFindCaseSensitive", + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { e.Search(editor, false); + var sb = editor.searchBox; + sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; + sb.$syncOptions(); }); - } else { - if (editor.searchBox.active === true) { - editor.searchBox.findAll(); - } } - } -}, { - name: "toggleFindCaseSensitive", - exec: function (editor) { - config.loadModule("ace/ext/searchbox", function(e) { - e.Search(editor, false); - var sb = editor.searchBox; - sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; - sb.$syncOptions(); - }); - - } -}, { - name: "toggleFindInSelection", - exec: function (editor) { - config.loadModule("ace/ext/searchbox", function(e) { - e.Search(editor, false); - var sb = editor.searchBox; - sb.searchOption.checked = !sb.searchRange; - sb.setSearchRange(sb.searchOption.checked && sb.editor.getSelectionRange()); - sb.$syncOptions(); - }); - } -}, { - name: "toggleFindRegex", - exec: function (editor) { - config.loadModule("ace/ext/searchbox", function(e) { - e.Search(editor, false); - var sb = editor.searchBox; - sb.regExpOption.checked = !sb.regExpOption.checked; - sb.$syncOptions(); - }); - } -}, { - name: "toggleFindWholeWord", - exec: function (editor) { - config.loadModule("ace/ext/searchbox", function(e) { - e.Search(editor, false); - var sb = editor.searchBox; - sb.wholeWordOption.checked = !sb.wholeWordOption.checked; - sb.$syncOptions(); - }); - } -}, { - name: "removeSecondaryCursors", - exec: function (editor) { - var ranges = editor.selection.ranges; - if (ranges && ranges.length > 1) - editor.selection.toSingleRange(ranges[ranges.length - 1]); - else - editor.selection.clearSelection(); - } -}]); - - + }, { + name: "toggleFindInSelection", + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { + e.Search(editor, false); + var sb = editor.searchBox; + sb.searchOption.checked = !sb.searchRange; + sb.setSearchRange(sb.searchOption.checked && sb.editor.getSelectionRange()); + sb.$syncOptions(); + }); + } + }, { + name: "toggleFindRegex", + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { + e.Search(editor, false); + var sb = editor.searchBox; + sb.regExpOption.checked = !sb.regExpOption.checked; + sb.$syncOptions(); + }); + } + }, { + name: "toggleFindWholeWord", + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { + e.Search(editor, false); + var sb = editor.searchBox; + sb.wholeWordOption.checked = !sb.wholeWordOption.checked; + sb.$syncOptions(); + }); + } + }, { + name: "removeSecondaryCursors", + exec: function (editor) { + var ranges = editor.selection.ranges; + if (ranges && ranges.length > 1) + editor.selection.toSingleRange(ranges[ranges.length - 1]); + else + editor.selection.clearSelection(); + } + }]); [{ - bindKey: {mac: "Ctrl-G", win: "Ctrl-G"}, - name: "gotoline" -}, { - bindKey: {mac: "Command-Shift-L|Command-F2", win: "Ctrl-Shift-L|Ctrl-F2"}, - name: "findAll" -}, { - bindKey: {mac: "Shift-F8|Shift-Option-F8", win: "Shift-F8|Shift-Alt-F8"}, - name: "goToPreviousError" -}, { - bindKey: {mac: "F8|Option-F8", win: "F8|Alt-F8"}, - name: "goToNextError" -}, { - bindKey: {mac: "Command-Shift-P|F1", win: "Ctrl-Shift-P|F1"}, - name: "openCommandPallete" -}, { - bindKey: {mac: "Command-K|Command-S", win: "Ctrl-K|Ctrl-S"}, - name: "showKeyboardShortcuts" -}, { - bindKey: {mac: "Shift-Option-Up", win: "Alt-Shift-Up"}, - name: "copylinesup" -}, { - bindKey: {mac: "Shift-Option-Down", win: "Alt-Shift-Down"}, - name: "copylinesdown" -}, { - bindKey: {mac: "Command-Shift-K", win: "Ctrl-Shift-K"}, - name: "removeline" -}, { - bindKey: {mac: "Command-Enter", win: "Ctrl-Enter"}, - name: "addLineAfter" -}, { - bindKey: {mac: "Command-Shift-Enter", win: "Ctrl-Shift-Enter"}, - name: "addLineBefore" -}, { - bindKey: {mac: "Command-Shift-\\", win: "Ctrl-Shift-\\"}, - name: "jumptomatching" -}, { - bindKey: {mac: "Command-]", win: "Ctrl-]"}, - name: "blockindent" -}, { - bindKey: {mac: "Command-[", win: "Ctrl-["}, - name: "blockoutdent" -}, { - bindKey: {mac: "Ctrl-PageDown", win: "Alt-PageDown"}, - name: "pagedown" -}, { - bindKey: {mac: "Ctrl-PageUp", win: "Alt-PageUp"}, - name: "pageup" -}, { - bindKey: {mac: "Shift-Option-A", win: "Shift-Alt-A"}, - name: "toggleBlockComment" -}, { - bindKey: {mac: "Option-Z", win: "Alt-Z"}, - name: "toggleWordWrap" -}, { - bindKey: {mac: "Command-G", win: "F3|Ctrl-K Ctrl-D"}, - name: "findnext" -}, { - bindKey: {mac: "Command-Shift-G", win: "Shift-F3"}, - name: "findprevious" -}, { - bindKey: {mac: "Option-Enter", win: "Alt-Enter"}, - name: "selectAllMatches" -}, { - bindKey: {mac: "Command-D", win: "Ctrl-D"}, - name: "selectMoreAfter" -}, { - bindKey: {mac: "Command-K Command-D", win: "Ctrl-K Ctrl-D"}, - name: "selectOrFindNext" -}, { - bindKey: {mac: "Shift-Option-I", win: "Shift-Alt-I"}, - name: "splitSelectionIntoLines" -}, { - bindKey: {mac: "Command-K M", win: "Ctrl-K M"}, - name: "modeSelect" -}, { - bindKey: {mac: "Command-Option-[", win: "Ctrl-Shift-["}, - name: "toggleFoldWidget" -}, { - bindKey: {mac: "Command-Option-]", win: "Ctrl-Shift-]"}, - name: "toggleFoldWidget" -}, { - bindKey: {mac: "Command-K Command-0", win: "Ctrl-K Ctrl-0"}, - name: "foldall" -}, { - bindKey: {mac: "Command-K Command-J", win: "Ctrl-K Ctrl-J"}, - name: "unfoldall" -}, { - bindKey: { mac: "Command-K Command-1", win: "Ctrl-K Ctrl-1" }, - name: "foldOther" -}, { - bindKey: { mac: "Command-K Command-Q", win: "Ctrl-K Ctrl-Q" }, - name: "navigateToLastEditLocation" -}, { - bindKey: { mac: "Command-K Command-R|Command-K Command-S", win: "Ctrl-K Ctrl-R|Ctrl-K Ctrl-S" }, - name: "showKeyboardShortcuts" -}, { - bindKey: { mac: "Command-K Command-X", win: "Ctrl-K Ctrl-X" }, - name: "trimTrailingSpace" -}, { - bindKey: {mac: "Shift-Down|Command-Shift-Down", win: "Shift-Down|Ctrl-Shift-Down"}, - name: "selectdown" -}, { - bindKey: {mac: "Shift-Up|Command-Shift-Up", win: "Shift-Up|Ctrl-Shift-Up"}, - name: "selectup" -}, { - bindKey: {mac: "Command-Alt-Enter", win: "Ctrl-Alt-Enter"}, - name: "replaceAll" -}, { - bindKey: {mac: "Command-Shift-1", win: "Ctrl-Shift-1"}, - name: "replaceOne" -}, { - bindKey: {mac: "Option-C", win: "Alt-C"}, - name: "toggleFindCaseSensitive" -}, { - bindKey: {mac: "Option-L", win: "Alt-L"}, - name: "toggleFindInSelection" -}, { - bindKey: {mac: "Option-R", win: "Alt-R"}, - name: "toggleFindRegex" -}, { - bindKey: {mac: "Option-W", win: "Alt-W"}, - name: "toggleFindWholeWord" -}, { - bindKey: {mac: "Command-L", win: "Ctrl-L"}, - name: "expandtoline" -}, { - bindKey: {mac: "Shift-Esc", win: "Shift-Esc"}, - name: "removeSecondaryCursors" -} -].forEach(function(binding) { + bindKey: { mac: "Ctrl-G", win: "Ctrl-G" }, + name: "gotoline" + }, { + bindKey: { mac: "Command-Shift-L|Command-F2", win: "Ctrl-Shift-L|Ctrl-F2" }, + name: "findAll" + }, { + bindKey: { mac: "Shift-F8|Shift-Option-F8", win: "Shift-F8|Shift-Alt-F8" }, + name: "goToPreviousError" + }, { + bindKey: { mac: "F8|Option-F8", win: "F8|Alt-F8" }, + name: "goToNextError" + }, { + bindKey: { mac: "Command-Shift-P|F1", win: "Ctrl-Shift-P|F1" }, + name: "openCommandPalette" + }, { + bindKey: { mac: "Shift-Option-Up", win: "Alt-Shift-Up" }, + name: "copylinesup" + }, { + bindKey: { mac: "Shift-Option-Down", win: "Alt-Shift-Down" }, + name: "copylinesdown" + }, { + bindKey: { mac: "Command-Shift-K", win: "Ctrl-Shift-K" }, + name: "removeline" + }, { + bindKey: { mac: "Command-Enter", win: "Ctrl-Enter" }, + name: "addLineAfter" + }, { + bindKey: { mac: "Command-Shift-Enter", win: "Ctrl-Shift-Enter" }, + name: "addLineBefore" + }, { + bindKey: { mac: "Command-Shift-\\", win: "Ctrl-Shift-\\" }, + name: "jumptomatching" + }, { + bindKey: { mac: "Command-]", win: "Ctrl-]" }, + name: "blockindent" + }, { + bindKey: { mac: "Command-[", win: "Ctrl-[" }, + name: "blockoutdent" + }, { + bindKey: { mac: "Ctrl-PageDown", win: "Alt-PageDown" }, + name: "pagedown" + }, { + bindKey: { mac: "Ctrl-PageUp", win: "Alt-PageUp" }, + name: "pageup" + }, { + bindKey: { mac: "Shift-Option-A", win: "Shift-Alt-A" }, + name: "toggleBlockComment" + }, { + bindKey: { mac: "Option-Z", win: "Alt-Z" }, + name: "toggleWordWrap" + }, { + bindKey: { mac: "Command-G", win: "F3|Ctrl-K Ctrl-D" }, + name: "findnext" + }, { + bindKey: { mac: "Command-Shift-G", win: "Shift-F3" }, + name: "findprevious" + }, { + bindKey: { mac: "Option-Enter", win: "Alt-Enter" }, + name: "selectAllMatches" + }, { + bindKey: { mac: "Command-D", win: "Ctrl-D" }, + name: "selectMoreAfter" + }, { + bindKey: { mac: "Command-K Command-D", win: "Ctrl-K Ctrl-D" }, + name: "selectOrFindNext" + }, { + bindKey: { mac: "Shift-Option-I", win: "Shift-Alt-I" }, + name: "splitSelectionIntoLines" + }, { + bindKey: { mac: "Command-K M", win: "Ctrl-K M" }, + name: "modeSelect" + }, { + bindKey: { mac: "Command-Option-[", win: "Ctrl-Shift-[" }, + name: "toggleFoldWidget" + }, { + bindKey: { mac: "Command-Option-]", win: "Ctrl-Shift-]" }, + name: "toggleFoldWidget" + }, { + bindKey: { mac: "Command-K Command-0", win: "Ctrl-K Ctrl-0" }, + name: "foldall" + }, { + bindKey: { mac: "Command-K Command-J", win: "Ctrl-K Ctrl-J" }, + name: "unfoldall" + }, { + bindKey: { mac: "Command-K Command-1", win: "Ctrl-K Ctrl-1" }, + name: "foldOther" + }, { + bindKey: { mac: "Command-K Command-Q", win: "Ctrl-K Ctrl-Q" }, + name: "navigateToLastEditLocation" + }, { + bindKey: { mac: "Command-K Command-R|Command-K Command-S", win: "Ctrl-K Ctrl-R|Ctrl-K Ctrl-S" }, + name: "showKeyboardShortcuts" + }, { + bindKey: { mac: "Command-K Command-X", win: "Ctrl-K Ctrl-X" }, + name: "trimTrailingSpace" + }, { + bindKey: { mac: "Shift-Down|Command-Shift-Down", win: "Shift-Down|Ctrl-Shift-Down" }, + name: "selectdown" + }, { + bindKey: { mac: "Shift-Up|Command-Shift-Up", win: "Shift-Up|Ctrl-Shift-Up" }, + name: "selectup" + }, { + bindKey: { mac: "Command-Alt-Enter", win: "Ctrl-Alt-Enter" }, + name: "replaceAll" + }, { + bindKey: { mac: "Command-Shift-1", win: "Ctrl-Shift-1" }, + name: "replaceOne" + }, { + bindKey: { mac: "Option-C", win: "Alt-C" }, + name: "toggleFindCaseSensitive" + }, { + bindKey: { mac: "Option-L", win: "Alt-L" }, + name: "toggleFindInSelection" + }, { + bindKey: { mac: "Option-R", win: "Alt-R" }, + name: "toggleFindRegex" + }, { + bindKey: { mac: "Option-W", win: "Alt-W" }, + name: "toggleFindWholeWord" + }, { + bindKey: { mac: "Command-L", win: "Ctrl-L" }, + name: "expandtoline" + }, { + bindKey: { mac: "Shift-Esc", win: "Shift-Esc" }, + name: "removeSecondaryCursors" + } +].forEach(function (binding) { var command = exports.handler.commands[binding.name]; if (command) command.bindKey = binding.bindKey; diff --git a/app/Resources/ui/js/ace/mode-plotdevice.js b/app/Resources/ui/js/ace/mode-plotdevice.js index 65835665..58159568 100644 --- a/app/Resources/ui/js/ace/mode-plotdevice.js +++ b/app/Resources/ui/js/ace/mode-plotdevice.js @@ -181,11 +181,20 @@ var PlotDeviceHighlightRules = function() { token: "punctuation", regex: ",|:|;|\\->|\\+=|\\-=|\\*=|\\/=|\\/\\/=|%=|@=|&=|\\|=|^=|>>=|<<=|\\*\\*=" }, { + // count current bracket depth in `stack` token: "paren.lparen", - regex: "[\\[\\(\\{]" + regex: "[\\[\\(\\{]", + onMatch: function(value, currentState, stack){ + stack.unshift(value) + return "paren.lparen" + } }, { token: "paren.rparen", - regex: "[\\]\\)\\}]" + regex: "[\\]\\)\\}]", + onMatch: function(value, currentState, stack){ + stack.shift() + return "paren.rparen" + } }, { token: ["keyword", "text", "entity.name.function"], regex: "(def|class)(\\s+)([\\u00BF-\\u1FFF\\u2C00-\\uD7FF\\w]+)" @@ -446,6 +455,12 @@ var PlotDeviceHighlightRules = function() { }, { token: ["punctuation", "function.support"],// method regex: "(\\.)([a-zA-Z_]+)\\b" + }, { + // distinguish between variable assignments and kwargs (based on whether there are surrounding parens) + regex: "[a-zA-Z_$][a-zA-Z0-9_$]*(?=\\s*=(?!=))", + onMatch: function(value, currentState, stack){ + return stack.length ? "variable.parameter" : "variable.assignment" + } }, { token: keywordMapper, regex: "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" diff --git a/app/Resources/ui/js/ace/theme-ambiance.js b/app/Resources/ui/js/ace/theme-ambiance.js index 0830aed5..7ed8808b 100644 --- a/app/Resources/ui/js/ace/theme-ambiance.js +++ b/app/Resources/ui/js/ace/theme-ambiance.js @@ -1,177 +1,10 @@ -define("ace/theme/ambiance",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/ambiance-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-ambiance .ace_gutter {\n background-color: #3d3d3d;\n background-image: linear-gradient(left, #3D3D3D, #333);\n background-repeat: repeat-x;\n border-right: 1px solid #4d4d4d;\n text-shadow: 0px 1px 1px #4d4d4d;\n color: #222;\n}\n\n.ace-ambiance .ace_gutter-layer {\n background: repeat left top;\n}\n\n.ace-ambiance .ace_gutter-active-line {\n background-color: #3F3F3F;\n}\n\n.ace-ambiance .ace_fold-widget {\n text-align: center;\n}\n\n.ace-ambiance .ace_fold-widget:hover {\n color: #777;\n}\n\n.ace-ambiance .ace_fold-widget.ace_start,\n.ace-ambiance .ace_fold-widget.ace_end,\n.ace-ambiance .ace_fold-widget.ace_closed{\n background: none !important;\n border: none;\n box-shadow: none;\n}\n\n.ace-ambiance .ace_fold-widget.ace_start:after {\n content: '\u25BE'\n}\n\n.ace-ambiance .ace_fold-widget.ace_end:after {\n content: '\u25B4'\n}\n\n.ace-ambiance .ace_fold-widget.ace_closed:after {\n content: '\u2023'\n}\n\n.ace-ambiance .ace_print-margin {\n border-left: 1px dotted #2D2D2D;\n right: 0;\n background: #262626;\n}\n\n.ace-ambiance .ace_scroller {\n -webkit-box-shadow: inset 0 0 10px black;\n -moz-box-shadow: inset 0 0 10px black;\n -o-box-shadow: inset 0 0 10px black;\n box-shadow: inset 0 0 10px black;\n}\n\n.ace-ambiance {\n color: #E6E1DC;\n background-color: #202020;\n}\n\n.ace-ambiance .ace_cursor {\n border-left: 1px solid #7991E8;\n}\n\n.ace-ambiance .ace_overwrite-cursors .ace_cursor {\n border: 1px solid #FFE300;\n background: #766B13;\n}\n\n.ace-ambiance.normal-mode .ace_cursor-layer {\n z-index: 0;\n}\n \n.ace-ambiance .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20);\n}\n\n.ace-ambiance .ace_marker-layer .ace_selected-word {\n border-radius: 4px;\n border: 8px solid #3f475d;\n box-shadow: 0 0 4px black;\n}\n\n.ace-ambiance .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174);\n}\n\n.ace-ambiance .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25);\n}\n\n.ace-ambiance .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031);\n}\n\n.ace-ambiance .ace_invisible {\n color: #333;\n}\n\n.ace-ambiance .ace_paren {\n color: #24C2C7;\n}\n\n.ace-ambiance .ace_keyword {\n color: #cda869;\n}\n\n.ace-ambiance .ace_keyword.ace_operator {\n color: #fa8d6a;\n}\n\n.ace-ambiance .ace_punctuation.ace_operator {\n color: #fa8d6a;\n}\n\n.ace-ambiance .ace_identifier {\n}\n\n.ace-ambiance .ace-statement {\n color: #cda869;\n}\n\n.ace-ambiance .ace_constant {\n color: #CF7EA9;\n}\n\n.ace-ambiance .ace_constant.ace_language {\n color: #CF7EA9;\n}\n\n.ace-ambiance .ace_constant.ace_library {\n \n}\n\n.ace-ambiance .ace_constant.ace_numeric {\n color: #78CF8A;\n}\n\n.ace-ambiance .ace_invalid {\n text-decoration: underline;\n}\n\n.ace-ambiance .ace_invalid.ace_illegal {\n color:#F8F8F8;\n background-color: rgba(86, 45, 86, 0.75);\n}\n\n.ace-ambiance .ace_invalid,\n.ace-ambiance .ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1;\n}\n\n.ace-ambiance .ace_support {\n color: #9B859D;\n}\n\n.ace-ambiance .ace_support.ace_function {\n color: #DAD085;\n}\n\n.ace-ambiance .ace_function.ace_buildin {\n color: #9b859d;\n}\n\n.ace-ambiance .ace_string {\n color: #8f9d6a;\n}\n\n.ace-ambiance .ace_string.ace_regexp {\n color: #DAD085;\n}\n\n.ace-ambiance .ace_comment {\n font-style: italic;\n color: #555;\n}\n\n.ace-ambiance .ace_comment.ace_doc {\n}\n\n.ace-ambiance .ace_comment.ace_doc.ace_tag {\n color: #666;\n font-style: normal;\n}\n\n.ace-ambiance .ace_definition,\n.ace-ambiance .ace_type {\n color: #aac6e3;\n}\n\n.ace-ambiance .ace_variable {\n color: #9999cc;\n}\n\n.ace-ambiance .ace_variable.ace_language {\n color: #9b859d;\n}\n\n.ace-ambiance .ace_xml-pe {\n color: #494949;\n}\n\n.ace-ambiance .ace_gutter-layer,\n.ace-ambiance .ace_text-layer {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC\");\n}\n\n.ace-ambiance .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\n}\n\n.ace-ambiance .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-ambiance"; -exports.cssText = ".ace-ambiance .ace_gutter {\ -background-color: #3d3d3d;\ -background-image: linear-gradient(left, #3D3D3D, #333);\ -background-repeat: repeat-x;\ -border-right: 1px solid #4d4d4d;\ -text-shadow: 0px 1px 1px #4d4d4d;\ -color: #222;\ -}\ -.ace-ambiance .ace_gutter-layer {\ -background: repeat left top;\ -}\ -.ace-ambiance .ace_gutter-active-line {\ -background-color: #3F3F3F;\ -}\ -.ace-ambiance .ace_fold-widget {\ -text-align: center;\ -}\ -.ace-ambiance .ace_fold-widget:hover {\ -color: #777;\ -}\ -.ace-ambiance .ace_fold-widget.ace_start,\ -.ace-ambiance .ace_fold-widget.ace_end,\ -.ace-ambiance .ace_fold-widget.ace_closed{\ -background: none !important;\ -border: none;\ -box-shadow: none;\ -}\ -.ace-ambiance .ace_fold-widget.ace_start:after {\ -content: '▾'\ -}\ -.ace-ambiance .ace_fold-widget.ace_end:after {\ -content: '▴'\ -}\ -.ace-ambiance .ace_fold-widget.ace_closed:after {\ -content: '‣'\ -}\ -.ace-ambiance .ace_print-margin {\ -border-left: 1px dotted #2D2D2D;\ -right: 0;\ -background: #262626;\ -}\ -.ace-ambiance .ace_scroller {\ --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;\ -}\ -.ace-ambiance {\ -color: #E6E1DC;\ -background-color: #202020;\ -}\ -.ace-ambiance .ace_cursor {\ -border-left: 1px solid #7991E8;\ -}\ -.ace-ambiance .ace_overwrite-cursors .ace_cursor {\ -border: 1px solid #FFE300;\ -background: #766B13;\ -}\ -.ace-ambiance.normal-mode .ace_cursor-layer {\ -z-index: 0;\ -}\ -.ace-ambiance .ace_marker-layer .ace_selection {\ -background: rgba(221, 240, 255, 0.20);\ -}\ -.ace-ambiance .ace_marker-layer .ace_selected-word {\ -border-radius: 4px;\ -border: 8px solid #3f475d;\ -box-shadow: 0 0 4px black;\ -}\ -.ace-ambiance .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174);\ -}\ -.ace-ambiance .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(255, 255, 255, 0.25);\ -}\ -.ace-ambiance .ace_marker-layer .ace_active-line {\ -background: rgba(255, 255, 255, 0.031);\ -}\ -.ace-ambiance .ace_invisible {\ -color: #333;\ -}\ -.ace-ambiance .ace_paren {\ -color: #24C2C7;\ -}\ -.ace-ambiance .ace_keyword {\ -color: #cda869;\ -}\ -.ace-ambiance .ace_keyword.ace_operator {\ -color: #fa8d6a;\ -}\ -.ace-ambiance .ace_punctuation.ace_operator {\ -color: #fa8d6a;\ -}\ -.ace-ambiance .ace_identifier {\ -}\ -.ace-ambiance .ace-statement {\ -color: #cda869;\ -}\ -.ace-ambiance .ace_constant {\ -color: #CF7EA9;\ -}\ -.ace-ambiance .ace_constant.ace_language {\ -color: #CF7EA9;\ -}\ -.ace-ambiance .ace_constant.ace_library {\ -}\ -.ace-ambiance .ace_constant.ace_numeric {\ -color: #78CF8A;\ -}\ -.ace-ambiance .ace_invalid {\ -text-decoration: underline;\ -}\ -.ace-ambiance .ace_invalid.ace_illegal {\ -color:#F8F8F8;\ -background-color: rgba(86, 45, 86, 0.75);\ -}\ -.ace-ambiance .ace_invalid,\ -.ace-ambiance .ace_deprecated {\ -text-decoration: underline;\ -font-style: italic;\ -color: #D2A8A1;\ -}\ -.ace-ambiance .ace_support {\ -color: #9B859D;\ -}\ -.ace-ambiance .ace_support.ace_function {\ -color: #DAD085;\ -}\ -.ace-ambiance .ace_function.ace_buildin {\ -color: #9b859d;\ -}\ -.ace-ambiance .ace_string {\ -color: #8f9d6a;\ -}\ -.ace-ambiance .ace_string.ace_regexp {\ -color: #DAD085;\ -}\ -.ace-ambiance .ace_comment {\ -font-style: italic;\ -color: #555;\ -}\ -.ace-ambiance .ace_comment.ace_doc {\ -}\ -.ace-ambiance .ace_comment.ace_doc.ace_tag {\ -color: #666;\ -font-style: normal;\ -}\ -.ace-ambiance .ace_definition,\ -.ace-ambiance .ace_type {\ -color: #aac6e3;\ -}\ -.ace-ambiance .ace_variable {\ -color: #9999cc;\ -}\ -.ace-ambiance .ace_variable.ace_language {\ -color: #9b859d;\ -}\ -.ace-ambiance .ace_xml-pe {\ -color: #494949;\ -}\ -.ace-ambiance .ace_gutter-layer,\ -.ace-ambiance .ace_text-layer {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC\");\ -}\ -.ace-ambiance .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\ -}\ -"; +}); +define("ace/theme/ambiance",["require","exports","module","ace/theme/ambiance-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-ambiance"; +exports.cssText = require("./ambiance-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); diff --git a/app/Resources/ui/js/ace/theme-chaos.js b/app/Resources/ui/js/ace/theme-chaos.js index 630a72f7..7fb2e05e 100644 --- a/app/Resources/ui/js/ace/theme-chaos.js +++ b/app/Resources/ui/js/ace/theme-chaos.js @@ -1,155 +1,10 @@ -define("ace/theme/chaos",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/chaos-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-chaos .ace_gutter {\n background: #141414;\n color: #595959;\n border-right: 1px solid #282828;\n}\n.ace-chaos .ace_gutter-cell.ace_warning {\n background-image: none;\n background: #FC0;\n border-left: none;\n padding-left: 0;\n color: #000;\n}\n.ace-chaos .ace_gutter-cell.ace_error {\n background-position: -6px center;\n background-image: none;\n background: #F10;\n border-left: none;\n padding-left: 0;\n color: #000;\n}\n.ace-chaos .ace_print-margin {\n border-left: 1px solid #555;\n right: 0;\n background: #1D1D1D;\n}\n.ace-chaos {\n background-color: #161616;\n color: #E6E1DC;\n}\n\n.ace-chaos .ace_cursor {\n border-left: 2px solid #FFFFFF;\n}\n.ace-chaos .ace_cursor.ace_overwrite {\n border-left: 0px;\n border-bottom: 1px solid #FFFFFF;\n}\n.ace-chaos .ace_marker-layer .ace_selection {\n background: #494836;\n}\n.ace-chaos .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174);\n}\n.ace-chaos .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #FCE94F;\n}\n.ace-chaos .ace_marker-layer .ace_active-line {\n background: #333;\n}\n.ace-chaos .ace_gutter-active-line {\n background-color: #222;\n}\n.ace-chaos .ace_invisible {\n color: #404040;\n}\n.ace-chaos .ace_keyword {\n color:#00698F;\n}\n.ace-chaos .ace_keyword.ace_operator {\n color:#FF308F;\n}\n.ace-chaos .ace_constant {\n color:#1EDAFB;\n}\n.ace-chaos .ace_constant.ace_language {\n color:#FDC251;\n}\n.ace-chaos .ace_constant.ace_library {\n color:#8DFF0A;\n}\n.ace-chaos .ace_constant.ace_numeric {\n color:#58C554;\n}\n.ace-chaos .ace_invalid {\n color:#FFFFFF;\n background-color:#990000;\n}\n.ace-chaos .ace_invalid.ace_deprecated {\n color:#FFFFFF;\n background-color:#990000;\n}\n.ace-chaos .ace_support {\n color: #999;\n}\n.ace-chaos .ace_support.ace_function {\n color:#00AEEF;\n}\n.ace-chaos .ace_function {\n color:#00AEEF;\n}\n.ace-chaos .ace_string {\n color:#58C554;\n}\n.ace-chaos .ace_comment {\n color:#555;\n font-style:italic;\n padding-bottom: 0px;\n}\n.ace-chaos .ace_variable {\n color:#997744;\n}\n.ace-chaos .ace_meta.ace_tag {\n color:#BE53E6;\n}\n.ace-chaos .ace_entity.ace_other.ace_attribute-name {\n color:#FFFF89;\n}\n.ace-chaos .ace_markup.ace_underline {\n text-decoration: underline;\n}\n.ace-chaos .ace_fold-widget {\n text-align: center;\n}\n\n.ace-chaos .ace_fold-widget:hover {\n color: #777;\n}\n\n.ace-chaos .ace_fold-widget.ace_start,\n.ace-chaos .ace_fold-widget.ace_end,\n.ace-chaos .ace_fold-widget.ace_closed{\n background: none !important;\n border: none;\n box-shadow: none;\n}\n\n.ace-chaos .ace_fold-widget.ace_start:after {\n content: '\u25BE'\n}\n\n.ace-chaos .ace_fold-widget.ace_end:after {\n content: '\u25B4'\n}\n\n.ace-chaos .ace_fold-widget.ace_closed:after {\n content: '\u2023'\n}\n\n.ace-chaos .ace_indent-guide {\n border-right:1px dotted #333333;\n margin-right:-1px;\n}\n\n.ace-chaos .ace_indent-guide-active {\n border-right:1px dotted #afafaf;\n margin-right:-1px;\n}\n\n.ace-chaos .ace_fold { \n background: #222; \n border-radius: 3px; \n color: #7AF; \n border: none; \n}\n.ace-chaos .ace_fold:hover {\n background: #CCC; \n color: #000;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-chaos"; -exports.cssText = ".ace-chaos .ace_gutter {\ -background: #141414;\ -color: #595959;\ -border-right: 1px solid #282828;\ -}\ -.ace-chaos .ace_gutter-cell.ace_warning {\ -background-image: none;\ -background: #FC0;\ -border-left: none;\ -padding-left: 0;\ -color: #000;\ -}\ -.ace-chaos .ace_gutter-cell.ace_error {\ -background-position: -6px center;\ -background-image: none;\ -background: #F10;\ -border-left: none;\ -padding-left: 0;\ -color: #000;\ -}\ -.ace-chaos .ace_print-margin {\ -border-left: 1px solid #555;\ -right: 0;\ -background: #1D1D1D;\ -}\ -.ace-chaos {\ -background-color: #161616;\ -color: #E6E1DC;\ -}\ -.ace-chaos .ace_cursor {\ -border-left: 2px solid #FFFFFF;\ -}\ -.ace-chaos .ace_cursor.ace_overwrite {\ -border-left: 0px;\ -border-bottom: 1px solid #FFFFFF;\ -}\ -.ace-chaos .ace_marker-layer .ace_selection {\ -background: #494836;\ -}\ -.ace-chaos .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174);\ -}\ -.ace-chaos .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #FCE94F;\ -}\ -.ace-chaos .ace_marker-layer .ace_active-line {\ -background: #333;\ -}\ -.ace-chaos .ace_gutter-active-line {\ -background-color: #222;\ -}\ -.ace-chaos .ace_invisible {\ -color: #404040;\ -}\ -.ace-chaos .ace_keyword {\ -color:#00698F;\ -}\ -.ace-chaos .ace_keyword.ace_operator {\ -color:#FF308F;\ -}\ -.ace-chaos .ace_constant {\ -color:#1EDAFB;\ -}\ -.ace-chaos .ace_constant.ace_language {\ -color:#FDC251;\ -}\ -.ace-chaos .ace_constant.ace_library {\ -color:#8DFF0A;\ -}\ -.ace-chaos .ace_constant.ace_numeric {\ -color:#58C554;\ -}\ -.ace-chaos .ace_invalid {\ -color:#FFFFFF;\ -background-color:#990000;\ -}\ -.ace-chaos .ace_invalid.ace_deprecated {\ -color:#FFFFFF;\ -background-color:#990000;\ -}\ -.ace-chaos .ace_support {\ -color: #999;\ -}\ -.ace-chaos .ace_support.ace_function {\ -color:#00AEEF;\ -}\ -.ace-chaos .ace_function {\ -color:#00AEEF;\ -}\ -.ace-chaos .ace_string {\ -color:#58C554;\ -}\ -.ace-chaos .ace_comment {\ -color:#555;\ -font-style:italic;\ -padding-bottom: 0px;\ -}\ -.ace-chaos .ace_variable {\ -color:#997744;\ -}\ -.ace-chaos .ace_meta.ace_tag {\ -color:#BE53E6;\ -}\ -.ace-chaos .ace_entity.ace_other.ace_attribute-name {\ -color:#FFFF89;\ -}\ -.ace-chaos .ace_markup.ace_underline {\ -text-decoration: underline;\ -}\ -.ace-chaos .ace_fold-widget {\ -text-align: center;\ -}\ -.ace-chaos .ace_fold-widget:hover {\ -color: #777;\ -}\ -.ace-chaos .ace_fold-widget.ace_start,\ -.ace-chaos .ace_fold-widget.ace_end,\ -.ace-chaos .ace_fold-widget.ace_closed{\ -background: none !important;\ -border: none;\ -box-shadow: none;\ -}\ -.ace-chaos .ace_fold-widget.ace_start:after {\ -content: '▾'\ -}\ -.ace-chaos .ace_fold-widget.ace_end:after {\ -content: '▴'\ -}\ -.ace-chaos .ace_fold-widget.ace_closed:after {\ -content: '‣'\ -}\ -.ace-chaos .ace_indent-guide {\ -border-right:1px dotted #333;\ -margin-right:-1px;\ -}\ -.ace-chaos .ace_fold { \ -background: #222; \ -border-radius: 3px; \ -color: #7AF; \ -border: none; \ -}\ -.ace-chaos .ace_fold:hover {\ -background: #CCC; \ -color: #000;\ -}\ -"; +}); +define("ace/theme/chaos",["require","exports","module","ace/theme/chaos-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-chaos"; +exports.cssText = require("./chaos-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); diff --git a/app/Resources/ui/js/ace/theme-chrome.js b/app/Resources/ui/js/ace/theme-chrome.js index 534625a7..fdff3ba6 100644 --- a/app/Resources/ui/js/ace/theme-chrome.js +++ b/app/Resources/ui/js/ace/theme-chrome.js @@ -1,129 +1,13 @@ -define("ace/theme/chrome",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/chrome-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-chrome .ace_gutter {\n background: #ebebeb;\n color: #333;\n overflow : hidden;\n}\n\n.ace-chrome .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-chrome {\n background-color: #FFFFFF;\n color: black;\n}\n\n.ace-chrome .ace_cursor {\n color: black;\n}\n\n.ace-chrome .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-chrome .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-chrome .ace_constant.ace_language {\n color: rgb(88, 92, 246);\n}\n\n.ace-chrome .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-chrome .ace_invalid {\n background-color: rgb(153, 0, 0);\n color: white;\n}\n\n.ace-chrome .ace_fold {\n}\n\n.ace-chrome .ace_support.ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-chrome .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-chrome .ace_support.ace_type,\n.ace-chrome .ace_support.ace_class\n.ace-chrome .ace_support.ace_other {\n color: rgb(109, 121, 222);\n}\n\n.ace-chrome .ace_variable.ace_parameter {\n font-style:italic;\n color:#FD971F;\n}\n.ace-chrome .ace_keyword.ace_operator {\n color: rgb(104, 118, 135);\n}\n\n.ace-chrome .ace_comment {\n color: #236e24;\n}\n\n.ace-chrome .ace_comment.ace_doc {\n color: #236e24;\n}\n\n.ace-chrome .ace_comment.ace_doc.ace_tag {\n color: #236e24;\n}\n\n.ace-chrome .ace_constant.ace_numeric {\n color: rgb(0, 0, 205);\n}\n\n.ace-chrome .ace_variable {\n color: rgb(49, 132, 149);\n}\n\n.ace-chrome .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-chrome .ace_entity.ace_name.ace_function {\n color: #0000A2;\n}\n\n\n.ace-chrome .ace_heading {\n color: rgb(12, 7, 255);\n}\n\n.ace-chrome .ace_list {\n color:rgb(185, 6, 144);\n}\n\n.ace-chrome .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-chrome .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-chrome .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-chrome .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-chrome .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.07);\n}\n\n.ace-chrome .ace_gutter-active-line {\n background-color : #dcdcdc;\n}\n\n.ace-chrome .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-chrome .ace_storage,\n.ace-chrome .ace_keyword,\n.ace-chrome .ace_meta.ace_tag {\n color: rgb(147, 15, 128);\n}\n\n.ace-chrome .ace_string.ace_regex {\n color: rgb(255, 0, 0)\n}\n\n.ace-chrome .ace_string {\n color: #1A1AA6;\n}\n\n.ace-chrome .ace_entity.ace_other.ace_attribute-name {\n color: #994409;\n}\n\n.ace-chrome .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n \n.ace-chrome .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n}\n"; -exports.isDark = false; -exports.cssClass = "ace-chrome"; -exports.cssText = ".ace-chrome .ace_gutter {\ -background: #ebebeb;\ -color: #333;\ -overflow : hidden;\ -}\ -.ace-chrome .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-chrome {\ -background-color: #FFFFFF;\ -color: black;\ -}\ -.ace-chrome .ace_cursor {\ -color: black;\ -}\ -.ace-chrome .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-chrome .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-chrome .ace_constant.ace_language {\ -color: rgb(88, 92, 246);\ -}\ -.ace-chrome .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-chrome .ace_invalid {\ -background-color: rgb(153, 0, 0);\ -color: white;\ -}\ -.ace-chrome .ace_fold {\ -}\ -.ace-chrome .ace_support.ace_function {\ -color: rgb(60, 76, 114);\ -}\ -.ace-chrome .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-chrome .ace_support.ace_type,\ -.ace-chrome .ace_support.ace_class\ -.ace-chrome .ace_support.ace_other {\ -color: rgb(109, 121, 222);\ -}\ -.ace-chrome .ace_variable.ace_parameter {\ -font-style:italic;\ -color:#FD971F;\ -}\ -.ace-chrome .ace_keyword.ace_operator {\ -color: rgb(104, 118, 135);\ -}\ -.ace-chrome .ace_comment {\ -color: #236e24;\ -}\ -.ace-chrome .ace_comment.ace_doc {\ -color: #236e24;\ -}\ -.ace-chrome .ace_comment.ace_doc.ace_tag {\ -color: #236e24;\ -}\ -.ace-chrome .ace_constant.ace_numeric {\ -color: rgb(0, 0, 205);\ -}\ -.ace-chrome .ace_variable {\ -color: rgb(49, 132, 149);\ -}\ -.ace-chrome .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-chrome .ace_entity.ace_name.ace_function {\ -color: #0000A2;\ -}\ -.ace-chrome .ace_heading {\ -color: rgb(12, 7, 255);\ -}\ -.ace-chrome .ace_list {\ -color:rgb(185, 6, 144);\ -}\ -.ace-chrome .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-chrome .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-chrome .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-chrome .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-chrome .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.07);\ -}\ -.ace-chrome .ace_gutter-active-line {\ -background-color : #dcdcdc;\ -}\ -.ace-chrome .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-chrome .ace_storage,\ -.ace-chrome .ace_keyword,\ -.ace-chrome .ace_meta.ace_tag {\ -color: rgb(147, 15, 128);\ -}\ -.ace-chrome .ace_string.ace_regex {\ -color: rgb(255, 0, 0)\ -}\ -.ace-chrome .ace_string {\ -color: #1A1AA6;\ -}\ -.ace-chrome .ace_entity.ace_other.ace_attribute-name {\ -color: #994409;\ -}\ -.ace-chrome .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}"; +}); +define("ace/theme/chrome",["require","exports","module","ace/theme/chrome-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-chrome"; +exports.cssText = require("./chrome-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/chrome"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-cloud9_day.js b/app/Resources/ui/js/ace/theme-cloud9_day.js index 1e5ee0ea..60d73bbe 100644 --- a/app/Resources/ui/js/ace/theme-cloud9_day.js +++ b/app/Resources/ui/js/ace/theme-cloud9_day.js @@ -1,130 +1,14 @@ -define("ace/theme/cloud9_day",["require","exports","module","ace/lib/dom"], function (require, exports, module) { - "use strict"; +define("ace/theme/cloud9_day-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-cloud9-day .ace_gutter {\n background: #ECECEC;\n color: #333;\n}\n\n.ace-cloud9-day .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-cloud9-day .ace_fold {\n background-color: #6B72E6;\n}\n\n.ace-cloud9-day {\n background-color: #FBFBFB;\n color: black;\n}\n\n.ace-cloud9-day .ace_cursor {\n color: black;\n}\n\n.ace-cloud9-day .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-cloud9-day .ace_storage,\n.ace-cloud9-day .ace_keyword {\n color: rgb(24, 122, 234);\n}\n\n.ace-cloud9-day .ace_constant {\n color: rgb(197, 6, 11);\n}\n\n.ace-cloud9-day .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-cloud9-day .ace_constant.ace_language {\n color: rgb(88, 92, 246);\n}\n\n.ace-cloud9-day .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-cloud9-day .ace_invalid {\n background-color: rgba(255, 0, 0, 0.1);\n color: red;\n}\n\n.ace-cloud9-day .ace_support.ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-cloud9-day .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-cloud9-day .ace_support.ace_type,\n.ace-cloud9-day .ace_support.ace_class {\n color: rgb(109, 121, 222);\n}\n\n.ace-cloud9-day .ace_keyword.ace_operator {\n color: rgb(104, 118, 135);\n}\n\n.ace-cloud9-day .ace_string {\n color: rgb(3, 106, 7);\n}\n\n.ace-cloud9-day .ace_comment {\n color: rgb(76, 136, 107);\n}\n\n.ace-cloud9-day .ace_comment.ace_doc {\n color: rgb(0, 102, 255);\n}\n\n.ace-cloud9-day .ace_comment.ace_doc.ace_tag {\n color: rgb(128, 159, 191);\n}\n\n.ace-cloud9-day .ace_constant.ace_numeric {\n color: rgb(0, 0, 205);\n}\n\n.ace-cloud9-day .ace_variable {\n color: rgb(49, 132, 149);\n}\n\n.ace-cloud9-day .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-cloud9-day .ace_entity.ace_name.ace_function {\n color: #0000A2;\n}\n\n\n.ace-cloud9-day .ace_heading {\n color: rgb(12, 7, 255);\n}\n\n.ace-cloud9-day .ace_list {\n color: rgb(185, 6, 144);\n}\n\n.ace-cloud9-day .ace_meta.ace_tag {\n color: rgb(0, 22, 142);\n}\n\n.ace-cloud9-day .ace_string.ace_regex {\n color: rgb(255, 0, 0)\n}\n\n.ace-cloud9-day .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-cloud9-day.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px white;\n}\n\n.ace-cloud9-day .ace_marker-layer .ace_step {\n background: rgb(247, 237, 137);\n}\n\n.ace-cloud9-day .ace_marker-layer .ace_stack {\n background: #BAE0A0;\n}\n\n.ace-cloud9-day .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-cloud9-day .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.07);\n}\n\n.ace-cloud9-day .ace_gutter-active-line {\n background-color: #E5E5E5;\n}\n\n.ace-cloud9-day .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-cloud9-day .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-cloud9-day .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; - exports.isDark = false; - exports.cssClass = "ace-cloud9-day"; - exports.cssText = ".ace-cloud9-day .ace_gutter {\ -background: #ECECEC;\ -color: #333;\ -}\ -.ace-cloud9-day .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-cloud9-day .ace_fold {\ -background-color: #6B72E6;\ -}\ -.ace-cloud9-day {\ -background-color: #FBFBFB;\ -color: black;\ -}\ -.ace-cloud9-day .ace_cursor {\ -color: black;\ -}\ -.ace-cloud9-day .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-cloud9-day .ace_storage,\ -.ace-cloud9-day .ace_keyword {\ -color: rgb(24, 122, 234);\ -}\ -.ace-cloud9-day .ace_constant {\ -color: rgb(197, 6, 11);\ -}\ -.ace-cloud9-day .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-cloud9-day .ace_constant.ace_language {\ -color: rgb(88, 92, 246);\ -}\ -.ace-cloud9-day .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-cloud9-day .ace_invalid {\ -background-color: rgba(255, 0, 0, 0.1);\ -color: red;\ -}\ -.ace-cloud9-day .ace_support.ace_function {\ -color: rgb(60, 76, 114);\ -}\ -.ace-cloud9-day .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-cloud9-day .ace_support.ace_type,\ -.ace-cloud9-day .ace_support.ace_class {\ -color: rgb(109, 121, 222);\ -}\ -.ace-cloud9-day .ace_keyword.ace_operator {\ -color: rgb(104, 118, 135);\ -}\ -.ace-cloud9-day .ace_string {\ -color: rgb(3, 106, 7);\ -}\ -.ace-cloud9-day .ace_comment {\ -color: rgb(76, 136, 107);\ -}\ -.ace-cloud9-day .ace_comment.ace_doc {\ -color: rgb(0, 102, 255);\ -}\ -.ace-cloud9-day .ace_comment.ace_doc.ace_tag {\ -color: rgb(128, 159, 191);\ -}\ -.ace-cloud9-day .ace_constant.ace_numeric {\ -color: rgb(0, 0, 205);\ -}\ -.ace-cloud9-day .ace_variable {\ -color: rgb(49, 132, 149);\ -}\ -.ace-cloud9-day .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-cloud9-day .ace_entity.ace_name.ace_function {\ -color: #0000A2;\ -}\ -.ace-cloud9-day .ace_heading {\ -color: rgb(12, 7, 255);\ -}\ -.ace-cloud9-day .ace_list {\ -color: rgb(185, 6, 144);\ -}\ -.ace-cloud9-day .ace_meta.ace_tag {\ -color: rgb(0, 22, 142);\ -}\ -.ace-cloud9-day .ace_string.ace_regex {\ -color: rgb(255, 0, 0)\ -}\ -.ace-cloud9-day .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-cloud9-day.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px white;\ -}\ -.ace-cloud9-day .ace_marker-layer .ace_step {\ -background: rgb(247, 237, 137);\ -}\ -.ace-cloud9-day .ace_marker-layer .ace_stack {\ -background: #BAE0A0;\ -}\ -.ace-cloud9-day .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-cloud9-day .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.07);\ -}\ -.ace-cloud9-day .ace_gutter-active-line {\ -background-color: #E5E5E5;\ -}\ -.ace-cloud9-day .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-cloud9-day .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}"; +}); + +define("ace/theme/cloud9_day",["require","exports","module","ace/theme/cloud9_day-css","ace/lib/dom"], function(require, exports, module){"use strict"; +exports.isDark = false; +exports.cssClass = "ace-cloud9-day"; +exports.cssText = require("./cloud9_day-css"); +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); - var dom = require("../lib/dom"); - dom.importCssString(exports.cssText, exports.cssClass); }); (function() { window.require(["ace/theme/cloud9_day"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-cloud9_night.js b/app/Resources/ui/js/ace/theme-cloud9_night.js index c7d5186a..3a14eded 100644 --- a/app/Resources/ui/js/ace/theme-cloud9_night.js +++ b/app/Resources/ui/js/ace/theme-cloud9_night.js @@ -1,124 +1,13 @@ -define("ace/theme/cloud9_night",["require","exports","module","ace/lib/dom"], function (require, exports, module) { - exports.isDark = true; - exports.cssClass = "ace-cloud9-night"; - exports.cssText = ".ace-cloud9-night .ace_gutter {\ -background: #303130;\ -color: #eee\ -}\ -.ace-cloud9-night .ace_print-margin {\ -width: 1px;\ -background: #222\ -}\ -.ace-cloud9-night {\ -background-color: #181818;\ -color: #EBEBEB\ -}\ -.ace-cloud9-night .ace_cursor {\ -color: #9F9F9F\ -}\ -.ace-cloud9-night .ace_marker-layer .ace_selection {\ -background: #424242\ -}\ -.ace-cloud9-night.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #000000;\ -border-radius: 2px\ -}\ -.ace-cloud9-night .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-cloud9-night .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #888888\ -}\ -.ace-cloud9-night .ace_marker-layer .ace_highlight {\ -border: 1px solid rgb(110, 119, 0);\ -border-bottom: 0;\ -box-shadow: inset 0 -1px rgb(110, 119, 0);\ -margin: -1px 0 0 -1px;\ -background: rgba(255, 235, 0, 0.1);\ -}\ -.ace-cloud9-night .ace_marker-layer .ace_active-line {\ -background: #292929\ -}\ -.ace-cloud9-night .ace_gutter-active-line {\ -background-color: #3D3D3D\ -}\ -.ace-cloud9-night .ace_stack {\ -background-color: rgb(66, 90, 44)\ -}\ -.ace-cloud9-night .ace_marker-layer .ace_selected-word {\ -border: 1px solid #888888\ -}\ -.ace-cloud9-night .ace_invisible {\ -color: #343434\ -}\ -.ace-cloud9-night .ace_keyword,\ -.ace-cloud9-night .ace_meta,\ -.ace-cloud9-night .ace_storage,\ -.ace-cloud9-night .ace_storage.ace_type,\ -.ace-cloud9-night .ace_support.ace_type {\ -color: #C397D8\ -}\ -.ace-cloud9-night .ace_keyword.ace_operator {\ -color: #70C0B1\ -}\ -.ace-cloud9-night .ace_constant.ace_character,\ -.ace-cloud9-night .ace_constant.ace_language,\ -.ace-cloud9-night .ace_constant.ace_numeric,\ -.ace-cloud9-night .ace_keyword.ace_other.ace_unit,\ -.ace-cloud9-night .ace_support.ace_constant,\ -.ace-cloud9-night .ace_variable.ace_parameter {\ -color: #E78C45\ -}\ -.ace-cloud9-night .ace_constant.ace_other {\ -color: #EEEEEE\ -}\ -.ace-cloud9-night .ace_invalid {\ -color: #CED2CF;\ -background-color: #DF5F5F\ -}\ -.ace-cloud9-night .ace_invalid.ace_deprecated {\ -color: #CED2CF;\ -background-color: #B798BF\ -}\ -.ace-cloud9-night .ace_fold {\ -background-color: #7AA6DA;\ -border-color: #DEDEDE\ -}\ -.ace-cloud9-night .ace_entity.ace_name.ace_function,\ -.ace-cloud9-night .ace_support.ace_function,\ -.ace-cloud9-night .ace_variable:not(.ace_parameter),\ -.ace-cloud9-night .ace_constant:not(.ace_numeric) {\ -color: #7AA6DA\ -}\ -.ace-cloud9-night .ace_support.ace_class,\ -.ace-cloud9-night .ace_support.ace_type {\ -color: #E7C547\ -}\ -.ace-cloud9-night .ace_heading,\ -.ace-cloud9-night .ace_markup.ace_heading,\ -.ace-cloud9-night .ace_string {\ -color: #B9CA4A\ -}\ -.ace-cloud9-night .ace_entity.ace_name.ace_tag,\ -.ace-cloud9-night .ace_entity.ace_other.ace_attribute-name,\ -.ace-cloud9-night .ace_meta.ace_tag,\ -.ace-cloud9-night .ace_string.ace_regexp,\ -.ace-cloud9-night .ace_variable {\ -color: #D54E53\ -}\ -.ace-cloud9-night .ace_comment {\ -color: #969896\ -}\ -.ace-cloud9-night .ace_c9searchresults.ace_keyword {\ -color: #C2C280;\ -}\ -.ace-cloud9-night .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ -}"; +define("ace/theme/cloud9_night-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-cloud9-night .ace_gutter {\n background: #303130;\n color: #eee\n}\n\n.ace-cloud9-night .ace_print-margin {\n width: 1px;\n background: #222\n}\n\n.ace-cloud9-night {\n background-color: #181818;\n color: #EBEBEB\n}\n\n.ace-cloud9-night .ace_cursor {\n color: #9F9F9F\n}\n\n.ace-cloud9-night .ace_marker-layer .ace_selection {\n background: #424242\n}\n\n.ace-cloud9-night.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #000000;\n border-radius: 2px\n}\n\n.ace-cloud9-night .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-cloud9-night .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #888888\n}\n\n.ace-cloud9-night .ace_marker-layer .ace_highlight {\n border: 1px solid rgb(110, 119, 0);\n border-bottom: 0;\n box-shadow: inset 0 -1px rgb(110, 119, 0);\n margin: -1px 0 0 -1px;\n background: rgba(255, 235, 0, 0.1);\n}\n\n.ace-cloud9-night .ace_marker-layer .ace_active-line {\n background: #292929\n}\n\n.ace-cloud9-night .ace_gutter-active-line {\n background-color: #3D3D3D\n}\n\n.ace-cloud9-night .ace_stack {\n background-color: rgb(66, 90, 44)\n}\n\n.ace-cloud9-night .ace_marker-layer .ace_selected-word {\n border: 1px solid #888888\n}\n\n.ace-cloud9-night .ace_invisible {\n color: #343434\n}\n\n.ace-cloud9-night .ace_keyword,\n.ace-cloud9-night .ace_meta,\n.ace-cloud9-night .ace_storage,\n.ace-cloud9-night .ace_storage.ace_type,\n.ace-cloud9-night .ace_support.ace_type {\n color: #C397D8\n}\n\n.ace-cloud9-night .ace_keyword.ace_operator {\n color: #70C0B1\n}\n\n.ace-cloud9-night .ace_constant.ace_character,\n.ace-cloud9-night .ace_constant.ace_language,\n.ace-cloud9-night .ace_constant.ace_numeric,\n.ace-cloud9-night .ace_keyword.ace_other.ace_unit,\n.ace-cloud9-night .ace_support.ace_constant,\n.ace-cloud9-night .ace_variable.ace_parameter {\n color: #E78C45\n}\n\n.ace-cloud9-night .ace_constant.ace_other {\n color: #EEEEEE\n}\n\n.ace-cloud9-night .ace_invalid {\n color: #CED2CF;\n background-color: #DF5F5F\n}\n\n.ace-cloud9-night .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-cloud9-night .ace_fold {\n background-color: #7AA6DA;\n border-color: #DEDEDE\n}\n\n.ace-cloud9-night .ace_entity.ace_name.ace_function,\n.ace-cloud9-night .ace_support.ace_function,\n.ace-cloud9-night .ace_variable:not(.ace_parameter),\n.ace-cloud9-night .ace_constant:not(.ace_numeric) {\n color: #7AA6DA\n}\n\n.ace-cloud9-night .ace_support.ace_class,\n.ace-cloud9-night .ace_support.ace_type {\n color: #E7C547\n}\n\n.ace-cloud9-night .ace_heading,\n.ace-cloud9-night .ace_markup.ace_heading,\n.ace-cloud9-night .ace_string {\n color: #B9CA4A\n}\n\n.ace-cloud9-night .ace_entity.ace_name.ace_tag,\n.ace-cloud9-night .ace_entity.ace_other.ace_attribute-name,\n.ace-cloud9-night .ace_meta.ace_tag,\n.ace-cloud9-night .ace_string.ace_regexp,\n.ace-cloud9-night .ace_variable {\n color: #D54E53\n}\n\n.ace-cloud9-night .ace_comment {\n color: #969896\n}\n\n.ace-cloud9-night .ace_c9searchresults.ace_keyword {\n color: #C2C280;\n}\n\n.ace-cloud9-night .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-cloud9-night .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; + +}); + +define("ace/theme/cloud9_night",["require","exports","module","ace/theme/cloud9_night-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-cloud9-night"; +exports.cssText = require("./cloud9_night-css"); +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); - var dom = require("../lib/dom"); - dom.importCssString(exports.cssText, exports.cssClass); }); (function() { window.require(["ace/theme/cloud9_night"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-cloud9_night_low_color.js b/app/Resources/ui/js/ace/theme-cloud9_night_low_color.js index 0ee9b235..6902bf1c 100644 --- a/app/Resources/ui/js/ace/theme-cloud9_night_low_color.js +++ b/app/Resources/ui/js/ace/theme-cloud9_night_low_color.js @@ -1,113 +1,13 @@ -define("ace/theme/cloud9_night_low_color",["require","exports","module","ace/lib/dom"], function (require, exports, module) { - exports.isDark = true; - exports.cssClass = "ace-cloud9-night-low-color"; - exports.cssText = ".ace-cloud9-night-low-color .ace_gutter {\ -background: #303130;\ -color: #eee\ -}\ -.ace-cloud9-night-low-color .ace_print-margin {\ -width: 1px;\ -background: #222\ -}\ -.ace-cloud9-night-low-color {\ -background-color: #181818;\ -color: #EBEBEB\ -}\ -.ace-cloud9-night-low-color .ace_cursor {\ -color: #9F9F9F\ -}\ -.ace-cloud9-night-low-color .ace_marker-layer .ace_selection {\ -background: #424242\ -}\ -.ace-cloud9-night-low-color.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #000000;\ -border-radius: 2px\ -}\ -.ace-cloud9-night-low-color .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-cloud9-night-low-color .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #888888\ -}\ -.ace-cloud9-night-low-color .ace_marker-layer .ace_highlight {\ -border: 1px solid rgb(110, 119, 0);\ -border-bottom: 0;\ -box-shadow: inset 0 -1px rgb(110, 119, 0);\ -margin: -1px 0 0 -1px;\ -background: rgba(255, 235, 0, 0.1);\ -}\ -.ace-cloud9-night-low-color .ace_marker-layer .ace_active-line {\ -background: #292929\ -}\ -.ace-cloud9-night-low-color .ace_gutter-active-line {\ -background-color: #3D3D3D\ -}\ -.ace-cloud9-night-low-color .ace_stack {\ -background-color: rgb(66, 90, 44)\ -}\ -.ace-cloud9-night-low-color .ace_marker-layer .ace_selected-word {\ -border: 1px solid #888888\ -}\ -.ace-cloud9-night-low-color .ace_invisible {\ -color: #343434\ -}\ -.ace-cloud9-night-low-color .ace_keyword,\ -.ace-cloud9-night-low-color .ace_meta,\ -.ace-cloud9-night-low-color .ace_storage {\ -color: #C397D8\ -}\ -.ace-cloud9-night-low-color .ace_keyword.ace_operator {\ -color: #70C0B1\ -}\ -.ace-cloud9-night-low-color .ace_constant.ace_character,\ -.ace-cloud9-night-low-color .ace_constant.ace_language,\ -.ace-cloud9-night-low-color .ace_constant.ace_numeric,\ -.ace-cloud9-night-low-color .ace_keyword.ace_other.ace_unit {\ -color: #DAA637\ -}\ -.ace-cloud9-night-low-color .ace_constant.ace_other {\ -color: #EEEEEE\ -}\ -.ace-cloud9-night-low-color .ace_invalid {\ -color: #CED2CF;\ -background-color: #DF5F5F\ -}\ -.ace-cloud9-night-low-color .ace_invalid.ace_deprecated {\ -color: #CED2CF;\ -background-color: #B798BF\ -}\ -.ace-cloud9-night-low-color .ace_fold {\ -background-color: #7AA6DA;\ -border-color: #DEDEDE\ -}\ -.ace-cloud9-night-low-color .ace_entity.ace_name.ace_function,\ -.ace-cloud9-night-low-color .ace_support.ace_function,\ -.ace-cloud9-night-low-color .ace_variable:not(.ace_parameter),\ -.ace-cloud9-night-low-color .ace_constant:not(.ace_numeric) {\ -color: #7AA6DA\ -}\ -.ace-cloud9-night-low-color .ace_support.ace_class,\ -.ace-cloud9-night-low-color .ace_support.ace_type {\ -color: #E7C547\ -}\ -.ace-cloud9-night-low-color .ace_heading,\ -.ace-cloud9-night-low-color .ace_markup.ace_heading,\ -.ace-cloud9-night-low-color .ace_string {\ -color: #B9CA4A\ -}\ -.ace-cloud9-night-low-color .ace_comment {\ -color: #969896\ -}\ -.ace-cloud9-night-low-color .ace_c9searchresults.ace_keyword {\ -color: #C2C280;\ -}\ -.ace-cloud9-night-low-color .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ -}"; +define("ace/theme/cloud9_night_low_color-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-cloud9-night-low-color .ace_gutter {\n background: #303130;\n color: #eee\n}\n\n.ace-cloud9-night-low-color .ace_print-margin {\n width: 1px;\n background: #222\n}\n\n.ace-cloud9-night-low-color {\n background-color: #181818;\n color: #EBEBEB\n}\n\n.ace-cloud9-night-low-color .ace_cursor {\n color: #9F9F9F\n}\n\n.ace-cloud9-night-low-color .ace_marker-layer .ace_selection {\n background: #424242\n}\n\n.ace-cloud9-night-low-color.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #000000;\n border-radius: 2px\n}\n\n.ace-cloud9-night-low-color .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-cloud9-night-low-color .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #888888\n}\n\n.ace-cloud9-night-low-color .ace_marker-layer .ace_highlight {\n border: 1px solid rgb(110, 119, 0);\n border-bottom: 0;\n box-shadow: inset 0 -1px rgb(110, 119, 0);\n margin: -1px 0 0 -1px;\n background: rgba(255, 235, 0, 0.1);\n}\n\n.ace-cloud9-night-low-color .ace_marker-layer .ace_active-line {\n background: #292929\n}\n\n.ace-cloud9-night-low-color .ace_gutter-active-line {\n background-color: #3D3D3D\n}\n\n.ace-cloud9-night-low-color .ace_stack {\n background-color: rgb(66, 90, 44)\n}\n\n.ace-cloud9-night-low-color .ace_marker-layer .ace_selected-word {\n border: 1px solid #888888\n}\n\n.ace-cloud9-night-low-color .ace_invisible {\n color: #343434\n}\n\n.ace-cloud9-night-low-color .ace_keyword,\n.ace-cloud9-night-low-color .ace_meta,\n.ace-cloud9-night-low-color .ace_storage {\n color: #C397D8\n}\n\n.ace-cloud9-night-low-color .ace_keyword.ace_operator {\n color: #70C0B1\n}\n\n.ace-cloud9-night-low-color .ace_constant.ace_character,\n.ace-cloud9-night-low-color .ace_constant.ace_language,\n.ace-cloud9-night-low-color .ace_constant.ace_numeric,\n.ace-cloud9-night-low-color .ace_keyword.ace_other.ace_unit {\n color: #DAA637\n}\n\n.ace-cloud9-night-low-color .ace_constant.ace_other {\n color: #EEEEEE\n}\n\n.ace-cloud9-night-low-color .ace_invalid {\n color: #CED2CF;\n background-color: #DF5F5F\n}\n\n.ace-cloud9-night-low-color .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-cloud9-night-low-color .ace_fold {\n background-color: #7AA6DA;\n border-color: #DEDEDE\n}\n\n.ace-cloud9-night-low-color .ace_entity.ace_name.ace_function,\n.ace-cloud9-night-low-color .ace_support.ace_function,\n.ace-cloud9-night-low-color .ace_variable:not(.ace_parameter),\n.ace-cloud9-night-low-color .ace_constant:not(.ace_numeric) {\n color: #7AA6DA\n}\n\n.ace-cloud9-night-low-color .ace_support.ace_class,\n.ace-cloud9-night-low-color .ace_support.ace_type {\n color: #E7C547\n}\n\n.ace-cloud9-night-low-color .ace_heading,\n.ace-cloud9-night-low-color .ace_markup.ace_heading,\n.ace-cloud9-night-low-color .ace_string {\n color: #B9CA4A\n}\n\n.ace-cloud9-night-low-color .ace_comment {\n color: #969896\n}\n\n.ace-cloud9-night-low-color .ace_c9searchresults.ace_keyword {\n color: #C2C280;\n}\n\n.ace-cloud9-night-low-color .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-cloud9-night-low-color .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; + +}); + +define("ace/theme/cloud9_night_low_color",["require","exports","module","ace/theme/cloud9_night_low_color-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-cloud9-night-low-color"; +exports.cssText = require("./cloud9_night_low_color-css"); +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); - var dom = require("../lib/dom"); - dom.importCssString(exports.cssText, exports.cssClass); }); (function() { window.require(["ace/theme/cloud9_night_low_color"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-clouds.js b/app/Resources/ui/js/ace/theme-clouds.js index 2673f62f..0adc9cf0 100644 --- a/app/Resources/ui/js/ace/theme-clouds.js +++ b/app/Resources/ui/js/ace/theme-clouds.js @@ -1,97 +1,13 @@ -define("ace/theme/clouds",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/clouds-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-clouds .ace_gutter {\n background: #ebebeb;\n color: #333\n}\n\n.ace-clouds .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-clouds {\n background-color: #FFFFFF;\n color: #000000\n}\n\n.ace-clouds .ace_cursor {\n color: #000000\n}\n\n.ace-clouds .ace_marker-layer .ace_selection {\n background: #BDD5FC\n}\n\n.ace-clouds.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-clouds .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-clouds .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #BFBFBF\n}\n\n.ace-clouds .ace_marker-layer .ace_active-line {\n background: #FFFBD1\n}\n\n.ace-clouds .ace_gutter-active-line {\n background-color : #dcdcdc\n}\n\n.ace-clouds .ace_marker-layer .ace_selected-word {\n border: 1px solid #BDD5FC\n}\n\n.ace-clouds .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-clouds .ace_keyword,\n.ace-clouds .ace_meta,\n.ace-clouds .ace_support.ace_constant.ace_property-value {\n color: #AF956F\n}\n\n.ace-clouds .ace_keyword.ace_operator {\n color: #484848\n}\n\n.ace-clouds .ace_keyword.ace_other.ace_unit {\n color: #96DC5F\n}\n\n.ace-clouds .ace_constant.ace_language {\n color: #39946A\n}\n\n.ace-clouds .ace_constant.ace_numeric {\n color: #46A609\n}\n\n.ace-clouds .ace_constant.ace_character.ace_entity {\n color: #BF78CC\n}\n\n.ace-clouds .ace_invalid {\n background-color: #FF002A\n}\n\n.ace-clouds .ace_fold {\n background-color: #AF956F;\n border-color: #000000\n}\n\n.ace-clouds .ace_storage,\n.ace-clouds .ace_support.ace_class,\n.ace-clouds .ace_support.ace_function,\n.ace-clouds .ace_support.ace_other,\n.ace-clouds .ace_support.ace_type {\n color: #C52727\n}\n\n.ace-clouds .ace_string {\n color: #5D90CD\n}\n\n.ace-clouds .ace_comment {\n color: #BCC8BA\n}\n\n.ace-clouds .ace_entity.ace_name.ace_tag,\n.ace-clouds .ace_entity.ace_other.ace_attribute-name {\n color: #606060\n}\n\n.ace-clouds .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y\n}\n\n.ace-clouds .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-clouds"; -exports.cssText = ".ace-clouds .ace_gutter {\ -background: #ebebeb;\ -color: #333\ -}\ -.ace-clouds .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-clouds {\ -background-color: #FFFFFF;\ -color: #000000\ -}\ -.ace-clouds .ace_cursor {\ -color: #000000\ -}\ -.ace-clouds .ace_marker-layer .ace_selection {\ -background: #BDD5FC\ -}\ -.ace-clouds.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #FFFFFF;\ -}\ -.ace-clouds .ace_marker-layer .ace_step {\ -background: rgb(255, 255, 0)\ -}\ -.ace-clouds .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #BFBFBF\ -}\ -.ace-clouds .ace_marker-layer .ace_active-line {\ -background: #FFFBD1\ -}\ -.ace-clouds .ace_gutter-active-line {\ -background-color : #dcdcdc\ -}\ -.ace-clouds .ace_marker-layer .ace_selected-word {\ -border: 1px solid #BDD5FC\ -}\ -.ace-clouds .ace_invisible {\ -color: #BFBFBF\ -}\ -.ace-clouds .ace_keyword,\ -.ace-clouds .ace_meta,\ -.ace-clouds .ace_support.ace_constant.ace_property-value {\ -color: #AF956F\ -}\ -.ace-clouds .ace_keyword.ace_operator {\ -color: #484848\ -}\ -.ace-clouds .ace_keyword.ace_other.ace_unit {\ -color: #96DC5F\ -}\ -.ace-clouds .ace_constant.ace_language {\ -color: #39946A\ -}\ -.ace-clouds .ace_constant.ace_numeric {\ -color: #46A609\ -}\ -.ace-clouds .ace_constant.ace_character.ace_entity {\ -color: #BF78CC\ -}\ -.ace-clouds .ace_invalid {\ -background-color: #FF002A\ -}\ -.ace-clouds .ace_fold {\ -background-color: #AF956F;\ -border-color: #000000\ -}\ -.ace-clouds .ace_storage,\ -.ace-clouds .ace_support.ace_class,\ -.ace-clouds .ace_support.ace_function,\ -.ace-clouds .ace_support.ace_other,\ -.ace-clouds .ace_support.ace_type {\ -color: #C52727\ -}\ -.ace-clouds .ace_string {\ -color: #5D90CD\ -}\ -.ace-clouds .ace_comment {\ -color: #BCC8BA\ -}\ -.ace-clouds .ace_entity.ace_name.ace_tag,\ -.ace-clouds .ace_entity.ace_other.ace_attribute-name {\ -color: #606060\ -}\ -.ace-clouds .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y\ -}"; +}); +define("ace/theme/clouds",["require","exports","module","ace/theme/clouds-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-clouds"; +exports.cssText = require("./clouds-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/clouds"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-clouds_midnight.js b/app/Resources/ui/js/ace/theme-clouds_midnight.js index d88ece21..08739da0 100644 --- a/app/Resources/ui/js/ace/theme-clouds_midnight.js +++ b/app/Resources/ui/js/ace/theme-clouds_midnight.js @@ -1,98 +1,13 @@ -define("ace/theme/clouds_midnight",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/clouds_midnight-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-clouds-midnight .ace_gutter {\n background: #232323;\n color: #929292\n}\n\n.ace-clouds-midnight .ace_print-margin {\n width: 1px;\n background: #232323\n}\n\n.ace-clouds-midnight {\n background-color: #191919;\n color: #929292\n}\n\n.ace-clouds-midnight .ace_cursor {\n color: #7DA5DC\n}\n\n.ace-clouds-midnight .ace_marker-layer .ace_selection {\n background: #000000\n}\n\n.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #191919;\n}\n\n.ace-clouds-midnight .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-clouds-midnight .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #BFBFBF\n}\n\n.ace-clouds-midnight .ace_marker-layer .ace_active-line {\n background: rgba(215, 215, 215, 0.031)\n}\n\n.ace-clouds-midnight .ace_gutter-active-line {\n background-color: rgba(215, 215, 215, 0.031)\n}\n\n.ace-clouds-midnight .ace_marker-layer .ace_selected-word {\n border: 1px solid #000000\n}\n\n.ace-clouds-midnight .ace_invisible {\n color: #666\n}\n\n.ace-clouds-midnight .ace_keyword,\n.ace-clouds-midnight .ace_meta,\n.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {\n color: #927C5D\n}\n\n.ace-clouds-midnight .ace_keyword.ace_operator {\n color: #4B4B4B\n}\n\n.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {\n color: #366F1A\n}\n\n.ace-clouds-midnight .ace_constant.ace_language {\n color: #39946A\n}\n\n.ace-clouds-midnight .ace_constant.ace_numeric {\n color: #46A609\n}\n\n.ace-clouds-midnight .ace_constant.ace_character.ace_entity {\n color: #A165AC\n}\n\n.ace-clouds-midnight .ace_invalid {\n color: #FFFFFF;\n background-color: #E92E2E\n}\n\n.ace-clouds-midnight .ace_fold {\n background-color: #927C5D;\n border-color: #929292\n}\n\n.ace-clouds-midnight .ace_storage,\n.ace-clouds-midnight .ace_support.ace_class,\n.ace-clouds-midnight .ace_support.ace_function,\n.ace-clouds-midnight .ace_support.ace_other,\n.ace-clouds-midnight .ace_support.ace_type {\n color: #E92E2E\n}\n\n.ace-clouds-midnight .ace_string {\n color: #5D90CD\n}\n\n.ace-clouds-midnight .ace_comment {\n color: #3C403B\n}\n\n.ace-clouds-midnight .ace_entity.ace_name.ace_tag,\n.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {\n color: #606060\n}\n\n.ace-clouds-midnight .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-clouds-midnight .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-clouds-midnight"; -exports.cssText = ".ace-clouds-midnight .ace_gutter {\ -background: #232323;\ -color: #929292\ -}\ -.ace-clouds-midnight .ace_print-margin {\ -width: 1px;\ -background: #232323\ -}\ -.ace-clouds-midnight {\ -background-color: #191919;\ -color: #929292\ -}\ -.ace-clouds-midnight .ace_cursor {\ -color: #7DA5DC\ -}\ -.ace-clouds-midnight .ace_marker-layer .ace_selection {\ -background: #000000\ -}\ -.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #191919;\ -}\ -.ace-clouds-midnight .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-clouds-midnight .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #BFBFBF\ -}\ -.ace-clouds-midnight .ace_marker-layer .ace_active-line {\ -background: rgba(215, 215, 215, 0.031)\ -}\ -.ace-clouds-midnight .ace_gutter-active-line {\ -background-color: rgba(215, 215, 215, 0.031)\ -}\ -.ace-clouds-midnight .ace_marker-layer .ace_selected-word {\ -border: 1px solid #000000\ -}\ -.ace-clouds-midnight .ace_invisible {\ -color: #666\ -}\ -.ace-clouds-midnight .ace_keyword,\ -.ace-clouds-midnight .ace_meta,\ -.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {\ -color: #927C5D\ -}\ -.ace-clouds-midnight .ace_keyword.ace_operator {\ -color: #4B4B4B\ -}\ -.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {\ -color: #366F1A\ -}\ -.ace-clouds-midnight .ace_constant.ace_language {\ -color: #39946A\ -}\ -.ace-clouds-midnight .ace_constant.ace_numeric {\ -color: #46A609\ -}\ -.ace-clouds-midnight .ace_constant.ace_character.ace_entity {\ -color: #A165AC\ -}\ -.ace-clouds-midnight .ace_invalid {\ -color: #FFFFFF;\ -background-color: #E92E2E\ -}\ -.ace-clouds-midnight .ace_fold {\ -background-color: #927C5D;\ -border-color: #929292\ -}\ -.ace-clouds-midnight .ace_storage,\ -.ace-clouds-midnight .ace_support.ace_class,\ -.ace-clouds-midnight .ace_support.ace_function,\ -.ace-clouds-midnight .ace_support.ace_other,\ -.ace-clouds-midnight .ace_support.ace_type {\ -color: #E92E2E\ -}\ -.ace-clouds-midnight .ace_string {\ -color: #5D90CD\ -}\ -.ace-clouds-midnight .ace_comment {\ -color: #3C403B\ -}\ -.ace-clouds-midnight .ace_entity.ace_name.ace_tag,\ -.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {\ -color: #606060\ -}\ -.ace-clouds-midnight .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/clouds_midnight",["require","exports","module","ace/theme/clouds_midnight-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-clouds-midnight"; +exports.cssText = require("./clouds_midnight-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/clouds_midnight"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-cobalt.js b/app/Resources/ui/js/ace/theme-cobalt.js index 5459c756..53697f67 100644 --- a/app/Resources/ui/js/ace/theme-cobalt.js +++ b/app/Resources/ui/js/ace/theme-cobalt.js @@ -1,115 +1,13 @@ -define("ace/theme/cobalt",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/cobalt-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-cobalt .ace_gutter {\n background: #011e3a;\n color: rgb(128,145,160)\n}\n\n.ace-cobalt .ace_print-margin {\n width: 1px;\n background: #555555\n}\n\n.ace-cobalt {\n background-color: #002240;\n color: #FFFFFF\n}\n\n.ace-cobalt .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-cobalt .ace_marker-layer .ace_selection {\n background: rgba(179, 101, 57, 0.75)\n}\n\n.ace-cobalt.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002240;\n}\n\n.ace-cobalt .ace_marker-layer .ace_step {\n background: rgb(127, 111, 19)\n}\n\n.ace-cobalt .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.15)\n}\n\n.ace-cobalt .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.35)\n}\n\n.ace-cobalt .ace_gutter-active-line {\n background-color: rgba(0, 0, 0, 0.35)\n}\n\n.ace-cobalt .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(179, 101, 57, 0.75)\n}\n\n.ace-cobalt .ace_invisible {\n color: rgba(255, 255, 255, 0.15)\n}\n\n.ace-cobalt .ace_keyword,\n.ace-cobalt .ace_meta {\n color: #FF9D00\n}\n\n.ace-cobalt .ace_constant,\n.ace-cobalt .ace_constant.ace_character,\n.ace-cobalt .ace_constant.ace_character.ace_escape,\n.ace-cobalt .ace_constant.ace_other {\n color: #FF628C\n}\n\n.ace-cobalt .ace_invalid {\n color: #F8F8F8;\n background-color: #800F00\n}\n\n.ace-cobalt .ace_support {\n color: #80FFBB\n}\n\n.ace-cobalt .ace_support.ace_constant {\n color: #EB939A\n}\n\n.ace-cobalt .ace_fold {\n background-color: #FF9D00;\n border-color: #FFFFFF\n}\n\n.ace-cobalt .ace_support.ace_function {\n color: #FFB054\n}\n\n.ace-cobalt .ace_storage {\n color: #FFEE80\n}\n\n.ace-cobalt .ace_entity {\n color: #FFDD00\n}\n\n.ace-cobalt .ace_string {\n color: #3AD900\n}\n\n.ace-cobalt .ace_string.ace_regexp {\n color: #80FFC2\n}\n\n.ace-cobalt .ace_comment {\n font-style: italic;\n color: #0088FF\n}\n\n.ace-cobalt .ace_heading,\n.ace-cobalt .ace_markup.ace_heading {\n color: #C8E4FD;\n background-color: #001221\n}\n\n.ace-cobalt .ace_list,\n.ace-cobalt .ace_markup.ace_list {\n background-color: #130D26\n}\n\n.ace-cobalt .ace_variable {\n color: #CCCCCC\n}\n\n.ace-cobalt .ace_variable.ace_language {\n color: #FF80E1\n}\n\n.ace-cobalt .ace_meta.ace_tag {\n color: #9EFFFF\n}\n\n.ace-cobalt .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-cobalt .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-cobalt"; -exports.cssText = ".ace-cobalt .ace_gutter {\ -background: #011e3a;\ -color: rgb(128,145,160)\ -}\ -.ace-cobalt .ace_print-margin {\ -width: 1px;\ -background: #555555\ -}\ -.ace-cobalt {\ -background-color: #002240;\ -color: #FFFFFF\ -}\ -.ace-cobalt .ace_cursor {\ -color: #FFFFFF\ -}\ -.ace-cobalt .ace_marker-layer .ace_selection {\ -background: rgba(179, 101, 57, 0.75)\ -}\ -.ace-cobalt.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #002240;\ -}\ -.ace-cobalt .ace_marker-layer .ace_step {\ -background: rgb(127, 111, 19)\ -}\ -.ace-cobalt .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(255, 255, 255, 0.15)\ -}\ -.ace-cobalt .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.35)\ -}\ -.ace-cobalt .ace_gutter-active-line {\ -background-color: rgba(0, 0, 0, 0.35)\ -}\ -.ace-cobalt .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(179, 101, 57, 0.75)\ -}\ -.ace-cobalt .ace_invisible {\ -color: rgba(255, 255, 255, 0.15)\ -}\ -.ace-cobalt .ace_keyword,\ -.ace-cobalt .ace_meta {\ -color: #FF9D00\ -}\ -.ace-cobalt .ace_constant,\ -.ace-cobalt .ace_constant.ace_character,\ -.ace-cobalt .ace_constant.ace_character.ace_escape,\ -.ace-cobalt .ace_constant.ace_other {\ -color: #FF628C\ -}\ -.ace-cobalt .ace_invalid {\ -color: #F8F8F8;\ -background-color: #800F00\ -}\ -.ace-cobalt .ace_support {\ -color: #80FFBB\ -}\ -.ace-cobalt .ace_support.ace_constant {\ -color: #EB939A\ -}\ -.ace-cobalt .ace_fold {\ -background-color: #FF9D00;\ -border-color: #FFFFFF\ -}\ -.ace-cobalt .ace_support.ace_function {\ -color: #FFB054\ -}\ -.ace-cobalt .ace_storage {\ -color: #FFEE80\ -}\ -.ace-cobalt .ace_entity {\ -color: #FFDD00\ -}\ -.ace-cobalt .ace_string {\ -color: #3AD900\ -}\ -.ace-cobalt .ace_string.ace_regexp {\ -color: #80FFC2\ -}\ -.ace-cobalt .ace_comment {\ -font-style: italic;\ -color: #0088FF\ -}\ -.ace-cobalt .ace_heading,\ -.ace-cobalt .ace_markup.ace_heading {\ -color: #C8E4FD;\ -background-color: #001221\ -}\ -.ace-cobalt .ace_list,\ -.ace-cobalt .ace_markup.ace_list {\ -background-color: #130D26\ -}\ -.ace-cobalt .ace_variable {\ -color: #CCCCCC\ -}\ -.ace-cobalt .ace_variable.ace_language {\ -color: #FF80E1\ -}\ -.ace-cobalt .ace_meta.ace_tag {\ -color: #9EFFFF\ -}\ -.ace-cobalt .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y\ -}\ -"; +}); +define("ace/theme/cobalt",["require","exports","module","ace/theme/cobalt-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-cobalt"; +exports.cssText = require("./cobalt-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/cobalt"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-crimson_editor.js b/app/Resources/ui/js/ace/theme-crimson_editor.js index b162e5be..93d240f7 100644 --- a/app/Resources/ui/js/ace/theme-crimson_editor.js +++ b/app/Resources/ui/js/ace/theme-crimson_editor.js @@ -1,120 +1,13 @@ -define("ace/theme/crimson_editor",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -exports.isDark = false; -exports.cssText = ".ace-crimson-editor .ace_gutter {\ -background: #ebebeb;\ -color: #333;\ -overflow : hidden;\ -}\ -.ace-crimson-editor .ace_gutter-layer {\ -width: 100%;\ -text-align: right;\ -}\ -.ace-crimson-editor .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-crimson-editor {\ -background-color: #FFFFFF;\ -color: rgb(64, 64, 64);\ -}\ -.ace-crimson-editor .ace_cursor {\ -color: black;\ -}\ -.ace-crimson-editor .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-crimson-editor .ace_identifier {\ -color: black;\ -}\ -.ace-crimson-editor .ace_keyword {\ -color: blue;\ -}\ -.ace-crimson-editor .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-crimson-editor .ace_constant.ace_language {\ -color: rgb(255, 156, 0);\ -}\ -.ace-crimson-editor .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-crimson-editor .ace_invalid {\ -text-decoration: line-through;\ -color: rgb(224, 0, 0);\ -}\ -.ace-crimson-editor .ace_fold {\ -}\ -.ace-crimson-editor .ace_support.ace_function {\ -color: rgb(192, 0, 0);\ -}\ -.ace-crimson-editor .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-crimson-editor .ace_support.ace_type,\ -.ace-crimson-editor .ace_support.ace_class {\ -color: rgb(109, 121, 222);\ -}\ -.ace-crimson-editor .ace_keyword.ace_operator {\ -color: rgb(49, 132, 149);\ -}\ -.ace-crimson-editor .ace_string {\ -color: rgb(128, 0, 128);\ -}\ -.ace-crimson-editor .ace_comment {\ -color: rgb(76, 136, 107);\ -}\ -.ace-crimson-editor .ace_comment.ace_doc {\ -color: rgb(0, 102, 255);\ -}\ -.ace-crimson-editor .ace_comment.ace_doc.ace_tag {\ -color: rgb(128, 159, 191);\ -}\ -.ace-crimson-editor .ace_constant.ace_numeric {\ -color: rgb(0, 0, 64);\ -}\ -.ace-crimson-editor .ace_variable {\ -color: rgb(0, 64, 128);\ -}\ -.ace-crimson-editor .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-crimson-editor .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-crimson-editor .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-crimson-editor .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-crimson-editor .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-crimson-editor .ace_marker-layer .ace_active-line {\ -background: rgb(232, 242, 254);\ -}\ -.ace-crimson-editor .ace_gutter-active-line {\ -background-color : #dcdcdc;\ -}\ -.ace-crimson-editor .ace_meta.ace_tag {\ -color:rgb(28, 2, 255);\ -}\ -.ace-crimson-editor .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-crimson-editor .ace_string.ace_regex {\ -color: rgb(192, 0, 192);\ -}\ -.ace-crimson-editor .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}"; +define("ace/theme/crimson_editor-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-crimson-editor .ace_gutter {\n background: #ebebeb;\n color: #333;\n overflow : hidden;\n}\n\n.ace-crimson-editor .ace_gutter-layer {\n width: 100%;\n text-align: right;\n}\n\n.ace-crimson-editor .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-crimson-editor {\n background-color: #FFFFFF;\n color: rgb(64, 64, 64);\n}\n\n.ace-crimson-editor .ace_cursor {\n color: black;\n}\n\n.ace-crimson-editor .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-crimson-editor .ace_identifier {\n color: black;\n}\n\n.ace-crimson-editor .ace_keyword {\n color: blue;\n}\n\n.ace-crimson-editor .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-crimson-editor .ace_constant.ace_language {\n color: rgb(255, 156, 0);\n}\n\n.ace-crimson-editor .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-crimson-editor .ace_invalid {\n text-decoration: line-through;\n color: rgb(224, 0, 0);\n}\n\n.ace-crimson-editor .ace_fold {\n}\n\n.ace-crimson-editor .ace_support.ace_function {\n color: rgb(192, 0, 0);\n}\n\n.ace-crimson-editor .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-crimson-editor .ace_support.ace_type,\n.ace-crimson-editor .ace_support.ace_class {\n color: rgb(109, 121, 222);\n}\n\n.ace-crimson-editor .ace_keyword.ace_operator {\n color: rgb(49, 132, 149);\n}\n\n.ace-crimson-editor .ace_string {\n color: rgb(128, 0, 128);\n}\n\n.ace-crimson-editor .ace_comment {\n color: rgb(76, 136, 107);\n}\n\n.ace-crimson-editor .ace_comment.ace_doc {\n color: rgb(0, 102, 255);\n}\n\n.ace-crimson-editor .ace_comment.ace_doc.ace_tag {\n color: rgb(128, 159, 191);\n}\n\n.ace-crimson-editor .ace_constant.ace_numeric {\n color: rgb(0, 0, 64);\n}\n\n.ace-crimson-editor .ace_variable {\n color: rgb(0, 64, 128);\n}\n\n.ace-crimson-editor .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-crimson-editor .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-crimson-editor .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-crimson-editor .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-crimson-editor .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-crimson-editor .ace_marker-layer .ace_active-line {\n background: rgb(232, 242, 254);\n}\n\n.ace-crimson-editor .ace_gutter-active-line {\n background-color : #dcdcdc;\n}\n\n.ace-crimson-editor .ace_meta.ace_tag {\n color:rgb(28, 2, 255);\n}\n\n.ace-crimson-editor .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-crimson-editor .ace_string.ace_regex {\n color: rgb(192, 0, 192);\n}\n\n.ace-crimson-editor .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-crimson-editor .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.cssClass = "ace-crimson-editor"; +}); +define("ace/theme/crimson_editor",["require","exports","module","ace/theme/crimson_editor-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssText = require("./crimson_editor-css"); +exports.cssClass = "ace-crimson-editor"; var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/crimson_editor"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-dawn.js b/app/Resources/ui/js/ace/theme-dawn.js index 923dad68..46817fe1 100644 --- a/app/Resources/ui/js/ace/theme-dawn.js +++ b/app/Resources/ui/js/ace/theme-dawn.js @@ -1,110 +1,13 @@ -define("ace/theme/dawn",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/dawn-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-dawn .ace_gutter {\n background: #ebebeb;\n color: #333\n}\n\n.ace-dawn .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-dawn {\n background-color: #F9F9F9;\n color: #080808\n}\n\n.ace-dawn .ace_cursor {\n color: #000000\n}\n\n.ace-dawn .ace_marker-layer .ace_selection {\n background: rgba(39, 95, 255, 0.30)\n}\n\n.ace-dawn.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #F9F9F9;\n}\n\n.ace-dawn .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-dawn .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(75, 75, 126, 0.50)\n}\n\n.ace-dawn .ace_marker-layer .ace_active-line {\n background: rgba(36, 99, 180, 0.12)\n}\n\n.ace-dawn .ace_gutter-active-line {\n background-color : #dcdcdc\n}\n\n.ace-dawn .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(39, 95, 255, 0.30)\n}\n\n.ace-dawn .ace_invisible {\n color: rgba(75, 75, 126, 0.50)\n}\n\n.ace-dawn .ace_keyword,\n.ace-dawn .ace_meta {\n color: #794938\n}\n\n.ace-dawn .ace_constant,\n.ace-dawn .ace_constant.ace_character,\n.ace-dawn .ace_constant.ace_character.ace_escape,\n.ace-dawn .ace_constant.ace_other {\n color: #811F24\n}\n\n.ace-dawn .ace_invalid.ace_illegal {\n text-decoration: underline;\n font-style: italic;\n color: #F8F8F8;\n background-color: #B52A1D\n}\n\n.ace-dawn .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #B52A1D\n}\n\n.ace-dawn .ace_support {\n color: #691C97\n}\n\n.ace-dawn .ace_support.ace_constant {\n color: #B4371F\n}\n\n.ace-dawn .ace_fold {\n background-color: #794938;\n border-color: #080808\n}\n\n.ace-dawn .ace_list,\n.ace-dawn .ace_markup.ace_list,\n.ace-dawn .ace_support.ace_function {\n color: #693A17\n}\n\n.ace-dawn .ace_storage {\n font-style: italic;\n color: #A71D5D\n}\n\n.ace-dawn .ace_string {\n color: #0B6125\n}\n\n.ace-dawn .ace_string.ace_regexp {\n color: #CF5628\n}\n\n.ace-dawn .ace_comment {\n font-style: italic;\n color: #5A525F\n}\n\n.ace-dawn .ace_heading,\n.ace-dawn .ace_markup.ace_heading {\n color: #19356D\n}\n\n.ace-dawn .ace_variable {\n color: #234A97\n}\n\n.ace-dawn .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-dawn .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-dawn"; -exports.cssText = ".ace-dawn .ace_gutter {\ -background: #ebebeb;\ -color: #333\ -}\ -.ace-dawn .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-dawn {\ -background-color: #F9F9F9;\ -color: #080808\ -}\ -.ace-dawn .ace_cursor {\ -color: #000000\ -}\ -.ace-dawn .ace_marker-layer .ace_selection {\ -background: rgba(39, 95, 255, 0.30)\ -}\ -.ace-dawn.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #F9F9F9;\ -}\ -.ace-dawn .ace_marker-layer .ace_step {\ -background: rgb(255, 255, 0)\ -}\ -.ace-dawn .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(75, 75, 126, 0.50)\ -}\ -.ace-dawn .ace_marker-layer .ace_active-line {\ -background: rgba(36, 99, 180, 0.12)\ -}\ -.ace-dawn .ace_gutter-active-line {\ -background-color : #dcdcdc\ -}\ -.ace-dawn .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(39, 95, 255, 0.30)\ -}\ -.ace-dawn .ace_invisible {\ -color: rgba(75, 75, 126, 0.50)\ -}\ -.ace-dawn .ace_keyword,\ -.ace-dawn .ace_meta {\ -color: #794938\ -}\ -.ace-dawn .ace_constant,\ -.ace-dawn .ace_constant.ace_character,\ -.ace-dawn .ace_constant.ace_character.ace_escape,\ -.ace-dawn .ace_constant.ace_other {\ -color: #811F24\ -}\ -.ace-dawn .ace_invalid.ace_illegal {\ -text-decoration: underline;\ -font-style: italic;\ -color: #F8F8F8;\ -background-color: #B52A1D\ -}\ -.ace-dawn .ace_invalid.ace_deprecated {\ -text-decoration: underline;\ -font-style: italic;\ -color: #B52A1D\ -}\ -.ace-dawn .ace_support {\ -color: #691C97\ -}\ -.ace-dawn .ace_support.ace_constant {\ -color: #B4371F\ -}\ -.ace-dawn .ace_fold {\ -background-color: #794938;\ -border-color: #080808\ -}\ -.ace-dawn .ace_list,\ -.ace-dawn .ace_markup.ace_list,\ -.ace-dawn .ace_support.ace_function {\ -color: #693A17\ -}\ -.ace-dawn .ace_storage {\ -font-style: italic;\ -color: #A71D5D\ -}\ -.ace-dawn .ace_string {\ -color: #0B6125\ -}\ -.ace-dawn .ace_string.ace_regexp {\ -color: #CF5628\ -}\ -.ace-dawn .ace_comment {\ -font-style: italic;\ -color: #5A525F\ -}\ -.ace-dawn .ace_heading,\ -.ace-dawn .ace_markup.ace_heading {\ -color: #19356D\ -}\ -.ace-dawn .ace_variable {\ -color: #234A97\ -}\ -.ace-dawn .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/dawn",["require","exports","module","ace/theme/dawn-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-dawn"; +exports.cssText = require("./dawn-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/dawn"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-dracula.js b/app/Resources/ui/js/ace/theme-dracula.js index 3085b9d9..e1e2f143 100644 --- a/app/Resources/ui/js/ace/theme-dracula.js +++ b/app/Resources/ui/js/ace/theme-dracula.js @@ -1,130 +1,14 @@ -define("ace/theme/dracula",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/dracula-css",["require","exports","module"], function(require, exports, module){module.exports = "/*\n * Copyright \u00A9 2017 Zeno Rocha \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \u201CSoftware\u201D), 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:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \u201CAS IS\u201D, 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.\n */\n\n.ace-dracula .ace_gutter {\n background: #282a36;\n color: rgb(144,145,148)\n}\n\n.ace-dracula .ace_print-margin {\n width: 1px;\n background: #44475a\n}\n\n.ace-dracula {\n background-color: #282a36;\n color: #f8f8f2\n}\n\n.ace-dracula .ace_cursor {\n color: #f8f8f0\n}\n\n.ace-dracula .ace_marker-layer .ace_selection {\n background: #44475a\n}\n\n.ace-dracula.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #282a36;\n border-radius: 2px\n}\n\n.ace-dracula .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-dracula .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #a29709\n}\n\n.ace-dracula .ace_marker-layer .ace_active-line {\n background: #44475a\n}\n\n.ace-dracula .ace_gutter-active-line {\n background-color: #44475a\n}\n\n.ace-dracula .ace_marker-layer .ace_selected-word {\n box-shadow: 0px 0px 0px 1px #a29709;\n border-radius: 3px;\n}\n\n.ace-dracula .ace_fold {\n background-color: #50fa7b;\n border-color: #f8f8f2\n}\n\n.ace-dracula .ace_keyword {\n color: #ff79c6\n}\n\n.ace-dracula .ace_constant.ace_language {\n color: #bd93f9\n}\n\n.ace-dracula .ace_constant.ace_numeric {\n color: #bd93f9\n}\n\n.ace-dracula .ace_constant.ace_character {\n color: #bd93f9\n}\n\n.ace-dracula .ace_constant.ace_character.ace_escape {\n color: #ff79c6\n}\n\n.ace-dracula .ace_constant.ace_other {\n color: #bd93f9\n}\n\n.ace-dracula .ace_support.ace_function {\n color: #8be9fd\n}\n\n.ace-dracula .ace_support.ace_constant {\n color: #6be5fd\n}\n\n.ace-dracula .ace_support.ace_class {\n font-style: italic;\n color: #66d9ef\n}\n\n.ace-dracula .ace_support.ace_type {\n font-style: italic;\n color: #66d9ef\n}\n\n.ace-dracula .ace_storage {\n color: #ff79c6\n}\n\n.ace-dracula .ace_storage.ace_type {\n font-style: italic;\n color: #8be9fd\n}\n\n.ace-dracula .ace_invalid {\n color: #F8F8F0;\n background-color: #ff79c6\n}\n\n.ace-dracula .ace_invalid.ace_deprecated {\n color: #F8F8F0;\n background-color: #bd93f9\n}\n\n.ace-dracula .ace_string {\n color: #f1fa8c\n}\n\n.ace-dracula .ace_comment {\n color: #6272a4\n}\n\n.ace-dracula .ace_variable {\n color: #50fa7b\n}\n\n.ace-dracula .ace_variable.ace_parameter {\n font-style: italic;\n color: #ffb86c\n}\n\n.ace-dracula .ace_entity.ace_other.ace_attribute-name {\n color: #50fa7b\n}\n\n.ace-dracula .ace_entity.ace_name.ace_function {\n color: #50fa7b\n}\n\n.ace-dracula .ace_entity.ace_name.ace_tag {\n color: #ff79c6\n}\n.ace-dracula .ace_invisible {\n color: #626680;\n}\n\n.ace-dracula .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-dracula .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACAQMAAACjTyRkAAAABlBMVEUAAADCwsK76u2xAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjYGBoAAAAhACBGFbxzQAAAABJRU5ErkJggg==\") right repeat-y;\n}\n"; -exports.isDark = true; +}); + +define("ace/theme/dracula",["require","exports","module","ace/theme/dracula-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; exports.cssClass = "ace-dracula"; -exports.cssText = "\ -.ace-dracula .ace_gutter {\ -background: #282a36;\ -color: rgb(144,145,148)\ -}\ -.ace-dracula .ace_print-margin {\ -width: 1px;\ -background: #44475a\ -}\ -.ace-dracula {\ -background-color: #282a36;\ -color: #f8f8f2\ -}\ -.ace-dracula .ace_cursor {\ -color: #f8f8f0\ -}\ -.ace-dracula .ace_marker-layer .ace_selection {\ -background: #44475a\ -}\ -.ace-dracula.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #282a36;\ -border-radius: 2px\ -}\ -.ace-dracula .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174)\ -}\ -.ace-dracula .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #a29709\ -}\ -.ace-dracula .ace_marker-layer .ace_active-line {\ -background: #44475a\ -}\ -.ace-dracula .ace_gutter-active-line {\ -background-color: #44475a\ -}\ -.ace-dracula .ace_marker-layer .ace_selected-word {\ -box-shadow: 0px 0px 0px 1px #a29709;\ -border-radius: 3px;\ -}\ -.ace-dracula .ace_fold {\ -background-color: #50fa7b;\ -border-color: #f8f8f2\ -}\ -.ace-dracula .ace_keyword {\ -color: #ff79c6\ -}\ -.ace-dracula .ace_constant.ace_language {\ -color: #bd93f9\ -}\ -.ace-dracula .ace_constant.ace_numeric {\ -color: #bd93f9\ -}\ -.ace-dracula .ace_constant.ace_character {\ -color: #bd93f9\ -}\ -.ace-dracula .ace_constant.ace_character.ace_escape {\ -color: #ff79c6\ -}\ -.ace-dracula .ace_constant.ace_other {\ -color: #bd93f9\ -}\ -.ace-dracula .ace_support.ace_function {\ -color: #8be9fd\ -}\ -.ace-dracula .ace_support.ace_constant {\ -color: #6be5fd\ -}\ -.ace-dracula .ace_support.ace_class {\ -font-style: italic;\ -color: #66d9ef\ -}\ -.ace-dracula .ace_support.ace_type {\ -font-style: italic;\ -color: #66d9ef\ -}\ -.ace-dracula .ace_storage {\ -color: #ff79c6\ -}\ -.ace-dracula .ace_storage.ace_type {\ -font-style: italic;\ -color: #8be9fd\ -}\ -.ace-dracula .ace_invalid {\ -color: #F8F8F0;\ -background-color: #ff79c6\ -}\ -.ace-dracula .ace_invalid.ace_deprecated {\ -color: #F8F8F0;\ -background-color: #bd93f9\ -}\ -.ace-dracula .ace_string {\ -color: #f1fa8c\ -}\ -.ace-dracula .ace_comment {\ -color: #6272a4\ -}\ -.ace-dracula .ace_variable {\ -color: #50fa7b\ -}\ -.ace-dracula .ace_variable.ace_parameter {\ -font-style: italic;\ -color: #ffb86c\ -}\ -.ace-dracula .ace_entity.ace_other.ace_attribute-name {\ -color: #50fa7b\ -}\ -.ace-dracula .ace_entity.ace_name.ace_function {\ -color: #50fa7b\ -}\ -.ace-dracula .ace_entity.ace_name.ace_tag {\ -color: #ff79c6\ -}\ -.ace-dracula .ace_invisible {\ -color: #626680;\ -}\ -.ace-dracula .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ -}"; +exports.cssText = require("./dracula-css"); exports.$selectionColorConflict = true; - var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/dracula"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-dreamweaver.js b/app/Resources/ui/js/ace/theme-dreamweaver.js index fa9771e9..1e4c5c80 100644 --- a/app/Resources/ui/js/ace/theme-dreamweaver.js +++ b/app/Resources/ui/js/ace/theme-dreamweaver.js @@ -1,143 +1,13 @@ -define("ace/theme/dreamweaver",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -exports.isDark = false; -exports.cssClass = "ace-dreamweaver"; -exports.cssText = ".ace-dreamweaver .ace_gutter {\ -background: #e8e8e8;\ -color: #333;\ -}\ -.ace-dreamweaver .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-dreamweaver {\ -background-color: #FFFFFF;\ -color: black;\ -}\ -.ace-dreamweaver .ace_fold {\ -background-color: #757AD8;\ -}\ -.ace-dreamweaver .ace_cursor {\ -color: black;\ -}\ -.ace-dreamweaver .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-dreamweaver .ace_storage,\ -.ace-dreamweaver .ace_keyword {\ -color: blue;\ -}\ -.ace-dreamweaver .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-dreamweaver .ace_constant.ace_language {\ -color: rgb(88, 92, 246);\ -}\ -.ace-dreamweaver .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-dreamweaver .ace_invalid {\ -background-color: rgb(153, 0, 0);\ -color: white;\ -}\ -.ace-dreamweaver .ace_support.ace_function {\ -color: rgb(60, 76, 114);\ -}\ -.ace-dreamweaver .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-dreamweaver .ace_support.ace_type,\ -.ace-dreamweaver .ace_support.ace_class {\ -color: #009;\ -}\ -.ace-dreamweaver .ace_support.ace_php_tag {\ -color: #f00;\ -}\ -.ace-dreamweaver .ace_keyword.ace_operator {\ -color: rgb(104, 118, 135);\ -}\ -.ace-dreamweaver .ace_string {\ -color: #00F;\ -}\ -.ace-dreamweaver .ace_comment {\ -color: rgb(76, 136, 107);\ -}\ -.ace-dreamweaver .ace_comment.ace_doc {\ -color: rgb(0, 102, 255);\ -}\ -.ace-dreamweaver .ace_comment.ace_doc.ace_tag {\ -color: rgb(128, 159, 191);\ -}\ -.ace-dreamweaver .ace_constant.ace_numeric {\ -color: rgb(0, 0, 205);\ -}\ -.ace-dreamweaver .ace_variable {\ -color: #06F\ -}\ -.ace-dreamweaver .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-dreamweaver .ace_entity.ace_name.ace_function {\ -color: #00F;\ -}\ -.ace-dreamweaver .ace_heading {\ -color: rgb(12, 7, 255);\ -}\ -.ace-dreamweaver .ace_list {\ -color:rgb(185, 6, 144);\ -}\ -.ace-dreamweaver .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-dreamweaver .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-dreamweaver .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-dreamweaver .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-dreamweaver .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.07);\ -}\ -.ace-dreamweaver .ace_gutter-active-line {\ -background-color : #DCDCDC;\ -}\ -.ace-dreamweaver .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-dreamweaver .ace_meta.ace_tag {\ -color:#009;\ -}\ -.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {\ -color:#060;\ -}\ -.ace-dreamweaver .ace_meta.ace_tag.ace_form {\ -color:#F90;\ -}\ -.ace-dreamweaver .ace_meta.ace_tag.ace_image {\ -color:#909;\ -}\ -.ace-dreamweaver .ace_meta.ace_tag.ace_script {\ -color:#900;\ -}\ -.ace-dreamweaver .ace_meta.ace_tag.ace_style {\ -color:#909;\ -}\ -.ace-dreamweaver .ace_meta.ace_tag.ace_table {\ -color:#099;\ -}\ -.ace-dreamweaver .ace_string.ace_regex {\ -color: rgb(255, 0, 0)\ -}\ -.ace-dreamweaver .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}"; +define("ace/theme/dreamweaver-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-dreamweaver .ace_gutter {\n background: #e8e8e8;\n color: #333;\n}\n\n.ace-dreamweaver .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-dreamweaver {\n background-color: #FFFFFF;\n color: black;\n}\n\n.ace-dreamweaver .ace_fold {\n background-color: #757AD8;\n}\n\n.ace-dreamweaver .ace_cursor {\n color: black;\n}\n \n.ace-dreamweaver .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-dreamweaver .ace_storage,\n.ace-dreamweaver .ace_keyword {\n color: blue;\n}\n\n.ace-dreamweaver .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-dreamweaver .ace_constant.ace_language {\n color: rgb(88, 92, 246);\n}\n\n.ace-dreamweaver .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-dreamweaver .ace_invalid {\n background-color: rgb(153, 0, 0);\n color: white;\n}\n\n.ace-dreamweaver .ace_support.ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-dreamweaver .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-dreamweaver .ace_support.ace_type,\n.ace-dreamweaver .ace_support.ace_class {\n color: #009;\n}\n\n.ace-dreamweaver .ace_support.ace_php_tag {\n color: #f00;\n}\n\n.ace-dreamweaver .ace_keyword.ace_operator {\n color: rgb(104, 118, 135);\n}\n\n.ace-dreamweaver .ace_string {\n color: #00F;\n}\n\n.ace-dreamweaver .ace_comment {\n color: rgb(76, 136, 107);\n}\n\n.ace-dreamweaver .ace_comment.ace_doc {\n color: rgb(0, 102, 255);\n}\n\n.ace-dreamweaver .ace_comment.ace_doc.ace_tag {\n color: rgb(128, 159, 191);\n}\n\n.ace-dreamweaver .ace_constant.ace_numeric {\n color: rgb(0, 0, 205);\n}\n\n.ace-dreamweaver .ace_variable {\n color: #06F\n}\n\n.ace-dreamweaver .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-dreamweaver .ace_entity.ace_name.ace_function {\n color: #00F;\n}\n\n\n.ace-dreamweaver .ace_heading {\n color: rgb(12, 7, 255);\n}\n\n.ace-dreamweaver .ace_list {\n color:rgb(185, 6, 144);\n}\n\n.ace-dreamweaver .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-dreamweaver .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-dreamweaver .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-dreamweaver .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-dreamweaver .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.07);\n}\n\n.ace-dreamweaver .ace_gutter-active-line {\n background-color : #DCDCDC;\n}\n\n.ace-dreamweaver .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-dreamweaver .ace_meta.ace_tag {\n color:#009;\n}\n\n.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {\n color:#060;\n}\n\n.ace-dreamweaver .ace_meta.ace_tag.ace_form {\n color:#F90;\n}\n\n.ace-dreamweaver .ace_meta.ace_tag.ace_image {\n color:#909;\n}\n\n.ace-dreamweaver .ace_meta.ace_tag.ace_script {\n color:#900;\n}\n\n.ace-dreamweaver .ace_meta.ace_tag.ace_style {\n color:#909;\n}\n\n.ace-dreamweaver .ace_meta.ace_tag.ace_table {\n color:#099;\n}\n\n.ace-dreamweaver .ace_string.ace_regex {\n color: rgb(255, 0, 0)\n}\n\n.ace-dreamweaver .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-dreamweaver .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; + +}); +define("ace/theme/dreamweaver",["require","exports","module","ace/theme/dreamweaver-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-dreamweaver"; +exports.cssText = require("./dreamweaver-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/dreamweaver"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-eclipse.js b/app/Resources/ui/js/ace/theme-eclipse.js index 5deddde3..1163cb30 100644 --- a/app/Resources/ui/js/ace/theme-eclipse.js +++ b/app/Resources/ui/js/ace/theme-eclipse.js @@ -1,100 +1,14 @@ -define("ace/theme/eclipse",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; +define("ace/theme/eclipse-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-eclipse .ace_gutter {\n background: #ebebeb;\n border-right: 1px solid rgb(159, 159, 159);\n color: rgb(136, 136, 136);\n}\n\n.ace-eclipse .ace_print-margin {\n width: 1px;\n background: #ebebeb;\n}\n\n.ace-eclipse {\n background-color: #FFFFFF;\n color: black;\n}\n\n.ace-eclipse .ace_fold {\n background-color: rgb(60, 76, 114);\n}\n\n.ace-eclipse .ace_cursor {\n color: black;\n}\n\n.ace-eclipse .ace_storage,\n.ace-eclipse .ace_keyword,\n.ace-eclipse .ace_variable {\n color: rgb(127, 0, 85);\n}\n\n.ace-eclipse .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-eclipse .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-eclipse .ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-eclipse .ace_string {\n color: rgb(42, 0, 255);\n}\n\n.ace-eclipse .ace_comment {\n color: rgb(113, 150, 130);\n}\n\n.ace-eclipse .ace_comment.ace_doc {\n color: rgb(63, 95, 191);\n}\n\n.ace-eclipse .ace_comment.ace_doc.ace_tag {\n color: rgb(127, 159, 191);\n}\n\n.ace-eclipse .ace_constant.ace_numeric {\n color: darkblue;\n}\n\n.ace-eclipse .ace_tag {\n color: rgb(25, 118, 116);\n}\n\n.ace-eclipse .ace_type {\n color: rgb(127, 0, 127);\n}\n\n.ace-eclipse .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-eclipse .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-eclipse .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-eclipse .ace_meta.ace_tag {\n color:rgb(25, 118, 116);\n}\n\n.ace-eclipse .ace_invisible {\n color: #ddd;\n}\n\n.ace-eclipse .ace_entity.ace_other.ace_attribute-name {\n color:rgb(127, 0, 127);\n}\n.ace-eclipse .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0);\n}\n\n.ace-eclipse .ace_active-line {\n background: rgb(232, 242, 254);\n}\n\n.ace-eclipse .ace_gutter-active-line {\n background-color : #DADADA;\n}\n\n.ace-eclipse .ace_marker-layer .ace_selected-word {\n border: 1px solid rgb(181, 213, 255);\n}\n\n.ace-eclipse .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-eclipse .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssText = ".ace-eclipse .ace_gutter {\ -background: #ebebeb;\ -border-right: 1px solid rgb(159, 159, 159);\ -color: rgb(136, 136, 136);\ -}\ -.ace-eclipse .ace_print-margin {\ -width: 1px;\ -background: #ebebeb;\ -}\ -.ace-eclipse {\ -background-color: #FFFFFF;\ -color: black;\ -}\ -.ace-eclipse .ace_fold {\ -background-color: rgb(60, 76, 114);\ -}\ -.ace-eclipse .ace_cursor {\ -color: black;\ -}\ -.ace-eclipse .ace_storage,\ -.ace-eclipse .ace_keyword,\ -.ace-eclipse .ace_variable {\ -color: rgb(127, 0, 85);\ -}\ -.ace-eclipse .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-eclipse .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-eclipse .ace_function {\ -color: rgb(60, 76, 114);\ -}\ -.ace-eclipse .ace_string {\ -color: rgb(42, 0, 255);\ -}\ -.ace-eclipse .ace_comment {\ -color: rgb(113, 150, 130);\ -}\ -.ace-eclipse .ace_comment.ace_doc {\ -color: rgb(63, 95, 191);\ -}\ -.ace-eclipse .ace_comment.ace_doc.ace_tag {\ -color: rgb(127, 159, 191);\ -}\ -.ace-eclipse .ace_constant.ace_numeric {\ -color: darkblue;\ -}\ -.ace-eclipse .ace_tag {\ -color: rgb(25, 118, 116);\ -}\ -.ace-eclipse .ace_type {\ -color: rgb(127, 0, 127);\ -}\ -.ace-eclipse .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-eclipse .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-eclipse .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-eclipse .ace_meta.ace_tag {\ -color:rgb(25, 118, 116);\ -}\ -.ace-eclipse .ace_invisible {\ -color: #ddd;\ -}\ -.ace-eclipse .ace_entity.ace_other.ace_attribute-name {\ -color:rgb(127, 0, 127);\ -}\ -.ace-eclipse .ace_marker-layer .ace_step {\ -background: rgb(255, 255, 0);\ -}\ -.ace-eclipse .ace_active-line {\ -background: rgb(232, 242, 254);\ -}\ -.ace-eclipse .ace_gutter-active-line {\ -background-color : #DADADA;\ -}\ -.ace-eclipse .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgb(181, 213, 255);\ -}\ -.ace-eclipse .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}"; +}); +define("ace/theme/eclipse",["require","exports","module","ace/theme/eclipse-css","ace/lib/dom"], function(require, exports, module){"use strict"; +exports.isDark = false; +exports.cssText = require("./eclipse-css"); exports.cssClass = "ace-eclipse"; - var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/eclipse"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-github.js b/app/Resources/ui/js/ace/theme-github.js index 12d70bc7..80bffa3a 100644 --- a/app/Resources/ui/js/ace/theme-github.js +++ b/app/Resources/ui/js/ace/theme-github.js @@ -1,105 +1,13 @@ -define("ace/theme/github",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/github-css",["require","exports","module"], function(require, exports, module){module.exports = "/* CSS style content from github's default pygments highlighter template.\n Cursor and selection styles from textmate.css. */\n.ace-github .ace_gutter {\n background: #e8e8e8;\n color: #AAA;\n}\n\n.ace-github {\n background: #fff;\n color: #000;\n}\n\n.ace-github .ace_keyword {\n font-weight: bold;\n}\n\n.ace-github .ace_string {\n color: #D14;\n}\n\n.ace-github .ace_variable.ace_class {\n color: teal;\n}\n\n.ace-github .ace_constant.ace_numeric {\n color: #099;\n}\n\n.ace-github .ace_constant.ace_buildin {\n color: #0086B3;\n}\n\n.ace-github .ace_support.ace_function {\n color: #0086B3;\n}\n\n.ace-github .ace_comment {\n color: #998;\n font-style: italic;\n}\n\n.ace-github .ace_variable.ace_language {\n color: #0086B3;\n}\n\n.ace-github .ace_paren {\n font-weight: bold;\n}\n\n.ace-github .ace_boolean {\n font-weight: bold;\n}\n\n.ace-github .ace_string.ace_regexp {\n color: #009926;\n font-weight: normal;\n}\n\n.ace-github .ace_variable.ace_instance {\n color: teal;\n}\n\n.ace-github .ace_constant.ace_language {\n font-weight: bold;\n}\n\n.ace-github .ace_cursor {\n color: black;\n}\n\n.ace-github.ace_focus .ace_marker-layer .ace_active-line {\n background: rgb(255, 255, 204);\n}\n.ace-github .ace_marker-layer .ace_active-line {\n background: rgb(245, 245, 245);\n}\n\n.ace-github .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-github.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px white;\n}\n/* bold keywords cause cursor issues for some fonts */\n/* this disables bold style for editor and keeps for static highlighter */\n.ace-github.ace_nobold .ace_line > span {\n font-weight: normal !important;\n}\n\n.ace-github .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-github .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-github .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-github .ace_gutter-active-line {\n background-color : rgba(0, 0, 0, 0.07);\n}\n\n.ace-github .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-github .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-github .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-github .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-github .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n}\n"; -exports.isDark = false; +}); + +define("ace/theme/github",["require","exports","module","ace/theme/github-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; exports.cssClass = "ace-github"; -exports.cssText = "\ -.ace-github .ace_gutter {\ -background: #e8e8e8;\ -color: #AAA;\ -}\ -.ace-github {\ -background: #fff;\ -color: #000;\ -}\ -.ace-github .ace_keyword {\ -font-weight: bold;\ -}\ -.ace-github .ace_string {\ -color: #D14;\ -}\ -.ace-github .ace_variable.ace_class {\ -color: teal;\ -}\ -.ace-github .ace_constant.ace_numeric {\ -color: #099;\ -}\ -.ace-github .ace_constant.ace_buildin {\ -color: #0086B3;\ -}\ -.ace-github .ace_support.ace_function {\ -color: #0086B3;\ -}\ -.ace-github .ace_comment {\ -color: #998;\ -font-style: italic;\ -}\ -.ace-github .ace_variable.ace_language {\ -color: #0086B3;\ -}\ -.ace-github .ace_paren {\ -font-weight: bold;\ -}\ -.ace-github .ace_boolean {\ -font-weight: bold;\ -}\ -.ace-github .ace_string.ace_regexp {\ -color: #009926;\ -font-weight: normal;\ -}\ -.ace-github .ace_variable.ace_instance {\ -color: teal;\ -}\ -.ace-github .ace_constant.ace_language {\ -font-weight: bold;\ -}\ -.ace-github .ace_cursor {\ -color: black;\ -}\ -.ace-github.ace_focus .ace_marker-layer .ace_active-line {\ -background: rgb(255, 255, 204);\ -}\ -.ace-github .ace_marker-layer .ace_active-line {\ -background: rgb(245, 245, 245);\ -}\ -.ace-github .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-github.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px white;\ -}\ -.ace-github.ace_nobold .ace_line > span {\ -font-weight: normal !important;\ -}\ -.ace-github .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-github .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-github .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-github .ace_gutter-active-line {\ -background-color : rgba(0, 0, 0, 0.07);\ -}\ -.ace-github .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-github .ace_invisible {\ -color: #BFBFBF\ -}\ -.ace-github .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-github .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}"; +exports.cssText = require("./github-css"); +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); - var dom = require("../lib/dom"); - dom.importCssString(exports.cssText, exports.cssClass, false); }); (function() { window.require(["ace/theme/github"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-gob.js b/app/Resources/ui/js/ace/theme-gob.js index 7326db1e..ae5e4c00 100644 --- a/app/Resources/ui/js/ace/theme-gob.js +++ b/app/Resources/ui/js/ace/theme-gob.js @@ -1,114 +1,13 @@ -define("ace/theme/gob",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/gob-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-gob .ace_gutter {\n background: #0B1818;\n color: #03EE03\n}\n\n.ace-gob .ace_print-margin {\n width: 1px;\n background: #131313\n}\n\n.ace-gob {\n background-color: #0B0B0B;\n color: #00FF00\n}\n\n.ace-gob .ace_cursor {\n border-color: rgba(16, 248, 255, 0.90);\n background-color: rgba(16, 240, 248, 0.70);\n opacity: 0.4;\n}\n\n.ace-gob .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-gob.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #141414;\n}\n\n.ace-gob .ace_marker-layer .ace_step {\n background: rgb(16, 128, 0)\n}\n\n.ace-gob .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(64, 255, 255, 0.25)\n}\n\n.ace-gob .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.04)\n}\n\n.ace-gob .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.04)\n}\n\n.ace-gob .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(192, 240, 255, 0.20)\n}\n\n.ace-gob .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-gob .ace_keyword,\n.ace-gob .ace_meta {\n color: #10D8E8\n}\n\n.ace-gob .ace_constant,\n.ace-gob .ace_constant.ace_character,\n.ace-gob .ace_constant.ace_character.ace_escape,\n.ace-gob .ace_constant.ace_other,\n.ace-gob .ace_heading,\n.ace-gob .ace_markup.ace_heading,\n.ace-gob .ace_support.ace_constant {\n color: #10F0A0\n}\n\n.ace-gob .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-gob .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #20F8C0\n}\n\n.ace-gob .ace_support {\n color: #20E8B0\n}\n\n.ace-gob .ace_fold {\n background-color: #50B8B8;\n border-color: #70F8F8\n}\n\n.ace-gob .ace_support.ace_function {\n color: #00F800\n}\n\n.ace-gob .ace_list,\n.ace-gob .ace_markup.ace_list,\n.ace-gob .ace_storage {\n color: #10FF98\n}\n\n.ace-gob .ace_entity.ace_name.ace_function,\n.ace-gob .ace_meta.ace_tag,\n.ace-gob .ace_variable {\n color: #00F868\n}\n\n.ace-gob .ace_string {\n color: #10F060\n}\n\n.ace-gob .ace_string.ace_regexp {\n color: #20F090;\n}\n\n.ace-gob .ace_comment {\n font-style: italic;\n color: #00E060;\n}\n\n.ace-gob .ace_variable {\n color: #00F888;\n}\n\n.ace-gob .ace_xml-pe {\n color: #488858;\n}\n\n.ace-gob .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-gob .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-gob"; -exports.cssText = ".ace-gob .ace_gutter {\ -background: #0B1818;\ -color: #03EE03\ -}\ -.ace-gob .ace_print-margin {\ -width: 1px;\ -background: #131313\ -}\ -.ace-gob {\ -background-color: #0B0B0B;\ -color: #00FF00\ -}\ -.ace-gob .ace_cursor {\ -border-color: rgba(16, 248, 255, 0.90);\ -background-color: rgba(16, 240, 248, 0.70);\ -opacity: 0.4;\ -}\ -.ace-gob .ace_marker-layer .ace_selection {\ -background: rgba(221, 240, 255, 0.20)\ -}\ -.ace-gob.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #141414;\ -}\ -.ace-gob .ace_marker-layer .ace_step {\ -background: rgb(16, 128, 0)\ -}\ -.ace-gob .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(64, 255, 255, 0.25)\ -}\ -.ace-gob .ace_marker-layer .ace_active-line {\ -background: rgba(255, 255, 255, 0.04)\ -}\ -.ace-gob .ace_gutter-active-line {\ -background-color: rgba(255, 255, 255, 0.04)\ -}\ -.ace-gob .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(192, 240, 255, 0.20)\ -}\ -.ace-gob .ace_invisible {\ -color: rgba(255, 255, 255, 0.25)\ -}\ -.ace-gob .ace_keyword,\ -.ace-gob .ace_meta {\ -color: #10D8E8\ -}\ -.ace-gob .ace_constant,\ -.ace-gob .ace_constant.ace_character,\ -.ace-gob .ace_constant.ace_character.ace_escape,\ -.ace-gob .ace_constant.ace_other,\ -.ace-gob .ace_heading,\ -.ace-gob .ace_markup.ace_heading,\ -.ace-gob .ace_support.ace_constant {\ -color: #10F0A0\ -}\ -.ace-gob .ace_invalid.ace_illegal {\ -color: #F8F8F8;\ -background-color: rgba(86, 45, 86, 0.75)\ -}\ -.ace-gob .ace_invalid.ace_deprecated {\ -text-decoration: underline;\ -font-style: italic;\ -color: #20F8C0\ -}\ -.ace-gob .ace_support {\ -color: #20E8B0\ -}\ -.ace-gob .ace_fold {\ -background-color: #50B8B8;\ -border-color: #70F8F8\ -}\ -.ace-gob .ace_support.ace_function {\ -color: #00F800\ -}\ -.ace-gob .ace_list,\ -.ace-gob .ace_markup.ace_list,\ -.ace-gob .ace_storage {\ -color: #10FF98\ -}\ -.ace-gob .ace_entity.ace_name.ace_function,\ -.ace-gob .ace_meta.ace_tag,\ -.ace-gob .ace_variable {\ -color: #00F868\ -}\ -.ace-gob .ace_string {\ -color: #10F060\ -}\ -.ace-gob .ace_string.ace_regexp {\ -color: #20F090;\ -}\ -.ace-gob .ace_comment {\ -font-style: italic;\ -color: #00E060;\ -}\ -.ace-gob .ace_variable {\ -color: #00F888;\ -}\ -.ace-gob .ace_xml-pe {\ -color: #488858;\ -}\ -.ace-gob .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\ -}\ -"; +}); +define("ace/theme/gob",["require","exports","module","ace/theme/gob-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-gob"; +exports.cssText = require("./gob-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/gob"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-gruvbox.js b/app/Resources/ui/js/ace/theme-gruvbox.js index c52e8f0f..edd4ede9 100644 --- a/app/Resources/ui/js/ace/theme-gruvbox.js +++ b/app/Resources/ui/js/ace/theme-gruvbox.js @@ -1,81 +1,10 @@ -define("ace/theme/gruvbox",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/gruvbox-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-gruvbox .ace_gutter-active-line {\n background-color: #3C3836;\n}\n\n.ace-gruvbox {\n color: #EBDAB4;\n background-color: #1D2021;\n}\n\n.ace-gruvbox .ace_invisible {\n color: #504945;\n}\n\n.ace-gruvbox .ace_marker-layer .ace_selection {\n background: rgba(179, 101, 57, 0.75)\n}\n\n.ace-gruvbox.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002240;\n}\n\n.ace-gruvbox .ace_keyword {\n color: #8ec07c;\n}\n\n.ace-gruvbox .ace_comment {\n font-style: italic;\n color: #928375;\n}\n\n.ace-gruvbox .ace-statement {\n color: red;\n}\n\n.ace-gruvbox .ace_variable {\n color: #84A598;\n}\n\n.ace-gruvbox .ace_variable.ace_language {\n color: #D2879B;\n}\n\n.ace-gruvbox .ace_constant {\n color: #C2859A;\n}\n\n.ace-gruvbox .ace_constant.ace_language {\n color: #C2859A;\n}\n\n.ace-gruvbox .ace_constant.ace_numeric {\n color: #C2859A;\n}\n\n.ace-gruvbox .ace_string {\n color: #B8BA37;\n}\n\n.ace-gruvbox .ace_support {\n color: #F9BC41;\n}\n\n.ace-gruvbox .ace_support.ace_function {\n color: #F84B3C;\n}\n\n.ace-gruvbox .ace_storage {\n color: #8FBF7F;\n}\n\n.ace-gruvbox .ace_keyword.ace_operator {\n color: #EBDAB4;\n}\n\n.ace-gruvbox .ace_punctuation.ace_operator {\n color: yellow;\n}\n\n.ace-gruvbox .ace_marker-layer .ace_active-line {\n background: #3C3836;\n}\n\n.ace-gruvbox .ace_marker-layer .ace_selected-word {\n border-radius: 4px;\n border: 8px solid #3f475d;\n}\n\n.ace-gruvbox .ace_print-margin {\n width: 5px;\n background: #3C3836;\n}\n\n.ace-gruvbox .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\n}\n\n.ace-gruvbox .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-gruvbox"; -exports.cssText = ".ace-gruvbox .ace_gutter-active-line {\ -background-color: #3C3836;\ -}\ -.ace-gruvbox {\ -color: #EBDAB4;\ -background-color: #1D2021;\ -}\ -.ace-gruvbox .ace_invisible {\ -color: #504945;\ -}\ -.ace-gruvbox .ace_marker-layer .ace_selection {\ -background: rgba(179, 101, 57, 0.75)\ -}\ -.ace-gruvbox.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #002240;\ -}\ -.ace-gruvbox .ace_keyword {\ -color: #8ec07c;\ -}\ -.ace-gruvbox .ace_comment {\ -font-style: italic;\ -color: #928375;\ -}\ -.ace-gruvbox .ace-statement {\ -color: red;\ -}\ -.ace-gruvbox .ace_variable {\ -color: #84A598;\ -}\ -.ace-gruvbox .ace_variable.ace_language {\ -color: #D2879B;\ -}\ -.ace-gruvbox .ace_constant {\ -color: #C2859A;\ -}\ -.ace-gruvbox .ace_constant.ace_language {\ -color: #C2859A;\ -}\ -.ace-gruvbox .ace_constant.ace_numeric {\ -color: #C2859A;\ -}\ -.ace-gruvbox .ace_string {\ -color: #B8BA37;\ -}\ -.ace-gruvbox .ace_support {\ -color: #F9BC41;\ -}\ -.ace-gruvbox .ace_support.ace_function {\ -color: #F84B3C;\ -}\ -.ace-gruvbox .ace_storage {\ -color: #8FBF7F;\ -}\ -.ace-gruvbox .ace_keyword.ace_operator {\ -color: #EBDAB4;\ -}\ -.ace-gruvbox .ace_punctuation.ace_operator {\ -color: yellow;\ -}\ -.ace-gruvbox .ace_marker-layer .ace_active-line {\ -background: #3C3836;\ -}\ -.ace-gruvbox .ace_marker-layer .ace_selected-word {\ -border-radius: 4px;\ -border: 8px solid #3f475d;\ -}\ -.ace-gruvbox .ace_print-margin {\ -width: 5px;\ -background: #3C3836;\ -}\ -.ace-gruvbox .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\ -}"; +}); +define("ace/theme/gruvbox",["require","exports","module","ace/theme/gruvbox-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-gruvbox"; +exports.cssText = require("./gruvbox-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); diff --git a/app/Resources/ui/js/ace/theme-gruvbox_dark_hard.js b/app/Resources/ui/js/ace/theme-gruvbox_dark_hard.js index 3c6ae39b..cbf33ea8 100644 --- a/app/Resources/ui/js/ace/theme-gruvbox_dark_hard.js +++ b/app/Resources/ui/js/ace/theme-gruvbox_dark_hard.js @@ -1,132 +1,13 @@ -define("ace/theme/gruvbox_dark_hard",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/gruvbox_dark_hard-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-gruvbox-dark-hard .ace_gutter {\n background: #1d2021;\n color: rgb(132,126,106)\n}\n\n.ace-gruvbox-dark-hard .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-gruvbox-dark-hard {\n background-color: #1d2021;\n color: rgba(235, 219, 178, 0.50)\n}\n\n.ace-gruvbox-dark-hard .ace_cursor {\n color: #a89984\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_selection {\n background: #3c3836\n}\n\n.ace-gruvbox-dark-hard.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1d2021;\n border-radius: 2px\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(235, 219, 178, 0.15)\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_active-line {\n background: #3c3836\n}\n\n.ace-gruvbox-dark-hard .ace_gutter-active-line {\n background-color: #3c3836\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_selected-word {\n border: 1px solid #3c3836\n}\n\n.ace-gruvbox-dark-hard .ace_fold {\n background-color: #b8bb26;\n border-color: rgba(235, 219, 178, 0.50)\n}\n\n.ace-gruvbox-dark-hard .ace_keyword {\n color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_keyword.ace_operator {\n color: #8ec07c\n}\n\n.ace-gruvbox-dark-hard .ace_keyword.ace_other.ace_unit {\n color: #b16286\n}\n\n.ace-gruvbox-dark-hard .ace_constant {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_constant.ace_numeric {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_constant.ace_character.ace_escape {\n color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_constant.ace_other {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_function {\n color: #8ec07c\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_constant {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_constant.ace_property-value {\n color: #f9f5d7\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_class {\n color: #fabd2f\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_type {\n color: #fabd2f\n}\n\n.ace-gruvbox-dark-hard .ace_storage {\n color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_invalid {\n color: #f9f5d7;\n background-color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_string {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_string.ace_regexp {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_comment {\n font-style: italic;\n color: #928374\n}\n\n.ace-gruvbox-dark-hard .ace_variable {\n color: #83a598\n}\n\n.ace-gruvbox-dark-hard .ace_variable.ace_language {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_variable.ace_parameter {\n color: #f9f5d7\n}\n\n.ace-gruvbox-dark-hard .ace_meta.ace_tag {\n color: #f9f5d7\n}\n\n.ace-gruvbox-dark-hard .ace_entity.ace_other.ace_attribute-name {\n color: #fabd2f\n}\n\n.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_function {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_tag {\n color: #83a598\n}\n\n.ace-gruvbox-dark-hard .ace_markup.ace_heading {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_markup.ace_list {\n color: #83a598\n}\n\n.ace-gruvbox-dark-hard .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-gruvbox-dark-hard"; -exports.cssText = ".ace-gruvbox-dark-hard .ace_gutter {\ -background: #1d2021;\ -color: rgb(132,126,106)\ -}\ -.ace-gruvbox-dark-hard .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-gruvbox-dark-hard {\ -background-color: #1d2021;\ -color: rgba(235, 219, 178, 0.50)\ -}\ -.ace-gruvbox-dark-hard .ace_cursor {\ -color: #a89984\ -}\ -.ace-gruvbox-dark-hard .ace_marker-layer .ace_selection {\ -background: #3c3836\ -}\ -.ace-gruvbox-dark-hard.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #1d2021;\ -border-radius: 2px\ -}\ -.ace-gruvbox-dark-hard .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174)\ -}\ -.ace-gruvbox-dark-hard .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(235, 219, 178, 0.15)\ -}\ -.ace-gruvbox-dark-hard .ace_marker-layer .ace_active-line {\ -background: #3c3836\ -}\ -.ace-gruvbox-dark-hard .ace_gutter-active-line {\ -background-color: #3c3836\ -}\ -.ace-gruvbox-dark-hard .ace_marker-layer .ace_selected-word {\ -border: 1px solid #3c3836\ -}\ -.ace-gruvbox-dark-hard .ace_fold {\ -background-color: #b8bb26;\ -border-color: rgba(235, 219, 178, 0.50)\ -}\ -.ace-gruvbox-dark-hard .ace_keyword {\ -color: #fb4934\ -}\ -.ace-gruvbox-dark-hard .ace_keyword.ace_operator {\ -color: #8ec07c\ -}\ -.ace-gruvbox-dark-hard .ace_keyword.ace_other.ace_unit {\ -color: #b16286\ -}\ -.ace-gruvbox-dark-hard .ace_constant {\ -color: #d3869b\ -}\ -.ace-gruvbox-dark-hard .ace_constant.ace_numeric {\ -color: #d3869b\ -}\ -.ace-gruvbox-dark-hard .ace_constant.ace_character.ace_escape {\ -color: #fb4934\ -}\ -.ace-gruvbox-dark-hard .ace_constant.ace_other {\ -color: #d3869b\ -}\ -.ace-gruvbox-dark-hard .ace_support.ace_function {\ -color: #8ec07c\ -}\ -.ace-gruvbox-dark-hard .ace_support.ace_constant {\ -color: #d3869b\ -}\ -.ace-gruvbox-dark-hard .ace_support.ace_constant.ace_property-value {\ -color: #f9f5d7\ -}\ -.ace-gruvbox-dark-hard .ace_support.ace_class {\ -color: #fabd2f\ -}\ -.ace-gruvbox-dark-hard .ace_support.ace_type {\ -color: #fabd2f\ -}\ -.ace-gruvbox-dark-hard .ace_storage {\ -color: #fb4934\ -}\ -.ace-gruvbox-dark-hard .ace_invalid {\ -color: #f9f5d7;\ -background-color: #fb4934\ -}\ -.ace-gruvbox-dark-hard .ace_string {\ -color: #b8bb26\ -}\ -.ace-gruvbox-dark-hard .ace_string.ace_regexp {\ -color: #b8bb26\ -}\ -.ace-gruvbox-dark-hard .ace_comment {\ -font-style: italic;\ -color: #928374\ -}\ -.ace-gruvbox-dark-hard .ace_variable {\ -color: #83a598\ -}\ -.ace-gruvbox-dark-hard .ace_variable.ace_language {\ -color: #d3869b\ -}\ -.ace-gruvbox-dark-hard .ace_variable.ace_parameter {\ -color: #f9f5d7\ -}\ -.ace-gruvbox-dark-hard .ace_meta.ace_tag {\ -color: #f9f5d7\ -}\ -.ace-gruvbox-dark-hard .ace_entity.ace_other.ace_attribute-name {\ -color: #fabd2f\ -}\ -.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_function {\ -color: #b8bb26\ -}\ -.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_tag {\ -color: #83a598\ -}\ -.ace-gruvbox-dark-hard .ace_markup.ace_heading {\ -color: #b8bb26\ -}\ -.ace-gruvbox-dark-hard .ace_markup.ace_list {\ -color: #83a598\ -}"; +}); +define("ace/theme/gruvbox_dark_hard",["require","exports","module","ace/theme/gruvbox_dark_hard-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-gruvbox-dark-hard"; +exports.cssText = require("./gruvbox_dark_hard-css"); var dom = require("../lib/dom"); -dom.importCssString(exports.cssText, exports.cssClass); +dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/gruvbox_dark_hard"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-gruvbox_light_hard.js b/app/Resources/ui/js/ace/theme-gruvbox_light_hard.js index 403d4b6c..83aa831d 100644 --- a/app/Resources/ui/js/ace/theme-gruvbox_light_hard.js +++ b/app/Resources/ui/js/ace/theme-gruvbox_light_hard.js @@ -1,132 +1,13 @@ -define("ace/theme/gruvbox_light_hard",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/gruvbox_light_hard-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-gruvbox-light-hard .ace_gutter {\n background: #f9f5d7;\n color: rgb(155,151,135)\n}\n\n.ace-gruvbox-light-hard .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-gruvbox-light-hard {\n background-color: #f9f5d7;\n color: rgba(60, 56, 54, 0.50)\n}\n\n.ace-gruvbox-light-hard .ace_cursor {\n color: #7c6f64\n}\n\n.ace-gruvbox-light-hard .ace_marker-layer .ace_selection {\n background: #ebdbb2\n}\n\n.ace-gruvbox-light-hard.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #f9f5d7;\n border-radius: 2px\n}\n\n.ace-gruvbox-light-hard .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-gruvbox-light-hard .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(60, 56, 54, 0.15)\n}\n\n.ace-gruvbox-light-hard .ace_marker-layer .ace_active-line {\n background: #ebdbb2\n}\n\n.ace-gruvbox-light-hard .ace_gutter-active-line {\n background-color: #ebdbb2\n}\n\n.ace-gruvbox-light-hard .ace_marker-layer .ace_selected-word {\n border: 1px solid #ebdbb2\n}\n\n.ace-gruvbox-light-hard .ace_fold {\n background-color: #79740e;\n border-color: rgba(60, 56, 54, 0.50)\n}\n\n.ace-gruvbox-light-hard .ace_keyword {\n color: #9d0006\n}\n\n.ace-gruvbox-light-hard .ace_keyword.ace_operator {\n color: #427b58\n}\n\n.ace-gruvbox-light-hard .ace_keyword.ace_other.ace_unit {\n color: #b16286\n}\n\n.ace-gruvbox-light-hard .ace_constant {\n color: #8f3f71\n}\n\n.ace-gruvbox-light-hard .ace_constant.ace_numeric {\n color: #8f3f71\n}\n\n.ace-gruvbox-light-hard .ace_constant.ace_character.ace_escape {\n color: #9d0006\n}\n\n.ace-gruvbox-light-hard .ace_constant.ace_other {\n color: #8f3f71\n}\n\n.ace-gruvbox-light-hard .ace_support.ace_function {\n color: #427b58\n}\n\n.ace-gruvbox-light-hard .ace_support.ace_constant {\n color: #8f3f71\n}\n\n.ace-gruvbox-light-hard .ace_support.ace_constant.ace_property-value {\n color: #1d2021\n}\n\n.ace-gruvbox-light-hard .ace_support.ace_class {\n color: #b57614\n}\n\n.ace-gruvbox-light-hard .ace_support.ace_type {\n color: #b57614\n}\n\n.ace-gruvbox-light-hard .ace_storage {\n color: #9d0006\n}\n\n.ace-gruvbox-light-hard .ace_invalid {\n color: #1d2021;\n background-color: #9d0006\n}\n\n.ace-gruvbox-light-hard .ace_string {\n color: #79740e\n}\n\n.ace-gruvbox-light-hard .ace_string.ace_regexp {\n color: #79740e\n}\n\n.ace-gruvbox-light-hard .ace_comment {\n font-style: italic;\n color: #928374\n}\n\n.ace-gruvbox-light-hard .ace_variable {\n color: #076678\n}\n\n.ace-gruvbox-light-hard .ace_variable.ace_language {\n color: #8f3f71\n}\n\n.ace-gruvbox-light-hard .ace_variable.ace_parameter {\n color: #1d2021\n}\n\n.ace-gruvbox-light-hard .ace_meta.ace_tag {\n color: #1d2021\n}\n\n.ace-gruvbox-light-hard .ace_entity.ace_other.ace_attribute-name {\n color: #b57614\n}\n\n.ace-gruvbox-light-hard .ace_entity.ace_name.ace_function {\n color: #79740e\n}\n\n.ace-gruvbox-light-hard .ace_entity.ace_name.ace_tag {\n color: #076678\n}\n\n.ace-gruvbox-light-hard .ace_markup.ace_heading {\n color: #79740e\n}\n\n.ace-gruvbox-light-hard .ace_markup.ace_list {\n color: #076678\n}\n\n.ace-gruvbox-light-hard .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-gruvbox-light-hard .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-gruvbox-light-hard"; -exports.cssText = ".ace-gruvbox-light-hard .ace_gutter {\ -background: #f9f5d7;\ -color: rgb(155,151,135)\ -}\ -.ace-gruvbox-light-hard .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-gruvbox-light-hard {\ -background-color: #f9f5d7;\ -color: rgba(60, 56, 54, 0.50)\ -}\ -.ace-gruvbox-light-hard .ace_cursor {\ -color: #7c6f64\ -}\ -.ace-gruvbox-light-hard .ace_marker-layer .ace_selection {\ -background: #ebdbb2\ -}\ -.ace-gruvbox-light-hard.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #f9f5d7;\ -border-radius: 2px\ -}\ -.ace-gruvbox-light-hard .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174)\ -}\ -.ace-gruvbox-light-hard .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(60, 56, 54, 0.15)\ -}\ -.ace-gruvbox-light-hard .ace_marker-layer .ace_active-line {\ -background: #ebdbb2\ -}\ -.ace-gruvbox-light-hard .ace_gutter-active-line {\ -background-color: #ebdbb2\ -}\ -.ace-gruvbox-light-hard .ace_marker-layer .ace_selected-word {\ -border: 1px solid #ebdbb2\ -}\ -.ace-gruvbox-light-hard .ace_fold {\ -background-color: #79740e;\ -border-color: rgba(60, 56, 54, 0.50)\ -}\ -.ace-gruvbox-light-hard .ace_keyword {\ -color: #9d0006\ -}\ -.ace-gruvbox-light-hard .ace_keyword.ace_operator {\ -color: #427b58\ -}\ -.ace-gruvbox-light-hard .ace_keyword.ace_other.ace_unit {\ -color: #b16286\ -}\ -.ace-gruvbox-light-hard .ace_constant {\ -color: #8f3f71\ -}\ -.ace-gruvbox-light-hard .ace_constant.ace_numeric {\ -color: #8f3f71\ -}\ -.ace-gruvbox-light-hard .ace_constant.ace_character.ace_escape {\ -color: #9d0006\ -}\ -.ace-gruvbox-light-hard .ace_constant.ace_other {\ -color: #8f3f71\ -}\ -.ace-gruvbox-light-hard .ace_support.ace_function {\ -color: #427b58\ -}\ -.ace-gruvbox-light-hard .ace_support.ace_constant {\ -color: #8f3f71\ -}\ -.ace-gruvbox-light-hard .ace_support.ace_constant.ace_property-value {\ -color: #1d2021\ -}\ -.ace-gruvbox-light-hard .ace_support.ace_class {\ -color: #b57614\ -}\ -.ace-gruvbox-light-hard .ace_support.ace_type {\ -color: #b57614\ -}\ -.ace-gruvbox-light-hard .ace_storage {\ -color: #9d0006\ -}\ -.ace-gruvbox-light-hard .ace_invalid {\ -color: #1d2021;\ -background-color: #9d0006\ -}\ -.ace-gruvbox-light-hard .ace_string {\ -color: #79740e\ -}\ -.ace-gruvbox-light-hard .ace_string.ace_regexp {\ -color: #79740e\ -}\ -.ace-gruvbox-light-hard .ace_comment {\ -font-style: italic;\ -color: #928374\ -}\ -.ace-gruvbox-light-hard .ace_variable {\ -color: #076678\ -}\ -.ace-gruvbox-light-hard .ace_variable.ace_language {\ -color: #8f3f71\ -}\ -.ace-gruvbox-light-hard .ace_variable.ace_parameter {\ -color: #1d2021\ -}\ -.ace-gruvbox-light-hard .ace_meta.ace_tag {\ -color: #1d2021\ -}\ -.ace-gruvbox-light-hard .ace_entity.ace_other.ace_attribute-name {\ -color: #b57614\ -}\ -.ace-gruvbox-light-hard .ace_entity.ace_name.ace_function {\ -color: #79740e\ -}\ -.ace-gruvbox-light-hard .ace_entity.ace_name.ace_tag {\ -color: #076678\ -}\ -.ace-gruvbox-light-hard .ace_markup.ace_heading {\ -color: #79740e\ -}\ -.ace-gruvbox-light-hard .ace_markup.ace_list {\ -color: #076678\ -}"; +}); +define("ace/theme/gruvbox_light_hard",["require","exports","module","ace/theme/gruvbox_light_hard-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-gruvbox-light-hard"; +exports.cssText = require("./gruvbox_light_hard-css"); var dom = require("../lib/dom"); -dom.importCssString(exports.cssText, exports.cssClass); +dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/gruvbox_light_hard"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-idle_fingers.js b/app/Resources/ui/js/ace/theme-idle_fingers.js index 1af5e27a..ab8a311d 100644 --- a/app/Resources/ui/js/ace/theme-idle_fingers.js +++ b/app/Resources/ui/js/ace/theme-idle_fingers.js @@ -1,98 +1,13 @@ -define("ace/theme/idle_fingers",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/idle_fingers-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-idle-fingers .ace_gutter {\n background: #3b3b3b;\n color: rgb(153,153,153)\n}\n\n.ace-idle-fingers .ace_print-margin {\n width: 1px;\n background: #3b3b3b\n}\n\n.ace-idle-fingers {\n background-color: #323232;\n color: #FFFFFF\n}\n\n.ace-idle-fingers .ace_cursor {\n color: #91FF00\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_selection {\n background: rgba(90, 100, 126, 0.88)\n}\n\n.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #323232;\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_active-line {\n background: #353637\n}\n\n.ace-idle-fingers .ace_gutter-active-line {\n background-color: #353637\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(90, 100, 126, 0.88)\n}\n\n.ace-idle-fingers .ace_invisible {\n color: #404040\n}\n\n.ace-idle-fingers .ace_keyword,\n.ace-idle-fingers .ace_meta {\n color: #CC7833\n}\n\n.ace-idle-fingers .ace_constant,\n.ace-idle-fingers .ace_constant.ace_character,\n.ace-idle-fingers .ace_constant.ace_character.ace_escape,\n.ace-idle-fingers .ace_constant.ace_other,\n.ace-idle-fingers .ace_support.ace_constant {\n color: #6C99BB\n}\n\n.ace-idle-fingers .ace_invalid {\n color: #FFFFFF;\n background-color: #FF0000\n}\n\n.ace-idle-fingers .ace_fold {\n background-color: #CC7833;\n border-color: #FFFFFF\n}\n\n.ace-idle-fingers .ace_support.ace_function {\n color: #B83426\n}\n\n.ace-idle-fingers .ace_variable.ace_parameter {\n font-style: italic\n}\n\n.ace-idle-fingers .ace_string {\n color: #A5C261\n}\n\n.ace-idle-fingers .ace_string.ace_regexp {\n color: #CCCC33\n}\n\n.ace-idle-fingers .ace_comment {\n font-style: italic;\n color: #BC9458\n}\n\n.ace-idle-fingers .ace_meta.ace_tag {\n color: #FFE5BB\n}\n\n.ace-idle-fingers .ace_entity.ace_name {\n color: #FFC66D\n}\n\n.ace-idle-fingers .ace_collab.ace_user1 {\n color: #323232;\n background-color: #FFF980\n}\n\n.ace-idle-fingers .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-idle-fingers .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-idle-fingers"; -exports.cssText = ".ace-idle-fingers .ace_gutter {\ -background: #3b3b3b;\ -color: rgb(153,153,153)\ -}\ -.ace-idle-fingers .ace_print-margin {\ -width: 1px;\ -background: #3b3b3b\ -}\ -.ace-idle-fingers {\ -background-color: #323232;\ -color: #FFFFFF\ -}\ -.ace-idle-fingers .ace_cursor {\ -color: #91FF00\ -}\ -.ace-idle-fingers .ace_marker-layer .ace_selection {\ -background: rgba(90, 100, 126, 0.88)\ -}\ -.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #323232;\ -}\ -.ace-idle-fingers .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-idle-fingers .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #404040\ -}\ -.ace-idle-fingers .ace_marker-layer .ace_active-line {\ -background: #353637\ -}\ -.ace-idle-fingers .ace_gutter-active-line {\ -background-color: #353637\ -}\ -.ace-idle-fingers .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(90, 100, 126, 0.88)\ -}\ -.ace-idle-fingers .ace_invisible {\ -color: #404040\ -}\ -.ace-idle-fingers .ace_keyword,\ -.ace-idle-fingers .ace_meta {\ -color: #CC7833\ -}\ -.ace-idle-fingers .ace_constant,\ -.ace-idle-fingers .ace_constant.ace_character,\ -.ace-idle-fingers .ace_constant.ace_character.ace_escape,\ -.ace-idle-fingers .ace_constant.ace_other,\ -.ace-idle-fingers .ace_support.ace_constant {\ -color: #6C99BB\ -}\ -.ace-idle-fingers .ace_invalid {\ -color: #FFFFFF;\ -background-color: #FF0000\ -}\ -.ace-idle-fingers .ace_fold {\ -background-color: #CC7833;\ -border-color: #FFFFFF\ -}\ -.ace-idle-fingers .ace_support.ace_function {\ -color: #B83426\ -}\ -.ace-idle-fingers .ace_variable.ace_parameter {\ -font-style: italic\ -}\ -.ace-idle-fingers .ace_string {\ -color: #A5C261\ -}\ -.ace-idle-fingers .ace_string.ace_regexp {\ -color: #CCCC33\ -}\ -.ace-idle-fingers .ace_comment {\ -font-style: italic;\ -color: #BC9458\ -}\ -.ace-idle-fingers .ace_meta.ace_tag {\ -color: #FFE5BB\ -}\ -.ace-idle-fingers .ace_entity.ace_name {\ -color: #FFC66D\ -}\ -.ace-idle-fingers .ace_collab.ace_user1 {\ -color: #323232;\ -background-color: #FFF980\ -}\ -.ace-idle-fingers .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/idle_fingers",["require","exports","module","ace/theme/idle_fingers-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-idle-fingers"; +exports.cssText = require("./idle_fingers-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/idle_fingers"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-iplastic.js b/app/Resources/ui/js/ace/theme-iplastic.js index 6eaf7abe..799f643d 100644 --- a/app/Resources/ui/js/ace/theme-iplastic.js +++ b/app/Resources/ui/js/ace/theme-iplastic.js @@ -1,123 +1,13 @@ -define("ace/theme/iplastic",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/iplastic-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-iplastic .ace_gutter {\n background: #dddddd;\n color: #666666\n}\n\n.ace-iplastic .ace_print-margin {\n width: 1px;\n background: #bbbbbb\n}\n\n.ace-iplastic {\n background-color: #eeeeee;\n color: #333333\n}\n\n.ace-iplastic .ace_cursor {\n color: #333\n}\n\n.ace-iplastic .ace_marker-layer .ace_selection {\n background: #BAD6FD;\n}\n\n.ace-iplastic.ace_multiselect .ace_selection.ace_start {\n border-radius: 4px\n}\n\n.ace-iplastic .ace_marker-layer .ace_step {\n background: #444444\n}\n\n.ace-iplastic .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #49483E;\n background: #FFF799\n}\n\n.ace-iplastic .ace_marker-layer .ace_active-line {\n background: #e5e5e5\n}\n\n.ace-iplastic .ace_gutter-active-line {\n background-color: #eeeeee\n}\n\n.ace-iplastic .ace_marker-layer .ace_selected-word {\n border: 1px solid #555555;\n border-radius:4px\n}\n\n.ace-iplastic .ace_invisible {\n color: #999999\n}\n\n.ace-iplastic .ace_entity.ace_name.ace_tag,\n.ace-iplastic .ace_keyword,\n.ace-iplastic .ace_meta.ace_tag,\n.ace-iplastic .ace_storage {\n color: #0000FF\n}\n\n.ace-iplastic .ace_punctuation,\n.ace-iplastic .ace_punctuation.ace_tag {\n color: #000\n}\n\n.ace-iplastic .ace_constant {\n color: #333333;\n font-weight: 700\n}\n\n.ace-iplastic .ace_constant.ace_character,\n.ace-iplastic .ace_constant.ace_language,\n.ace-iplastic .ace_constant.ace_numeric,\n.ace-iplastic .ace_constant.ace_other {\n color: #0066FF;\n font-weight: 700\n}\n\n.ace-iplastic .ace_constant.ace_numeric{\n font-weight: 100\n}\n\n.ace-iplastic .ace_invalid {\n color: #F8F8F0;\n background-color: #F92672\n}\n\n.ace-iplastic .ace_invalid.ace_deprecated {\n color: #F8F8F0;\n background-color: #AE81FF\n}\n\n.ace-iplastic .ace_support.ace_constant,\n.ace-iplastic .ace_support.ace_function {\n color: #333333;\n font-weight: 700\n}\n\n.ace-iplastic .ace_fold {\n background-color: #464646;\n border-color: #F8F8F2\n}\n\n.ace-iplastic .ace_storage.ace_type,\n.ace-iplastic .ace_support.ace_class,\n.ace-iplastic .ace_support.ace_type {\n color: #3333fc;\n font-weight: 700\n}\n\n.ace-iplastic .ace_entity.ace_name.ace_function,\n.ace-iplastic .ace_entity.ace_other,\n.ace-iplastic .ace_entity.ace_other.ace_attribute-name,\n.ace-iplastic .ace_variable {\n color: #3366cc;\n font-style: italic\n}\n\n.ace-iplastic .ace_variable.ace_parameter {\n font-style: italic;\n color: #2469E0\n}\n\n.ace-iplastic .ace_string {\n color: #a55f03\n}\n\n.ace-iplastic .ace_comment {\n color: #777777;\n font-style: italic\n}\n\n.ace-iplastic .ace_fold-widget {\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==);\n}\n\n.ace-iplastic .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAABlJREFUeNpi+P//PwMzMzPzfwAAAAD//wMAGRsECSML/RIAAAAASUVORK5CYII=) right repeat-y\n}\n\n.ace-iplastic .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n}\n"; -exports.isDark = false; -exports.cssClass = "ace-iplastic"; -exports.cssText = ".ace-iplastic .ace_gutter {\ -background: #dddddd;\ -color: #666666\ -}\ -.ace-iplastic .ace_print-margin {\ -width: 1px;\ -background: #bbbbbb\ -}\ -.ace-iplastic {\ -background-color: #eeeeee;\ -color: #333333\ -}\ -.ace-iplastic .ace_cursor {\ -color: #333\ -}\ -.ace-iplastic .ace_marker-layer .ace_selection {\ -background: #BAD6FD;\ -}\ -.ace-iplastic.ace_multiselect .ace_selection.ace_start {\ -border-radius: 4px\ -}\ -.ace-iplastic .ace_marker-layer .ace_step {\ -background: #444444\ -}\ -.ace-iplastic .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #49483E;\ -background: #FFF799\ -}\ -.ace-iplastic .ace_marker-layer .ace_active-line {\ -background: #e5e5e5\ -}\ -.ace-iplastic .ace_gutter-active-line {\ -background-color: #eeeeee\ -}\ -.ace-iplastic .ace_marker-layer .ace_selected-word {\ -border: 1px solid #555555;\ -border-radius:4px\ -}\ -.ace-iplastic .ace_invisible {\ -color: #999999\ -}\ -.ace-iplastic .ace_entity.ace_name.ace_tag,\ -.ace-iplastic .ace_keyword,\ -.ace-iplastic .ace_meta.ace_tag,\ -.ace-iplastic .ace_storage {\ -color: #0000FF\ -}\ -.ace-iplastic .ace_punctuation,\ -.ace-iplastic .ace_punctuation.ace_tag {\ -color: #000\ -}\ -.ace-iplastic .ace_constant {\ -color: #333333;\ -font-weight: 700\ -}\ -.ace-iplastic .ace_constant.ace_character,\ -.ace-iplastic .ace_constant.ace_language,\ -.ace-iplastic .ace_constant.ace_numeric,\ -.ace-iplastic .ace_constant.ace_other {\ -color: #0066FF;\ -font-weight: 700\ -}\ -.ace-iplastic .ace_constant.ace_numeric{\ -font-weight: 100\ -}\ -.ace-iplastic .ace_invalid {\ -color: #F8F8F0;\ -background-color: #F92672\ -}\ -.ace-iplastic .ace_invalid.ace_deprecated {\ -color: #F8F8F0;\ -background-color: #AE81FF\ -}\ -.ace-iplastic .ace_support.ace_constant,\ -.ace-iplastic .ace_support.ace_function {\ -color: #333333;\ -font-weight: 700\ -}\ -.ace-iplastic .ace_fold {\ -background-color: #464646;\ -border-color: #F8F8F2\ -}\ -.ace-iplastic .ace_storage.ace_type,\ -.ace-iplastic .ace_support.ace_class,\ -.ace-iplastic .ace_support.ace_type {\ -color: #3333fc;\ -font-weight: 700\ -}\ -.ace-iplastic .ace_entity.ace_name.ace_function,\ -.ace-iplastic .ace_entity.ace_other,\ -.ace-iplastic .ace_entity.ace_other.ace_attribute-name,\ -.ace-iplastic .ace_variable {\ -color: #3366cc;\ -font-style: italic\ -}\ -.ace-iplastic .ace_variable.ace_parameter {\ -font-style: italic;\ -color: #2469E0\ -}\ -.ace-iplastic .ace_string {\ -color: #a55f03\ -}\ -.ace-iplastic .ace_comment {\ -color: #777777;\ -font-style: italic\ -}\ -.ace-iplastic .ace_fold-widget {\ -background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==);\ -}\ -.ace-iplastic .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAABlJREFUeNpi+P//PwMzMzPzfwAAAAD//wMAGRsECSML/RIAAAAASUVORK5CYII=) right repeat-y\ -}"; +}); +define("ace/theme/iplastic",["require","exports","module","ace/theme/iplastic-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-iplastic"; +exports.cssText = require("./iplastic-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/iplastic"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-katzenmilch.js b/app/Resources/ui/js/ace/theme-katzenmilch.js index 596d9702..2e79430c 100644 --- a/app/Resources/ui/js/ace/theme-katzenmilch.js +++ b/app/Resources/ui/js/ace/theme-katzenmilch.js @@ -1,123 +1,13 @@ -define("ace/theme/katzenmilch",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/katzenmilch-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-katzenmilch .ace_gutter,\n/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: ) */\n\n.ace-katzenmilch .ace_gutter {\n background: #e8e8e8;\n color: #333\n}\n\n.ace-katzenmilch .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-katzenmilch {\n background-color: #f3f2f3;\n color: rgba(15, 0, 9, 1.0)\n}\n\n.ace-katzenmilch .ace_cursor {\n border-left: 2px solid #100011\n}\n\n.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {\n border-left: 0px;\n border-bottom: 1px solid #100011\n}\n\n.ace-katzenmilch .ace_marker-layer .ace_selection {\n background: rgba(100, 5, 208, 0.27)\n}\n\n.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #f3f2f3;\n}\n\n.ace-katzenmilch .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-katzenmilch .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(0, 0, 0, 0.33);\n}\n\n.ace-katzenmilch .ace_marker-layer .ace_active-line {\n background: rgb(232, 242, 254)\n}\n\n.ace-katzenmilch .ace_gutter-active-line {\n background-color: rgb(232, 242, 254)\n}\n\n.ace-katzenmilch .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(100, 5, 208, 0.27)\n}\n\n.ace-katzenmilch .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-katzenmilch .ace_fold {\n background-color: rgba(2, 95, 73, 0.97);\n border-color: rgba(15, 0, 9, 1.0)\n}\n\n.ace-katzenmilch .ace_keyword {\n color: #674Aa8;\n rbackground-color: rgba(163, 170, 216, 0.055)\n}\n\n.ace-katzenmilch .ace_constant.ace_language {\n color: #7D7e52;\n rbackground-color: rgba(189, 190, 130, 0.059)\n}\n\n.ace-katzenmilch .ace_constant.ace_numeric {\n color: rgba(79, 130, 123, 0.93);\n rbackground-color: rgba(119, 194, 187, 0.059)\n}\n\n.ace-katzenmilch .ace_constant.ace_character,\n.ace-katzenmilch .ace_constant.ace_other {\n color: rgba(2, 95, 105, 1.0);\n rbackground-color: rgba(127, 34, 153, 0.063)\n}\n\n.ace-katzenmilch .ace_support.ace_function {\n color: #9D7e62;\n rbackground-color: rgba(189, 190, 130, 0.039)\n}\n\n.ace-katzenmilch .ace_support.ace_class {\n color: rgba(239, 106, 167, 1.0);\n rbackground-color: rgba(239, 106, 167, 0.063)\n}\n\n.ace-katzenmilch .ace_storage {\n color: rgba(123, 92, 191, 1.0);\n rbackground-color: rgba(139, 93, 223, 0.051)\n}\n\n.ace-katzenmilch .ace_invalid {\n color: #DFDFD5;\n rbackground-color: #CC1B27\n}\n\n.ace-katzenmilch .ace_string {\n color: #5a5f9b;\n rbackground-color: rgba(170, 175, 219, 0.035)\n}\n\n.ace-katzenmilch .ace_comment {\n font-style: italic;\n color: rgba(64, 79, 80, 0.67);\n rbackground-color: rgba(95, 15, 255, 0.0078)\n}\n\n.ace-katzenmilch .ace_entity.ace_name.ace_function,\n.ace-katzenmilch .ace_variable {\n color: rgba(2, 95, 73, 0.97);\n rbackground-color: rgba(34, 255, 73, 0.12)\n}\n\n.ace-katzenmilch .ace_variable.ace_language {\n color: #316fcf;\n rbackground-color: rgba(58, 175, 255, 0.039)\n}\n\n.ace-katzenmilch .ace_variable.ace_parameter {\n font-style: italic;\n color: rgba(51, 150, 159, 0.87);\n rbackground-color: rgba(5, 214, 249, 0.043)\n}\n\n.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {\n color: rgba(73, 70, 194, 0.93);\n rbackground-color: rgba(73, 134, 194, 0.035)\n}\n\n.ace-katzenmilch .ace_entity.ace_name.ace_tag {\n color: #3976a2;\n rbackground-color: rgba(73, 166, 210, 0.039)\n}\n\n.ace-katzenmilch .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-katzenmilch .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n}\n"; -exports.isDark = false; -exports.cssClass = "ace-katzenmilch"; -exports.cssText = ".ace-katzenmilch .ace_gutter,\ -.ace-katzenmilch .ace_gutter {\ -background: #e8e8e8;\ -color: #333\ -}\ -.ace-katzenmilch .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-katzenmilch {\ -background-color: #f3f2f3;\ -color: rgba(15, 0, 9, 1.0)\ -}\ -.ace-katzenmilch .ace_cursor {\ -border-left: 2px solid #100011\ -}\ -.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {\ -border-left: 0px;\ -border-bottom: 1px solid #100011\ -}\ -.ace-katzenmilch .ace_marker-layer .ace_selection {\ -background: rgba(100, 5, 208, 0.27)\ -}\ -.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #f3f2f3;\ -}\ -.ace-katzenmilch .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174)\ -}\ -.ace-katzenmilch .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(0, 0, 0, 0.33);\ -}\ -.ace-katzenmilch .ace_marker-layer .ace_active-line {\ -background: rgb(232, 242, 254)\ -}\ -.ace-katzenmilch .ace_gutter-active-line {\ -background-color: rgb(232, 242, 254)\ -}\ -.ace-katzenmilch .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(100, 5, 208, 0.27)\ -}\ -.ace-katzenmilch .ace_invisible {\ -color: #BFBFBF\ -}\ -.ace-katzenmilch .ace_fold {\ -background-color: rgba(2, 95, 73, 0.97);\ -border-color: rgba(15, 0, 9, 1.0)\ -}\ -.ace-katzenmilch .ace_keyword {\ -color: #674Aa8;\ -rbackground-color: rgba(163, 170, 216, 0.055)\ -}\ -.ace-katzenmilch .ace_constant.ace_language {\ -color: #7D7e52;\ -rbackground-color: rgba(189, 190, 130, 0.059)\ -}\ -.ace-katzenmilch .ace_constant.ace_numeric {\ -color: rgba(79, 130, 123, 0.93);\ -rbackground-color: rgba(119, 194, 187, 0.059)\ -}\ -.ace-katzenmilch .ace_constant.ace_character,\ -.ace-katzenmilch .ace_constant.ace_other {\ -color: rgba(2, 95, 105, 1.0);\ -rbackground-color: rgba(127, 34, 153, 0.063)\ -}\ -.ace-katzenmilch .ace_support.ace_function {\ -color: #9D7e62;\ -rbackground-color: rgba(189, 190, 130, 0.039)\ -}\ -.ace-katzenmilch .ace_support.ace_class {\ -color: rgba(239, 106, 167, 1.0);\ -rbackground-color: rgba(239, 106, 167, 0.063)\ -}\ -.ace-katzenmilch .ace_storage {\ -color: rgba(123, 92, 191, 1.0);\ -rbackground-color: rgba(139, 93, 223, 0.051)\ -}\ -.ace-katzenmilch .ace_invalid {\ -color: #DFDFD5;\ -rbackground-color: #CC1B27\ -}\ -.ace-katzenmilch .ace_string {\ -color: #5a5f9b;\ -rbackground-color: rgba(170, 175, 219, 0.035)\ -}\ -.ace-katzenmilch .ace_comment {\ -font-style: italic;\ -color: rgba(64, 79, 80, 0.67);\ -rbackground-color: rgba(95, 15, 255, 0.0078)\ -}\ -.ace-katzenmilch .ace_entity.ace_name.ace_function,\ -.ace-katzenmilch .ace_variable {\ -color: rgba(2, 95, 73, 0.97);\ -rbackground-color: rgba(34, 255, 73, 0.12)\ -}\ -.ace-katzenmilch .ace_variable.ace_language {\ -color: #316fcf;\ -rbackground-color: rgba(58, 175, 255, 0.039)\ -}\ -.ace-katzenmilch .ace_variable.ace_parameter {\ -font-style: italic;\ -color: rgba(51, 150, 159, 0.87);\ -rbackground-color: rgba(5, 214, 249, 0.043)\ -}\ -.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {\ -color: rgba(73, 70, 194, 0.93);\ -rbackground-color: rgba(73, 134, 194, 0.035)\ -}\ -.ace-katzenmilch .ace_entity.ace_name.ace_tag {\ -color: #3976a2;\ -rbackground-color: rgba(73, 166, 210, 0.039)\ -}"; +}); +define("ace/theme/katzenmilch",["require","exports","module","ace/theme/katzenmilch-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-katzenmilch"; +exports.cssText = require("./katzenmilch-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/katzenmilch"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-kr_theme.js b/app/Resources/ui/js/ace/theme-kr_theme.js index 1509c0b1..0b704276 100644 --- a/app/Resources/ui/js/ace/theme-kr_theme.js +++ b/app/Resources/ui/js/ace/theme-kr_theme.js @@ -1,106 +1,13 @@ -define("ace/theme/kr_theme",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/kr_theme-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-kr-theme .ace_gutter {\n background: #1c1917;\n color: #FCFFE0\n}\n\n.ace-kr-theme .ace_print-margin {\n width: 1px;\n background: #1c1917\n}\n\n.ace-kr-theme {\n background-color: #0B0A09;\n color: #FCFFE0\n}\n\n.ace-kr-theme .ace_cursor {\n color: #FF9900\n}\n\n.ace-kr-theme .ace_marker-layer .ace_selection {\n background: rgba(170, 0, 255, 0.45)\n}\n\n.ace-kr-theme.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #0B0A09;\n}\n\n.ace-kr-theme .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-kr-theme .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 177, 111, 0.32)\n}\n\n.ace-kr-theme .ace_marker-layer .ace_active-line {\n background: #38403D\n}\n\n.ace-kr-theme .ace_gutter-active-line {\n background-color : #38403D\n}\n\n.ace-kr-theme .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(170, 0, 255, 0.45)\n}\n\n.ace-kr-theme .ace_invisible {\n color: rgba(255, 177, 111, 0.32)\n}\n\n.ace-kr-theme .ace_keyword,\n.ace-kr-theme .ace_meta {\n color: #949C8B\n}\n\n.ace-kr-theme .ace_constant,\n.ace-kr-theme .ace_constant.ace_character,\n.ace-kr-theme .ace_constant.ace_character.ace_escape,\n.ace-kr-theme .ace_constant.ace_other {\n color: rgba(210, 117, 24, 0.76)\n}\n\n.ace-kr-theme .ace_invalid {\n color: #F8F8F8;\n background-color: #A41300\n}\n\n.ace-kr-theme .ace_support {\n color: #9FC28A\n}\n\n.ace-kr-theme .ace_support.ace_constant {\n color: #C27E66\n}\n\n.ace-kr-theme .ace_fold {\n background-color: #949C8B;\n border-color: #FCFFE0\n}\n\n.ace-kr-theme .ace_support.ace_function {\n color: #85873A\n}\n\n.ace-kr-theme .ace_storage {\n color: #FFEE80\n}\n\n.ace-kr-theme .ace_string {\n color: rgba(164, 161, 181, 0.8)\n}\n\n.ace-kr-theme .ace_string.ace_regexp {\n color: rgba(125, 255, 192, 0.65)\n}\n\n.ace-kr-theme .ace_comment {\n font-style: italic;\n color: #706D5B\n}\n\n.ace-kr-theme .ace_variable {\n color: #D1A796\n}\n\n.ace-kr-theme .ace_list,\n.ace-kr-theme .ace_markup.ace_list {\n background-color: #0F0040\n}\n\n.ace-kr-theme .ace_variable.ace_language {\n color: #FF80E1\n}\n\n.ace-kr-theme .ace_meta.ace_tag {\n color: #BABD9C\n}\n\n.ace-kr-theme .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-kr-theme .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-kr-theme"; -exports.cssText = ".ace-kr-theme .ace_gutter {\ -background: #1c1917;\ -color: #FCFFE0\ -}\ -.ace-kr-theme .ace_print-margin {\ -width: 1px;\ -background: #1c1917\ -}\ -.ace-kr-theme {\ -background-color: #0B0A09;\ -color: #FCFFE0\ -}\ -.ace-kr-theme .ace_cursor {\ -color: #FF9900\ -}\ -.ace-kr-theme .ace_marker-layer .ace_selection {\ -background: rgba(170, 0, 255, 0.45)\ -}\ -.ace-kr-theme.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #0B0A09;\ -}\ -.ace-kr-theme .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-kr-theme .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(255, 177, 111, 0.32)\ -}\ -.ace-kr-theme .ace_marker-layer .ace_active-line {\ -background: #38403D\ -}\ -.ace-kr-theme .ace_gutter-active-line {\ -background-color : #38403D\ -}\ -.ace-kr-theme .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(170, 0, 255, 0.45)\ -}\ -.ace-kr-theme .ace_invisible {\ -color: rgba(255, 177, 111, 0.32)\ -}\ -.ace-kr-theme .ace_keyword,\ -.ace-kr-theme .ace_meta {\ -color: #949C8B\ -}\ -.ace-kr-theme .ace_constant,\ -.ace-kr-theme .ace_constant.ace_character,\ -.ace-kr-theme .ace_constant.ace_character.ace_escape,\ -.ace-kr-theme .ace_constant.ace_other {\ -color: rgba(210, 117, 24, 0.76)\ -}\ -.ace-kr-theme .ace_invalid {\ -color: #F8F8F8;\ -background-color: #A41300\ -}\ -.ace-kr-theme .ace_support {\ -color: #9FC28A\ -}\ -.ace-kr-theme .ace_support.ace_constant {\ -color: #C27E66\ -}\ -.ace-kr-theme .ace_fold {\ -background-color: #949C8B;\ -border-color: #FCFFE0\ -}\ -.ace-kr-theme .ace_support.ace_function {\ -color: #85873A\ -}\ -.ace-kr-theme .ace_storage {\ -color: #FFEE80\ -}\ -.ace-kr-theme .ace_string {\ -color: rgba(164, 161, 181, 0.8)\ -}\ -.ace-kr-theme .ace_string.ace_regexp {\ -color: rgba(125, 255, 192, 0.65)\ -}\ -.ace-kr-theme .ace_comment {\ -font-style: italic;\ -color: #706D5B\ -}\ -.ace-kr-theme .ace_variable {\ -color: #D1A796\ -}\ -.ace-kr-theme .ace_list,\ -.ace-kr-theme .ace_markup.ace_list {\ -background-color: #0F0040\ -}\ -.ace-kr-theme .ace_variable.ace_language {\ -color: #FF80E1\ -}\ -.ace-kr-theme .ace_meta.ace_tag {\ -color: #BABD9C\ -}\ -.ace-kr-theme .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/kr_theme",["require","exports","module","ace/theme/kr_theme-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-kr-theme"; +exports.cssText = require("./kr_theme-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/kr_theme"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-kuroir.js b/app/Resources/ui/js/ace/theme-kuroir.js index 85af8e85..58f911b6 100644 --- a/app/Resources/ui/js/ace/theme-kuroir.js +++ b/app/Resources/ui/js/ace/theme-kuroir.js @@ -1,63 +1,13 @@ -define("ace/theme/kuroir",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/kuroir-css",["require","exports","module"], function(require, exports, module){module.exports = "/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: 467560D0-6ACE-4409-82FD-4791420837AC) */\n\n.ace-kuroir .ace_gutter {\n background: #e8e8e8;\n color: #333;\n}\n\n.ace-kuroir .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-kuroir {\n background-color: #E8E9E8;\n color: #363636;\n}\n\n.ace-kuroir .ace_cursor {\n color: #202020;\n}\n\n.ace-kuroir .ace_marker-layer .ace_selection {\n background: rgba(245, 170, 0, 0.57);\n}\n\n.ace-kuroir.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #E8E9E8;\n}\n\n.ace-kuroir .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174);\n}\n\n.ace-kuroir .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(0, 0, 0, 0.29);\n}\n\n.ace-kuroir .ace_marker-layer .ace_active-line {\n background: rgba(203, 220, 47, 0.22);\n}\n\n.ace-kuroir .ace_gutter-active-line {\n background-color: rgba(203, 220, 47, 0.22);\n}\n\n.ace-kuroir .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(245, 170, 0, 0.57);\n}\n\n.ace-kuroir .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-kuroir .ace_fold {\n border-color: #363636;\n}\n\n\n\n\n\n.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;\nbackground-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;\nfont-style:italic;\ncolor:#FD1732;\nbackground-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;\nbackground-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);\nbackground-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;\nbackground-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}\n\n.ace-kuroir .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-kuroir .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-kuroir"; -exports.cssText = "\ -.ace-kuroir .ace_gutter {\ -background: #e8e8e8;\ -color: #333;\ -}\ -.ace-kuroir .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-kuroir {\ -background-color: #E8E9E8;\ -color: #363636;\ -}\ -.ace-kuroir .ace_cursor {\ -color: #202020;\ -}\ -.ace-kuroir .ace_marker-layer .ace_selection {\ -background: rgba(245, 170, 0, 0.57);\ -}\ -.ace-kuroir.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #E8E9E8;\ -}\ -.ace-kuroir .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174);\ -}\ -.ace-kuroir .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(0, 0, 0, 0.29);\ -}\ -.ace-kuroir .ace_marker-layer .ace_active-line {\ -background: rgba(203, 220, 47, 0.22);\ -}\ -.ace-kuroir .ace_gutter-active-line {\ -background-color: rgba(203, 220, 47, 0.22);\ -}\ -.ace-kuroir .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(245, 170, 0, 0.57);\ -}\ -.ace-kuroir .ace_invisible {\ -color: #BFBFBF\ -}\ -.ace-kuroir .ace_fold {\ -border-color: #363636;\ -}\ -.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;\ -background-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;\ -font-style:italic;\ -color:#FD1732;\ -background-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;\ -background-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);\ -background-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;\ -background-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}\ -"; +}); +define("ace/theme/kuroir",["require","exports","module","ace/theme/kuroir-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-kuroir"; +exports.cssText = require("./kuroir-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/kuroir"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-merbivore.js b/app/Resources/ui/js/ace/theme-merbivore.js index e638fb1c..bb95938b 100644 --- a/app/Resources/ui/js/ace/theme-merbivore.js +++ b/app/Resources/ui/js/ace/theme-merbivore.js @@ -1,97 +1,13 @@ -define("ace/theme/merbivore",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/merbivore-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-merbivore .ace_gutter {\n background: #202020;\n color: #E6E1DC\n}\n\n.ace-merbivore .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-merbivore {\n background-color: #161616;\n color: #E6E1DC\n}\n\n.ace-merbivore .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-merbivore .ace_marker-layer .ace_selection {\n background: #454545\n}\n\n.ace-merbivore.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #161616;\n}\n\n.ace-merbivore .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-merbivore .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-merbivore .ace_marker-layer .ace_active-line {\n background: #333435\n}\n\n.ace-merbivore .ace_gutter-active-line {\n background-color: #333435\n}\n\n.ace-merbivore .ace_marker-layer .ace_selected-word {\n border: 1px solid #454545\n}\n\n.ace-merbivore .ace_invisible {\n color: #404040\n}\n\n.ace-merbivore .ace_entity.ace_name.ace_tag,\n.ace-merbivore .ace_keyword,\n.ace-merbivore .ace_meta,\n.ace-merbivore .ace_meta.ace_tag,\n.ace-merbivore .ace_storage,\n.ace-merbivore .ace_support.ace_function {\n color: #FC6F09\n}\n\n.ace-merbivore .ace_constant,\n.ace-merbivore .ace_constant.ace_character,\n.ace-merbivore .ace_constant.ace_character.ace_escape,\n.ace-merbivore .ace_constant.ace_other,\n.ace-merbivore .ace_support.ace_type {\n color: #1EDAFB\n}\n\n.ace-merbivore .ace_constant.ace_character.ace_escape {\n color: #519F50\n}\n\n.ace-merbivore .ace_constant.ace_language {\n color: #FDC251\n}\n\n.ace-merbivore .ace_constant.ace_library,\n.ace-merbivore .ace_string,\n.ace-merbivore .ace_support.ace_constant {\n color: #8DFF0A\n}\n\n.ace-merbivore .ace_constant.ace_numeric {\n color: #58C554\n}\n\n.ace-merbivore .ace_invalid {\n color: #FFFFFF;\n background-color: #990000\n}\n\n.ace-merbivore .ace_fold {\n background-color: #FC6F09;\n border-color: #E6E1DC\n}\n\n.ace-merbivore .ace_comment {\n font-style: italic;\n color: #AD2EA4\n}\n\n.ace-merbivore .ace_entity.ace_other.ace_attribute-name {\n color: #FFFF89\n}\n\n.ace-merbivore .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-merbivore .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-merbivore"; -exports.cssText = ".ace-merbivore .ace_gutter {\ -background: #202020;\ -color: #E6E1DC\ -}\ -.ace-merbivore .ace_print-margin {\ -width: 1px;\ -background: #555651\ -}\ -.ace-merbivore {\ -background-color: #161616;\ -color: #E6E1DC\ -}\ -.ace-merbivore .ace_cursor {\ -color: #FFFFFF\ -}\ -.ace-merbivore .ace_marker-layer .ace_selection {\ -background: #454545\ -}\ -.ace-merbivore.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #161616;\ -}\ -.ace-merbivore .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-merbivore .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #404040\ -}\ -.ace-merbivore .ace_marker-layer .ace_active-line {\ -background: #333435\ -}\ -.ace-merbivore .ace_gutter-active-line {\ -background-color: #333435\ -}\ -.ace-merbivore .ace_marker-layer .ace_selected-word {\ -border: 1px solid #454545\ -}\ -.ace-merbivore .ace_invisible {\ -color: #404040\ -}\ -.ace-merbivore .ace_entity.ace_name.ace_tag,\ -.ace-merbivore .ace_keyword,\ -.ace-merbivore .ace_meta,\ -.ace-merbivore .ace_meta.ace_tag,\ -.ace-merbivore .ace_storage,\ -.ace-merbivore .ace_support.ace_function {\ -color: #FC6F09\ -}\ -.ace-merbivore .ace_constant,\ -.ace-merbivore .ace_constant.ace_character,\ -.ace-merbivore .ace_constant.ace_character.ace_escape,\ -.ace-merbivore .ace_constant.ace_other,\ -.ace-merbivore .ace_support.ace_type {\ -color: #1EDAFB\ -}\ -.ace-merbivore .ace_constant.ace_character.ace_escape {\ -color: #519F50\ -}\ -.ace-merbivore .ace_constant.ace_language {\ -color: #FDC251\ -}\ -.ace-merbivore .ace_constant.ace_library,\ -.ace-merbivore .ace_string,\ -.ace-merbivore .ace_support.ace_constant {\ -color: #8DFF0A\ -}\ -.ace-merbivore .ace_constant.ace_numeric {\ -color: #58C554\ -}\ -.ace-merbivore .ace_invalid {\ -color: #FFFFFF;\ -background-color: #990000\ -}\ -.ace-merbivore .ace_fold {\ -background-color: #FC6F09;\ -border-color: #E6E1DC\ -}\ -.ace-merbivore .ace_comment {\ -font-style: italic;\ -color: #AD2EA4\ -}\ -.ace-merbivore .ace_entity.ace_other.ace_attribute-name {\ -color: #FFFF89\ -}\ -.ace-merbivore .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/merbivore",["require","exports","module","ace/theme/merbivore-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-merbivore"; +exports.cssText = require("./merbivore-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/merbivore"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-merbivore_soft.js b/app/Resources/ui/js/ace/theme-merbivore_soft.js index d79865b0..c6294518 100644 --- a/app/Resources/ui/js/ace/theme-merbivore_soft.js +++ b/app/Resources/ui/js/ace/theme-merbivore_soft.js @@ -1,98 +1,13 @@ -define("ace/theme/merbivore_soft",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/merbivore_soft-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-merbivore-soft .ace_gutter {\n background: #262424;\n color: #E6E1DC\n}\n\n.ace-merbivore-soft .ace_print-margin {\n width: 1px;\n background: #262424\n}\n\n.ace-merbivore-soft {\n background-color: #1C1C1C;\n color: #E6E1DC\n}\n\n.ace-merbivore-soft .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_selection {\n background: #494949\n}\n\n.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1C1C1C;\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_active-line {\n background: #333435\n}\n\n.ace-merbivore-soft .ace_gutter-active-line {\n background-color: #333435\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_selected-word {\n border: 1px solid #494949\n}\n\n.ace-merbivore-soft .ace_invisible {\n color: #404040\n}\n\n.ace-merbivore-soft .ace_entity.ace_name.ace_tag,\n.ace-merbivore-soft .ace_keyword,\n.ace-merbivore-soft .ace_meta,\n.ace-merbivore-soft .ace_meta.ace_tag,\n.ace-merbivore-soft .ace_storage {\n color: #FC803A\n}\n\n.ace-merbivore-soft .ace_constant,\n.ace-merbivore-soft .ace_constant.ace_character,\n.ace-merbivore-soft .ace_constant.ace_character.ace_escape,\n.ace-merbivore-soft .ace_constant.ace_other,\n.ace-merbivore-soft .ace_support.ace_type {\n color: #68C1D8\n}\n\n.ace-merbivore-soft .ace_constant.ace_character.ace_escape {\n color: #B3E5B4\n}\n\n.ace-merbivore-soft .ace_constant.ace_language {\n color: #E1C582\n}\n\n.ace-merbivore-soft .ace_constant.ace_library,\n.ace-merbivore-soft .ace_string,\n.ace-merbivore-soft .ace_support.ace_constant {\n color: #8EC65F\n}\n\n.ace-merbivore-soft .ace_constant.ace_numeric {\n color: #7FC578\n}\n\n.ace-merbivore-soft .ace_invalid,\n.ace-merbivore-soft .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #FE3838\n}\n\n.ace-merbivore-soft .ace_fold {\n background-color: #FC803A;\n border-color: #E6E1DC\n}\n\n.ace-merbivore-soft .ace_comment,\n.ace-merbivore-soft .ace_meta {\n font-style: italic;\n color: #AC4BB8\n}\n\n.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\n color: #EAF1A3\n}\n\n.ace-merbivore-soft .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-merbivore-soft .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-merbivore-soft"; -exports.cssText = ".ace-merbivore-soft .ace_gutter {\ -background: #262424;\ -color: #E6E1DC\ -}\ -.ace-merbivore-soft .ace_print-margin {\ -width: 1px;\ -background: #262424\ -}\ -.ace-merbivore-soft {\ -background-color: #1C1C1C;\ -color: #E6E1DC\ -}\ -.ace-merbivore-soft .ace_cursor {\ -color: #FFFFFF\ -}\ -.ace-merbivore-soft .ace_marker-layer .ace_selection {\ -background: #494949\ -}\ -.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #1C1C1C;\ -}\ -.ace-merbivore-soft .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-merbivore-soft .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #404040\ -}\ -.ace-merbivore-soft .ace_marker-layer .ace_active-line {\ -background: #333435\ -}\ -.ace-merbivore-soft .ace_gutter-active-line {\ -background-color: #333435\ -}\ -.ace-merbivore-soft .ace_marker-layer .ace_selected-word {\ -border: 1px solid #494949\ -}\ -.ace-merbivore-soft .ace_invisible {\ -color: #404040\ -}\ -.ace-merbivore-soft .ace_entity.ace_name.ace_tag,\ -.ace-merbivore-soft .ace_keyword,\ -.ace-merbivore-soft .ace_meta,\ -.ace-merbivore-soft .ace_meta.ace_tag,\ -.ace-merbivore-soft .ace_storage {\ -color: #FC803A\ -}\ -.ace-merbivore-soft .ace_constant,\ -.ace-merbivore-soft .ace_constant.ace_character,\ -.ace-merbivore-soft .ace_constant.ace_character.ace_escape,\ -.ace-merbivore-soft .ace_constant.ace_other,\ -.ace-merbivore-soft .ace_support.ace_type {\ -color: #68C1D8\ -}\ -.ace-merbivore-soft .ace_constant.ace_character.ace_escape {\ -color: #B3E5B4\ -}\ -.ace-merbivore-soft .ace_constant.ace_language {\ -color: #E1C582\ -}\ -.ace-merbivore-soft .ace_constant.ace_library,\ -.ace-merbivore-soft .ace_string,\ -.ace-merbivore-soft .ace_support.ace_constant {\ -color: #8EC65F\ -}\ -.ace-merbivore-soft .ace_constant.ace_numeric {\ -color: #7FC578\ -}\ -.ace-merbivore-soft .ace_invalid,\ -.ace-merbivore-soft .ace_invalid.ace_deprecated {\ -color: #FFFFFF;\ -background-color: #FE3838\ -}\ -.ace-merbivore-soft .ace_fold {\ -background-color: #FC803A;\ -border-color: #E6E1DC\ -}\ -.ace-merbivore-soft .ace_comment,\ -.ace-merbivore-soft .ace_meta {\ -font-style: italic;\ -color: #AC4BB8\ -}\ -.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\ -color: #EAF1A3\ -}\ -.ace-merbivore-soft .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/merbivore_soft",["require","exports","module","ace/theme/merbivore_soft-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-merbivore-soft"; +exports.cssText = require("./merbivore_soft-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/merbivore_soft"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-mono_industrial.js b/app/Resources/ui/js/ace/theme-mono_industrial.js index 0bd57662..d5d5fc3a 100644 --- a/app/Resources/ui/js/ace/theme-mono_industrial.js +++ b/app/Resources/ui/js/ace/theme-mono_industrial.js @@ -1,109 +1,13 @@ -define("ace/theme/mono_industrial",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/mono_industrial-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-mono-industrial .ace_gutter {\n background: #1d2521;\n color: #C5C9C9\n}\n\n.ace-mono-industrial .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-mono-industrial {\n background-color: #222C28;\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_selection {\n background: rgba(145, 153, 148, 0.40)\n}\n\n.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #222C28;\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(102, 108, 104, 0.50)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_active-line {\n background: rgba(12, 13, 12, 0.25)\n}\n\n.ace-mono-industrial .ace_gutter-active-line {\n background-color: rgba(12, 13, 12, 0.25)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(145, 153, 148, 0.40)\n}\n\n.ace-mono-industrial .ace_invisible {\n color: rgba(102, 108, 104, 0.50)\n}\n\n.ace-mono-industrial .ace_string {\n background-color: #151C19;\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_keyword,\n.ace-mono-industrial .ace_meta {\n color: #A39E64\n}\n\n.ace-mono-industrial .ace_constant,\n.ace-mono-industrial .ace_constant.ace_character,\n.ace-mono-industrial .ace_constant.ace_character.ace_escape,\n.ace-mono-industrial .ace_constant.ace_numeric,\n.ace-mono-industrial .ace_constant.ace_other {\n color: #E98800\n}\n\n.ace-mono-industrial .ace_entity.ace_name.ace_function,\n.ace-mono-industrial .ace_keyword.ace_operator,\n.ace-mono-industrial .ace_variable {\n color: #A8B3AB\n}\n\n.ace-mono-industrial .ace_invalid {\n color: #FFFFFF;\n background-color: rgba(153, 0, 0, 0.68)\n}\n\n.ace-mono-industrial .ace_support.ace_constant {\n color: #C87500\n}\n\n.ace-mono-industrial .ace_fold {\n background-color: #A8B3AB;\n border-color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_support.ace_function {\n color: #588E60\n}\n\n.ace-mono-industrial .ace_entity.ace_name,\n.ace-mono-industrial .ace_support.ace_class,\n.ace-mono-industrial .ace_support.ace_type {\n color: #5778B6\n}\n\n.ace-mono-industrial .ace_storage {\n color: #C23B00\n}\n\n.ace-mono-industrial .ace_variable.ace_language,\n.ace-mono-industrial .ace_variable.ace_parameter {\n color: #648BD2\n}\n\n.ace-mono-industrial .ace_comment {\n color: #666C68;\n background-color: #151C19\n}\n\n.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\n color: #909993\n}\n\n.ace-mono-industrial .ace_entity.ace_name.ace_tag {\n color: #A65EFF\n}\n\n.ace-mono-industrial .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-mono-industrial .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-mono-industrial"; -exports.cssText = ".ace-mono-industrial .ace_gutter {\ -background: #1d2521;\ -color: #C5C9C9\ -}\ -.ace-mono-industrial .ace_print-margin {\ -width: 1px;\ -background: #555651\ -}\ -.ace-mono-industrial {\ -background-color: #222C28;\ -color: #FFFFFF\ -}\ -.ace-mono-industrial .ace_cursor {\ -color: #FFFFFF\ -}\ -.ace-mono-industrial .ace_marker-layer .ace_selection {\ -background: rgba(145, 153, 148, 0.40)\ -}\ -.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #222C28;\ -}\ -.ace-mono-industrial .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-mono-industrial .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(102, 108, 104, 0.50)\ -}\ -.ace-mono-industrial .ace_marker-layer .ace_active-line {\ -background: rgba(12, 13, 12, 0.25)\ -}\ -.ace-mono-industrial .ace_gutter-active-line {\ -background-color: rgba(12, 13, 12, 0.25)\ -}\ -.ace-mono-industrial .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(145, 153, 148, 0.40)\ -}\ -.ace-mono-industrial .ace_invisible {\ -color: rgba(102, 108, 104, 0.50)\ -}\ -.ace-mono-industrial .ace_string {\ -background-color: #151C19;\ -color: #FFFFFF\ -}\ -.ace-mono-industrial .ace_keyword,\ -.ace-mono-industrial .ace_meta {\ -color: #A39E64\ -}\ -.ace-mono-industrial .ace_constant,\ -.ace-mono-industrial .ace_constant.ace_character,\ -.ace-mono-industrial .ace_constant.ace_character.ace_escape,\ -.ace-mono-industrial .ace_constant.ace_numeric,\ -.ace-mono-industrial .ace_constant.ace_other {\ -color: #E98800\ -}\ -.ace-mono-industrial .ace_entity.ace_name.ace_function,\ -.ace-mono-industrial .ace_keyword.ace_operator,\ -.ace-mono-industrial .ace_variable {\ -color: #A8B3AB\ -}\ -.ace-mono-industrial .ace_invalid {\ -color: #FFFFFF;\ -background-color: rgba(153, 0, 0, 0.68)\ -}\ -.ace-mono-industrial .ace_support.ace_constant {\ -color: #C87500\ -}\ -.ace-mono-industrial .ace_fold {\ -background-color: #A8B3AB;\ -border-color: #FFFFFF\ -}\ -.ace-mono-industrial .ace_support.ace_function {\ -color: #588E60\ -}\ -.ace-mono-industrial .ace_entity.ace_name,\ -.ace-mono-industrial .ace_support.ace_class,\ -.ace-mono-industrial .ace_support.ace_type {\ -color: #5778B6\ -}\ -.ace-mono-industrial .ace_storage {\ -color: #C23B00\ -}\ -.ace-mono-industrial .ace_variable.ace_language,\ -.ace-mono-industrial .ace_variable.ace_parameter {\ -color: #648BD2\ -}\ -.ace-mono-industrial .ace_comment {\ -color: #666C68;\ -background-color: #151C19\ -}\ -.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\ -color: #909993\ -}\ -.ace-mono-industrial .ace_entity.ace_name.ace_tag {\ -color: #A65EFF\ -}\ -.ace-mono-industrial .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/mono_industrial",["require","exports","module","ace/theme/mono_industrial-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-mono-industrial"; +exports.cssText = require("./mono_industrial-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/mono_industrial"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-monokai.js b/app/Resources/ui/js/ace/theme-monokai.js index 7eed6b44..e918f803 100644 --- a/app/Resources/ui/js/ace/theme-monokai.js +++ b/app/Resources/ui/js/ace/theme-monokai.js @@ -1,107 +1,13 @@ -define("ace/theme/monokai",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/monokai-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-monokai .ace_gutter {\n background: #2F3129;\n color: #8F908A\n}\n\n.ace-monokai .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-monokai {\n background-color: #272822;\n color: #F8F8F2\n}\n\n.ace-monokai .ace_cursor {\n color: #F8F8F0\n}\n\n.ace-monokai .ace_marker-layer .ace_selection {\n background: #49483E\n}\n\n.ace-monokai.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #272822;\n}\n\n.ace-monokai .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-monokai .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #49483E\n}\n\n.ace-monokai .ace_marker-layer .ace_active-line {\n background: #202020\n}\n\n.ace-monokai .ace_gutter-active-line {\n background-color: #272727\n}\n\n.ace-monokai .ace_marker-layer .ace_selected-word {\n border: 1px solid #49483E\n}\n\n.ace-monokai .ace_invisible {\n color: #52524d\n}\n\n.ace-monokai .ace_entity.ace_name.ace_tag,\n.ace-monokai .ace_keyword,\n.ace-monokai .ace_meta.ace_tag,\n.ace-monokai .ace_storage {\n color: #F92672\n}\n\n.ace-monokai .ace_punctuation,\n.ace-monokai .ace_punctuation.ace_tag {\n color: #fff\n}\n\n.ace-monokai .ace_constant.ace_character,\n.ace-monokai .ace_constant.ace_language,\n.ace-monokai .ace_constant.ace_numeric,\n.ace-monokai .ace_constant.ace_other {\n color: #AE81FF\n}\n\n.ace-monokai .ace_invalid {\n color: #F8F8F0;\n background-color: #F92672\n}\n\n.ace-monokai .ace_invalid.ace_deprecated {\n color: #F8F8F0;\n background-color: #AE81FF\n}\n\n.ace-monokai .ace_support.ace_constant,\n.ace-monokai .ace_support.ace_function {\n color: #66D9EF\n}\n\n.ace-monokai .ace_fold {\n background-color: #A6E22E;\n border-color: #F8F8F2\n}\n\n.ace-monokai .ace_storage.ace_type,\n.ace-monokai .ace_support.ace_class,\n.ace-monokai .ace_support.ace_type {\n font-style: italic;\n color: #66D9EF\n}\n\n.ace-monokai .ace_entity.ace_name.ace_function,\n.ace-monokai .ace_entity.ace_other,\n.ace-monokai .ace_entity.ace_other.ace_attribute-name,\n.ace-monokai .ace_variable {\n color: #A6E22E\n}\n\n.ace-monokai .ace_variable.ace_parameter {\n font-style: italic;\n color: #FD971F\n}\n\n.ace-monokai .ace_string {\n color: #E6DB74\n}\n\n.ace-monokai .ace_comment {\n color: #75715E\n}\n\n.ace-monokai .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-monokai .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-monokai"; -exports.cssText = ".ace-monokai .ace_gutter {\ -background: #2F3129;\ -color: #8F908A\ -}\ -.ace-monokai .ace_print-margin {\ -width: 1px;\ -background: #555651\ -}\ -.ace-monokai {\ -background-color: #272822;\ -color: #F8F8F2\ -}\ -.ace-monokai .ace_cursor {\ -color: #F8F8F0\ -}\ -.ace-monokai .ace_marker-layer .ace_selection {\ -background: #49483E\ -}\ -.ace-monokai.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #272822;\ -}\ -.ace-monokai .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-monokai .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #49483E\ -}\ -.ace-monokai .ace_marker-layer .ace_active-line {\ -background: #202020\ -}\ -.ace-monokai .ace_gutter-active-line {\ -background-color: #272727\ -}\ -.ace-monokai .ace_marker-layer .ace_selected-word {\ -border: 1px solid #49483E\ -}\ -.ace-monokai .ace_invisible {\ -color: #52524d\ -}\ -.ace-monokai .ace_entity.ace_name.ace_tag,\ -.ace-monokai .ace_keyword,\ -.ace-monokai .ace_meta.ace_tag,\ -.ace-monokai .ace_storage {\ -color: #F92672\ -}\ -.ace-monokai .ace_punctuation,\ -.ace-monokai .ace_punctuation.ace_tag {\ -color: #fff\ -}\ -.ace-monokai .ace_constant.ace_character,\ -.ace-monokai .ace_constant.ace_language,\ -.ace-monokai .ace_constant.ace_numeric,\ -.ace-monokai .ace_constant.ace_other {\ -color: #AE81FF\ -}\ -.ace-monokai .ace_invalid {\ -color: #F8F8F0;\ -background-color: #F92672\ -}\ -.ace-monokai .ace_invalid.ace_deprecated {\ -color: #F8F8F0;\ -background-color: #AE81FF\ -}\ -.ace-monokai .ace_support.ace_constant,\ -.ace-monokai .ace_support.ace_function {\ -color: #66D9EF\ -}\ -.ace-monokai .ace_fold {\ -background-color: #A6E22E;\ -border-color: #F8F8F2\ -}\ -.ace-monokai .ace_storage.ace_type,\ -.ace-monokai .ace_support.ace_class,\ -.ace-monokai .ace_support.ace_type {\ -font-style: italic;\ -color: #66D9EF\ -}\ -.ace-monokai .ace_entity.ace_name.ace_function,\ -.ace-monokai .ace_entity.ace_other,\ -.ace-monokai .ace_entity.ace_other.ace_attribute-name,\ -.ace-monokai .ace_variable {\ -color: #A6E22E\ -}\ -.ace-monokai .ace_variable.ace_parameter {\ -font-style: italic;\ -color: #FD971F\ -}\ -.ace-monokai .ace_string {\ -color: #E6DB74\ -}\ -.ace-monokai .ace_comment {\ -color: #75715E\ -}\ -.ace-monokai .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/monokai",["require","exports","module","ace/theme/monokai-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-monokai"; +exports.cssText = require("./monokai-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/monokai"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-nord_dark.js b/app/Resources/ui/js/ace/theme-nord_dark.js index c97f5831..bc862713 100644 --- a/app/Resources/ui/js/ace/theme-nord_dark.js +++ b/app/Resources/ui/js/ace/theme-nord_dark.js @@ -1,97 +1,14 @@ -define("ace/theme/nord_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/nord_dark-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-nord-dark .ace_gutter {\n color: #616e88;\n}\n\n.ace-nord-dark .ace_print-margin {\n width: 1px;\n background: #4c566a;\n}\n\n.ace-nord-dark {\n background-color: #2e3440;\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-nord-dark .ace_storage {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_cursor {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_string.ace_regexp {\n color: #bf616a;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_active-line {\n background: #434c5ecc;\n}\n.ace-nord-dark .ace_marker-layer .ace_selection {\n background: #434c5ecc;\n}\n\n.ace-nord-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #2e3440;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_step {\n background: #ebcb8b;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #88c0d066;\n}\n\n.ace-nord-dark .ace_gutter-active-line {\n background-color: #434c5ecc;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #88c0d066;\n}\n\n.ace-nord-dark .ace_invisible {\n color: #4c566a;\n}\n\n.ace-nord-dark .ace_keyword,\n.ace-nord-dark .ace_meta,\n.ace-nord-dark .ace_support.ace_class,\n.ace-nord-dark .ace_support.ace_type {\n color: #81a1c1;\n}\n\n.ace-nord-dark .ace_constant.ace_character,\n.ace-nord-dark .ace_constant.ace_other {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_constant.ace_language {\n color: #5e81ac;\n}\n\n.ace-nord-dark .ace_constant.ace_escape {\n color: #ebcB8b;\n}\n\n.ace-nord-dark .ace_constant.ace_numeric {\n color: #b48ead;\n}\n\n.ace-nord-dark .ace_fold {\n background-color: #4c566a;\n border-color: #d8dee9;\n}\n\n.ace-nord-dark .ace_entity.ace_name.ace_function,\n.ace-nord-dark .ace_entity.ace_name.ace_tag,\n.ace-nord-dark .ace_support.ace_function,\n.ace-nord-dark .ace_variable,\n.ace-nord-dark .ace_variable.ace_language {\n color: #8fbcbb;\n}\n\n.ace-nord-dark .ace_string {\n color: #a3be8c;\n}\n\n.ace-nord-dark .ace_comment {\n color: #616e88;\n}\n\n.ace-nord-dark .ace_indent-guide {\n box-shadow: inset -1px 0 0 0 #434c5eb3;\n}\n\n.ace-nord-dark .ace_indent-guide-active {\n box-shadow: inset -1px 0 0 0 #8395b8b3;\n}\n"; -exports.isDark = true; +}); + +define("ace/theme/nord_dark",["require","exports","module","ace/theme/nord_dark-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; exports.cssClass = "ace-nord-dark"; -exports.cssText = ".ace-nord-dark .ace_gutter {\ -color: #616e88;\ -}\ -.ace-nord-dark .ace_print-margin {\ -width: 1px;\ -background: #4c566a;\ -}\ -.ace-nord-dark {\ -background-color: #2e3440;\ -color: #d8dee9;\ -}\ -.ace-nord-dark .ace_entity.ace_other.ace_attribute-name,\ -.ace-nord-dark .ace_storage {\ -color: #d8dee9;\ -}\ -.ace-nord-dark .ace_cursor {\ -color: #d8dee9;\ -},\ -.ace-nord-dark .ace_string.ace_regexp {\ -color: #bf616a;\ -}\ -.ace-nord-dark .ace_marker-layer .ace_active-line {\ -background: #434c5ecc;\ -}\ -.ace-nord-dark .ace_marker-layer .ace_selection {\ -background: #434c5ecc;\ -}\ -.ace-nord-dark.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #2e3440;\ -}\ -.ace-nord-dark .ace_marker-layer .ace_step {\ -background: #ebcb8b;\ -}\ -.ace-nord-dark .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #88c0d066;\ -}\ -.ace-nord-dark .ace_gutter-active-line {\ -background-color: #434c5ecc;\ -}\ -.ace-nord-dark .ace_marker-layer .ace_selected-word {\ -border: 1px solid #88c0d066;\ -}\ -.ace-nord-dark .ace_invisible {\ -color: #4c566a;\ -}\ -.ace-nord-dark .ace_keyword,\ -.ace-nord-dark .ace_meta,\ -.ace-nord-dark .ace_support.ace_class,\ -.ace-nord-dark .ace_support.ace_type {\ -color: #81a1c1;\ -}\ -.ace-nord-dark .ace_constant.ace_character,\ -.ace-nord-dark .ace_constant.ace_other {\ -color: #d8dee9;\ -}\ -.ace-nord-dark .ace_constant.ace_language {\ -color: #5e81ac;\ -}\ -.ace-nord-dark .ace_constant.ace_escape {\ -color: #ebcB8b;\ -}\ -.ace-nord-dark .ace_constant.ace_numeric {\ -color: #b48ead;\ -}\ -.ace-nord-dark .ace_fold {\ -background-color: #4c566a;\ -border-color: #d8dee9;\ -}\ -.ace-nord-dark .ace_entity.ace_name.ace_function,\ -.ace-nord-dark .ace_entity.ace_name.ace_tag,\ -.ace-nord-dark .ace_support.ace_function,\ -.ace-nord-dark .ace_variable,\ -.ace-nord-dark .ace_variable.ace_language {\ -color: #8fbcbb;\ -}\ -.ace-nord-dark .ace_string {\ -color: #a3be8c;\ -}\ -.ace-nord-dark .ace_comment {\ -color: #616e88;\ -}\ -.ace-nord-dark .ace_indent-guide {\ -box-shadow: inset -1px 0 0 0 #434c5eb3;\ -}\ -"; +exports.cssText = require("./nord_dark-css"); exports.$selectionColorConflict = true; - var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/nord_dark"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-one_dark.js b/app/Resources/ui/js/ace/theme-one_dark.js index b99f2287..760ce482 100644 --- a/app/Resources/ui/js/ace/theme-one_dark.js +++ b/app/Resources/ui/js/ace/theme-one_dark.js @@ -1,135 +1,14 @@ -define("ace/theme/one_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/one_dark-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-one-dark .ace_gutter {\n background: #282c34;\n color: #6a6f7a\n}\n\n.ace-one-dark .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-one-dark {\n background-color: #282c34;\n color: #abb2bf\n}\n\n.ace-one-dark .ace_cursor {\n color: #528bff\n}\n\n.ace-one-dark .ace_marker-layer .ace_selection {\n background: #3d4350\n}\n\n.ace-one-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0 #282c34;\n border-radius: 2px\n}\n\n.ace-one-dark .ace_marker-layer .ace_step {\n background: #c6dbae\n}\n\n.ace-one-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #747369\n}\n\n.ace-one-dark .ace_marker-layer .ace_active-line {\n background: rgba(76, 87, 103, .19)\n}\n\n.ace-one-dark .ace_gutter-active-line {\n background-color: rgba(76, 87, 103, .19)\n}\n\n.ace-one-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #3d4350\n}\n\n.ace-one-dark .ace_fold {\n background-color: #61afef;\n border-color: #abb2bf\n}\n\n.ace-one-dark .ace_keyword {\n color: #c678dd\n}\n\n.ace-one-dark .ace_keyword.ace_operator {\n color: #c678dd\n}\n\n.ace-one-dark .ace_keyword.ace_other.ace_unit {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_language {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_numeric {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_character {\n color: #56b6c2\n}\n\n.ace-one-dark .ace_constant.ace_other {\n color: #56b6c2\n}\n\n.ace-one-dark .ace_support.ace_function {\n color: #61afef\n}\n\n.ace-one-dark .ace_support.ace_constant {\n color: #d19a66\n}\n\n.ace-one-dark .ace_support.ace_class {\n color: #e5c07b\n}\n\n.ace-one-dark .ace_support.ace_type {\n color: #e5c07b\n}\n\n.ace-one-dark .ace_storage {\n color: #c678dd\n}\n\n.ace-one-dark .ace_storage.ace_type {\n color: #c678dd\n}\n\n.ace-one-dark .ace_invalid {\n color: #fff;\n background-color: #f2777a\n}\n\n.ace-one-dark .ace_invalid.ace_deprecated {\n color: #272b33;\n background-color: #d27b53\n}\n\n.ace-one-dark .ace_string {\n color: #98c379\n}\n\n.ace-one-dark .ace_string.ace_regexp {\n color: #e06c75\n}\n\n.ace-one-dark .ace_comment {\n font-style: italic;\n color: #5c6370\n}\n\n.ace-one-dark .ace_variable {\n color: #e06c75\n}\n\n.ace-one-dark .ace_variable.ace_parameter {\n color: #d19a66\n}\n\n.ace-one-dark .ace_meta.ace_tag {\n color: #e06c75\n}\n\n.ace-one-dark .ace_entity.ace_other.ace_attribute-name {\n color: #e06c75\n}\n\n.ace-one-dark .ace_entity.ace_name.ace_function {\n color: #61afef\n}\n\n.ace-one-dark .ace_entity.ace_name.ace_tag {\n color: #e06c75\n}\n\n.ace-one-dark .ace_markup.ace_heading {\n color: #98c379\n}\n\n.ace-one-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-one-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; - exports.isDark = true; - exports.cssClass = "ace-one-dark"; - exports.cssText = ".ace-one-dark .ace_gutter {\ -background: #282c34;\ -color: #6a6f7a\ -}\ -.ace-one-dark .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-one-dark {\ -background-color: #282c34;\ -color: #abb2bf\ -}\ -.ace-one-dark .ace_cursor {\ -color: #528bff\ -}\ -.ace-one-dark .ace_marker-layer .ace_selection {\ -background: #3d4350\ -}\ -.ace-one-dark.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0 #282c34;\ -border-radius: 2px\ -}\ -.ace-one-dark .ace_marker-layer .ace_step {\ -background: #c6dbae\ -}\ -.ace-one-dark .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #747369\ -}\ -.ace-one-dark .ace_marker-layer .ace_active-line {\ -background: rgba(76, 87, 103, .19)\ -}\ -.ace-one-dark .ace_gutter-active-line {\ -background-color: rgba(76, 87, 103, .19)\ -}\ -.ace-one-dark .ace_marker-layer .ace_selected-word {\ -border: 1px solid #3d4350\ -}\ -.ace-one-dark .ace_fold {\ -background-color: #61afef;\ -border-color: #abb2bf\ -}\ -.ace-one-dark .ace_keyword {\ -color: #c678dd\ -}\ -.ace-one-dark .ace_keyword.ace_operator {\ -color: #c678dd\ -}\ -.ace-one-dark .ace_keyword.ace_other.ace_unit {\ -color: #d19a66\ -}\ -.ace-one-dark .ace_constant.ace_language {\ -color: #d19a66\ -}\ -.ace-one-dark .ace_constant.ace_numeric {\ -color: #d19a66\ -}\ -.ace-one-dark .ace_constant.ace_character {\ -color: #56b6c2\ -}\ -.ace-one-dark .ace_constant.ace_other {\ -color: #56b6c2\ -}\ -.ace-one-dark .ace_support.ace_function {\ -color: #61afef\ -}\ -.ace-one-dark .ace_support.ace_constant {\ -color: #d19a66\ -}\ -.ace-one-dark .ace_support.ace_class {\ -color: #e5c07b\ -}\ -.ace-one-dark .ace_support.ace_type {\ -color: #e5c07b\ -}\ -.ace-one-dark .ace_storage {\ -color: #c678dd\ -}\ -.ace-one-dark .ace_storage.ace_type {\ -color: #c678dd\ -}\ -.ace-one-dark .ace_invalid {\ -color: #fff;\ -background-color: #f2777a\ -}\ -.ace-one-dark .ace_invalid.ace_deprecated {\ -color: #272b33;\ -background-color: #d27b53\ -}\ -.ace-one-dark .ace_string {\ -color: #98c379\ -}\ -.ace-one-dark .ace_string.ace_regexp {\ -color: #e06c75\ -}\ -.ace-one-dark .ace_comment {\ -font-style: italic;\ -color: #5c6370\ -}\ -.ace-one-dark .ace_variable {\ -color: #e06c75\ -}\ -.ace-one-dark .ace_variable.ace_parameter {\ -color: #d19a66\ -}\ -.ace-one-dark .ace_meta.ace_tag {\ -color: #e06c75\ -}\ -.ace-one-dark .ace_entity.ace_other.ace_attribute-name {\ -color: #e06c75\ -}\ -.ace-one-dark .ace_entity.ace_name.ace_function {\ -color: #61afef\ -}\ -.ace-one-dark .ace_entity.ace_name.ace_tag {\ -color: #e06c75\ -}\ -.ace-one-dark .ace_markup.ace_heading {\ -color: #98c379\ -}\ -.ace-one-dark .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\ -}\ -"; - - var dom = require("../lib/dom"); - dom.importCssString(exports.cssText, exports.cssClass, false); - }); (function() { +}); + +define("ace/theme/one_dark",["require","exports","module","ace/theme/one_dark-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-one-dark"; +exports.cssText = require("./one_dark-css"); +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); + +}); (function() { window.require(["ace/theme/one_dark"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { module.exports = m; diff --git a/app/Resources/ui/js/ace/theme-pastel_on_dark.js b/app/Resources/ui/js/ace/theme-pastel_on_dark.js index cc51053d..277e427b 100644 --- a/app/Resources/ui/js/ace/theme-pastel_on_dark.js +++ b/app/Resources/ui/js/ace/theme-pastel_on_dark.js @@ -1,110 +1,13 @@ -define("ace/theme/pastel_on_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/pastel_on_dark-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-pastel-on-dark .ace_gutter {\n background: #353030;\n color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_print-margin {\n width: 1px;\n background: #353030\n}\n\n.ace-pastel-on-dark {\n background-color: #2C2828;\n color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_cursor {\n color: #A7A7A7\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #2C2828;\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031)\n}\n\n.ace-pastel-on-dark .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.031)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(221, 240, 255, 0.20)\n}\n\n.ace-pastel-on-dark .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-pastel-on-dark .ace_keyword,\n.ace-pastel-on-dark .ace_meta {\n color: #757aD8\n}\n\n.ace-pastel-on-dark .ace_constant,\n.ace-pastel-on-dark .ace_constant.ace_character,\n.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\n.ace-pastel-on-dark .ace_constant.ace_other {\n color: #4FB7C5\n}\n\n.ace-pastel-on-dark .ace_keyword.ace_operator {\n color: #797878\n}\n\n.ace-pastel-on-dark .ace_constant.ace_character {\n color: #AFA472\n}\n\n.ace-pastel-on-dark .ace_constant.ace_language {\n color: #DE8E30\n}\n\n.ace-pastel-on-dark .ace_constant.ace_numeric {\n color: #CCCCCC\n}\n\n.ace-pastel-on-dark .ace_invalid,\n.ace-pastel-on-dark .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-pastel-on-dark .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1\n}\n\n.ace-pastel-on-dark .ace_fold {\n background-color: #757aD8;\n border-color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_support.ace_function {\n color: #AEB2F8\n}\n\n.ace-pastel-on-dark .ace_string {\n color: #66A968\n}\n\n.ace-pastel-on-dark .ace_string.ace_regexp {\n color: #E9C062\n}\n\n.ace-pastel-on-dark .ace_comment {\n color: #A6C6FF\n}\n\n.ace-pastel-on-dark .ace_variable {\n color: #BEBF55\n}\n\n.ace-pastel-on-dark .ace_variable.ace_language {\n color: #C1C144\n}\n\n.ace-pastel-on-dark .ace_xml-pe {\n color: #494949\n}\n\n.ace-pastel-on-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-pastel-on-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-pastel-on-dark"; -exports.cssText = ".ace-pastel-on-dark .ace_gutter {\ -background: #353030;\ -color: #8F938F\ -}\ -.ace-pastel-on-dark .ace_print-margin {\ -width: 1px;\ -background: #353030\ -}\ -.ace-pastel-on-dark {\ -background-color: #2C2828;\ -color: #8F938F\ -}\ -.ace-pastel-on-dark .ace_cursor {\ -color: #A7A7A7\ -}\ -.ace-pastel-on-dark .ace_marker-layer .ace_selection {\ -background: rgba(221, 240, 255, 0.20)\ -}\ -.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #2C2828;\ -}\ -.ace-pastel-on-dark .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(255, 255, 255, 0.25)\ -}\ -.ace-pastel-on-dark .ace_marker-layer .ace_active-line {\ -background: rgba(255, 255, 255, 0.031)\ -}\ -.ace-pastel-on-dark .ace_gutter-active-line {\ -background-color: rgba(255, 255, 255, 0.031)\ -}\ -.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(221, 240, 255, 0.20)\ -}\ -.ace-pastel-on-dark .ace_invisible {\ -color: rgba(255, 255, 255, 0.25)\ -}\ -.ace-pastel-on-dark .ace_keyword,\ -.ace-pastel-on-dark .ace_meta {\ -color: #757aD8\ -}\ -.ace-pastel-on-dark .ace_constant,\ -.ace-pastel-on-dark .ace_constant.ace_character,\ -.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\ -.ace-pastel-on-dark .ace_constant.ace_other {\ -color: #4FB7C5\ -}\ -.ace-pastel-on-dark .ace_keyword.ace_operator {\ -color: #797878\ -}\ -.ace-pastel-on-dark .ace_constant.ace_character {\ -color: #AFA472\ -}\ -.ace-pastel-on-dark .ace_constant.ace_language {\ -color: #DE8E30\ -}\ -.ace-pastel-on-dark .ace_constant.ace_numeric {\ -color: #CCCCCC\ -}\ -.ace-pastel-on-dark .ace_invalid,\ -.ace-pastel-on-dark .ace_invalid.ace_illegal {\ -color: #F8F8F8;\ -background-color: rgba(86, 45, 86, 0.75)\ -}\ -.ace-pastel-on-dark .ace_invalid.ace_deprecated {\ -text-decoration: underline;\ -font-style: italic;\ -color: #D2A8A1\ -}\ -.ace-pastel-on-dark .ace_fold {\ -background-color: #757aD8;\ -border-color: #8F938F\ -}\ -.ace-pastel-on-dark .ace_support.ace_function {\ -color: #AEB2F8\ -}\ -.ace-pastel-on-dark .ace_string {\ -color: #66A968\ -}\ -.ace-pastel-on-dark .ace_string.ace_regexp {\ -color: #E9C062\ -}\ -.ace-pastel-on-dark .ace_comment {\ -color: #A6C6FF\ -}\ -.ace-pastel-on-dark .ace_variable {\ -color: #BEBF55\ -}\ -.ace-pastel-on-dark .ace_variable.ace_language {\ -color: #C1C144\ -}\ -.ace-pastel-on-dark .ace_xml-pe {\ -color: #494949\ -}\ -.ace-pastel-on-dark .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/pastel_on_dark",["require","exports","module","ace/theme/pastel_on_dark-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-pastel-on-dark"; +exports.cssText = require("./pastel_on_dark-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/pastel_on_dark"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-samizdat.js b/app/Resources/ui/js/ace/theme-samizdat.js new file mode 100644 index 00000000..12530d0e --- /dev/null +++ b/app/Resources/ui/js/ace/theme-samizdat.js @@ -0,0 +1,162 @@ +define("ace/theme/samizdat-css",["require","exports","module"], function(require, exports, module){module.exports = ` +.ace-samizdat .ace_gutter { + background: #090B10; + color: #858585 +} + +.ace-samizdat .ace_print-margin { + width: 1px; + background: #181920 +} + +.ace-samizdat { + background-color: #090B10; + color: #EBDBB2 +} + +.ace-samizdat .ace_cursor { + color: #D4D4D4 +} + +.ace-samizdat .ace_marker-layer .ace_selection { + background: #569CD655 +} + +.ace-samizdat.ace_multiselect .ace_selection.ace_start { + box-shadow: 0 0 3px 0px #090B10; +} + +.ace-samizdat .ace_marker-layer .ace_step { + background: rgb(89, 66, 0) +} + +.ace-samizdat .ace_marker-layer .ace_bracket { + margin: -1px 0 0 -1px; + border: 1px solid #FFFFFF44 +} + +.ace-samizdat .ace_marker-layer .ace_active-line { + background: #2A2A2A +} + +.ace-samizdat .ace_gutter-active-line { + background-color: #2A2A2A +} + +.ace-samizdat .ace_marker-layer .ace_selected-word { + border: 1px solid #303030 +} + +.ace-samizdat .ace_invisible { + color: #6C6C6C +} + +.ace-samizdat .ace_entity.ace_name.ace_tag, +.ace-samizdat .ace_keyword, +.ace-samizdat .ace_meta.ace_tag, +.ace-samizdat .ace_storage { + color: #FB5245; + font-style: italic +} + +.ace-samizdat .ace_keyword.ace_operator { + color: #D4D4D4; + font-style: normal +} + +.ace-samizdat .ace_punctuation, +.ace-samizdat .ace_punctuation.ace_tag { + color: #EBDBB2 +} + +.ace-samizdat .ace_constant.ace_character, +.ace-samizdat .ace_constant.ace_language, +.ace-samizdat .ace_constant.ace_numeric, +.ace-samizdat .ace_constant.ace_other { + color: #569CD6 +} + +.ace-samizdat .ace_constant.ace_character.ace_escape, +.ace-samizdat .ace_constant.ace_language.ace_escape { + color: #D7BA7D +} + +.ace-samizdat .ace_invalid { + color: #EBDBB2; + background-color: #F44747 +} + +.ace-samizdat .ace_invalid.ace_deprecated { + color: #EBDBB2; + background-color: #FFB300 +} + +.ace-samizdat .ace_entity.ace_name.ace_function, +.ace-samizdat .ace_support.ace_function { + color: #FAC149 +} + +.ace-samizdat .ace_fold { + background-color: #B2CCD6; + border-color: #EBDBB2 +} + +.ace-samizdat .ace_storage.ace_type, +.ace-samizdat .ace_support.ace_class, +.ace-samizdat .ace_support.ace_type { + font-style: italic; + color: #B2CCD6 +} + +.ace-samizdat .ace_entity.ace_other.ace_attribute-name { + font-style: italic; + color: #B2CCD6 +} + +.ace-samizdat .ace_entity.ace_other, +.ace-samizdat .ace_variable { + color: #EBDBB2 +} + +.ace-samizdat .ace_variable.ace_parameter { + font-style: italic; + color: #B2CCD6 +} + +.ace-samizdat .ace_string { + color: #B8BB26 +} + +.ace-samizdat .ace_string.ace_regexp { + color: #F44747 +} + +.ace-samizdat .ace_comment { + color: #A89984; + font-style: italic +} + +.ace-samizdat .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEElEQVR42mP4//+/AgOIAAAhyQY7mIrdGgAAAABJRU5ErkJggg==) right repeat-y +} + +.ace-samizdat .ace_indent-guide-active { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEElEQVR42mPYdOZaJAOIAAAbzQVbMToY0QAAAABJRU5ErkJggg==) right repeat-y; +} +`; + +}); + +define("ace/theme/samizdat",["require","exports","module","ace/theme/samizdat-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-samizdat"; +exports.cssText = require("./samizdat-css"); +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); + +}); (function() { + window.require(["ace/theme/samizdat"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); diff --git a/app/Resources/ui/js/ace/theme-solarized_dark.js b/app/Resources/ui/js/ace/theme-solarized_dark.js index e9a2664d..5109518f 100644 --- a/app/Resources/ui/js/ace/theme-solarized_dark.js +++ b/app/Resources/ui/js/ace/theme-solarized_dark.js @@ -1,90 +1,13 @@ -define("ace/theme/solarized_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/solarized_dark-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-solarized-dark .ace_gutter {\n background: #01313f;\n color: #d0edf7\n}\n\n.ace-solarized-dark .ace_print-margin {\n width: 1px;\n background: #33555E\n}\n\n.ace-solarized-dark {\n background-color: #002B36;\n color: #839496\n}\n\n.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-solarized-dark .ace_storage {\n color: #839496\n}\n\n.ace-solarized-dark .ace_cursor,\n.ace-solarized-dark .ace_string.ace_regexp {\n color: #D30102\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_active-line,\n.ace-solarized-dark .ace_marker-layer .ace_selection {\n background: rgba(255, 255, 255, 0.1)\n}\n\n.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002B36;\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-dark .ace_gutter-active-line {\n background-color: #0d3440\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #073642\n}\n\n.ace-solarized-dark .ace_invisible {\n color: rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-dark .ace_keyword,\n.ace-solarized-dark .ace_meta,\n.ace-solarized-dark .ace_support.ace_class,\n.ace-solarized-dark .ace_support.ace_type {\n color: #859900\n}\n\n.ace-solarized-dark .ace_constant.ace_character,\n.ace-solarized-dark .ace_constant.ace_other {\n color: #CB4B16\n}\n\n.ace-solarized-dark .ace_constant.ace_language {\n color: #B58900\n}\n\n.ace-solarized-dark .ace_constant.ace_numeric {\n color: #D33682\n}\n\n.ace-solarized-dark .ace_fold {\n background-color: #268BD2;\n border-color: #93A1A1\n}\n\n.ace-solarized-dark .ace_entity.ace_name.ace_function,\n.ace-solarized-dark .ace_entity.ace_name.ace_tag,\n.ace-solarized-dark .ace_support.ace_function,\n.ace-solarized-dark .ace_variable,\n.ace-solarized-dark .ace_variable.ace_language {\n color: #268BD2\n}\n\n.ace-solarized-dark .ace_string {\n color: #2AA198\n}\n\n.ace-solarized-dark .ace_comment {\n font-style: italic;\n color: #657B83\n}\n\n.ace-solarized-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-solarized-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-solarized-dark"; -exports.cssText = ".ace-solarized-dark .ace_gutter {\ -background: #01313f;\ -color: #d0edf7\ -}\ -.ace-solarized-dark .ace_print-margin {\ -width: 1px;\ -background: #33555E\ -}\ -.ace-solarized-dark {\ -background-color: #002B36;\ -color: #93A1A1\ -}\ -.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\ -.ace-solarized-dark .ace_storage {\ -color: #93A1A1\ -}\ -.ace-solarized-dark .ace_cursor,\ -.ace-solarized-dark .ace_string.ace_regexp {\ -color: #D30102\ -}\ -.ace-solarized-dark .ace_marker-layer .ace_active-line,\ -.ace-solarized-dark .ace_marker-layer .ace_selection {\ -background: rgba(255, 255, 255, 0.1)\ -}\ -.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #002B36;\ -}\ -.ace-solarized-dark .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-solarized-dark .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(147, 161, 161, 0.50)\ -}\ -.ace-solarized-dark .ace_gutter-active-line {\ -background-color: #0d3440\ -}\ -.ace-solarized-dark .ace_marker-layer .ace_selected-word {\ -border: 1px solid #073642\ -}\ -.ace-solarized-dark .ace_invisible {\ -color: rgba(147, 161, 161, 0.50)\ -}\ -.ace-solarized-dark .ace_keyword,\ -.ace-solarized-dark .ace_meta,\ -.ace-solarized-dark .ace_support.ace_class,\ -.ace-solarized-dark .ace_support.ace_type {\ -color: #859900\ -}\ -.ace-solarized-dark .ace_constant.ace_character,\ -.ace-solarized-dark .ace_constant.ace_other {\ -color: #CB4B16\ -}\ -.ace-solarized-dark .ace_constant.ace_language {\ -color: #B58900\ -}\ -.ace-solarized-dark .ace_constant.ace_numeric {\ -color: #D33682\ -}\ -.ace-solarized-dark .ace_fold {\ -background-color: #268BD2;\ -border-color: #93A1A1\ -}\ -.ace-solarized-dark .ace_entity.ace_name.ace_function,\ -.ace-solarized-dark .ace_entity.ace_name.ace_tag,\ -.ace-solarized-dark .ace_support.ace_function,\ -.ace-solarized-dark .ace_variable,\ -.ace-solarized-dark .ace_variable.ace_language {\ -color: #268BD2\ -}\ -.ace-solarized-dark .ace_string {\ -color: #2AA198\ -}\ -.ace-solarized-dark .ace_comment {\ -font-style: italic;\ -color: #657B83\ -}\ -.ace-solarized-dark .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/solarized_dark",["require","exports","module","ace/theme/solarized_dark-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-solarized-dark"; +exports.cssText = require("./solarized_dark-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/solarized_dark"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-solarized_light.js b/app/Resources/ui/js/ace/theme-solarized_light.js index 2746ea63..be6c2872 100644 --- a/app/Resources/ui/js/ace/theme-solarized_light.js +++ b/app/Resources/ui/js/ace/theme-solarized_light.js @@ -1,93 +1,13 @@ -define("ace/theme/solarized_light",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/solarized_light-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-solarized-light .ace_gutter {\n background: #fbf1d3;\n color: #333\n}\n\n.ace-solarized-light .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-solarized-light {\n background-color: #FDF6E3;\n color: #586E75\n}\n\n.ace-solarized-light .ace_cursor {\n color: #000000\n}\n\n.ace-solarized-light .ace_marker-layer .ace_selection {\n background: rgba(7, 54, 67, 0.09)\n}\n\n.ace-solarized-light.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FDF6E3;\n}\n\n.ace-solarized-light .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-solarized-light .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-light .ace_marker-layer .ace_active-line {\n background: #EEE8D5\n}\n\n.ace-solarized-light .ace_gutter-active-line {\n background-color : #EDE5C1\n}\n\n.ace-solarized-light .ace_marker-layer .ace_selected-word {\n border: 1px solid #7f9390\n}\n\n.ace-solarized-light .ace_invisible {\n color: rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-light .ace_keyword,\n.ace-solarized-light .ace_meta,\n.ace-solarized-light .ace_support.ace_class,\n.ace-solarized-light .ace_support.ace_type {\n color: #859900\n}\n\n.ace-solarized-light .ace_constant.ace_character,\n.ace-solarized-light .ace_constant.ace_other {\n color: #CB4B16\n}\n\n.ace-solarized-light .ace_constant.ace_language {\n color: #B58900\n}\n\n.ace-solarized-light .ace_constant.ace_numeric {\n color: #D33682\n}\n\n.ace-solarized-light .ace_fold {\n background-color: #268BD2;\n border-color: #586E75\n}\n\n.ace-solarized-light .ace_entity.ace_name.ace_function,\n.ace-solarized-light .ace_entity.ace_name.ace_tag,\n.ace-solarized-light .ace_support.ace_function,\n.ace-solarized-light .ace_variable,\n.ace-solarized-light .ace_variable.ace_language {\n color: #268BD2\n}\n\n.ace-solarized-light .ace_storage {\n color: #073642\n}\n\n.ace-solarized-light .ace_string {\n color: #2AA198\n}\n\n.ace-solarized-light .ace_string.ace_regexp {\n color: #D30102\n}\n\n.ace-solarized-light .ace_comment,\n.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\n color: #93A1A1\n}\n\n.ace-solarized-light .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-solarized-light .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-solarized-light"; -exports.cssText = ".ace-solarized-light .ace_gutter {\ -background: #fbf1d3;\ -color: #333\ -}\ -.ace-solarized-light .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-solarized-light {\ -background-color: #FDF6E3;\ -color: #586E75\ -}\ -.ace-solarized-light .ace_cursor {\ -color: #000000\ -}\ -.ace-solarized-light .ace_marker-layer .ace_selection {\ -background: rgba(7, 54, 67, 0.09)\ -}\ -.ace-solarized-light.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #FDF6E3;\ -}\ -.ace-solarized-light .ace_marker-layer .ace_step {\ -background: rgb(255, 255, 0)\ -}\ -.ace-solarized-light .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(147, 161, 161, 0.50)\ -}\ -.ace-solarized-light .ace_marker-layer .ace_active-line {\ -background: #EEE8D5\ -}\ -.ace-solarized-light .ace_gutter-active-line {\ -background-color : #EDE5C1\ -}\ -.ace-solarized-light .ace_marker-layer .ace_selected-word {\ -border: 1px solid #7f9390\ -}\ -.ace-solarized-light .ace_invisible {\ -color: rgba(147, 161, 161, 0.50)\ -}\ -.ace-solarized-light .ace_keyword,\ -.ace-solarized-light .ace_meta,\ -.ace-solarized-light .ace_support.ace_class,\ -.ace-solarized-light .ace_support.ace_type {\ -color: #859900\ -}\ -.ace-solarized-light .ace_constant.ace_character,\ -.ace-solarized-light .ace_constant.ace_other {\ -color: #CB4B16\ -}\ -.ace-solarized-light .ace_constant.ace_language {\ -color: #B58900\ -}\ -.ace-solarized-light .ace_constant.ace_numeric {\ -color: #D33682\ -}\ -.ace-solarized-light .ace_fold {\ -background-color: #268BD2;\ -border-color: #586E75\ -}\ -.ace-solarized-light .ace_entity.ace_name.ace_function,\ -.ace-solarized-light .ace_entity.ace_name.ace_tag,\ -.ace-solarized-light .ace_support.ace_function,\ -.ace-solarized-light .ace_variable,\ -.ace-solarized-light .ace_variable.ace_language {\ -color: #268BD2\ -}\ -.ace-solarized-light .ace_storage {\ -color: #073642\ -}\ -.ace-solarized-light .ace_string {\ -color: #2AA198\ -}\ -.ace-solarized-light .ace_string.ace_regexp {\ -color: #D30102\ -}\ -.ace-solarized-light .ace_comment,\ -.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\ -color: #93A1A1\ -}\ -.ace-solarized-light .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/solarized_light",["require","exports","module","ace/theme/solarized_light-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-solarized-light"; +exports.cssText = require("./solarized_light-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/solarized_light"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-sqlserver.js b/app/Resources/ui/js/ace/theme-sqlserver.js index 1b626a28..d5f1e4fc 100644 --- a/app/Resources/ui/js/ace/theme-sqlserver.js +++ b/app/Resources/ui/js/ace/theme-sqlserver.js @@ -1,140 +1,13 @@ -define("ace/theme/sqlserver",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/sqlserver-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-sqlserver .ace_gutter {\n background: #ebebeb;\n color: #333;\n overflow: hidden;\n}\n\n.ace-sqlserver .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-sqlserver {\n background-color: #FFFFFF;\n color: black;\n}\n\n.ace-sqlserver .ace_identifier {\n color: black;\n}\n\n.ace-sqlserver .ace_keyword {\n color: #0000FF;\n}\n\n.ace-sqlserver .ace_numeric {\n color: black;\n}\n\n.ace-sqlserver .ace_storage {\n color: #11B7BE;\n}\n\n.ace-sqlserver .ace_keyword.ace_operator,\n.ace-sqlserver .ace_lparen,\n.ace-sqlserver .ace_rparen,\n.ace-sqlserver .ace_punctuation {\n color: #808080;\n}\n\n.ace-sqlserver .ace_set.ace_statement {\n color: #0000FF;\n text-decoration: underline;\n}\n\n.ace-sqlserver .ace_cursor {\n color: black;\n}\n\n.ace-sqlserver .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-sqlserver .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-sqlserver .ace_constant.ace_language {\n color: #979797;\n}\n\n.ace-sqlserver .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-sqlserver .ace_invalid {\n background-color: rgb(153, 0, 0);\n color: white;\n}\n\n.ace-sqlserver .ace_support.ace_function {\n color: #FF00FF;\n}\n\n.ace-sqlserver .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-sqlserver .ace_class {\n color: #008080;\n}\n\n.ace-sqlserver .ace_support.ace_other {\n color: #6D79DE;\n}\n\n.ace-sqlserver .ace_variable.ace_parameter {\n font-style: italic;\n color: #FD971F;\n}\n\n.ace-sqlserver .ace_comment {\n color: #008000;\n}\n\n.ace-sqlserver .ace_constant.ace_numeric {\n color: black;\n}\n\n.ace-sqlserver .ace_variable {\n color: rgb(49, 132, 149);\n}\n\n.ace-sqlserver .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-sqlserver .ace_support.ace_storedprocedure {\n color: #800000;\n}\n\n.ace-sqlserver .ace_heading {\n color: rgb(12, 7, 255);\n}\n\n.ace-sqlserver .ace_list {\n color: rgb(185, 6, 144);\n}\n\n.ace-sqlserver .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-sqlserver .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-sqlserver .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-sqlserver .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-sqlserver .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.07);\n}\n\n.ace-sqlserver .ace_gutter-active-line {\n background-color: #dcdcdc;\n}\n\n.ace-sqlserver .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-sqlserver .ace_meta.ace_tag {\n color: #0000FF;\n}\n\n.ace-sqlserver .ace_string.ace_regex {\n color: #FF0000;\n}\n\n.ace-sqlserver .ace_string {\n color: #FF0000;\n}\n\n.ace-sqlserver .ace_entity.ace_other.ace_attribute-name {\n color: #994409;\n}\n\n.ace-sqlserver .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-sqlserver .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-sqlserver"; -exports.cssText = ".ace-sqlserver .ace_gutter {\ -background: #ebebeb;\ -color: #333;\ -overflow: hidden;\ -}\ -.ace-sqlserver .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-sqlserver {\ -background-color: #FFFFFF;\ -color: black;\ -}\ -.ace-sqlserver .ace_identifier {\ -color: black;\ -}\ -.ace-sqlserver .ace_keyword {\ -color: #0000FF;\ -}\ -.ace-sqlserver .ace_numeric {\ -color: black;\ -}\ -.ace-sqlserver .ace_storage {\ -color: #11B7BE;\ -}\ -.ace-sqlserver .ace_keyword.ace_operator,\ -.ace-sqlserver .ace_lparen,\ -.ace-sqlserver .ace_rparen,\ -.ace-sqlserver .ace_punctuation {\ -color: #808080;\ -}\ -.ace-sqlserver .ace_set.ace_statement {\ -color: #0000FF;\ -text-decoration: underline;\ -}\ -.ace-sqlserver .ace_cursor {\ -color: black;\ -}\ -.ace-sqlserver .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-sqlserver .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-sqlserver .ace_constant.ace_language {\ -color: #979797;\ -}\ -.ace-sqlserver .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-sqlserver .ace_invalid {\ -background-color: rgb(153, 0, 0);\ -color: white;\ -}\ -.ace-sqlserver .ace_support.ace_function {\ -color: #FF00FF;\ -}\ -.ace-sqlserver .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-sqlserver .ace_class {\ -color: #008080;\ -}\ -.ace-sqlserver .ace_support.ace_other {\ -color: #6D79DE;\ -}\ -.ace-sqlserver .ace_variable.ace_parameter {\ -font-style: italic;\ -color: #FD971F;\ -}\ -.ace-sqlserver .ace_comment {\ -color: #008000;\ -}\ -.ace-sqlserver .ace_constant.ace_numeric {\ -color: black;\ -}\ -.ace-sqlserver .ace_variable {\ -color: rgb(49, 132, 149);\ -}\ -.ace-sqlserver .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-sqlserver .ace_support.ace_storedprocedure {\ -color: #800000;\ -}\ -.ace-sqlserver .ace_heading {\ -color: rgb(12, 7, 255);\ -}\ -.ace-sqlserver .ace_list {\ -color: rgb(185, 6, 144);\ -}\ -.ace-sqlserver .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-sqlserver .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-sqlserver .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-sqlserver .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-sqlserver .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.07);\ -}\ -.ace-sqlserver .ace_gutter-active-line {\ -background-color: #dcdcdc;\ -}\ -.ace-sqlserver .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-sqlserver .ace_meta.ace_tag {\ -color: #0000FF;\ -}\ -.ace-sqlserver .ace_string.ace_regex {\ -color: #FF0000;\ -}\ -.ace-sqlserver .ace_string {\ -color: #FF0000;\ -}\ -.ace-sqlserver .ace_entity.ace_other.ace_attribute-name {\ -color: #994409;\ -}\ -.ace-sqlserver .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}\ -"; +}); +define("ace/theme/sqlserver",["require","exports","module","ace/theme/sqlserver-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-sqlserver"; +exports.cssText = require("./sqlserver-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/sqlserver"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-terminal.js b/app/Resources/ui/js/ace/theme-terminal.js index b10de0bd..1aa6c895 100644 --- a/app/Resources/ui/js/ace/theme-terminal.js +++ b/app/Resources/ui/js/ace/theme-terminal.js @@ -1,116 +1,13 @@ -define("ace/theme/terminal",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/terminal-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-terminal-theme .ace_gutter {\n background: #1a0005;\n color: steelblue\n}\n\n.ace-terminal-theme .ace_print-margin {\n width: 1px;\n background: #1a1a1a\n}\n\n.ace-terminal-theme {\n background-color: black;\n color: #DEDEDE\n}\n\n.ace-terminal-theme .ace_cursor {\n color: #9F9F9F\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_selection {\n background: #424242\n}\n\n.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px black;\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_step {\n background: rgb(0, 0, 0)\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_bracket {\n background: #090;\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_bracket-start {\n background: #090;\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {\n margin: -1px 0 0 -1px;\n border: 1px solid #900\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_active-line {\n background: #2A2A2A\n}\n\n.ace-terminal-theme .ace_gutter-active-line {\n background-color: #2A112A\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_selected-word {\n border: 1px solid #424242\n}\n\n.ace-terminal-theme .ace_invisible {\n color: #343434\n}\n\n.ace-terminal-theme .ace_keyword,\n.ace-terminal-theme .ace_meta,\n.ace-terminal-theme .ace_storage,\n.ace-terminal-theme .ace_storage.ace_type,\n.ace-terminal-theme .ace_support.ace_type {\n color: tomato\n}\n\n.ace-terminal-theme .ace_keyword.ace_operator {\n color: deeppink\n}\n\n.ace-terminal-theme .ace_constant.ace_character,\n.ace-terminal-theme .ace_constant.ace_language,\n.ace-terminal-theme .ace_constant.ace_numeric,\n.ace-terminal-theme .ace_keyword.ace_other.ace_unit,\n.ace-terminal-theme .ace_support.ace_constant,\n.ace-terminal-theme .ace_variable.ace_parameter {\n color: #E78C45\n}\n\n.ace-terminal-theme .ace_constant.ace_other {\n color: gold\n}\n\n.ace-terminal-theme .ace_invalid {\n color: yellow;\n background-color: red\n}\n\n.ace-terminal-theme .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-terminal-theme .ace_fold {\n background-color: #7AA6DA;\n border-color: #DEDEDE\n}\n\n.ace-terminal-theme .ace_entity.ace_name.ace_function,\n.ace-terminal-theme .ace_support.ace_function,\n.ace-terminal-theme .ace_variable {\n color: #7AA6DA\n}\n\n.ace-terminal-theme .ace_support.ace_class,\n.ace-terminal-theme .ace_support.ace_type {\n color: #E7C547\n}\n\n.ace-terminal-theme .ace_heading,\n.ace-terminal-theme .ace_string {\n color: #B9CA4A\n}\n\n.ace-terminal-theme .ace_entity.ace_name.ace_tag,\n.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,\n.ace-terminal-theme .ace_meta.ace_tag,\n.ace-terminal-theme .ace_string.ace_regexp,\n.ace-terminal-theme .ace_variable {\n color: #D54E53\n}\n\n.ace-terminal-theme .ace_comment {\n color: orangered\n}\n\n.ace-terminal-theme .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;\n}\n\n.ace-terminal-theme .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-terminal-theme"; -exports.cssText = ".ace-terminal-theme .ace_gutter {\ -background: #1a0005;\ -color: steelblue\ -}\ -.ace-terminal-theme .ace_print-margin {\ -width: 1px;\ -background: #1a1a1a\ -}\ -.ace-terminal-theme {\ -background-color: black;\ -color: #DEDEDE\ -}\ -.ace-terminal-theme .ace_cursor {\ -color: #9F9F9F\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_selection {\ -background: #424242\ -}\ -.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px black;\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_step {\ -background: rgb(0, 0, 0)\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_bracket {\ -background: #090;\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_bracket-start {\ -background: #090;\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #900\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_active-line {\ -background: #2A2A2A\ -}\ -.ace-terminal-theme .ace_gutter-active-line {\ -background-color: #2A112A\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_selected-word {\ -border: 1px solid #424242\ -}\ -.ace-terminal-theme .ace_invisible {\ -color: #343434\ -}\ -.ace-terminal-theme .ace_keyword,\ -.ace-terminal-theme .ace_meta,\ -.ace-terminal-theme .ace_storage,\ -.ace-terminal-theme .ace_storage.ace_type,\ -.ace-terminal-theme .ace_support.ace_type {\ -color: tomato\ -}\ -.ace-terminal-theme .ace_keyword.ace_operator {\ -color: deeppink\ -}\ -.ace-terminal-theme .ace_constant.ace_character,\ -.ace-terminal-theme .ace_constant.ace_language,\ -.ace-terminal-theme .ace_constant.ace_numeric,\ -.ace-terminal-theme .ace_keyword.ace_other.ace_unit,\ -.ace-terminal-theme .ace_support.ace_constant,\ -.ace-terminal-theme .ace_variable.ace_parameter {\ -color: #E78C45\ -}\ -.ace-terminal-theme .ace_constant.ace_other {\ -color: gold\ -}\ -.ace-terminal-theme .ace_invalid {\ -color: yellow;\ -background-color: red\ -}\ -.ace-terminal-theme .ace_invalid.ace_deprecated {\ -color: #CED2CF;\ -background-color: #B798BF\ -}\ -.ace-terminal-theme .ace_fold {\ -background-color: #7AA6DA;\ -border-color: #DEDEDE\ -}\ -.ace-terminal-theme .ace_entity.ace_name.ace_function,\ -.ace-terminal-theme .ace_support.ace_function,\ -.ace-terminal-theme .ace_variable {\ -color: #7AA6DA\ -}\ -.ace-terminal-theme .ace_support.ace_class,\ -.ace-terminal-theme .ace_support.ace_type {\ -color: #E7C547\ -}\ -.ace-terminal-theme .ace_heading,\ -.ace-terminal-theme .ace_string {\ -color: #B9CA4A\ -}\ -.ace-terminal-theme .ace_entity.ace_name.ace_tag,\ -.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,\ -.ace-terminal-theme .ace_meta.ace_tag,\ -.ace-terminal-theme .ace_string.ace_regexp,\ -.ace-terminal-theme .ace_variable {\ -color: #D54E53\ -}\ -.ace-terminal-theme .ace_comment {\ -color: orangered\ -}\ -.ace-terminal-theme .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;\ -}\ -"; +}); +define("ace/theme/terminal",["require","exports","module","ace/theme/terminal-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-terminal-theme"; +exports.cssText = require("./terminal-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/terminal"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-textmate.js b/app/Resources/ui/js/ace/theme-textmate.js index dc651d74..524b4329 100644 --- a/app/Resources/ui/js/ace/theme-textmate.js +++ b/app/Resources/ui/js/ace/theme-textmate.js @@ -1,132 +1,11 @@ -define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/theme/textmate",["require","exports","module","ace/theme/textmate-css","ace/lib/dom"], function(require, exports, module){"use strict"; exports.isDark = false; exports.cssClass = "ace-tm"; -exports.cssText = ".ace-tm .ace_gutter {\ -background: #f0f0f0;\ -color: #333;\ -}\ -.ace-tm .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-tm .ace_fold {\ -background-color: #6B72E6;\ -}\ -.ace-tm {\ -background-color: #FFFFFF;\ -color: black;\ -}\ -.ace-tm .ace_cursor {\ -color: black;\ -}\ -.ace-tm .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-tm .ace_storage,\ -.ace-tm .ace_keyword {\ -color: blue;\ -}\ -.ace-tm .ace_constant {\ -color: rgb(197, 6, 11);\ -}\ -.ace-tm .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-tm .ace_constant.ace_language {\ -color: rgb(88, 92, 246);\ -}\ -.ace-tm .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-tm .ace_invalid {\ -background-color: rgba(255, 0, 0, 0.1);\ -color: red;\ -}\ -.ace-tm .ace_support.ace_function {\ -color: rgb(60, 76, 114);\ -}\ -.ace-tm .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-tm .ace_support.ace_type,\ -.ace-tm .ace_support.ace_class {\ -color: rgb(109, 121, 222);\ -}\ -.ace-tm .ace_keyword.ace_operator {\ -color: rgb(104, 118, 135);\ -}\ -.ace-tm .ace_string {\ -color: rgb(3, 106, 7);\ -}\ -.ace-tm .ace_comment {\ -color: rgb(76, 136, 107);\ -}\ -.ace-tm .ace_comment.ace_doc {\ -color: rgb(0, 102, 255);\ -}\ -.ace-tm .ace_comment.ace_doc.ace_tag {\ -color: rgb(128, 159, 191);\ -}\ -.ace-tm .ace_constant.ace_numeric {\ -color: rgb(0, 0, 205);\ -}\ -.ace-tm .ace_variable {\ -color: rgb(49, 132, 149);\ -}\ -.ace-tm .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-tm .ace_entity.ace_name.ace_function {\ -color: #0000A2;\ -}\ -.ace-tm .ace_heading {\ -color: rgb(12, 7, 255);\ -}\ -.ace-tm .ace_list {\ -color:rgb(185, 6, 144);\ -}\ -.ace-tm .ace_meta.ace_tag {\ -color:rgb(0, 22, 142);\ -}\ -.ace-tm .ace_string.ace_regex {\ -color: rgb(255, 0, 0)\ -}\ -.ace-tm .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-tm.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px white;\ -}\ -.ace-tm .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-tm .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-tm .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-tm .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.07);\ -}\ -.ace-tm .ace_gutter-active-line {\ -background-color : #dcdcdc;\ -}\ -.ace-tm .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-tm .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}\ -"; +exports.cssText = require("./textmate-css"); exports.$id = "ace/theme/textmate"; - var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/textmate"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-tomorrow.js b/app/Resources/ui/js/ace/theme-tomorrow.js index b1f73da8..d0d1b80a 100644 --- a/app/Resources/ui/js/ace/theme-tomorrow.js +++ b/app/Resources/ui/js/ace/theme-tomorrow.js @@ -1,110 +1,13 @@ -define("ace/theme/tomorrow",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/tomorrow-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tomorrow .ace_gutter {\n background: #f6f6f6;\n color: #4D4D4C\n}\n\n.ace-tomorrow .ace_print-margin {\n width: 1px;\n background: #f6f6f6\n}\n\n.ace-tomorrow {\n background-color: #FFFFFF;\n color: #4D4D4C\n}\n\n.ace-tomorrow .ace_cursor {\n color: #AEAFAD\n}\n\n.ace-tomorrow .ace_marker-layer .ace_selection {\n background: #D6D6D6\n}\n\n.ace-tomorrow.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-tomorrow .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-tomorrow .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #D1D1D1\n}\n\n.ace-tomorrow .ace_marker-layer .ace_active-line {\n background: #EFEFEF\n}\n\n.ace-tomorrow .ace_gutter-active-line {\n background-color : #dcdcdc\n}\n\n.ace-tomorrow .ace_marker-layer .ace_selected-word {\n border: 1px solid #D6D6D6\n}\n\n.ace-tomorrow .ace_invisible {\n color: #D1D1D1\n}\n\n.ace-tomorrow .ace_keyword,\n.ace-tomorrow .ace_meta,\n.ace-tomorrow .ace_storage,\n.ace-tomorrow .ace_storage.ace_type,\n.ace-tomorrow .ace_support.ace_type {\n color: #8959A8\n}\n\n.ace-tomorrow .ace_keyword.ace_operator {\n color: #3E999F\n}\n\n.ace-tomorrow .ace_constant.ace_character,\n.ace-tomorrow .ace_constant.ace_language,\n.ace-tomorrow .ace_constant.ace_numeric,\n.ace-tomorrow .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow .ace_support.ace_constant,\n.ace-tomorrow .ace_variable.ace_parameter {\n color: #F5871F\n}\n\n.ace-tomorrow .ace_constant.ace_other {\n color: #666969\n}\n\n.ace-tomorrow .ace_invalid {\n color: #FFFFFF;\n background-color: #C82829\n}\n\n.ace-tomorrow .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #8959A8\n}\n\n.ace-tomorrow .ace_fold {\n background-color: #4271AE;\n border-color: #4D4D4C\n}\n\n.ace-tomorrow .ace_entity.ace_name.ace_function,\n.ace-tomorrow .ace_support.ace_function,\n.ace-tomorrow .ace_variable {\n color: #4271AE\n}\n\n.ace-tomorrow .ace_support.ace_class,\n.ace-tomorrow .ace_support.ace_type {\n color: #C99E00\n}\n\n.ace-tomorrow .ace_heading,\n.ace-tomorrow .ace_markup.ace_heading,\n.ace-tomorrow .ace_string {\n color: #718C00\n}\n\n.ace-tomorrow .ace_entity.ace_name.ace_tag,\n.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow .ace_meta.ace_tag,\n.ace-tomorrow .ace_string.ace_regexp,\n.ace-tomorrow .ace_variable {\n color: #C82829\n}\n\n.ace-tomorrow .ace_comment {\n color: #8E908C\n}\n\n.ace-tomorrow .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\n}\n\n.ace-tomorrow .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-tomorrow"; -exports.cssText = ".ace-tomorrow .ace_gutter {\ -background: #f6f6f6;\ -color: #4D4D4C\ -}\ -.ace-tomorrow .ace_print-margin {\ -width: 1px;\ -background: #f6f6f6\ -}\ -.ace-tomorrow {\ -background-color: #FFFFFF;\ -color: #4D4D4C\ -}\ -.ace-tomorrow .ace_cursor {\ -color: #AEAFAD\ -}\ -.ace-tomorrow .ace_marker-layer .ace_selection {\ -background: #D6D6D6\ -}\ -.ace-tomorrow.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #FFFFFF;\ -}\ -.ace-tomorrow .ace_marker-layer .ace_step {\ -background: rgb(255, 255, 0)\ -}\ -.ace-tomorrow .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #D1D1D1\ -}\ -.ace-tomorrow .ace_marker-layer .ace_active-line {\ -background: #EFEFEF\ -}\ -.ace-tomorrow .ace_gutter-active-line {\ -background-color : #dcdcdc\ -}\ -.ace-tomorrow .ace_marker-layer .ace_selected-word {\ -border: 1px solid #D6D6D6\ -}\ -.ace-tomorrow .ace_invisible {\ -color: #D1D1D1\ -}\ -.ace-tomorrow .ace_keyword,\ -.ace-tomorrow .ace_meta,\ -.ace-tomorrow .ace_storage,\ -.ace-tomorrow .ace_storage.ace_type,\ -.ace-tomorrow .ace_support.ace_type {\ -color: #8959A8\ -}\ -.ace-tomorrow .ace_keyword.ace_operator {\ -color: #3E999F\ -}\ -.ace-tomorrow .ace_constant.ace_character,\ -.ace-tomorrow .ace_constant.ace_language,\ -.ace-tomorrow .ace_constant.ace_numeric,\ -.ace-tomorrow .ace_keyword.ace_other.ace_unit,\ -.ace-tomorrow .ace_support.ace_constant,\ -.ace-tomorrow .ace_variable.ace_parameter {\ -color: #F5871F\ -}\ -.ace-tomorrow .ace_constant.ace_other {\ -color: #666969\ -}\ -.ace-tomorrow .ace_invalid {\ -color: #FFFFFF;\ -background-color: #C82829\ -}\ -.ace-tomorrow .ace_invalid.ace_deprecated {\ -color: #FFFFFF;\ -background-color: #8959A8\ -}\ -.ace-tomorrow .ace_fold {\ -background-color: #4271AE;\ -border-color: #4D4D4C\ -}\ -.ace-tomorrow .ace_entity.ace_name.ace_function,\ -.ace-tomorrow .ace_support.ace_function,\ -.ace-tomorrow .ace_variable {\ -color: #4271AE\ -}\ -.ace-tomorrow .ace_support.ace_class,\ -.ace-tomorrow .ace_support.ace_type {\ -color: #C99E00\ -}\ -.ace-tomorrow .ace_heading,\ -.ace-tomorrow .ace_markup.ace_heading,\ -.ace-tomorrow .ace_string {\ -color: #718C00\ -}\ -.ace-tomorrow .ace_entity.ace_name.ace_tag,\ -.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\ -.ace-tomorrow .ace_meta.ace_tag,\ -.ace-tomorrow .ace_string.ace_regexp,\ -.ace-tomorrow .ace_variable {\ -color: #C82829\ -}\ -.ace-tomorrow .ace_comment {\ -color: #8E908C\ -}\ -.ace-tomorrow .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\ -}"; +}); +define("ace/theme/tomorrow",["require","exports","module","ace/theme/tomorrow-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-tomorrow"; +exports.cssText = require("./tomorrow-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/tomorrow"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-tomorrow_night.js b/app/Resources/ui/js/ace/theme-tomorrow_night.js index 36c748fd..79844040 100644 --- a/app/Resources/ui/js/ace/theme-tomorrow_night.js +++ b/app/Resources/ui/js/ace/theme-tomorrow_night.js @@ -1,110 +1,13 @@ -define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/tomorrow_night-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tomorrow-night .ace_gutter {\n background: #25282c;\n color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_print-margin {\n width: 1px;\n background: #25282c\n}\n\n.ace-tomorrow-night {\n background-color: #1D1F21;\n color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_cursor {\n color: #AEAFAD\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_selection {\n background: #373B41\n}\n\n.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1D1F21;\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #4B4E55\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_active-line {\n background: #282A2E\n}\n\n.ace-tomorrow-night .ace_gutter-active-line {\n background-color: #282A2E\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_selected-word {\n border: 1px solid #373B41\n}\n\n.ace-tomorrow-night .ace_invisible {\n color: #4B4E55\n}\n\n.ace-tomorrow-night .ace_keyword,\n.ace-tomorrow-night .ace_meta,\n.ace-tomorrow-night .ace_storage,\n.ace-tomorrow-night .ace_storage.ace_type,\n.ace-tomorrow-night .ace_support.ace_type {\n color: #B294BB\n}\n\n.ace-tomorrow-night .ace_keyword.ace_operator {\n color: #8ABEB7\n}\n\n.ace-tomorrow-night .ace_constant.ace_character,\n.ace-tomorrow-night .ace_constant.ace_language,\n.ace-tomorrow-night .ace_constant.ace_numeric,\n.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night .ace_support.ace_constant,\n.ace-tomorrow-night .ace_variable.ace_parameter {\n color: #DE935F\n}\n\n.ace-tomorrow-night .ace_constant.ace_other {\n color: #CED1CF\n}\n\n.ace-tomorrow-night .ace_invalid {\n color: #CED2CF;\n background-color: #DF5F5F\n}\n\n.ace-tomorrow-night .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-tomorrow-night .ace_fold {\n background-color: #81A2BE;\n border-color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night .ace_support.ace_function,\n.ace-tomorrow-night .ace_variable {\n color: #81A2BE\n}\n\n.ace-tomorrow-night .ace_support.ace_class,\n.ace-tomorrow-night .ace_support.ace_type {\n color: #F0C674\n}\n\n.ace-tomorrow-night .ace_heading,\n.ace-tomorrow-night .ace_markup.ace_heading,\n.ace-tomorrow-night .ace_string {\n color: #B5BD68\n}\n\n.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night .ace_meta.ace_tag,\n.ace-tomorrow-night .ace_string.ace_regexp,\n.ace-tomorrow-night .ace_variable {\n color: #CC6666\n}\n\n.ace-tomorrow-night .ace_comment {\n color: #969896\n}\n\n.ace-tomorrow-night .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-tomorrow-night"; -exports.cssText = ".ace-tomorrow-night .ace_gutter {\ -background: #25282c;\ -color: #C5C8C6\ -}\ -.ace-tomorrow-night .ace_print-margin {\ -width: 1px;\ -background: #25282c\ -}\ -.ace-tomorrow-night {\ -background-color: #1D1F21;\ -color: #C5C8C6\ -}\ -.ace-tomorrow-night .ace_cursor {\ -color: #AEAFAD\ -}\ -.ace-tomorrow-night .ace_marker-layer .ace_selection {\ -background: #373B41\ -}\ -.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #1D1F21;\ -}\ -.ace-tomorrow-night .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-tomorrow-night .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #4B4E55\ -}\ -.ace-tomorrow-night .ace_marker-layer .ace_active-line {\ -background: #282A2E\ -}\ -.ace-tomorrow-night .ace_gutter-active-line {\ -background-color: #282A2E\ -}\ -.ace-tomorrow-night .ace_marker-layer .ace_selected-word {\ -border: 1px solid #373B41\ -}\ -.ace-tomorrow-night .ace_invisible {\ -color: #4B4E55\ -}\ -.ace-tomorrow-night .ace_keyword,\ -.ace-tomorrow-night .ace_meta,\ -.ace-tomorrow-night .ace_storage,\ -.ace-tomorrow-night .ace_storage.ace_type,\ -.ace-tomorrow-night .ace_support.ace_type {\ -color: #B294BB\ -}\ -.ace-tomorrow-night .ace_keyword.ace_operator {\ -color: #8ABEB7\ -}\ -.ace-tomorrow-night .ace_constant.ace_character,\ -.ace-tomorrow-night .ace_constant.ace_language,\ -.ace-tomorrow-night .ace_constant.ace_numeric,\ -.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\ -.ace-tomorrow-night .ace_support.ace_constant,\ -.ace-tomorrow-night .ace_variable.ace_parameter {\ -color: #DE935F\ -}\ -.ace-tomorrow-night .ace_constant.ace_other {\ -color: #CED1CF\ -}\ -.ace-tomorrow-night .ace_invalid {\ -color: #CED2CF;\ -background-color: #DF5F5F\ -}\ -.ace-tomorrow-night .ace_invalid.ace_deprecated {\ -color: #CED2CF;\ -background-color: #B798BF\ -}\ -.ace-tomorrow-night .ace_fold {\ -background-color: #81A2BE;\ -border-color: #C5C8C6\ -}\ -.ace-tomorrow-night .ace_entity.ace_name.ace_function,\ -.ace-tomorrow-night .ace_support.ace_function,\ -.ace-tomorrow-night .ace_variable {\ -color: #81A2BE\ -}\ -.ace-tomorrow-night .ace_support.ace_class,\ -.ace-tomorrow-night .ace_support.ace_type {\ -color: #F0C674\ -}\ -.ace-tomorrow-night .ace_heading,\ -.ace-tomorrow-night .ace_markup.ace_heading,\ -.ace-tomorrow-night .ace_string {\ -color: #B5BD68\ -}\ -.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\ -.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\ -.ace-tomorrow-night .ace_meta.ace_tag,\ -.ace-tomorrow-night .ace_string.ace_regexp,\ -.ace-tomorrow-night .ace_variable {\ -color: #CC6666\ -}\ -.ace-tomorrow-night .ace_comment {\ -color: #969896\ -}\ -.ace-tomorrow-night .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/tomorrow_night",["require","exports","module","ace/theme/tomorrow_night-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-tomorrow-night"; +exports.cssText = require("./tomorrow_night-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/tomorrow_night"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-tomorrow_night_blue.js b/app/Resources/ui/js/ace/theme-tomorrow_night_blue.js index 7bf7fc64..dd466962 100644 --- a/app/Resources/ui/js/ace/theme-tomorrow_night_blue.js +++ b/app/Resources/ui/js/ace/theme-tomorrow_night_blue.js @@ -1,108 +1,13 @@ -define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/tomorrow_night_blue-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tomorrow-night-blue .ace_gutter {\n background: #00204b;\n color: #7388b5\n}\n\n.ace-tomorrow-night-blue .ace_print-margin {\n width: 1px;\n background: #00204b\n}\n\n.ace-tomorrow-night-blue {\n background-color: #002451;\n color: #FFFFFF\n}\n\n.ace-tomorrow-night-blue .ace_constant.ace_other,\n.ace-tomorrow-night-blue .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\n background: #003F8E\n}\n\n.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002451;\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\n background: rgb(127, 111, 19)\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404F7D\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {\n background: #00346E\n}\n\n.ace-tomorrow-night-blue .ace_gutter-active-line {\n background-color: #022040\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {\n border: 1px solid #003F8E\n}\n\n.ace-tomorrow-night-blue .ace_invisible {\n color: #404F7D\n}\n\n.ace-tomorrow-night-blue .ace_keyword,\n.ace-tomorrow-night-blue .ace_meta,\n.ace-tomorrow-night-blue .ace_storage,\n.ace-tomorrow-night-blue .ace_storage.ace_type,\n.ace-tomorrow-night-blue .ace_support.ace_type {\n color: #EBBBFF\n}\n\n.ace-tomorrow-night-blue .ace_keyword.ace_operator {\n color: #99FFFF\n}\n\n.ace-tomorrow-night-blue .ace_constant.ace_character,\n.ace-tomorrow-night-blue .ace_constant.ace_language,\n.ace-tomorrow-night-blue .ace_constant.ace_numeric,\n.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night-blue .ace_support.ace_constant,\n.ace-tomorrow-night-blue .ace_variable.ace_parameter {\n color: #FFC58F\n}\n\n.ace-tomorrow-night-blue .ace_invalid {\n color: #FFFFFF;\n background-color: #F99DA5\n}\n\n.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #EBBBFF\n}\n\n.ace-tomorrow-night-blue .ace_fold {\n background-color: #BBDAFF;\n border-color: #FFFFFF\n}\n\n.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night-blue .ace_support.ace_function,\n.ace-tomorrow-night-blue .ace_variable {\n color: #BBDAFF\n}\n\n.ace-tomorrow-night-blue .ace_support.ace_class,\n.ace-tomorrow-night-blue .ace_support.ace_type {\n color: #FFEEAD\n}\n\n.ace-tomorrow-night-blue .ace_heading,\n.ace-tomorrow-night-blue .ace_markup.ace_heading,\n.ace-tomorrow-night-blue .ace_string {\n color: #D1F1A9\n}\n\n.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night-blue .ace_meta.ace_tag,\n.ace-tomorrow-night-blue .ace_string.ace_regexp,\n.ace-tomorrow-night-blue .ace_variable {\n color: #FF9DA4\n}\n\n.ace-tomorrow-night-blue .ace_comment {\n color: #7285B7\n}\n\n.ace-tomorrow-night-blue .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night-blue .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-tomorrow-night-blue"; -exports.cssText = ".ace-tomorrow-night-blue .ace_gutter {\ -background: #00204b;\ -color: #7388b5\ -}\ -.ace-tomorrow-night-blue .ace_print-margin {\ -width: 1px;\ -background: #00204b\ -}\ -.ace-tomorrow-night-blue {\ -background-color: #002451;\ -color: #FFFFFF\ -}\ -.ace-tomorrow-night-blue .ace_constant.ace_other,\ -.ace-tomorrow-night-blue .ace_cursor {\ -color: #FFFFFF\ -}\ -.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\ -background: #003F8E\ -}\ -.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #002451;\ -}\ -.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\ -background: rgb(127, 111, 19)\ -}\ -.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #404F7D\ -}\ -.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {\ -background: #00346E\ -}\ -.ace-tomorrow-night-blue .ace_gutter-active-line {\ -background-color: #022040\ -}\ -.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {\ -border: 1px solid #003F8E\ -}\ -.ace-tomorrow-night-blue .ace_invisible {\ -color: #404F7D\ -}\ -.ace-tomorrow-night-blue .ace_keyword,\ -.ace-tomorrow-night-blue .ace_meta,\ -.ace-tomorrow-night-blue .ace_storage,\ -.ace-tomorrow-night-blue .ace_storage.ace_type,\ -.ace-tomorrow-night-blue .ace_support.ace_type {\ -color: #EBBBFF\ -}\ -.ace-tomorrow-night-blue .ace_keyword.ace_operator {\ -color: #99FFFF\ -}\ -.ace-tomorrow-night-blue .ace_constant.ace_character,\ -.ace-tomorrow-night-blue .ace_constant.ace_language,\ -.ace-tomorrow-night-blue .ace_constant.ace_numeric,\ -.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,\ -.ace-tomorrow-night-blue .ace_support.ace_constant,\ -.ace-tomorrow-night-blue .ace_variable.ace_parameter {\ -color: #FFC58F\ -}\ -.ace-tomorrow-night-blue .ace_invalid {\ -color: #FFFFFF;\ -background-color: #F99DA5\ -}\ -.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {\ -color: #FFFFFF;\ -background-color: #EBBBFF\ -}\ -.ace-tomorrow-night-blue .ace_fold {\ -background-color: #BBDAFF;\ -border-color: #FFFFFF\ -}\ -.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,\ -.ace-tomorrow-night-blue .ace_support.ace_function,\ -.ace-tomorrow-night-blue .ace_variable {\ -color: #BBDAFF\ -}\ -.ace-tomorrow-night-blue .ace_support.ace_class,\ -.ace-tomorrow-night-blue .ace_support.ace_type {\ -color: #FFEEAD\ -}\ -.ace-tomorrow-night-blue .ace_heading,\ -.ace-tomorrow-night-blue .ace_markup.ace_heading,\ -.ace-tomorrow-night-blue .ace_string {\ -color: #D1F1A9\ -}\ -.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,\ -.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,\ -.ace-tomorrow-night-blue .ace_meta.ace_tag,\ -.ace-tomorrow-night-blue .ace_string.ace_regexp,\ -.ace-tomorrow-night-blue .ace_variable {\ -color: #FF9DA4\ -}\ -.ace-tomorrow-night-blue .ace_comment {\ -color: #7285B7\ -}\ -.ace-tomorrow-night-blue .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/theme/tomorrow_night_blue-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-blue"; +exports.cssText = require("./tomorrow_night_blue-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/tomorrow_night_blue"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-tomorrow_night_bright.js b/app/Resources/ui/js/ace/theme-tomorrow_night_bright.js index 3bf12ddd..1ce857a3 100644 --- a/app/Resources/ui/js/ace/theme-tomorrow_night_bright.js +++ b/app/Resources/ui/js/ace/theme-tomorrow_night_bright.js @@ -1,123 +1,13 @@ -define("ace/theme/tomorrow_night_bright",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/tomorrow_night_bright-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tomorrow-night-bright .ace_gutter {\n background: #1a1a1a;\n color: #DEDEDE\n}\n\n.ace-tomorrow-night-bright .ace_print-margin {\n width: 1px;\n background: #1a1a1a\n}\n\n.ace-tomorrow-night-bright {\n background-color: #000000;\n color: #DEDEDE\n}\n\n.ace-tomorrow-night-bright .ace_cursor {\n color: #9F9F9F\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {\n background: #424242\n}\n\n.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #000000;\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #888888\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {\n border: 1px solid rgb(110, 119, 0);\n border-bottom: 0;\n box-shadow: inset 0 -1px rgb(110, 119, 0);\n margin: -1px 0 0 -1px;\n background: rgba(255, 235, 0, 0.1)\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {\n background: #2A2A2A\n}\n\n.ace-tomorrow-night-bright .ace_gutter-active-line {\n background-color: #2A2A2A\n}\n\n.ace-tomorrow-night-bright .ace_stack {\n background-color: rgb(66, 90, 44)\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {\n border: 1px solid #888888\n}\n\n.ace-tomorrow-night-bright .ace_invisible {\n color: #343434\n}\n\n.ace-tomorrow-night-bright .ace_keyword,\n.ace-tomorrow-night-bright .ace_meta,\n.ace-tomorrow-night-bright .ace_storage,\n.ace-tomorrow-night-bright .ace_storage.ace_type,\n.ace-tomorrow-night-bright .ace_support.ace_type {\n color: #C397D8\n}\n\n.ace-tomorrow-night-bright .ace_keyword.ace_operator {\n color: #70C0B1\n}\n\n.ace-tomorrow-night-bright .ace_constant.ace_character,\n.ace-tomorrow-night-bright .ace_constant.ace_language,\n.ace-tomorrow-night-bright .ace_constant.ace_numeric,\n.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night-bright .ace_support.ace_constant,\n.ace-tomorrow-night-bright .ace_variable.ace_parameter {\n color: #E78C45\n}\n\n.ace-tomorrow-night-bright .ace_constant.ace_other {\n color: #EEEEEE\n}\n\n.ace-tomorrow-night-bright .ace_invalid {\n color: #CED2CF;\n background-color: #DF5F5F\n}\n\n.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-tomorrow-night-bright .ace_fold {\n background-color: #7AA6DA;\n border-color: #DEDEDE\n}\n\n.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night-bright .ace_support.ace_function,\n.ace-tomorrow-night-bright .ace_variable {\n color: #7AA6DA\n}\n\n.ace-tomorrow-night-bright .ace_support.ace_class,\n.ace-tomorrow-night-bright .ace_support.ace_type {\n color: #E7C547\n}\n\n.ace-tomorrow-night-bright .ace_heading,\n.ace-tomorrow-night-bright .ace_markup.ace_heading,\n.ace-tomorrow-night-bright .ace_string {\n color: #B9CA4A\n}\n\n.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night-bright .ace_meta.ace_tag,\n.ace-tomorrow-night-bright .ace_string.ace_regexp,\n.ace-tomorrow-night-bright .ace_variable {\n color: #D54E53\n}\n\n.ace-tomorrow-night-bright .ace_comment {\n color: #969896\n}\n\n.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {\n color: #C2C280\n}\n\n.ace-tomorrow-night-bright .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night-bright .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-tomorrow-night-bright"; -exports.cssText = ".ace-tomorrow-night-bright .ace_gutter {\ -background: #1a1a1a;\ -color: #DEDEDE\ -}\ -.ace-tomorrow-night-bright .ace_print-margin {\ -width: 1px;\ -background: #1a1a1a\ -}\ -.ace-tomorrow-night-bright {\ -background-color: #000000;\ -color: #DEDEDE\ -}\ -.ace-tomorrow-night-bright .ace_cursor {\ -color: #9F9F9F\ -}\ -.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {\ -background: #424242\ -}\ -.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #000000;\ -}\ -.ace-tomorrow-night-bright .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #888888\ -}\ -.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {\ -border: 1px solid rgb(110, 119, 0);\ -border-bottom: 0;\ -box-shadow: inset 0 -1px rgb(110, 119, 0);\ -margin: -1px 0 0 -1px;\ -background: rgba(255, 235, 0, 0.1)\ -}\ -.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {\ -background: #2A2A2A\ -}\ -.ace-tomorrow-night-bright .ace_gutter-active-line {\ -background-color: #2A2A2A\ -}\ -.ace-tomorrow-night-bright .ace_stack {\ -background-color: rgb(66, 90, 44)\ -}\ -.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {\ -border: 1px solid #888888\ -}\ -.ace-tomorrow-night-bright .ace_invisible {\ -color: #343434\ -}\ -.ace-tomorrow-night-bright .ace_keyword,\ -.ace-tomorrow-night-bright .ace_meta,\ -.ace-tomorrow-night-bright .ace_storage,\ -.ace-tomorrow-night-bright .ace_storage.ace_type,\ -.ace-tomorrow-night-bright .ace_support.ace_type {\ -color: #C397D8\ -}\ -.ace-tomorrow-night-bright .ace_keyword.ace_operator {\ -color: #70C0B1\ -}\ -.ace-tomorrow-night-bright .ace_constant.ace_character,\ -.ace-tomorrow-night-bright .ace_constant.ace_language,\ -.ace-tomorrow-night-bright .ace_constant.ace_numeric,\ -.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,\ -.ace-tomorrow-night-bright .ace_support.ace_constant,\ -.ace-tomorrow-night-bright .ace_variable.ace_parameter {\ -color: #E78C45\ -}\ -.ace-tomorrow-night-bright .ace_constant.ace_other {\ -color: #EEEEEE\ -}\ -.ace-tomorrow-night-bright .ace_invalid {\ -color: #CED2CF;\ -background-color: #DF5F5F\ -}\ -.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {\ -color: #CED2CF;\ -background-color: #B798BF\ -}\ -.ace-tomorrow-night-bright .ace_fold {\ -background-color: #7AA6DA;\ -border-color: #DEDEDE\ -}\ -.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,\ -.ace-tomorrow-night-bright .ace_support.ace_function,\ -.ace-tomorrow-night-bright .ace_variable {\ -color: #7AA6DA\ -}\ -.ace-tomorrow-night-bright .ace_support.ace_class,\ -.ace-tomorrow-night-bright .ace_support.ace_type {\ -color: #E7C547\ -}\ -.ace-tomorrow-night-bright .ace_heading,\ -.ace-tomorrow-night-bright .ace_markup.ace_heading,\ -.ace-tomorrow-night-bright .ace_string {\ -color: #B9CA4A\ -}\ -.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,\ -.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,\ -.ace-tomorrow-night-bright .ace_meta.ace_tag,\ -.ace-tomorrow-night-bright .ace_string.ace_regexp,\ -.ace-tomorrow-night-bright .ace_variable {\ -color: #D54E53\ -}\ -.ace-tomorrow-night-bright .ace_comment {\ -color: #969896\ -}\ -.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {\ -color: #C2C280\ -}\ -.ace-tomorrow-night-bright .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/tomorrow_night_bright",["require","exports","module","ace/theme/tomorrow_night_bright-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-bright"; +exports.cssText = require("./tomorrow_night_bright-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/tomorrow_night_bright"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-tomorrow_night_eighties.js b/app/Resources/ui/js/ace/theme-tomorrow_night_eighties.js index e5c48fca..8fb11929 100644 --- a/app/Resources/ui/js/ace/theme-tomorrow_night_eighties.js +++ b/app/Resources/ui/js/ace/theme-tomorrow_night_eighties.js @@ -1,110 +1,13 @@ -define("ace/theme/tomorrow_night_eighties",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/tomorrow_night_eighties-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tomorrow-night-eighties .ace_gutter {\n background: #272727;\n color: #CCC\n}\n\n.ace-tomorrow-night-eighties .ace_print-margin {\n width: 1px;\n background: #272727\n}\n\n.ace-tomorrow-night-eighties {\n background-color: #2D2D2D;\n color: #CCCCCC\n}\n\n.ace-tomorrow-night-eighties .ace_constant.ace_other,\n.ace-tomorrow-night-eighties .ace_cursor {\n color: #CCCCCC\n}\n\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {\n background: #515151\n}\n\n.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #2D2D2D;\n}\n\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #6A6A6A\n}\n\n.ace-tomorrow-night-bright .ace_stack {\n background: rgb(66, 90, 44)\n}\n\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {\n background: #393939\n}\n\n.ace-tomorrow-night-eighties .ace_gutter-active-line {\n background-color: #393939\n}\n\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {\n border: 1px solid #515151\n}\n\n.ace-tomorrow-night-eighties .ace_invisible {\n color: #6A6A6A\n}\n\n.ace-tomorrow-night-eighties .ace_keyword,\n.ace-tomorrow-night-eighties .ace_meta,\n.ace-tomorrow-night-eighties .ace_storage,\n.ace-tomorrow-night-eighties .ace_storage.ace_type,\n.ace-tomorrow-night-eighties .ace_support.ace_type {\n color: #CC99CC\n}\n\n.ace-tomorrow-night-eighties .ace_keyword.ace_operator {\n color: #66CCCC\n}\n\n.ace-tomorrow-night-eighties .ace_constant.ace_character,\n.ace-tomorrow-night-eighties .ace_constant.ace_language,\n.ace-tomorrow-night-eighties .ace_constant.ace_numeric,\n.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night-eighties .ace_support.ace_constant,\n.ace-tomorrow-night-eighties .ace_variable.ace_parameter {\n color: #F99157\n}\n\n.ace-tomorrow-night-eighties .ace_invalid {\n color: #CDCDCD;\n background-color: #F2777A\n}\n\n.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {\n color: #CDCDCD;\n background-color: #CC99CC\n}\n\n.ace-tomorrow-night-eighties .ace_fold {\n background-color: #6699CC;\n border-color: #CCCCCC\n}\n\n.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night-eighties .ace_support.ace_function,\n.ace-tomorrow-night-eighties .ace_variable {\n color: #6699CC\n}\n\n.ace-tomorrow-night-eighties .ace_support.ace_class,\n.ace-tomorrow-night-eighties .ace_support.ace_type {\n color: #FFCC66\n}\n\n.ace-tomorrow-night-eighties .ace_heading,\n.ace-tomorrow-night-eighties .ace_markup.ace_heading,\n.ace-tomorrow-night-eighties .ace_string {\n color: #99CC99\n}\n\n.ace-tomorrow-night-eighties .ace_comment {\n color: #999999\n}\n\n.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night-eighties .ace_meta.ace_tag,\n.ace-tomorrow-night-eighties .ace_variable {\n color: #F2777A\n}\n\n.ace-tomorrow-night-eighties .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night-eighties .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-tomorrow-night-eighties"; -exports.cssText = ".ace-tomorrow-night-eighties .ace_gutter {\ -background: #272727;\ -color: #CCC\ -}\ -.ace-tomorrow-night-eighties .ace_print-margin {\ -width: 1px;\ -background: #272727\ -}\ -.ace-tomorrow-night-eighties {\ -background-color: #2D2D2D;\ -color: #CCCCCC\ -}\ -.ace-tomorrow-night-eighties .ace_constant.ace_other,\ -.ace-tomorrow-night-eighties .ace_cursor {\ -color: #CCCCCC\ -}\ -.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {\ -background: #515151\ -}\ -.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #2D2D2D;\ -}\ -.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #6A6A6A\ -}\ -.ace-tomorrow-night-bright .ace_stack {\ -background: rgb(66, 90, 44)\ -}\ -.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {\ -background: #393939\ -}\ -.ace-tomorrow-night-eighties .ace_gutter-active-line {\ -background-color: #393939\ -}\ -.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {\ -border: 1px solid #515151\ -}\ -.ace-tomorrow-night-eighties .ace_invisible {\ -color: #6A6A6A\ -}\ -.ace-tomorrow-night-eighties .ace_keyword,\ -.ace-tomorrow-night-eighties .ace_meta,\ -.ace-tomorrow-night-eighties .ace_storage,\ -.ace-tomorrow-night-eighties .ace_storage.ace_type,\ -.ace-tomorrow-night-eighties .ace_support.ace_type {\ -color: #CC99CC\ -}\ -.ace-tomorrow-night-eighties .ace_keyword.ace_operator {\ -color: #66CCCC\ -}\ -.ace-tomorrow-night-eighties .ace_constant.ace_character,\ -.ace-tomorrow-night-eighties .ace_constant.ace_language,\ -.ace-tomorrow-night-eighties .ace_constant.ace_numeric,\ -.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,\ -.ace-tomorrow-night-eighties .ace_support.ace_constant,\ -.ace-tomorrow-night-eighties .ace_variable.ace_parameter {\ -color: #F99157\ -}\ -.ace-tomorrow-night-eighties .ace_invalid {\ -color: #CDCDCD;\ -background-color: #F2777A\ -}\ -.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {\ -color: #CDCDCD;\ -background-color: #CC99CC\ -}\ -.ace-tomorrow-night-eighties .ace_fold {\ -background-color: #6699CC;\ -border-color: #CCCCCC\ -}\ -.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,\ -.ace-tomorrow-night-eighties .ace_support.ace_function,\ -.ace-tomorrow-night-eighties .ace_variable {\ -color: #6699CC\ -}\ -.ace-tomorrow-night-eighties .ace_support.ace_class,\ -.ace-tomorrow-night-eighties .ace_support.ace_type {\ -color: #FFCC66\ -}\ -.ace-tomorrow-night-eighties .ace_heading,\ -.ace-tomorrow-night-eighties .ace_markup.ace_heading,\ -.ace-tomorrow-night-eighties .ace_string {\ -color: #99CC99\ -}\ -.ace-tomorrow-night-eighties .ace_comment {\ -color: #999999\ -}\ -.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,\ -.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,\ -.ace-tomorrow-night-eighties .ace_meta.ace_tag,\ -.ace-tomorrow-night-eighties .ace_variable {\ -color: #F2777A\ -}\ -.ace-tomorrow-night-eighties .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/tomorrow_night_eighties",["require","exports","module","ace/theme/tomorrow_night_eighties-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-eighties"; +exports.cssText = require("./tomorrow_night_eighties-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/tomorrow_night_eighties"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-twilight.js b/app/Resources/ui/js/ace/theme-twilight.js index 03e9d07d..86f18369 100644 --- a/app/Resources/ui/js/ace/theme-twilight.js +++ b/app/Resources/ui/js/ace/theme-twilight.js @@ -1,111 +1,13 @@ -define("ace/theme/twilight",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/twilight-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-twilight .ace_gutter {\n background: #232323;\n color: #E2E2E2\n}\n\n.ace-twilight .ace_print-margin {\n width: 1px;\n background: #232323\n}\n\n.ace-twilight {\n background-color: #141414;\n color: #F8F8F8\n}\n\n.ace-twilight .ace_cursor {\n color: #A7A7A7\n}\n\n.ace-twilight .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #141414;\n}\n\n.ace-twilight .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-twilight .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_keyword,\n.ace-twilight .ace_meta {\n color: #CDA869\n}\n\n.ace-twilight .ace_constant,\n.ace-twilight .ace_constant.ace_character,\n.ace-twilight .ace_constant.ace_character.ace_escape,\n.ace-twilight .ace_constant.ace_other,\n.ace-twilight .ace_heading,\n.ace-twilight .ace_markup.ace_heading,\n.ace-twilight .ace_support.ace_constant {\n color: #CF6A4C\n}\n\n.ace-twilight .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-twilight .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1\n}\n\n.ace-twilight .ace_support {\n color: #9B859D\n}\n\n.ace-twilight .ace_fold {\n background-color: #AC885B;\n border-color: #F8F8F8\n}\n\n.ace-twilight .ace_support.ace_function {\n color: #DAD085\n}\n\n.ace-twilight .ace_list,\n.ace-twilight .ace_markup.ace_list,\n.ace-twilight .ace_storage {\n color: #F9EE98\n}\n\n.ace-twilight .ace_entity.ace_name.ace_function,\n.ace-twilight .ace_meta.ace_tag {\n color: #AC885B\n}\n\n.ace-twilight .ace_string {\n color: #8F9D6A\n}\n\n.ace-twilight .ace_string.ace_regexp {\n color: #E9C062\n}\n\n.ace-twilight .ace_comment {\n font-style: italic;\n color: #5F5A60\n}\n\n.ace-twilight .ace_variable {\n color: #7587A6\n}\n\n.ace-twilight .ace_xml-pe {\n color: #494949\n}\n\n.ace-twilight .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-twilight .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-twilight"; -exports.cssText = ".ace-twilight .ace_gutter {\ -background: #232323;\ -color: #E2E2E2\ -}\ -.ace-twilight .ace_print-margin {\ -width: 1px;\ -background: #232323\ -}\ -.ace-twilight {\ -background-color: #141414;\ -color: #F8F8F8\ -}\ -.ace-twilight .ace_cursor {\ -color: #A7A7A7\ -}\ -.ace-twilight .ace_marker-layer .ace_selection {\ -background: rgba(221, 240, 255, 0.20)\ -}\ -.ace-twilight.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #141414;\ -}\ -.ace-twilight .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-twilight .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(255, 255, 255, 0.25)\ -}\ -.ace-twilight .ace_marker-layer .ace_active-line {\ -background: rgba(255, 255, 255, 0.031)\ -}\ -.ace-twilight .ace_gutter-active-line {\ -background-color: rgba(255, 255, 255, 0.031)\ -}\ -.ace-twilight .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(221, 240, 255, 0.20)\ -}\ -.ace-twilight .ace_invisible {\ -color: rgba(255, 255, 255, 0.25)\ -}\ -.ace-twilight .ace_keyword,\ -.ace-twilight .ace_meta {\ -color: #CDA869\ -}\ -.ace-twilight .ace_constant,\ -.ace-twilight .ace_constant.ace_character,\ -.ace-twilight .ace_constant.ace_character.ace_escape,\ -.ace-twilight .ace_constant.ace_other,\ -.ace-twilight .ace_heading,\ -.ace-twilight .ace_markup.ace_heading,\ -.ace-twilight .ace_support.ace_constant {\ -color: #CF6A4C\ -}\ -.ace-twilight .ace_invalid.ace_illegal {\ -color: #F8F8F8;\ -background-color: rgba(86, 45, 86, 0.75)\ -}\ -.ace-twilight .ace_invalid.ace_deprecated {\ -text-decoration: underline;\ -font-style: italic;\ -color: #D2A8A1\ -}\ -.ace-twilight .ace_support {\ -color: #9B859D\ -}\ -.ace-twilight .ace_fold {\ -background-color: #AC885B;\ -border-color: #F8F8F8\ -}\ -.ace-twilight .ace_support.ace_function {\ -color: #DAD085\ -}\ -.ace-twilight .ace_list,\ -.ace-twilight .ace_markup.ace_list,\ -.ace-twilight .ace_storage {\ -color: #F9EE98\ -}\ -.ace-twilight .ace_entity.ace_name.ace_function,\ -.ace-twilight .ace_meta.ace_tag {\ -color: #AC885B\ -}\ -.ace-twilight .ace_string {\ -color: #8F9D6A\ -}\ -.ace-twilight .ace_string.ace_regexp {\ -color: #E9C062\ -}\ -.ace-twilight .ace_comment {\ -font-style: italic;\ -color: #5F5A60\ -}\ -.ace-twilight .ace_variable {\ -color: #7587A6\ -}\ -.ace-twilight .ace_xml-pe {\ -color: #494949\ -}\ -.ace-twilight .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\ -}\ -"; +}); +define("ace/theme/twilight",["require","exports","module","ace/theme/twilight-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-twilight"; +exports.cssText = require("./twilight-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/twilight"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-vibrant_ink.js b/app/Resources/ui/js/ace/theme-vibrant_ink.js index 26f7de90..8d6d7123 100644 --- a/app/Resources/ui/js/ace/theme-vibrant_ink.js +++ b/app/Resources/ui/js/ace/theme-vibrant_ink.js @@ -1,96 +1,13 @@ -define("ace/theme/vibrant_ink",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/vibrant_ink-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-vibrant-ink .ace_gutter {\n background: #1a1a1a;\n color: #BEBEBE\n}\n\n.ace-vibrant-ink .ace_print-margin {\n width: 1px;\n background: #1a1a1a\n}\n\n.ace-vibrant-ink {\n background-color: #0F0F0F;\n color: #FFFFFF\n}\n\n.ace-vibrant-ink .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_selection {\n background: #6699CC\n}\n\n.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #0F0F0F;\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_active-line {\n background: #333333\n}\n\n.ace-vibrant-ink .ace_gutter-active-line {\n background-color: #333333\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_selected-word {\n border: 1px solid #6699CC\n}\n\n.ace-vibrant-ink .ace_invisible {\n color: #404040\n}\n\n.ace-vibrant-ink .ace_keyword,\n.ace-vibrant-ink .ace_meta {\n color: #FF6600\n}\n\n.ace-vibrant-ink .ace_constant,\n.ace-vibrant-ink .ace_constant.ace_character,\n.ace-vibrant-ink .ace_constant.ace_character.ace_escape,\n.ace-vibrant-ink .ace_constant.ace_other {\n color: #339999\n}\n\n.ace-vibrant-ink .ace_constant.ace_numeric {\n color: #99CC99\n}\n\n.ace-vibrant-ink .ace_invalid,\n.ace-vibrant-ink .ace_invalid.ace_deprecated {\n color: #CCFF33;\n background-color: #000000\n}\n\n.ace-vibrant-ink .ace_fold {\n background-color: #FFCC00;\n border-color: #FFFFFF\n}\n\n.ace-vibrant-ink .ace_entity.ace_name.ace_function,\n.ace-vibrant-ink .ace_support.ace_function,\n.ace-vibrant-ink .ace_variable {\n color: #FFCC00\n}\n\n.ace-vibrant-ink .ace_variable.ace_parameter {\n font-style: italic\n}\n\n.ace-vibrant-ink .ace_string {\n color: #66FF00\n}\n\n.ace-vibrant-ink .ace_string.ace_regexp {\n color: #44B4CC\n}\n\n.ace-vibrant-ink .ace_comment {\n color: #9933CC\n}\n\n.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {\n font-style: italic;\n color: #99CC99\n}\n\n.ace-vibrant-ink .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-vibrant-ink .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-vibrant-ink"; -exports.cssText = ".ace-vibrant-ink .ace_gutter {\ -background: #1a1a1a;\ -color: #BEBEBE\ -}\ -.ace-vibrant-ink .ace_print-margin {\ -width: 1px;\ -background: #1a1a1a\ -}\ -.ace-vibrant-ink {\ -background-color: #0F0F0F;\ -color: #FFFFFF\ -}\ -.ace-vibrant-ink .ace_cursor {\ -color: #FFFFFF\ -}\ -.ace-vibrant-ink .ace_marker-layer .ace_selection {\ -background: #6699CC\ -}\ -.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #0F0F0F;\ -}\ -.ace-vibrant-ink .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-vibrant-ink .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #404040\ -}\ -.ace-vibrant-ink .ace_marker-layer .ace_active-line {\ -background: #333333\ -}\ -.ace-vibrant-ink .ace_gutter-active-line {\ -background-color: #333333\ -}\ -.ace-vibrant-ink .ace_marker-layer .ace_selected-word {\ -border: 1px solid #6699CC\ -}\ -.ace-vibrant-ink .ace_invisible {\ -color: #404040\ -}\ -.ace-vibrant-ink .ace_keyword,\ -.ace-vibrant-ink .ace_meta {\ -color: #FF6600\ -}\ -.ace-vibrant-ink .ace_constant,\ -.ace-vibrant-ink .ace_constant.ace_character,\ -.ace-vibrant-ink .ace_constant.ace_character.ace_escape,\ -.ace-vibrant-ink .ace_constant.ace_other {\ -color: #339999\ -}\ -.ace-vibrant-ink .ace_constant.ace_numeric {\ -color: #99CC99\ -}\ -.ace-vibrant-ink .ace_invalid,\ -.ace-vibrant-ink .ace_invalid.ace_deprecated {\ -color: #CCFF33;\ -background-color: #000000\ -}\ -.ace-vibrant-ink .ace_fold {\ -background-color: #FFCC00;\ -border-color: #FFFFFF\ -}\ -.ace-vibrant-ink .ace_entity.ace_name.ace_function,\ -.ace-vibrant-ink .ace_support.ace_function,\ -.ace-vibrant-ink .ace_variable {\ -color: #FFCC00\ -}\ -.ace-vibrant-ink .ace_variable.ace_parameter {\ -font-style: italic\ -}\ -.ace-vibrant-ink .ace_string {\ -color: #66FF00\ -}\ -.ace-vibrant-ink .ace_string.ace_regexp {\ -color: #44B4CC\ -}\ -.ace-vibrant-ink .ace_comment {\ -color: #9933CC\ -}\ -.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {\ -font-style: italic;\ -color: #99CC99\ -}\ -.ace-vibrant-ink .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/vibrant_ink",["require","exports","module","ace/theme/vibrant_ink-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-vibrant-ink"; +exports.cssText = require("./vibrant_ink-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/vibrant_ink"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-xcode.js b/app/Resources/ui/js/ace/theme-xcode.js index daded3a1..56c2b42c 100644 --- a/app/Resources/ui/js/ace/theme-xcode.js +++ b/app/Resources/ui/js/ace/theme-xcode.js @@ -1,90 +1,13 @@ -define("ace/theme/xcode",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/xcode-css",["require","exports","module"], function(require, exports, module){module.exports = "/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: EE3AD170-2B7F-4DE1-B724-C75F13FE0085) */\n\n.ace-xcode .ace_gutter {\n background: #e8e8e8;\n color: #333\n}\n\n.ace-xcode .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-xcode {\n background-color: #FFFFFF;\n color: #000000\n}\n\n.ace-xcode .ace_cursor {\n color: #000000\n}\n\n.ace-xcode .ace_marker-layer .ace_selection {\n background: #B5D5FF\n}\n\n.ace-xcode.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-xcode .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-xcode .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #BFBFBF\n}\n\n.ace-xcode .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.071)\n}\n\n.ace-xcode .ace_gutter-active-line {\n background-color: rgba(0, 0, 0, 0.071)\n}\n\n.ace-xcode .ace_marker-layer .ace_selected-word {\n border: 1px solid #B5D5FF\n}\n\n.ace-xcode .ace_constant.ace_language,\n.ace-xcode .ace_keyword,\n.ace-xcode .ace_meta,\n.ace-xcode .ace_variable.ace_language {\n color: #C800A4\n}\n\n.ace-xcode .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-xcode .ace_constant.ace_character,\n.ace-xcode .ace_constant.ace_other {\n color: #275A5E\n}\n\n.ace-xcode .ace_constant.ace_numeric {\n color: #3A00DC\n}\n\n.ace-xcode .ace_entity.ace_other.ace_attribute-name,\n.ace-xcode .ace_support.ace_constant,\n.ace-xcode .ace_support.ace_function {\n color: #450084\n}\n\n.ace-xcode .ace_fold {\n background-color: #C800A4;\n border-color: #000000\n}\n\n.ace-xcode .ace_entity.ace_name.ace_tag,\n.ace-xcode .ace_support.ace_class,\n.ace-xcode .ace_support.ace_type {\n color: #790EAD\n}\n\n.ace-xcode .ace_storage {\n color: #C900A4\n}\n\n.ace-xcode .ace_string {\n color: #DF0002\n}\n\n.ace-xcode .ace_comment {\n color: #008E00\n}\n\n.ace-xcode .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\n}\n\n.ace-xcode .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-xcode"; -exports.cssText = "\ -.ace-xcode .ace_gutter {\ -background: #e8e8e8;\ -color: #333\ -}\ -.ace-xcode .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-xcode {\ -background-color: #FFFFFF;\ -color: #000000\ -}\ -.ace-xcode .ace_cursor {\ -color: #000000\ -}\ -.ace-xcode .ace_marker-layer .ace_selection {\ -background: #B5D5FF\ -}\ -.ace-xcode.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #FFFFFF;\ -}\ -.ace-xcode .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174)\ -}\ -.ace-xcode .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #BFBFBF\ -}\ -.ace-xcode .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.071)\ -}\ -.ace-xcode .ace_gutter-active-line {\ -background-color: rgba(0, 0, 0, 0.071)\ -}\ -.ace-xcode .ace_marker-layer .ace_selected-word {\ -border: 1px solid #B5D5FF\ -}\ -.ace-xcode .ace_constant.ace_language,\ -.ace-xcode .ace_keyword,\ -.ace-xcode .ace_meta,\ -.ace-xcode .ace_variable.ace_language {\ -color: #C800A4\ -}\ -.ace-xcode .ace_invisible {\ -color: #BFBFBF\ -}\ -.ace-xcode .ace_constant.ace_character,\ -.ace-xcode .ace_constant.ace_other {\ -color: #275A5E\ -}\ -.ace-xcode .ace_constant.ace_numeric {\ -color: #3A00DC\ -}\ -.ace-xcode .ace_entity.ace_other.ace_attribute-name,\ -.ace-xcode .ace_support.ace_constant,\ -.ace-xcode .ace_support.ace_function {\ -color: #450084\ -}\ -.ace-xcode .ace_fold {\ -background-color: #C800A4;\ -border-color: #000000\ -}\ -.ace-xcode .ace_entity.ace_name.ace_tag,\ -.ace-xcode .ace_support.ace_class,\ -.ace-xcode .ace_support.ace_type {\ -color: #790EAD\ -}\ -.ace-xcode .ace_storage {\ -color: #C900A4\ -}\ -.ace-xcode .ace_string {\ -color: #DF0002\ -}\ -.ace-xcode .ace_comment {\ -color: #008E00\ -}\ -.ace-xcode .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\ -}"; +}); +define("ace/theme/xcode",["require","exports","module","ace/theme/xcode-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-xcode"; +exports.cssText = require("./xcode-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/xcode"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/worker-base.js b/app/Resources/ui/js/ace/worker-base.js index 800d6a60..2a2fabfe 100644 --- a/app/Resources/ui/js/ace/worker-base.js +++ b/app/Resources/ui/js/ace/worker-base.js @@ -216,10 +216,8 @@ window.onmessage = function(e) { }; })(this); -define("ace/lib/oop",[], function(require, exports, module) { -"use strict"; - -exports.inherits = function(ctor, superCtor) { +define("ace/lib/oop",[], function(require, exports, module){"use strict"; +exports.inherits = function (ctor, superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { @@ -230,40 +228,34 @@ exports.inherits = function(ctor, superCtor) { } }); }; - -exports.mixin = function(obj, mixin) { +exports.mixin = function (obj, mixin) { for (var key in mixin) { obj[key] = mixin[key]; } return obj; }; - -exports.implement = function(proto, mixin) { +exports.implement = function (proto, mixin) { exports.mixin(proto, mixin); }; }); -define("ace/apply_delta",[], function(require, exports, module) { -"use strict"; - -function throwDeltaError(delta, errorText){ +define("ace/apply_delta",[], function(require, exports, module){"use strict"; +function throwDeltaError(delta, errorText) { console.log("Invalid Delta:", delta); throw "Invalid Delta: " + errorText; } - function positionInDocument(docLines, position) { - return position.row >= 0 && position.row < docLines.length && - position.column >= 0 && position.column <= docLines[position.row].length; + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; } - function validateDelta(docLines, delta) { if (delta.action != "insert" && delta.action != "remove") throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); if (!(delta.lines instanceof Array)) throwDeltaError(delta, "delta.lines must be an Array"); if (!delta.start || !delta.end) - throwDeltaError(delta, "delta.start/end must be an present"); + throwDeltaError(delta, "delta.start/end must be an present"); var start = delta.start; if (!positionInDocument(docLines, delta.start)) throwDeltaError(delta, "delta.start must be contained in document"); @@ -275,9 +267,7 @@ function validateDelta(docLines, delta) { if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) throwDeltaError(delta, "delta.range must match delta lines"); } - -exports.applyDelta = function(docLines, delta, doNotValidate) { - +exports.applyDelta = function (docLines, delta, doNotValidate) { var row = delta.start.row; var startColumn = delta.start.column; var line = docLines[row] || ""; @@ -286,7 +276,8 @@ exports.applyDelta = function(docLines, delta, doNotValidate) { var lines = delta.lines; if (lines.length === 1) { docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); - } else { + } + else { var args = [row, 1].concat(delta.lines); docLines.splice.apply(docLines, args); docLines[row] = line.substring(0, startColumn) + docLines[row]; @@ -298,84 +289,69 @@ exports.applyDelta = function(docLines, delta, doNotValidate) { var endRow = delta.end.row; if (row === endRow) { docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); - } else { - docLines.splice( - row, endRow - row + 1, - line.substring(0, startColumn) + docLines[endRow].substring(endColumn) - ); + } + else { + docLines.splice(row, endRow - row + 1, line.substring(0, startColumn) + docLines[endRow].substring(endColumn)); } break; } }; -}); -define("ace/lib/event_emitter",[], function(require, exports, module) { -"use strict"; +}); +define("ace/lib/event_emitter",[], function(require, exports, module){"use strict"; var EventEmitter = {}; -var stopPropagation = function() { this.propagationStopped = true; }; -var preventDefault = function() { this.defaultPrevented = true; }; - +var stopPropagation = function () { this.propagationStopped = true; }; +var preventDefault = function () { this.defaultPrevented = true; }; EventEmitter._emit = -EventEmitter._dispatchEvent = function(eventName, e) { - this._eventRegistry || (this._eventRegistry = {}); - this._defaultHandlers || (this._defaultHandlers = {}); - - var listeners = this._eventRegistry[eventName] || []; - var defaultHandler = this._defaultHandlers[eventName]; - if (!listeners.length && !defaultHandler) - return; - - if (typeof e != "object" || !e) - e = {}; - - if (!e.type) - e.type = eventName; - if (!e.stopPropagation) - e.stopPropagation = stopPropagation; - if (!e.preventDefault) - e.preventDefault = preventDefault; - - listeners = listeners.slice(); - for (var i=0; i [" + this.end.row + "/" + this.end.column + "]"); }; - - this.contains = function(row, column) { + Range.prototype.contains = function (row, column) { return this.compare(row, column) == 0; }; - this.compareRange = function(range) { - var cmp, - end = range.end, - start = range.start; - + Range.prototype.compareRange = function (range) { + var cmp, end = range.end, start = range.start; cmp = this.compare(end.row, end.column); if (cmp == 1) { cmp = this.compare(start.row, start.column); if (cmp == 1) { return 2; - } else if (cmp == 0) { + } + else if (cmp == 0) { return 1; - } else { + } + else { return 0; } - } else if (cmp == -1) { + } + else if (cmp == -1) { return -2; - } else { + } + else { cmp = this.compare(start.row, start.column); if (cmp == -1) { return -1; - } else if (cmp == 1) { + } + else if (cmp == 1) { return 42; - } else { + } + else { return 0; } } }; - this.comparePoint = function(p) { + Range.prototype.comparePoint = function (p) { return this.compare(p.row, p.column); }; - this.containsRange = function(range) { + Range.prototype.containsRange = function (range) { return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; }; - this.intersects = function(range) { + Range.prototype.intersects = function (range) { var cmp = this.compareRange(range); return (cmp == -1 || cmp == 0 || cmp == 1); }; - this.isEnd = function(row, column) { + Range.prototype.isEnd = function (row, column) { return this.end.row == row && this.end.column == column; }; - this.isStart = function(row, column) { + Range.prototype.isStart = function (row, column) { return this.start.row == row && this.start.column == column; }; - this.setStart = function(row, column) { + Range.prototype.setStart = function (row, column) { if (typeof row == "object") { this.start.column = row.column; this.start.row = row.row; - } else { + } + else { this.start.row = row; this.start.column = column; } }; - this.setEnd = function(row, column) { + Range.prototype.setEnd = function (row, column) { if (typeof row == "object") { this.end.column = row.column; this.end.row = row.row; - } else { + } + else { this.end.row = row; this.end.column = column; } }; - this.inside = function(row, column) { + Range.prototype.inside = function (row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column) || this.isStart(row, column)) { return false; - } else { + } + else { return true; } } return false; }; - this.insideStart = function(row, column) { + Range.prototype.insideStart = function (row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column)) { return false; - } else { + } + else { return true; } } return false; }; - this.insideEnd = function(row, column) { + Range.prototype.insideEnd = function (row, column) { if (this.compare(row, column) == 0) { if (this.isStart(row, column)) { return false; - } else { + } + else { return true; } } return false; }; - this.compare = function(row, column) { + Range.prototype.compare = function (row, column) { if (!this.isMultiLine()) { if (row === this.start.row) { return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); } } - if (row < this.start.row) return -1; - if (row > this.end.row) return 1; - if (this.start.row === row) return column >= this.start.column ? 0 : -1; - if (this.end.row === row) return column <= this.end.column ? 0 : 1; - return 0; }; - this.compareStart = function(row, column) { + Range.prototype.compareStart = function (row, column) { if (this.start.row == row && this.start.column == column) { return -1; - } else { + } + else { return this.compare(row, column); } }; - this.compareEnd = function(row, column) { + Range.prototype.compareEnd = function (row, column) { if (this.end.row == row && this.end.column == column) { return 1; - } else { + } + else { return this.compare(row, column); } }; - this.compareInside = function(row, column) { + Range.prototype.compareInside = function (row, column) { if (this.end.row == row && this.end.column == column) { return 1; - } else if (this.start.row == row && this.start.column == column) { + } + else if (this.start.row == row && this.start.column == column) { return -1; - } else { + } + else { return this.compare(row, column); } }; - this.clipRows = function(firstRow, lastRow) { + Range.prototype.clipRows = function (firstRow, lastRow) { if (this.end.row > lastRow) - var end = {row: lastRow + 1, column: 0}; + var end = { row: lastRow + 1, column: 0 }; else if (this.end.row < firstRow) - var end = {row: firstRow, column: 0}; - + var end = { row: firstRow, column: 0 }; if (this.start.row > lastRow) - var start = {row: lastRow + 1, column: 0}; + var start = { row: lastRow + 1, column: 0 }; else if (this.start.row < firstRow) - var start = {row: firstRow, column: 0}; - + var start = { row: firstRow, column: 0 }; return Range.fromPoints(start || this.start, end || this.end); }; - this.extend = function(row, column) { + Range.prototype.extend = function (row, column) { var cmp = this.compare(row, column); - if (cmp == 0) return this; else if (cmp == -1) - var start = {row: row, column: column}; + var start = { row: row, column: column }; else - var end = {row: row, column: column}; - + var end = { row: row, column: column }; return Range.fromPoints(start || this.start, end || this.end); }; - - this.isEmpty = function() { + Range.prototype.isEmpty = function () { return (this.start.row === this.end.row && this.start.column === this.end.column); }; - this.isMultiLine = function() { + Range.prototype.isMultiLine = function () { return (this.start.row !== this.end.row); }; - this.clone = function() { + Range.prototype.clone = function () { return Range.fromPoints(this.start, this.end); }; - this.collapseRows = function() { + Range.prototype.collapseRows = function () { if (this.end.column == 0) - return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0); + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row - 1), 0); else return new Range(this.start.row, 0, this.end.row, 0); }; - this.toScreenRange = function(session) { + Range.prototype.toScreenRange = function (session) { var screenPosStart = session.documentToScreenPosition(this.start); var screenPosEnd = session.documentToScreenPosition(this.end); - - return new Range( - screenPosStart.row, screenPosStart.column, - screenPosEnd.row, screenPosEnd.column - ); + return new Range(screenPosStart.row, screenPosStart.column, screenPosEnd.row, screenPosEnd.column); }; - this.moveBy = function(row, column) { + Range.prototype.moveBy = function (row, column) { this.start.row += row; this.start.column += column; this.end.row += row; this.end.column += column; }; - -}).call(Range.prototype); -Range.fromPoints = function(start, end) { + return Range; +}()); +Range.fromPoints = function (start, end) { return new Range(start.row, start.column, end.row, end.column); }; -Range.comparePoints = comparePoints; - -Range.comparePoints = function(p1, p2) { +Range.comparePoints = function (p1, p2) { return p1.row - p2.row || p1.column - p2.column; }; - - exports.Range = Range; -}); -define("ace/anchor",[], function(require, exports, module) { -"use strict"; +}); +define("ace/anchor",[], function(require, exports, module){"use strict"; var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; - -var Anchor = exports.Anchor = function(doc, row, column) { - this.$onChange = this.onChange.bind(this); - this.attach(doc); - - if (typeof column == "undefined") - this.setPosition(row.row, row.column); - else - this.setPosition(row, column); -}; - -(function() { - - oop.implement(this, EventEmitter); - this.getPosition = function() { +var Anchor = /** @class */ (function () { + function Anchor(doc, row, column) { + this.$onChange = this.onChange.bind(this); + this.attach(doc); + if (typeof row != "number") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); + } + Anchor.prototype.getPosition = function () { return this.$clipPositionToDocument(this.row, this.column); }; - this.getDocument = function() { + Anchor.prototype.getDocument = function () { return this.document; }; - this.$insertRight = false; - this.onChange = function(delta) { + Anchor.prototype.onChange = function (delta) { if (delta.start.row == delta.end.row && delta.start.row != this.row) return; - if (delta.start.row > this.row) return; - - var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); + var point = $getTransformedPoint(delta, { row: this.row, column: this.column }, this.$insertRight); this.setPosition(point.row, point.column, true); }; - - function $pointsInOrder(point1, point2, equalPointsInOrder) { - var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; - return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); - } - - function $getTransformedPoint(delta, point, moveIfEqual) { - var deltaIsInsert = delta.action == "insert"; - var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); - var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); - var deltaStart = delta.start; - var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. - if ($pointsInOrder(point, deltaStart, moveIfEqual)) { - return { - row: point.row, - column: point.column - }; - } - if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { - return { - row: point.row + deltaRowShift, - column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) - }; - } - - return { - row: deltaStart.row, - column: deltaStart.column - }; - } - this.setPosition = function(row, column, noClip) { + Anchor.prototype.setPosition = function (row, column, noClip) { var pos; if (noClip) { pos = { row: row, column: column }; - } else { + } + else { pos = this.$clipPositionToDocument(row, column); } - if (this.row == pos.row && this.column == pos.column) return; - var old = { row: this.row, column: this.column }; - this.row = pos.row; this.column = pos.column; this._signal("change", { @@ -772,16 +689,15 @@ var Anchor = exports.Anchor = function(doc, row, column) { value: pos }); }; - this.detach = function() { + Anchor.prototype.detach = function () { this.document.off("change", this.$onChange); }; - this.attach = function(doc) { + Anchor.prototype.attach = function (doc) { this.document = doc || this.document; this.document.on("change", this.$onChange); }; - this.$clipPositionToDocument = function(row, column) { + Anchor.prototype.$clipPositionToDocument = function (row, column) { var pos = {}; - if (row >= this.document.getLength()) { pos.row = Math.max(0, this.document.getLength() - 1); pos.column = this.document.getLine(pos.row).length; @@ -794,117 +710,123 @@ var Anchor = exports.Anchor = function(doc, row, column) { pos.row = row; pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); } - if (column < 0) pos.column = 0; - return pos; }; - -}).call(Anchor.prototype); + return Anchor; +}()); +Anchor.prototype.$insertRight = false; +oop.implement(Anchor.prototype, EventEmitter); +function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); +} +function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + return { + row: deltaStart.row, + column: deltaStart.column + }; +} +exports.Anchor = Anchor; }); -define("ace/document",[], function(require, exports, module) { -"use strict"; - +define("ace/document",[], function(require, exports, module){"use strict"; var oop = require("./lib/oop"); var applyDelta = require("./apply_delta").applyDelta; var EventEmitter = require("./lib/event_emitter").EventEmitter; var Range = require("./range").Range; var Anchor = require("./anchor").Anchor; - -var Document = function(textOrLines) { - this.$lines = [""]; - if (textOrLines.length === 0) { +var Document = /** @class */ (function () { + function Document(textOrLines) { this.$lines = [""]; - } else if (Array.isArray(textOrLines)) { - this.insertMergedLines({row: 0, column: 0}, textOrLines); - } else { - this.insert({row: 0, column:0}, textOrLines); + if (textOrLines.length === 0) { + this.$lines = [""]; + } + else if (Array.isArray(textOrLines)) { + this.insertMergedLines({ row: 0, column: 0 }, textOrLines); + } + else { + this.insert({ row: 0, column: 0 }, textOrLines); + } } -}; - -(function() { - - oop.implement(this, EventEmitter); - - this.initialize = function(text) { - this.refresh(text); - }; - this.setValue = function(text) { + Document.prototype.setValue = function (text) { var len = this.getLength() - 1; this.remove(new Range(0, 0, len, this.getLine(len).length)); - this.insert({row: 0, column: 0}, text); + this.insert({ row: 0, column: 0 }, text || ""); }; - this.getValue = function() { + Document.prototype.getValue = function () { return this.getAllLines().join(this.getNewLineCharacter()); }; - this.createAnchor = function(row, column) { + Document.prototype.createAnchor = function (row, column) { return new Anchor(this, row, column); }; - if ("aaa".split(/a/).length === 0) { - this.$split = function(text) { - return text.replace(/\r\n|\r/g, "\n").split("\n"); - }; - } else { - this.$split = function(text) { - return text.split(/\r\n|\r|\n/); - }; - } - - - this.$detectNewLine = function(text) { + Document.prototype.$detectNewLine = function (text) { var match = text.match(/^.*?(\r\n|\r|\n)/m); this.$autoNewLine = match ? match[1] : "\n"; this._signal("changeNewLineMode"); }; - this.getNewLineCharacter = function() { + Document.prototype.getNewLineCharacter = function () { switch (this.$newLineMode) { - case "windows": - return "\r\n"; - case "unix": - return "\n"; - default: - return this.$autoNewLine || "\n"; + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; } }; - - this.$autoNewLine = ""; - this.$newLineMode = "auto"; - this.setNewLineMode = function(newLineMode) { + Document.prototype.setNewLineMode = function (newLineMode) { if (this.$newLineMode === newLineMode) return; - this.$newLineMode = newLineMode; this._signal("changeNewLineMode"); }; - this.getNewLineMode = function() { + Document.prototype.getNewLineMode = function () { return this.$newLineMode; }; - this.isNewLine = function(text) { + Document.prototype.isNewLine = function (text) { return (text == "\r\n" || text == "\r" || text == "\n"); }; - this.getLine = function(row) { + Document.prototype.getLine = function (row) { return this.$lines[row] || ""; }; - this.getLines = function(firstRow, lastRow) { + Document.prototype.getLines = function (firstRow, lastRow) { return this.$lines.slice(firstRow, lastRow + 1); }; - this.getAllLines = function() { + Document.prototype.getAllLines = function () { return this.getLines(0, this.getLength()); }; - this.getLength = function() { + Document.prototype.getLength = function () { return this.$lines.length; }; - this.getTextRange = function(range) { + Document.prototype.getTextRange = function (range) { return this.getLinesForRange(range).join(this.getNewLineCharacter()); }; - this.getLinesForRange = function(range) { + Document.prototype.getLinesForRange = function (range) { var lines; if (range.start.row === range.end.row) { lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; - } else { + } + else { lines = this.getLines(range.start.row, range.end.row); lines[0] = (lines[0] || "").substring(range.start.column); var l = lines.length - 1; @@ -913,45 +835,43 @@ var Document = function(textOrLines) { } return lines; }; - this.insertLines = function(row, lines) { + Document.prototype.insertLines = function (row, lines) { console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); return this.insertFullLines(row, lines); }; - this.removeLines = function(firstRow, lastRow) { + Document.prototype.removeLines = function (firstRow, lastRow) { console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); return this.removeFullLines(firstRow, lastRow); }; - this.insertNewLine = function(position) { + Document.prototype.insertNewLine = function (position) { console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); return this.insertMergedLines(position, ["", ""]); }; - this.insert = function(position, text) { + Document.prototype.insert = function (position, text) { if (this.getLength() <= 1) this.$detectNewLine(text); - return this.insertMergedLines(position, this.$split(text)); }; - this.insertInLine = function(position, text) { + Document.prototype.insertInLine = function (position, text) { var start = this.clippedPos(position.row, position.column); var end = this.pos(position.row, position.column + text.length); - this.applyDelta({ start: start, end: end, action: "insert", lines: [text] }, true); - return this.clonePos(end); }; - - this.clippedPos = function(row, column) { + Document.prototype.clippedPos = function (row, column) { var length = this.getLength(); if (row === undefined) { row = length; - } else if (row < 0) { + } + else if (row < 0) { row = 0; - } else if (row >= length) { + } + else if (row >= length) { row = length - 1; column = undefined; } @@ -959,115 +879,87 @@ var Document = function(textOrLines) { if (column == undefined) column = line.length; column = Math.min(Math.max(column, 0), line.length); - return {row: row, column: column}; + return { row: row, column: column }; }; - - this.clonePos = function(pos) { - return {row: pos.row, column: pos.column}; + Document.prototype.clonePos = function (pos) { + return { row: pos.row, column: pos.column }; }; - - this.pos = function(row, column) { - return {row: row, column: column}; + Document.prototype.pos = function (row, column) { + return { row: row, column: column }; }; - - this.$clipPosition = function(position) { + Document.prototype.$clipPosition = function (position) { var length = this.getLength(); if (position.row >= length) { position.row = Math.max(0, length - 1); position.column = this.getLine(length - 1).length; - } else { + } + else { position.row = Math.max(0, position.row); position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); } return position; }; - - this.refresh = function(text, row){ - var row = row || 0 - var lines = this.$split(text); - if (lines.length > 0xFFFF) { - var end = this.refresh(row, lines.slice(0xFFFF)); - lines = lines.slice(0, 0xFFFF); - } - - var args = [row, 0]; - args.push.apply(args, lines); - this.$lines.splice.apply(this.$lines, args); - var range = new Range(row, 0, row + lines.length, 0); - var delta = { - action: "insertLines", - context: 'refresh', - range: range, - lines: lines - }; - this._emit("change", { data: delta }); - return {row:0, column:0}; - } - this.insertFullLines = function(row, lines) { + Document.prototype.insertFullLines = function (row, lines) { row = Math.min(Math.max(row, 0), this.getLength()); var column = 0; if (row < this.getLength()) { lines = lines.concat([""]); column = 0; - } else { + } + else { lines = [""].concat(lines); row--; column = this.$lines[row].length; } - this.insertMergedLines({row: row, column: column}, lines); + this.insertMergedLines({ row: row, column: column }, lines); }; - this.insertMergedLines = function(position, lines) { + Document.prototype.insertMergedLines = function (position, lines) { var start = this.clippedPos(position.row, position.column); var end = { row: start.row + lines.length - 1, column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length }; - this.applyDelta({ start: start, end: end, action: "insert", lines: lines }); - return this.clonePos(end); }; - this.remove = function(range) { + Document.prototype.remove = function (range) { var start = this.clippedPos(range.start.row, range.start.column); var end = this.clippedPos(range.end.row, range.end.column); this.applyDelta({ start: start, end: end, action: "remove", - lines: this.getLinesForRange({start: start, end: end}) + lines: this.getLinesForRange({ start: start, end: end }) }); return this.clonePos(start); }; - this.removeInLine = function(row, startColumn, endColumn) { + Document.prototype.removeInLine = function (row, startColumn, endColumn) { var start = this.clippedPos(row, startColumn); var end = this.clippedPos(row, endColumn); - this.applyDelta({ start: start, end: end, action: "remove", - lines: this.getLinesForRange({start: start, end: end}) + lines: this.getLinesForRange({ start: start, end: end }) }, true); - return this.clonePos(start); }; - this.removeFullLines = function(firstRow, lastRow) { + Document.prototype.removeFullLines = function (firstRow, lastRow) { firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); - lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow), this.getLength() - 1); var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; - var deleteLastNewLine = lastRow < this.getLength() - 1; - var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); - var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); - var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); - var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = (deleteFirstNewLine ? firstRow - 1 : firstRow); + var startCol = (deleteFirstNewLine ? this.getLine(startRow).length : 0); + var endRow = (deleteLastNewLine ? lastRow + 1 : lastRow); + var endCol = (deleteLastNewLine ? 0 : this.getLine(endRow).length); var range = new Range(startRow, startCol, endRow, endCol); var deletedLines = this.$lines.slice(firstRow, lastRow + 1); - this.applyDelta({ start: range.start, end: range.end, @@ -1076,7 +968,7 @@ var Document = function(textOrLines) { }); return deletedLines; }; - this.removeNewLine = function(row) { + Document.prototype.removeNewLine = function (row) { if (row < this.getLength() - 1 && row >= 0) { this.applyDelta({ start: this.pos(row, this.getLine(row).length), @@ -1086,14 +978,13 @@ var Document = function(textOrLines) { }); } }; - this.replace = function(range, text) { + Document.prototype.replace = function (range, text) { if (!(range instanceof Range)) range = Range.fromPoints(range.start, range.end); if (text.length === 0 && range.isEmpty()) return range.start; if (text == this.getTextRange(range)) return range.end; - this.remove(range); var end; if (text) { @@ -1102,26 +993,24 @@ var Document = function(textOrLines) { else { end = range.start; } - return end; }; - this.applyDeltas = function(deltas) { - for (var i=0; i=0; i--) { + Document.prototype.revertDeltas = function (deltas) { + for (var i = deltas.length - 1; i >= 0; i--) { this.revertDelta(deltas[i]); } }; - this.applyDelta = function(delta, doNotValidate) { + Document.prototype.applyDelta = function (delta, doNotValidate) { var isInsert = delta.action == "insert"; if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] : !Range.comparePoints(delta.start, delta.end)) { return; } - if (isInsert && delta.lines.length > 20000) { this.$splitAndapplyLargeDelta(delta, 20000); } @@ -1130,18 +1019,14 @@ var Document = function(textOrLines) { this._signal("change", delta); } }; - - this.$safeApplyDelta = function(delta) { + Document.prototype.$safeApplyDelta = function (delta) { var docLength = this.$lines.length; - if ( - delta.action == "remove" && delta.start.row < docLength && delta.end.row < docLength - || delta.action == "insert" && delta.start.row <= docLength - ) { + if (delta.action == "remove" && delta.start.row < docLength && delta.end.row < docLength + || delta.action == "insert" && delta.start.row <= docLength) { this.applyDelta(delta); } }; - - this.$splitAndapplyLargeDelta = function(delta, MAX) { + Document.prototype.$splitAndapplyLargeDelta = function (delta, MAX) { var lines = delta.lines; var l = lines.length - MAX + 1; var row = delta.start.row; @@ -1162,7 +1047,7 @@ var Document = function(textOrLines) { delta.start.column = column; this.applyDelta(delta, true); }; - this.revertDelta = function(delta) { + Document.prototype.revertDelta = function (delta) { this.$safeApplyDelta({ start: this.clonePos(delta.start), end: this.clonePos(delta.end), @@ -1170,218 +1055,211 @@ var Document = function(textOrLines) { lines: delta.lines.slice() }); }; - this.indexToPosition = function(index, startRow) { + Document.prototype.indexToPosition = function (index, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; for (var i = startRow || 0, l = lines.length; i < l; i++) { index -= lines[i].length + newlineLength; if (index < 0) - return {row: i, column: index + lines[i].length + newlineLength}; + return { row: i, column: index + lines[i].length + newlineLength }; } - return {row: l-1, column: index + lines[l-1].length + newlineLength}; + return { row: l - 1, column: index + lines[l - 1].length + newlineLength }; }; - this.positionToIndex = function(pos, startRow) { + Document.prototype.positionToIndex = function (pos, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; var index = 0; var row = Math.min(pos.row, lines.length); for (var i = startRow || 0; i < row; ++i) index += lines[i].length + newlineLength; - return index + pos.column; }; - -}).call(Document.prototype); - + Document.prototype.$split = function (text) { + return text.split(/\r\n|\r|\n/); + }; + return Document; +}()); +Document.prototype.$autoNewLine = ""; +Document.prototype.$newLineMode = "auto"; +oop.implement(Document.prototype, EventEmitter); exports.Document = Document; + }); -define("ace/lib/lang",[], function(require, exports, module) { -"use strict"; +define("ace/lib/deep_copy",[], function(require, exports, module){exports.deepCopy = function deepCopy(obj) { + if (typeof obj !== "object" || !obj) + return obj; + var copy; + if (Array.isArray(obj)) { + copy = []; + for (var key = 0; key < obj.length; key++) { + copy[key] = deepCopy(obj[key]); + } + return copy; + } + if (Object.prototype.toString.call(obj) !== "[object Object]") + return obj; + copy = {}; + for (var key in obj) + copy[key] = deepCopy(obj[key]); + return copy; +}; -exports.last = function(a) { +}); + +define("ace/lib/lang",[], function(require, exports, module){"use strict"; +exports.last = function (a) { return a[a.length - 1]; }; - -exports.stringReverse = function(string) { +exports.stringReverse = function (string) { return string.split("").reverse().join(""); }; - exports.stringRepeat = function (string, count) { var result = ''; while (count > 0) { if (count & 1) result += string; - if (count >>= 1) string += string; } return result; }; - var trimBeginRegexp = /^\s\s*/; var trimEndRegexp = /\s\s*$/; - exports.stringTrimLeft = function (string) { return string.replace(trimBeginRegexp, ''); }; - exports.stringTrimRight = function (string) { return string.replace(trimEndRegexp, ''); }; - -exports.copyObject = function(obj) { +exports.copyObject = function (obj) { var copy = {}; for (var key in obj) { copy[key] = obj[key]; } return copy; }; - -exports.copyArray = function(array){ +exports.copyArray = function (array) { var copy = []; - for (var i=0, l=array.length; i 0xffff ? 2 : 1; +}; + }); define("ace/worker/mirror",[], function(require, exports, module) { diff --git a/app/Resources/ui/js/editor.js b/app/Resources/ui/js/editor.js index bc0670f4..bdb5650d 100644 --- a/app/Resources/ui/js/editor.js +++ b/app/Resources/ui/js/editor.js @@ -1,15 +1,20 @@ // the language-tools extension provides snippets and autocomplete ace.require("ace/ext/language_tools"); +// used to render usage-sample tooltips with the same tokenizer+theme as the live editor +var staticHighlight = ace.require("ace/ext/static_highlight"); +var Range = ace.require("ace/range").Range; // Wrap the ace UndoManager's mutation methods with callbacks to the pyobjc EditorView -// keeping it up-to-date on whether the file has been modified & whether undo/redo are available +// keeping it up-to-date on whether the file has been modified & whether undo/redo are available. +// Also send a copy of the buffer contents with each change so the EditorView's shadow copy is +// fresh enough to be read synchronously at save-time. const {UndoManager:__UndoManager} = ace.require('ace/undomanager') function UndoManager(){ __UndoManager.call(this) } UndoManager.prototype = Object.create(__UndoManager.prototype); for (const method of ['add', 'undo', 'redo', 'reset']){ UndoManager.prototype[method] = function(){ __UndoManager.prototype[method].call(this, ...arguments); - app.edits_(this.$undoStack.length) + app.sync_edits(this.$undoStack.length, window?.editor?.source?.() ?? null) } } @@ -45,6 +50,17 @@ var Editor = function(elt){ ed.on("blur", that._blur) ed.on("focus", that._focus) + // enable syntax-documentation tooltips + ed.hoverTooltip.setDataProvider(that._sampleHover) + ed.hoverTooltip.addToEditor(ed) + + // keep the native side informed of which documented symbol (if any) is + // under the pointer and/or text cursor, so the right-click context menu + // can offer a "View Documentation" item + that._docTarget = {mouse: null, caret: null} + ed.on("changeSelection", that._trackDocTarget) + ed.on("nativecontextmenu", that._trackDocTarget) + // configure the buffer sess = ed.getSession() sess.setMode("ace/mode/plotdevice"); @@ -60,7 +76,6 @@ var Editor = function(elt){ // responsible for their hide/show behavior, sadly.... sess.on("changeScrollLeft", that._scroll_h) sess.on("changeScrollTop", that._scroll_v) - that.ready = true // flag that the objc side can start sending messages return that }, _commandStream:function(e){ @@ -68,7 +83,7 @@ var Editor = function(elt){ // objc side of things when one of them is entered var cmd = e.command.name for (const [cmds, menu] of Object.entries(_menu_cmds)){ - if (cmds.includes(cmd)) app.flash_(menu) + if (cmds.includes(cmd)) app.flash_menu(menu) } }, _scroll_h:function(x){ @@ -105,6 +120,61 @@ var Editor = function(elt){ ed.setHighlightGutterLine(false) }, + _isBindingTarget:function(token){ + // spot locations where a term is being used as a kwarg (or other assignment), so we can + // exclude it from the usage-sample tooltip and doc-target tracking (since it would only + // coincidentally share the name of a documented function in that case) + return !!token && (token.type === "variable.parameter" || token.type === "variable.assignment") + }, + _trackDocTarget:function(e){ + // find the symbol currently under the mouse (if e is defined) or the insertion point (if not) + let coords = e?.domEvent + let pos = coords ? ed.renderer.screenToTextCoordinates(coords.clientX, coords.clientY) : ed.getCursorPosition() + var token = sess.getTokenAt(pos.row, pos.column) + var word = token && token.value + + // if there's documentation for it (and it's changed since the last event), relay it to the pyobjc side + var url = (!that._isBindingTarget(token) && word && PLOTDEVICE_SYMBOL_DOCS[word]) || null + let inputType = coords ? "mouse" : "caret" + if (url !== that._docTarget[inputType]?.url){ + that._docTarget[inputType] = url ? {word, url} : null + app.setDocTarget(that._docTarget) + } + }, + _sampleHover:function(e, editor){ + var pos = e.getDocumentPosition() + var token = sess.getTokenAt(pos.row, pos.column) + var word = token && token.value + + // don't show tooltip for kwargs if the docs are for a function + if (!token || that._isBindingTarget(token) || !PLOTDEVICE_SYMBOL_USAGE.hasOwnProperty(word)) return + var range = Range.fromPoints({row:pos.row, column:token.start}, {row:pos.row, column:token.start+token.value.length}) + var text = PLOTDEVICE_SYMBOL_USAGE[word].join("\n") + + // use syntax highlighting to style the usage sample + staticHighlight.render(text, sess.getMode(), ed.getTheme(), 1, true, function(result){ + var tooltip = document.createElement("div") + tooltip.innerHTML = result.html + + // add a link to the docs page (if applicable) + var url = PLOTDEVICE_SYMBOL_DOCS[word] + if (url){ + var more = document.createElement("div") + more.className = "ace_symbol-doc-more" + more.style.color = getComputedStyle(dom).color + var moreText = document.createElement("span") + moreText.textContent = "view documentation…" + more.appendChild(moreText) + more.addEventListener("click", function(){ app.openDoc(url) }) + tooltip.appendChild(more) + } + + // default tooltip style is too specific to override with css, so manully set background to match theme + ed.hoverTooltip.getElement().style.backgroundColor = getComputedStyle(dom).backgroundColor + ed.hoverTooltip.showForRange(editor, range, tooltip, e) + }) + }, + focus:function(){ ed.focus() }, diff --git a/app/Resources/ui/js/keybindings.js b/app/Resources/ui/js/keybindings.js index 21110975..4d1a3a23 100644 --- a/app/Resources/ui/js/keybindings.js +++ b/app/Resources/ui/js/keybindings.js @@ -23,7 +23,9 @@ PLOTDEVICE_KEYBINDINGS=[ scrollIntoView: "selectionPart" },{ name: "refreshdoc", - exec: function(editor, str) { editor.session.setValue(str); }, + // ace's default command dispatcher replaces falsy args (e.g. a legitimately + // empty source string) with {} before calling exec, so guard against that here + exec: function(editor, str) { editor.session.setValue(typeof str === "string" ? str : ""); }, },{ name: "cancelRun", bindKey: {mac: "Command-."}, @@ -152,4 +154,4 @@ PLOTDEVICE_KEYBINDINGS=[ } } -] \ No newline at end of file +] diff --git a/app/Resources/ui/js/symbols.js b/app/Resources/ui/js/symbols.js new file mode 100644 index 00000000..a3ea01c2 --- /dev/null +++ b/app/Resources/ui/js/symbols.js @@ -0,0 +1,388 @@ +// symbol name -> documentation URL. +var PLOTDEVICE_SYMBOL_DOCS = { + // Canvas + size: "https://plotdevice.io/ref/Canvas#size()", + speed: "https://plotdevice.io/ref/Canvas#speed()", + background: "https://plotdevice.io/ref/Canvas#background()", + geometry: "https://plotdevice.io/ref/Canvas#geometry()", + export: "https://plotdevice.io/ref/Canvas#export()", + plot: "https://plotdevice.io/ref/Canvas#plot()", + clear: "https://plotdevice.io/ref/Canvas#clear()", + outputmode: "https://plotdevice.io/ref/Canvas#outputmode()", + ximport: "https://plotdevice.io/ref/Canvas#ximport()", + halt: "https://plotdevice.io/ref/Canvas#halt()", + + // Line & Color + color: "https://plotdevice.io/ref/Line+Color#color()", + stroke: "https://plotdevice.io/ref/Line+Color#stroke()", + fill: "https://plotdevice.io/ref/Line+Color#fill()", + pen: "https://plotdevice.io/ref/Line+Color#pen()", + capstyle: "https://plotdevice.io/ref/Line+Color#capstyle()", + colormode: "https://plotdevice.io/ref/Line+Color#colormode()", + joinstyle: "https://plotdevice.io/ref/Line+Color#joinstyle()", + nofill: "https://plotdevice.io/ref/Line+Color#nofill()", + nostroke: "https://plotdevice.io/ref/Line+Color#nostroke()", + strokewidth: "https://plotdevice.io/ref/Line+Color#strokewidth()", + + // Primitives + poly: "https://plotdevice.io/ref/Primitives#poly()", + rect: "https://plotdevice.io/ref/Primitives#rect()", + arc: "https://plotdevice.io/ref/Primitives#arc()", + oval: "https://plotdevice.io/ref/Primitives#oval()", + line: "https://plotdevice.io/ref/Primitives#line()", + image: "https://plotdevice.io/ref/Primitives#image()", + text: "https://plotdevice.io/ref/Primitives#text()", + arrow: "https://plotdevice.io/ref/Primitives#arrow()", + star: "https://plotdevice.io/ref/Primitives#star()", + + // Drawing + bezier: "https://plotdevice.io/ref/Drawing#bezier()", + moveto: "https://plotdevice.io/ref/Drawing#moveto()", + lineto: "https://plotdevice.io/ref/Drawing#lineto()", + arcto: "https://plotdevice.io/ref/Drawing#arcto()", + curveto: "https://plotdevice.io/ref/Drawing#curveto()", + autoclosepath: "https://plotdevice.io/ref/Drawing#autoclosepath()", + beginpath: "https://plotdevice.io/ref/Drawing#beginpath()", + drawpath: "https://plotdevice.io/ref/Drawing#drawpath()", + endpath: "https://plotdevice.io/ref/Drawing#endpath()", + findpath: "https://plotdevice.io/ref/Drawing#findpath()", + + // Transform + transform: "https://plotdevice.io/ref/Transform#transform()", + translate: "https://plotdevice.io/ref/Transform#translate()", + rotate: "https://plotdevice.io/ref/Transform#rotate()", + scale: "https://plotdevice.io/ref/Transform#scale()", + skew: "https://plotdevice.io/ref/Transform#skew()", + reset: "https://plotdevice.io/ref/Transform#reset()", + pop: "https://plotdevice.io/ref/Transform#pop()", + push: "https://plotdevice.io/ref/Transform#push()", + + // Compositing + alpha: "https://plotdevice.io/ref/Compositing#alpha()", + blend: "https://plotdevice.io/ref/Compositing#blend()", + shadow: "https://plotdevice.io/ref/Compositing#shadow()", + clip: "https://plotdevice.io/ref/Compositing#clip()", + mask: "https://plotdevice.io/ref/Compositing#mask()", + noshadow: "https://plotdevice.io/ref/Compositing#noshadow()", + beginclip: "https://plotdevice.io/ref/Compositing#beginclip()", + endclip: "https://plotdevice.io/ref/Compositing#endclip()", + + // Typography + font: "https://plotdevice.io/ref/Typography#font()", + layout: "https://plotdevice.io/ref/Typography#layout()", + stylesheet: "https://plotdevice.io/ref/Typography#stylesheet()", + paginate: "https://plotdevice.io/ref/Typography#paginate()", + textpath: "https://plotdevice.io/ref/Typography#textpath()", + align: "https://plotdevice.io/ref/Typography#align()", + fontsize: "https://plotdevice.io/ref/Typography#fontsize()", + lineheight: "https://plotdevice.io/ref/Typography#lineheight()", + textheight: "https://plotdevice.io/ref/Typography#textheight()", + textmetrics: "https://plotdevice.io/ref/Typography#textmetrics()", + textwidth: "https://plotdevice.io/ref/Typography#textwidth()", + + // Misc (Utility & Entropy) + read: "https://plotdevice.io/ref/Misc#read()", + measure: "https://plotdevice.io/ref/Misc#measure()", + files: "https://plotdevice.io/ref/Misc#files()", + fonts: "https://plotdevice.io/ref/Misc#fonts()", + var: "https://plotdevice.io/ref/Misc#var()", + imagesize: "https://plotdevice.io/ref/Misc#imagesize()", + open: "https://plotdevice.io/ref/Misc#open()", + random: "https://plotdevice.io/ref/Misc#random()", + choice: "https://plotdevice.io/ref/Misc#choice()", + shuffled: "https://plotdevice.io/ref/Misc#shuffled()", + ordered: "https://plotdevice.io/ref/Misc#ordered()", + grid: "https://plotdevice.io/ref/Misc#grid()", + autotext: "https://plotdevice.io/ref/Misc#autotext()", + + // Objects: Drawing + Bezier: "https://plotdevice.io/ref/Drawing#Bezier", + Curve: "https://plotdevice.io/ref/Drawing#Curve", + Image: "https://plotdevice.io/ref/Drawing#Image", + Context: "https://plotdevice.io/ref/Drawing#Context", + + // Objects: Line & Color + Color: "https://plotdevice.io/ref/Line+Color#Color", + Gradient: "https://plotdevice.io/ref/Line+Color#Gradient", + Shadow: "https://plotdevice.io/ref/Line+Color#Shadow", + + // Objects: Transform + Point: "https://plotdevice.io/ref/Transform#Point", + Size: "https://plotdevice.io/ref/Transform#Size", + Region: "https://plotdevice.io/ref/Transform#Region", + Transform: "https://plotdevice.io/ref/Transform#Transform", + + // Objects: Typography + Text: "https://plotdevice.io/ref/Typography#Text", + TextBlock: "https://plotdevice.io/ref/Typography#TextBlock", + TextFragment: "https://plotdevice.io/ref/Typography#TextFragment", + Font: "https://plotdevice.io/ref/Typography#Font", + Family: "https://plotdevice.io/ref/Typography#Family", + + // Constants + px: "https://plotdevice.io/ref/Misc#constants", + pica: "https://plotdevice.io/ref/Misc#constants", + inch: "https://plotdevice.io/ref/Misc#constants", + cm: "https://plotdevice.io/ref/Misc#constants", + mm: "https://plotdevice.io/ref/Misc#constants", + pi: "https://plotdevice.io/ref/Misc#constants", + tau: "https://plotdevice.io/ref/Misc#constants", + RGB: "https://plotdevice.io/ref/Misc#constants", + HSV: "https://plotdevice.io/ref/Misc#constants", + CMYK: "https://plotdevice.io/ref/Misc#constants", + CENTER: "https://plotdevice.io/ref/Misc#constants", + CORNER: "https://plotdevice.io/ref/Misc#constants", + DEGREES: "https://plotdevice.io/ref/Misc#constants", + RADIANS: "https://plotdevice.io/ref/Misc#constants", + PERCENT: "https://plotdevice.io/ref/Misc#constants", + LEFT: "https://plotdevice.io/ref/Misc#constants", + RIGHT: "https://plotdevice.io/ref/Misc#constants", + JUSTIFY: "https://plotdevice.io/ref/Misc#constants", + MOVETO: "https://plotdevice.io/ref/Misc#constants", + LINETO: "https://plotdevice.io/ref/Misc#constants", + CURVETO: "https://plotdevice.io/ref/Misc#constants", + CLOSE: "https://plotdevice.io/ref/Misc#constants", + MITER: "https://plotdevice.io/ref/Misc#constants", + ROUND: "https://plotdevice.io/ref/Misc#constants", + BEVEL: "https://plotdevice.io/ref/Misc#constants", + BUTT: "https://plotdevice.io/ref/Misc#constants", + SQUARE: "https://plotdevice.io/ref/Misc#constants", + NORMAL: "https://plotdevice.io/ref/Misc#constants", + FORTYFIVE: "https://plotdevice.io/ref/Misc#constants", + NUMBER: "https://plotdevice.io/ref/Misc#constants", + TEXT: "https://plotdevice.io/ref/Misc#constants", + BOOLEAN: "https://plotdevice.io/ref/Misc#constants", + BUTTON: "https://plotdevice.io/ref/Misc#constants", + WIDTH: "https://plotdevice.io/ref/Misc#constants", + HEIGHT: "https://plotdevice.io/ref/Misc#constants", + FRAME: "https://plotdevice.io/ref/Misc#constants", + PAGENUM: "https://plotdevice.io/ref/Misc#constants", + MOUSEX: "https://plotdevice.io/ref/Misc#constants", + MOUSEY: "https://plotdevice.io/ref/Misc#constants", + mousedown: "https://plotdevice.io/ref/Misc#constants", + KEY_UP: "https://plotdevice.io/ref/Misc#constants", + KEY_DOWN: "https://plotdevice.io/ref/Misc#constants", + KEY_LEFT: "https://plotdevice.io/ref/Misc#constants", + KEY_RIGHT: "https://plotdevice.io/ref/Misc#constants", + KEY_BACKSPACE: "https://plotdevice.io/ref/Misc#constants", + KEY_TAB: "https://plotdevice.io/ref/Misc#constants", + KEY_ESC: "https://plotdevice.io/ref/Misc#constants", + + // Dictionaries + adict: "https://plotdevice.io/ref/Misc#dictionaries", + ddict: "https://plotdevice.io/ref/Misc#dictionaries", + odict: "https://plotdevice.io/ref/Misc#dictionaries", +} + +// symbol name -> array of example usage lines (from each ref page's "Syntax" section). +var PLOTDEVICE_SYMBOL_USAGE = { + // Canvas + size: [`size(width, height, unit=px)`], + speed: [`speed(fps)`], + background: [ + `background(r, g, b, a=1.0)`, + `background(h, s, b, a=1.0)`, + `background(c, m, y, k, a=1.0)`, + `background(k, a=1.0)`, + `background(color)`, + `background(None) # transparent backdrop`, + `background(*colors, angle, steps=[0,1]) # axial gradient`, + `background(*colors, steps=[0,1], center=[0,0]) # radial gradient` + ], + geometry: [`geometry(units)`], + export: [ + `export("spool.pdf", cmyk=False)`, + `export("spool.png", zoom=2)`, + `with export("movie.mov", fps=30, bitrate=1.0):`, + ` ... # draw movie frames`, + ], + plot: [`plot(grob)`], + clear: [ + `clear() # erase the canvas`, + `clear(all) # erase the canvas and reset drawing state`, + `clear(*grobs) # remove specific objects from the canvas` + ], + outputmode: [`outputmode(mode)`], + ximport: [`libname = ximport("libname")`], + halt: [`halt()`], + + // Line & Color + color: [ + `color(mode=RGB, range=1.0) # the default color mode and range`, + `color(range=255) # use 0-255 component values rather than 0–1`, + `color(HSV) # color-related commands will expect HSV values`, + `color(r, g, b, a=1) # RGB mode`, + `color(h, s, v, a=1) # HSV mode`, + `color(c, m, y, k, a=1) # CMYK mode`, + `color(v, a=1)` + ], + stroke: [ + `stroke(r, g, b, a=1.0)`, + `stroke(h, s, v, a=1.0)`, + `stroke(c, m, y, k, a=1.0)`, + `stroke(v, a=1.0)`, + `stroke(color)` + ], + fill: [ + `fill(r, g, b, a=1.0)`, + `fill(h, s, v, a=1.0)`, + `fill(c, m, y, k, a=1.0)`, + `fill(v, a=1.0)`, + `fill(color)`, + `fill(*colors, angle, steps=[0,1]) # axial gradient`, + `fill(*colors, steps=[0,1], center=[0,0]) # radial gradient` + ], + pen: [`pen(nib, join=MITER, cap=BUTT, dash=None)`], + capstyle: [`capstyle(style)`], + colormode: [`colormode(mode, range=1.0)`], + joinstyle: [`joinstyle(style)`], + nofill: [`nofill()`], + nostroke: [`nostroke()`], + strokewidth: [`strokewidth(width)`], + + // Primitives + poly: [`poly(x, y, radius, sides=4, points=None, plot=True, **style)`], + rect: [`rect(x, y, width, height, roundness=0.0, radius=None, plot=True, **style)`], + arc: [`arc(x, y, radius, range=None, ccw=False, close=False, plot=True, **style)`], + oval: [`oval(x, y, width, height, plot=True, **style)`], + line: [`line(x1, y1, x2, y2, plot=True)`], + image: [ + `image(src, x, y, width=None, height=None, plot=True, **style)`, + `image(x, y, width=None, height=None, src="path-or-url", plot=True, **style)`, + `image(x, y, width=None, height=None, data="bytes-or-base64", plot=True, **style)` + ], + text: [ + `text(str, x, y, width=None, height=None, outline=False, plot=True, **options)`, + `text(x, y, width=None, height=None, str="", **options)`, + `text(x, y, width=None, height=None, xml="", **options)`, + `text(x, y, width=None, height=None, src="", **options)` + ], + arrow: [`arrow(x, y, width, type=NORMAL, plot=True, **style)`], + star: [`star(x, y, points=20, outer=100, inner=50, plot=True, **style)`], + + // Drawing + bezier: [ + `bezier(points=[], smooth=False, **opts)`, + `bezier(path, **opts)`, + `with bezier(x=0, y=0, **opts) as path:`, + ` ... # drawing commands like moveto(), lineto(), arcto(), or curveto()` + ], + moveto: [`moveto(x, y)`], + lineto: [`lineto(x, y, close=False)`], + arcto: [ + `arcto(x, y, ccw=False, close=False)`, + `arcto(cx, cy, x, y, radius, close=False)` + ], + curveto: [`curveto(h1x, h1y, h2x, h2y, x, y, close=False)`], + autoclosepath: [`autoclosepath(close=True)`], + beginpath: [`beginpath(x=None, y=None)`], + drawpath: [`drawpath(path)`], + endpath: [`endpath(draw=True)`], + findpath: [`findpath(list, curvature=1.0)`], + + // Transform + transform: [ + `transform(mode)`, + `transform(matrix=[m11, m21, m12, m22, tX, tY])`, + `with transform(mode=None, matrix=None):`, + ` ... # drawing & transformation commands`, + ], + translate: [`translate(x, y)`], + rotate: [ + `rotate(amount) # amount to rotate (in default unit)`, + `rotate(percent=0.5) # 0 ... 1.0`, + `rotate(degrees=180) # 0 ... 360`, + `rotate(radians=pi) # 0 ... 2*pi` + ], + scale: [`scale(x, y=None)`], + skew: [`skew(x, y=None)`], + reset: [`reset()`], + pop: [`pop()`], + push: [`push()`], + + // Compositing + alpha: [`alpha(opacity)`], + blend: [`blend(mode)`], + shadow: [`shadow(color, blur=10, offset=(5,5))`], + clip: [`with clip(stencil, channel="alpha"):`], + mask: [`with mask(stencil, channel="alpha"):`], + noshadow: [`noshadow()`], + beginclip: [`beginclip(path)`], + endclip: [`endclip()`], + + // Typography + font: [`font(family, weight, size, italic=False, **options)`], + layout: [`layout(**options)`], + stylesheet: [ + `stylesheet("name", *font, **options) # define a style`, + `stylesheet("name") # retrieve a preexisting style`, + `stylesheet("name", None) # undefine a style` + ], + paginate: [ + `paginate(str, x, y, width, height, **options)`, + `paginate(x, y, width, height, str="", **options)`, + `paginate(x, y, width, height, xml="", **options)`, + `paginate(x, y, width, height, src="", **options)`, + `paginate(Text, folio=1, verso=None)` + ], + textpath: [`textpath(txt, x, y, width=None, height=1000000, **options)`], + align: [`align(style=LEFT)`], + fontsize: [`fontsize(size)`], + lineheight: [`lineheight(height=None)`], + textheight: [`textheight(txt, width=None, **options)`], + textmetrics: [`textmetrics(txt, width=None)`], + textwidth: [`textwidth(txt, width=None)`], + + // Misc (Utility & Entropy) + read: [`read(path, format=None, encoding='utf-8', cols=None, dict=dict)`], + measure: [ + `measure(grob)`, + `measure(image="path", width=None, height=None)`, + `measure("text", width=None, height=None, **fontstyle)` + ], + files: [`files(pattern, case=True)`], + fonts: [`fonts(like=None, western=True)`], + var: [ + `var(name, NUMBER, value=50, min=0, max=100, step=None, label=None)`, + `var(name, TEXT, value, label=None)`, + `var(name, BOOLEAN, value, label=None)`, + `var(name, BUTTON, value, color=None, label=None)` + ], + imagesize: [`imagesize(path)`], + open: [`open(path).read()`], + random: [`random(v1=None, v2=None)`], + choice: [`choice(sequence)`], + shuffled: [`shuffled(sequence)`], + ordered: [`ordered(list, *names, reverse=False)`], + grid: [`grid(cols, rows, colsize=1, rowsize=1)`], + autotext: [`autotext()`], + + // Objects: Drawing + Bezier: [`Bezier()`], + Curve: [`Curve()`], + Context: [`Context()`], + + // Objects: Line & Color + Color: [`Color()`], + Gradient: [`Gradient(*colors, steps=[0,1], angle=0)`], + Shadow: [`Shadow(color, blur=10, offset=(5,5))`], + + // Objects: Transform + Point: [`Point(x, y)`], + Size: [`Size(width, height)`], + Region: [ + `Region(x, y, w, h)`, + `Region(Point, Size)` + ], + Transform: [`Transform()`], + + // Objects: Typography + Text: [ + `Text(str, x, y, width=None, height=None, **options)`, + `Text(x, y, width=None, height=None, str="", **options)`, + `Text(x, y, width=None, height=None, xml="", **options)`, + `Text(x, y, width=None, height=None, src="", **options)` + ], + Font: [`Font(family, weight, size, italic=False, **options)`], + Family: [`Family(famname)`], +} diff --git a/app/Resources/ui/themes.json b/app/Resources/ui/themes.json index 352c99d5..db3d9fea 100644 --- a/app/Resources/ui/themes.json +++ b/app/Resources/ui/themes.json @@ -538,5 +538,17 @@ "dark": false, "theme": "Cloud9 Day", "module": "ace/theme/cloud9_day" + }, + "Samizdat": { + "colors": { + "background": "#090b10ff", + "color": "#ebdbb2ff", + "selection": "#569cd655", + "comment": "#a89984ff", + "error": "#f44747ff" + }, + "dark": true, + "theme": "Samizdat", + "module": "ace/theme/samizdat" } } \ No newline at end of file diff --git a/app/art/PlotDevice-app.icon/Assets/Image.svg b/app/art/PlotDevice-app.icon/Assets/Image.svg new file mode 100644 index 00000000..5e1ea198 --- /dev/null +++ b/app/art/PlotDevice-app.icon/Assets/Image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/art/PlotDevice-app.icon/icon.json b/app/art/PlotDevice-app.icon/icon.json new file mode 100644 index 00000000..a324604c --- /dev/null +++ b/app/art/PlotDevice-app.icon/icon.json @@ -0,0 +1,40 @@ +{ + "fill" : { + "solid" : "display-p3:0.19596,0.19617,0.11763,1.00000" + }, + "groups" : [ + { + "layers" : [ + { + "blend-mode" : "normal", + "fill" : "none", + "glass" : false, + "hidden" : false, + "image-name" : "Image.svg", + "name" : "Image", + "position" : { + "scale" : 1.6, + "translation-in-points" : [ + 0, + 0 + ] + } + } + ], + "shadow" : { + "kind" : "neutral", + "opacity" : 0.5 + }, + "translucency" : { + "enabled" : true, + "value" : 0.5 + } + } + ], + "supported-platforms" : { + "circles" : [ + "watchOS" + ], + "squares" : "shared" + } +} \ No newline at end of file diff --git a/app/art/hero.ai b/app/art/hero.ai new file mode 100644 index 00000000..cec056e3 --- /dev/null +++ b/app/art/hero.ai @@ -0,0 +1,1972 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[26 0 R 27 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + hero + + + Adobe Illustrator 30.2 (Macintosh) + 2026-07-14T11:43:46-04:00 + 2026-07-14T11:43:46-04:00 + 2026-07-14T11:43:46-04:00 + + + + 248 + 256 + JPEG + /9j/4AAQSkZJRgABAgEAAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAAAAAAAEA AQAAAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAD4AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A5FpK6hpGoPLYXwh1aIKb MwGRZPUWRHHpsVVTVV+Gh+LoK1GYPJlT2PTv+cn/AMwW13StKms9MliuWso55zDOJW+sJGZG+GcI Gq5pRKe2XDKUU9T8v/8AORX5a3+i2l5qmojSL6dKzWMySuUYEq3F40ZWXkp4nw6gZYMoIWnoWi65 pOuabDqWk3Ud5YzjlFPGag1FaEHcH2O+TBtCOwq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq+GfMvkPz55WuTpFzpT3MsEsgjuUtBdRyQ0Qo0UjRv8BJY07G tRWuYUokNgpbrV2ovRd6lz03UrKPT1kmgs4XleWS0WQO6OYDG6GM1YHfbYEElJRSV3ml6NqC2Z02 a8llMJ5WqWiF/wC9kJZEW4b4fbt8sGykMh0m+/Mvy9pF3J5ZbVLSGeW0RlihkViY4JEYtFRwpPBd x1FN9tpgkckFnnkb/nIHzX5ZkisvO0F1qUNxaSXIaRRHdxyRyS9A/AMjJGBQ9Oo75OOUjminpfkj /nIzyP5q1VdM9K50ueZ0itpLwRiOSV+RWPkjtxZuO1ep260yyOUFaeqZYh2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV8u/wDOWOnCfzbpFw11FAi6eEIkEpNTNIR/ dpJSvavvmPm5pDyvVtS/3EEPFFf2kX6PhtpXEoUGO0dJFRlaJ+IdT8LdKk0HI1qLK6QMb2VzHbHi llKtpcUC+o0TL++HcyuGH3H2puFBVdCRo7K4WGSO6hlurWO7hAfi0TCYEMGVDTuCu6kV2IBxCSVm jazaxQ3UVzp8M9osbOIyZ6o8hWFnSkqmvF9xUBqCvQEAFSEdpNrHLrVhZLbWll6t1ayxSwzMefIg x81mlkYBlk7AEd8kOaKQvly5v9CvLy40+/EGsJCgsTD6iyeqlxDJRSyBTVEbavxdN60xBpFPVbL/ AJyn/MI6rY2MthpUkUzWySyejcCQiUIXIIn4g/Ef2ae2WDMUU9d0X/nIf8s7zR7K91HUhpV3dR85 LGZJXZCGKMOUaMrLyQ0Pcdh0y0ZRS09A0nWNM1iwi1DTLlLuzmr6c0ZqCVPFh7EEUIO4yYNoRmFX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXg3/OR3kXzFqGo2fmjToPrljaWE 9neW6L6jq3GSSJzGQQ682X5NT6KMsTzZRLwSyj8w22lTQ3lpPaWtxeWsbH0Db7ssw5KwVPiH+e2U C2RpQs5dBui8FzqF5JIIZhb3Etsn7usTVDMLh2MfelDQ7juGQQpCBsbuy05iiXLiWO6gmMnFQAIC 6sFaN5OVfUr4bY2ikNZ6s8aziSOFxJHwCGGMBvjUkEqqsPhB3BBHY1xtd00tNQ8ux+YtN1Bri5jh tns2kT0VkCiBYww5iRC1OB3CfRjtaeJLZNVeGOCKFoZPSQqzyQRSGvNiKNKhanGlMFpCbSa9pt7K l7dSm0v4hD++trK3lMrKgrIQzQhHRloSD8WxpUEsbRSF1c+VriOzNreXSiKExyRNaoOLeq8m1Zz8 J57bnGwghM9L/MbzD5esdSg8vazc2X128iuUjj+EceMokqp5KrVMdaHeg8MImRyQQ9G/L3/nJ7Vd GhW381GbW7YxMxnXiLpJ/Vai1PFHT0+PXp49ssjmrminoukf85WflveM4vor7TFUVV5YRKp6bfuW kYHfwywZgtJl/wBDN/k//wBXWb/pEuP+aMfGitO/6Gb/ACf/AOrrN/0iXH/NGPjRWnf9DN/k/wD9 XWb/AKRLj/mjHxorTv8AoZv8n/8Aq6zf9Ilx/wA0Y+NFad/0M3+T/wD1dZv+kS4/5ox8aK07/oZv 8n/+rrN/0iXH/NGPjRWl8X/OS35RSypEmqTF5GCqPqlwN2NB+xh8WK09RyxDsVdirsVdirsVdirs VdirsVdirsVYf+cFt9a/LPzDb+rHCZbUqJZTxjBLLTk1DQe+RnyV8aaJaT2cklrb3Mct4LqBp7VV lV/Sh9QShkmjj5cS4JXcihNPhJGIyQdlqunyzPGdItYQ0M1ZYXuvUA9Jq8fUmlSvzU4Nk2kspQO4 QlkBIViKEiuxIqaZGmVu+XTFQFvEdyd8UU4gk9MIQQ47Adj3wLdOBPGp8cUgtgg4qTbiK0xSQ6gA NKmuKKaCeI2wsQFP0hXrjSbWtGwJHWmBVpBHXFLsVdiqJ0z/AI6Vp/xmj/4mMQr9Is2DW7FXYq7F XYq7FXYq7FXYq7FXYq7FUg8/eXLjzJ5N1fQraVYLi/t2ihlkBKB+q8qb0JFDkZCxSh8banoXnPR/ NcFjN61vc2LWcUiLOBweOKMHiVfxGxGYhBBbBSUXWp3xgS5vbu5jlkllgubQgvGWiCF+SM6ceXqU K02PSnQAlQGPTCJpZDH8MRZvTB68a7V3PbBaKWManb6cVLdaAfTgTdOB+Ek7b4rdu+EnxoMUlxBO wFMUENbAGpGKKcv2hvhUOLdRTBSeJskVO9MUhwAAG1a4opogkknG0ENOFNOhIwqVrRArUbYFWGNg CetOuKq+mf8AHStP+M0f/ExiEv0izYNbsVdirsVdirsVdirsVdirsVdirsVdir4v/PHT1g/N3VtQ kuohA11CxAErMpSGLkjUSgagrSvQ5iZPqSAw26vDa6NZx3dnb3376cQzymYVjEcAXi0UkXIdvi3F OO1KZDoytIZZFZ2cII1ZiVjSvFQTXiORZqD3JORSCtB69jivNxFTucVIcdlIAOK00ARWo7YUAOUn kN8FLbidiPnjTK13yO2KgNcR3J3xRTRqWNBhCCHHanY03wLdNg/DU+OKQXAjc+AxW7cQTQVxSQ6g ANKmoxRTcLPHMki7MjBlPXcGowsQH0Gf+crfN8OsT2cuj6fJDbPMrFfWR2EIY9S7AFuPhl/jFFPV 9P8A+cgvysuNMs7y61cafLdxCU2k8UxkT4ijKxRGU0ZCKg5YMkVp6BY31nf2sd3ZTJcW0orHNGQy mhodx4EUOWWhXxV2KuxV2KuxV2KuxV2KuxV2Kvlz/nIPyF5i0XzJqfm+0u6aVrfpIzrKIGiuU4KI 2qy8uSRsysPcH3xssSDbOJeWWuo662mxw3V7cSW3K7kV47gsVeGBJaLIrOBy40IPbenTKrKSxad2 lmeQliXYsS55MamtS21T4nI2pCnsFIrWuKKcoNfDbCocGNcFJ4ldLK8ki9RLeRozUhgjEU+dMmMc iLANMfEgNiRakV4sVK0I+gjIMgFvHuTTG0U5jU7YVLZNAMCbpwO1em+K3btjv1pikuPgBSuKCHbA Hcb4oppa8hhUO5dqYKTxL1JDjj9oEcR7/LFIZTrF7G2ralcXNLWeK7kilEdpA/Muz7sGMVCQpDeO SJQAo6hp+jXltYy2U10VSArJAtsrslZ5TWnr14VagO9O/ap2QQn0Pmv8y9Esmby5eaha6dfXlzcL HArlQX9NuLKVbg4r8Q+ncEEkEjkgvSfJX/ORWt6BbyWnnGC41OOOziuknUKl0rvIsbI4fgGU8wRX ce/ayOUjminp35f/AJ8eTvOd6lhAk+m3k7OlpFecB6zRKrOqMjMOQDjY9e2WRyAop6RliuxV2Kux V2KuxV2KuxV5H/zk7bQXX5eW1tLP6DS6lCIfhLl3EUzcFA/aKqaePQbkDKsvJIfL+k8LZWFjOt6k UN7JcxtGQOLWxC8kbqKp1HT2rmOEsbaQyTPJxC8iW4KKKKmtAPDIlIKwN02wUnibNaHfFNOoAffF AD1jyl5b1q88t2pgt6h4yykugqrs1Du1aZtsOthHFwkG6dVm0M5ZeIEVaQ/nPaWNv5ujks4hD9at UnuVUUrMZZFZiOxIQV+/NWQ7S2QXX5e/lffzGz0bzLHZywNGs9xd3EEqs3B2k9IMbRCv2GLcqCjA FmopnwR6FQVJ/wAu/wAvE8vyTr5gR7h1Dx6g93axpEzWlvLGjWa+rcSCSeWSMkUKcdxtUvAK5rdo R/yu8oRXFwj+dbC4iRjDHJySGjtCJVlYcpS0S1oeO5O2DgHepSXzl5G0XQNJhvLHzHa6tcS3LQSW EPpmWNVUnmzRTTxn7O4VjSo3wSiB1Vh4BANRTwyKhpSeQ3xpbcW64KZWu+R2xUBriNqk42imqFnp 09zhCCGU6vfiJr6S4tINQimuUks7mUzAPA3remVaKSKoFKfFuv2TSlBIrdLYVs77T5jGIrCQ2IrE Wf0aC+XdWcyMDtuGY+3hgpQUTa2k8Gg2UZaG+0+W/nS9iifkAHW2VH2oyspPwuOhPE7NxZrZJNqG lato7WOoQS6YhiEClWklmcLW4iHRGjaldyA2IKkL4bT6zOdLMNnp0sP1oIUuP3ZkeLgwkM0srL/d ih2A7+IKKb8tT+YvKWqzappF9HFq1mhpFC9ZPgkRpUeIgclCo3NfCtemIJHJFPYJP+cpvNUHmW90 6XR7GS1s5bpSVMySOtsHI+Iuygt6fXjlvjG0U9/8o+aNM81eXLHX9M5/Ur5C0ayDi6sjGN0YeKuh Xbbw2y+JsWhN8KuxV2KuxV2KsB/Oz8vb3z15KOl2EyxX9pcLfWiPskskcckfpM37PJZTQ+NO2QyR 4gkF8r2svmSLzVqQS+L8E1MR26XccrEi3nCqIRIxO/7PHMXe2dhg80rSzSSkAM7FiBU7k16kk/ec gkBTC0774saWkVJ2wquY0bbwwUm6eqeWvPGh3Hlew0u9dLW604MlZSOEiE7MrHv4jMfVCRiOHnbs OzJYxkJnVcPX3hh3ni7sLnXFms3jniEKAlCCpIZqg0x0wkI+rmjtEwOX0VVdHosGofl8/wBZaSfy qY+EjRrLp+oRop9Ug8Vh/fH1OYKfEwVR9lafFnAjydeQl1td+QmintbqTyyqwNata3JtdWImDCP1 gfSJkXj9X+LkN/UanGuCx5IpMI7n8tY79LpLryy/xPNyms9U9IzLK7LGYFH9zSYAV+0EUnfkuH0+ SoPTNa8gLH6+oweXDIyQwzWCWmos3KFJHaZJUdIw0nqmNqVHJVNKCuAV5Jtdql1+W0Fgw0y48tyX cMHOOY2urepI8Cq4T05VaLnK6lak8aHcdMTXkrzDWNQh1DUZbuGyt9Pjk48LS0DLEgVQvw82dt6V NWO+VkpAQHGu5NK4EU47k0wqWyaAfLAm6bUk0oN67d8VBtlNs+uLY2enXcc1pa3d4yBli9DhIyxq si8QnKlTVT9oeBoRIWpdp66VqGnapHLezmeG0Ux3EsKKOJu4Rwc+s37TbE9O+3RCkKukaVrFLK2s La7E9rcyzsXgaP1I5liR0WhcN8MRqD9oHCGKAs49Ut7PUnv7ApbG3VW5W4hrW4h6OEWh7j9RxVfd x6QfMGo/6TOshe8qDAnEHjJX4hLWg/1fowVuy4kTdL5hgt9Ins7YzSC25/XEtknYtHcypGwmKM3w oiBd9gBibSHa3fxfpi+u7k/Vrh7u6ilWK1hfmQ1HJJaJl5iSjD59OmJLEB9cfkPDaxflPoC2jO1u y3DoZFCsPUupXIIDP0LU65l4vpDE82fZNDsVdirsVdirsVfCGrRaJp/mrVZzeXDtO2oRRE26CLlc JLDu4mZgEaT4vgr7ZhGrZUw65MpuJTK5eXm3qOW5Vau55Amu/fIptaTQ+O2BN04HYdsVG7uI6nfF SGj4AbYqQ3QhTXr2woaUmv0YrbYap6YKTxONSDvtvimnUAPTfFADVCammFFOYmuxxpbbrQCuBILg dttt8V5uIr1OKkNqpYhF/aIA+n5YqQybRoFs73TVtby31DjdhrmGJZwPTZogOQljhJ3T9np12ybF bpWo6dcafrUbaZBaJ9TTlNbNcNIB9ctxsJppEIrvSgr0qOuOybaXTLQ+YgU1a0MpvPhjpcqeXq7L yaFUG/ctT3wVuniWz3/6Na0km02CW+kiZ7iWczhmb1ZIiGWOVEIZE+L4fi3rWuN0oCYalFYzalf3 sFrZ20RuZ7eYTTTo4duQb02LupqpqCV2OxBpViUUhtb0G1FjpMi6taegts8Yci4b4vrMz8SYopFD BXFRX8MSEEIfzDfcj6kkMdykl1cvbXDeoC0Lenw3VkqANvi3H2e1ACm6fSP/ADjf+ZdlqGnReR5b X6teabbC4s5I+TRywuVkkDcixV1ebxoR8syMU+jEvcMuQ7FXYq7FXYq7FXxt+cX5e615O1n0Yr6N rPUrq7vbWYzx27FJPS+B1d0+JGqKjbv3oMTJAgs4l5VL6glfmwaTkwduQcE1NTyBIb51ypkp8anf pjaCGm6ADfFBDgKKexwqG1JLfRgpN218O2Kbb+WK04LQ9dxjbGlpFa0HjhVcxocFJundhXFQXAKa mgO+KXEVp2AxQQ0RRadanFFOUHftthUNoauo2FT1OCk8TMNLfzJF5w0thJcs31izLyIzyIxb0+Z5 qWVw1TU1IOSF2u1IO81u8aGFrzULuSG9iLz2TlpYSFlZKENKv7UXIfynodsSVAVbnTbM6017YW93 d2q3RaRoisksTCSpWSNU+lfiAYdweQUopT1zT/MljHpsC/WTGLUmN4vVCMpuJSpGwI27EAjoQDiQ hV1+W2ltb03AaGT9Jy1eNAwcFSVYqWShp3HX57lKQaas7R5NHkfTnN2wsx6lq0QMgYXtFcRVkDrx ZhyH2dwaVHIUkFEwXWr2uiafaXMTWiXV9cJz+rojITHbhXUFVB6mo7/cQQTSl6P/AM40Xtjd/mRK 5lmnvhp0wWZ4Y4QYw8Q4vwkfkVoOJp02NRSk8J3RIPqnMpg7FXYq7FXYq7FXzv8A85Wabp97feXf rFzPHPHDdGO3t4Fnd15R8mAaWH7PcCppv0ByjN0SHzRcokU0kaFiqOyqZF4OQCaclBbifEVNMx2S mp2JrXAoLatU9MaTduO4G/hikhwFOg3xtFNKrbHCimidzvitlcxo3jtgTdNg7DtikbtUFSTvigho 1NABipDdCFNetdsUNAk1+WK22GBI2xpNuNSDvimm0Veag7CoqfbFADLptGsdJ8yWV1LrFrJbW0tt JzRLrkywBCwA9Cgbb7JP4b5PkWNJbq928MWnpe2cNxcfViWlkMtSDPLQ1ikRWBG/L9qtanAU2q3V tp91+kXN5Dp5+tryjmE7KT+9+wYo5jT/AFsSEgqt3AttpdswaDU7KK1LKy+sIxK1269CIJVJUnwD U78dkrzbtdRtr/TrTTZLC2Vprlkt5Ga5orBUVVakpbj8f0YgqQirHSNO1Ox1CO21KxhuIbVVWFFv eDRm6ibb1IWfnzagUV5V26bkboIQVkkdpHYxW13BqKpdNJdRxCYKEkMKoWEqQt9pDuvTbffFAT78 ovzDtfKHmeXXG0qJoIbYx3KwtN6npSzxIxT1JHXkK1AI36VHXDCVG1Jt9tWl1Dd2sN1CSYbiNZYy RQlXAYbfI5mMVXFXYq7FXYq7FXkP/ORH5dXPmPQk8wWdwqXHl+1vJJbeQhUkgeElyHP2WThXfYjK ssLFpBfHrCjlSRVSQSCCKjwI2OYjYStNSMVpwAU96+GKAFoXoabYWLZJBpgpPE2SK7+GLIFw6bYq 7jvU9MbQQ01KAdcUEOAop7GuKhwJJ+g40m7b+E4pJceh7dcVpwWhrXfG2NLSKk7fhhVcTRt9xgpN 0zDVmni/SMunXTQc7i0DKZhC6/uJKqTVOQ6bj7skVDcuveYINJs0mv7v0o7VpY5ILplJf626MvqK XVhRwSO21KVNWzSoS3fTNXs7gTRXDam80RVvXStwxWXZmMR/enx/a/1vtINoIVLWLVPqc82lJc2E llZmNuUhjf0zcrIz+qBCKfHQj6d96Fadp1/qc0+lrqcz38YvgOTTiZomYx8Cr1k4cuLbH7VD4VCg ILRZNNktdWhpJbGazVRNI4kQEXUDDkFRTQlaV3p4YAE8VouCbzLB5oV4HuwVvPgaMuykepTYiqsp H0EY72y2pSvNYuJIYGvL+7lt72L1JbJ2aaIUkZKAvID1j5LtUe+JKAH3f5c4f4e0vhXh9Ug48utP TWlaZmjk1phhV2KuxV2KuxVj35irC/5feZ0mcxwtpN8JJFXmVU2z1YLVeVB2rkZcir4ei8pXE6n6 lFe3Rcf6PL9VpA5r/v1HlG42Hv1pmHTINXHkzW7bUb2GbT72K0tPrJ+sPBIopAjspZivHcoMeFbQ xtfLqwW8k15eRSzRl3jS2ilUEOybOZ4ifs/y4KDLiRN75VvODS6XBcX0H1meFXijaSiRcOPPgPhf 4zyH3bb4kKEMdGtbeeeDUjc2ckEMUzr6Qd/3gT4TG7w03k616YrSJOh6FPp0NzZ3l3JM0ksckBto +ZEYRuSKJjUASb7179K4dkEN/wCEruexuLqwt7u4SERBF9FhIHY0cSIvKgrutCRTvUEB4VtQtdB9 JkTV47qyMiXLisdHAt4vUVhHJw5Amo+0MaUFyaTpVzYTS6fdTzXkcsUccE0KQhxIshIQrLNyf92O I2r0FTQY0m7ai0CY6hcwTxTpb26XL+oVK1+rxPItSRT4igGCklXg0XQf0hbwT6hJGlwIiUERLqs6 Ky714krzHz9sOyKQT6ZZRXAiN0zB1LW83ALFJUEIwcuaKWFDUbdGoQaLGkTP5Yuo9atLH0Z/RnW0 aSTgaqbmKOSTelPhMhAx4U2oiy0Z7KG4a9e3kdmR4njMm6KhJVkpUHl3A8Pcik3TeoaNHbWb3UUp mh5W6xSqKK3rRNIwYEVVlKjb9exxIUbrodHsXhtPUuDBPdWz3KyygtCpilmRlYRqziqQ1BAO+1KG qoUhM720t9Q0i6uI9Rtpbz17c3KRpcKpCRTDmoaFNyN2VRtSvTYSQQg1lKaQ6xMl1BBaiO4T4+PM 3fNTQhGG0mzD3GBeSr5Xn0+W4iiuIFg5X1p6dxEXYo4MlOSu7BkPQ03HUVpxZC2p6dYRR2+oPaap bzXAt19NIhcI9RcwkUaSKNf+GxASZIvQ9QhtvNGmw/o63PrTWq3Ab1xy9Uxs4KLKqj4jUUA4mlKU GIO6a2Ww22hKvqG4tbGz1GLeGT641ykYl/mRJom4yRbHbkB0WuyxAUL7SrW08wNOdTtngF00iOq3 HxKslT1i2PiDhRSlq960cenreWUNxc/VyXlkMoZv9IloaxSIrVG/KnxdamuApt9hfkz+YcfmzRbu ya2+rXnl+UWM3E1jeNeSwutSWBKx/ED3+eZWOVsS9DyxDsVdirsVdiqB13SINZ0PUdHuGZLfUraa 0meOnNUnjMbFagioDbYCLCvh/wDMnyTN5R1+Py/e38DzWcHwygS/HHJNJJG1AjUJRxUV2OYc4Uab BJB+Z57i31B5bmBJLkXU4huSzhjEjKYqPG6huPIgHqPs/sgASUBdqIsrmC1kh061E0dpHNcq7yxq RJIaup9ZFHxvQr77bbA2ilDU9NNxo0V8s8SIbu4edORkMbSLD/voSfDXocHRSFtxcTR6ewkSK8s/ q0a2sx50BR4VljVlKMKPuUbpXkB8VWVukToMkEtnEyAWtwq6qYijMEJ+oL1LFip960whbQ1jNrS2 F24lF3GjRtcWzTLMrxBZC4aNXLED7R47rTkKcagC0khF6S2l2+u32nSQTS2UMeofu2mH+6raX4lp GtGISnXEc1IUhYW1xEbC2igtlunikjna7jrUKwj5RyMHAIl32r336FQAr2ra7aeZrsSXJ9Qrexxx eukhd5YJUiURhm582dQBQ1rh6oQN1cWT+YLNntnR2WyJWOQKgJhi2VWRyB/ssHVPEikm1KDy5afo jUWtoHvLtmj+tLbMD6VsKMC8YYjxH4dMd62SCq6zqt+qo2pSXM0kUVmIJ4rjizLJb1b95SVZFDoa Ed674kqFKV9C1SC3U2VwL5kkuHIu4Yll3KuzM8HEMFh5HoDv36mwghXFpqiaNeX2jXItVWazinVL 6ASRqkUqLzkjeMMr0G9BvtToSoIWXepXMltp8WqOdRCWNyrSidZXjlD3DlVmHqipjdaqa7Ee2JSN lHy6dNmMYgWW1kGo2JRpZFkVmHq0Wqxx8a+O+/Wg3AAW7VLLWvOcMV3KNXmmKQ1MaX4mJHqJy+BJ WYjjWu3TEEpNIiy1yEa7YW1+LzUIZXtXMc93yVWmCSBo+cTsjIW2NfY1BIJvdaQBt9CSGaOyilij vogkV1cXkDBUEqvVofShevKLi1G8SOW1RsgBGyz+cbHV7a3l1WSKKEWwaEagnHiI0qAgl3BHSg3y W6Eo1O4036vpxubSUTfV25iGVYkB+szA/A0UlN/enhTIpukXNPe236Rk0q/e2SS7XkouBA6n97VW +JOXsR19jsH3JCYvrnmL9ERG51O9K2tibiN4bpwWJvjCV9QF1IpID3pTtvhs0r3D/nFC9hvLHzLM I3W4M1r9YmeQOZSVlo7UVPj/AJm/a6nepN2A82Mg97y9i7FXYq7FXYq7FXyN/wA5GaWNU/NS8Fp9 YnuoLa2Sa2t4PVdR6YYOAHBKEPStNjseq1xcv1MgGEa3onmz6slxDpl1LaXN1czRK9q0npmT0yUZ XRuDePjSu+Qoqsvwi20kGpwvaTx6ZBV0iCuB9Zj+FoSYh16GoI3rXaiUgqGmQB7K2GlSSXE/O+Ag kiUPJW3j+FYw0ok3p8P4dcFJu18L+ZbCwvv0lpbRadJGnqrLZRwIWEqBSHMQAcVPE/gRUFFqaRtv H5ftdVvdKur64Z7VL+FZI7GGJEk+ryRSP8E9WUhf5a7DDtaKS208u6kIv9xcV/LOZI5ba4W2Kxkx 8qenLG8oJPL4T098aQmNxbeaLbXtUnuNJeO0UX/qSvYrGvAxSjeURowDVpXlhoraThdHOsWbGa4j Y/VSIhCjgfAlBz9VK/PiMjTLiR97Ya2bcyWFmb5DeXSeulstyAg9NlWrI5WjO3w+NcTahEanezy3 U1zqlLS8sobNp5BY28kzvJChBdZPSIcHvX6PEkopBXdroV7otqtjPdF47i4eWEWqcqukAJRROfh+ Dx2+WO1KQqTWuuPYSNp1nNdW/K1QJJaiVlaK3aJiY2WUIW4A1HUU322UKYW4jlt4tVtHs5/qF2yE QLA3HhcDeMCIEe+KQXeXoYpdLnSzlZ5DqNgDFIgTmGjulZFAZw3JSQVPUbb1pgASTaH0q81e0llM 1mhtmhl9ZJLWMIaRNxNTHsa9D9HQkYASkhMdNOnDVbG2ubyNUmmtZ1jitFjZXYB46tEqhuIkoa7b n55K0UkcVrb2sssUd0wmmQfVZyojiYiRXVhJzPGvCgJGx+1x3oGNJt/uXXzPpxks6KpsPUrbItKR RcqkICKfhhrdbSe/Szlis3jmS2BhNYZBI3E+tJXiVV6r4V3/AFmNMgaTfzDF6S3U8scd1Gs1vHbS kvxUPC7SIOJRgeSqeLdOo+1UkqFlzdw3um2XqCC1nhtS4uHi9VWT61InF+SyyVFdiPp9m1IUbiwt b7Tbm4hvrdrr1Y5LqJFnANFkLSoDEPmyjp1Hw7KoIVrWUpoF6sbJdW8Fgsc4+PgJDqMbr14OPhfr tXp2wo5M7/IH8z08qa1Dp0tijaf5guktZ2hL+pHKvBYHHN2BWsxDDw37UM8c6Knd9f5lMXYq7FXY q7FXYq+ev+ckfy0iA1DzzDfLClxBBaX8E4cgMs0SxPH6auaEJRhTrv8AKjLDqyiXhdta8dF09Y5o r21e/uEuo09QDi6Ww3V1ifb+Zem2++UVsyu1PRtYsPqmowXOl2z2voBuPK5qrGeIVH78HwJAIrTE FSFeOGxubltKLWWmzQfWlQxNdGIyvEUcStN6vEfuxRgaDv1qpRSWW9lLp8l2kd1FJeBDEbZVlD1W RS6sssaA/Cpqv4YEBONR1KxbzhrUT6Xbj95qQaaN7gS7JNUgtK8YY/6hHthPNNpFfW1p6dpwvYyn okryWVWoZZD8QCMAR3oSPc9ciQyBTfzXLJb6pcXksSyXT3916VwWcExoyPEyvG68v7zZvCnhhkgB qW+spZo7qHSrL65bxwSziR7iNT8CUdKTxoBUgFPpG1QptFKGq6b6+jw3yzxLE95ctIvIyGNpEhPF jEHHY0Pf57Y9FIRctyiaRdNcxLfWYt7JLaQMygGNVSRVYANQOD8JGx325bq8kPpkllPDG9qhsZ0S /KAyFlY/VB0c04MPc0+XcLbVjPrCaNfO0gvIVmg+sWzTLMrxcJuQZFctQbGo3WnIEUriLSSv0SXS YdWu7Ga3mltEivtmlUsvp20vxLRE3IWh33+4hB3UhEWNtDzi0+KK3tI7i5tboTtdxkngG9KqSMrq rJOT9mvTCikBYR+ZLTUzE85NwscyiA3EcvMtCwVBHzcSB60C0IaveuO6EUl1obeZNOL2M6zMbA/u rlViUmOIgKjwyPxHu5PvjtaeJDQTatBpcI0rUmt7Z5pW4fW1tjUrGPiRnTcU64N0ghHapqWoLAJt UluZri3WzSC4guuLOksDN8UoEyycGiopG43BOwASVAW30fl/ULfTpvqc63s1s8roLuGCNgs8ys1X g4hvgLN0HgMOyCFWZdWOn3+oaVdraetcWwnjivoQyBI5VHN0dAymoodt+3ioIUbnUJm02NdZ56lG toQZo7hWlWQXleAuKTr9lkJUg9ulcSo2d5WbRp9V04WcU9pIupWRrcTpMrEO1FqkUPD57/R1xFJu 1XS9c8520GozjVZrjhbVMS3ouKr68XOqJKzceFant4jACUmkx8m6xDd+ffL1jdi8u47nUbDgLi79 URPNLGVdA0XIFC38242OGJ3C1s+38zWt2KuxV2KuxV2KvNv+ciIrWX8q9SjunMcTS2w5jYBvXTjy NGoK9TQ5Xl+lIfLOl6DrTraW1pp97bXFldPcI7KzLKsojRxHKiItQIajqHBNDWgbGAZJTYyatHa6 i18k8kBt1BSfnxJ+sRdC3RqVoRgQvuF0xvMuoB55kBku+dIlbiOMlafvF5U+jGt2XEjNR0vzAtrp MlnaNer9UqL2C3+sK/C4mWMiUoW+GNVUA7qAFIFKYkFRTtd1CX9L31xeXdzbzteXMUkSIJEfi3xc 0eSMDkHoy0IOJKgLNQ8uWt5HZvpLXV0fq6vLaRW/OWMO7Ny4iViY6tQNvTo3VSxpBCI17R/Mlvp9 q6WVxLbT3N1LbiW2LFFcRHiUdW9Ng1eQ79RUUJSCi0vuTF/pMWoxvazJaQfHHCoYisPwtGTENj3r 7b7UBSCj9AtY5rWFdNd7qWmp/wCiywqGkIs0ZeMYaZZOLqp49e9DQkEBbtSM3mXT9GuV1HTWhsJp oVlSSyjhUnjIQQTEBzFNj/DbBuk0vsl0Yahc6bd3UimGO9RJ47SJFRxA6OxEctWRgu+1dhTuCRS0 ssPLurC3aHSoL6W5kljnt5jbFY29JZBSOSN5lYv6nw9j47jGmKrbnW4tbv3utOC2qw6hzZ7NIlI+ rzUBkVEYV6VDA4VtBTLo51yyJnuI2KWREfopIB+5ioOfqx1+fAfLI1uy4l0dn5iOm27Wdm1/Eski RXKWq3I4AIyhXaNyACx+Hscd1CL1rVrv659ZvFS21G3W0E0n1O3aRpHt1fk4dUKupQ1PfbYEEkko pAT6fpF1YWz201xzYyTSW0durlAxEdVrMCVrGfl0PYkbKQiZotWg0aZ7aB5rZprRY/WtlcgpBIj/ AASLIEY8R0+/Chq7kV7fS1v4jbzjTrlleKJYzT1rocTEPTX3BH49kpBU/LdvDMojtZGlL31mskUi BOaMJlZQAz8qqTUeGABJNrNNv9Xs7a/9e0U2bxL68UltGEJEqBW3joGXkeJ/gSCglJCP0hobfzJp kN5cW4hNxZXSmGD0pFD8JY+QjjVWPGShHIjwOEHdjSTWsUFm9zDFcSLczxKttIVWNOQljlVhIHal fT2Pj1pgRSLs9b1PT/Num3UaxRXdpPZypW3hUrJGI2Hw8BSjDph6rb7R/Krz03nfyZaa7LbC1uXZ 4bqJTVPViNGZK78W6gHp0365lQlYtBZdk0OxV2KuxV2Ksc/MLyZbec/KN95enna2F0FaK4QVKSxu HQlT9peS/EPDwyMo2KUPijU9CTTvOl3p8+o2pubPUpLeVVFwRzinKMATEB1GYZju2cSlcaiunfU5 J9Mtri+liMk9zM1xycmWSOp9KaONgyKKnj8XU1rjdJATDVpdLe+v71LKxs1NzPbyGRr4vzbkHKcH lX4lNd12PbCSxpA65penvZ6XJa6nA9rHbNHydbgMrm4mk4tSI9m2PehpiUEN6xqcaVlnsrfUIp7m 4ktJpjOKwtwK8TDJDXw+KpWnHalMSm6XTTWd9FeH91pxj0+3QRj1mi4mWBtj++krVu9cBUFZa24i 0eIo8OoWiy3clxEvqhKpDEyFgwhkA5CnJfGlfi3a2Tdu07W9Ne2u7e50e0MAiBRg14ShMsf/AC8V 4+IxBUhH2UFm2pTaTK1lpc9rHqEfGM3TReq9s8UgkeX1qU4D4gabe9QRzRSTLZGxt7iOC9gubpZF MtqiTq3CNZBJyWaKIGldxWvftgQEfLqVi/mPU4m0y3jB+vhponuBLtFLUjnLIlT7ph6ptAm2tRrV nxvYyv8AohUMsoanpx9QEYV+k/PI1um0Zq0kdlcPcX1oZb/65cIJhKUPGP03RgyVDV9TZgdxTCVA V9RvdPe6ivbbSbMTQx2hkWeWdByNujoVIniSnw040H9DaKQNx5eaXSIbu3urdbX15VYSTKXjdkjI RylV/ZPE/tDwNQBWyCFXULqKK0KXUKX1ui2ccEquwAMduyOFdeqhlOx/Cu6U3TrKSyme2ktFNjcJ Y3ZRTISrDhONnNODDruaEeBHxK2iNHGpy6FeJNJ9btzf2C3EXrCUemyXKsSFZiNyN+x3xF0klC6T qXl0M9vJYXTwNHMw53KP6bek3J0VYYjUqKEcgD36AhBCkI7SrGD6/aWkUdvZiS6tblJjdxtzC1Mf wOyyKHWWoqtelR4FFIOGy8z2L3cclyjXAjMf1cXlvOzHmpZPSWSTnVAfh4mox3QETJc6GfM+l87K 4ExTTd47lVjBNvDTijQu1B7uT747WniQfrazb2loml6o0Nq0bMFF2tsamV68o2kT4ux/AnBukEJt r2qS/WLqfVWu55beSCKCe2uhEzpJG5+Nyk6ycGiopG/UEmgAJKgPpn/nHG5srj8tIZbS3a2ja7uO UbushLchVqqkSivgFzIxfSwlzeoZah2KuxV2KuxV2KviLz1plm/5i+Yr20t5rkxazeGci4iThKt0 5IaNo68SRVfi3HeoNMOXMsgEh1a38w6db6bBFePDD9WYpxuREprcSmoXmPpwKv1+5tpLW8e4hLOd SkIkidUEilSUc/C4JKn7Q+1161JSkGlK2jDaU82nPIs4saNADWVf9OA5IyheQI60FR8t8CQUVb3u tR6DYWtxLdRQ3N/cI0nKRXRmjtwjqSRXv8J2YV6GhCLpShtPm06/ttRS8uJpLk26hLmXjHUfWIqL I5aXatAGI277dEFSERYaDroi9C10y+tri2W7kQskjF/Vt+BVHVE3Hp7D9qu3YE0WKVWr6tHBetfx Ty23ogOs/Om80e6s1eLeB/WKjAoTK+TTm866yHnlSs2pBj6SkLVJq/7sqafLCRuniQ91a+YYvqck EDXLLEpS8ihE3II7CNll4MfhRVA3qKU2pTAbZCkd5iu1XWL+6nup4C99eW728aCWNhGw5VVpIwoZ ZaFf1dASUAKd3oNvJqdvc6Sbq99OK0mltIrcPLHWCNxULIx4EH7XY7HtVY0qa9o/mO2srdlsZ5IL i5uprf1LYswRxEeJV1YxsGryXx3FQQSkLaC1Y25heO/R7WaNbEM0US1J+qn4WjLRAU33+imApBVt EtUkteWmTNcyBb31bSaJQ0gFurKVj5TLKFkVWK9QaNTYkICbtpLrVrbQ7pdQsVjtnubcUazijoSk 3xITGByFMbNKVXS49Gn1GawubuSN4oLxI7gWkaInGCUvyEctSnU/ZrX6akKQi9A8v6tF/omnW989 1JeWtzDK1sUidYBKrLHLG8yPzWeq78WAoCSQCQGKTWv6djkke700JbrDN6pazSEU9JtjIsaMtfYj Atq6LpB8yaafXuEf/QOMfoo4H7qKgL+qlfnx+jBW7LiddLq1vpmmvbwpckiQLdCBJ+SI/wC74u6M 1FGwHVehApTE2oVtR1i7lk/SF16cF7bfVEkkWztmdnaDkjEMqcWX0qfdt4pKKQup6Zo0lhYXsVxO iPbl5LdYFcxD6xKnKrTA8CwoOtNgxqQWdlIVXk1I6ReTWSfWrKa9jeDnCk3EskxdSjrJwYfDX+I3 wq9r/wCccfzC1W31Ow8k3togt9Qt57yCRY1gaKVJJS/JFVQVdIh2qD88txS6MS+j8yEOxV2KuxV2 KuxV8nf85H/lzp3lzWTrVreCOHzLdSXUtvMHYpcJyaYqyq3wu09QD037UzFywrdnGTzmGCOPRPrE kcWoW1vYeoqMZQiynUDGC3ExSD4JGpvQ+9MrrZPNfYazbXmnW2lvp1pD69wy201JpQklECBvVkkP psZDXjuPtCu6sgqQvs7HT9W0/UI472ztryC1VVWNLlYXjN1EehiJEnNqDjXlXoCPiI3QQg9PVbT6 jFbXUF+YrpnuoUWYKY5PRADCVIWO8fVfs7GoxQo6bqOmT2+oxzabFbRG2XnNbNOZV/0iEVUTTSIa HehAr0qOuDZNoq80yy/T2ouusWhkL3hEPG6DVKybVMAQH/ZU98a3TxLLnUI9MTTppNLtp76aB5bm ec3HJ29eaL4ljmjjIZEAPw/FvWtcbpQEx1m+0Z9Yvb5bSytGuLi6iuFka+L8mJWUxsjzJRlk+Hku x2oaVJJQAlureXLGOKzkTWbQW7w1iaRLvlRpHcBgkDgGjeONIIXapqSRWUTXNjb6gsl1ctbTzGcV i4w8OJhkh5Cm3xVIpx2pTFNqmqJp95cXD+rDprfo6x5RuJ3ioYbYjgVWeT2Ib7/AEKC1Z2kcWlRK ssGp2Qe9luI09YJyito3j5B1gkFGX7S+PGvxUxpN2p2mt6ZJpk1vdaPaekssYhfleH02YSGppcci vXYeNRvsUFSERZWthc30tgXs9MuIIrxRHGbpoi5gdH5tL6xFOPUGm2EIpARWwsLC7hgvILy4Msbz WiLOCYollEvNZY4a8S4qFPIfa241AQEXZ6jYy69fxNpkEIMOoVnha49QAW0xJX1JZE391wptZJpc b61Yul9bcSllxDuUeghi6qRtgrdNoZrqO0WOa9tPWv8A1HVpxKV5BVRlY8aq/IP9obMN9+pFqAml 9dWhuYtSs9Js1Nsllz9aadeMjW6vHxPrxoR+7O3HtkrRSE1HQvV0XTpoLq3WBTKrCSVSyM7kqrlO S78W4n9qh8CA1sgh11cxw6XMl5Al7Ej2KQyrIQCEglU8XX7SgqR7Ypul6PBdjTDZUsLiOwuRGrzB UYGS5rSVyoVhU/aNCPfqFBVNOsdVksXhu5Vu7WW9s47hY7mK54xv6qFiI3k4bsKMe9MQCklm3/OO V9pLfmfpttb2lwjGO6aN5rhJVQ+g3IhVhiPxAUPxfqGTxH1LIbPr7MtrdirsVdirsVdirwb/AJyq tbO7tPLFtNHLLczT3KWiRSLGGkIiHAlkk3ao4+/XrUU5uiQ8G02CaXTtQOlyi2uLXT/TWM3cJkKf XY5mkEimMbBm5CgoN996UBlSjp0+pC40tdQl+ux/Xl5D6ws5TkY+BDK0nAniaV674oCD0qfSXtNW hSKa2M1oqGeSVZVX/SoGFUWJGpVRUg7DsemAJu0ZFe+YovMirDqEnw3fFI47tWJHqU4hFc1r040x 3tO1Ia51iREtnumuLmO7iMk9q859E0ldCvFlY/7rqN6jt0xtQEXq1pp36Yvrqzs7yaGSe4ieRZFc xyPyVgyCEVpy5L8Q5DuDUAlFKesDX7Oz0eGK9eGMWbFQLj0gQbqcg8WZCNqdR7YoUPMd1aSTytNA xkN7dfvInWNXU+mVbjwcVI7jr19yCm6RBZ5rad9PMiyQ6fboYQ1ZQfViYMvELyHFyKgbd+1VIKvF e6zF5Zs4bma6hje6v39TlIrqY7e3deJJWvQ/D0Pz3DZpSg7SbTtSiu0vLiaW99FVhupisQYCWMLH NIzS+wRz9nox40KoKkIrStK1ZVMFtYXltPbR30lHVyzGW14UUqibgx9O+EISuKXVI9PuP0hFPNbm SLmk3PZaOOSMwPBgSKN9BqCQQgIv09NbzTqKtcSJyN+CzRAqtYpdzRyaD2GNbp4l8Frrser2TQWr TRobUpcxwLKDRE+JZeDV+/bHe2QpdqF9xupr24uriB5bi5t5rZE9SNuIAkqrSxcA6y0KjpvSmwCS gBu/0q0fUba/05rq6ijjtGeBIA8kZWCMqr8ZP2gNmpT7sKKQ93pPmK3061SOzmngMkxgd7YvRSIz xo6sU+Imq+O/epaQSitTNs2k3SXyyWs0b6WshiiUkn6lLQNEWiCkb7g/R3xKQVml2yuIjpsrXJ+p XIltJYV5OF9Z0PpcpVkCyKDTsQDTwFJu0RZvqg8v3NvqNmsMU2oWccTPaRR8WeO4BdP3agn4RUdx 9+IulKC099DvZRb3F5NEywzLBN9ViREBjclWCS/ZqSenXEEKQjfL2j3EV/Da2X1k3hvLaZRJD6Su kfNXWN0eVXLLLUDow2FSQCQxXeUvM3m/ypq36ft7FYJ7FeStJZRxoQ7rG6MyxoQHRmXY18MIJG6v t3y3rA1vy7pesiL0BqdnBeCEnlw+sRLJx5UFePKlaZlg2LYpjhV2KuxV2KuxViP5ifl1p/nK305p pWt7/SLpLuwnFStVZS8br3VwgFeoO/iDCcLSC+f7v/nGHz/o2k6je2l7aX90kAMNtatKszMk0cv7 vkiDkBGaCvXplHgkMjJ51o+qy2vmnTrVrC1RnmtY7lGh4klzGZAygrQ8t9gKHpSmVg7sq2QvCy4L Kby1tbS/iq1rJFIswQSEECSCBxtJFVTXem47YsQHX2l6Taa41z+lFkh+stIjiGTieMlSD3BHcU/h hNIpS1XUrq2h06K5tbeab6sS0ksYdmBuJaNzU0YEbhu/WpxTaYa3Fp13b3z/AFiLTmGpy+okwmZG ah3jMSSsK9w3TsewSFBpCrBHb6YZW9DVLOC15p/fCNZmuuG/9xKpKMfANTvx2Ceautzpeo6Lp8E9 hbW0sl1cQ29yGuSqEJb8VkBlkYoefbcdh1BQdlIVLTR9O1Cy1FbfVbJbxLWNBHGt7xdFnhC/3kFe YoFAFeVRtX7RCCEPZyRWulRW1tcQ6iIGvp7uJFmEfpzW8apyEiwv9qE7r023BOKEDY6hpc8V5FNp 0VrG0IDT2zTmVP30dCFmmkRqHqu1elR1wbJtMpNNtF8x6lJFq9o03+nlIVF0j8jFLtyeFIxTxLU9 8a3TxIE6rHYG3aXSbWW7ZGM8kxuVZm9R0IdI5o03C0I474LSAml5Jor6hPqKx2dlHcTXME0UrXpk DEcZvSdPrCUKy1UuuxNCGpVpEsQFDUfL+n2erWtz+nLRrTjbSROY7sMUEUbAMqwOFfiQePLvjSKU tU1NI7OM3Nhb33O7umhmmM4JjKwlKGGWLkKHvU9u2KbXapHpd7bNIJotLl42HqRSCd4T/op4mIqs 8g22IfwryNaKCFBb0qwhFsqGWHUrELfTyrH6yp6kFp6sfIMsMg+JBuvY0r1xATdtW2tafceX7m0u dNtYolubf0ZVa6PpsUnPxVmZim52HSpYAmoKDspCL0/Rra6uJLc3NlZ3dtbXcaRxyyOjL6MpYEH1 XDKWJ22I9+pCKQOjwrY1ht7yC9lkurdpraNZxWKP1BJzEscVaF1Pw7j7W1KhQEFY6lp807RNpkFu rQzVmga4Mi/um3USzOh+RH3dcCbTKLS1PmPTJEvrUj/QCoMhVjSKL9lgCK++NbptDzzwWMFnd3dn 62oTep603qFeXE8QSFqr81O5/a6mtSS2oD7f/LySOT8v/LMkcYhjfSbFkiUkhFNshCgnc06b5mQ5 BgWQZJDsVdirsVdirsVdirTKrKVYAqRQg7gg4q8g8yf84w+RNZ1I3kNzd6ZEQQtlamL0U5O0jcA6 MVBZztWg7bZScILISeV+efyI/MHy/ql6nlhLnVNOvZkngntm4SKKSco5lBXdSw36H7wK5YyOSQQx LXdP806RZR2PmmC+tp7Ow+tQK8jRS1e+MRUSESBkKy8qUND0pVqwII5p6pS99pWq6XBbPaTm9kuG 4S/WUDTMqKoDkw05nnse/fffBaCG9PtLqSxv5NJk+ry2tlxZPrcPqCP63G5f1FMYp8VCKCm3XsQt NW17fLa6fDqUn6Qi+uuWAuFmaMsIvTZZFMvAng2x+0AdttlAQektpU1lrEccc1sxtF/eyyrKo/0u 3pVVjjPXvU/I4AE3aYNf+ZIPMt6bXUJA8cl36Ecd0GNQsnFVjDknw40x3tOyEuPMty6wm+ku723u E5y2c10zw/bZCFDq5H2aqa1HjjxKAiNSg06PXL64tLS7mjlluoWkWRZDG0gaN+UYiWvEPUfGOXiN 6EsaQupJ5lsY7K3+uyQoLcNGv1n0wUMj8CFZkYArTYgEdMVLtduLVoA09u3q/XrzkY3WME0h34lG p9GApukRqCTF5pdOkk5HT7DnApPqKRDbhW+GnNeJPxAbbg0qOSUgqtnqOvx6Nb2s95e20ZkvZVcP KrL6MEctFBZag0O2IJpSgvrGn6jYXH124nnvTLCI7mUrHzokgCSyM0vbZWPTofh3VBUhMNA0nVYp Jlgsry1lt7XUmkSRXDHnZOvwsETcMn2ev40ICEqhl1CPSLoajHNLC1xb1SbkCF4TAsjMDxIJG/37 bYOiAvtn02PX70meUFkvo6tEOIMkEqVJDsaDl2GNbsuJGLb69DrljJbWrMqizdbmOBZKt6UZZxKF avxVPKuO9pFKL620kKzXk7xGVnhntUt43jbiF5/twsnIPSi9OxG1G0AIi70u1GrWep6abq8toUs3 aFIA8sZSGNgkvF9uQX4WpQ/MMAWNKeqaX5hg0nS40s5Z4wJ/TZrb1KKZK0+NGK/6uNbLb6O/5x0/ MLWtYt7jypq0ID6HaWptZwojYQmNU9F4wAPg7Hw2OX4pXsgvasuQ7FXYq7FXYq7FXYq7FXYq7FUq 8x+VfLvmSxNjrlhHfWx/ZkqGHxK/wupV1qyLWh3pgMQeagvP/M//ADjt5GvbC3GgWq6NqNncLcwT K0skbkFecciuz/CwUbjcH6QaziHRPE8ou/8AnGnz75f0PWL62urXUbk2qrDa2Zl9clLiGYlOaICQ sRoAantlXgkBkZPNtL1VrfzK9r9QtQiySxSI0NKhKkBhUdGUH2IqN8rB3ZVsholtRAGkvrW1tNRi +O3eGRZhGJf54IGXaSGo33puBixpU1jTdMtddv5TqSuJZLoREQycSX5p9rtRm32wlFJbqt1KptRd 20ctx6PxyOXDN+9ejEo6q3Ib8v2utTWuBNphrtvp91cXL/W4rBhfXfKOYTMpNU3QxpMaePL8cSEg 028UdvFdO6wapZw2tvJF/fiNZj6EZO3oSqSjH2b347K80T9Z0zUvL1ilxZW1pKLi8WK5rcsipDDb uRIPUkkI4nYipFAKUw3spCz9G2GpwXJTV7EXi28USxIl7xeOJo0SnKCvJVQLT9r59VBClpgW1szD b3MOoRxpfS3ccYmCBXtQsZYSJC/2kI5L0rSo5bqEvtrzTprC4jns47eNpYh60BlLoeMlG4ySOrDx GBNp1d6dbJ5t1aWDV7VrgSagY4l+so4YpLQc3hSNSPEuB74a3TxIKDULa11WC1m0e1eV/SS5aU3S OxlVTIGRJo0G7HYIKYLSAi7pdCN7NehLSzt5pp4Hjla9MwNOMvBkE8f2ZAVLL8wabksQFmqaHp1v q1ndjW7RrT07VopDHdhmWOGKvJVgcK9KEry2qOxBxpFJXdXbQWUEd3Zw3Eoll/eyGWpXhFxNYpEV gR0PfAm03vodMu9EuHFxHp0nPS/VjlEzxf7xS8TEY1mfodw3hXka0BIUFBLZqkNuglhv7L6rO7NH 6oVZYvWkSodYpFrx60oRXw2FJu3tn/OJFylxqPmCsEcbW8FusbqXJCyPIWX4mbaq1H9py7AeaJB9 J5kMHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpI0kRo5FDo4KujCoIOxBBxV47r/8Azi75E1W/NzBd 3mmwUIjs7YxekgZ2kITmjEDk5oK7ZScILISeZ+fPyR/MTRLu8i8uRXGp2V5eNdQ3Fo3BwjqapKoZ aMrGngevsK5YyOSQQw7WB530C0j07zKNSspba0+s26md4ZKPdemVD/vFZD6laUND0pVqwNjmnmk9 xNo+rabbSSW041Bp5k5m5jX1yFiJZ2MNPUPIb7cu/wAX2haCF+nQ6gINTvNHuDaTR2cccireRCRU SaBeXqI0fwkLvsKHCFIVv0nfvoVvDrEx1OkuoFybhZ5Yg1rF6ZWYGb0+XB/hOzb7VAIbQEjs20qa G8SFJraQwjjLLKsiV9aPYhY4yP8AWr9GRpN2nkOo+Y7bzTevbX8nKFr0wRJcK5qscvACLm1f9Xjk t7Tsh9U8wSepCt893fWl3Ck8tlLdM0Slxv6fqLIylT9hqkjoa71BKgN6kti2t319a2d3JHdS3Ses rrIEaYMjho1iXdBJWnLfxwksabmm81adqtjA2ozW1skdo0aG79JPS9NKMEZ0ovzGO6pfqd1DJp0D 3ls63ZurkXARhEPUCQBiUKNxJ7jx+7Am6RF8tx9WeTTZJeTJYCSFCfUWloaV405L706/RVKQUVpl 95gbTorKe9vbSMfXbiKUPIrD6vbrMygFk5BuNKV2Jr41QSpUVu9P1HQbtLqSaa+a6tSLqQrEZOMU 4VZGYy70OzfQdtwgoIVdI0zWY5GmsrO7tpbSzu0likRiWT0pX5A8FDUZviQjbrvvxIVP/wAtfzI8 3eT9Q+vlDJBPdWtvdWk0YjWWFxLyAYKCrKaEMOh9tslGZCH2rmWxdirsVdirsVdirsVdirsVdirs VdirsVdirsVdiqT+ZfJ/lnzPara69p8V/Cn2A/JWWpDEB0KsASikiu9BgMQeagvPfOH/ADjn5M1H S7ePy5Aui6hZz/WIJA0skT1480kV2c/EEFCOmVyxDoy4nlOo/wDONvn3y3oWrajb3NtqcwtlVbWz 9QzELPFKxVXRQ1EjPwjc9gcq8EgJMnmMeoLp2vajDBZwCNfrcLxOJGVkVX+F0L8T9kHpsdxQjK7o sq2Wxxae8YaW/tba1vI/7p4ZFuI1D03aCAo1Hj8fiHZSdlFLtRsorLzLfySXkLJK94sTqJaN6qyR qQSgGzNv4YTzY0oeYrp0ms1ubaOSf6pF6jvzDE77ng6g/Om/XAU2idWt9PubcuLuKw/0685RTiZh WkNeBiSY8f8AWofn1xItINLtX4RSOzCHULSOyszC370IJBBbxsR/cyLVT0PXbwxKjduO4tNU0mzg mtba3kjkuvTuGNwUEcMMTsJOLu5og+EipFAtKdG9lIdc6bY32mytDqtmblHgUxRrecSkUTovHnBX kFHTetMKCG/LtbZZY4Zor2FbbUZLmNRJwANi4QsHWJxupHJelaV+LdCEBb3VjPo12klpHbKbi3Al hMpKnhNQkSPJUewwdE2mNrZ2ltr15PBrFq9wEvhFHGLpJObwSqtHkhjRSGPUuMa3TxO024gtvNOn WradBWeSzW6D+spYziNpAUWRUX4mNAFFO3TEHdafe2ZzW7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYqtmhhnheGZFlhlUpJG4DKysKFWB2IIxV41rP/OK/kTUL57iC9vrCAlvTtIWiMcY ZmcqpdGagLGlT0yk4QyEnmPnb8mfzU0DWLmHy2t3fafd3M1zHc2EhjqsnAqsyKy0ddx4dxlcschy SCGKa/N530aWWw8zNqdrcWtpBcW4a4khkKsY4mHM+orJzcnpswPvkDY5p5pa36A1HQLWee1ujem5 u+l3FGJRHFbs7u7W7Lz4t7cqEk8vtNikELIV1JhfXuh3Bs+FrFFLEt7EJUSJoowzSI0XJTx3PEUO 3hVCkK1vf6k+nxprEh1Jaah+9Nws8kVbQFeEwMvDlxb4TsetKgEKAkcB02axmW3WW1m9aExySyq6 FgslASI4uH+t/DcCk3bJG1rzTaebtTNtqc3GF7/0oEug4oscvFfRDtUCn2eOGzadqS+TX2utQis7 9ru8srr0TJazXbSIhmVW5ReokjIyF/gapNNm5AsCLWlt9aaWuoXUtnZXrpK88aXXqrKis1VYPGsC nkvPdefvuKVJQAjo7rzLp/mjSYZdSltrSL9HMUa79NBF6URJ4M60Wnth6ofUn5C+eNb83+Rmu9bA Oo6ddyafNNTi0vpRxuJHXaj/AL2je4rmRjkSN0F6PliHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FUm8zeTvLPme1S117T476FPsB+SstSCQHQqwBKgkV3oMBiDzSC8788/846+V tS0NLfytDHo2oWxne3DPK1vI1xEI3EvIyMv2FoyjanQ5XLEK2TxPH9U/5xy/MvyvpF9rEctlftBF U29hJNJPxDqzkJLDEHUKpqtST4HKTikN2RlbArW/jsfMGpQQWcIhC30bRH1CrIkUlFZS5HbwyAO6 SNljWliI0S71C1gtbxEnWMwyrPFWoRiYYODFanblRh/KacVAC7U4IrbzVqFz9ciKXD3jWzr6g5eu JEjIZkVR8TUNT8JrWhBwnmxpCy3TLr1qtxaRmcG1EjMJFblwjrUKyrX6MCbbvBZ3mmQXBuY7Rpbq 5eSKUSkB2SEtwMaSfD3HLcdN6VLVpBpG+YB9XCSSRRXsAt9OSB2MnAVsU504mJxXiDRvnTEqN30r /wA4s37Xv5eXrtDHD6WqSxAR8twttbkFmdnZiAeO56ADtmRhOzGQexZcxdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqnc21vdW8ttcxLNbzKY5oZAGR0YUZWU7EEdRir x3W/+cWvI2pXxuIr6+soQoSK1iaJkjUEkKpdGagr3OUnCCyEnl3m78m/zW8v3stl5eS8vbKW7uLi O6sJDGHjkWLh6iqy8XHFhQ/RtlcschySCGM+bb7zfpN8dP8AMDalbXVpY2ckQ+sSQSENFEjgsRIr j1C2/iCK+EZEjmkJSRoGo6HayyWl0bv6xdVUXcUYkEcUDO7O1uy8uJqelaE1r1G1IIXSvqs1rc6h odybIRrZwXESXsSyJHbwmBGeRGiDq3Fd6CjbU6FlBD0X8g/PPnOw826XoV1em+0zWbi4S5WWYXQR o7cOjRyK78G+HcV3HbocsxyN0tPqzMli7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYqknmfyT5U80wxxa/psV+sNfSL8lZQxBIDoVahKgkVptkZRB5pBed+d/+ cdfLN/pMcflOKPRr+2Fz6UbvK1vKbqH0m9Qn1XUjipDKO1Kb7QliFbJEnj+uf848/mV5U0G61dJL O/Ns6SyQ2DyyyiJVkWQmOWGMOlH+Jd6rWopXKTikAyMrQv5P3Mdn+d9jp9pbRw23166hCgyN8MaS 8PtuwqKdaVwYz6lI2f/Z + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:ffb3df92-75ea-419d-875d-2b67da963ab8 + uuid:c9b21bba-7a03-3d44-ba65-e298b0d31278 + + uuid:f71d7eac-55c1-6547-b1f7-49bb1ac7776f + xmp.did:2aced3f7-5c85-46f9-b931-27505630ddd7 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:2aced3f7-5c85-46f9-b931-27505630ddd7 + 2022-08-13T10:18:57-04:00 + Adobe Illustrator 26.2 (Macintosh) + / + + + saved + xmp.iid:ffb3df92-75ea-419d-875d-2b67da963ab8 + 2026-07-14T11:36:52-04:00 + Adobe Illustrator 30.2 (Macintosh) + / + + + + Web + Document + AIRobin + False + 1 + False + False + + 1000.000000 + 320.000000 + Pixels + + + + + Avenir-Light + Avenir + Light + TrueType + 13.0d3e1 + False + Avenir.ttc + + + Avenir-Heavy + Avenir + Heavy + TrueType + 13.0d3e1 + False + Avenir.ttc + + + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 0 + 0 + 0 + + + RGB Red + RGB + PROCESS + 255 + 0 + 0 + + + RGB Yellow + RGB + PROCESS + 255 + 255 + 0 + + + RGB Green + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blue + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Grays + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Web Color Group + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + Adobe PDF library 18.00 + 21.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 5 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 32 0 R/TrimBox[0.0 0.0 1000.0 320.0]/Type/Page/PieceInfo<>>> endobj 29 0 obj <>stream +HKWnG +hxHpf($Eu zpmqةq:[/wvK򑏏'N^>u_;wS$of'?,BN8 e5oz/ YFq矛3&_qcΌ']b̸ Nٳ oN8&O*eZ+ƒ м$<5;N/T|IkA$>[pڸ!a/F-~r r^Uzf;Ib9 5nI"rf-7f͕+ zvSK}iK$ Dp%Dj%\wk +'5"{PR) 2 2R}!<#>2+sjJ@Ezj'j- |d1긐yOySJ&>μIS8W!t-ZFLۺa|p\C )ʎX̔)F(CͽZ]a t}ʮVٯ$,M$FkV| QD̀/HZ HZ#X%s1)f$Zq6*^j2i]@hpFr! a٬07Ҹ6THhIoV=D4u:4iXOI^ +6a^~UJ}2OyybegpS wS'{p kz՛˸ex|iEi3PxIzM&R-^ [&Qʨ*&4^--Zg!xVd\sKn6wp*_"Cx@K{f,XN8DL9*t.Zc rMifӐّx*X'Xj`a;Ki%AvQN0uQ073#]K,%C2EI vƊc*:~MI>Z_S^Ʋ+4hH[B@_VE.bߵ:`Z4a5l$ < +8& z ]lWped [-? "Hah6P-+XZvC= 9?`)5.+-/^ I}hm21[Z_*@(WlVWrOM%H {.N7U|vx+'Ѧ7dB +ՈT,jhtX*&/mvxT:jL R;W>`Ɛ|+M}'qٮb0iP"߇U;P!m٧eYCH0۽ }vAQRƺ@ۥěnj1;ywNޞ{dQl,LŋA!Cp/>ώ_~}vu<^a=.=l#$އ}~vpwg_>]߻볛˿.o +P[\͋w?p0n\ph!Y%` endstream endobj 32 0 obj <>stream +85$Trc'a5-%/"-WT&S.]c"o$IZH#*g`\]CQ_+[r($D#?>HI1ACKRB4e;A7T7LJab7KF)r#fu&Q[_VlKeQ3g4 +Ra_oQN=KQl&KsAl,"1j=XeoP7RtN&S8$k6TP=8rcd+_@#+CV$7o41f3R2;j?IO`/n +J8nD%*?7gnhQ)dko-GT+)Q(_+-Y&pc8jm-cpJ*Uu8#[/jiS-Shq^*cX+a*,k^Z;PQ +#eL98F!`?$U/FIdce4f7I +f\6?M2,ginFe\!jIZOKMar>N]%A7aIjYr.a0@IIV\(]K(bVsQ1hI@K&!<<-"rr<$! +s8N0$SjBIp~> endstream endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 30.2.1 %%For: (Christian Swinehart) () %%Title: (hero.ai) %%CreationDate: 7/14/26 11:43 AM %%Canvassize: 16383 %%BoundingBox: 11 -6526 2816 -3610 %%HiResBoundingBox: 11.2456570437262 -6525.87898786497 2815.27061070215 -3610.38878837786 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 1 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 486 -4580 1486 -4260 %AI3_TemplateBox: 480.5 -280.5 480.5 -280.5 %AI3_TileBox: 608 -4708 1342 -4132 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: 416.442989008114 -4208.98972118373 1.99308052565574 0 8623.65976864606 12425.0451327306 2486 1330 18 0 0 6 45 0 0 0 1 0 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: 416.442989008114 -4208.98972118373 1.99308052565574 2486 1330 18 0 0 6 45 0 0 0 1 0 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 73 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:80 -580 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 11 0 obj <>stream +%AI24_ZStandard_Data(/X C=`it0 ð(p~#$RHlYExfql)7RJ)D6"e{gg㐒N.9 FpAi4 9pC#1±4E84$D4 4 "`4,84FJ$T44 a`0K"$!Y8E IñxHh(,hVp8$`8$ Kn5a2/aWLز1oՔEKXٹYIdO,5W.N~ Awni,LxR8(.D*``4Hñ04MbK Ex$4DBS01,qp$BP4)N EC*5 ɂ͢A:Hܘ$kQ0&@40$%vM x( &8 p,M0d! c䡱D̓C?@ +'Yh0p.Yx4@D8XD$蒈`Ƃaȡqh" @A\P9ǢTH`"Р`8 QD̓"ICq,@c@Hhp(ޝZ۱5*{I+j +`qc sL$w顱phD8IOdQTP, + +'@]˜KtDX4X(ǣ Yh + +A䡐4@HExHX$ pNA2Yh8G)I<#`0$Q4EA$r(9F gӻtSmm\x̼+=ZҤHu)sh$(J.kYG%~0K%봞cI]n>-ꎞ)2ɝ'eʤL<=MMUWԺͣhU̞3J09u9mʗO~L6%=%)tF.uIKFNV^fnv~FxaŋFziի6?GOW_go?ȓ/|9/~=!JhF!ЂZA%L4m'RZJ+1ɖ[pEE-kaKjV+ZRK1-\t/9aQ̲S^N/r`r!?(crtewv(-j1cYb&1A bqfYFdaZGe뗯^vuQK-*WZZJOb,KZK/K[laJ*- O:mҔ%-ЂJG-R!/ߟ_?3\yrľ~nδS{wskc_[3xĈ;7/+#f.,ͽetE"um]UM=5]2eONNdNBȜs[\ӒYjA DxΒ}34<;K!tM븶%BK&403;ԝhǫnixkytRO%dkwثgXjwmo{د;*עzE\lYI>uZ)6~]yo_O7_w_RʏĹnY0yB;-R<̯~ϭuR3i%<עתϢ= Bh(@--}ms}^-+&sz?Oٟ+{;礞>HQvxt,hYGjGjӦ0kITB,IaB;*=zFq*-<;>#dv9.](:^gw0j9NBߜx%MڇWɅ~ҫ]_{=6͏O[=3ŒdeיѷKY7SVavU,VS~U,I}SovTK>-3YUK._6U;05ͱͲ?_3A:Rv'u(T}b:vPZԺs:r%R5_.鱱wu +׷llRڤwͳ _WD~֪U~xWudJϋ+1h{8 +zˆ?٘դH\reiRzB(-ČVWG}2%f* 'gvmjŽ 4_*阼-+7~# +!SvuGT1Wz_d|mfg7IT|FRMvӔT4 YooN߼Yqmus1ϖA  YH4@YH`@/j:_bk2=|ngwL>53QS3ABgN[&)mE1i?5FUq2ӵМ=m{ON6VGSc}\vJoA +o^c[i&<9>Փ̺޼७-bBkQ˜yը0oXOsXYƍ;{iߧc/Kp#+‹رsaV?*a<TSG8rw6WM6t6\DtL[{[wufU>U4od{gfl}SU,ݿ^^Tqݵ7q?;- ϵlj/(8ӹ^zy/_~!D=.ed |O+wfwywɯj~2< Kw4U$ԡ[YTc+zΆwk˭əͨjf,r}h&wwqɲr&y 'ƧXw眗݊%ƽ|}|̖˜~ؙaN:QG>JRZӢPbRɬ:9ik0߇ j1kӷqm[lB>zA|%0e +0C#2 Q0E`j~uvFZ@ $A( +1 C b&!*ȴ`,K hu͋cՀ3bi?=c.yd)TN]nQm-G#%m| %qŗZ2~/+HoF汮 KYer5#!f?gg]^}qtJ-YpBQ$<_5G\+4AoJg=uvK= 8!y\ r 8@nb%oc}@B]aČT4$0TuHyZUX_4ۙTrRGk/ \B9y8Shq.dMQzA0O>b)؊9UU>QAҚQSZH #ì)}>;:N^Ǐi$u2w$oO:M^vVtyns<3e/=#5 sqԿ1oD.|(DZ!nj@(-({Ϧ @+z.(#´kZDu ҝ&6kʻIK9UtTl AKD D,-[FKEk/ }@ƣD-*Y>ledsYtcX*:š-ZM@tƷmT4&fbbK*֒\TG]K/]AžMPw#y)NVم:AN*= )pjtTmw%G,Q;Hw3VDGSk5# <m$" Z6[`A<!RihRm5j/uDC[e9˄E>!<)G^|(v|j*JfN&m,!i=rMTP~h:Xpq8.״(9O}^I֧!4r8T5ýnYu`[ +9w\SSG4C*@?W `a@@%.""fƎݵUGZCfg+,',YuÉM501] [)髿sؤEjdZ%P3fcuvS(x\deFP2xIբ#$9_s?r$]jvJonjv[Uw#WPJ ~x(0⊀\D)ሂF}:7l_P;F hlzp͛Q[VG)HAߐBI%L7v88, 0WMT>%h4QsJ7HU)AǎeFYz nO]UU +n!t lvz PW۠B +R5`DP9/Gu|5SخqwS*3| '=-Jx{\L j8g:4S=5{#nPP*,b ?d[F3'=G':pى($>r0. ;8Tjn&3( `Ӕ +8fkaYWȐ +۲@;1,g@FȲr(@L \. (_J Yw +p `LInVq )Ԕr@cw\x[7>R!񔱈B@N;pNO{$-ZŹla3ai%L{k:lyVꧮY^՛p-j:l:$ 1&VAH"'p_p&ҫT_%)6(Sq ;XPD#M׫#1_^׿h6"LJ!kBJ".p*Ʃő|{GEA(Pn') }I$0U+)O|tm[KJ z{g^Oaclgӌh0N TRvau% 4F9t 0SQ(h4A(_IQ0W*CJ^gª4ZZӰحssL9)lpĪI8k<_ɒX@ ~\HΊ&1lGGssqO3|P*L&qӓKYrr vBa^=E"<-@ $.6_5RhO.PJߩP &":'鉈P K kʥGHK?&fz rҰ`EDF!*}v6 ;@YԐPyIuu'WIJaJ\S!5 +$[F\V/]Tw+Bŋ^6tR!7(mr fуP:wbhvszGmOL:ML"Vo}U +f)V\u]RA{2O1v1 b5uؽc-'˵ }\-)NIx>d~&C~ȰΏ +~}bJjR?U e=aY`Z#:A PkZ6l-SAWPqA4ͨ]o=5~LIqBaKHAGXVzc^Ja{JQ6zJ,:Vݷ)0vj9>e&~,E>쑧D/EDY pFI9jsБ Z B\nj9#"̋o,GʕL >pn{~О ktĿE +M^CF'+[;8;,Eu! d qdm"aN^/ȣM"-P-u#zjʇYS԰F/^*KX/W(rtψt9@blyvJ9uIhݾ,EPާ(e IHDq~ +Lg`KtաI&"ᅥ-AͰEyn(=E Z73x Q (T2ࠌrt^@GY/94 +fN.)b^K̿5)j$KW8C,g*t-8(Z6&zQ=JΤDr)q 8m.C76E9-ǨKW_ ц4P[Β:fW2oW'=FM pQL"y*X<^6:Ya^9 bW +%Of 86b"0%flj/lW>oKA .   ߫`P^%ttE#Bђ8#TpR̘n?~&fϢ2G#reocgվv v &$,kZ;p_k]fgk +Bj?xjSaexEWJM#,{"<4_Uitʙps4VfVO>"By)&bi\W@'A0[yd5Q^%kn%C&kAhb3VB,BHP@R2 $uN!Өh(&TQHehAv!:ڏ .Ү:?{o(yrM/QSXͣT W T^gWmqO)?_"{WSAW9z#FZO~#l< @kW5ۭT_ƯĔ9/]2ks (.L/唗V|~ Ja P6xe_"܁_xHv ߮V1,Kofg!a>л!}7nXz| {(GO7!r8U ' @ +O<ص6KN ?fF ?MxH`x0l"Nk!\EYX?b/wjOΒV4Iž^L9.=ڹwC90@ cb]#`fุqNE'ntת +Q\Ek!μ +&ZMƅB6^I8p<\p8xu>94hT Т&A {]PF l|%/pN)/hLq+3tGcpz\p.>FVO<.sqKyx:OÀue0"6AcSiFg , 9;V?v~4^3PѤH4\I:4d@K;{DAV&2ou!W@=ab|#3EDcF׀ +qs.)~ftprl5vq;["pAϗ +{XíLg…y.}.iLŇ7@ތ7Fj>f=+GSi3${U8iѡ\T[ŵRno#>Z?s(1\T4WzзM!u^T.콀Nzm!)&2BAv ̀zqY7h) d"նxC +vQ +aЙŒ.4''AƠ?`x#M:>$W|^kx k>N\|݃_͍XdU\.y%c ~ 82[pU%K WFs@" 3`n:]J-?:`+e3)2 VbzM? V&+Ƞ̰@ݔQYj_ӳ]uV9v& Ċzi[#ԄsرȔy0 37WŔ_@{x%FN+?Q S!UI!wIi䅤U'vSw:*|Q6f wcL<)G.5ZMvO(D3&`~c?Ptv=ä>x0d5Gf̐ [q*詡eA=H,ޡCX&G%qB+Ϩ;ejV rD/ʸv$'_<+j+οQ7~[Րrf )dy#QڿU6T^_ۯZۗjF5O;[fttL[ݪɍ}Ȥ4v]ّ=p?|JxHS0D8}RGj+v3|Z x#iA @[c'Q hQ,3e5y!)\: LeÂRŴalTvX*-AɳFb8FwPd4'o*Rorn'%(M'u8wVEL_v)EѤFK8(9s"f.b xGEu P@ckmp +(j8"F0VJ 3剋HR w"To2_lF@5O,j.!H 6'j +K~0O_s: Ly\4\ʱqgzog AnatSWT' +a2Ey( 5N84O=,t@X*.(.<]#n@qF:Kjt״rh[sjv$}J UisyKd( f-l|#$&8Jɝ]Ẁ5](T-EQ~"tx#)= o PQ^0jY1O$i`0^\*#^ovF"R:g N|vKQjtW(2)?%(jf$AS +t +БLbLB#ꠒsQ35OGyE^,?%eљtD .>PCWU,w;Yy'-ؖ1X:<6)jJ4uȏjZF̖B3U&(;6ZϮ3Ziտ_OW+dbJ:kenF&_{5]%ц!/cH꘾59Ջwi6/L)T҃2[FP1j֣ӣWK˻OMZ,rm׊c1bR$IJDo.ܖۋmI#BpM"yaU.G7;%ט4b#bi_Rjۍ z+"I pe@]#MH[MM_..>2WYX~Ȩw k(Nȓ"_ၫmJI\;ftbYR8tY_!mޙ@Y7ךDc1 +!2Ѕfc;%gADL1 + 8>0BU vgx@]w|e)\EKk 4?<E^.fYx$tfH8-d~G`Dnam~/> )+8X_S"HFtV?[&\)=wiʣ. odB{ x3F|^NY "w7圎mެq!I)yU +  /:4]&$\33'KG3L62hJ07¾WGAdnNA nQ>u\IXi(tx1+? + dCxH(@Ǖb,RŚ0)TU҃8pR,Yy,l>a8V,>gLgb0WfihEϗ +LtBw)B^VQra r0TUO>42d\"S4S㉉=x'JΉcunL_ِDwNUX啮ER\Z#)[H5tk6 C)Fq6ռBKuTLC|MѺr)n.Aj3QFa]Zɔ*'!͵\!뭾2#Z'(gW54b Cz3c=hm+uP|_H; Lg` \|jH"{\1W\(vd;{0yP>YR!S1SZ.|&ƫvGk "A#i(#Iy;Xh$s-Tw0wQh',]$3T-)gBep>w}񉤪$&LG/3AS#r]U 31$3D|%2/WՉͅ4I oPmW '~!G>C8ޔ%lBYYLR:CQ +}# A椪j_ +#2m/S"uxS@1%pqDVC&YOH<󑁁/,@̹F1*bHb ɯ[2CBwbtǽK/Qt,}'Ԑ`0|DV !!I,v =stڧ.x*As+Q]_1o+dӈph ?5 dcy_nV'mal̴e .m/ {*<8rC`0bq& 4l\?c`08j5^"~ $\Eqf9 +%BGaʫ2ByI\hpRDs +EP͋A$<:iH{ +L} B(j*{RDn!B.qIdy̦t^{r*H;iExl¡~ Iҳ 5Vi%6K#rAeFz)!ڦj]"{%~n|[(_KFOFvV#.0pPf%f"aL0QW|Ev2gx-k_亐h>< F#WVN1<Ȑ-_aeE'f"UQ>0?9}x8烳@ԎlW(Ҕ#pNUDK[PMT4%l HŁ?L0Ya$y +kb7k_d"jap|m P̰v>B0=`c*'9;,7jErU8a Uŏwbd68;X)qAZbzɤw^hne^֗Ӂd!%&N;,@b , iE>0cPăE\8Vkd&*sJ"|Trsb +||&&RbbFx07b{2P9x./ 1<8./!vЍ9G,R,sHx 6\G5B \ppW2 *gAԼR^كa7My(R9.5lB`J$lJƎC99% 4 VD<Fq'y 0s wm9UprkNPyFϐ~PgC"ZL 2$8 KqP59.E6Mk$DW(L} }+~]u$V䚙kX$ $hS-amфIЪ p0LhcR"&BHSc'M" yJ{Y't¡%u7we%C454|"%!DCpȡ8sn$p%7d .rRr}$eBg-P|EEDgA"% + CqNZ=r$ +P/ĊY)*ңXftG9_Lb(7"-쑉^lM  +o&B`d79hx@;XgdVi8l5UB̓y02a#=!J񊈧0Cl02'p!+82Tx:#TBDPBMs $' O!E@r Ee|q!E9 )BA%2TFۜHqT%iRE%UD(@Ce +[s@EӰ9?(/o#|7nP<Ҫ +4GJTdVz_z签BѠqUaDà4ApyWcCk92%|R43 +LOlB=5H33qJbaf|## +,3,ZÆyzc0 cTjЁTKvP &Ğ8d>QPZЧe !ψäy'"L-PQNJeL"~9*KQ雂`.QTy+@^=JF\y2P^dYi,j;1FBeámXDOVڙ! EZ KSL'ttL1"qTK-ippt&(Y:Qta g>,$Z7C"8 2֍t CM9<}H$: EQeRZ$dIBE,bO^! +=dJүS3#ilz +9Li;1i#$,j1C\V@o榺h xk10 ]jb{ OX)H^G)DrFVOXR jЬqIq^-E"i=f0vQRO/6tz&0晞60R }#hf&a]cT4?j;_>YW@ K$ӣ@2Az8#@c:(G5@p:Kb0\42$C`SCJ2+8 +DE3T#뤁@TMïz2 + 4pB "@! pA4`"0BK(Y 2`"@6؀ hP"  H. @(A4< D > lAP4Hs/ !j Eq0eTgh/ $@}!aF,W>r CIntZ`P@2tQ m \-VM4fT#BR4aL{$Tqb(: *`$ QVXboJ8 C#Ӑ'f7t&f(thN?'ŒVuરjqS!U)/)Ф'.GKPө2b˫4K bd\vkB&䞊(-i`tC1(#*"1QvZq .4RG NԬ(%Cd.Gn 2 aP !O #4-Lzςb@J?xoS‚B)rhMC 9UhS-H}u0 NC)YO2x*䋔A|~FoBu!*(Hl 2} +l=qLWYѫrNHb=a Q\[њc沈c&nݧ,"#T7n^lI5LX +$K](_%0}=U37H{ +KLca j6v*6ɉ$ t' KfX&ȰZ-;cA:N'%y pP + K[HYqI%encW&QHBD!b!.)b'%3D8-h$ڣ9V"=c\{#WE$CqR"mB8y=*JΊh͉&,g`W5Nf0-DRt)҅r!721ĒP()ābXR*,A"Qf !sr(ÅB08lbD1!Zb",C8Bo `6P "%X9T*Ņ}S"p6P63BC6a:Nu vmVXB۲u0D74f5-[-Mi#r +-%}h#R nV0-@061w<ސt0)V>+Ҭ h=U@@S`*/ *Xp".bU*!34̠j3%HyiJF g"˞SOTCCh‰^ND8u$4 B&9tA muHh҉  Cx[D&Dka8i @X;`V0iLL.mgvfGϗNzԼ "j(Nt W u1-VI]b2rpa6Fc)1fwQ1dH#HR +\E%iNhPC["KXwn"UjWIP8kuYSB%3Qo2qNd"qz+z$=eFTz+:ǻ;quN*NYY4R,}:W*EWjKUaL Jg:-)"  *?> +R?Uoտ^>.<U;"Ghnu ^}$/es&Ee%U'”TQ+YF2* +t_$](2=H.BHؤ")X=Vs2ыsƘi)-pmoKJDM(9uV&'X "+(I˔貨{ۛ8+ʄ}!2Wg!RrP#%D3 !VEC5TOGEسIUl>0uR oEH\6]ʣ--0n `NK5HfbDTw,HUPUoAj248j8U((RgByPiSCF$ U CglWQO*C;!p**}Nj7]14A㙧qxDĝL%,:6'FL22v= r UXT䠖ɥUeTUh[)T0Ev`Ru3zTj> T`Sc\&^z#42+i+e}D=v=f)7̛lt拢3T1"Yfgѥ$!ȗїQ~CE"ts?HaׁkHx!K=WxfA*aGt@GX?m)Qy8eL%S"t;QMx,2u@E4=9TgPj8vBJ*83$mmvL+>1%”ĥDN bԡ%P0N2/`렌-,YX(+WiKdCӈs +bybeVpߜ¨ZTH+bFR |e486bDSB`*RRXG'ьRMԠ}jEAV͂q4 d8 +B3%BS\uYXx0HўN_E=:Z' +{Fg?t8PE^jF &uHdl1 }d؊&b`ClCS MyC$Y]*P"%"` l ``$؀8!++E ax4E3(WgvO9UYIZ<Wy48W)ц-Bت_ӢdN$SmNg4Qv(J)wȧjh]!Un6)!Lj{>VmGeKOa15jXIJmTV<(TLU!QKAbjCE1rP}eJr9Cj\ iȃPSҩIQ(tbCDf>$.Qj#>[]rKֻUq0'V! +r tou Bѷ<. =`4jrViӃs!BaH + =X=́ϭ k0S0;pJ G&&T9/sx3EHܕy7*wBYd ќ'4`$(3B`L(>>-bM Ĕ,bziE`MHlBMR-LMe| +Ͷ0n;n%T\]&[w=.)zI!|@aGEıϯP!ph*(/Ҿ^o`L*ܡ팵#FTHr)HHG2%"yewȣ<*gGIA+[-U'֑EOMfb*^ ^f"K`<~,!&4 O-f$@{$}oĢV3>:33:2eǙs4 +2Œ3 +;_}k5^سQ^Ǩ *zUt> +ikũd;.1i-Q#q-G2i Y&N|Uht铪2b*UFzXHYqx<:5[f4d$(bA}qcjz''Ş ΅gĩ!3.:HKXf1bJ8ъ%qKDiF3Sce~d/ɕMEiƊTRb[0\eԐ"]Ng4qesnD +n$[4X)b5p!a7OilI: >)>{F-u@]N{޵qzߑw0m O +1Ra<>ǎhDmae}iO48i͌ [$Q )¡?F#+|<Ąr8C'Z*9Cboƒt͐C5p4 +)A*RwR 2}>ւ,l}$6ƾ_' _#1?u VּAꤒRHzCgZb[#PCĩўyXlhOPIH!Pr2%Pr46rUaY + ˥C^5#\'jU e,pJ]NC~7fVg$B?ܒy9VՊ^0S 9&!K +dH g'a4B@Oŕ0"L DMݤ*$CVfjd"ҖU}gnFYMV#eh!投zbdFrϹBb*,3~Uf!:#w~Ya*Z20N2'_W>#L&.&#Qy2fzgv䯸PS)Dnc1 O9GM M,tR +҄˨c^]ICܨpD.bć\&mD(X|>bGXDHL 7\9U8(D0<(8X4L1m2[>Ӱ`qBrCDmz.Rq%♷d5%k:d+rBQj榒P|bhyue^Yt4.) +HYVV?3GK$w  {b*;5tl;hBмJ9:Rչ"[C$5uդՒzBĒE"Ek?e ׊PmeW! ,{J   !DF #, ĪQK-PIfP*B .4 ]hЅ2L~" f̓2aD.p $hjDBe:lԬ / Ri YOb>̟JyxBӡ0m!ЁD'4.+%1!pXF(|{̔p " ""|DD$)Xjp  =0MUI.YejU A UP_N11u(&}Jz^QI/h Vň&FbA AY gaK3/e|Ux:U1<*wNWEijpkPgbčL\]P6Օ҈RGU$ay!]C鬕pk4͘$c[|Aq_> MD5Aj*WFXE}'C~B6hmn2#3F<^ۻ-?=crFU>k"nZCC3ωk +!))S[6e#~qgXP3tC0UJCð)T +R % 1Z4o慑B43#ppCQؘ6`(DSQ"4}Iq [v>7H*kۂ}X/a%` #HKd9$C{5zbU32cDZZ#YʒcK޳TafA>5RY?7Ҋ o6eͬjEd)?שHxS}wON)Vs.FOmRU%)cebbvAK?ZrLKDxiҕ~˗o(jW4Dgr#w'YV|bĶ%/Vv6YL:YTzYSoR7^15;P߹.xgЃJU1T70Sw  "CU> @eQLj0w"/aUa?!_fsY?*p]Z3dӯ&TgX8ljuv@bCGSVr:6$,(?]RU V̕O a[E-h1}QA#>hBTƽP'3!h‘r~OSm ޾z==>yaԭQqQzx2+g+[gl,?miWtpzsO~FR {Jk@ pO0F, INl$[s ՕQ֜kFHǫݨԞ>2`r\}4A)15-+;ǔ 쓪4%{]0[ ZyL@/u褐 +o/ ث +\n.8 ^"Q/gmBZϩ @e֛SK- `X/P}1]=|o[EWg{UM*VODFG%~+|g)HK=8.s_QߏciD{12.O3[yEszhjh}yazo >usQ9`} {;ʾq3OpTJ_&jkgib礡&}.xN)ɠ`~٤`'$ך~RzJMVd٧BRK5$ \Lk+>y"W^qšFHۍy3  7^O,!=оvB!}"fjz%@9b Tf#PP_&&DjzDѼ),CqA zR6ٺx}ҵdE%Z=E@5O'\'*+G? +6hx9<^yͳ4.~擤m9gv71EkA IB>5(*-_hye34|C\9i#[I-,,ɭ|']tr~jޅ{H˱Q@yF}@pH&Us`s0P6ㄵ.ǟ#8e{D~h?Bq "v ݺ\&`+y.Wh]227-UdL3f㲃2^]`7>x4{JqRCSgS:}"o,N<2v~=RuJAE:bH p M@%S[+Gh8P:Ȯ2Cë0p?T۪gc +?ȸ7w^tZ, #|LTł\#%J0mHaMڅ+x|.$P{mX+[1;daQTwǍ0dqeP5$F)\> +`>edSș6oS({KJ&J٫lԞ8֙AyO)PSqS/f8oP :݁C9!wFQN(c|zHcݯ Ωcq|W@鮂rs{C;bk^MLG$rOEXr{Dr8WQuF̸;q?r$/Bn{h*H);i۩vR.nǬ6:f(En'b~n9ݭ20;M'GdT64~pGIg.AᬂQ2K$B`6 GY/vG37*XH +%}MqWI?կZ1U뙑k'5+\:±ɋqw}R<%.E_5ŸʃHs=Ge1|'kح%CR#%@CY-k ,ӵmbۦ3, |RM0,eH"z4!)OK\NsOZ.> V3xr?ᱰ: hVeͨ8uOܶ3Th^8>x9-0Lc7uXiefQr"P/ bo*nF}zΠxH8w`xf<6Sptb-oׁxk*8cf32/f%x4AדBƦKl!ʩX:]8V>~Ui;r YүTSm9_B w6$Bzd+:!^VؽqAAڣXZ6]¤љ^?pEH(olDWCḱ˭\%tANFR%@ >O56W/zĿ҄ED +ʥ!(Mr* .$"5yl%申x c74@vέËaxL%(oĹ!N~Wg@odZ&{H`LtIRsj͖s8w3K/Q8GXM3Vc@޼I?/[:CxH4H8'` >9C[PU@2TXlSyjA㙆1rIwū|\LW|`]N%@ c\I_tjch5lSiyb4u8,kt͠ +s,yW9'j/Sp>0qq'UȅHZ*'Ut sDA"?8|yM>m+mf? ߕT8?(W'9*|}@ɟ['RiՌ:%M -p; yG +y']bHuW*4</q _qrKJYuo4(P5}~+ .ms+*MGF MYg>8bF+$qch' +tQ1n# ~b6(ygyLaaSs#@5t +Q,&sR=o!vùwYAUIxziRiXDu2pU0/\|:r.0`2f~ₛnX8>W%|Un}vmr!q.1R)$ů{/ +`q[ 29Ŝr_+i{\\xODqq$sN.=%$?#S#lthqۦ`ISZ;˜{\c5/ ~Ǵ[lo)~䥦POҹN|Z{NTjLMX2x޴T,>?&|~.&;E\("hȋ[ Rh.Fɍw&VTJKypakp#?bx'V$OTPBIa">' B*`;q BD +f,iph?32CYrFxb` mZLi=8j\ #Җ1~'E:<5%]V|@@FN9eNaa>[xKfmVoIe!O;xnj )xC%uZ牙O$0~:]/.%`Fwkz?kgr~S-@-~/dBd":9%}#.L>;k6gctP S)gW,x+:WoaZ|''FlsRK=^SC΅Wܯ1m8^jqufӯbՍ愭ި;5O]Xac4åߚw!sڛNڵtL{3a>+6~CL{6PhY-(a}y-V޺1h_7P XP){_6M̓ȽEݨ_w-*(1uQެxz;7g$pwgjĆ"ٳ]q{3n +T {K} lo{߭b_gH +9!}z欄::{˷wz C/{ۿ!jT{.lZލKZck.4Kߩ56>2voSöv0w\v[uÃҡtE{D| Z\-bzotr{P џrýxK{?.35\v FL{ބ XBSq_5Jt0 [zk&>\ü7Ooۤ_eOd'ЧpoԖgs@8{^q ,X{D`#޻pD]^Iwo4d໿].|C;ޛh߭?lqp{s2n@H} ["._ '޴ْy1SwaKN]IJ]"&}F|oQޱ4:TzJx\.z)Q@u~&]1yGmyw;z‰VXSh8䧻?j7Kp7kɔLݭNb֙=4Bl(vi͢jh8Ýu +h&GHushw//['mla.ѽDq| i\ + C%y7LqޓܣIR^iV܉s'} -5g [++~3Dnҳ\<6֋Pu7[zw`4HS;J!n5N%tíobrYEzmΌ0vPBA=~rdېTxU"kCN+mbmEILnN?܄ےj̄N42Vmr=mWi_Ւ +lu)-K-r]*_wwǶg? g-Q,><=w;B:.@s툓赿֠Ӫ.QT#ǰ'cQS}G{jnЧ(i6*vbV=;9TT;p+md0΀Jp%EKUϕ.Bm=[n6gCf#c{{ Dd飬d:TokkEq=:Y1wS>C,[\5嵭7[Xy'FH)j:-j/] K$p6]guY*bz} QaA3Q8WBp#WZykiV!詄3ʣwQƔ~DBpb _i9>՟֣#ObM;knog%K3k0(d{UYc:z dm@;k +CB(D|υOZYTTjKwcO2zotF?z͆#-LCYJ)Vg"ڳsWMזU>f{W4#zrMmԂy: ώ 򩱱,sq37jc&oRVGKNsR?4W+NLPD#9yaIQܭӭ2Vَ=@T;@U J`KD ]}:. @nA6ş6Wm}H0> bek5x[TYDAyL NwqoUG4fQ78|iYYO-Y<lw#k:ńobh+`s4(k6אzYiiĢ0_:8DsBf^gZZ!}DM{7FT6{ d "eʷͧBIyV66,?8elnۣijymn䜩ǣM)dϛl3o`D WÉw1C|c [ONf9d9W'cj4h1`:6TSCTuv? w OӀw lG3-޶1gUP`u1=䙯gυ'x?3&?.˒wg>S^)b,2uSI8@@@ gEv 1Р\)<λ_#3vG ]]a^kww2bఇ*,,4aE,Q{}Z4PqXdQV,B&.\aJhčrX +ȼ[DDѧ]|QG -heL KDC4RjIIn\W?f^5cIWk,3!/^JqXtpWJmI[*Δ.nKO6ܠL8\TB7X4 6by[hz{msZ1Ӈ)Rj l\t=kk՛^h4߱ P U "ć.KQïÎԲ(FVj@&E]l5(tjM-qS3NryB̠ +.ЩQ̔*.RܧOjoY7bնuա"zXgfV"^VXV 5]`!w5ݯoWi8D^m_-xLr`/ذrblA'kV?|C(tM9,2'`ϴrU [>UnqpmHH\烥¸}A+r5s͢vj\ ]rE4xcoM~tuZ'OV|U*J2k_cYj|5 )??`|WH_#l-S3>KwZauV3ӫX u,<گA̹Uld+Vne0!lhYD&wy0f;zf1$3,-0lL(A>Kvf_L ~GϲȚ(~"o9.O%[8J1K{QŹ|}s?\ \-{﨎!VHQ,Eٙ6'R\LC%pF& L5Z7+,&δ?%qnS>"jpsj%#nG`s @Ii +Ma WHEe2q˛T^ Ɖْi:V +}BזZ`28k Y<r(A +8rE jHns0'C/IP|/[2( pPZ,ai%dՓ)5L0@~2C19 +ra$v^3[3y䮠U.$`t `\ðWS.gh`[s`#ZB%1^Ҫ[ 4MѴԊlJO=51 GGAHk58gdmK2<;NJy7sN_ +P 5ٳ 9,37o>Xu?>pNc *4/A}[}޶uP8t 7I̐NP +π vqxa`VD!q ^q%)&njg`{;(39A0@lY+x?V,%Ҟ T%PI8%/&x[3!SBd YLG(Qo6'D N~nde`8' bds FKAe~'Xto@^֓'y/n'x {[fΙ +.4l!p,7e`$釻Ă[-,r9|+[ZpMT ~@:+ ..U0*\Xe fGXp}G* 貆L= .æqƾVOO.TF I_ct<K?qUza mGaj/H3 XHm%?ń,C)&_08Rwc(bRy1x18OcC P1. B\ g~ +X~ir-A]TIҷqvU plmi`X,%A+*: injBۿ=>X嫸L7sq0`x*E,wR^̚"ort*3W;SĒ6Y*RrNn(;&ךV즔(_)bJY+Sy^b(JTVz},,WV5Ȕe-qAXM-+~e+B˺|W +*A2W̫LE OW3Ix24ވ9Xm6su '96l;#!6MSxtp岙o=,3 +?d4IxffkcM#e9kL*bǤ}g:kHĪ\YΞ͏fR3gc5^1[5~d'[m{VAFailV +$YHجn)cϛy\Dtff8hh/PFzpeS!͓ڔ]4m}y#{3PwoX \QNu:s>gP¸<|]3tfPlcl0LjltgFY,HdfU!T靹4f, J溧yZOsQ /RWo \3ӷeOfō%^4ZSI1iG7/O3e}5%9$O|#F+ +gtq&6ë֡<չ IA4pN \ZdPl(Dq:sw;qh MeuA NJCU:4az"Y]M8Mz 뻲%G>iXt0gI#dCi"Ͼ#s.\$[*Ɇi#;% 8.jz ֧4iq!| +R0PGW/(w eľNb.eR\hͻAP]임TGUwvJ:j [=h&@]v aDjGiẫwʐY#Z;JJ +[0=neAmGqr B˙TvϜ.O 턭%S+No]ag/lڎoeH6]jLL=&tI Hk(`۴R Xflyy](oCАmhp7dmsmǥEmۨ'zL]idP2UrҶOqۓ.Xf哈T 0ZE1r.s8r߷KN,U.qǏIr˧0֭}n TMt ħ)(h +oI;}y<WjfWx²{[WQ>P=E!ST7S:ݔzDq{1 +ն38\eg N~ a`4mp6m&ǘy쎹' 35z* gPr +?]_x{ $ֈCLBG@hNaxLuM\ +"@f,pJxA9̴4SqI,x| od79+ 2ݱEc{1SFCɍ(\ZI撆U'#t#ty7;Ϳ57'T#7f{͉!/l"V')>ceЃ7dDžD^aή-;(GW0 ?wRFUb0 TUqA'OW꤂~C J4돞++V5pRzWwYV{/`dTցNIZFh[r}I֮|AӷeKi5.b?>R4vk'^ t%rE]&BԨkJ.9휽lb]}FZ{{2/ݩ]5DksOq ;w52ϻ`!<+$;4H,>q _/,ʓgm <*oiJ=H\S +v)-OZ&^a*./>pĭ,V5Y(O\j=1`֓ !dX^%ڍ w5ze5/<_ w-^v}E_x{Dc=pơ~.{ESOتD<Y%PZR-BUNM#Oil635ANY:N&@`nŷ˹EYKo+4u z/uzCayn]s#8zdxCЈԂcxN8a X)ihYy,5@?"Ԯz%$f}m]5a>-ZCQG r541=4| 5g\D|!wGC⬘ dO%pXT|k2[gpHrNLr↾<_v~DsQYOZm^?֤%$}Cw>3@"M_)K| .fNUG4Їc q~iqf$)ѩ?/oP&_X!zQ rrr"kO8KWqL'R#F#O{ aX4[MJj.DٯQo~Ŀ:TZ)sTvf`/&&]{Yvͨ:$c_]mXŠ5I3!f=;JI04n|JzBx!fn `+F/  Ί.#f`]ĸ/~vX;c]]F9tس36t&vվ\oB1Y`nW$OT|]"ns\DQOL^gJѢOa}}G"bw}9ƦK%af3)J-B"tCm!4>2`m $*0%iObT·D(3^Ah#d +?g{C)b̩Vӡ?,\:᫁3Jun$03q>F+ZUy(bx4h Rِ˅Cyٞe,[5,A lPİ$3~noH"_ZQڶx]]Ó%oH3Nv-[{q ˻3tWEYf"P3lCF'o\2h#wF,A7+ }BpAgk2jg$otȄ LEMwQݝʓ7L Bc_BמY7,1yF/hi%m @Q68.lJ`MRTM;rT^6 +q׼$:7oGeU'#tkq> +Lɓ~j.w)f: +ضn@G0g&հ>}P?ÄAW$r#cEG(@ɳY 'KLtSUXz(2 +pgvZjKꙠBF,5vjn!e*Psd:$;'RA2$sWEjh5rtZIXy;Є^ʖ {-z$ )l~:b]]L]٠ \R^ݜzgn_a *+)/MTK٨.4T!+Pju JJ<ֆv&߫$;Omՙ*t|8;7GʋEkԴC1Jİ1P,|T u'4ݐSa"gN #q+݀_iN0'O q 8:@jbq/(%9N!Ro*S]{2A +S-M1,/ :a8]Eo~4c'$K(MpUKPYLJ@e.ocfRygV2-j +i(p#zfB%ہ N;]L{5i#/g~܃j#m;GfwlaKt[:UL#%2[WJؠFiH %3vK};84N.׿X`S<͑yh٭>Gl4aK{~L +qW4m0c*6*MT [4 l5_@0maoIjH +@D~[zI?T;GqiWL^ 0Q${`ޥ zYiV!mS |149||\}zOhk>&ka4 n5,⸱ck~9c5ǩʍlW +vba6|yR\#Y㵤 nԼٱ% /}BYQx=ij f֧K#/_-Sx`K {atQNs!J}-%ܯN?7[$KMp3ɹJwD5&qb`&ͼ0zԮk؈M5o*h!b] @MHc$ -cY BThn -w$ LP-jΤ`Cd?h"t%ɩU`Sj*1iE?RIaːL_qtU֖&ckZc:=W +_y^l$8} =뜥Wܮc4(~շS!{`c 7M¥ +i +"v\*y'5kWe2Ǯn[`kbh;UCA`0 /kN7t0e/nq1!&jh2k +|3 Ϥ1A`A[V$H2 Tdk-#@`@Pe.tX5*EsRL49 s5;ݘOg +_@=^_pZ(\I)DR |*ZKkA-Iltf7LSA Έ9Z13jj26ÑÖ7Ƈcn\˅ae N,4 nr?0spT'P{f@ 0ĞZ.OmanKC;ѓʹp:ex@_r!ۨ8 $@` aOdC}=pӲY@*+O;0D H$Ô#րּϚgGmnw/*&Ĝbo7ǢRY1lT75j"CAy_@;#-y\M|#{y&sVDX"a4֖L(}RG?@,hkoԜxVa.?>7#|Y8wg̴ ~[z_lwybI/2 dՓϹc&IdY[G(!U3 c3;Vиo!]@2eCtSZH_ܐ?5hiHp@䡖JIZt(mI`T6F%LB^[X xߐ9KǏPqwt|ƙ[Іh/yx[[[FP1N^_'[H 3MN@"i+^{j+#ܰ] éފJ7뚱]%-([n4s/.iGpbrAoH."R?,ŗ\s`/pd^_AY:;j_lYEHxu +l0R)!/qAK8SY$vv:reNY=({a* +P[Am !$F4lɷԵӽu!!V횦 hh cnBH6jŶ$JĈ=:ptVh8~óјSg.GmH0طѧ:&}0WLseïJ!3@gA8SC60M1cpcŗP2zmx-j. +iBb4AB +1&~.O\n.].Q|G?ْ@q|@!RIg csRs@)q A˷.$m%G^TdY K3-#*c⏈WDΝg}_Ps@uHTG_z1( D祸–ʼnBy,| =ۺxtQLE@N +}sa_ӌ[~}*eҹKWt-A$PdraH鷕9on1Z/?f襵n'x4t L*EpYޠ‹V~!5Pfqd4uVQÎSdޞjIiYJ!G:ȥJK x]*|39b7 \jd^'}&B l]5p(uETQvFԄA?yuE u3q^2~)gxl| +Fma rwr)&)7PÎB-\ެ؊> ۝ClrVaf`š+;S*EGU⟏D3?_C;["e|bJBNJ;[ ЮqvoFz0Β[%kDg!4Ņ1pmᤔ`ϐeӀWJfݼ 2dĂXs9TI`H"yb%ʝ^i!.TPȼ%1xBH[o]z%~_ŗ#|>{UD) +dߡW/Q<MDw\J`Llm'\ƞ٭ &~%4-vFՄd,4c )ybdaDu)2`a- ۵\s+L#OaFX+w>یV~npl9Ve|adLT%n$k#EF_pL&@%iIQFtLdF΁10^hV-o+ߞ>{Kx&K4~mF/ +s{b/4*X\bAedEx.Kkђi^jaQ.ybXAVb]3&$fh^D!vt zAL J55 +5.US/sx p&hZZNl["vA0x`84f:cnOܩ~X;y"Q%Ļ}w9}l$:&?.VԴ7Sšț_ 85r=fN=Ԫ^p ~27F 4Kaރ!t}.]ۑ-Mz9YE7ɟAڵGj(FGqR$h(]2X魞'”C w-=yz֞ڎ7T#G`BUݝ0FVKSŖ'.aaj,_0r(cF:bώk[uڇ_ɭ`19\z΂' ̎ 35.H#nGeFAt:-;>"EL8y1(/eg9r}P@G1=-$ -ꚔK2zExjJ$9Eܓ5[5̋ylBi͗ S'6VCK'(nc-f\tHEV)FΆu7>Cf/8L55#G!8X0T +ښ8aQ4\ҼFp_W6 GSR q)CvS*eD:R`ҠA;T@425mt\Yԯ^DI7AՅli]- +.Z u1q?*Dj+tQv6Ed,)G|}'^s>JeD_{Tȑ/ςb},Dogs $82t ~fofiq1!@f#)_S {Y)0#pR-@|v txg^w2,QpqfK8znhE${&"5 T!r!=ʠF) Mϐ7ew*TCNȝ!}"!R#p蓼o7]vd,yk-OU^y7^pV ޅ&K(8 {lH "ঘ=;ݮD^*!Sk _?s#>|-R5" &`fxwr yq@9; 6ft9Y~ xZ51g|q\eEfCB;5K@#dN=Iw,n!WH0,u.uF }~e(|3{uĺ Mm3d!D:!ERAW1UpYOB}nJpQI$A3 WVBQ[є;: +Vb[qr`<M +RQKzG>W]C".5 +}ׇ̅=ݚR |$.u(@n-[b/x_Οs_]eְ}+L<9qO!eJpߡ2J+tNMZ +|!>GZ=suay+?r+:&5%c_ uCdY8!DN,8fC^Sή!od,E6 zeF1ekp{,-KˆJa}S{ϾZ?8(bqn3XuUdyy"2|J[WXk*vl].riltk2Û&d}8~$~Ze+"Օ]&kIO3s8 5{Nʠʹ9жpW7pvzi1*+bZ~.9̚0?Xާc@fZ 3 {y#_rFu,A$,?@w=amһ#:9 bìd5{7QsN:rLۀ6 δ)ǽ͊x:{]c$cWZ^f +/`Kxb2T芧ra=:vtSS01sq_㰎ET63Ɋ}V~02vdhV٢㌙e%"Jsd%=EXڎ UPyBu|<2b<^Z\ odY$y *u\b2I qb%?mOu)f=TD;g5#Sb#}4 V3 iq+Q'?mi*"!v1K?>(Snn4ABCMemNMbҐ(∍wetZ򼾃9/6 ʯ$hxappZF :^J +Sgic۳b7AԖs|`%&u&8 ,i;3a8ae +t/>}9۪Sn$8y[<}ymج@)WߴJ:Y/$D3j-.]v^\4pSx$:Epq2|/zLX&i:8]j k4lLi̫^[aR|6y_\O +8kJ_NF;}E-f-r_آRs2 6y$YAZ+Z W-#SE,I|XH_ ] ͼb |p3ޠ.zJ_X89zx3ǖJIn [M\ Q0~I􎡡((Ӕ@ + +;m;f ?ŗ LRIl ҕC $Lƶg_' &ZR'$%,A,EPL@xgH'XUI.@sZIT? -yw_\uNj?XՊ۲>-~J.^EK4Xq,ܒ\7?e.qgiQklN'0Z]Er]ưRdy؆k/w)Glm`Ri@nnJar0A+0@p ʕ90.s0ud(pyr6 1?Vm.Ifhr~+mcyeū>y0Hf f5` ||&KKZ]0g hVQg:%/$7_GBs]b9 %`wŹDtfGX4Hj80I J5[0.ǚۚlϴkDM:blo4ޟ>Ԑa 2#pEJ@̝T?d(u _,m}h'4m9PF`6MPᲂJʹhyJICڡ=&dͅ[mR/dT zDY:G{/% @4:͑3Ȩa[dP[7b M 60p&KmC)1}w+l#9w"ycUfI3olqܭɃ|.2y5m{H4ˋsEfpptP)Nk#>(7 +y,Uݼ$rog܆|E105W1Mgp +BvE:x!VGʓPO9_|SedƗ*1ԋm^g)d;euh#v[+ɾIeb&(!'X,]~:b;`Ÿde"·+{pͩ꯱ +O@~3&zR2>DZ|mXNf7PIX`AV4}PH_6}%K@+{O*.U4LH1#_)% euC (ZTlRi QTPsZ4jP?I[GYo&zgA>݂ 0׆Ɵa8pOP4>ecce\3 K4Oi:KD[#OoFU\C)lcO4 -v~&_lB'ᚳD ?OegPerɨQ}qD;%q88'AuoUS=~"rAoI!g;&{ZrALC5_D +T7p<4}`HQ*~9 +=_Yc\utܹ(Tk +$ ̘;NjjCOUǤPLÿM"}Jz#q/BqKC(*zB0.}Q Vժt@Kct$u!w@d(/]޻tqcN2vmc / +BWR jCc>C€yO t( &MWNSFlckOKi< BB@`?Lyqpt9e(H#D$8ğL[]B9Wd{fvFX_Q5OW"BkC4_AED{V"cH(_' lJ (U{$ +z(Fĕ'# ѿ@$(!qSȗC`by\ y V[ȞBV(5-I\e4'T-iC:N-(BB5t_X#X] U#(.?"@M SHMK T:Q +лݘ/sjö0~3אSy06FKdn|g4TZEǃtѣb3s(TC!Gxv9H'MYaN4;"ᕿ|D8s}TO|[jbr*CNe^+Z+?)Nzޓk( Q={;)9]SzO=.=:4S{\#^R՟5=FAIL!=cZ3}ƕ|]¸/BC@amp͙94 |< #y%gDВq^ƕKUT/񕤣(T8H޲pl9 e3(̬Cr8>dN?.WϕzLd +mׁ +<sP8.*_  +lYGRC|`UMU`|G?l܆sn첢Q +,#G mBܕoDA&)][z'ֱ"S3+_bȄJAJ<&e*+I F ZEx\RNS(l&&A/\ YW@ }nZb}M^elɩBτ:U nS nQ ^KLΕ^P2v^Õ",.ghc^/8[#$a|7Tpj5 D1`I74q,@L@}Kn)ht5U(ŏOG^nC+$u^\T3)|Y`3/6;TrumLQr|kv8 $Riabe)0R,z1qKvqt'JCKpOZ>܎Wh㐢Bc,Πf w{J3b)F3ԃvu|J`T.iBG,c4P~1'O87{E$q44lq c [̮ aQXS—Z?swg +Mߋyc+`֓_s9WWlH>6,eW.li{Dx[N>R4MzaĦMR?Ң3YoKKvBheuB+̏<G,cg 7!𕼸RaiTJ#LRV( ڥ @r#%VASY[2dz QM04Or?.:@YWWCBee>miJuCZs![*QdJEKL3{ gUeޕjA@!@.L(MQX]QBg/<c'POG=M +E@@P(8LU0jwʁ! lhULôsד5 xyh \{68|x]oݒ `|Ca9ԌrK8CaMZvD6O1@IYxk<DV\X:fC2TPXq!+&{S?p?!h:m؆Sb$ =oXcsw /n.2z]n=jE̿NHW&ݹ[Q݊n[ +z5qd[Ul]I .v1@ݛu mwKϚLkl ܢזk78'Fc6z5 ~Bã1˞H48`Z81g|OPOz4j!؛6^X&G!כ>}ѯ {כTi^%YW2O"V+^rc!(`9]=- ~qNKtvIJtACr%v%AaVqg e9:JV+WĚDKJR]S{ViQEP0Q_ф[kQ d]v`)uu6fɥ^4j1tTn=j`-.,Ҧ/?([ F̪.!;ӯq"r*9 h81I*[SD4^NJTE_K! $ֿe7,蠿wT$߷x 0Kp+2&WH_a>VGz-UXeL;hԾ#OF?|imw#nо2,[ PMB3 ÇSUeJ)Ifn<WO!J}guzuqkw2ܘZ,d< gLFD8#%IfOQ6uC司bCTNjViA8eDHHܣ:C%E%$d"y Ux]첍eW!%a`ɉ)~X"$#xLT#Rcʵ4J&3=-6$4 UOGήIJ/CɭDysCTek֡ +IGH?NVbylj~]qbݺPWR} _Y4RU+ \FŌgAmDu*!%iМ iP yUЈY9Xqukv2I-p}->]lLTe2xU&Hfjjsҙ!(ىj6R+"%,UDEޙKΒPL>u0#Q .hb}@;1-pf*pEF_[[9O$&k7xR!+$Vh$1\DJ"2\1Sks!$ @Dأ6Ŭ`q2©)E#8x>_f3Tڿ4q>K{&^0= &k:uBѼN ,PX7@L}`!~ЉHCWN\~+sQr G(8Y%yIchb-tH(耈oC)ؒ2Xe+`(2G(Z7gbP4HEP;T=7(PxWB`1CΘU$>t G qDIRXʵzfXcX g@}c.NP:Tz#dJ00;n#yAFA0$ (` ` `D@ DNo&Ѝ#"!2ȘB٨04(^ %HUP"| +Eܔ㵬*s&bDG=x +O)Mjp$6A;)" +hF?̫Kʈ T*p zSNPz *ə@gP(ʔJG^# 5ѝg`!!8zffS([GKSWL5 v#-D)[ !8AIfϬ%¤6=$*4HdT$KhOImڥZxQ)KDxCvgPAjL2#0 &.\5Ooj7U=y~ T#LX[X&C .\cLտ5!!3 ,QĂb‚CΰE¸&E8# }rh1aɡ1k;4K 'G#Z"ʡb^qwHADQ",&_E8'LD>0g $/ +$i>4'^ σ7g"ThNCο" +='yQ)P{4JskCLL^Snz`W9Cq w6 ڷ,˽_zxcN">g1\&дH'rtjMOGj"< +quy܏L%$NBJB1E;\(\X"\oQp5ZņZkUuR'$Eկ(UQ-G?cX/Z({ +{^B_'ylt3 ݔ3@BrRkG=Y#j;Ķa( -rZN_m"E)T-(tǹ\tLF=$v(ls\X,vɔ W&5*ZAm#2 Bޞj.@іmK@ۨ +lk2SO&LgAzb!*!6 EJHRІٳ7c"M M`+CF JZ1(Zh38!@Zth'Op4%m_WIlL)tLgD sWc&9nV6}߸n}5.BDz>yK04s!]ŇW@s.Q_>&||,nȼ1_Mgjfw0Tc>c? G,ăc9s;8_>n\^%[FANnpSIhqM8OB .J wQ9X}c^ 6Od>F/VtVf3wGbCfe7Cd^JNysH Pa!o@BG/ޕР3lmL ;"( eTGxŚ0_ v#!iyB>1I Y'wYT~UnWˉn GI@P 0hIlϽ2IWt&blCh +~7PwDrbOf=~ɴv8GL&2bJ2R =hvH5qm79hr6re3F@u>`iLg bXS`FJV셬{ Y= "IiՖx%#%)_='NRI`"뼵lhК^r,31D8rW :<\H6D6TxEHƞa/@3;vV&"o򀁨BK پ)(,%My2f(QJtc-@`XY\stI԰ᡎ=`^"lsa76o1C2 Ǵ( 3!ץ!NaxI?o>I{PRn-n1!#U9C:ĽXYGVy5l0q ߣW0MΎtW4]o^5KrXas6|%q…)G |g79[t !"8}^Mڵ35EXм^KǼ9&pH>Ƙ( +z@1g \"h aSчde+}**X*j Y4tKuUD>Z T3ב-T9 adF[Xs< S1]~}߀72ݤn#y]BtļT Sdy gg[\CwG~@Cy!~>a1j@m6v69| +9Xtg)QkeWY\f Ut@` +$2Ӎ>ƌK,O%o>VɤD7Rs5;4XZr;ppN|{E_Iu1 b:T;rQV C*'S\bU5TZf0zUz!=| +)^<5Xבt1v3E[".*ݪAx +=C~K|o~ޅ[h ѝi%J(mY'_i xKL4 A \= +KraR&]gz4"0v v2SNl pĈX F -q+CFL 3Ϟ)tIgQ|iodRԀ&4:42HՑTsA=%s!I@pC6^ĕ?|9]kʘ,q̩m 8ԻԶ B;4f7"ְ6 鮻)5KSP)8[ XӫU>#<9v{pw=@fC<,J +[/:#;6`j5|c2x dB +\>ar=l2کY(os\h;Ԙ #d*ۀ3!^M3ÑN\QMcA6S6࣍7ou{H0d77iБydx`QQKm$@_ +Qa\Գ +;Nj7aS}>=tytQPðВx3Ɔq:˳gg>V6U@+,´iQ?G5]M1ۮ]X+V\Wx[CjNrQ5Yx/9_C 쯳~>15fqY& Tg~y6#m.8<*,0cצ<Ae⻦ ad`acB3!H?Ӄg3\*[k]|2CSt*c]8I7 $dc#UKdNU=yU +{X_ޚe v&0p,a^REF (uN`Y74HT7!b&:c^7sRQyíCod%W,M!X1'zF*9 (q/)BK|\-W6v?I&3Pb>& $]zHw>tIl$|@eFP ҈.E6JLK6 .#>?pإ撴TE! wK++Ji,n(1^jJ`G.&.O&E1KN;Cp['&C (Sǟ)< JPRECK +%'tl7u&"RkN=#ઐ/ sS(aеuȺ6A "k{),NmS"t?…1{}V$|>05a{=>+{=P}И|emBP㡆0%3+ ήZ+}oU:*405PwߌGtm۷V'.xzEx;L)wu,S(5@mRQ~XN_OdaBE0EZ +P]9"rNIf&>@(/TdYfD 6 +W7kϷԟˍHx9'JY@šzV?yNetRT^oIanՏ=m_و.#lKl;@oզE\)X X}Cc_+;"҉BcpQX8ƖAcK,@-T#г5 b/l/S=u$,pJOPРQq~ -XM +4JSRXnRlQS1)*Գt$ y޵-Ȍ_SzG,Ne g"C4-Dr6r2K#Ƕ^/FrNxƕ2_ +2GAʖ!׷֔bgA&Ǖj \Bg%vf[ -|X^Hu,3FgZKF[V +xRrt}3~7KP\d9>"ԝd.$=fR\w)fvUԼ#2];0 Ihlw?hѸj`fؠI{E?359IxkuwC˿uG1q(9r L{D`J%J e\AhcW/BEL7ep/ī>ߝiXXR.`&H'<,6aw`=L(jx'OX PK9._Ӥ# 6Exwr׫ #i\|J#ОZFr pq2B'5/g~c,SrەTztDA3~ k.mEk E2\6 -A|I%xl8RȜ!#MXt>M9jVb#UXdC6#@`dvj'uٕCkmc$|} !R#9 S +DMŽEvtP"/9dcjH^n1HS=I K;I_r +;IwR*vGdol0ӞEF &<1&CK8tpO>2?#a6:HA=\l3O0 !g&P|` rS^+N%y2EId( endstream endobj 12 0 obj <>stream +h +5_>qiyYȃi06CaPLwZP[kTS~#a[1#qZYc$jfo/m =:e*Jݰ,y0$dPL0*ҩtu;ywB-W tO+OGHhg7{[;:a}5#K㣫 +u#<82VS,LQ +i}}"Q^1ˆ=wm#'R1Ccr +&mg-Sh!{9qB?T=3%? YWA)O鮩̰vB1^Om@# &<%=ʅd6Cue҄K(ו%3b΀y-T2؅4>EkWw)"Y5TÛ1BF!+c".u=~- i{U~U~u S{,NUM.1 ftiqeN,RlePtpGO'bUK$nK@,ȿxF hcԽs(,͔Dr/웺!+؁OꂑbPSXb7 Z8$.g?ky\V1S2bP8vTz +B7CNNYGsIWGEٕ!gnggn=61oɢQ˗Er}Ֆ + +ͲFdVahEu`5{BMއaQL:iKa +U' '/;jHb ؈/?$P@HqJz" }x8ǐL {qs&KO޾I^і)U%q dA0e6[OPp8G\;C,~rh#>yaR:"g 9r+Qq$16l'gCaP@G mZQ ֍VpX,tQ7na{v$*Fb3p^uP#agv;DaXF'ޱeȃ,46cα= {#Qѭ "L.´2~ز-BZdaOv(`H ") D_"NXq"YGb!aXܫ!HP$"]ь!!]đ ҩ!@bHCPT6 &RC,C|"˔xcUbYcxYBb8W L B8 +1|@<&rBTrLL,3!F?6DM"!j Zg0'0BHubwp8! A\N~& (7H +4HV(nez(Jf=b"y(|tR4 EnLF Ar)R;y 'SHƦU"rZ +$@#*̨HTTX{Tf@خRU! }rXq :8sb?+X+"ێ +QկXd8W!sq6h?F@B~,>Y`4? <-8ZM.ݧ#m0'>ȋaG/*ȍ/Pɾ=${|/^ 2{ցqQ{D/cmBS4׃ #O<,N=`"lb\͊'/FH1 =qp&,_"Xyɨ0 @2<.p ŧx423d^ՌLoFi慨3N>3ÀFLЀ9xAwr4?)iv\ȶ:l혁qh*2;,R0m5X#LᎮqz(6rZccVfȣ #emlS6QǫoqLG ЍhD:xM xaE 7@{Ŀ|vS ns24Gq9LYq$AQ`v cWmxrM91#o̢mJ̴8(9pA{XtD8Ħt\i;Qhh^Ծ8>lu<h d8C1Mtx'áQB;N(!8T7i dK;Ñ$,!"ٱ5E9@)w~;2̭c,ǰTX::mjƋձα|c7Fe17xc\uo7u#dAD7:JXQ ܘu\܆Xi)v^mLƈȷ0*ǽܯQ?bl$`m>'.Wc#5یk,()5hc󫁡AjL=;vG5 ?ЎH CԘOÃi 6!r4SJ#A҈?hxc8qv \<Úmg0Xb5Zh39p8f|n' ގi #d+3_0ÖX2YyenA 1ܡ2R'CUaHw8J5y#Üw !cã o1"o#b0Qvxpqpj@HvAPwsDغIN +ÃxD*1 =n5Ɓ* IY&0bMӈ[cz\4bIIk#z9 `5 *Y +!hah{|F~=> ƍ+2E0^'<X`<?{3꣌_`}@?m{agGH.."=H #wq@ Q\.1uagYPtao 9N˅M.nR:X9.1շ0 PI-d}[Bk $q@gB" +>f!QtU1i!³4CE7Ķi97 +cáh.\{>-DzGaY`H0<_ȚXlEx88E + ťmx, KWگ"9E)L[dKPw^_\%#3fHxF ۈVrhEbYcB#WR*b#;*~:!G*1Ň\sOUR*\TX.7E,T,# +\>"Sh=Rjaj +}A)NKsR§Rv `GK +jb)V##(8|Q(#Dq# D˵CI2B!]G.#Y`ŊqA(_EᆖbO~̑#{{d'2GPy|s'\Ý8׉%N +XEA,9RrB uNބ q`A#kHAuL t&^I3DIdbHńQ$Y:IPD{%y /!c,pH%d%鮬2%XRRq?%wm/J_TYRl׿%#*]B$%MªR X&1Z}DX=%]t$LHb&E[gR<$ H4`ߜztwDX5!GlGoR0x爏'8GԮ,E-gIh60 D4bzw @Fta+O_dE8'0> dӊpZ? : @PFD&BKp|#\ ⛡uCTYoϻvbltË!hQj;C(ys1De  + aX2O!<) )<%X:.E&!t {;Mi)KaVD-%6=hR.LK!⁝yXA.2<rŠ)cxPmҖr;;uRbC:(v֟Btu+@@F) {>È9lc0"+ rrPRȊ()m f`R`ӑi7)VRJ]{[ +>t SHKMܔS)z+7P[Td30AZXh*]z*!?ڨb Opx2`8k)%bUP\U2Q8U+'XD+nZEV26 $Оp@ܡUY3Ж\pX*Z09QCL*r CO\+i4eh@ 1d8Bӓb#XFi_MS.4z ($䯌n4*Ti\"hjRGQ3ۿx!B> هB'^}# !j0 +_!lv5!l_5oI5j 5Y!2R}A 6qpMX/+>6!vM?xr6 }6SèF>~mn܆o=`6H fy`8n^w`nM7<$8VA8G8bqI.@C=rzL[|V9_н^4x7lF89Z sWNL){HV:~I FH?VG:ôN:ba`"aY;`Xv0 P;;vn`6r (aWOwQ{yWe;]^w`<=raӿxqd҂n<gv~<'Y4\ҊĂ#-+cbWm6<YA \zވ䑣Ѓe?VP!]G_M"(؝-6 +ӃU +R\ +kW 39H*O* D}RY )@ؠ+im]3%iKO9ӤN/~2@EaT+xfI IϤ`5{KIkAk6_k& +bIA$`Vh6ْlDI:Ҧ [RP@FʕDPrLx1DQ6T[ 2>$%F2ЉQV)؉ӻPOa[& +2mex+D7֢PqhjdZf|$Da@jtg.#vǤ +ԒIPLIn{ x;͓Ǻ=CEh;~7J]q0JTJ<*NRa&ޒ Xw*`׮e R HAb ƅʥ\KS ~9iӑT.IXM@t5j'NS }1~tF,ف1OSY۔C@%-xÁ]Vh`I@\ J݀Jjm$FgɰfTllwL_Y6%+g} S .kBM>4"X[Go@DCi 0$%Q Ӓ|fh2TYyO.Z+݀s<&:q@bw9P<1"x,x,5([ 涔:ɤ `P'0[( G=XAI0W +לb/ ~R.8YZ!& Pߐei+`Y* T*CTy?ɛ|F<MqyM[=I*K +Лalt + `r:D\ P5!P0\X`KM+涢2K8dI= xaޛI4tM6A{-p?xziܬzE+FvcHh*~n#%㌫g=ᡊ(ry)MQ&osk`7盿P7LqY2U@DOdVm^)?2W +ue#^d8@q~A A@JB/&00>Z 7<H@ ly1f@Ц|mkEȂx!ݙJm4*WUbcX0),bW,zZXs0ksn^gܬ'KvzhꟉ-}l^-e!_'O/ (R=sS;GX'rKd7Q$Ch+Zj3m¿cX[5/̨P-F% iߔe?IhOr6Y)?PrV#ѦN>9:K852H]o\IIJ丏VPwkGޚ)ꭩ[^6obx[K'7$p?g5SPtBQs.HIq|6Az,Hek_bW_l")~Wgl_ke]Ne/'ZWK1s.'"nG/î+Bț@?tG?ڨ5;Q$A[=Ul2 [tT5_뇊IL_+J$\5-﷪ P_OٮHlwbd?g?PGd- +r1dAK"`\Cp$xo%O/,{E~Hjg +'#xF>{chXYX;GpbEdRId9#Ŭ @g;W*q銢>}7>#@j=}+˟kg_+NghJ^ҏ;> +|O07H`'80FPa; +6*`_r8סl}LĝHu~J)I-FH?*$f9"\"!4xQSt-+&I"@Z6So.1nMި(Qk(LMŒ(Ao&(A<3 [5=h3jJd=`i(fXcܵu:R30c0h4~d cHIP|?GmwqEvY5ʻ]r N|+ oe)ah?=c4X;Bd=_K?~d}'.Q*zUգaԽGC/ӧEaxx`~Jkg"R4 R4ȿKKŧ!ORߌ+r̊WZb$^MNTi>|lYR4- +`m)sa~?ApgAQg|)m*nQ%O8> )2T\Q)ɴ|(W2kXf~*rAVA7hhm_CIɫvһnZV5[ vڷx<5[Vvír(s1bj*DigDCٝx<^˚«t;SM +Rafx_ŗۭwrLPPz ev;܉n3z<ӝv glMrݎNx:rz=ov<τrDt(ۡ\0x;ق 7.;Np +Juw3n9ζr<nPݼ-x\ӡx.wxATf$I:I49DX )2Rf"gq7 +RIR\WU䝁3IL| Ke7T.ToHjKc4o>~>QĽ>-4im+1X0do3Kae д쿙f:Ȟ=d,wzY:`|,bˊ[>l,s/Дt_?}j:cgH#/.򏢮8rZQMw 31k7Lhc@Rc1esQPaZMMTdiOMZy p$4*a./9_fةvif$; <B["EH|{Ȉwvig;P v*l8=q/i'!I^NwU I[/x!$$ ¦Kpak&l~ tbR%t9|~]S2 1P,cbk#$m}ao!_B;?fS.3 +3p+䭭&?9,OE<4ڴ;Ѐ[@2$0z}s#H(vψ]EE*ؑ뇉=clӷKrRp@@iVy3TU`g]ޥ]z蟁zOMz6遮d_]遥J)bj [d_mMXǻeFr , QogW"򖒱n)YN!uF]e*}Amb%G[d!HN(QH>B!w*n<ȑoXOt79L 4,{(__'ȉr9Tybaō~gLLiBWCO{7Ka8OdG? z/ӊ6F[!lY=Azܿc(mHS[~c%*r<E~j&/ 쮯D7oDӎ}#Dډ 6Ė%gC^ŸpMifLpUsc;Uh=;8de6+URU,vu/\]|-6>I]SF"h`j_ihTWz&tiO>.]&<9a4ykL{LGYZݪiڬ,~!0-r;yjWؤ1R"'/@{AŸOp=:oEL9%H###RtDu; |/zz7Hg@خC!;o؍YL NE(vϵc8}ӈ~&t1hzGNw>c+F9v 9?b+LM^.%+r׋ +ƞ䄇Iz +=!oy[cgEA\C-nπco/X;K1BPBA PizЁL2F$IRRc]hXtaz^\wCWQ7lme~ؿ@Rc;޾ -Lv  ݏm~#MڷFLӷx[CC3~JDi!_$E2hzB&1 +@(u5Iԉ$Ze,Ǭ FsF>M]S,6i!)i̜ ڥǧ=jAQ0dzu(Wkv+f|_=G^t0 I^eB/W89AIv5,Qycʅ3 EW߹.T ]CV>1c8m]eH1A[ՠE!|<g f n]wIIszrj7d7-u+ߥN1c@oĆL DӘ:d3hC!h@KbWq#V1}5V9ߪE6r6y^oK;sXcGɹ-qX٠AηjpלEl3S +t$ U4WVd4=[Hw׶Ϟm'N]cGsÕ «%v-v$:E 7;LT8EʷSImQME*7谣D D.NC5-LO~ +T$4UF5KQE~ΫTAbrܵw\%roK;.[5y%8\[+z'4%S`,{AkS0[vUW>=4-=OqHv~#fݨA YN α!6hN!lc u`Yw [GuPUwNP"" u&^{Nξ2WyBv +pEpi$ =-cˊ@>YdF}b}#7> ah!!{LշɌA?k.{lL$4WמEg9~#4)_#OAJrߨn3")2&,# +9 9$מ@V='gAȔmF+EGx +)=(M9Oa ag&H`Q(yK 7[ؚ~QNSk!? _eI(! ?z|rvS})ۣi^-LOu]wD)]d59qaeI]Ci& [ti}OI]Y{JWu|t)DC +OC] )ɺ~|EY5J7*ϒAhTE}%ɸ?’wqzL~7j\ cnAVGɗXIy{LPߓ$W@F!"T 8ZI&qFDDE!ݞŽ%zJRf7;nҟ(,c h]f(#OS*IMSkOuGKyfO&Wͮn*e!:aH=.r6oN";K[jw K#a~Õ,KϮJXkz` ^Cozl;TY=XQ9I 31 V> %Cj\M{mv 0 EHyb&!sȷk-%8`GD LLU !la}Κ*\YPkn#J Z :]COC|ivqVc灗+~Do^=.HI{cfD(x`A,(ҢW.kI!4QiV'PX.OS~2c~2cO˘Jð02ydmUw3VFf*U͎R%!=FƉ" *Y2h7ی7oFEYA|1 14Am2v^QEz]#] |l?dUU+a8x[fji1g +~u[F򚳈ܺ#%mm۔G/CeIw }s BG7YϊA,sFƟ=1KՠlЌze2PԺE<;$l}#~/TSv̸sԤ).{䵦Оd^I+ Exj <%&]9]ۿ"]be5(Qb]~v !4=NnT{O7W?"[ 9K-ZO͟UnUcRAt];uAχ}&5h0`&>lNBق~\p%K+FQ'NP/h1 mcٯ5S$H6VZ- =JWyaf'8񖥨G}Ί켤}eiy`fJ.i?2oEqȸpۨA,a(~itHOkq°%3GD} +HЃ,kV8Z\@%.(n +^̠'8ԆIGTS'3d*?|lO /jȒw|}o$; 3k[plB~<%9v WAǸpYkZ3Ǟ-斧? +qңYiZ|^ΐ8hFXPr3d*yz3c;~2:3VՏ3"ssz05oCN YsMc.㩟&h '4*TQ0 rcI~ ޾iĐ$qچesYOA2zg_,灗j˒Lcɴ-;Dhu [HC߀."y`g/$T-z/-2  43EUɕ-YQvc|OLthH_fu8A='HE?Kզ;!xJfaIӒDsN(pӒ9[ZÕ/nY~/ooQB +~aq{޽'¤k|tm7&|1%: _B2\SȎb%nܵc0S~,\gcС܂- _j `CzÆ3< A c8'TÒlAJ7[њQ[(i.-@ߠ: V^ +NKf`eTu1fg@Et!9T۟ ѷG`^Q*9SD\]m,R  *# \\M?U?mFX!)p_B!ȳcECuI:E))L+J@ALw8la|%R',L~ҴEJJXቆ,"*C[(9u8ZI,o#(iCЂ\"\Oes´Y>=~ H qa '@lxglROu9ڨC .*t7n 'd}{2<=qytN̫RoTQϼkn9)ՈPD|myb,N^>s_y٣6fcgp\'W߰8dkY>/0[٧ oꎉC9F'w'6NҾ,#C7|q ڟQOvEdzHM}7iJ} |ZAWy|4rʹM w1?ju)Qsl;> fһ/7haKq%A2O/W'ףq*J؍rFd:c.;[;oZ {Hb F&IR&0-k\[8}{ #Ԫrg"ަ~ ;kIVff" +XG"~QaaJ> +-܄]᫄WB +;r@CBבu?ĘpMA##5LxlAԛHP0 `)`"`cC XhQ=EL&\I/iRnJuGZg## hjѱ.1R贻 Ɣ3!#X13nSFZ'h'_6a5){ +? +w1{Zw1`w)Ξ A$Zc쎩us{Τ> n. wص[L+pWxR*[/(Vˌl][KE:-,Q. TDzJA>B!'˔4>Aw+y ]aiwIڔn듐pՄ&xRA SjAlp%34} +#CmP|]NJE#P@CM~_*m*Pѧe'ptS/ʷ(.hLyF?>T5 TmH!y  5)ȝdVJ䗠be[:N$d5aѧ]i|ZE *__ҦXDA}Nρ._<|iU"VCM]} ZD$#TA84|E׆"ܪeNlwIoaz7)| *Ȧ5_ܨ^5FP4攟(찾X5x [$sO"+D.MJKm{=vYE|~K3M3e +l=IYM;kW=8I=fWa? 9;X XtKjGU}* #0,Jw]Ęv +Y&yNzLr| [$8,DVBl"0**7{N =!D))`I!|! 6ij kHkS *][v#ڮ<y +\EBI'4F*2[cQIv$\'%|tf$;trUy9h5?*WaC +WG:&$U [MƚHSH _Jc!5⽭p0S^ 7I_j(MCM,rlNP~Ґ@χ`EWj2@ìY/b !juS̘vVy :/bӑ ZE_C֚c%0 * XBC +MH:7¹Dwi9fAff&\8&n~_W%"p [+(n{Y 5F=J !ؤ,h ( `Wbo䱼7GQ)&`hGo Rd`WlkSIU`ۄ]7UH ne1c 0_ׯ~fP:э#u< +)@& Ac8~z h7d2(RW#I!N__PN1nOI}S'`rSl(r6%y^]HOVU7eἭXSav+d$"M"cAMYlbtzIm\I}\3eB,#7~~Y|SEQN|(V ZA3fK6eڞ[ͺOEBRETVԤ +` tjël94 c;(nq= >./(>4D +NqݝO; q6 -g\MvTs|2duDZ f@=Fyh~T˴Sg(̳cؽUTH52je H12_e˕Uwv %'̹k<P7\stW6mx L3)a{'m[=|'R/ϱdW5n>e1iv04lT!JIV˩)GwȳjLA Mm)n>GYu4z6fS9*Ԉ]ܻsϼgsWz\ԝJ.s#8[)tO]?['x#CiOzgK-ؓHC",ăTAހt_+!Hy,I6qOU0'A.|CRNϒm" +L䗗!(X#r[,f7u +UvG*a>nk`z):t?c95qS%ԇv u"{;iwXI1*C1*.)/rN}{ʷ)鼏yO:J.s*zВVˠ$/}To\5,_Up 2`va -Xe}Lf߸4c w +=- +Wm}9oU:? $-80y[ؖ))h1 DoM<&q6ed3a^'%Du`3l`WL/=I.3mpjE\1 ǎT */"v i${G@0)*^g<\EGIe)7pO#vvwMBbAT nwPt_K+|Xvk:,͊9ػ~uYx +-K>'6܁G:GR]Μ\Ět +\E_$?alߨ?EG~BˏNZT@70lgP$T /[Ș A9 /Jw )wAcAA'\} C 3gQ1Ű#uӚ1=ȤhUr+_{Ljr&1wR^l&qY|×_Шps0 +,N_z͢{ ,EO1sZV +Di$0lWbP8Q/eX%M< aض)vzPpSZT͂K1qs3|ȬF,R ?ag\F\N4j1!#b Iq[&E61K%ĽrnGed0]7rWIĪʸDOr .׼Nļ#v65O`WHpLEF=^WKJ+"^) 6'Z Ф8y"Hy1]6/|2lF$[^S}Ji@ޚ^,U:=ȕ68!C,pFQxp;XYrПEiEZ{2{b%aG#غuR'~*(H +hBX81A] caC,sع{*p2y=.1PjX]:2ym$NSg+0tr<]2sPաU{UUq"[@c=ۅp%TV~U"*S.!˫ +%I"ee!0J.NdI.@}G34xuc#MGˠwN00%PXG;CX29BHzecyϻF\c%'BӃydg<\8rTF)u,,MD}Ԟ)5K@A/i葠Og*pK)Ļ{'# N[z9)Иo˫:f2q63fK{,Df38juJ*fllq +ϲIUO +tܧ5mGƍ_oD,z[?*s3ߚI5Jo9"Gcç R`Uy""D脨(QDD>Rhp! +K. DljH͸·+k3.,`f4M-k=3N^V2VɤV򣗋Դy7rz9]SY!x4mF }m1:Q]]N`Z%B=#ĿR`VI$%їRD0DB%*!@TBTCBCBQ % l][g,Eq\E=Qd_iZMV9TB)vq׺Ne(*DWXr+W9$I_4r(Յ>u]+,[wL˅d#Fh:CZ&$FEF̉h-TDm<#&JCF Q&Ts0Vi)?&~tm`1jɯZ򰨲h\=aOg7L% +ޫ'l`2h! 1+oP{hrRs<]Oe%AmӠ۶I0XM22΅,<9qO@J;єğ<;ܣ5+iNn[a֩{8Ÿ%?FЇ5X b|B$=D' isl#Yɴ̡*2$~DJ 'I"|KeRhFG1ȫ103. U~dE%A$m\3'oMe$DX}KvuJb\GOUcՉP߱@摦"̕@OOGϧHڲfǩӅ;d5fɝЛh͚wiplx.}Ach$\IJ)noEiޯ}o:ZmKL2 7LI4(ZTX_mV^gu)TK$h5DҚB[lڧKil[4c!K1UcF)x]6nő)-f)MJ ҧ%wZĂȤ`YW׫*1V9'MIWaļWXާB/UvY)Zu R+y䨨 "CK5:Nʖk4Yp'r'{ߥB-RbV 16Q.Mjt2AWO_ײKL)ovahBa+t;[Xtm!gosG;Y{4"Fr"w\Q PVAJ"s/ԉȁ;O%.-88jiR$d\[hsW$@]'ʞiP !F :b1FuúMe&1aqk5Ed*آ1 6qNue2xy7̝341*I0G`gus2,O<^}C$IeܬrvN,|'Mc!;KL8a}5>yZ3pzֱza=oj<ރUQ]ן +z ꭁNG\ʕ=a>Cio˃sVvVׁlQ$;)e >gAEQUe=r[|·y'裲@@狰qyrZ_=L.ng)$|-sٓRnix7)g7w*H䒴[b51-kGS"z&3d_e`qz92o4e!m0W%__:4}gyVl^=+8/21}S҂Iiwg܍׉nsֽۜu9=g̓/5$7 $)x=p6HxP̄jR$yoq>6Ki[j|D!ngS>6? ט,&G ٕ*֕E9!^;x חz .WgO7<0r}<||L˻XVG%C7)sHu߁  1\rK)ߟ!}|x_ y gal=?KƈTv zf wg7_O0g}2t-uXW ċgKA‟bxanIYnmi.= Wo1@) +=ݷtnm.ْ=k㎷ xIE*'~/Rh!uD6)zBW.Np}e_>fWVh>m^a-//;3C͂ +Y |# Q(jwB7Rޥܽ4m7}GyC^&mN=JA:L!o<<k[/2|)ߑT丮2#H1x&y|ͻ<ΊӰ|y]n>^GXSz4@dܑG8i|P| cY.5C!(lu^jh۾R%H++ YYH/> "V# UCQ3vJ2ZKo(Gie6`PsΣ^S,lW>Eq- aI}QAz/N+H:P>#}R1#uN,>>8PA`xjkbaczQVz aM_=s>ÒbFUa~;Ut"25uAyGnGnGO](Gjۈ(i xCrAt.Y/=>XlpNSTeQW>`{l9u.d AҨ㶌jt~ZlkYIJBX MrO{]LMbs3 ~_2i31zAnP^1QCB[qE,8"^*4\GUWO՛ttU3OW ^nf( ~CWGk@f&&}OCeA7=BPaHFrܥs`A@d8#r}l6[YKgr-t3<!Lź3 a#W؋t9B8tm񷟆=EȖ@/xOV N8fw[T$=V~'||~z|ު:!:0 +f>ǚy!o'sku"=(]CO%uCו;GBd`_% o$]Os˧˸1Bjӣ8S<[s}#.O{:ޣ/;/!\u|yU*gtD6YiR8$Đ$mL8;2~kFH^#4 =Ս|Z2#7ޚޏޣ_g}D`ۚtx~FftH&F2=O}g?8EXo!a>; u\$8As9_ElМ E;6lF8;2d{A0qvd +M'&_ |V|;sb+ < G/᠌\x>*N2_y%Yufi>u'jѾ1r.$!u8O 4Ku5eb^ +f]skgXn +ϋu^DaJٞ~{]A>?O;gy#XmZ9BYsykulRV,!Ӥd!"nHb(DOB;7&z2N\1Ȼ/OFNSK9|d +ނSѫM)H+XYcՎpx^3Ҍ#O |ӼoYy뙔QZB֫lahTU>لS.3Rh'yiB/H!D $rIްdKjo;E=_.z%*PiMHN8>=֝ayy&~EwUlBw5w&c :\ld eLt< gE5ys(+'ʔ XLH_mT۫d9f.c KSNxB}GXXmI8RCלv, 8J0(gƾ0Yʈ^LU_X<x$KBYK56A2.yk;eWZ," Z_L~1Ʈ%p?S%=TO]oؕko0Úyo樐;)a`Q9WTJq~`,FyVP#aM%#1c| + ?O^orufB|e K25 \" R kKQ41TgXjøpdCwnު2(e +VZoСu'e\ƱkNLÒZID21eD!$:qQ2AJ1RqpVꈶ0FS#]Ud002`9G 0T'z&]#Fxfom@e}soqPrUF93?v:ݘD b=.Dۋ=_`k +T˖^jr^惮61]bsIѶ(iřs znS#'&r3MmɈv<市HvI(F0AQ5 OUYҰ\w"f3I5KhS$+d ^tVJح:f7w#eoBLʖaYע>-uJ6:o3} Ѓ\Piảlà(2a6b\q/ +Cs8hU$Wa]>-쫠pk^~Y$QDETQk>M~@UM%duJ񄬢xzs17`KP}몏z2 J7B_[PĪ#^ 9Q}@%N/nJT5w +dVtJ=QQˡjg,\󛁽+p c(AT4JMLgqό5ʢ7By- m,H[?5;}r)e%ۧp xFAi`L@8\w*ܥ>c9h؃+[-=OL^t%8/֩"ï_^+R C@ z*㴎S5!qrH4(q[ {5͢:2SdL CwҲ9*PrRIXBAnJr[G5;EȾnb*CXPGs~˔O!wcpӃ& +TF϶C)^rXsSsJoRI5"=Pw۠@M9l{(OÒ4JRe ++'K*=R uzSaWOFaj}hNWp=(7TR[B]Vu9= 2ӏ 3x ^IVshJN2Zk8KIzex :I uKey A4Ck +d%mh}+~v콰ƵbH?XVG1qWاU֣moiOwk = +47z(Y[7BHiF2?J!^cp#T1eF%Z +J$lU3qVi 4";D]Dk}FӼ@^gA14Ï%i(-`̴#y(1MK6Vř?4: j.0mQYL{Kga2oY}͸V&ua?}NR]L \qa112lq|q1UTuQV>+ v0a:(7aT뛃qzE >ұWI1'.AbVXј cT|g}TC.FHY"wr< gm_]ZE>uҢ 4@xdDM2 +Ú%zù%.B_zKV6Fv۲`6[~yVօx˺eCj+@M®$7N F׊ʢs;#xjW`X0U]$wUiI0".!:hCRhͥ8_Sf>"ipEr #-GmtaoNfB֎[W75wyyjI U}LGY ߷?0FKa3LX"zf2Rh2A\7ƪ1r7Ч= : #SnJU6ѵ2fo%g}j~DHӾ3X,4{*lw;"WqtndGZ%(qN2Y,)'|vTRb/{،bӿ>\fW i♽ f kb!D1͞1Ä3vN!D);2>@dxKhv:MwFL _2R  q"i5?HNN͵H SQbqw&*4F.qB}A4C ,GI$bsB1 +5{m}6To\NavXM  L zf#0&z4jW\bZ֊ݬBz0#%jɐo\-EGt~f~-E=eWt(&KIzm} ltT#H}6hXQԲ:+~7_b]. h ~ӫr`(DEoH Io6󵱞TJv?VCm]")AA$)L)%)m""AXK]5uY<P^KHn( F3J"q:w +pp' x Y~B_|0f }(T/EєYHIJ"$%3|Sx +'1 Km 0TvTdRVd6zk1\,aZƲh {X)0#.; ڂd#R?6!X|D$f +ta`'&($&`q-hɼ⼐vUTp*= `+P 5{ ~q)}G!#bw:p} q7);t [@('X8oqoFPۺlh-ׇc6_ a]]C4k3,OP'!Xز̒uu]İv6A3࡝ 0X5$zj[J^W@1%:n 69n_I˲h}=zPlzbcnҀ39pB%^p^)?ND-(!3̶RP=4EH,!RN栀ujs!h~ ;[.Skn61Z2ڦ/͎{VɒT W`'`&lGs^.W+h +[`qd.kWWl*ꖕ| 1~"TAg|%6 '^őJY(RI!heYжh{qcK-^ ZaKl\sO;j=^E~Bi _ԫHOcfQ| UļZھ>֩c66{ց 6 +=УniaZGxWE3R?.1yE%S>W0ugPRԲ;︊f_؉Bzީ9IILة}\_)X$'qT!q~L=D<( <"D.> '>N"̰m&6d 6隼6CW]% %0<$~^ 4r`Cyxׯ +-3zi\)d8mfH'Y9$Ghr(ezI8)$tR)$7Cp@RF210*HԹWUvāE|6Nh>Aq>QđG0+g\X6]YSuݾE9d?v˾oa +Rz騩^9DDJ b80n^1Rx34O瑐8PS<r @&,n u3!/d)|V!X*Bfpc/MɌ~ND53~i +&(]D&')N'' 4g +2)qюB1xgZ cW*]UƋ932]ɺA /26j9G@Aގ3#MX9n~GQqŹ?u +c?i)9 t r +ytڷ)J+4qպ˶g7}m4+h},lDZV +JPZZYt/'@r9~!/ ,eS(g|sAV%@T+!l™ iy%qOքG}G/6]cԳ^bR=0F1>d+NvK* _X-\nF. vS~  ̖p~ _ldY,C-j^2ˎa_*)EL-S%LbC2R*,_ZO>f̄aH43Vfc';uR:\(е젟63}>DQDZ[G^2Jw!flHHG7 +5SXqK(8?Bova]f\2aOHDRK*)}JOJ)k/<9~o5KٖLעGEX$6ҏFaF A6 gv 4?&뾆!) s8g}!͔/0rct eZg9-:ZYE-:ۚ4`QQ0ܳrK0Z1i:ϋ\GגKj'e<#ɔy}DGctڂ5\gG:2PlHK eh}C`R9_=ѬKHz>{R)$h ~:=jiC;" +^O>Bd)tszO8[ra5}jKa!pA@z r̳m 4~㦓ȸG yhϿ_u[ +5.fWp|YhV +gSE|WVŭ [xM!U(T]Y¢qk91,yE+ ZJu:=RE((8v{TL-"m/6ؒMc!z$76"ɥjBWR!92]grTȁ@"%tU*m}0sfUcdYlLO0%4}i%mô +VT/r_%u,f]'0yŹU:TcMy-\0pftYּ"%ܩq'3~Ղ>gh? +*evf0L'I_|M_V|1F1?ǹIJ挔q&t/Waʪe &0?u4<-6lN[k1m,g[MV6z!{[6xל6aa7 +@/$Opi9ѱ 056{a%B/mc\U;pu`%sш5cWH\+JŲejʗ\%YX)DH2m9}76taa6|Z,­C# Î+,cbsZ]V11,Y̴|_+av}NV*[26F>reΞ $eďF#Vtj.̝vI cWȰ8,uHů*Hv6 +ea4 ( 8m<(3}e U%?NGo(>3_3R'_%t$k }/}dP2}2l'i}{y}.a& IoA0IBz 2c_侸ө$¦#nk K; ;›l:ƭ@ߤAlwr\ݲ$1XV&tozBY.F;g:MhƯK`H٨'3QtQ|nYV6Lctd[%̢x A6{oVC.>\-=Y̴vƅi7+e_nYYڸbްIyJMϙXS:es( Ht\fNgi: ZV}? +zpnӓJo"XWܝ@N!~~ v< +ySذRw\_9n%s~Ho@@O 9O='NĐ\td?!SG,"XR55%MSW+ꖏgh96G,(SH&^"Yذf5z԰0|btk xLY͒[\''&4ʼۅ ̷uq ^725t[@w@"H"_drr2ŬD2oJ^uO-IiȊI&8 ۍ㷅q3uװ6l~w ,^ȵJ#XPv \ p7_ZMF]G1t"nqN=W̲2K }q +w]JlV(=0/U4w-Xȶvl@ =# +SH?qCo>^(8w?1**y"OBytN"waU~5ƫ2}hMZq|r,&4l/" qFU@p٭pTQ, 4jqg`c0#zȺ#IJѴP6[Y[Zp";I@٥ UBv|Mb?"%)X+?]0F *8zSJC%4r zOpxM['HMJ,}"p¦#*% (9wSnKܗS-t< +] @wt Wik&q ޚ;)'0)#w3tWȲ^pK[M5Id́ M~?GނՃ$7!?I5>zƫ[Ҽ8̻ .h?Z%˰U +[ֶ8-MA.[!.S;m~hpdK+gYXB޴A ,RW/z~pښ)dy fK3:W [>4۟3Sf޲,HbѶڔ Ohi =A1{p u9[DFid}ďZ?3">鏐(>; Vk'Zt<բ-i:1rI{Ƭ.EO:@U@A\}w +庂VI kμƖR C3mi\m۶6˓.*8n2?lpB3 +Hj8HRNJ%p=2 >+qry_ą2Y_-ćoPo3EQʢG" +8ОAcr) +!3Ș3m'q ' +!~tvR%͗uC8H3{vja uYD+jJoV(6`__&mY4&&GsޤI=tri$N|M44T$+'@9xlX=̙Ѥ=*%=dRr`H;`btEKV## 'yFo2A"՗]6K&YOszMZyǯź,.Dh 4Xv5lКf \d8F~՗\4+p\Z(aP}Yau͚Tִ[>Q?Yl>ʒ`)7+GPR\jRY)g.&K'93p]QXBe6т_̖tswun_V"ZQ8!-JŁ`dy6 :b4o4pJTca~8U´6 y~ +s?)aSe)UUʓN U,:TL#J%hߡ#710aa& @f<ȓ=!:`uΛ/.,(>LL#)&3jfbyn3~v4aHyiDDrV9FmQVI(Lȉ} _a 8p1)=5 ϬeTkۀB6c'6}A@Ueݯ3*Bq('9igО6OqV *ttNL203ey0=K'J09lE?ZY,a*N]z#Z΁p ^;;W563Rխ?3!@[rqw֏qVs?4E%؍q>,GaP ww(8yIZzx oQ6ZWĴh']^lWשLmzdbiEnS"wxq(ׁX7`û׺0֯^vjnx`E^S4Tt5}:_v!@NuY 7 8=~ьmrfhVscL7Be/a8YÏ0M×3_0aEK?7ߕ#.׭\fn񔰪mtIV#*NhrKd[p0"bݠ&0D/ Zuڳ>.Y#*P %faJ$M*OiGA\0 {>pxyYGQԫ7mF'@qњ5ETSU%5Ymؙ7؍zdR 66nZ}ٞz7ϗP@^QNㄣʕ +j`JE>hXFظ Z#G^  #u@IGY}5g7~9nֿswu@ll{V|W"j(_UiFM0YD*KfJOu<9Eư "~[k/ԇkbj<(I%J\yGdlyMXI~9%׼A=vI[-IT( +"&EPLCO9e]KsɕR.J!qu6KXУmyFYVX>{Y6( m'=RIVH,XQ:q9&7_2& Vb' #'%2x ֗IVlʉFҪ%hѭ#{z'[ Y9zh0)7Rt +7$p3_rZ۴A6}WPӊ+N'+ތm]Mxi.Cڞ:> + +ũDRzg0X+0̟PUUeڂS RGU_g m$#Aُ9qS'zh) G=Ҏn v]Q _$F0|MjY%Zmn&D2jGzrEOh'fjkFM}n3Z=#=weB H-7xUmq' L'rգMC%SӰS2IRUA1i`G1gKor&R6Ѱyehpi85F1 o#wҚK |xΓW8j5gƏ߸Q;@;Y[T'2v 5 j=_Y\}%aмzw_<{^9t@..Z@xQeE3y V䰦Q wŐ@A"gLuI4zd KX{~"|)R9[D܋fWz p'(6E{5QZ?kj +6UwAiAxaBDžΎ1%2/3 $Ç:3v 40Ls <ˁ]Pp|Ҏ%ED0*:(Pm.7?Ic> U;G<2 L;ԙq7{8'i#;~.fZŚ!}>hD3MXhf$3hO!m9̼2i0'M cFI!dǷ6 I֋b 9අ_(ǗƠKrl0W0݂p@ضX3z&,=z@aȺZ[7(_40z"hGp8qc1hKuYZig 3̶I&ocΌ' +TI7hPWYGQ[%,PfL$XI +z(72X:ٚobHP[EUǙvjтyl.m##5uYHL'z<-שE/RJԪQv|O^Wib@ˑ$|Bk3oS3'F71 7bwD +yĊ/ŠlBjowƑcl7v]#=^];mW'6䒮:y҄}/ǜlw֚6֍X𼁂B;#w:2q5d>TCl`7;+4a܌@ 9I6Nˏ⪏.fl{ t sF6߱zm'gԘǹhmۋfloޢ1j_~0Tʍfl{RgbZe'aʼM(aS;[gǏ  :>ȏ%]ȸ\- {MM_Y4xtGK +2*{HQOP3uIB{HzG?7|6 /vr{gW ?q~_o?됍o_H@XI?E|ih8t뵐=lsY?wŅҭxMsNVk۞ޞ.+-Kp}G2iK}yNzΒ_#zPY FϪw +:3W=f+0_>*H.ot`~7s_=oTcFd7WOTq'?k +ΪhOt\ʢ+ܛZ~ {pB~83O3-R9?+QOh9 hOv7I> $r6mݒU[Ã7=eNj`gŊ4ST֣vž{ >|oЛlh_~V.$gUdNJ~^9'o?fv!^F39xX L1lZ;2j]Xե/\1b7(g i =H ;hqlۨ*LF陧1% p@`` ;G濘 ש"k?!ï9oF*^ 1aiumfzE:ld W}ĭ w+ositin(SourceGraphicinoperatoinobject0%xid)AI__1idh10yww/Def ;4alNois4GaussianBlu1bstdDevifeOffsedddoSpecularLightfePointLz(-2000z-5xy1ysConstant(Expone1urfacetyll-color:whspecOuk3k3kk1litPaik4arithmet2kkMergNod2BevelShadow4y4Morphologyradiu1.(dilabnby-bnd5bn0DisplacementMapxChannelSelecRy(Ays3b3atri1mb34animaddit(refromcalcM(linearestaralwaybeg0sNd5totofillfreezaccumunonb58cccc8cccc1ccccccn-5CoolB4-1D_663erErod6477(spli1 1;20 15;200 200; 15 20;1 1 RpeatD(indefin1removc50 5PixelPlay;20 20;Diffuseyellow;green;blue;indigo;violet;red;oran5Diazimu8elev6d1nl5re010122xred688-1213y40.0.nSta45d4ofeFloofloodblack; opacity:dnsCd350110Grayx-OCompBlurTO1nentTransfFunctabV2FuncG.7 0B1XferFire]cL!"IRH 8VNF:A8$1( @A`0P ³ku +Ĥpj-l4qPaIݮP9%m58 vr\EzQ|,rǰ+!Cj^x +K~8%U%y%qoj2"B^ʾGY +0OZ"K7nR*lU߯)Kpa і.:큵GhQ [IrDŵ!E9 +B0<kUٵ@UaJK+8x28N}Ur/-D;BM-b iJ*CZ 0Y7RQ,d!I239)b*1F`Pa˯ +*.ʟ,eZ0 + =7TRoIL'rWP/~ ` NmYUI|ckNQ}V )9~ʲ V  9B(d\UzP4I%U8B9H01BٺňVGLYBZL5C)Q]AdTĠوN-zQ8e08ҠshR!-6+V̲f.@q@b ]J~.G/qA@1hM$nm 6s Y *=3C@>2Xhb2Nampa:QrebDV5Mr&(#L fg2Hsw ,I'l\5e" ߘ8fu` +UhkZDA|ӁöC#aEf8/E羔H%,l[!t yTpT>wH[1cVmq1og'xp$JJ#kڀM(48P0OL&Ĕߝ$f1kH ;e$F>eH0T6p5ˇZˑw*VB_dos- ()"Up<!Lԋg2d2uqnQz&FeDya2s?HK)PI_{[)Fug&\񅡟_x:_3}T +V/:4\@8%c"̞',J:'bLYK%%tܔ-':5Plō3ڞ<qP \j,{j80_z;'2nouL)bf֢#SCNBfmt/:g)BJƏՉī +z +4"NGpUg, - kLpZ)Q* mׯ5Vrҙ ۘLÎE^ɜYm~& jĭa(.lɛy1$ 14Qu>p5 ?f +ފD((CCB(n^0v,ٵ +C;@\q {n8꾁fzݨ1~\COٯ1 ͳ e&*- 9 FBU]_3WAà3-T$NK'_xщ "MKf@X?'\@4-b|i@Cv\`Y?"8RNdlgSDL*D?<@$N<"u5>(>F'A +鷨RE] +fZ K3VUb=dkVy +Fx 2@/#à2DmRq epgr٭Aڟih%?'9pi䪪:n8B[H#ɂ>T @(IʔRJlu?? aqUHF ,噌Rn}̤,=W#P)UR5Jj)ݽ{5@\"PBQr e'2'rBu7(Z4@0 F@d8uJ!uJ*MF[aI^hiuYZ/=*@TPaoR+-ʬG=d,VzPKGf&!5BJ0Â!qacA !1Ą$FY>K$I2McT?8"aɖ~@KrÒ,8p(悰p`I24",ɒ,Kb.pXG "Llw>GS2zsVVَ4<wTg>V'5Ü震us=>x2~AݎroEF(QEe^ut,"mZ4LSdBbB?H[hHrf^ԇuPs]1wyu]4OB*0~x7GT`T& yoCf 1a * =`EayH"L  +ǣ"QLdN3O3z> T@\HX[d=hOZmZ9h(*Mác7g?<̼&ն ""bj {w3w3fn7:p_k92+,BVVl&UZq;6s{2Rb<*;ҪMrj@)/OuIVvС/wk>}q']8ϵqy#9)v>veg>W3ɒgf&Htt41/2 +-H +J Q_sHFgQX3]Hfj,EH!OHnjT#JQ"CǪR<_3 +2Лd:ϡ509Ck&AS/@p>S0mtФWd"Gr5)!dɈ*d2+//T'BFBbQ(VoǬ@ꭐSx`PEsg2-2E; 0 ћT쬊V_SyeǃGs0>Blo{|fDn=^r7J2QL2JRy2A(z&affdfotGIG!dQ췊nMnḞ~0(nR(~//4Q_Q76C-"{cQ߁hyiFzg"JGΊKG Âh(,, PPx\Tx0`P,`0 &$jQ4,( ,,.TcV* Y\@PGEC"(CB9rsA ;aCa>z0\8*"#`#5Eh ?0b_Ej&[+C" Csw,RFeu_E: YJ|tP_bEi {k.@<]2#K4T2k;^Igiv2-}-w\yX3PB״Jzf#7UQ6+޽OZ\{y'=3޶U"s~.sTSw%O&}w+<(vH9ADSܪ-Ē,ĢIvDDzGP:{NO(gZ>#sv&?4 H˿T/}U۪{M C=7i ݛ?Gyଢ଼=t._e3G|iQ('_45 +! P#P("Ǣ)ubG6Ftj9ƀƑe]hCJqa}1IlCNRhАq@*) VD ,ƖkH˝9d'xQ3ܞhW"Mx]xgW^BYTs1G;T)49 , aeW{d#wd~̰xǽ7/t!["~co}"Ƅ]ٷm\IowH~los0C 8 +-hfqQpMQgPDh&O3gը;8PF@2ZT߼y۽XZl]vҨ%V1q@lЦۗs׬ +nt Ju]if+SsŐ3]'{,\J^jK8|RSӄeðgWGjo԰FFv =hpĴX2B$oUG(hPOS:% bS\^6:Fk(M% ։q0$.8ieoD]'R񚢳[ sw 9@W!}Y)CGFY`!SJ]GWwTrESHd{%8aCB!4"|̥Vhd%ڹh fQwoW`E BG ?]v1P̟gRKnzO6~9ֵZNjh$dY_yYz_pa8E',dv,'+ t[5Dk-_NV{|ӱπmKy۬r# @ɑƯ%Md \ + eܗINu+pTN\}GwBTh8' +KvORfġHA CMj՗ +Z4iKy;ۺYWj^řLZdȡa*JG1g 9[@tw4m` +ݛu`TaZS}Iн:v}Vhq^a @?3w33,` zhg=QcDx\C6 Pb@ZWg ϱ{u,e@d&#yƅ+|$` y~ρ9tԇ3l f921NP9ǡ7(e @tk%eZu%C沮37›UdTX.&|4/[o5A$[b0#Cs&c|Kzx)BEӮAHxA؂ztŨst5 #pӓ \}A`䛾Գ),Bf [h{F WnGS[f*f".3SAXXGh;2|R;+Q-*~> +<面_-i@Yoc8ET}d,ŦMV.6tO,FN&yJ9/@M7d ͬG,KGHtN2EU \ " *e=݇nUŒqU+fQmwzUюN@S|H "ZosI>im667sﭭThF^5Z +@i$::QM{T› 0]e!=ߘ0*!Kp-+.Dm~ n伷\m.z]A.IZ6Q +Ȋ*6\h>K?&Xa3.xށ GN0I l{RFLg&C[ayѾzs=1H ~edyoQlz0 9x!0rBa$0\=Pʍu1sQ}lTmƄ0' $Ї^.҈6PY-iQ}&|l /B}bV1dTf[y'K1#lz׏U+1׳&.BKoUmH/>ÍZ"VISk0PK-)./Y'X<~ƛIUݘ/*lnD-% `#F( "G׃G255 of@0F˕B v"TY:EA?i{~;׫VH P Cg p9X5%8$~ +Bк: ?]fHCpkqQ=U]4=)r@JHVcPBe(ä)Nj070`Q!@ \?ek9~=CNRgJ2,bLw#L$/T,jYn7 y S"A*9k{Vl~J?5*uyz2̛ $[tL L P쓳+w@Lh'"BDr髠L)Rԧ@OJ'RVenVFEY`QɱM_忪ܘx{0ՈhVB, bolEmG|Y_d9A~V>P + 7GqHCR>k-%TLRU|\xEŋ[ *4#%e Uૡt4j,_qF|û_ u[ls2׼/rmNV$c{37 8$T_>_깤Q.ϒV9#z&(qK +۾##)CB)T'Ғn"9~q=`m| +UI'!EaUOU> >}8qҵcɦIWԦlÁ fO) 8%IPW,, 453~@K*@4"$6PUW`# P,uv?`NwѠ]%`tvֵ)Pp؄KxRʖЊ8v7N}QGp.f wy/̏*BL3ŏSβ RuLbEn)yz85Ұfj]|!θȑ|I6ᙰ?~4dC<^pB\~[a_b(D> d:&OM^8\)>}-?-[ +g[!Y2֒r(C4UksQTnxа8G C&I)QqĠklDwo:&0]DD_-j%q|]++0M QV"+}T.lcV//gԅ*Fȸ%#'"nz?-'fg(p/B!L`~~Wˁ%e `V폡ث#֢8!(NqQؓj'wPbQfCP s\TQ8\(i {dzêbY0^$YC1R3 "_W$SߦgL)5^քhDQ RR?~\;C^=%@!'!#IO0S}zqλVz{pG+a͓*[ 2%P|"qe8;rP1S„% D%ޝ\|Es11W NNNXP^g!HgvZp`.\wk:@HfD5Y1]ҳvV[/BuoH7g +K ܧ]aot/jb~uJ:/W>h7`.?iʊBuK;;\a'ܚlqlGY8q34JX."w'Y'OsC+M $KހEl̾)x۵:+;UF2be]HaĠ 2m~(FMY ʟ?mXjLߠO2:iǘ2Uy%vY!QgR:j̼/pa8N5d=֭$ާAB1-n1)کl} [fum}DQ-Ali +Btduk/@;̨+V69\V7!ȶ:~`tuyqv4zQH KΩp_JZ4C69 Eh̓Pj|BGT옐[(A98EDcLV\=-@6Os}S]4cwݚ|% /J+ +-4\ tc7Vf3jYެMRH{j|q,ln\a4 ~c7 C4?i_|153#]e6(OH>tꙛbbg+%-/z}{ FsӒS\Inqd.]nSpHQ9P4, +0Vx)4&s2QP }Z<`BqZM\qWM_z9+sKBh}_o^;6:Ks`ddxG<ءAw&RhkVZ:lCnEiPc}8â/ b1Kg3s2h!1~1AJ:`H)`-ⓤbU X xjUh=ho<Sh)8W|"m4]Co2)ܰOjJ!9@ր>As؅#+8BSHDdH1%:r:prcxcYk+ҽM{l8\@o "VȎ#Ԥݖ19b]1YAkrsMYiKxj& ye ++b5֧1bM@aNBP6A 1?, 's d 2&S%/kpfF~`7 +/`]_¸y-$PC v owW &6VzQB[hVZZ rl_8>9=19\ LPo+lqzR=6LPԵn7ީUǐEfx[jd|ur~=PƱe&sdМA;K?3-aR/d# ^ˊ (Y1Ԍe`TBtFza TN *6P]Kɰ\lRQ+"守씾3ax!%UqpD *p#HA ,E"ITބi8E Bhle3ۗ>D($B" +XC5=60 28E2Uz&ˆ6 +pP"eU pP1di( Y3H#QLLtD4H#ѨHBAl@/(hhP8 C^ĕ0#$HӃrz" Ndi$fyNϣz^Eڼlom9ٳf2Wdu9fm%7k,71Wm%;/{k]cgUscf-ٲsVykM{y}WlԓW6V,ߕDoN6m(L4 ӡh`)A:zQ$>Rjzty@Pe,"(ZsdlkεKՕNQ[ +T`\<*Sax@&PB,RQy0_|LYop Z3![s dm@`*)BEq\|Q=Vzv6wZ?y2tJX 'z@Q"lXL8/RW=,ٮᄍwNl0߆ tVսemݧ6N&o0A&9mDrzJ7sw绿\ݷ>:ifeܹ͒ߟ?>K͟,7M:v[2g\G%QyIy0T.B ֍WU/z.,Rp(p<[aQ%U gͭ`t253#i6@4U@pa91B!B!c_[6YN +rf8aH$+\H|}C 2WN6gwiB]EP$6ioswf!,F8BWCϺwtl>k? 'm**12`L}y憃4H&ɨ8 endstream endobj 13 0 obj <>stream +m] I 9%X]cHGzvc߸ 4?FJ-]Jػ~CͰuPKN#Pk} +i435;W`\3Eʫv'T(\\e[jO:-]Mk8]Wy7"ۣ@9IƼhAB 3|4 tmr {-g՝@;Hţք_<Ʋxbpa{-@iΉ>$Ҿ܇l)F,laSr#".I.]z%Y&QeAQҸ ٹh 0,K:O@@ +Aex/ +F@0_"2A&[e/ %GCj&W_tXht_hIg[I I%/ LmEgL !wo(QP"cU41ʳaxƍ|"=v*!3D? f=8]1QdKQ)p.3h^/qYC IwL3NZO7 Qi.vĞ T 'Vk $rh/Le.yܽJTMv,!rj6Abe]'FK5J946P~yT93FQ$38xeP$y%Sp^?cDˡ>Խex9Ѕ>J +quD݋8=NY a,F@.){pbYӚDw2u4ѺGklm6p5Dnm5 SPIVB`\MV\.g#Wqpk ߝFIIȜc6HpÈaC)s,&F+`t0'?+ΉxpI p?4$򤙛t{ $55dP J"=zÌ]Ee@FRB^FR%]\6)A$p>#x{5nno_\Nqm7g@%]i{0>)d6éF0;9GaFɺy]Z!t L#NoDjxxU7i1ahGOR.ؿhVdxT&(mRkOs]tKxefY a˼諭y:5|#qђ&(;+JRi-GEw㘭ks$PW[]\TE;0MHiCqo '(sQ~  ؞~.:}F7ۥU@Q:uk.t7(u "EՕÓ=+rp4J[wsY^zgEL_ZSRUYVFX ˣbB + Eer!#D66 `. :a`4*(0 +H&@B` lxd$ʅx$d$K@`!q$JAF##l#ypS<#Ddhd$ X8 Ƀ +Jp0d2B2AbQipP4ΟaAvL2 h@y2d\$#dH2P(ҊJp6\b\H.a8JŹH*L&Bp$fRLX,> e"D(  +bLF P.D +d*& + Pd0<"O"];SB;lQR5t_i[]ߒ^OZ-/7ToTxҨTL!$(a 1@j "b I +Je* ? 8l`/8PD($A^-sEƮxA"bCH%x; a!:EV n0&)((3 Xdӄo֥P#"f\`,+ &(t d" EJn8xn '8H\E* Ώal Dp崙-@,Q8n&쀆44Q`MLڗl1- j"[=_& +IѨD, D Pf !ha)%<t2mYF'3ApptKiT؃r"5ĩݞ@?iٝeZ "m"PTTe)Ex1Ê@)vYl`弸ai"`@ͼgX,tp $i\Be~ՔހXJ=l5{4w5 +\c"Wٖ1 6[$"!! Ӛ +00kRzX |7Hv  ?ʵ+\<-ujSU*g?NH00u>\ `x +UqA\"h .Lb- vGl]D :b31sI샒Tb#U;R$ +Fqu,^_d`% .uDxbH0Yy)Chj̙h(U,E+~}=KԶS 1 )zڨ߬z5vшxP03Z6$ipPcZ4g ަGg!~c-]`1?$fGhu 9%$MԶD,nLK5Kџ|Cl0:*$@! a$d#thd4otuf]t6"=l4ˎaw8 |n`#.CݶQm _%D`d! +@@U- BhY)h"=^, 'W6bI > !M:$w2\uuGK:)/uu  @U5,M.;+ '%ݪv<6󶙧J_Jzc6i/ҽ-GogF?=Fr[7OR\pv. +cc7eUM-S:mb*ZRAަE]ϊt{^{` :@2E{Bz?4Nz:{7+{.]ARvbP]BeT10B^cU`Ս}`՘R~bz +rm YUFHe4 +8j AP<00pw0%@"7 1e_'O<0^{y42q=]MQ޽ y~`h4V92YX-=f5*gpZpl•eNU\SoWoWFj,gd%a[‰@aaP}¢4Knqy2nF6#Ltⷵ8T\vݺ6QӔ&-\-\.Bp{'.Loxa߸Ƹfϯ]Ϟv9W8\`Ǹo{usQM0ns%\C~+}Z˦Dms傡H|;&{"ץDAwXnQj;CQ3fͮд eX-74]hY$DYhenR4+sf$ٕ;\=+ taaůr0QS@_yےVykw^{ 2;} 1`@Q S;. oPf'_,!PpWUmxG!lrC4 MR4+W3h\ze]y4 ^ע,h\RIt KuPKւ&٬+*\OduVzUJ*F mV8Tu Yv H)I'v`rS SB%֊Z ^ 1G XTS SOޖ`)L4HKa_MTQQJ{(|̚a1 JjR чY&L 30ca 4#T`"G9Ƚf4qe'5;JÁA7ZX^ZEYh5j¸&J1yoSJɛCD l(qKSPEUάVWyOW`'sNF h4KVĥ:7HT2WPz“r瓲5~ L> +JF^) bX1ZCYV@ 9m lNZI x4g5BwQ8zwq8D(@@w5$4Bo6 HАM82HSaܙ qyB`x1i!iav XAC.vDBّrA3J(8 h +2 +h,)J"?̠x|"$$+6tXGvN ֹ,Bg饨/C=kv5Af.X `ZI[ TegB+[ TzVS6ROYz[9ԤiHA(ߐV!!gA$!j@mT)3wVV1Q8BM73%N+ x*8-x"T#q=+\-F] + +]l brAŒêCۨCkÜHO<;(4mR*8~NŐ_i$YB`e4B0tJ^@I +]UckR!]AOAqr,Rp ЀI oLtf"DfABPAYA`!!<dkxZO/!bD/H_= x> |VPɧ*C-=Oτ/ \2eG'w(o".XxXc<FR@aoq3:҄d@MDBt}O:rY34^9>v g=u< wΰ +Nla>o9Kn}^쭽-޷[ÿ2-[@o/n[@qq_- [[Y..>vٰ+γmjko8km_ѵe-򌋮-VtmY J{o9ke5;\k|Z5TLx4mpV,1?*o_0xۺɸ_k \pnfhijesjos6\=W\7Wx/qe[o9O0nX-hq1<8s>9[>&$/\kb-\9kbj6 [Z֔]۞Le¤eK&iY-&ǐo=Cj;^C~=ͿO2EҮmOB䵇5pmWh6Wgn h?uYCeQѼۚ. tkr0{e R0πc7jN4EbмmA~- I> !Ƿ^KMhbf323nf,ePW _chblX 2o#t>rDðJtlQθs},(93vN`3&p^Z愍SRWWSnܒ+a 4 /A2_q܎5%5ySZmdBkƌo$W@^U oUe\^2Vf[_)@]'eM9$۫lb$k!OFx[920K'DxDQL]u +JgGh2W#TEz[g)vR%dMz~l!KޯCd4@3oeY$cu(fEX,QeI=+Gr"AyqRHl& +3bPE眄;|A4XֺB)U^|0i}&Fp!!D$HOPILmCO={ u! dFE}ƅDIJr53RCE4guQ8o$rpYTǬ]3VVdqCm/R21 $צ ӱ؅l{[p(C%AuM3!ʐm!V?8.*C ۾W!#ϠAbKP$QAc$0 |Isd}oQ.?fe xWMZ})( +FRr~Si?j\F + WBh9(`Ξn9>uJ#DOxw$^FN18/@&ڲR5XQ`r+hpZdXu(uQ$`j9 ʜ='PD6 ~렓d1#``U͐$SNJwH +\>hKԆ3^LDW.DY4M`G V9(u3wXCy4l-iyD=')E}9GND_/K!1ɰA)CV/t ^c Vo#a;F+Ez!þ:j`a/CC#H43q,0.hK,I(X-=B6)Ab܎ 3{GS ;^VDư{[9J+G1aScr(4h-3j[b;i2-Y=Y|m%VD/Sн )؅gLI@s4eMiM|F̀1̓f8iQYq&yQ`+;.( Jyhy֍)g ^A,GjR&yC,$;Ȕ @Dg-[:hbAjC &&OJ\θa&Ch4)V@EFrQ}$QzgnڇЈ>^1 ) \jipgH &DŋiB$ s:YBn>O\dmrl[f-1>!+}K6"ȓ+^S9'=ΞaW %MQv1*Z|Y:qQIM]>Dv2w$J>h^&E v.6kCI\ Z UW/E`b1n_AWڎrZ2k_!*~Aa!Z^?dD^ iye}ڔ7mflGW[Vx5 # +/TА 'DVBprZcŀdaɥ39έ"f>f8஢Ma(<" >Lɐբ{"Z[6rCyԯ#[$n|>ĢjLP +)RP +4ݕu:! R-ȏ▚Oڨl/2)8 PH99*KFȎ;ҹAd件7&jQ*kJ^TYڀz5&1z/`KϾhZ2o*(NwlDnbP mbN$`*JNۇپMkY'n@kUP}Nћ;a9S$fS۵k9 FWF3!wIG L )m# w9L482 + jKf\ 5\?aiizԨF*im`_BtD?0/˯Z|t9W^`P ѫTamlH- yz=-R܆B%HmL 1,q}s7 k Y$`_xV_>,|6 BLsYeS-˱`aXO5;H<7? Al\.;[^oE|\+PwʈHIQ2Qx?]h\7o\\(kM1am8敛VT`3q~xF%"4E<2&^F|bIhVl)UPOS(T@mϓŕu.y +J>zB9̏Մ:T2`(j(f" rOmYɑX)? +و[H;J6V +*ы*u,j!)Yi +(< ;a炐̨s0T0DHM/h< Z@ڈ"bý*>AR `bf\[~qJ#.OM݃N',:6| eHLFS` 5(xńmTeٮI>}_ Mv Igp2ʨƊLᢖ{qJXU>oA@h?Etl"Ipc`!'-l`:-FW,{x mݞAc#gAK +,aSLޝXv’o=p'] qCO x(΄kvR Qfl-&mک*9[[Lnӄy||0{8%,]l\sAƘzpYw1)gy 'r8?y9v^kxۊ$-F<?7$?heYG(d2,2*\>4븗$p{Dҩ9#"z"ӽWExϘ@|+ >s#oj#Is PqL|+gf2^sIS 9޲1EN/5sF4#-i\!c$tsϹھqΌhaa:݊θ)֜lYVebXzTaթNL16c &h4 |K- xjSzf[Y46,R%G_=M 'qg7ao6im+}݌?v~aijP]}\Q^ +0:?K;E1Zn{"7h{?bhp 㒂5 I,ء}P#\do@yg9 Kb0s[ylGIx  +Ўq2Jf;on57u巙+,ݽd(I>TjD, SN:v?W2Z 5@^Ya95 IO;R0hr +Lve 't +"G٠4/Q$re}z^|o=,rwР Lu2/,YK0eI`TzΟtL;y<R +}sAz&$DZnұeA-UtZ0 + ZQN3 ,u%m¶y>M OђWr7Cw Bjw# E.ϾR xGԘ3 ˅E)]9uA +(}_)"W*W jddQp#LW'ϳw拹H +jJg5NFZ,9 эXq [`/ :7T)Olآ@6`nĩjy?xqc%f v1IRch{2&}\@(ɉ^(fO2--}]{C uZ~~'bަ zdY/7` +=2Э#kkj|&,Mݢ9kr35cȽCM&rʸ2|g^.!ϻ"Twy[KJJH݅IzYzPJ}SJM)uk͝p1:6_AW4ë4FtP2Jg+t0?|y>{}A@f1S_&*}ɤZ}ʌC8ǡˁ=&fRK9p뿭ݗ+}nĸɆR짘fva͛@SP _ׄe]!HtoD(7 BqY-L]SynTߢb05!oez8.g +_ɕSR_+ʴ.g%KTݭ.;-jYrZjT$@EP~ejWA* +AIà3Pw瓨jEvwOn:?:?*\~Io}Ǘ{W= 3#ly7=8nx3"}5(t̵E2֑ XDQ`,Sˇt@sݳCMfPSw ;Կ#7őb&1u:ʸ2d8{>_f^SENYBi](*uRJ}S3\¢%1ޢ &A +_AYUn _ҫ`x\J0ܩƺ;1sSاn?lRW?R]Y9eA_&*I26 +U +~$Rq].f!@Ļmwu"E][_m 7R_g:Y%[ q@ %bӍh Pb@cʠDa" E.o̍(t [nD9t_6|ՒBWxer1ERy& UdLCmP3ì7{%3`vt@F>1[v7 cU +jcT9"-j?6K-z֣~~ksxDz#B㓣kw5ݢë`\쓹E]-E;O]J}.@)wRu O-z8/΋8ћՁq^̕8ػg/yȗ\@Z֥u[օgZwc n]ZH(KJԕ*"lUD0hL]*ua4<8đ| +³rPɤn׻Ֆbn1<Tq2I~(@J}'O !3i녒E׆)3oG>"7WFNAX|9ƐSWy UAn Lhc{С>,] ϕnc0)5ٟ3>]ߥW9_H"\` %Tl%^P!?s7!o E|; UH+{; ̵E\/;@sXCz59߻z'y; 0%墫wk:$43 +{+pwl8kHכ Dl.mDD6nD̊ AyNl܈em\ޒ +8| +' $rq5("ֈשi~"$)=iZIQͮ, r0)7sP7 +FIx + &*`Ͼ*#Z%+#mHyXJXxM=uE~PMH-G~<3ElIϳƄ(3=8gNȵv xBa;@ֵBg  +]9&CchK>$2-^Jg<nqjq@m]B?hse:e-<'uS3C/:zpWȖV?w +i3 +!Mk[zP Dc9[ReudDbyV_'c ٖ'rH +Λ_NJB*FKW(Y4F>vOHހKSd}pV4F>^Bk?mU~ݭxFrM$etT x ȕr5h9gȵAi10N OKb +)T)=FV4x?mJIW$OxgoFNyƳ +*Џ) -"K@ <*>@#a jayv-@JAo?O[j8 0Dϯ)?Z)^<X9+ 若+Q*;Xҙg,+o0jy.հR$feUmg{n1DA%r%y:h̤p`o8weMH(<"0U1T(vK+dT_Ɉ]+d>J<EL* E _y;;#wF4m}xyB? +K:1VkQXY]DL +"_UB +%r`1!HN{:WVXB_;` -E $]jS%]' T}bd?m:b)ȳQ6lb=>j$Z}*2X}1q|?<#?1N$ 6RaQB +R#̊L f/赝9}@I:=%g󭰍 + U`x`\0zJ:(.FO66LO1fqI!NO!|ŴNJ-^% }Mfv%ft©4،, +Lgw1WI:|\kFk!ƮllfA)x_$Ag +VXnS[3gLAAYrs04̴<@e?? + ,p"p%B+jآScTR)Aw,!?ZT4$";XgH+KM?%ˁ}(}Ⱦ7R a\`=ߦƿM .FuQ-$CXP#$ +@soxUQ:Btwݝ'؈=&."dgχ'yЍ`ܿE&|$ِ`,8z`WHr뺨e#Ux6%q71z ; 'ayf6DCLAřLJaà*.zLmX? \w??xK("-x}5 ixګJA‘f>ڇH&dCaX%hșҠJ%f5#b6qєS27T[,6&Nr J` !8(ıWP%YI +q4]{44Թ{ke`ŹXb̖\ܪۡ-CG#G +NʎAlsJ3: $"qGt%`@) 16k"%.>o-#3.1{naoy'#*H"_qޟ4FߴFBϝNW;bXV` @S/oȷ/Ov2 +nNr`^F_=RWS K4V"cKBz%Jkȗ? }or|!>NzPSG |a@hq,JdI<3F)xim >NdTN %4V蠄 m)' +//+\yv25idRP2>OHVWԧ{y3l=yz( BPg#{ּ\ D")1l6'x)RDR!.ޟ.`t/Pl*Z JrtM}U)ɕTu*hBFNA Ör2Boب~tw)(8һD^)|o<ST!O[nRJ{Z1â!TY\}~X|ar^͟_@͛H(+ ȓC絅"Q +$Wp +qU7MHfK sTqΤKBMtlH)XB?OY2)(PS?R/ .ˮ E"H +z:)}oC@$ y7B3VGlHI"(I }Yl.9b")H'1d[CWӄ"}JNA;NAr +.jթ3uDv)u[J])ῲ]EY蠄<$X +Ώ[j=l)g4ts:0?~_8G +zh 팥`y2-仑:KA~_x +^u_(U +z%{ 7R/LhALtS5veߑY3)8 ->_?RW_0CCL]zta"&{+ y5n#ZBB?t5BM3BE9S>REaP- `-eԄ" fUAT0L,`B{o,üBr QU,oȤȄ WBx[`^!/a#6T7ڊ7in޺R;ي +3 {-(6P)c ʶ>< VFD+ Td0Y3H>ˊ@/GNs7#Z ~Aj,/<eK3N=!]9e3ayf3 qbC: FaQe\x`ε}JE"d>H?KNR56A8YlC KwIi+@$T_y;h2ցJ+q踟Ɔ]R9ۙ *tPQ +88 ̷股tG]UPQ Je`t?Rա)ּFj%v v0)jF kP&mPq^7R7<]œy"I)$@d(~'G 9p ?!D ud- 3%Ǚ D&6ɖVϤ}Pޗ[/W|!i\QQio!@q(z-cgfx-+6 ͲW>J; #ss,?wg'G7~JkqvK w_Z禭dźvZI a[͵Dx6 ć]Фp&b"  {ul ܞ:hafǔ rb˳L9^cפ4n"L-/ ,<ɴW=|kD$ O{ D:.t2۟L>D}1TbzyrJ @Ux՝iJ͛T:|[3c:&~[l? gϚ"x&dcyT&պ͛ARɎ[$Y bPvL٫ZyBxHJJow]ДgcnIg *NR3OC0F-O"P $ё'&z$yTAC]'1r +:,"T&(Ɲ aW,;״$;/ۆiaN\ Hנj'o|9Sp\5sy&-'d~м#LQ1"@Ġm2S`%%W$+g:xCsJG ޯ*cьLGK\h@._mofL}(АX DH;v):^!Eq3Iv{*ίpva;ig0 (bkP6V?́Lx_Ap!Dn\\<# W!*`A)QI_4B_N"".$a$c+ae }ycm]n}W}D>ta˄"M)1Yw%!Sd$&##Wp#L<5t!R9 ֖,z%|Cޟ]IwOB_@z*h7R?47|4xtP]u{.x)8SgXބ"I=#Y)R޸;SUWS#\S@z]Xd%Hr } +V!ifBCE,xt*)u278.PCtP ƿ͉AXc1<džk +qCIb6.+5/JOz[:!3XlġӥJLBe@=##E1 +T_"h ƻq%l,%0 ,lgOKȑuVJx+Wud<;`>6%4vX}xvKzr|ݼm9.j> +$`DJx3g<x3YCZdEsE-u*u Ba)&˷"hgQM"`:Cioi illLҏ3P&>з eY;XxrVG,f$RJs6MdsSX'ƃ|W3!-/;{DBgFh8YӀZJ'cqHQI huTM @s9ȳOh57qBhƗ8dEm<XG>T'dwȶ\=SA1anN1.qf<7R7FzB_`QK +\5$*!2 "HeH0&FFB00$2*E0 bDSNAk5|YȡȢQOBEdkE&D{_Z"\wj[6AvҤs΍69iYI00NZP N$Rȷּv&6= =XC8/EZ>dѹxc9R?f`)O]EQqV9m1%l͖kNse2fڸ2K;%1@OFnri~CjAm<p 蔣 ^ddPʉ<7E_ث.ߢ , q1oNYe /oAsͮ|p9a +;3lxJ]ep,'!&uL]8N>:+Kl'JbYo\fy;ъMKS1 Ȁ%5=DLdBT`l[\b1w&ԋ,f89A;R"4W >X ͖E8[M)=źHo%9l1'IDzۿ yzfVF?S/@|,O_͞Xiƛi @{W#pS+2/V +$yF԰u*K22{,"0Vέ> T ꓽ+ 3 +txL\je7I=[3c +k̊o7$Ϭ/g؀SZu:ǗX/EdPآËdM9 + PQ xHgA?e xErZt.GS2 lt|E qit3F.D=$F*glGxSzze j)ySG?S A$ l"UAm;H.Z ""޻p޼ IdWJ 7# ѐJ,%i?s]7\$& PW'b Puvo@LCv.KGF +_f(W.m"XMzB[Na%?(fVcT+- 2Z@ +ǩ[P?%Nyf%7_.?%rhТUXSUסR"x׃|Fo}^VbJ8 jЈ(؎d_bs!SlzT'Nה7䴛fV 6ȆCgg*w0IqEBNAR*U⨢Xdxm7ũI;r >MͶtq JQ?LznwZ>+͘kL*g`KC:ދէɄ`Lon7+@kAf#E\  cBc6FN8NCh08[ ˨r)R-Dccπ+v)A{sV< +ҶysK%׃xn)΀Sqr7xuy,M/n`;MS%%E&H&fsS6 0mZ<kJ?Q^xŠh3u;8\ )Ye[SIX%mߺ+o> A$vP`6^Nfp&9c}}7/_fjbJL4owp23B+ywzO3Uol/s'5ȡxѭ$p*%`ʉl24qUjلs\IJYpS ix0XnfY1;!h&>x"V^788Nǘ ~;/ Ϸwҍ$VĠ,L(Tya&G488ȓcXUP7ЃR#5Mলd„oO#<7?mkGnE}{R>QhlF }Pjݐ*! z?*.}٪?xD݃_vz9 %N_Gqp fxyѷcw\P3,1`E!(ڋkוO@~ M꽍aGGQzdz= \Nr*EY@AB3VNVw%jO)-C]F]H4aK*A +oċ*SLZ)=c}g t$֑e.F5鞳R+5nF%<Aq捠XsAKMhrwfKm!cgl1qc%lu6Rtۑ?dW!NVmR5Zg^GEٔд76r1Иgh#Sk 34?ipЬ{ i(&hB{N54'iׇC3=o'h MH4hh*Р @M 'hL~&hNw `04 MMF4td# \CRu JC Cs. pBghqihVC)L =4[@MCԆ߉C#h8;Aczhk*'hVu>4M3 4ƲK4ECokB(ah^7q4F6yjdiZmˆ'mKD1NQlO*%SD.w{iU?5SG}{%U"`Y>2|Lv\з=j TSHHRlunA_W+́lOyCt "'+hePI#ql5-kybЊ@x]:Du gEyDc֋?_Muc[u*ձ#' f6>&BTz2: ٹ\ZN0ɋ| = V/xz66R%`OV`:Q}ֹR/< l"p8Œ3J"%؊5#bW”č7by=6,IV $-&sʛ%'OIz[p0@ؒ٣n #׮]%w _T.FTgr%o6lZ4o.טRߨSU4MLe1F˯f*JѮB$fe6@+a/O܃ ʘ6"E)"hvȖ=2iq_d8N* !l +`2]Ŵ|gsD-NF`{yLNDR|IQcȃ岃>[@}EE-ޤBr*SbCyWQ8ho#(gkX3`7I@FafrV97행 L  np#ZH m!DE|*SZB_q)Le+aӿBT%K i4dTԏT&1 *Ll-!}H {?XȥoBB +3f| G9k\nNrvϣ`jo3ߌϗ}O6( U`FEm$F,n ƱrRi,#QTKS)DmR,(ISȎdY}ot?D(eFRz* +a3-NqA \'7ÿ͗*ZntO&D*$_K(MhU5}|C% Nbg4ˬу (cGcfTK8ǴC,+ QA9R8cg-KUXS FALվU~@|UL"A?.7`g_AhbBh"&XWs40]:IL #~ǜ~Yi(Lr!2u{mCU\YX٧0bݹc?+79º/t‚,}P-Lʁ)݊H'aC^߆a6^!.xeU +u1,ζIxqU2`Dye/Fjju(mXܷ &#vI}l:&\k4ZJe5йP@mWxc&TJQ_tύ%o!L%'js#)[|Rr˖讁C&j`6;.yA{R_|,'rZZ_p2u KENaX *{VU|'Dp)hKI]9hxH?!v2{"8 .e׊ ~{DnC .ǧ=D"/vl9(RQ.$dH=6v&Y9]/]Md3R a#kiqUO㲻›BԲMCQUo|sK='\- 5no?^ڤM+A@Cƾuj( INnP$VlvG _:f94eL>bE1 +5y1"p1S{J#\C_ w`:tP/ Ⅽ ȶ.r _BѩZh2^GxZ7?`X.-}C0ϞIAKh~Є wShd)Uq#L + (Ŷ5{ 3Wt]I_u7V5|q\nvKRo.?*P[ ~i״mh_y.W~k0͊Kwv3cRmvYAJ<4mE(v2+Jl]!Q:q0#\L--qi1m6H8E΁rk{R /ږàM'ljyC=̲EyBѧ- >쥮IEA)YI~5wZ7*F# LJsbbE83 +dE`ꥊ&&|&?pϳ~,ILɳ.Eg7a+G-x19<Ж,Vf:)[X{:'o[L4G:O{ȱl@k?&I˩]eG?B%+?+l9vNCcj M"HF&BpVRK:sZJ$6O= c7OF x4,smg1?~;Ю'*=PtaZΰ0X.hJQIoݻVJZnd:ˆG"֏oh&Bqv9~#cߠXt&acl@llqjsWmncN)dCkVd<@c{:rm|:m{v[cLO\Q>mF +̷)V~%BXY%VS7[ifcti^(HLT +(ܫfcc؞FVdF.Ft歅XRk3Z6>#E m9զ::`q2g[X]db+1\0K-)9Tls-QB)˺w*˛rP\FAl&uRmN"SA +8M)-n`f i'" +L q@vAN{qm394t9Oہ֮kܶio5B e.'b)nIm$KɯyeZ:.Fî|\W Hnvypԭ   ZJzhu1Q.˳V),\~2p}KHpӖfo JbHr#(˾3zO@qi!/C~Rf>^mSp<)_j7jٓ'hdd`܁wz0TSd]MHl]/?=^V%?>RmWUz)^6술8ߒF<U?@P ᄀq N 95R4*\ + +T8Ǥ0&7tXQz$H`88"f\$#YP2 ;9[]bi7ݱPBF f}H|y#k{!vZ᚝\Aީ3 &M^[`I9E>Ǟ>ha=H wY|C +-3rGG +;H5}1K(D>K ύˌ888ʗ.ܸNz3t IUKY"8_`W3^ЭeCˑ=hم8? +ZǓ&[^,"܇Pt5Sؽ "s ,g-CC,w}AXv5b`k;06_ oI"BR,J?~6~̍8ȗĝKh.("Sz:Uq@TMb1{VYY|'5U |G_VO%ٜ,fK:Ɋ]FK^P)9V X`1OV1H>}@&}_ϥ3y-iNI%ntnV;wc .,.Jӏ=z0um'9Uf#߼lۻ/KWQ$S>E'u) +,l^4'174v\@a)g? ֪lW)KF/3f#_pCǝ\#]I0:COOJ +$L)][u]'NpMs,ne+ԹgRˆ6RQK 'ff0mY5\NN l0C#-<[DY!73AU-BLr[ty! + ,`f*[;x<, 8n|AEuc бBT$n :`Η07U,$b cI4n9`e sfbЉIaމ'Ёx|]9p)u/̨_,._ȉ;'0. B,Cuӗ{nxJ7̰}qD/qj% ]{p$E܆k᩼#;%Sc xPP;>Yy1YXIQIMyzHS =fb*¬4F>bRtY>ѵ¯RW5&GbR^ FcQ^M:,BDnJXewB9@%,btW(av9ϋY18anSĻ>9.HTŬ`b2V2}>ޭ)juQߗ0rmɹSAS0 E/<\ALRi ƈu0 Qa`Z/b/|}|#EZ@‰^aI`"mC|]!eXOrOؗϱw߼^vד0-AсR6m&s%ݒ8gUcBMv]Xw>/vF%x&8z[TFEWf 퇔E +>y+7#_8hN|x1'priV@~vY 1<4,آ6^n牥A#Yl7Ι 1i\2uNswzCׁaRȏd'7v=:%GϽ49l`_C.,۹ W66?i /7sT8).'.5i7-#a|4~jT8`+hzG#C8&MB] мuUhCk^yvAxQCrxU (YFW f$Jf@xP;#'z#j^y LbzO>L+1AgsQ,T6F+Rm=h<>΃k@gH7m uYY r-Wu'%ݵ ܂ v`Z*֐*KաZz'-J@/0;.-ڮr ug= +iDO'敉/1T9&|XxwF>kwز>`:LԻx/^-L4ߚzޟDJ*&^%-}!.< Q#>)#F&jxbK+;Vz%MzKuΎ`cfJd1lJ =+b'RM~_C >RA4꒷t[4f\mv~!ɅrW)UQ eʌbijœ_/u[`3x\喢aFؚ]rj/]RSoI!;P  2GRI$gI;&>4bygdg.bnsWyD&~i~{\E6~ܺdW'3 ^D=rbkA, d̘ cH}9} mޞGBsllon2G~2!h{d_3Qˤ(o7+; >޳Ց Hbl fA)U*c/ +fR&ofǝ~Y Ԥu-K]+4B,esV?P6 TBv5&$m0\X+;e1\:YC*&%6S3ثhGPݠ1XJ) _vjL]VH'хڵR)J`1l(ByŎvf/[' [szڧΉk4Dȕ;:(F n)\ ڒǀOq2-,=55`P(>A3>ɪ?T$U]n'!AzYV$;=g.0-'B(`XqۗdeגėY9rGǫW` c@2. CjӲ(>nB%D#-F^Λu!XgCI晛a/Iw&B('6Nɭ|lT MHǀE  /{Iʺ4`7!dE ҤmKB |#_cg}=U2jzCa7d|dJN[xXeؿh&:dj@XNN;<9/S9H]8/_F@Gr'EJ~u5SlyszB5CC_*.aK; B<@崌M:6 ]Y̍(BQBCPPQvbUq>2o@s0Rd˦ QJ{ o(}K^SF.f)?ZEE`@}0Ek'4d)S^0l7/"v۽'sƛ6c>CU'HO`j'vi0SEnk58hm\GF %7œ)xǂb]DwJHÚFHL2ctDhA~g!krV|Y"[lL>I$}Dܽ"R%kj"yh%{&V?7(g$T~Qt井ʼn^ɵ <Ddy%{6q4 vV' +5xl沆f tGyʏm]BI8m +foA3 1Vhn,s +9f4]?3cgxۥ>"n>Ms̵|+ 6)`*W#Y!od~f81Ph{e|fzRhh&Sgq$Iz3C04̦DhvkDŽfN~-4EobEaw>,gxM%{)&ٹWkh h>sXBjs!`̤ 4¼,r ygFSfO1h$ lcO 1*Ws!.f, V]HxYjx>IdWDk)Q*i?͘;wh?w a~f(07R㊩+XǗ +cڶ癸Rv@2UoN|$hHq6yh+؂UpmM$BOFD`Uƪ@{u(6^FCA\':/E4˜FI3azsK*(2đ;,<݋#$_|jv dvT6_0QiHzuLZ9(#xVjmeV/ fC)6Q-2ލ3bq[1l:2y!3x\N`iy.ؘt: o1)>pwAKDlZFD遬J2Lz([ a5QF"f~b֐f:4[~bzz@ǎ,|p= 0Yiyn.gJKHK$40ߎ\MgĐ/! Na/(u^Rs,6 RiVeWg^Κz'79Q}#en OW/DsP3XȮ|*/#;!00MȀ,KA$e;p~ ˧ҫ_J,!;XtlݦoByPԓRD5) enEK#@܀E*B +Ce&vl9S(7& }CQgYkQWve!Bs6n7,qu|^rluqa| XlwE`_~J(tvH6Є_@,@&kG*tzV"#Iy[maT2/'gAhrMr`PE jGh-<ޥ_13~c2r-`,@ d(ÖStxا +II*·Ӓ9N5;@9\&p+ܾڵ%AAX,ʴ.bmX}Nʤ}ě eڎ(Cbx08 +)[N9?b*EW¥r!ݏaѡY@4-!#F0<-h=kar}lϙ)Lݞ 9XapN3!Fbz\|J`sA}s[M*Xd?E eG{tK-"#nx>g<>|cGBᘇhq/PSYa5wBr82d3LIw$;'_l|3{q+V0f|et0˖ +s*MIGcS#dlm4y.39`\4쯄H{zyQ+Ag>խt:!wbG9a8E eVҒU}O +YFn&dHU yޞKq8M >%5u&n1 +&yћYjhUhpN6P/q +)N!e#^kW[2At}/P +{?CYv9,VQQ1~as 3Y!lMi)O@;oNHNugCl~=e92ʝ,%?,"Y +兯 @+6eZE:rvP›~S>fj]°oA/1b.W:2̜Y'4F#i3P?fAzf;9 ){ ^#]dN'?"8u8 +`ö2q8E-ë%@-!<̪2wX}O؅g^KS"/Z:Diz P0( ߚgm<7"%Buf jbj$HnhrCu~З Lcy(+; + +v)`yQ;j ]92k "ʃJHn(qzyOqcS25H3靫s 37},2@J GF 0.xOfG/{@7%5fwGȞH.3ɊlIujO3 l䬽S{3햧5 )_[N-A1wݠz';k]9 [FMD؈3TMlAW/?8GB(!(? wsb#r I*5͏TΉ4-0H;j'`m +O,;6ޘYB|%md`#NXx@v9UQN^|5!X 49h~bD +xV\$/$<Ɩ ﹴ9k@2c꺮Ztˁ/3WumP}$12R𿾨šH_{ 5jj<Ƨ}D5 +IMn- +[\kOiBص[۟w;Y8{rKB_IPdrT})@p1n yy?,ϑ8ЌK+O<"[g\Ҟ)hv1 S2c]_'f囀 +*1F}=pkIEy\5Z +u?F*.hAN( rPEr)q[$ .u]dyS>urZj 'AUW% r^]~3;%1aJd o˖ 9ޠXfCS<+]γ*AD!zZ4FC: S7bdހJAGȲyYe(CT]$ZHfDL5/έT\SD !$30J҉@VumD~UdϷp{NaэV3[ -_Be%]aC--M7*,>!5 sE~[)љ>oq1;}#{kQ[`9H}$AIV4_Eu-Uv&7=ܪt԰Uƶ_?$dkRnafda&GF# r,*7GmaVǷQF&\q"wUI1{yLKzTO9ꁾz+z_xxgk(V[5%쿌=\N)wtH#)ayt7*ȏs=GAG5o_gqc92L۰Ktpg⠴J68j auei;%٩6ۖl`MO#R.S{h)K;}T?NB:(m$*m1&^ = 1TW\.ou +K}!e棹>ۦ!jG -^@*'DkSzqqQ7i$+مhIUnJq7lEa)[[jI߰b6y˯cbnTK`w9(#MIc; V$5z ssh0.([' Zumݞ\o VS%EAS3mkO2&Tc!8٩yG~q"_9{&@t\Y7e+G۳W ^K2++_j :3[y\%rк0 ܠCea*_1΍;"Za'<,B4~Z+kč'Kq 㡧zdW|fM4+R.eށ{;bU^?Їtt6bAfoУ$E~͘ j'O`,aI+ n,tcZ%yJ3X'ȷΩHЉR^Go4Wb޾CY]j6'Ms78©r3 +g!c͞Azr}īLYTq3z1[ f8vUpE\IAQ!OcY^Q(?XcN<*|D4ٚ4t+&s +"reHw iشqfݢu{M0y\?a o֪|q~(?~7~gwv'f/iGs 9w)sw\&RCso5+?`%RhRMЛ,_YD|V$}$ɑf=-p&152"Ж-ls_C\K4EgYdweg7eH{Jב`- 0-H +GӊwÑ67^#)O|BwBoYh 8HʜDu#h3i%VAC?+DӢ]+.xsk)׷[$%D|$W0%'Nv@];>22i$]NX"7W|$e  `hkk"y`I#)` PuI e0S6I9gؑ#=822b}H#)"E0/2 +V-Rk؛sV0l(J⍴I(V$8q:<@\$GR)6G_d| ;+vLp"2c|瞄ԃ +̏x{S= ;uk&_H +岒#)flfn-ϕGRY~R$xvER_ r[{$PֆX̑!HTVdGR簕bnRכ|¥S:|1MlAx+Q,e7 \GR}5dʏUzt$ErvRً/w+'W$eDvkI勤ĵzfPّv}i.ĭP BO0^H +].˴<R6.B/v '#) -yeH$z=3 ^g:r "|||cz|xYJ/t @}ӟ{(]{ͻ4c)n[&~Qgx)*@ ^hZҖ2i2s*Bu[B̿m/4PY;Mn.ږؿKj^;CfF^h4/]yS\&bp VINgp-~=0q<^Y+Ӛ.Q7% , BG9/p^vRDWѹg +KLΝ:HZJsz^ +cAFt;RC8/+~xn,̜"!g OI!ة#^D1 j?VOe\8K5.fHz#,r[V +,+%d)0VbV)Z}Mt/\YTA#B]/N[<#->bXj2U@^bޭbVVw/{o[\wRnGsRn8@U#BWfr.ܪST )B=-h[4ܺ8ax-oj,Vcs2U +*l࠲6L(2{W8$JexgEy]8bW#SƯݦfnX+C)>:~E5ܓn:Dί-A>uSm6p 2}a؁C4ifK!4yES<'+Q݁n ӑK.-43ہZ]W&r&~G7@[P3|-3b +*5`nYD{B6+ 06eƒw_1] /W[kOU%_Y~5>6:0$H֒^fBbSyc#b}D cj`ctD6jiLlw ǭ@Ik~>Vhs z +E}_(e+1*-U+{1(9335QVQ8k%S+eGUu4ñol*Jа̐_`GuJy Z.T%ulDʞVWY# +j"Dۅx[FgI s@.[KeL֡1|}-VSu&#Z'jr]ֹf:(^O9ڄ7d KfRYd0HeN Uؕghxu<5fe|_$>řeh}r敾g6\AS]ŰY"![{+N@ӟwyQgL|v|;O0SuV^4zEL +=]/Ոrv>@Υ;&F1f:Pjz|mEiPF`M'*ߋ)70oN0#} 1 bSbYFVQ4.(u9H4~gNBqcph8YI0USL;D{<]H6=mpG`hn +Y_VbQ3ߺ_w 뻳$" `B,~Jh H-:0gO:EE-}jtz(bbߐ4٫ū mWF R95L\FV%4^)|ɏtb100IlYt4T mK )K ?Lh#g;%lWB2Lhg5Њ4Gl+P|01"\2i⿣n0s^:P DCGZPA ~-#iLh^΃mi^xQB*ZvS!JGp}#A7*j6^Zp"_d [h:!PWNT!(ڸ0ΣgC0 FvqdJQp(-X)+6LɛoH!Mиx&4XgH%4"UFTBHLhmJbu"荫[A SmxnĄj '8: +A +k=7u4v8m D >LhH%?[F'}UPBkmONJ 1zvxڹBEy%4`,EFtѰXe:Z *QoDrmyTKi q~J>ŕhQslZh@Mٮ&D^+?B)IMy$8 )U咋 - q @wqX0"H^~NS 걳Y6`猰?KV( ~4X=pe7ݼ7.cC&3PN_8,!AD_^B>4 pW#1k ^*R%Cc$a4Mfӓ<^/p拐͙&goevo$OjռWws0a^s;׵T<^9.1cczB:r8Qկn.v[ +f[.xVzq4k [%mEc+L&7//ޢl+VRXǸ(w0DZpd*+ޒz^{- ʍCa^ٚam|pwaY]pruiѹa eG"0ۜBJMٟ宫Kx$Wor.90ٲ+bb\$tl9# /{?X~kkjqv4dyQOZJL(e=PڄQkOڛOJU/@iq"+Xl45muM9;n!(Q 𝢓. -/5P=9ԤHލfR{#E&ۊBF}h-d,j$v+޹zZ.@mS5;(Չulp5QL_.H}N:f5*F}!rR8ILO>b32ᶓcr?>[L|7S;{,|z8_27$WXYNBTBwJdƞe +hɣ(rع(/gtT=pSMb,YpVEQt`l CLitu/|Ivtyh;:ڡ~-#2!t2QjG4^*V+VlrdQwweA1?!%$Wj|T$qj( *FT!`Hu4\V2aT'< >PQ,\]p:CA54 B4Rb)!+A$6ZelX4 (E`B s&uJ᫓b"6D/ŀ TS2R6@a4:Vf28&#$M(j %"ɰL3UUNH-PZG5}8 +r Uav(Zar(DcTlW\Ԃ2 FPʏ~h0 :а!NdG"QPa :Bʀm"\8#p WTxʉ6 M7So.夙zsDbg2IВ<2{6>bqa6Nc%J i8m p<lZ:rٰ, › #O+- cb(fa'8hG)&0n,VA 0Izx ap> a`T%3d> ⃵ +RRRA2 3pa4O+YNBbDa,Q%IH %"U@P!"e5q$EuPA5Bv[$f>ݥju;Kگ1uӟ;߳{٣\A1uϷGnoۥoϪ߳.#+ç]4o +_2g >?wЍ|qGfq7m~~Q*|ُkzv;R::NF()W9.{/~>_"WF}׷H?~K=~);_^u#yzwRePS]u;n.#-l^~EvwuٿGpӭo?!|wU +7Ul焫-ލݩ=7Ǟ2UIpB B(HS`A@ + C1B!<ߺP0`<c筇x`1tD]f`P\ 2t!V_aޑZ"zd%ɳ˗0$0XSBRq.A<%H$ÍKݧT7\)!dYdLD3myOx&5/)AA#Bjol$Z$ T$ss ZӣDMܿ# x+袉 Q(&-Yk.T+& -'*ȩ{ ^ڮ^&)dCbnBu* OEڹcÙ#̠J6R! 'J?eB>J#+#J?.-f¥`ص h}`P9>A\ҺG +zKZ,aSA[rQi[*ƾY =VPg;uK]^^A&[kJĎo1U {QsDل]J1``pn- G(f `'xE]+Kd-S  ˬe`nCE ^(kj H6e)ԥJvR +^ IѲ}VF㘙YidZ,7пޭ 1fߣE +mdS3և-C(&h,e*S<2X?!V$wEԕt%r手>IU#ƬV/J{D(5䨈״9Fq zZU2K,! +T }**323-DŽLõL_ qԸ5TmK.DQ$WMvv\ $FuiX8ƽsSDN|ͼovQmn2ăom&e@`EQɜGdZ˲85 ]C .qrxQ&*+Ȁ 4gNXm݀U.(,X_'l7&ZgqwoZ@mdL2  ݝJ?Voяehܝt}#BT~*V;C~ioN~?JvOI/$ùeEJW}FCvY\c{=ۯtq78 o^fG +RnjdO)O#5w36*5nF?;W6֊㮼q[wՓXv/ٷND(Y?p\k܆ɳNۍrt0.!12 v)PĸWjQn@T˖"iKxgu4L+dǏ,f\%I3#D榤>+k{$}_D#aaxB]GD~-u1S(:k\+mXDGgڇPOЊYXS;j0&&Dew@qFuZ@\h%ze'þBw;˂`V}T qTs CZ%LGf݁7LJRuPQ +4@EbԦHجޑ4*UX.fEE۔B3JO[!e2t ^HaI8\Q<>CA1A;q)<mE@d*H3E-'% 堂D#&Ȍ;1A +Gߪ,bPG8p*Ԋijƕ)#4f1e==Ԏȅ/c +h|^8!.!2QjvwwqUf=@@7݃ +)O >9 no ,QB8+D!vLFGr0%,͛$xRIj /&p!w.Xe);Ob S@E7NE\4DwLhbazd2̆s8DlCxh"" IL kB<ۄ8cCv.5XaPnͰj'!*XvBST'LsҴ-%YXޣ%$M(.:E,q8gQcAjXC\ƩKx N +*՜`p;B'D /:S_ARn#@J( Oa`s:ZEk24I@r-#7&,m Xt~C J_%?t! HABjĊn #kMP¡bƉK^#5Ty&GʡgNiBQ<:31H 1B4T]1@@I p]y1c$|8(CV@w)2a3H,TSaYhl"L04b#MD6Q89L9g;S* %5@BtrՖoE%c%LT`DTN~G\"TGET +H1:^ PEQL䥕#<**LLW'8J.(U%Kn'SD8>1Jj a!((bCvDP6ŇES - iդ*@y7\7ā +SAUSNU +THYCgT#zF"1"HƬR+4_ e* + +΄!ElTR0$ańTr TG5H6 ,*2 rl"r #T*5BSAXpG,I8If3B\} SAƌ%(,%Cxxt`= CW9r) 1LITDe H01x ,8SY0 (7.!/\0 WGϻb)+Df$L'Yms+ܞ(r61 mD46q`nG$k$2*K/Y}tI;B"?P qHx8D ?Zta>,1E rAMKKv 4D +Dг$wڄ;bʚ)9)a&#Tc0+!/D5'"5i$oBT)UF8LXFQ5onf$G 0)KΆaFR$t$FaJqMlpAFj]4j% &P:+jíR c|i08 t)Ԙ +RL:"tD"ф&P"MIC6:)^d&Ck ǐ)@#4:=F 'kwU)( Glaj' @jCxLў'0:CMI2<UD'Կ^FDWijC=W:%h(.#Oa娠-XH+}BUErdm, +`- 3 2sSap +Ft"F({PB 2EV2JL`'Ta9`s_,ݰʗdyc $6%s _BQ` 3_ejV[ $5 lt/mjRJ<ư/2܊κpнZ1k1M<SR1N8\ +ѢE +U&B71XIʥva j(04]Ge]r$t +C&"!7!)ИC1/hۈKKFJvXbDU1ɚ$Y<"9c/l]:bc`(i*4rǸ_VBBEjṕUSCŌvv2k1J Nb09VrvX(Dut1 VkPIEvd"3.wօ1ex;`+2S*LyI'%6s;7(L7.Ehװ= Sq1%P8/Gc:SR9WTQ!!*(ec蔘r*xDWSI}eᦆ{?*RDCvU$CoH=G?d$P(RwHy|ʌ%|YxD,⫉jE]f U1D=Ley Q[BD7C +h\AC8Q #.HYȪ :*|NȔeh."}bt,qnԑA D\Ќ Qdyh@>$.2O67+(777("5sH<8un f?5,$BԈiy=r8L@VsQ$"{I(*"("İc0HrxYH f9ߖ{ 2 L|ZT^&S ' ,殈YSP30V8U/TT D*b5H]egBiF9M(5!2VQV")"i\6R{ L(ٸ4ԐDCtd4lD0C$L5452T:*lnӹSgvBDV%4 sdxrX A_ *#T$wSCbb8D*X4@R }CByP?Uiy>DP#UoNjD3Zt3ȩ%BVVaq#$(2!H +W\D̜:#QDG8IhU:|BLZ[BLLjŏ4ʱhdA-db$"I=ω"BY +XZ_0!w'.U#BPDoXP%R&}PJ@Ck 7!Iy*0"!ʠcH;Z P%6H rW T%لT)Y#>A!a?(ܲIjefej)bDBՋCIdAX24 + +U$LJr mB8'P5$xƧ +vy13-x%@4=Eˁ6EM~D׼w&B{y8LoV!fL )B:rKN5V 66 ? +a)AKib"K*JPj2 &iHO3bfE SU, e.EĘjPf-Phn)(( u**3#QA%A# GT> S\#*LRmd)zb$DnGԄ Q0MHXJ) ؊b1!S= d^"sJHaj4H0 +mb MYհ&Ń:¥!,FGÐ @PbIԐX%bXav1 }ɄP4Ef !a_ j@n!J,J":,> 2Sl,+Dٵ +4tJb! dϹG' CiHuy +'6iaʞ/,dgBrTLULD_BUUgF2qP@xAG.$%uۤK)V +U&uH^/)1#sZABG&CĆDBj*՟ +au<ÌUa+8r$|b+n"9n0VM*Kuxp$jf!8N|V +ybWCdfhWՋ&rc=YބP*!mO(,UC5` K7Ȫ#YqNᐯBّeJj̽ GB!ςyRh!e#h#YbI 51gD8Cjp8jQK[`PĔ<$G""zӶS>QakbLrD0L֎bEvaRThcrZ2AL9}pb~&FBa!܆I 3p.N$1!7N(Tr,pe1!䤆4” +X)?ńQ(T3TB8>8qy&3W65"%US ("xp7K0tJ DU)643ԃxJNjH`8!6ła+0IJ%HFx\GeҐwE-A@/ jpS یDHPLū.S/ʁ(jL2O8YF(gL9AaWaU*F,&SNHmn0Ɛ(~瑢&d,CE|qFa)CV< S7y c))mLLMkж_ .oM7CSgF@n5ʌIF8T"ZIT iK޻bf$u Ux"\%Su:S'$'pH 16nn;@OTogIkՁ +鐬A)T ¼Q 1 U3Q3T"CGÈ5"Q4=SbEʛ|0>QH +"zF9jDk;#{Hqa<*" +/afF^ރ8paHe@XɂO RG^"DD r4I6"0$VP+ -IF(~3*]E䦙Q **"xB(`*(>ʧ? #yC$UHXi mKHUW 2*<r%9Fa^ɛ&c +)3xT؈*"d +ocJH\) -S?[YgHfZ94}Ph[~*(zUi5jF` TpxU2ۊ 2-> +Gi/X=?*|ppI#JJC$-~y)μ{0Eh\BK""n\h{`ֿŋ*c`)?ғ8TB㖅QI(}*1x_ q`FjCph54Jh{g2yN?a1[*nע%tjȉr"JPQWmP (p*؄c.JޡPOАTUhkk1f+&:T8<$ }SvhCJE0Db$Q4T,IESZ[l_fV \qܠq;%4cè NBl*PJ$@g$qjnO=rI1Q?z"{L y 03y8].JH) +ʺh٧ٔ4GB:1#' ̲9.&S8[Ak5L] UؠGbÄ"A8Mbh [QQ34aFOGucMQH>, ## 9DAE @˰s'+7f&!6҉U)# +I "E+$S$bNL;)j"J:%%_43rVp;P/ 'fR74шvq-m[B2d-*qKɨ&DA' `Ҁ Á|p$0 +gjb8@ (ŨXH@7U/JbBo4\t0w6ir!cR]Wht.~6"P(k3U4.@Y~}=^Y^#(Fm+ Op$[ +H|L+bb{`SUx0\TΛ~FL<>*N_ꙃī4ȏzCFvXDiZolC!' hEDAj}W`wP/iG.L>AA䨾Ǽј1HƇwDOb޸OqKk?;GMn.ظ }TX 1vg>vB#Pa:5fI@v& ppaV5xЩT[<1nX<TR8)++48Ȃ _b8 n[q4.\Uh/oR!0Hfn!2ؗڵrc^^eBa'Md}| ;?6@ۘ*Tʜk ^-í/ȕ,*LYXI',V ոln='pYTv Õ]EhS%k1=]HxHFei,CqVh0/#PSaEuV0᫻buke|%xh~8`CPhfht @s|ED>9F5Jڸd|FhڵTP]יvJf5m.6 +ꮖ`-5]́nzco3@FD"f`ZsF%x }Bl?XGM~V*-;1"Ъan#Af[wrsd0! H,0(u~.搸'8l}F6$DKaوת}[CXZlt;E~CK!)JZ T|ʛ_9D͟㲕_y>`b9ˑ]x<YW1 +E [ /e,Q@BңSmTy'Ĥ|3+E*܃EaL)Tkzbsn~ұZ_nl7<Dt:]һ,S}SXd[>%n/(~Rm> +ƎnnǴ+uJc +d=0,Y׻rh^wdQz84' ;\x7n$1:slA!ފr^T(HEܖ&yFP(|86CU,6םZ"2j?f m zK5<ĝQ& +z|N? +{}Lj3ew/MPaiV$@.OeC@Bc;w +.,M]Q:;|$6YFIpb~P.Ksͯ?'Ѐ+P|tG r*kdhMLgRޠ ~]** +{&#c Oc5^bBwjԶv3]#C fk`mwϕŠ\j{-]*@ +TX0ñ>QE\zsj8EWԏ5<e!+ 𕒞[{|Mϖm]s ;?/pꢋ2 +XЎWK r9|Π6<@;/vcØ4SC`?Gj<6:y1s|* H1$F̢6RWۋ4j`=xSOe;ޡK.Nr+[FA,-kdy!5V;EO$z%,%eۃayS4at,I JdQfuVxQ'.v#N˕%Y>cB-] ωfqP^<$f1pw'N8܏5"ˊ )qݮ] ;G ʈV&jj圙!|ZjKiS|]^YFزTQ//SՉ %eB{8 :oo2ъ fyM rcP&ȀdIK7eTR #@W1H+3Rzx#ÔF}┾"lŝꢎnpLo;bA:qc4gFha%*]DE(TPfew*9o- Y[Xi]vA99H/eA_G%9NC5W:[bzIn̂EAs!RەpxcL,-׃U.TFG΃f +ZX;-c)/4O +K}a 6InI2|g_0 .~FyVu" m`Hm8c+~˶vQSӸ&JwQnw]y\{_@LAᒂ1Nא2Z@IW)m苺R(Ʉ2Dj"3)ZkQ1b+Tj&3ބZXh/w9Xs7Pіt0"ev"nAzĎg7ۓ\ Iȃ/5}OR&kǻ~Ax^X6fH;L\\>NICRˈ󂜗 pͭ Om{Y[Oڠ&'z]e٭/ylGDu<]s紲W=i +%xhrO!)/VsO _y<1{dFh56Ft +qWMbI,ú+ /;ф?$t/wX(,{@j QD#㛖:+w$lDԗB!dˊgc7N4|JJL^֪sc_O_XR YÔ^x:Q497P#ݓt00J'/Qq H:\X'I*4Sˢ2ioTRf=<3Ρ®:S͵ +A,)[4*7(,{1.4d(W{@w!}d$yCt?2 n-A-gF<{т.I,wsU̯ &^m>$ 95a5 u]?ٸ^qT:V)tQ) KBea*6/Ld39.eCci-sb63}dT!EP4y endstream endobj 14 0 obj <>stream +>+m}ߖ80fPUmW!bV::NkC.1!VhW1ن0BЃ#"q,D9h ._Q,OMbQd8u-VsW\NQiB ,a!Yh53G8-*" x\T=W0E~_Sa%A@=B͸B,ޱ\w_h9p\7b rҗϺF t@F#pe 5Vd9[ҝ+fY'ucR3Q}g&{YV̀N1HF?^~9KG=ǤdOd0N/{DF?dv*Sͫ|S9#@m;Bᮩz6xXC C@d$x}#%4 ޥrciLUkOIPDçt_{ʒ[ Fpe}"UN(OcSGQ)(m+LƦ0`[(O`;(\G \@nbX2+E +YDNВ[uLP,.j,C[QLo#cG۴VqY?R'r>@ƖSN̐o;x+4&N ;&yQ*!@^/Z"N%Qr ?m<d<L1aoEI:AbD/XuRRNMQUrAS2D_vb4wZ]Dz*hN1,Whq2- +28*;t(.md +[9Sȋ>D)=rs ^#+\g!t= |DZbT͓8Y\3ceL#ZKV5Y` ir?yhR|NH4TCZw /0(d(Nz95bE1Mf+J^\T;Y%g.o wmiBk[ede8{7Q9q-{uwq "2[ v +w^FDT1v{3- d"QRrsH|3Ҵ v,C}R|&`WsXXLWhjakqٳxh$]"PԊE v'Y"Z"Zc#xӌ*!d| 2Aݤ'o +}u|,@aB%t6GoIPGr +'B AVY5e]t 1'aUy Cڄ~Jx("=2CQ ߽=R0zR#e3/"Bƍbpa>TGN徣x /PⲔ %Bc1K[dB[t#]<`Zi*7NEd =j|$7S3rXpKi"zɴ(4r]H sgޝJk Cu66^#P%+Q(B7cSҺ%-GZ >蝹9(0!qUqN9r<Ă>*!)eX!H~_Оi`[ou|.[C +zf27+H< [׊w֯Iy.e!Z-`W9P"@SK]zYPƕ|ìVuZ;G(ugD@CuaC%40XBٱX{$YEf2CwPz" +v!ົŕ32IW϶GrYiHe!T )HLP5JA(faOg=m>VD 3"ar˴8^9  ;WJQ$l:IJjK`X BC@.7¿`E6Ȧ]~TL>-zaxbjXLC}u!! + 24T;Y3yFjTuy .'<=qp IJ+z!ڍ1݉7ɗY=td/8 iM~%w,ZVè ;CAx7 /BH?|GݸQo;z)9 +pɤcp>o(oȑҢڥ]!RVf+sMav!+$ˡY_;SM5*FUc.ꚶ2\ˮbaĐȄ"-gf"kEPXJkȼ(X8NayOs*N=]:F`3ꑒ9zCq<,Hd<4` +#T}} nd('fS~4,SZ Wmox++D驎]XDȀ +r+"Dv D%I˕BD 5EVT qD$3dGk3'-iB,< [p㋥7M;' +`+`DF`jz&E{[>Xbdǡ{u` +[ʅt#Dtߚ7by݌2Z%G GG֭,!k=? Z!<+EOqXXJY>47 #)ѥah]p:E,sP>GPo` Gػ!Qxu/@[ /[ͨR<)Vvmoaˏml;;q̚8/~Dэ*)~A+ cx/xHrc 1c *)8G(ybZP ݆\}uy.,q2u$\ՒDbei]NM+S2X#"&UKMNF?h 6(T`*":>mv[UqYBIP8Ș;|=K3 B9@'~ }!MD?1EՌmp@@HgE.nH8[=q6ǏDpdR-2qm `}-V>\J "EǢfYr6}'e\-܂NQB:K *&Kr xpe!tɨ,o5LؙXd Oo˦ +0q4r':Yhmv>gL~`gO;c8">{s?bq3WT8J_\g8%G*SWp(k!?ev:5)?'SifJA`b\lIwW>E!qq98v Hڶq 葌\0=^~lP|TD*DL9^ULCxry6Aزa3TGפu}G#*GZEdTn +=<49Ӓ>̌Vm_((GDs2J.lU +ʜw- +J1:ƍ=[HP"s;ݞc`NzcpPu3A1\N<% Sh鏋_h?6{m(d*vZ}BC12~hWW0^;hMI"3kAÉ+~f#].nb<$<6֣d%?'Q%JM?g.҈W) @=.VxwhTw-mӿ(,38ZGw" *|ʌ# '}h MK! `􁥭+Ec<[QѪ>x, +z~G58g,0³UEIJeE;.s(y"Q5 8S$}_qS% l5akt%̓{bc02ug(4/jSj#,2|bM7-GJGDCeks#? 2$vv#we0~h{h[ǯ(u |D<@FDB'?򢘱.w)O#lI:|]3C<>)%x$%1ݦ#P[rʎDMf.VK(נ1^k~՛JYR=2B"ڲ#l =:$05;]NXpZjpQ}GǛPO18* +2)3 +>uS Ϸ܋$Tz̄SQDl 8DM;@~&)pHYT]/0I, $8Ar5k3CZJdi yS<ehl]gьN&xD}LbMQZB4dX@ɢ>F# @=&ۓ8]o^rXɰbEx4 af'6!eՆLy\N(ڧHk:>tZ@;Y_#FsMUR3TzgSqOyRrr ;Y;JC)lPMk`/.*M",xZVAVLoj P0 jhhk[x+ ٿvy#E++Pw4p ߝ E3y]LS悢U% B{@.9RvA ͍.͠#+KpF#g(*9 MW,X*nRQ'[ʹ#ﳇJ`C\x|Ft_YA@ȡ`gc(Q}F7sȧ^{g6{Sl/ΔIh,zZ&|6ĝJex+.,VQo ]@`'SJ*^἖b?ݱL6pNH%H_QLQăoNLwJ.sf#ٝ1#me/ΈݧWh9nXef&\\Sv *j0e+,=漅Ϣ"dvRqa-юj +-0Ƚ Nt* Ho% `7iXĤFsi8X/]GHEVTmM.8tt6lSd6FIg}˲xP$8 9Jd$F)%pu^RZ8}So̒f 2R_ %m@ey9igתI.܄6@uv Pe1T^]4N>Ag +/K<>GCl]ްpCgD 1!4 ՚w>2:^6Z-]U߱_/P9 C\$Zry_\yx pWAIe,>G*8À w3^Fd $- y5%U d@v.w]I;3=APdc^;/eFd^ >a-xk@d!FhˤdsB?n ^9X|9jc8^f!+Mr,2pXlC\%GjA]%\3yy&a6]m\d #1J:JDs|VWWN7k2dFUXXr:AEA;ˇJOQ^fS嘍.)~܎Gj GkB46(B#PN~ Mc^',?X달,Dz )Ccx7ࡥ 7XE qfrݐ /"sܪȰȵY8}D}@ LoZcxqu7O1 +:It)tzA/aA=v xIX9FuiEn@5 IxW{`-S@pTz9Rk1h!<`A^YHt]@S +lf8s} 1=z yx\z|_E W"@HR)X\:A7KR 󒮴h D L>f%.YOwaLhXt[$@w, 9'$v o@G +h䭃P[,J0\L#Z¬0@RλF妡Ѩ`,^B1$[(@HS9 +H¹y/yf IrrI|5Ɇڒ$e.¬_trhn\R۩ʮVҍ"?w;L0qVyGʇDvlRN-0* ,BHFIraX7$DIyO~,Ham I:jc !_ or0 +y11GvUz6.܂*btbOXH܇gbta#jb}p噌fOxBY5f{?=O5Z{K$LFc&K9"}A<)mh$X 5c~@yn>) i 01 R][|"X9*">>~ϵNiL䣓#úy1fL~xhA?]%{#w[*^aBD>-L~H޺2|7,4R;DhTts1g`>wpkx- z@rF@FȯLf r]Z#(P%dh2o*C>gXCĈn HGjeI:(ٴGlJ-josQ#4[@Rw^pybn* +YB{*]DWr_tY9"bbE}&ڰdfh OyT #֎D\/MKg+myB=ǶëBv9)-㋭ede'`22`w}d*֭x[D@=2<X+X"u8z )dG4]b4r<}%',T;:Gdv +6M b|um) bU!h-\bM㢋9St|Hˑ\N ,@2"N \1L)8y-j} c?R,SI FۍF߮>tԁ;y]gd'HX +ioށ{Fᣂ_@WF.ibD3Юa(ey ΔQ@P8 0DQGEY*,""QZ )0]-ԌGN<|"9W[Glj\ &u? -~c0a:[Z"a;x [iW$ǀ,Z^GL.GXuP. r l0hl3'!2K]WߋHӄ,ċ3y- 0KQT \˨^1ִݛ {ɤ :wcF(7[-eRQP^X}d-n/p.8h,;eIO~s W*ǎޥC!Pk? -Sqwz!A; +)'Ҳ*1t2q=hد W.b"/>?>Y/Uk`U<(S&"*Z< )]M)_}tԤ\~p&bBn ^ c)Zy7(fRn9d(Tߡd1&OOFANPp/"s\;}e+"BE} n &J/y8˺{'*$ah?4.V"*hb~+۝Ge >!D Dx8kƝQHe yzϫlK xwJD5MzzafޕɎwU2rE&}wGBE Z_ +| MyWY,? e/gvuȏF VuI_̟NWO\^t-T:F6zM`PQ +O (|S#1(` Yc9>`HwVmE=&1Hc +A!_$DZ'lPF~]4HdZnڨahRݡH?6J`s~AX["V7dkX,l-beFl7Xx] +ѐzxD#޴  PH'; LQ QrO%T;ʠt 355:}lJs} v|Fa$)bQo/p#A !;+sٶ +FCUC/,P>DUor3nC*eDr DrJe8&I`+؍+76͗hs~b'Np{E O#Hdi7+w=^|^Y*9d!0-P^vYQdW,qPAjY'ˌd<+P =panGVT2qSIq;p f/t0B:w^ӂK?q4 TuC$Y:36eBEȜ#Z>p~Gk2 +%V $g1M1623m +†R]!&5IjH0iΓGL;"EPx w+Ϭaw#oW7Ӹ "ݖCuuٶqR'cp'^,Z`FLPgRYu`jdGF o6`9D_|J1Wxqz2leK'VE},RLwVccQ h̭9xJe 1ȣYcܼ#  +pوqrxmU(!)f2h[r$}|X#`e濬q0p< ,Xw) ֊=BϾA#Vz+h  +q#^*c̜)ÓKue^Jh ^Oᆤè|.@;i($o=q +e򔓩FDFQȑDzlt7f,e3XU&~ &#׶retj4IxS_#qOϪ&} :lT?`n?1έ{ !S[ mԱKKBR 6/a?Yvj:y4QFF!\ UP*) +rTuF9O3I}k#8|5,y(D""jgba/CizTXI?@5ѓToJFTUD"T20nհ&JɐZC ^a~R5 +!^]M3(DZMXHD+b$4<씷h5c"Z j=X"(X=Jg^O#S"Ibb*Uzݐ?aDzm eD-+rQ&,x.eAU}Q1{% Ѕ% F4)?Tc~6)΢`wUcLUzbb_VAT;» 2DЬ×)0ƫlb@q0!DFfX6~(M肓-!nf,TL(%,S-s=&bviP%L2[)Ȉ*RǦS$k|6Ĉ⮘.hG;]O5<~DP hT:>\ϋ X##B&BJBE"K@K_&QTx7PD a>Jnġ(a) ؤ 18UVV.miIdbjakT*lUFPPI +.1+2sݏM(ޥ5 +[2I}H2*K5JNi#4Q 24!C4k_5<>'E?qsQsi +ކPCja Q2UE.PUFQBUHՈmGkj&d"BNWOׄɂ4&jHI95%N}UQ +EpSP&*%l̈́tyQro%1%ĵXp¦Ǘ"U9XXqH(L >7DV(͘"I?NL:wre"FGB,0!sVpmv*%m| +qL5f$|Np&,21&CI h2W"LE<(xdԐaCIXRBb\*OKy8B$n'R!.b$4 c3r;ZbrSjCC ;b_!1Z%4i+jUsr@ԬWSao<9MGSG' +IE0zdK13 q ŊJ(CӔq-(E*$X2PqzZA]Fp Ü"Lq0XP+T]4d|c!IyPRׇp:d~<.薆:?,Aq8Z>CُKJjy})׹L&DFHrݎ_a_EG`ЙH= +D(%$zfʤUUԅ%E" +?G3ᵍ7deRgP\:"&<%2Y'a?DR0rcS0}>W+bġ֠k RL'Źac®OAKjRoAZDD"8v11!R#ѩ,a#Єl+)[V+XbA'yLc@QI(iOYS3C[ "9Dh54q3ɤFsQ`h&m8t֑h;Zg*2;8S-"OqguQ(",qZ8a +iQU pHNav(\ Kkg pPq@hOcf&V8L+ &T&‡bVjnGFĈ! @,r8W& !쐘KN0Ƈ`4lPH( Cò9rljF(UM>d8ҋT áVB)6B(I\ac!DKۊڄQCփԌZ1ĉBEĚ9E Sbas +-4QHCu^V-E1 @D4^0tUʂ8 2j83T*TeW¢ Te|#HPB(!2&XZRh5' T/Z8,RVU?Pp x#P 9XZre,[9!٘i +k%TpܚS«4Lbh}@ +2 k6J{aꑗ$a2W~Ga8z.*[zi+q 9 +!G3MTMZ&8Mn">(LgۅsIC_Be~~ +3.UV$4`I0&(AB,_KQV3 +]Nt~L-2 9= 3uC,XJ* ķJK4u3uEcVCӜ|u^N2/E +"HMHz++fjRiH}P%ctodT"3Uf yjBUXs 4[A\DAOU2 iH?3Q [hR]ZkBIR u<"&yfj8DD8 IgȵV!jvN!_@r1jzPxbZa.s L5d!]N.-4i1=փyҝ`Z@@@98z'3`9C6aUCcO|B8Ay.Z.A_6AЦR17 ƼJ7" *[53B6L4QBzdBQ$B_g$PUrL`GH]}{C*N(J?RRf'""p8L>[#2R2CF?PЧrqA$8VW>5B,KݖEVUP"P0f$A +۰L/堊h+UQ1Z +LmJ "- dd2T\' T?O!DQVn uXJ&!N䧶FzǍ @`"&'?Ȳ੶*RA:4pu&@{%wƸ(耰eD0gIC)5TpMyD2L mhSb| +׃0.C2dV UD&P,"PE`I%028AiBlas(j85GM*MM?o|1#Qc]p b]}~wsL.]x;nRbmXMpE|xk63UO:@މCydպZ^О7L۩D:"K5?47ql<|ir84? ,*CaA۪obvVoa +<suO K24MP/oa 94HV.Yw\϶_^> Fpn qPNB7Ogt8R8S+DQ 6gh(gr{+.͘Gy2G 4#Qv 3=2xxR!ի`rUh 0I M +5[Z>*^++j/ϟ[i1J1OJjL*&^@@ Ue F = BAr]f] % Rbo^5ID/%i8X|YQFhJ$V;dIhB9;-^w7[Hd9QVQfL~{QD>^`@^h_\!V$!*qQ\Xv]PT\:`8 6}G"y 0أF +QRJTZ:Y[<)$K{fKn'Uw$=B&M$tĵbN~, ЕUyFjqmwc9+"uXA`(7xGmPJ~L3^BlgWHN%vR ,$߯'"cZw|oAyd@_z-E 鸸ǽxw) |b"!"YkA7vpi:"!bVz[NEkO2饲$qTb@5"^c3MP3 +u,mtq퀺\s eTkH.CS2dǟܭڝᕆf ɾobU0{D ʛzXuoL?I|wT"VY/a{8?+u r tV4("3rL1po !r(y5+8$mJE{Ʒ˷{i`{!h+qԅDt١ڔɠhlaǦKm!W :xӧ7ٰv|Ar2@v |4y$ 12Ȩ~1½Bv='9_OFj>D(6ETmQ/ChnDĈJH#}9s| ]19aS~7 @|}3ZK +ҟ׼#g¶8ѝ&f+ǟyz!_"tN!`J1!Be] >d$Mc{x&v*2 ,6rI=#S$ / -Bv7~{nBa'_ 0voeDx548)A.q812.l[i? +8.A'Vy>k-89tX=~I%p$4GޱBni9gfo'W{*pFj%|HF Ιedzh*sSydy!EBHD`.HsA9XCblDN)k(nE5V࿇vg>2c鱂۳RZNs܄$KWP[ keZBo`ck#-0&_1l\ɷ +f/} pX#KdjK-`hZ"EBc@(Vvdb3kG lN^ ctA>ŻKwNVB&>hTw1}Sn'"JR{ VLJq*!owWegE{VџC( $!,52ρ<)[ZB +u .5DR"F轙@@n'JwA< $,w@z 5J*[2 >JIZ,PM?b;cDw.8 Me>8!-V[0|*3t4)@!޺M,MEA:?h"0J/#27 ,Db\?b1ҭ4[k.X4PfPT +3Vd= +y4i9pRfH3b@iȠX U=e=tjxNF?ô&Cތ!2Y:^Vx=Dש-.[o=P]QF`{f-9+s\[V$ +2*==6ݼ= `QIHOeII8IuݸR 3'<gn@[K#@ )iV nU.q p-[$GTaL5s ХՒ>^`y>s-2Hv#(8j~IxYR ꦊ@$ EAt)Q[OtS" Od>@ɇue\<TJUy +B#ZA:Z~tl!!=H$fR +ȽQE[C=u}dxcLxrŬs5FJj^.gQ)iEi:vI_ ђEX_;jZ%݆^y]a@-m4EBY'Jl.Gw}DNSʃD@J_؏<<>Z%.b4Aֵ: z]ٽDrG֨wZP@^-5 + ]J",mE| `H;E +M^iagӉ o[C;}X.?4)1<bR6̣SD +]@v Br.ӴAPƪE$R%nn +B`)o}ѭXD1]Xh /~ E*b< T=Ю,i9"0uBs`cHʃ@I62v_|qWN'bG- _{-+q~b`-rfPI!͎=gmCU#-*gn\B<+I#1vsI*WwꨄGA9}/X#]X8S`8xf K'TH'X +=.VE;g/⃒\ȯ'={QYG<o]JUs +kۑلYZt $s$yP5/!"sp!u#\P"Pj"0ZNWe9Юtngy),FaRrݘ3)k+OƳ*X%)n񉅫cو`Qdz6A1RDAǧWE@AXŖ3d[ N}>;JKJ@^ VD2j \%k\D+fvJC.MWߧ"ܩ-nĈJ}PV^㴃KrhY=c'u9AKPh^HWتP(yXz~/~#AJO#2Ѵ{DDIoftLi8¡Ssą(e)5NVX-hyx$lk q`Yb95AX-]]X&Ш<<es@d|% cVѼ~o?589zЫ,{3~ daX +k470wg>l١`m&l[9 "k Pv Gp)hDۃ` +%?sf2{-ч@rZfI@ + 9J +p$ 1iXndډMZLL$.zIH>O>toE*`+{x | tu-f@D +.ѺEZ[7h`<[0:NNpz_4^Fai!504B/"ԵcPI: +2OD֖ x%qJw{ + EG!{/G~E BRK`@AVvt q1[É (v9w%WbF؛#!<+~McuI ۋ,x&5PD졊* f.]{5UeDoJP@-`"f3)"C!dA;aJ%tNW]h!Rk%@Pv+E`YtP-a=i54̊KH9y2IrErWFf8+6=Mx*CG@.RwYY +{ 1=# /heRHXW#ST?R;㒦h,7Dc!wC^7|$ 8>y.h6zL u]t(eiugH&MU uhI&ѵh7HU}4e!VC(/Q^ה-m/P݃xJ7ف^Eݷ9t"S2;x-o>.^%tVzQC4b[ŠBX(jArжͅnl K\J5 b4 +"0M +YT85A<؋ݖ.k*#";ymsfmfdZG<Ĉ'C$/y|!YrtwCHӆ{VY@<@n?Y;GZƠ-桽Ug g˨y)6ƶDoUSq7D.9VB7::]ܫ\ &p.8ţLPnZMUl?-Uy,j0' +|w+䢣L3L~w3h4el5?dYmEB&lē I?6 Fn?GKI7[6ѭW(",ꚣ 8$4"wf;UHD&T36 +ZjFh!eVRQŽbLcnѡh)>7;MGv3Cr/dJoRi2~D6kmPaVVhE_x:oRd(,h-Z䟊HَEs'yn.a ETgV +3Ȃ7ƱZe +݉UkΩX_^"Z)%:Gk(j %"1eOcBJ{?s{Ä-+]i>pM,t}rc5եZ!(p_ ?jl!g-U@KԬ4A2ްHTOEF`$7Wrcwa)ș$@/6 H(G#W[xn?Td.F9d`)ORfqɦݼ(V|!4ԋB DMWNT H"Kf\Ɯn CKn׎.E>K )BY8zW$GՕ3^ي+bF.-fNs2 8[*LKۍ`{>4 +}ځ%XQX,@,[7`X0k`,2*bʓx[h>ˢsĎRn>+2@ސvp_kʢMYcGQGCxk&{mkjdJX^˗p$1c=Cʭ ?m eE{荶+bS^\3GYs94BK*.2 +%펻0P16*3صD"`1`f9ߏN!(t^Wc>$`(`À"C&޾*Y (2:^YxEitI+R[G+,=[T{G?RK!-L7ϴ٨&'DR9 DxF)s ,F)]z>}/'՘5U|Y^p1y@^d7=Z]*&"V+$QӋ.& r< g, 83!jaQv$&Pm yd +_Ay^NC,W(^CCl!8> hOc"ކH Pha2!VS9'ɣ֮\2r\b"D1vV+#FP0r ,Ni\Y >hHr)H#w5-ҬM#.:g1{@?ň'-|<)8.kpcp}a~xUV GVa3uQKȠJqEЪ~:Mj#6CGiYYJ{fD\rbABrĢ=To5G%x>Eͥ_ +c܋ HGN!0+#%ur`Ii)bW5@B:cx.fC[䌡[8_JÀͭ"P^m)(\Y箂0mgS7*3f( l؍KeN dB1݅nG#\>g I?pX!f}Gy`#HI~ǿh+zekTV5z.m@^%ҴX(FN[B)@(v$LhpB&zH3WnLmʐK b-%)t,&9~Ubq Wquw\D 'Yc06Gr+  E =[f"& _s|&1O3 +1>I +Rgr$@G1Ԃ@7T9᜔`-#B)#pLv(_<}z ?9>! _* +N B6U"'& yi|k8Z~QYY8p. |`!VHnUXtSkFRl!R_gZwň[ cf98ge)h^l';}okA6}i#Ogͳp%uww=2S8X'n 08= آţ"a>6xWZGwN}8=n|h~( +가ˢl'+j{{ 4~ xGX+1VZݠ-ȌY ~"="T `G6ece9ОոFE.l;MaiQ۬8J r#N0iU9f~qvĻc$[/&}[|E :GhPs*;s VV.D9U|@uV 8 %*H$g֛3ެ:~1lKeӉa˟nb9Ӥ\A`:"sl!o?E>% +0P#fkG<1(4(;w:_?'4 +/a`W9v<uOM2QTpE~ @L^? MS~UtYQo(Ǖ(@5Ny `S^X,U/B(ᶛ*AIR=C<'a w e [v.tz"v) +6h#?PSlo5REmǃ/q2\So{@7CC ڮz%&;a2笶F:8!LU6x.]E:7(P+FBe5 WR U]a?Nkm3 mؕ=d(EhS`0)* $/m,\(E8*Wu#f @0Wv^\Q~ǮrATs ;z.hlT +C- ح݂9v|N")5wܴuz*&H(,#[]+(:Ee@3ܿ,%@JVE.`Xe9ٶƛ}%P%FոEx5mks8D6RI,(_pFƏ +ۑ<@=0BF/[(J:bjК_bԥ8B<-절tJ)pb~TS +z +٪_ƄXʅ& Lmg!V hwҩX+ A>ic($%>"5$y.ff@ڛ@]`qj؟@$wqVc`;i KhR^2^TIXCz\]m5c}U>Кr'ԑ/& +ΪQ0k l!cJ;eE +EkKLa=$IAL(DY@ߜ.G X. zyj(Ro^* +&RbUdjd bb5` tADxxߢJ Z,çiz,?wV`,dkU;La 危^S+R: ޜ 9<=yc҂JV6a{8 +ůHJee*-Ԥ㺣s$pFjчۺs~&Or8s#R haC}H-N4&!i'=q +S|EBZt ʅ_YFwncts^c>'K-be&mcxݲ*+|3/: CFQ ŢwAb8byֱClPQz,V>9xD_q:B9,/f- D_?3#^@dX rmQ`9v" E֍=wwT^vwGE(zFtO4 iC?;LX!$1zsGKâ/1{LA ULgT)܅xdH.=HxN=MRPPIiPIQMIdfX05Z4c!q*3JoRM k䟳'Nu^"`(e E8)ixn$b& +߂yǽ<~x}@XqH#c҂8P9νJJ=C1\{ui]`F"<23-Q{^ +zƨ CcZy- RrL:Ao ‘w̶/38FE1D`3a>q]a 2X^is!e_,%I0Y9 5V>Cy\$g(6(n"v\D-o.NAwX#w[3B{g/o"WxU6 ?RmT=3l=He1T&kdlhd1sQ8MY˫$^"l]p?nih Y5ǻ;Ut, +dLM 7<#fp؅TοQGRyyP~`BnȳX D262 "CjhyD]%Ť*%q-w]{]0]^E;:CCR};7{#iW V`V=X^\(t-&NfJr *0)T>m[ctVYpULCT ѼEC!'DR(_s]k li@ AK o'HNS|x+:тqǗ 4k{jQ.N C-V&$Dȟ끄J=Wbôˡ SёF)yabtAB|W` +}i CZ硈r&Đ y> =fgЋ~VǸKaeT +Zq5"OUw:`/]>5^;je:&@yvŪ*1q>g^\qP-25ۺ?mw& C^]5 968:}D U|_+,}h}8#RND +f~Bڿ>+6矈%i`%VQgxj_o}v'Hi\Wj*Q;E_HkqƶN_H|5R.nMHoi ^b,w r E7 (o/FΠH6?rFcKw2)ėu2 mgCxdcւ**́@bcqfn՘-N{ ظ""cz&4A +>bi(n&q`\,0\ҠF*@ )YxXhkFq& 4u:楝 |?{4=.o.*Ta8?n@]b}ƌq;+VƣFds;gCzYp4+)ɏgOh |Z9Wd_јZUfʶ]#.ԁ(#i %#"[Gybf0d٦ +Eu\boRCH2n/lb:v`[uUW$?@[q4Ph } ųI_;..ufS4]H˛d*^Ywdx {d?/O/,'asZ02p ߩ9sl_[Z_WvEGȦ]EJǚ=8b&\"鬄(>r)3K;v#͛p%4c?1%fmNKl(f|)ZU֪^)HD/HHB&Zn '+sy,Kݛ_{gJWb֓57銐a`^:I ^dK(f؝сm[$ tQ×-ROz4zE̡T"VKcZEYcGixxW|rr"8CJEګGF1{#."x< +J]?"?8Xxq<ZI"*5Gh2ߏ*f%CR*)0?O1?{]%]hyy0$ ԡ8>G2'E_*O%P +å\X +J`~ㄭ;Kdh#Y#2%9cMe!ٳ8^|8Odwx_!;4#7ka:{, yI ~5(dy%j':s?<*/D=`4CY$-܂gCѸz J +5.!`|q&_[PVu  &QV6T ITGD,w}JJqBR@cv2jm YQ%*^L DN(${> ~2 sMUzHq\s=CyKHIGjKI*o#Hj?(9@APetxD35<k5оRDz3a?łvm}AՉDh]aЍѩݼ+\6y7/4=@e"ҿڍBs@RC-4&1Qzv@^%0L?t)لso=G\fZxF;Xl{OCy֎$:E? ?3W9|~}ETt3ѯ@Q\|1 j^оw- +spD/?_}R6vG^}0ntoZ(fVؖ<x.nTg_YPߪ\ P? 'r9c_: ۄCB@‡rԇi<-j/qIx| !,I2!"[k a sƞڐ^=ggT^أ(hxg &@H&NHMNd+U/ +-Ѓ3&DT9 +o*2Wr8Y#S5V\t +p-]MajCp1::A?#vl0Pz@`$@]P*%o>d\`WĀ]-yL0VM? &Yó +_CK.^lE_хzVte셺 D8Pv$u }ڸ Q53w!ȳ10Q2ڌ2@0AY(7*UsJCyC5]!2[&tQe1A{q.D@UPN0/ϑ}GvV4< FJD6};yE:$.)z=>H/; 8*iݒ>VMt}7 +Rv3UX%$-bi[af`b m~?;FymG![+IO|${^xҬ38TU -kg +d1ElG^YI^UU@ZB_,,ߘc8mm [vLBHV7!rĵbHΐ/+Fbg_>Lp8yF "eW#Ag?AL!Z X`$Ҋi]&m;4!j>!P*vIp&{!TS@T{eԩU24̬Ў`5# +5g ic#U{6]ltFR-CׄqMպwH;bTxxDKq /ݺ1~ZRQܚW{ZգuMK5.̋*C#=J=anY)|яizR*/?MNzA tM/RX΃'PtEa.}Ax;#Kې\B` ]%VY1R԰YYA;ҢY) +ԩ *v\c6xps𝜺aBK_,2 %6rvzd'|ӠD"dm_>~h$ .JϘR9Z# +bsx:C#g#a+콵1<;QYt& &(.f o񪩀V(8ckVH1cA% a6J5VE:\ oBK[ծ/jy`(#lp+?pyc-%H;b'/>xga']WVE/2镀#PdC;m-kUd@tm)=8;GgY}5bV Y@Y=>4SyVkvw<) $~VFfxDa2vdgsIH5;! +&3ش5Nu!^73Zzs~QкEQ{mև<9ܡu\ ]߃Kޥxޠ| +tE7t K'`B `9EO-]Oo V5`n{;zeJ^+[q([ux @ +픜|w[~D9l4'k +S" + _TlF6oת%%֭i@wHzi^FC5v_Xo7 Ć}:c54A3 ~]֓D֌c.uHО9B=Ygd@͏/\9H^Gky!䴌L ]W-E^!jRC딃\ҹZI `1*1sJ|Іm$tB}8/e3q'-a6zEXP42_.]3lZMzհ؅vKDE|绉i񀍭JaNKsbEj\/%vH&g >FG9);cxY{F8Lڽ5-[<+wOT|́Goyow5& ua(3B)3B>ݝY; +OPzpa^S(N|,wny^n!}ΚF˵v*KEb?Hxl4vu-luPzLw88пr #U8DHN94s 0U .$7eaZU^sZeI":eb*(;*DEX&藅PsR)U!!m9#*sa H@B b KVE LjтHO\x,S- +P:vMK"Ct|.tYDbEZ ɁƢQ̷pұ r!&Y8$}CbVfT$&_a"N+*J)G/4NԘJeH +欈2B.diLBĨ$pb35"#"T|> +Ȩv:iT@_?C x XaRcFMa)) W~B1/jT]a9j慯ț _vKuBIJ!7J `VdZaװTbXkacf2Eq((*D:N+BZPC'$W5+QM>Ra[Di yU``'(*]1A*,# `kT@oű FhJ#:NI k1qe,\y6>@/ (%C+^eFv-żqBhmVx!!df"4IH"4ZFߌi],yLڦh^EIit ҄4QQ|CGNT/2U#q""YeRުmE#،jl>Qu-05(rXDLHn9uLeupRH0uzFSRx^ }x 9Ҕ^G|"7siy|R>NCMT +YPHь(6#%SD":wF@Hh!j tU3Oe` `lPnMT5Mıck聪*!x{bJ9dgHuj0z&T "cZ=m&fe៻TtypyjK jږCK#C%S>Dμ [fԦrED@B8*%%R ^p˯ +b +P5jZbt+a?-uDS,bOL>WQØ@=k"B!J(2Ub>JI\!''|˪ mc+"!&!Rѩw@ +*`B)5Fy)|I  Kf+ޮ?SX1% LUmL EU4tC33L8da)C;>*X;z1E{&((d^i5BOqDD PP/9iAUixviq*::4fWfa((Z)O4~RC!%B(<S0CG&FiqzE$˻WKТ0WfXqH 9Z'᫷v Mu0 TĘXGMRHZہ(!_UA'hZ-\ >է5)W$M̰8J.7CN@S,]-]-Pt wIQbb㔘pF*zt99%:)CY #"1R=+gSqٔ@ . 98he:UJW̴w+Sta NT 1+EDP +kD@I,t (kD(w壙MtFWm(/O&CÒD=@)Dil4 /#لn:PE#P:Z }NM=!VLqrh }TI]E &4zD i%5T P'Zc! CT]Q*bUB&rJ"5r*4gfˆ5Њ +z È~1TE[ .3\PquVA^ Y$PrُTd3EBa:dBkRLb1 l@R \iA"`)jwHSP3ATxb*36傂`($=*4frt8QgP&ŔBWGFU7!6qipU&5q3#JN{,22)c?$\82:7 +aza` mľ\6 Lxٟ1km "\@ +r0cL"ڦgfA`1:\9`jx)88<UpF0D4l ҪL 4R$|o'b U8`ba}%1NA+1(҆*f* +,qor@Z^I]EHQA4!$%z$FlVAU3]*U +jCS.2(LR@lraKѢuT!Eh8XVU% V22"+4b,s"4>۱:Sn4d3='UKcU"-/=|#pd T?@1\:Z9"3*;%@ȌȔ2 +h!uYC X)q‹OrFGQq1U" " օod5%PlYܡq56PtR P0e."{ I0xl3GIMM`dڐ(P1}%"A\ZDpL*$>!6SbGuX \6!`,~y" Uę${V4ƛd男i4em2@2Ra^f)#sć@qR(P;^BYMT=Q +*Rzt#LX$$L 5aquG YDXebEN؇L5vd46@ +9)TkԢJ@H:MA̲f9.ӊ?"!l$3"PjtrYJ:-M8g&k1$PQ@hW  EŚ"L|ȞEH.ȅS7ƭK/K 3򅊓jU6u[m !0^0 +0p=F10:48-0i_BĒ eՑ6Jqk01-?U_'q"d2 e FΈ*J`$v Q45d(+J4Pʳ@rdn\yh p0G $3=84 +Ke+qUg!tp /=%. 퇦 .lZ^WT7Bi㵇\ s _2Go`LLhW%mU`ZU4NrQx,RSXOcm$`2yy O ?ltЎKTܮ6,W tH`;~ڻ/tbXžӅe .h4sIfQ2&J +gez\oUB*uUw[Y: bbה/`NC&ehlP %zɅSARZ8Ϗ;ksyyqOK<1Q-ݚkdp(:^~6٧&;b-nH!V}{;0AZ~) +M&0)x43k_S+̑E#Gr~f TTQ´#"ZK&Ѵx-4(lШ AHcC>TbW#xAYG*!$yĹ@AqYV2}{SFꞮ8 =H̃uS!E|};| r)+y۞np% VU`Ϡ\Ph"3s'0g4uN%O,#j v|haij<+ތ1̠dPhMs 5@(1Yd7*W V'zL /'F, ,ܰ4 +xتstʃTdD1?&n ڒlL2Ԓ!ݩHTxJOL͢%CԜ%@TXT: 1$(0網f`a^Dז;?o5wߦh-W.kO}'y,-aAL;LQ2X]o53(ggp(ܫe1C&3I0-'Ѕr$ :U# +q%9+䠰#4]UynhF;xeP[hE +\mF`h&@0׭<ӌ!c +OnZ{+:r(v> J5yZC#qa4Ggm#/?ȓXj`.S֙( Ca~'4+;yOSjmt6Pw,XIˆ 1x1%(/ 11<:= r)0VWmc]~kyithkoh^6^p< ,Gvi}2]"E1\4Kdx\ ?dN(ʑF)$ JI¡#.u@&S,PZN-r@bW7!pػ 0X{Vc$KPB:bBP8t30ƀ[+ Xȵ+' +=$sSlU0!TMSVh.r +'xн^ c6/Ҵ4:w& +5k+ UXvo-A2_LH7n7Y2Jr$ +oˢ(e6R_sZFKrVY 7,*Ak.BBB@*8F۫yrYAGn`"=:\W(aY{mN)xz5y uBw8~LdP eOG=vџ? @͛vQf;B!Jݮ2[h3.ôV +"$;~e^^]Y͕"%2oUr4e27L*hyb1-~FDjL#${C@(Y͓LB=%Wtͺ @YwB<>*J#2Ƕ#*]yujW9)jp^ݰ|XPߝDu+2V)X: xXr0Gؚy҄_Y‘3NTAa$_`$%u040tWIHy87` +ICA=ىT5Wb49]t>am9M;9O]ԍQkV]l?+H!wɸ_XG #m$ (@WsȜ[BqJ*aX`^T Fx +qDU0e@Ngh&Q}>F[z> +Fs3Xg + 64f< pPҋ^w~oZ嫲@rNnw`g@0):jGz`.ؒiy{Ù"j131JEJF* %ƽIaAx!.V`xSpXxǛ +6)+v(#`%;!彎ҥ7og !/TN87hJQ BPlH^s7?P 9^_B&z_[>L3vB*3$D9v TuD0?nw?C 8 +UfBA1F1k7OU2Y+9>9&7'UFtrʓ" Ypq ,3Nm+2a( J R_8 ~MHR0/T-X Zufv )*H}5+xI"$I^kl6 +d(B;4z d]1hGo*.uq+Bqte1'7+$xzʡ(]3;Ӯe,E/: = w + +X hT c3u۷CF\&T~xvEUwP$\굑UGD\jLLWgOLg?ZO4YM騺< +r1 D%28>] uKzJLqf oQ08] GM@\Y@I(VTKuPLSaƄ +QsI\FvŇMV;n=^\c$+ ')pi@yn+ ؈;o^3KxȺ&m7u/Εcޫˠfl*F\ڄ tS E;;DI,1wuRAN+1,sҷ_^ɡ@In.}Kq.qF*C܈nt"h(Rb.ʡVi=㽟'V j2y4֞Fx@՞w\֨^ǍHnTH3VJ3 _0 +&IХػ* "=%v2zAu|h +##Dѻy~A+o7'5@γe#jOQC9NO_Aߙ`^sBH_ֲ| +Ggb-~bd qIdviB|Gߟ?5A+lGΣ_ET#wP mj[=G/Kd٣BSPPzVeXo9".k}(3n1X ?0RFtVdcBo9ȣPe +դy|Ǭ8ms f3e⿥Sƨ)Q UN%xD,U% ʫD.&:eFhӧu:7#':;Vx6s( rF)Wi +8CnLZbHS 1wh߷)r Ihez:!J]O#&>^\WK*SFDJ$fR6J!]Q+rY qӰ˘ +@On%'nBa@ob _Q)*M"LqnZC@"ѕ~=hh4z$0҂BPgƑR=y$8>Xbąb"VĠOw;|`A7fy2 !pI~9߻;-Ekq])G;!3  #S!|&F֖e]`@8eus\$:fHBt +1tDq<ZU ̅"qkQ֥ bX㐮˗[d#Aev.c䈈8/(kc:sHݽ4? ,B}A"- +B*-P!TЬ2 Qnxl6kq9H99F tLia,CpУB7'ԑ;QD~:F7y#1ĊT9'~Q7Չbgz@ ^"jÎJʅbRpFؠxaeo} +蠮`|#ڙDl`'S)PjD=^Dk^7|4YyqĞ}%.trskt*f'{" \DȈ~e-d$ +\}j>͐sl]G'{8_S m\,!)%Bt+XqqM+MSIOV;4τŠ5*T洢I>햚g;A9Zu QD"Xwg 23޶҇$ Do34ħE(`N}\7ĄLFEaLc#Es z:VJ-W IBnKNPxTw]aE/"4z(:ٯ`-7b97 ͈< + ~= h@iGo,drIS)f.Y4BJ3o "Oša,cwkH01YZ/aD(@h!k̃[ei v +꡼<L lk#J9폨+Nah +/v0t^.9of*`=^ըRnD˴!(^$>ga1TJmHu\ !I8X: 3&26 %/yi/bʄ$37\ D3+`f]juZCdd6$Hpu`FUDh/me Hr(cb +^hfy.)f̆DȞ<(Vkn +{$KYٯ@7BR#iܶ:]_= +tk%hh_#dST`0* 1n/ e='w%[2 k >Q#t>ThrmH :4XU O4\7adb`iS[͔#]fQ뽗xhr[/P* EX'nFuCsR?YYRvDx{?f# ԋiӹ]W(w@$D6a4B1Ef +E)~|LuO2ƍzG+܋K;ŚP S&y /7A=`¯|H6kdgH8vh[H&$B3HGY-Y*_G;0rxp08Ǜ@Ԕ[bdqq}65u@W^Gp- +NUR褦؆ @[}+4 +jw݅zg GijMhx:k`p"5ѕ7 ˺ ]ڀ}U ?2FPQe5|7F2!|7܏W`BѰ#cWjRcrB  +@13rMPnj$dPEAn+sQ+ )emZ+"Pۿp"73$UPQHQS;wdNɅ٨#,p1(re!jj5(DHy}"sd[L邼hҎ |rUuVq}ށDFXJhrrI҅ +YZjrX +֨+d fSFw^ʗ1㕁%ozjؗs BH5Fe 9CGD~JMSH,:5p@w"<؍g +vloS%ABaZ,WHHeZ۟[ԂV͞'1CQ0a@U.6 {[GX-P +Bݑdӿ$@0pj> b4뀩D%Ca0*))x)#*u!RҸ9_Z;w"",H]c gvZ`]s_6Y a/pO)*d,L9`笰]+P8Os1͚J EV\Gq̗iTøRj>!j r72Į tjo{g+QqZroPdl 'KuO+Sh-=,`*ˇ.-s+'[/1)d2T^.fh@J7`A-ܒJNq1]d@ +#c"l1ɂvytJw!Ϲ>{6d҉7~L8( l6a$gDDSfF5y5L/g̳@~~K!ATS&\QS#eķ8t"/3&@adFfEY+@p ]ג(E? fD߰ +Qt$Kr?X:o#y[CH}p掇9AD9ja?&W3gTA7G7Θި [$ sx~M"Q KBLgAFnϡ>ڼ'a2grUI2o/Y {AGslr0kfEm{P_Aٕ)ezn.jWzq, nH,XqyG^ĞkZjұ![7@][4_yU2+$-2Q{*8qB-DžW zcxkYc u5+U;ٚ^F\$dz:̥FL&]lj1/aÚyEʼnֶ=>Xů#n)jq4ՙ#S8'*[' +grLC0! ?,/· ؋W]2 H#\ŋ,wP>yэ~KGA  qŁ/%=uF\ kĢyԌ`@ʀ +L2Ũlc[Bf_)kL ++C+=FpL[V)r"@>/l6ؙiXב/ʂ_"4\A [ո8K֮r*NP|Z농/':s<?uXuHDe50آ?y#1bv{z^Rc6@^4<9`b6vwu Ra92~ 2vYCWzn.Gö@pCvK].-p[;xUbvU% +;D8XĒ9$s,{4X +,FUǢutűiNe4~,*4afO38פ-/cu5n +i*P} ;YƢCm [S +x'0,Ƈ +Rvb&aN ΂ϳШ V"(VO!rZ3ҳ3e7mai\'E6F݌aٓA +ͱ +lʇE Zpoşdw Mp%*gs"pOL( #:Ip=2BAY"F"[<m wICpAE]RQn7ew>v+A=oS%>cґ@pEPp$ {x*d0""uZ@EIku+5 +s0U=V?* 4-r9 +݅j Bēb1MԺO(V;$BÃayB:ە[L@+'vK SQߪ1ؐ w9M6Eϔl 6f3P^3CW7gq*";L +׀3 |Z 7g_sEEF9"I5\MM`J0 +,efȵU;!(, erBXesz4enw'/VUhve?q7vHwX]Yޅs[!Pai frc( +#/sOsP a^ +a +b#ka9)~!1@Y\#آоFmȑ.Oa1 <0rv83<3eL,S9;FB]Ĕ!$Ppfi)MH8ZhPdQHMEg,| rjMɬ~J>)nRd$0p_R8 o !C[#g;od6S <ʹ1Px\DxѠYҖBx}T`uQEgd.IvZ,)/3Y@@i5gҢl";yn CZR@֓{PDL`Ra(@[B+`@28u ]ܒEdF83J܂ N%?K5hD]+ӓ 1|Dp#I$[pR5 6 U& HM# +>,@2CX7yv V[w(jq!U ,! +4{A4BP_]bW"mypsv0B)ȟ]@0) P l `șa!p$Un!x& Nz݊a)wrg_ Cn{\\>1s$EdfC +ͨ#Jw1D7w9kΏu]c&(*qU0drwE4"J ˪>*?6`K2+ƴ]]vK -s"bYҮ$)H]'kwK>dٸRv1icDP^@*7(2[HDg3S +oe jPL*|gẁ*xKkF%Eyt}HP;F'm8g1 +Cvz Hί p(n$'I^pam=o {c$ Q 56эE PI6p|S-wKdB@~FX8 VVm[Ӣ=!{Ilį9PW˺5r7Ie|pѦ@Bՙ.@VLDm Խ, wGF +=IEls*hk++/;$ +.y@2qۘ4Rj6$]8/uT4"K4*շD$adzUů?}E LcWr + EFйÏDUp{Q8O-W7R +C.fn?jL\A9yX̙4;TDAh7NJ[[ ^ʢqxS,ʀ)5 )gCgBD" endstream endobj 15 0 obj <>stream + 33,' >GcPAJ;ɠ\ՅEJb\R ʵ&= PiPwX nf>/ NRsS2|LV'-16ɾͼm7v.:f앨VcN[z7s+uauU[wm˵]aK&ި(7eims%]LQ[묛sDEn'mȫ@0YӪtgΦ=CL_4HTpEC +O +Hb@ Iy5M |5~zS`<x$8Źl%II +Ri D@" @S0QŒRHB g c$ΆؒOh3j/cE=vֱdTNi2ⱑ"ϓ)Qn&\AHݡ5p`KS΃2ddLY+dx1;hw>%u78|k?htlj)" QPuOq8Pûo>stream +85$EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> endstream endobj 26 0 obj <> endobj 27 0 obj <> endobj 37 0 obj [/View/Design] endobj 38 0 obj <>>> endobj 35 0 obj [/View/Design] endobj 36 0 obj <>>> endobj 24 0 obj <> endobj 25 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <>stream +HKVkTTߝa@ey{ +E +!@|(Dg*( QP4ՈIiҕ,ӬMTʤ$؆hZMk"4]Y5iwEW~q}9۾vÂz"!uCw[OgU~- Uʆ]}j9*=[孍[pSG:-_?LNe]1cy-~˶ m{M&vC-Fy/{gێp4h1ֿ1E(U+^V/e-$&YE(x ±c%K1O˕cRϩhs)SXP I䏖bMɲk/цh`&bb}&#$ ޝH iHG2A nd#Lt@.򐏙(B";(A)P +T +s5<ԡ  ш%X&,r4wbV Va55Xuhe!%N+ ~NU?<\[ .^؎`e1قGGzߖv(N zorM܅ U: <Sx/` ؊mle|MZц[a=ڱ s~(~G@x /EEv⛲RZVɝd\F;<)Lk-A%])W^U*w-[ZNZ$5MR]G-TuϴDͥyⲹ&\NW+˕juuwGOpTgR e,i#p2tsD5EPUsٷRoΑ$~/<~7|9NH ^W3~dt0rfȳ#OFD=|loZKCCB+C+B-e%ڐ'49{H֎l?WV]; +L MlTbi%*;e^ک̍$uW}U}SgjAl8r< nj9a| ( MD J 2s[֭j"WeW^O~AjkXs7:>] ٻKiv|sj~>z]1w7Xrd6t­5P5{f63T/-^95Rugtᛉ8?Adm&1N5mCu:bsƒ%SIN*yCIN*I%9$'䤒TJrRIN*I%9ax8KM\%>&Ɣ䤒`33) gEY3)NjssW6>Y[{(,7-="rʑafh@g]SGeCwxʱ 8~9=tYb4n;!?Ў]FAۡ`d;f'%Qk͙$3+k^w +E3X=gf=;\~w:$ _I:K aZT#Y>30]]moߺO.Sgʺx-z鮳Lvrbym}BTjS>+=\&uOjrgny=4FLs03lTUH6 EK|@!>">&/''DUYYrկ1?ո\݃q5O襫tK-I$ݒtK-I$ݒtK-I$ݒtK-I$Ҧ[tK-M BUVX\ +p*UW\ *UW2^YX5ӉtbHM +S]V:QuenVuVTv7Zj.D~UX;icPߣl75_oqfuE//uov=3Q48Q"pE(G8Q"p(:0xtǮ鉚rI\h<"x!"xh:_  :R5 7gV 4dАAC 4dАAC 4dАAC !4dwG5Geݻ FMݟF|a}Mi)P"DB %J$H(P"D| %J$H(i(鵵)QPDA% +J((QPDA% +J(K۵$1ao ҵ>>jnwtD~SSNE2"t-{qFf4[r!4w. +UVW] +t*U@W] +t*U +kiZڸ$BKH! $@H! $@H! $V! $@Hb Iq+؛vgnO^l&7ō,lK O0re~buVo]ɲo/k zӚ\X]9.aN*A-wwQ [R;1=1'vy]:rcu+O!E|Fʹˉa,ۧVNCar.^Z/uzs\KKqЗ[ +ި iR-R-R-R-R-R-RXo)8Kao-1lAZ)c(z[^p=lniZGsG&zD3=Q'-u(CyP^:סu(CyP^:סn)[a{j9 W)Gs!?s!?sys!?ܒFe-]墛Eki]_;KZAϋfsc݊镍i{7t>sWdsyY _Vyvesee|ћz{fsi:XGy&u5 -٤=iE^ӁVtJ(tJ(tJ<$@P:J͡kñttMwu6GXpFtu7}sTDcuy U~8q|n)|jЧ}jЧ}jЧ}jЧ}jЧ}jЧ}jз5AE9A +h_tNG}9rۦՎ>Gi2DAp?;8GUcƎ]9:aw[ɞzkjyZ'mN[rq'>q'>q'>q'>q'> 888\ Ti6Pn7X ʦ}--mntWKuc}wg4jWr^.йzm[.꽕+)c^:1UIlm4h#txjm5cb%5cy֕@mUq#f 8 ~~~ ΁7#**`ܚ̤=&9v1]SٽqYxJ7nવ<Ѱ"XOӹֳ]ِ,.s3:IݧΦ];[=6:pI|;xeL9->&CjExFf5 Yxk^,f5 Yxk^lk65 z՛+v9aeY|J)T+3?W|Hؕz^ˤEkWxeqg˷ƪf}u3i-T~ʯMk>rx[]R:g܈d]Hv!مd]Hv!مd]Hv!مd]Hv!ٍHv#KoF/I^e⴩9Y.togՊʲ +Ϋ}ݶئXye_u~+Ië@Y~'j/B35 N d:aGTUN4ٯJec` HY|tubh~-!(ԧ-} i?jפIa.$u݈ۣ?.(q/A e,|~GŲ +lǜf|QV.=!nv[H-sn +oSΰ$=dk8iu/ZڪXOm4MOٝrIb{uAK(~:mR0e eMVlc-=62` :L\.:ḍGoK^y=`0h7( y5~<޷'Ls[7}ҫ}SY A _c||8/g+}+VxOA\KƌUCgm||nBh\uRh<I)/+,1kqK-7sUM'ZbFV?Be&&&lK%_NJ|JթS=i>zVNWH,<9ՠq^O]Zpؓ0# eiŒ}K6i?i]rKGa:&Mmat.vnj5q[˒~yL2%qi97NYdz.'3MeyTI3O-.=vJbyǎcg05wqdVҚ?I)i3{DD#ZOVq~]}uj#=&ޔAm9Iis{ؔO5jӆqSG{LS?x.L1G)`I +^;q[SZ\{ʽůk=+fp.Sǒ/UM5 G!)ma^)lkK(9riɉwq\\[WgHDM%zeo ˯N1xO\]\XfGMͻSalI5\L%R endstream endobj 39 0 obj <> endobj 42 0 obj <>stream +HKWktT97@fL ΐɋȃ4HBxa&<@@ V/S*ZҖ6QV\j"Df +XSjkY {dE +;sswٳwVښajM˺{vX 4^oK]C[O{w@oG^rtގ)Ͻ 0yM||wt@U˚ϛ={^lE$v%aq!4XpN_8T yV=̬ 5..qUxmOM'$q :|Jb!!և!Q=1E3 Q +a&(B1@)Gb Ta&fa6TyC=|,4`!a1 ؇x?/q ^o1:pom${>>O86< ؈-X8'alV +eօX{v&Nn\|n߲IN-UN'r|P%JQJd*ܪ[hkbMVY'/j׸ƨjZiwY>2YzĖ>´bMv}8n)80Ä Bdb(aJ/HL#I&)QʓJCZ"m'L,쳜\\CDYa*/L SSS$aB@a"L M׆OG;NNg5ͻ] ++ߴ$[-&_]] +=]m'1;Vˢ97A}zFZp1bg?=Eݯxzx=%u|tRw{{=]NqgXքlm + + KWoi|;ڟ<|;{vc9VjЍ-;.[3b(b.ӻU!* Q%v3bhM8+OorR_VhNe.h}4r=@O>gkQtZ}go]0~L6򤣔E㒌:Z\YbMt$JHg9d+컓Ȓ]wR_oW\epGq:>M +J-DJ}_nv;̊"Wkrp,Ht3.s0ŬHBK ӯנiv>p@Y`{_3w +QN>^A)~=áS> ᰻a8=ÑsaefF3 G}rS= +?Gy=,Q*4@w RqƒAwQz2NKI4) ?7:2جRm':6RdsCpLl7.CdkTo*D)T` F6FnjZԳz6vf?jyļΊʅm=Vӱ!댦.uvjSWT^Tmۻa)یM[WEFlر ˕-{Ԥ9Mp iH<bR(kk֠A[>!Id.j@,$D8Ddt3_*dUW{_ 4,lYNgg ly+&8<а~q_7\>?2u!^ê1 7@hm^)eQʨ4^=jD?Zȭ_'ԈRkS*BcFRS\A;}v\eg*> +vx_yەA&Y+̩{VU㇝yg=aUlSRҏy'Um$vht܍r'ek_'z;MeJ=.cj!t :'C"혨XE Ƽ}5<5ɺG:0@\zKآـ߷uwܹ;Kn[́ˬWf{e:Pycm|g[)U~qahBY)vχowo94YO:[k|ҞnCeBvŤ+/ҏJ?;K-O+37彏|…ǻؙX~6VA&"+e,W(Y~pY(%%996.shS5M)ƯQbOb)I~l~ ]U)k٦ۈ/s_ü#1NN@C}a^ۋ`O&FW(5~3/Y}G$$1w&r3ԑǑ+1<+,W8ALHruaSyn؃rr\G֫qkqۉSW=)/9PD\qU Q|purV oy8G .?^W }NL]"y?Ӭ/yo,yv^|9|)r;?N6wx{=+¼X(IxϹ:j*5UxA#fC|k߁csA*IeqUbDOei+9͝k8U7cn-gC?[U^|P%t wpw/j}cרS'U~ ۯC_ܣ8pHjURh m\VvLET^ηf]jw옲g1{|UU]OY9u%ZQטJ*x-j{Hb1r9-c弽]8/b?9nv! cOZ;}IwRojW)uw5t;#7.3L{o tźռA[9=5fN3|lP v@6;f=az@tK, |2?M EoOH'x3y\<<33<3y'*6eW*%7*_v)'r fZwoc|v(~h+Gi1]4 /0ß cMob֤]4>K;cX0=߹sME/3pA_c%W7'j476׼F+xq=[QZձNVP{D_/@MMD̚u=wMT51j0{éƀsʦ6IlXt ôTXeyY/!YGc̈|lhj'v1U\0 4g/bLHby:.YM{Nb5-!uf{}k^e3fVVS5l|w k{Qt.^VW^GΛJfW함QL^ܢK5om) VLu(&fzSLE]L3gfdXYH]c0f4ͱzd-ut6% +zeʩ8v endstream endobj 31 0 obj <> endobj 30 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HKyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 28 0 obj [27 0 R 26 0 R] endobj 44 0 obj <> endobj xref +0 45 +0000000004 65535 f +0000000016 00000 n +0000000161 00000 n +0000062988 00000 n +0000000000 00000 f +0000063039 00000 n +0000000000 00000 f +0000000000 00000 f +0000066259 00000 n +0000066331 00000 n +0000066570 00000 n +0000068105 00000 n +0000133693 00000 n +0000199281 00000 n +0000264869 00000 n +0000330457 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000332114 00000 n +0000332392 00000 n +0000331740 00000 n +0000331811 00000 n +0000348788 00000 n +0000063484 00000 n +0000346096 00000 n +0000345983 00000 n +0000065511 00000 n +0000331166 00000 n +0000331214 00000 n +0000331998 00000 n +0000332029 00000 n +0000331882 00000 n +0000331913 00000 n +0000340278 00000 n +0000332780 00000 n +0000333037 00000 n +0000340538 00000 n +0000346131 00000 n +0000348820 00000 n +trailer <<6F09A1C756064C16BEE961615B2563D4>]>> startxref 349027 %%EOF \ No newline at end of file diff --git a/app/art/hero@2x.png b/app/art/hero@2x.png new file mode 100644 index 00000000..1ac37a29 Binary files /dev/null and b/app/art/hero@2x.png differ diff --git a/app/info.plist b/app/info.plist index fc9cea2b..ba230385 100644 --- a/app/info.plist +++ b/app/info.plist @@ -55,6 +55,8 @@ ${EXECUTABLE_NAME} CFBundleIconFile PlotDevice.icns + CFBundleIconName + PlotDevice-app CFBundleIdentifier io.plotdevice.PlotDevice CFBundleInfoDictionaryVersion @@ -72,7 +74,7 @@ LSMinimumSystemVersion 11 NSHumanReadableCopyright - © 2014–22 Samizdat Drafting Co. + © 2014–26 Samizdat Drafting Co. NSMainNibFile MainMenu NSPrincipalClass diff --git a/app/python.xcconfig b/app/python.xcconfig index 868ff609..20892d04 100644 --- a/app/python.xcconfig +++ b/app/python.xcconfig @@ -1,7 +1,7 @@ // Generated by deps/frameworks/config.py PYTHON_FRAMEWORK = $(PROJECT_DIR)/deps/frameworks/Python.framework -PYTHON = $(PYTHON_FRAMEWORK)/Versions/3.13/bin/python3 -LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.13/lib/python3.13/config-3.13-darwin -HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.13/include/python3.13 -OTHER_LDFLAGS = $(inherited) -lpython3.13 +PYTHON = $(PYTHON_FRAMEWORK)/Versions/3.14/bin/python3 +LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.14/lib/python3.14/config-3.14-darwin +HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.14/include/python3.14 +OTHER_LDFLAGS = $(inherited) -lpython3.14 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) PYTHON_BIN="$(PYTHON)" PY3K=1 \ No newline at end of file diff --git a/deps/extensions/pathmatics/pathmatics.m b/deps/extensions/pathmatics/pathmatics.m index b2d116cd..1bc131db 100644 --- a/deps/extensions/pathmatics/pathmatics.m +++ b/deps/extensions/pathmatics/pathmatics.m @@ -3,6 +3,14 @@ #include #include "gpc.h" +// the macOS 14 SDK renamed NSBezierPathElementCurveTo to ...CubicCurveTo and +// added a new ...QuadraticCurveTo element type +#if defined(MAC_OS_VERSION_14_0) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_14_0 + #define HAS_QUADRATIC_PATH_ELEMENTS 1 +#else + #define HAS_QUADRATIC_PATH_ELEMENTS 0 +#endif + void _linepoint(double t, double x0, double y0, double x1, double y1, double *out_x, double *out_y ) @@ -306,7 +314,12 @@ void _curvelength(double x0, double y0, double x1, double y1, ++k; break; +#if HAS_QUADRATIC_PATH_ELEMENTS + case NSBezierPathElementCubicCurveTo: + case NSBezierPathElementQuadraticCurveTo: +#else case NSBezierPathElementCurveTo: +#endif // should never happen - we have already converted the path to a flat version. Bail. printf("Got a curveto unexpectedly - bailing.\n"); gpc_free_polygon( poly ); @@ -678,8 +691,20 @@ + (CGPathRef)cgPath:(NSBezierPath *)nsPath{ CGPathMoveToPoint(path, NULL, points[0].x, points[0].y); }else if(elt==NSBezierPathElementLineTo){ CGPathAddLineToPoint(path, NULL, points[0].x, points[0].y); +// NSBezierPathElement* values are compile-time constants, not linked symbols, +// so comparing against the macOS 14 names is safe at any deployment target +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability-new" +#if HAS_QUADRATIC_PATH_ELEMENTS + }else if(elt==NSBezierPathElementCubicCurveTo){ + CGPathAddCurveToPoint(path, NULL, points[0].x, points[0].y, points[1].x, points[1].y, points[2].x, points[2].y); + }else if(elt==NSBezierPathElementQuadraticCurveTo){ + CGPathAddQuadCurveToPoint(path, NULL, points[0].x, points[0].y, points[1].x, points[1].y); +#else }else if(elt==NSBezierPathElementCurveTo){ CGPathAddCurveToPoint(path, NULL, points[0].x, points[0].y, points[1].x, points[1].y, points[2].x, points[2].y); +#endif +#pragma clang diagnostic pop }else if(elt==NSBezierPathElementClosePath){ CGPathCloseSubpath(path); } diff --git a/deps/frameworks/Makefile b/deps/frameworks/Makefile index 788b5389..8b4b53c8 100644 --- a/deps/frameworks/Makefile +++ b/deps/frameworks/Makefile @@ -1,4 +1,4 @@ -PYTHON_VERSION = 3.13.3 +PYTHON_VERSION = 3.14.6 FRAMEWORK_REPO = https://github.com/gregneagle/relocatable-python.git BUILD_OPTS = --os-version=11 --python-version=$(PYTHON_VERSION) --upgrade-pip --pip-requirements=requirements.txt BIN = ./Python.framework/Versions/Current/bin diff --git a/deps/frameworks/requirements.txt b/deps/frameworks/requirements.txt index 150f105c..ebf4abc8 100644 --- a/deps/frameworks/requirements.txt +++ b/deps/frameworks/requirements.txt @@ -2,7 +2,7 @@ xattr cachecontrol[filecache] cffi -pyobjc==11.0 +pyobjc==11.1 py2app requests six \ No newline at end of file diff --git a/make.py b/make.py new file mode 100644 index 00000000..20c594b8 --- /dev/null +++ b/make.py @@ -0,0 +1,361 @@ +#!/usr/bin/env python3 +"""Maintainer/CI build tool for PlotDevice (not part of the pip-installable package) + +Subcommands: + dev set up virtualenv in deps/local with required dependencies + app build PlotDevice.app (requires full Xcode install + py2app build PlotDevice.app via py2app (requires Xcode command line tools) + dist build app (codesigned, notarized, & zipped) and update release.json + icon regenerate app/Resources/Assets.car from app/art/PlotDevice-app.icon + clean remove build artifacts + distclean also remove the embedded Python.framework and deps/local +""" +import argparse, os, sys, json, plistlib, tempfile +from glob import glob +from shutil import rmtree, copy +from subprocess import call, run, Popen, PIPE +from os.path import join, exists, dirname, basename, abspath, getsize + +ROOT = dirname(abspath(__file__)) +sys.path.insert(0, ROOT) + +APP_NAME = 'PlotDevice' +SPARKLE_VERSION = '2.1.0' +SPARKLE_URL = 'https://github.com/sparkle-project/Sparkle/releases/download/%(v)s/Sparkle-%(v)s.tar.xz' % {'v': SPARKLE_VERSION} + +## Helpers ## + +# helpers for dealing with plists & git (spiritual cousins if ever there were) +def info_plist(pth='app/info.plist'): + info = plistlib.load(open(pth, 'rb')) + # overwrite the xcode placeholder vars + info['CFBundleExecutable'] = info['CFBundleName'] = APP_NAME + return info + +def update_plist(pth, **modifications): + info = plistlib.load(open(pth, 'rb')) + for key, val in modifications.items(): + if val is None: + info.pop(key) + else: + info[key] = val + with open(pth, 'wb') as f: + plistlib.dump(info, f) + +def gosub(cmd, on_err=True): + """Run a shell command and return the output""" + shell = isinstance(cmd, str) + proc = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=shell) + out, err = proc.communicate() + ret = proc.returncode + if on_err: + msg = '%s:\n' % on_err if isinstance(on_err, str) else '' + if ret != 0: + print(msg + out.decode('utf8') + err.decode('utf8')) + return out, err, ret + +def last_commit(): + commit_count, _, _ = gosub('git log --oneline | wc -l') + return 'r%s' % commit_count.decode('utf-8').strip() + +def timestamp(): + from datetime import datetime + return datetime.now().strftime("%a, %d %b %Y %H:%M:%S") + +def spawn(cmd, **kwargs): + run(cmd, check=True, **kwargs) + + +## Subcommands ## + +def cmd_dev(args): + # install pyobjc, requests and the other pypi dependencies in deps/local + import platform, venv + venv_dir = join('deps/local', platform.python_version()) + if not exists(venv_dir): + venv.create(venv_dir, symlinks=True, with_pip=True) + PIP = join(venv_dir, 'bin/pip3') + call([PIP, 'install', '-q', '--upgrade', 'pip', 'setuptools', 'wheel', 'py2app', 'twine']) + call([PIP, 'install', '-q', '-e', ROOT]) + + print("\nA local development environment has been set up in %s" % venv_dir) + + +def cmd_icon(args): + _, _, ret = gosub(['xcrun', '--find', 'actool'], on_err=False) + if ret != 0: + print("make.py: Couldn't find `actool`. Try installing the full Xcode (not just the command line tools)") + sys.exit(1) + + ICON_SRC = 'app/art/PlotDevice-app.icon' + ICON_OUT = 'app/Resources/Assets.car' + info = info_plist() + + with tempfile.TemporaryDirectory() as tmp: + spawn(['xcrun', 'actool', + '--output-format', 'human-readable-text', '--notices', '--warnings', '--errors', + '--platform', 'macosx', '--minimum-deployment-target', info['LSMinimumSystemVersion'], + '--app-icon', info['CFBundleIconName'], + '--output-partial-info-plist', join(tmp, 'partial-info.plist'), + '--compile', tmp, + ICON_SRC]) + copy(join(tmp, 'Assets.car'), ICON_OUT) + + print("done building %s" % ICON_OUT) + + +def cmd_clean(args): + paths = [ + 'build', + 'dist', + '*.egg', + '*.egg-info', + '.eggs', + 'PKG', + 'tests/_out', + 'tests/_diff', + 'details.html', + '_plotdevice.*.so', + 'plotdevice/rsrc', + 'MANIFEST.in', + '**/*.pyc', + '**/__pycache__', + '**/.DS_Store', + ] + + # Add framework paths if --dist flag is used + if args.dist: + paths.extend([ + 'deps/local', + 'deps/frameworks/Python.framework', + 'deps/frameworks/relocatable-python', + ]) + + for path_pattern in paths: + for path in glob(path_pattern, recursive=True): + if exists(path): + print('removing %s' % path) + if os.path.isdir(path): + rmtree(path) + else: + os.unlink(path) + + # Run make clean in svg extensions dir + if exists('deps/extensions/svg'): + os.system('cd deps/extensions/svg && make clean') + + +def cmd_distclean(args): + cmd_clean(argparse.Namespace(dist=True)) + + +def cmd_app(args): + # make sure the embedded framework exists (and has updated app/python.xcconfig) + print("Set up Python.framework for app build") + env = os.environ.copy() + if args.no_cache: + env['PIP_NO_CACHE_DIR'] = '1' + call('cd deps/frameworks && make', shell=True, env=env) + + spawn(['xcodebuild', '-configuration', 'Release']) + dsym = 'dist/PlotDevice.app.dSYM' + if exists(dsym): + rmtree(dsym) + print("done building PlotDevice.app in ./dist") + + +def cmd_py2app(args): + try: + import py2app + except ImportError: + print("""make.py: py2app build failed + Couldn't find the py2app module. To set up a virtualenv that contains all the necessary + dependencies in the deps/local directory, call the `dev` command first: + > python3 make.py dev + > ./deps/local//bin/python3 make.py py2app""") + sys.exit(1) + + from py2app.build_app import py2app as build_py2app + + # make sure _plotdevice.so + plotdevice/rsrc/ are built first + call([sys.executable, 'setup.py', 'build_ext', '--inplace']) + + class BuildPy2AppCommand(build_py2app): + def finalize_options(self): + # pyproject.toml's [project.dependencies] gets merged into + # self.distribution.install_requires automatically since setup() + # below runs from the same directory as pyproject.toml; py2app + # bundles dependencies directly and rejects install_requires, so + # clear it before py2app's own finalize_options checks for it. + self.distribution.install_requires = None + build_py2app.finalize_options(self) + + def run(self): + build_py2app.run(self) + if self.dry_run: + return + + # undo py2app's weird treatment of the config.version value + update_plist('dist/PlotDevice.app/Contents/Info.plist', CFBundleShortVersionString=None) + + # place the command line tool in SharedSupport + BIN = join(dirname(self.resdir), 'SharedSupport') + self.mkpath(BIN) + self.copy_file("app/plotdevice", BIN) + + print("done building PlotDevice.app in ./dist") + + from setuptools import setup + old_argv = sys.argv + try: + sys.argv = ['make.py', 'py2app'] + setup( + name='plotdevice', + app=[{ + 'script': "app/plotdevice-app.py", + 'plist': info_plist(), + }], + data_files=[ # type: ignore[list-item] + "app/Resources/ui", + "app/Resources/colors.json", + "app/Resources/en.lproj", + "app/Resources/PlotDevice.icns", + "app/Resources/PlotDeviceFile.icns", + "app/Resources/Assets.car", + "examples", + ], + options={ # type: ignore[dict-item] + "py2app": { + "iconfile": "app/Resources/PlotDevice.icns", + "semi_standalone": True, + "site_packages": True, + "strip": False, + } + }, + cmdclass={'py2app': BuildPy2AppCommand}, + ) + finally: + sys.argv = old_argv + +## Packaging Commands (really only useful to the maintainer) ## + +def cmd_dist(args): + import plotdevice + VERSION = plotdevice.__version__ + + APP = 'dist/PlotDevice.app' + ZIP = 'dist/PlotDevice_app-%s.zip' % VERSION + + # run the Xcode build + cmd_app(args) + + # set the bundle version to the current commit number and prime the updater + info_pth = 'dist/PlotDevice.app/Contents/Info.plist' + update_plist(info_pth, + CFBundleVersion=last_commit(), + CFBundleShortVersionString=VERSION, + SUFeedURL='https://plotdevice.io/app.xml', + SUEnableSystemProfiling='YES' + ) + + # download Sparkle (if necessary) and copy it into the bundle + ORIG = 'deps/frameworks/Sparkle.framework' + SPARKLE = join(APP, 'Contents/Frameworks/Sparkle.framework') + if not exists(ORIG): + os.makedirs(dirname(ORIG), exist_ok=True) + print("Downloading Sparkle.framework") + os.system('curl -L -# %s | xz -dc | tar xf - -C %s %s' % (SPARKLE_URL, dirname(ORIG), basename(ORIG))) + os.makedirs(dirname(SPARKLE), exist_ok=True) + spawn(['ditto', ORIG, SPARKLE]) + + # code-sign the app and embedded frameworks, then verify + def codesign(root, name=None, exec_=False, entitlement=False): + test = [] + if name: + test += ['-name', name] + if exec_: + test += ['-perm', '-u=x'] + + codesign_cmd = ['codesign', '--deep', '--strict', '--timestamp', '-o', 'runtime', '-f', '-v', '-s', 'Developer ID Application'] + if entitlement: + codesign_cmd += ['--entitlements', 'app/PlotDevice.entitlements'] + + if test: + spawn(['find', root, '-type', 'f', *test, '-exec', *codesign_cmd, "{}", ";"]) + else: + spawn([*codesign_cmd, root]) + + PYTHON = join(APP, 'Contents/Frameworks/Python.framework') + codesign('%s/Versions/Current/lib' % PYTHON, name="*.dylib") + codesign('%s/Versions/Current/lib' % PYTHON, name="*.o") + codesign('%s/Versions/Current/lib' % PYTHON, name="*.a") + codesign('%s/Versions/Current/lib' % PYTHON, exec_=True) + codesign('%s/Versions/Current/bin' % PYTHON, exec_=True) + codesign('%s/Versions/Current/bin' % PYTHON, name="python3.*", entitlement=True) + codesign('%s/Versions/Current/Resources/Python.app' % PYTHON, entitlement=True) + codesign(PYTHON) + + codesign('%s/Versions/Current/Updater.app' % SPARKLE) + codesign(SPARKLE) + + codesign(APP, entitlement=True) + spawn(['codesign', '--verify', '--deep', '-vv', APP]) + + # create versioned zipfile of the app & notarize it + spawn(['ditto', '-ck', '--keepParent', APP, ZIP]) + spawn(['xcrun', 'notarytool', 'submit', ZIP, '--keychain-profile', 'AC_NOTARY', '--wait']) + + # staple notarization ticket and regenerate zip + spawn(['xcrun', 'stapler', 'staple', APP]) + spawn(['ditto', '-ck', '--keepParent', APP, ZIP]) + + # write out the release metadata for plotdevice-site to consume/merge + with open('dist/release.json', 'w') as f: + release = dict(zipfile=basename(ZIP), bytes=getsize(ZIP), + version=VERSION, revision=last_commit(), + timestamp=timestamp()) + json.dump(release, f) + + print("\nBuilt PlotDevice.app, %s, and release.json in ./dist" % basename(ZIP)) + + +def main(): + # make sure we're at the project root regardless of the cwd + # (this means the various commands don't have to play path games) + os.chdir(ROOT) + + # clear away any finder droppings that may have accumulated + call(['find', '.', '-name', '.DS_Store', '-delete']) + + parser = argparse.ArgumentParser(prog='make.py') + sub = parser.add_subparsers(dest='command', required=True) + + p_dev = sub.add_parser('dev', help='set up virtualenv in deps/local with required dependencies') + p_dev.set_defaults(func=cmd_dev) + + p_icon = sub.add_parser('icon', help='regenerate app/Resources/Assets.car from app/art/PlotDevice-app.icon') + p_icon.set_defaults(func=cmd_icon) + + p_clean = sub.add_parser('clean', help='remove build artifacts') + p_clean.add_argument('--dist', action='store_true', help='also remove Python.framework and deps/local') + p_clean.set_defaults(func=cmd_clean) + + p_distclean = sub.add_parser('distclean', help='also remove the embedded Python.framework and deps/local') + p_distclean.set_defaults(func=cmd_distclean) + + p_app = sub.add_parser('app', help='build PlotDevice.app (requires full Xcode install') + p_app.add_argument('--no-cache', action='store_true', help='do not use pip cache when installing dependencies') + p_app.set_defaults(func=cmd_app) + + p_py2app = sub.add_parser('py2app', help='build PlotDevice.app via py2app (requires Xcode command line tools)') + p_py2app.set_defaults(func=cmd_py2app) + + p_dist = sub.add_parser('dist', help='build, code-sign, notarize, and zip the app for release') + p_dist.add_argument('--no-cache', action='store_true', help='do not use pip cache when installing dependencies') + p_dist.set_defaults(func=cmd_dist) + + args = parser.parse_args() + args.func(args) + +if __name__ == '__main__': + main() diff --git a/plotdevice/__init__.py b/plotdevice/__init__.py index e8397068..34de85cf 100644 --- a/plotdevice/__init__.py +++ b/plotdevice/__init__.py @@ -44,7 +44,7 @@ class Halted(Exception): pass # special exception to cleanly exit animation from .run import objc # print python exceptions to the console rather than silently failing - objc.setVerbose(True) + objc.options.verbose = True # populate the namespace (or don't) depending on the context if in_app or in_setup: diff --git a/plotdevice/__main__.py b/plotdevice/__main__.py index ed9e1eb7..510fe27c 100644 --- a/plotdevice/__main__.py +++ b/plotdevice/__main__.py @@ -143,7 +143,7 @@ def main(): # if it's a multiframe pdf, check for a telltale "{n}" to determine whether # it's a `single' doc or a sequence of numbered pdf files - opts.single = bool(ext=='pdf' and not re.search('{\d+}', opts.export) and opts.last and opts.first < opts.last) + opts.single = bool(ext=='pdf' and not re.search(r'{\d+}', opts.export) and opts.last and opts.first < opts.last) if m:= re.search(r'@(\d+)[xX]$', outname): opts.zoom = float(m.group(1)) diff --git a/plotdevice/gfx/effects.py b/plotdevice/gfx/effects.py index 76bf7214..092a7c1c 100644 --- a/plotdevice/gfx/effects.py +++ b/plotdevice/gfx/effects.py @@ -142,7 +142,7 @@ def set(self, *effs): # i *think* it's better to skip the transparency layer when only blending, # but am bracing for the discovery that it's not... - return bool(fx) and fx.keys() != ('blend',) + return bool(fx) and fx.keys() != {'blend'} # return bool(fx) # return whether any state was just changed @contextmanager @@ -320,7 +320,7 @@ def set(self): singlechannel = ciFilter(self.channel, self.bmp._ciImage) greyscale = ciFilter(self.invert, singlechannel) ci_ctx = CIContext.contextWithOptions_(None) - maskRef = ci_ctx.createCGImage_fromRect_(greyscale, ((0,0), self.bmp.size)) + maskRef = ci_ctx.createCGImage_fromRect_(greyscale, ((0,0), self.bmp._screen_size)) # turn the image into an ‘imagemask’ cg-image cg_mask = CGImageMaskCreate(CGImageGetWidth(maskRef), diff --git a/plotdevice/gfx/geometry.py b/plotdevice/gfx/geometry.py index 0ea76b8e..8e61b940 100644 --- a/plotdevice/gfx/geometry.py +++ b/plotdevice/gfx/geometry.py @@ -431,16 +431,20 @@ class MagicNumber(object): # be a well-behaved pseudo-number (based on the float in self.value) def __int__(self): return int(self.value) def __float__(self): return float(self.value) - def __cmp__(self, n): return cmp(self.value, n) + def __index__(self): return int(self.value) def __eq__(self, n): return n == self.value + def __hash__(self): return hash(self.value) def __lt__(self, n): return self.value < n def __gt__(self, n): return self.value > n + def __le__(self, n): return self.value <= n + def __ge__(self, n): return self.value >= n def __abs__(self): return abs(self.value) def __pos__(self): return +self.value def __neg__(self): return -self.value - def __invert__(self): return ~self.value def __trunc__(self): return math.trunc(self.value) + def __round__(self, ndigits=None): return round(self.value, ndigits) + def __format__(self, spec): return format(self.value, spec) def __add__(self, n): return self.value + n def __sub__(self, n): return self.value - n @@ -449,18 +453,14 @@ def __truediv__(self, n): return self.value/n def __floordiv__(self, n): return self.value // n def __mod__(self, n): return self.value % n def __pow__(self, n): return self.value ** n - def __lshift__(self, n): return self.value << n - def __rshift__(self, n): return self.value >> n def __radd__(self, n): return n + self.value def __rsub__(self, n): return n - self.value def __rmul__(self, n): return n * self.value - def __rdiv__(self, n): return n / self.value + def __rtruediv__(self, n): return n / self.value def __rfloordiv__(self, n): return n // self.value def __rmod__(self, n): return n % self.value def __rpow__(self, n): return n ** self.value - def __rlshift__(self, n): return n << self.value - def __rrshift__(self, n): return n >> self.value # the WIDTH and HEIGHT globals are Dimension objects class Dimension(MagicNumber): diff --git a/plotdevice/gfx/image.py b/plotdevice/gfx/image.py index 8817cf07..195c2245 100644 --- a/plotdevice/gfx/image.py +++ b/plotdevice/gfx/image.py @@ -15,7 +15,7 @@ from .geometry import Region, Size, Point, Transform, CENTER from .atoms import TransformMixin, EffectsMixin, FrameMixin, Grob from .colors import CMYK -from . import _ns_context +from . import _ns_context, _cg_port _ctx = None __all__ = ("Image", 'ImageWriter') @@ -174,8 +174,9 @@ def _nsBitmap(self): if isinstance(bitmap, NSBitmapImageRep): break else: - # ...otherwise convert the vector image to a bitmap - # (note that this should use _screen_transform somehow but currently doesn't) + # ...otherwise convert the vector image to a bitmap at its native size. + # it will only be used for a hasAlpha() check in effects.py, so the actual + # pixel data needn't match its _screen_size tiffdata = self._nsImage.TIFFRepresentation() image = NSImage.alloc().initWithData_(tiffdata) bitmap = image.representations()[0] @@ -183,12 +184,38 @@ def _nsBitmap(self): @property def _ciImage(self): + """A CIImage suitable for use as a clip()/mask() stencil. + + Raster sources are used as-is. Vector sources are scaled to the size + they'll actually occupy on the canvas before being rasterized. + """ + + # if the image is raster-based, use its bitmap as-is + for bitmap in self._nsImage.representations(): + if isinstance(bitmap, NSBitmapImageRep): + break + else: + # if vector-based, rasterize it at its 'actual' on-screen size + w, h = self._screen_size + + # create an offscreen bitmap context and rasterize the scaled image into it + bitmap_opts = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host + bitmap_ctx = CGBitmapContextCreate(None, w, h, 8, w*4, CGColorSpaceCreateDeviceRGB(), bitmap_opts) + NSGraphicsContext.saveGraphicsState() + NSGraphicsContext.setCurrentContext_( + NSGraphicsContext.graphicsContextWithCGContext_flipped_(bitmap_ctx, True) + ) + self._nsImage.drawInRect_fromRect_operation_fraction_(((0,0),(w,h)), NSZeroRect, NSCompositeSourceOver, 1.0) + NSGraphicsContext.restoreGraphicsState() # NB: class-level restore also resets currentContext + + bitmap = NSBitmapImageRep.alloc().initWithCGImage_(CGBitmapContextCreateImage(bitmap_ctx)) + # core-image needs to be told to compensate for our flipped coords flip = NSAffineTransform.transform() - flip.translateXBy_yBy_(0, self.size.height) + flip.translateXBy_yBy_(0, bitmap.pixelsHigh()) flip.scaleXBy_yBy_(1,-1) - ciImage = CIImage.alloc().initWithBitmapImageRep_(self._nsBitmap) + ciImage = CIImage.alloc().initWithBitmapImageRep_(bitmap) transform = CIFilter.filterWithName_("CIAffineTransform") transform.setValue_forKey_(ciImage, "inputImage") transform.setValue_forKey_(flip, "inputTransform") @@ -249,6 +276,29 @@ def _screen_transform(self): xf.scale(factor) # scale to fit size constraints (if any) return xf + @property + def _screen_size(self): + """Returns the image's real pixel dimensions. + + Raster-backed images return their native size, but vector-based images incorporate + the canvas's current CTM and the image's scaling based on its _screen_transform.""" + + # if the image is raster-based, use its native size + for bitmap in self._nsImage.representations(): + if isinstance(bitmap, NSBitmapImageRep): + return bitmap.pixelsWide(), bitmap.pixelsHigh() + + # if vector-based, use the canvas's CTM and the image's _screen_transform to + # determine its 'actual' size (rather than just using its mediabox 1:1) + ctm = CGContextGetCTM(_cg_port()) + ctm_scale = max(math.hypot(ctm.a, ctm.b), math.hypot(ctm.c, ctm.d)) + xf_a, xf_b, xf_c, xf_d, _, _ = self._screen_transform.matrix + xf_scale = max(math.hypot(xf_a, xf_b), math.hypot(xf_c, xf_d)) + scale = max(ctm_scale * xf_scale, 1.0) + src_w, src_h = self._nsImage.size() + + return max(1, round(src_w * scale)), max(1, round(src_h * scale)) + def _draw(self): """Draw an image on the given coordinates.""" @@ -390,4 +440,3 @@ def finish(self): if self.session.writer.doneWriting(): break time.sleep(0.1) - diff --git a/plotdevice/gfx/text.py b/plotdevice/gfx/text.py index 1039971c..4779300d 100644 --- a/plotdevice/gfx/text.py +++ b/plotdevice/gfx/text.py @@ -332,7 +332,8 @@ def flow(self, columns=all, layout=None): if not layout: return self._reflow(columns) # return the generator for iteration - map(layout, self._reflow(columns)) # apply the layout function to each block in sequence + for block in self._reflow(columns): + layout(block) # apply the layout function to each block in sequence def _reflow(self, count): # wipe out any previously set blocks then keep adding new ones until @@ -926,4 +927,3 @@ def draw(self): # we inherit from Grob for the methods, not drawability codependent = "TextBlocks can't be drawn directly; plot() the parent Text object instead" raise DeviceError(codependent) - diff --git a/plotdevice/gui/app.py b/plotdevice/gui/app.py index 7d312844..61479d30 100644 --- a/plotdevice/gui/app.py +++ b/plotdevice/gui/app.py @@ -31,6 +31,9 @@ def awakeFromNib(self): except OSError: pass except IOError: pass + def applicationSupportsSecureRestorableState_(self, app): + return True + def applicationDidFinishLaunching_(self, note): mm=NSApp().mainMenu() diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 586dfa9d..c720ed63 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -91,7 +91,7 @@ def encodeRestorableStateWithCoder_(self, coder): def restoreStateWithCoder_(self, coder): super(PlotDeviceDocument, self).restoreStateWithCoder_(coder) - self.stationery = coder.decodeObjectForKey_("plotdevice:stationery") + self.stationery = coder.decodeObjectOfClass_forKey_(NSString, "plotdevice:stationery") if self.stationery: self.script.setStationery_(self.stationery) @@ -259,7 +259,7 @@ def encodeRestorableStateWithCoder_(self, coder): def restoreStateWithCoder_(self, coder): # restore the splitview positions (if rects were autosaved) - split_frames = coder.decodeObjectForKey_("plotdevice:split_rects") + split_frames = coder.decodeObjectOfClasses_forKey_({NSArray, NSString}, "plotdevice:split_rects") if split_frames: it = self.editorView while it.superview(): @@ -428,8 +428,17 @@ def runScript(self): self.editorView.clearErrors() self.outputView.clear(timestamp=True) + if self.editorView: + # fetch the current source from the editor (asynchronously), then run it + self.editorView.with_source(self._runSource) + else: + # run in the (editor-less) CLI-spawned window + self._runSource(self.vm.source) + + @objc.python_method + def _runSource(self, source): # Compile the script and run its global scope - self.vm.source = self.source + self.vm.source = source success = self.invoke(None) # Display the dashboard if the var() command was called @@ -587,9 +596,14 @@ def exportInit(self, kind, fname, opts): if self.statusView: self.statusView.beginExport() - # let the Sandbox take over - self.vm.source = self.source - self.vm.export(kind, fname, opts) + # fetch the current source, then let the Sandbox take over + def begin(source): + self.vm.source = source + self.vm.export(kind, fname, opts) + if self.editorView: + self.editorView.with_source(begin) + else: + begin(self.vm.source) @objc.python_method def exportFrame(self, status, canvas=None): diff --git a/plotdevice/gui/editor.py b/plotdevice/gui/editor.py index 7d8044b3..4ffd969c 100644 --- a/plotdevice/gui/editor.py +++ b/plotdevice/gui/editor.py @@ -3,11 +3,10 @@ import re import json import objc -from io import open from objc import super from time import time from ..lib.cocoa import * -from plotdevice.gui.preferences import get_default, editor_info +from plotdevice.gui.preferences import get_default, editor_info, dev_extras from plotdevice.gui import bundle_path, set_timeout __all__ = ['EditorView', 'OutputTextView'] @@ -15,10 +14,14 @@ def args(*jsargs): return ', '.join([json.dumps(v, ensure_ascii=False) for v in jsargs]) -class DraggyWebView(WebView): - def initWithFrame_(self, rect): - return self.initWithFrame_frameName_groupName_(rect, None, None) +def menu_index_of(menu, identifier): + # NSMenu has no indexOfItemWithIdentifier_ in this AppKit/PyObjC version; search manually + for i, item in enumerate(menu.itemArray()): + if item.identifier() == identifier: + return i + return -1 +class DraggyWebView(WKWebView): def draggingEntered_(self, sender): pb = sender.draggingPasteboard() options = { NSPasteboardURLReadingFileURLsOnlyKey:True, @@ -28,7 +31,15 @@ def draggingEntered_(self, sender): rewrite = "\n".join(['"%s"'%u.path() for u in urls] + strs) + "\n" pb.declareTypes_owner_([NSStringPboardType], self) pb.setString_forType_(rewrite, NSStringPboardType) - return super(DraggyWebView, self).draggingEntered_(sender) + # don't consult super: WKWebView's drag negotiation round-trips to the web + # process and can veto the rewritten pasteboard + return NSDragOperationCopy + + def draggingUpdated_(self, sender): + return NSDragOperationCopy + + def prepareForDragOperation_(self, sender): + return True def performDragOperation_(self, sender): pb = sender.draggingPasteboard() @@ -40,8 +51,44 @@ def performDragOperation_(self, sender): return True return False - def shouldCloseWithWindow(self): - return True + def willOpenMenu_withEvent_(self, menu, event): + # omit everything from context menu except Cut/Copy/Paste (+ Inspect Element) + keep = ('WKMenuItemIdentifierCut', 'WKMenuItemIdentifierCopy', + 'WKMenuItemIdentifierPaste', 'WKMenuItemIdentifierInspectElement') + for item in list(menu.itemArray()): + if item.identifier() not in keep: + menu.removeItem_(item) + + # read _doc_target to get the tokens currently targeted by the mouse and caret + # then choose which one to offer a View Docs menu item for based on the event type + targets = getattr(self.owner, '_doc_target', None) or {} + target = targets.get('caret' if event.type() == NSEventTypeKeyDown else 'mouse') + if target: + idx = menu_index_of(menu, 'WKMenuItemIdentifierInspectElement') + idx = idx if idx >= 0 else menu.numberOfItems() + if menu.numberOfItems() > 0: + menu.insertItem_atIndex_(NSMenuItem.separatorItem(), idx) + idx += 1 + prefix = u"View Documentation: " + suffix = "()" if target['url'].endswith('()') else "" + title = prefix + target['word'] + suffix + base_font = NSFont.menuFontOfSize_(0) + mono_font = NSFont.monospacedSystemFontOfSize_weight_(base_font.pointSize(), -0.8) + attr_title = NSMutableAttributedString.alloc().initWithString_attributes_(title, {"NSFont":base_font}) + attr_title.addAttribute_value_range_("NSFont", mono_font, (len(prefix), len(target['word'] + suffix))) + doc = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(title, "viewDocumentation:", "") + doc.setAttributedTitle_(attr_title) + doc.setTarget_(self) + doc.setRepresentedObject_(target['url']) + menu.insertItem_atIndex_(doc, idx) + + inspect = menu_index_of(menu, 'WKMenuItemIdentifierInspectElement') + if inspect >= 0: + menu.insertItem_atIndex_(NSMenuItem.separatorItem(), inspect) + + def viewDocumentation_(self, sender): + self.owner.openDoc(sender.representedObject()) + class EditorView(NSView): document = IBOutlet() @@ -51,93 +98,92 @@ class EditorView(NSView): # WebKit mgmt def awakeFromNib(self): - self.webview = DraggyWebView.alloc().initWithFrame_(self.bounds()) - self.webview.setAllowsUndo_(False) - self.webview.setFrameLoadDelegate_(self) - self.webview.setUIDelegate_(self) + config = WKWebViewConfiguration.alloc().init() + dev = dev_extras() # whether to enable Inspect Element menu + config.preferences().setValue_forKey_(dev, 'developerExtrasEnabled') + ucc = config.userContentController() + ucc.addScriptMessageHandler_name_(self, 'app') + shim = WKUserScript.alloc().initWithSource_injectionTime_forMainFrameOnly_( + # forward any app.() call as a message to the 'app' script-message handler + """window.app = new Proxy({}, { + get: (_, fn) => (...args) => window.webkit.messageHandlers.app.postMessage({fn:String(fn), args:args}) + });""", WKUserScriptInjectionTimeAtDocumentStart, True) + ucc.addUserScript_(shim) + + self.webview = DraggyWebView.alloc().initWithFrame_configuration_(self.bounds(), config) + self.webview.owner = self + if dev and self.webview.respondsToSelector_('setInspectable:'): + self.webview.setInspectable_(True) + self.webview.setValue_forKey_(False, 'drawsBackground') + self.webview.setNavigationDelegate_(self) self.addSubview_(self.webview) - self.webview.setHidden_(True) - - html = bundle_path(rsrc='ui/editor.html') - ui = open(html, encoding='utf-8').read() - baseurl = NSURL.fileURLWithPath_(os.path.dirname(html)) - self.webview.mainFrame().loadHTMLString_baseURL_(ui, baseurl) - - # set a theme-derived background for the webview's clipview - docview = self.webview.mainFrame().frameView().documentView() - clipview = docview.superview() - scrollview = clipview.superview() - if clipview is not None: - bgcolor = editor_info('colors')['background'] - clipview.setDrawsBackground_(True) - clipview.setBackgroundColor_(bgcolor) - scrollview.setVerticalScrollElasticity_(1) - scrollview.setScrollerKnobStyle_(2) nc = NSNotificationCenter.defaultCenter() nc.addObserver_selector_name_object_(self, "themeChanged", "ThemeChanged", None) nc.addObserver_selector_name_object_(self, "fontChanged", "FontChanged", None) nc.addObserver_selector_name_object_(self, "bindingsChanged", "BindingsChanged", None) nc.addObserver_selector_name_object_(self, "insertDroppedFiles:", "DropOperation", self.webview) - self._wakeup = set_timeout(self, '_jostle', .05, repeat=True) - self._queue = [] self._edits = 0 - self.themeChanged() - self.fontChanged() - self.bindingsChanged() + self._last_source = '' + self._refresh() mm=NSApp().mainMenu() self._doers = mm.itemWithTitle_('Edit').submenu().itemArray()[1:3] self._undo_mgr = None def drawRect_(self, rect): - if self._wakeup: - # try to minimize the f.o.u.c. while the webview starts up - bgcolor = editor_info('colors')['background'] - bgcolor.setFill() - NSRectFillUsingOperation(rect, NSCompositeCopy) + # the webview is transparent, so draw the theme background here + bgcolor = editor_info('colors')['background'] + bgcolor.setFill() + NSRectFillUsingOperation(rect, NSCompositeCopy) super(EditorView, self).drawRect_(rect) - - def _jostle(self): - awoke = self.webview.stringByEvaluatingJavaScriptFromString_('window.editor && window.editor.ready') - if awoke: - for op in self._queue: - self.webview.stringByEvaluatingJavaScriptFromString_(op) - self._wakeup.invalidate() - self._wakeup = None - self._queue = None - self.webview.setHidden_(False) + @objc.python_method + def _refresh(self): + # (re)load the editor page, queueing up prefs & source to be applied once it + # signals readiness (see webView_didFinishNavigation_) + self._loading = True + self._queue = [] + self.webview.setHidden_(True) + self.themeChanged() + self.fontChanged() + self.bindingsChanged() + self._set_source(self._last_source) + html = bundle_path(rsrc='ui/editor.html') + ui_dir = NSURL.fileURLWithPath_isDirectory_(os.path.dirname(html), True) + self.webview.loadFileURL_allowingReadAccessToURL_(NSURL.fileURLWithPath_(html), ui_dir) + + def _ready(self): + # js editor has been loaded and is ready to receive queued prefs & source + self._loading = False + for op in self._queue: + self.webview.evaluateJavaScript_completionHandler_(op, None) + self._queue = [] + self.webview.setHidden_(False) + self.setNeedsDisplay_(True) def _cleanup(self): + # break the retain cycle through the WKUserContentController (it holds its + # message handlers strongly) + self.webview.configuration().userContentController().removeScriptMessageHandlerForName_('app') + self.webview.setNavigationDelegate_(None) nc = NSNotificationCenter.defaultCenter() nc.removeObserver_(self) self._doers = self._undo_mgr = self.jumpPanel = self.jumpLine = None - # def webView_didFinishLoadForFrame_(self, sender, frame): - def webView_didClearWindowObject_forFrame_(self, sender, win, frame): - self.webview.windowScriptObject().setValue_forKey_(self, 'app') - - def webView_contextMenuItemsForElement_defaultMenuItems_(self, sender, elt, menu): - items = [ - NSMenuItem.alloc().initWithTitle_action_keyEquivalent_("Cut", "cut:", ""), - NSMenuItem.alloc().initWithTitle_action_keyEquivalent_("Copy", "copy:", ""), - NSMenuItem.alloc().initWithTitle_action_keyEquivalent_("Paste", "paste:", ""), - NSMenuItem.separatorItem(), - ] - - # once a doc viewer exists, add a lookup-ref menu item pointing to it: - # word = self.js('editor.selected') - # _ns = ['curveto', 'TEXT', 'BezierPath', ...] - # def ref_url(proc): - # if proc in _ns: - # return proc - # if ref_url(word): - # doc = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(u"Documentation for ‘%s()’"%word, "copy:", "") - # sep = NSMenuItem.separatorItem() - # items.insert(0, sep) - # items.insert(0, doc) - return items + [it for it in menu if it.title()=='Inspect Element'] + def webView_didFinishNavigation_(self, sender, nav): + # called after DOMContentLoaded + self._ready() + + def webViewWebContentProcessDidTerminate_(self, sender): + # try to restore if the webkit subprocess crashes + self._refresh() + + def userContentController_didReceiveScriptMessage_(self, ucc, msg): + body = msg.body() + fn, fnargs = body['fn'], list(body.get('args', [])) + if fn in ('sync_edits', 'flash_menu', 'setSearchPasteboard', 'cancelRun', 'loadPrefs', 'openDoc', 'setDocTarget'): + getattr(self, fn)(*fnargs) def resizeSubviewsWithOldSize_(self, oldSize): self.resizeWebview() @@ -148,9 +194,6 @@ def resizeWebview(self): def insertDroppedFiles_(self, note): self.js('editor.insert', args(note.userInfo())) - def isSelectorExcludedFromWebScript_(self, sel): - return False - def windowDidResignKey_(self, note): if note.object() is self.jumpPanel: self.jumpPanel.orderOut_(self) @@ -182,26 +225,40 @@ def mouseExited_(self, e): @objc.python_method def _get_source(self): - return self.webview.stringByEvaluatingJavaScriptFromString_('editor.source();') + # return the copy of the source relayed by the last sync_edits call from js + return self._last_source @objc.python_method def _set_source(self, src): + self._last_source = src self.js('editor.source', args(src)) source = property(_get_source, _set_source) + @objc.python_method + def with_source(self, callback): + """Read the editor buffer asynchronously, then invoke callback(src)""" + if self._loading: # webview not ready: use the shadow copy + return callback(self._last_source) + def done(value, error): + if value is not None: + self._last_source = value + callback(self._last_source) + self.webview.evaluateJavaScript_completionHandler_('editor.source();', done) + def fontChanged(self, note=None): info = editor_info() self.js('editor.font', args(info['family'], info['px'])) def themeChanged(self, note=None): info = editor_info() - clipview = self.webview.mainFrame().frameView().documentView().superview() - clipview.setBackgroundColor_(info['colors']['background']) self.js('editor.theme', args(info['module'])) + self.setNeedsDisplay_(True) def bindingsChanged(self, note=None): self.js('editor.bindings', args(get_default('bindings'))) def focus(self): + if self.window(): + self.window().makeFirstResponder_(self.webview) self.js('editor.focus') def blur(self): @@ -222,10 +279,10 @@ def report(self, crashed, script): @objc.python_method def js(self, cmd, args=''): op = '%s(%s);'%(cmd,args) - if self._wakeup: + if self._loading: self._queue.append(op) else: - return self.webview.stringByEvaluatingJavaScriptFromString_(op) + self.webview.evaluateJavaScript_completionHandler_(op, None) # Menubar actions @@ -295,13 +352,22 @@ def undoAction_(self, sender): def loadPrefs(self): NSApp().delegate().showPreferencesPanel_(self) + @objc.python_method + def openDoc(self, url): + NSWorkspace.sharedWorkspace().openURL_(NSURL.URLWithString_(url)) + + @objc.python_method + def setDocTarget(self, target): + self._doc_target = target + def cancelRun(self): # catch command-period even when the editor is first responder mm=NSApp().mainMenu() menu = mm.itemWithTitle_("Python") menu.submenu().performActionForItemAtIndex_(3) - def edits_(self, count): + @objc.python_method + def sync_edits(self, count, source=None): # inform the undo manager of the changes um = self._undo_mgr c = int(count) @@ -316,6 +382,10 @@ def edits_(self, count): for item, can in zip(self._doers, (um.canUndo(), um.canRedo())): item.setEnabled_(can) + # cache the editor's contents for use by the synchronous .source property + if isinstance(source, str): + self._last_source = source + def syncUndoState_(self, count): pass # this would be useful if only it got called for redo as well as undo... @@ -326,9 +396,10 @@ def setSearchPasteboard(self, query): pb = NSPasteboard.pasteboardWithName_(NSFindPboard) pb.declareTypes_owner_([NSStringPboardType],None) pb.setString_forType_(query, NSStringPboardType) - self.flash_("Edit") + self.flash_menu("Edit") - def flash_(self, menuname): + @objc.python_method + def flash_menu(self, menuname): # when a menu item's key command was entered in the editor, flash the menu # bar to give a hint of where the command lives mm=NSApp().mainMenu() diff --git a/plotdevice/gui/preferences.py b/plotdevice/gui/preferences.py index acc9eea4..00bf3d3e 100644 --- a/plotdevice/gui/preferences.py +++ b/plotdevice/gui/preferences.py @@ -22,8 +22,7 @@ def set_default(label, value): def defaultDefaults(): return { - "WebKitDeveloperExtras":True, - "plotdevice:theme":"Solarized Dark", + "plotdevice:theme":"Samizdat", "plotdevice:bindings":"mac", "plotdevice:font-name":"Menlo", "plotdevice:font-size":11, @@ -32,6 +31,23 @@ def defaultDefaults(): NSUserDefaults.standardUserDefaults().registerDefaults_(defaultDefaults()) THEMES = None # to be filled in as needed +def dev_extras(): + """Should the editor's web inspector be enabled? + + Defaults to on for dev builds (running from the source checkout, or an app + built by `make.py app`/`py2app`) and off for official releases (which have a + real version stamped over info.plist's "in flux" placeholder by `make.py dist`). + Either behavior can be forced with e.g.: + defaults write io.plotdevice.PlotDevice WebKitDeveloperExtras -bool YES + """ + override = get_default('WebKitDeveloperExtras') + if override is not None: + return bool(override) + bundle = NSBundle.mainBundle() + if bundle.bundleIdentifier() != 'io.plotdevice.PlotDevice': + return True # running from the source checkout rather than PlotDevice.app + return bundle.objectForInfoDictionaryKey_('CFBundleVersion') == 'in flux' + def _hex_to_nscolor(hexclr): hexclr = hexclr.lstrip('#') r, g, b, a = [int(n, 16)/255.0 for n in (hexclr[0:2], hexclr[2:4], hexclr[4:6], hexclr[6:8])] diff --git a/plotdevice/gui/views.py b/plotdevice/gui/views.py index 92e3e00c..eb932872 100644 --- a/plotdevice/gui/views.py +++ b/plotdevice/gui/views.py @@ -147,7 +147,8 @@ def _get_zoom(self): @objc.python_method def _set_zoom(self, zoom): self._zoom = zoom - self.setCanvas(self.canvas) + if self.canvas is not None: + self.setCanvas(self.canvas) zoom = property(_get_zoom, _set_zoom) @objc.python_method diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index bf74f74d..53e39c9b 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -4,7 +4,7 @@ CGColorSpaceCreateDeviceCMYK, CGColorSpaceCreateDeviceRGB, CGContextAddPath, CGContextAddRect, \ CGContextBeginPath, CGContextBeginTransparencyLayer, CGContextBeginTransparencyLayerWithRect, \ CGContextClearRect, CGContextClearRect, CGContextClip, CGContextClipToMask, CGContextDrawPath, \ - CGContextEndTransparencyLayer, CGContextEOClip, CGContextRestoreGState, CGContextSaveGState, \ + CGContextEndTransparencyLayer, CGContextEOClip, CGContextGetCTM, CGContextRestoreGState, CGContextSaveGState, \ CGContextSetAlpha, CGContextSetBlendMode, CGContextSetFillColorWithColor, CGContextSetLineCap, \ CGContextSetLineDash, CGContextSetLineJoin, CGContextSetLineWidth, \ CGContextSetStrokeColorWithColor, CGDataConsumerCreateWithCFData, CGImageDestinationAddImage, \ @@ -29,9 +29,9 @@ NSBackingStoreBuffered, NSBeep, NSBezierPath, NSBitmapImageRep, NSBorderlessWindowMask, NSButton, \ NSCenterTextAlignment, NSChangeAutosaved, NSChangeCleared, NSChangeDone, NSChangeReadOtherContents, \ NSChangeRedone, NSChangeUndone, NSClipView, NSClosePathBezierPathElement, NSColor, NSColorSpace, \ - NSCompositeCopy, NSCompositeSourceOver, NSContentsCellMask, NSCriticalAlertStyle, NSCursor, \ - NSCurveToBezierPathElement, NSDeviceCMYKColorSpace, NSDeviceRGBColorSpace, NSDocument, \ - NSDocumentController, NSFindPboard, NSFixedPitchFontMask, NSFocusRingTypeExterior, NSFont, \ + NSCommandKeyMask, NSCompositeCopy, NSCompositeSourceOver, NSContentsCellMask, NSCriticalAlertStyle, NSCursor, \ + NSCurveToBezierPathElement, NSDeviceCMYKColorSpace, NSDeviceIndependentModifierFlagsMask, NSDeviceRGBColorSpace, NSDocument, \ + NSDocumentController, NSDragOperationCopy, NSEventTypeKeyDown, NSFindPboard, NSFixedPitchFontMask, NSFocusRingTypeExterior, NSFont, \ NSFontDescriptor, NSFontManager, NSForegroundColorAttributeName, NSGIFFileType, NSGradient, \ NSGraphicsContext, NSGraphiteControlTint, NSImage, NSImageCacheNever, NSImageCompressionFactor, \ NSImageInterpolationHigh, NSItalicFontMask, NSJPEGFileType, NSJustifiedTextAlignment, \ @@ -50,13 +50,14 @@ NSWindowBackingLocationVideoMemory, NSWindowController, NSWindowTabbingModeAutomatic, \ NSWindowTabbingModePreferred, NSWorkspace from Foundation import CIAffineTransform, CIColorMatrix, CIContext, CIFilter, CIImage, CIVector, Foundation, NO, \ - NSAffineTransform, NSAffineTransformStruct, NSAttributedString, NSAutoreleasePool, NSBundle, \ - NSData, NSDate, NSDateFormatter, NSFileCoordinator, NSFileHandle, \ + NSAffineTransform, NSAffineTransformStruct, NSArray, NSAttributedString, NSAutoreleasePool, \ + NSBundle, NSData, NSDate, NSDateFormatter, NSFileCoordinator, NSFileHandle, \ NSFileHandleDataAvailableNotification, NSHeight, NSInsetRect, NSIntersectionRange, \ NSIntersectionRect, NSLocale, NSLog, NSMacOSRomanStringEncoding, NSMakeRange, NSMidX, NSMidY, \ NSMutableAttributedString, NSMutableData, NSNotificationCenter, NSObject, NSOffsetRect, \ NSOperationQueue, NSPoint, NSRect, NSRectFromString, NSSelectorFromString, NSSize, NSString, \ - NSStringFromRect, NSTimer, NSTimeZone, NSURL, NSUserDefaults, NSUTF8StringEncoding, NSWidth -from LaunchServices import kUTTypePNG, kUTTypeJPEG, kUTTypeGIF, kUTTypeTIFF -from WebKit import WebView + NSStringFromRect, NSTimer, NSTimeZone, NSURL, NSUserDefaults, NSUTF8StringEncoding, NSWidth, \ + NSZeroRect +from CoreServices import kUTTypePNG, kUTTypeJPEG, kUTTypeGIF, kUTTypeTIFF +from WebKit import WKWebView, WKWebViewConfiguration, WKUserScript, WKUserScriptInjectionTimeAtDocumentStart from objc import IBOutlet, IBAction diff --git a/plotdevice/run/__init__.py b/plotdevice/run/__init__.py index 5dc8ec27..8c903261 100644 --- a/plotdevice/run/__init__.py +++ b/plotdevice/run/__init__.py @@ -9,13 +9,13 @@ except ImportError: # detect whether we're being run from the repository and set up a local env if so repo = abspath(join(dirname(__file__), '../..')) - setup_py = '%s/setup.py' % repo - if exists(setup_py): + make_py = '%s/make.py' % repo + if exists(make_py): from platform import python_version from sysconfig import get_config_var local_libs = '%s/deps/local/%s/lib/python%s/site-packages' % (repo, python_version(), get_config_var('py_version_short')) if not exists(local_libs): - call([sys.executable, setup_py, 'dev']) + call([sys.executable, make_py, 'dev']) site.addsitedir(local_libs) from Foundation import * import objc diff --git a/plotdevice/run/console.py b/plotdevice/run/console.py index 294d7904..408da915 100755 --- a/plotdevice/run/console.py +++ b/plotdevice/run/console.py @@ -17,6 +17,7 @@ import json import select import signal +from objc import super from math import floor, ceil from os.path import dirname, abspath, exists, join from io import open @@ -100,9 +101,12 @@ def openLink_(self, sender): link += '/doc' NSWorkspace.sharedWorkspace().openURL_(NSURL.URLWithString_(link)) - def done(self, quit=False): - if self.opts['mode']=='headless' or quit: - NSApp().terminate_(None) + def done(self, ok=True): + if self.opts['mode']=='headless': + if not ok: + os._exit(1) + else: + NSApp().terminate_(None) class ScriptWatcher(NSObject): def initWithScript_(self, script): @@ -122,7 +126,7 @@ class ConsoleScript(ScriptController): def init(self): self._init_state() self._buf = '' # cache the export progress message between stdout writes - return super(ScriptController, self).init() + return super(ConsoleScript, self).init() def setScript_options_(self, path, opts): self.vm.path = path @@ -171,7 +175,7 @@ def invokeHeadless(self, method): result = self.vm.run(method) self.echo(result.output) if not result.ok: - NSApp().terminate_(None) + NSApp().delegate().done(ok=False) def runHeadless(self): self.vm.source = self.unicode_src @@ -202,7 +206,7 @@ def echo(self, output): def exportFrame(self, status, canvas=None): super(ConsoleScript, self).exportFrame(status, canvas) if not status.ok: - NSApp().delegate().done() + NSApp().delegate().done(ok=False) @objc.python_method def exportStatus(self, event): diff --git a/plotdevice/util/__init__.py b/plotdevice/util/__init__.py index 14351df2..dee5f490 100644 --- a/plotdevice/util/__init__.py +++ b/plotdevice/util/__init__.py @@ -5,8 +5,9 @@ import json import csv from contextlib import contextmanager -from functools import cmp_to_key +from functools import cmp_to_key, reduce from collections import OrderedDict, defaultdict +from collections.abc import Mapping from os.path import abspath, dirname, exists, join, splitext from random import choice, shuffle @@ -106,18 +107,15 @@ def _key(seq, names): # treat objects without a given key and objects with the key set to None equivalently MISSING = None - # look for dict items by default - getter = lambda obj: tuple(obj.get(n, MISSING) for n in names) + def getter(obj): + # use item lookup if obj is dict-like + if isinstance(obj, Mapping): + return tuple(obj.get(n, MISSING) for n in names) - # walk through the objects and see if any of them lacks the dict fields but has attrs - for obj in seq: - try: - if any(n in obj for n in names): - break # dict fields exist so use the itemgetter - except TypeError: - # for non-dict objects like namedtuples and dataclasses use an attrgetter - if any(hasattr(obj, n) for n in names): - getter = lambda obj: tuple(getattr(obj, n, MISSING) for n in names) + # otherwise check attrs + return tuple( + reduce(lambda o, part: getattr(o, part, MISSING), n.split('.'), obj) for n in names + ) def compare(a, b): default = 0 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..6b97df29 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,64 @@ +[build-system] +requires = ["setuptools>=64", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "plotdevice" +dynamic = ["version"] +description = "Create two-dimensional graphics and animations with code" +readme = { file = "README.md", content-type = "text/markdown" } +requires-python = ">=3.9" +license = "MIT" +authors = [{ name = "Christian Swinehart", email = "drafting@samizdat.co" }] +urls = { Homepage = "https://plotdevice.io/" } +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Environment :: MacOS X :: Cocoa", + "Intended Audience :: Developers", + "Intended Audience :: Education", + "Intended Audience :: End Users/Desktop", + "Operating System :: MacOS :: MacOS X", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Topic :: Artistic Software", + "Topic :: Multimedia :: Graphics", + "Topic :: Multimedia :: Graphics :: Editors :: Vector-Based", + "Topic :: Multimedia :: Video", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Topic :: Software Development :: User Interfaces", + "Topic :: Text Editors :: Integrated Development Environments (IDE)", +] +dependencies = [ + "requests", + "cachecontrol[filecache]", + "pyobjc-core==11.1", + "pyobjc-framework-Quartz==11.1", + "pyobjc-framework-CoreServices==11.1", + "pyobjc-framework-WebKit==11.1", +] + +[tool.setuptools] +script-files = ["app/plotdevice"] +zip-safe = false + +[tool.setuptools.dynamic] +version = { attr = "plotdevice.__version__" } + +[tool.setuptools.packages.find] +include = ["plotdevice*"] +exclude = ["tests*"] + +[tool.setuptools.package-data] +plotdevice = ["rsrc/*"] + +[tool.cibuildwheel] +build = "cp39-* cp310-* cp311-* cp312-* cp313-* cp314-*" + +[tool.cibuildwheel.macos] +archs = ["universal2"] +environment = { MACOSX_DEPLOYMENT_TARGET = "11.0" } diff --git a/setup.py b/setup.py index 61b181a6..3f7f36f1 100644 --- a/setup.py +++ b/setup.py @@ -1,273 +1,53 @@ -# encoding:utf-8 +# encoding: utf-8 +"""setup.py for building the mixed C/Objective-C/Swift `_plotdevice` extension -# To install the module & command line tool in site-packages, use: -# python3 setup.py install -# -# In addition to the `install' command, there are a few other variants: -# app: builds ./dist/PlotDevice.app using Xcode -# py2app: builds the application using py2app -# clean: discard anything already built and start fresh -# test: run unit tests and generate the file "details.html" with the test output -# dev: puts the module in a usable state within the source distribution. after running, -# you should be able to run the `python3 -m plotdevice` command line interface. -# If you're having trouble building the app, this can be a good way to sanity -# check your setup -# -# We require some dependencies: -# - Mac OS X 11+ and Xcode command line tools (type `xcode-select --install` in the terminal) -# - the python3.8 provided by Xcode or a homebrew- or pyenv-built python3 interpreter -# - Sparkle.framework (auto-downloaded only for `dist` builds) -# -import os, sys, json, re, platform +This file exists only for the things `pyproject.toml` can't handle, in particular +the prebuild and compilation steps necessary for setuptools to package the module. +You needn't run this script directly, just use one of the ordinary installation +approaches like `pip install .` or `python -m build`. +""" from glob import glob -from shutil import rmtree -from setuptools import setup, find_packages, Command +from subprocess import call +from os.path import dirname, abspath, exists, join, getmtime + +from setuptools import setup from setuptools.extension import Extension -from setuptools.command.build_py import build_py from setuptools.command.build_ext import build_ext -from pkg_resources import DistributionNotFound -from os.path import join, exists, dirname, basename, abspath, getmtime -from subprocess import call, getoutput -import plotdevice - - -## Metadata ## - -# PyPI fields -APP_NAME = 'PlotDevice' -MODULE = APP_NAME.lower() -VERSION = plotdevice.__version__ -AUTHOR = plotdevice.__author__ -AUTHOR_EMAIL = plotdevice.__email__ -LICENSE = plotdevice.__license__ -URL = "https://plotdevice.io/" -CLASSIFIERS = [ - "Development Status :: 5 - Production/Stable", - "Environment :: MacOS X :: Cocoa", - "Intended Audience :: Developers", - "Intended Audience :: Education", - "Intended Audience :: End Users/Desktop", - "Operating System :: MacOS :: MacOS X", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Topic :: Artistic Software", - "Topic :: Multimedia :: Graphics", - "Topic :: Multimedia :: Graphics :: Editors :: Vector-Based", - "Topic :: Multimedia :: Video", - "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Topic :: Software Development :: User Interfaces", - "Topic :: Text Editors :: Integrated Development Environments (IDE)", -] -DESCRIPTION = "Create two-dimensional graphics and animations with code" -LONG_DESCRIPTION = """PlotDevice is a Macintosh application used for computational graphic design. It -provides an interactive Python environment where you can create two-dimensional -graphics and output them in a variety of vector, bitmap, and animation formats. -It is meant both as a sketch environment for exploring generative design and as -a general purpose graphics library for use in external Python programs. - -PlotDevice scripts can create images from simple geometric primitives, text, and -external vector or bitmap images. Drawing commands provide a thin abstraction -over macOS's Quartz graphics engine, providing high-quality rendering -of 2D imagery and powerful compositing operations. - -PlotDevice is a fork of NodeBox 1.9.7rc1 with support for modern versions of -Python and Mac OS. - -The new version features: - -* Runs natively on Intel and Apple Silicon and supports retina displays -* Python 3 only (including a bundled 3.10 installation in the app) -* images can now be exported in HEIC format and videos support H.265 (HEVC) -* SVG files can now be drawn to the canvas using the `image()` command (thanks to the magical [SwiftDraw](https://github.com/swhitty/SwiftDraw) library) -* image exports have a configurable `zoom` to create 2x/3x/etc ‘retina’ images -* revamped `var()` command for creating GUIs to modify values via sliders, buttons, toggles, etc. -* updated text editor with multiple tabs, new themes, and additional key-binding modes emulating Sublime Text and VS Code -* the module's command line interface is now accessible through `python3 -m plotdevice` -* the command line tool has a new `--install` option to download [PyPI](https://pypi.org) packages for use within the app -* document autosaving is now user-configurable -* Bugfixes and misc. improvements detailed in the [changelog](https://github.com/plotdevice/plotdevice/blob/main/CHANGES.md) - -Version 0.9.5 added: - -* Python 3 compatible -* Can now be built with system Python or Homebrew versions of the interpreter -* Much faster import times on Yosemite thanks to a bundled copy of PyObjC 3.0.4 -* HTTP is now handled by the ``requests`` module and caches responses locally -* Totally revamped typography system with support for OpenType features, - pagination, multi-column text, character geometry, and more -* Added 130+ unit tests (run them with ``python setup.py test``) plus bugfixes for - for ``measure()``, ``textpath()``, ``Bezier.fit()``, ``read()``, and the Preferences dialog - -Version 0.9.4 added: - -* Enhanced command line interface. -* New text editor with tab completion, syntax color themes, and emacs/vi bindings. -* Video export in H.264 or animated gif formats (with GCD-based i/o). -* Added support for external editors by reloading the source when changed. -* Build system now works with Xcode or ``py2app`` for the application and ``pip`` for the module. -* Virtualenv support (for both installation of the module and running scripts with dependencies). -* External scripts can use ``from plotdevice import *`` to create a drawing environment. -* Simplified bezier & affine transform api using the python ‘with’ statement -* New compositing operations for blend mode, global opacity, and dropshadows -* Simplified typography commands with stylesheet-based character styles -* Now uses the system's Python 2.7 interpreter. - -Requirements: - -* Mac OS X 11+ -* Python 3.6+ -""" - -## Basic Utils ## - -# the sparkle updater framework will be fetched as needed -SPARKLE_VERSION = '2.1.0' -SPARKLE_URL = 'https://github.com/sparkle-project/Sparkle/releases/download/%(v)s/Sparkle-%(v)s.tar.xz' % {'v':SPARKLE_VERSION} - -# helpers for dealing with plists & git (spiritual cousins if ever there were) -import plistlib -def info_plist(pth='app/info.plist'): - info = plistlib.load(open(pth, 'rb')) - # overwrite the xcode placeholder vars - info['CFBundleExecutable'] = info['CFBundleName'] = APP_NAME - return info - -def update_plist(pth, **modifications): - info = plistlib.load(open(pth, 'rb')) - for key, val in modifications.items(): - if val is None: - info.pop(key) - else: - info[key] = val - with open(pth, 'wb') as f: - plistlib.dump(info, f) - -def update_shebang(pth, interpreter): - body = open(pth).readlines()[1:] - body.insert(0,'#!%s\n'%interpreter) - with open(pth, 'w') as f: - f.writelines(body) - -def last_commit(): - commit_count, _, _ = gosub('git log --oneline | wc -l') - return 'r%s' % commit_count.decode('utf-8').strip() - -def gosub(cmd, on_err=True): - """Run a shell command and return the output""" - from subprocess import Popen, PIPE - shell = isinstance(cmd, str) - proc = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=shell) - out, err = proc.communicate() - ret = proc.returncode - if on_err: - msg = '%s:\n' % on_err if isinstance(on_err, str) else '' - if ret != 0: - print(msg + out.decode('utf8') + err.decode('utf8')) - return out, err, ret +from setuptools.command.sdist import sdist -def timestamp(): - from datetime import datetime - return datetime.now().strftime("%a, %d %b %Y %H:%M:%S") +ROOT = dirname(abspath(__file__)) def stale(dst, src): - if exists(src): - if not exists(dst) or getmtime(dst) < getmtime(src): - yield dst, src + return exists(src) and (not exists(dst) or getmtime(dst) < getmtime(src)) -## Build Commands ## - -class CleanCommand(Command): - description = "wipe out generated files and build artifacts" - user_options = [ - ('dist', None, 'also remove Python.framework and local dependencies'), - ] - - def initialize_options(self): - self.dist = None - - def finalize_options(self): - pass +class BuildExtCommand(build_ext): + """Build SwiftDraw.o before linking _plotdevice, then populate + plotdevice/rsrc/ with the runtime resources plotdevice.util.rsrc_path() + depends on (icns, colors.json, an ibtool-compiled nib).""" def run(self): - paths = [ - 'build', - 'dist', - '*.egg', - '*.egg-info', - '.eggs', - 'MANIFEST.in', - 'PKG', - 'tests/_out', - 'tests/_diff', - 'details.html', - '_plotdevice.*.so', - '**/*.pyc', - '**/__pycache__', - '**/.DS_Store', - ] - - # Add framework paths if --dist flag is used - if self.dist: - paths.extend([ - 'deps/local', - 'deps/frameworks/Python.framework', - 'deps/frameworks/relocatable-python', - ]) - - for path_pattern in paths: - for path in glob(path_pattern, recursive=True): - if exists(path): - print('removing %s'%path) - if os.path.isdir(path): - rmtree(path) - else: - os.unlink(path) - - # Run make clean in svg extensions dir - if exists('deps/extensions/svg'): - os.system('cd deps/extensions/svg && make clean') - -class DistCleanCommand(CleanCommand): - """Alias for `clean --dist` for backward compatibility""" - description = "delete Python.framework, local pypi dependencies, and all generated files" - - def initialize_options(self): - super().initialize_options() - self.dist = True # always do a deep clean + call('cd deps/extensions/svg && make', shell=True, cwd=ROOT) + build_ext.run(self) -class LocalDevCommand(Command): - description = "set up environment to allow for running `python -m plotdevice` within the repo" - user_options = [] - def initialize_options(self): - pass - def finalize_options(self): - pass - def run(self): - # install pyobjc, requests and the other pypi dependencies in deps/local - import platform - venv_dir = join('deps/local', platform.python_version()) - if not exists(venv_dir): - import venv - venv.create(venv_dir, symlinks=True, with_pip=True) - PIP = '%s/bin/pip3' % venv_dir - call([PIP, 'install', '-q', '--upgrade', 'pip', 'wheel', 'py2app', 'twine']) - call([PIP, '--isolated', 'install', *config['install_requires']]) + # include some ui resources for running a script from the command line + rsrc_dir = join(ROOT, self.build_lib if not self.inplace else '.', 'plotdevice', 'rsrc') + self.mkpath(rsrc_dir) + self.copy_file(join(ROOT, 'app/Resources/PlotDeviceFile.icns'), rsrc_dir) + self.copy_file(join(ROOT, 'app/Resources/colors.json'), rsrc_dir) - # place the compiled c-extensions in the main repo dir - build_ext = self.distribution.get_command_obj('build_ext') - build_ext.inplace = 1 - self.run_command('build_ext') + # recompile the command-line UI nib if necessary + xib = join(ROOT, 'app/Resources/en.lproj/PlotDeviceScript.xib') + nib = join(ROOT, 'app/Resources/viewer.nib') + if stale(nib, xib): + self.spawn(['/usr/bin/ibtool', '--compile', nib, xib]) + self.copy_file(nib, rsrc_dir) - print("\nA local development environment has been set up in %s" % venv_dir) +class SdistPrepCommand(sdist): + """Make sure an sdist can be installed without needing Xcode/ibtool, and + bundles the SwiftDraw sources for offline/reproducible builds.""" -from setuptools.command.sdist import sdist -class BuildDistCommand(sdist): def finalize_options(self): - with open('MANIFEST.in','w') as f: + with open(join(ROOT, 'MANIFEST.in'), 'w') as f: f.write(""" graft app/Resources prune app/Resources/en.lproj @@ -285,289 +65,28 @@ def finalize_options(self): def run(self): # include a compiled nib in the sdist so ibtool (and thus Xcode.app) isn't required to install - for dst, src in stale('app/Resources/viewer.nib', "app/Resources/en.lproj/PlotDeviceScript.xib"): - self.spawn(['/usr/bin/ibtool','--compile', dst, src]) + xib = join(ROOT, 'app/Resources/en.lproj/PlotDeviceScript.xib') + nib = join(ROOT, 'app/Resources/viewer.nib') + if stale(nib, xib): + self.spawn(['/usr/bin/ibtool', '--compile', nib, xib]) # make sure we have the sources for SwiftDraw - call('cd deps/extensions/svg && make SwiftDraw', shell=True) + call('cd deps/extensions/svg && make SwiftDraw', shell=True, cwd=ROOT) - # build the sdist based on our MANIFEST additions + # build the sdist based on our MANIFEST.in additions sdist.run(self) - # clean up - rmtree('plotdevice.egg-info') - os.unlink('MANIFEST.in') - -class BuildCommand(build_py): - def run(self): - - # let the real build_py routine do its thing - build_py.run(self) - - # include some ui resources for running a script from the command line - rsrc_dir = '%s/plotdevice/rsrc'%self.build_lib - self.mkpath(rsrc_dir) - self.copy_file("app/Resources/PlotDeviceFile.icns", rsrc_dir) - self.copy_file("app/Resources/colors.json", rsrc_dir) - - # recompile the command-line UI nib if necessary - xib = 'app/Resources/en.lproj/PlotDeviceScript.xib' - nib = 'app/Resources/viewer.nib' - for dst, src in stale(nib, xib): - self.spawn(['/usr/bin/ibtool','--compile', nib, xib]) - self.copy_file(nib, rsrc_dir) - -class BuildExtCommand(build_ext): - def run(self): - call('cd deps/extensions/svg && make', shell=True) - build_ext.run(self) - -class TestCommand(Command): - description = "Run unit tests" - user_options = [] - def initialize_options(self): - pass - def finalize_options(self): - pass - def run(self): - from subprocess import call - test_cmd = [sys.executable, '-m', 'tests'] + sys.argv[2:] - print(" ".join(test_cmd)) - call(test_cmd) - -class BuildAppCommand(Command): - description = "Build PlotDevice.app with xcode" - user_options = [ - ('no-cache', None, 'do not use pip cache when installing dependencies'), - ] - - def initialize_options(self): - self.no_cache = None - - def finalize_options(self): - # make sure the embedded framework exists (and has updated app/python.xcconfig) - print("Set up Python.framework for app build") - env = os.environ.copy() - if self.no_cache: - env['PIP_NO_CACHE_DIR'] = '1' - call('cd deps/frameworks && make', shell=True, env=env) - - def run(self): - self.spawn(['xcodebuild', '-configuration', 'Release']) - rmtree('dist/PlotDevice.app.dSYM') - print("done building PlotDevice.app in ./dist") - -try: - import py2app - from py2app.build_app import py2app as build_py2app - class BuildPy2AppCommand(build_py2app): - description = """Build PlotDevice.app with py2app (then undo some of its questionable layout defaults)""" - def initialize_options(self): - build_py2app.initialize_options(self) - def finalize_options(self): - self.verbose=0 - build_py2app.finalize_options(self) - def run(self): - build_py2app.run(self) - if self.dry_run: - return - - # undo py2app's weird treatment of the config.version value - info_pth = 'dist/PlotDevice.app/Contents/Info.plist' - update_plist(info_pth, CFBundleShortVersionString=None) - - # place the command line tool in SharedSupport - BIN = join(dirname(self.resdir), 'SharedSupport') - self.mkpath(BIN) - self.copy_file("app/plotdevice", BIN) - - # success! - print("done building PlotDevice.app in ./dist") - -except (DistributionNotFound, ImportError): - # virtualenv doesn't include pyobjc, py2app, etc. in the sys.path for some reason. - # not being able to access py2app isn't a big deal for 'build', 'app', 'dist', or 'clean' - # so only abort the build if the 'py2app' command was given - if 'py2app' in sys.argv: - print("""setup.py: py2app build failed - Couldn't find the py2app module. To set up a virtualenv that contains all the necessary - dependencies in the deps/local directory, call the `dev` command first: - > python3 setup.py dev - > ./deps/local//bin/python3 setup.py py2app""") - sys.exit(1) - - -## Packaging Commands (really only useful to the maintainer) ## - -class DistCommand(Command): - description = "Create distributable zip of the app and release metadata" - user_options = [] - def initialize_options(self): - pass - def finalize_options(self): - pass - def run(self): - APP = 'dist/PlotDevice.app' - ZIP = 'dist/PlotDevice_app-%s.zip' % VERSION - - # run the Xcode build - self.run_command('app') - - # set the bundle version to the current commit number and prime the updater - info_pth = 'dist/PlotDevice.app/Contents/Info.plist' - update_plist(info_pth, - CFBundleVersion = last_commit(), - CFBundleShortVersionString = VERSION, - SUFeedURL = 'https://plotdevice.io/app.xml', - SUEnableSystemProfiling = 'YES' - ) - - # Download Sparkle (if necessary) and copy it into the bundle - ORIG = 'deps/frameworks/Sparkle.framework' - SPARKLE = join(APP,'Contents/Frameworks/Sparkle.framework') - if not exists(ORIG): - self.mkpath(dirname(ORIG)) - print("Downloading Sparkle.framework") - os.system('curl -L -# %s | xz -dc | tar xf - -C %s %s'%(SPARKLE_URL, dirname(ORIG), basename(ORIG))) - self.mkpath(dirname(SPARKLE)) - self.spawn(['ditto', ORIG, SPARKLE]) - - # code-sign the app and embedded frameworks, then verify - def codesign(root, name=None, exec=False, entitlement=False): - test = [] - if name: - test += ['-name', name] - if exec: - test += ['-perm', '-u=x'] - - codesign = ['codesign', '--deep', '--strict', '--timestamp', '-o', 'runtime', '-f', '-v', '-s', 'Developer ID Application'] - if entitlement: - codesign += ['--entitlements', 'app/PlotDevice.entitlements'] - - if test: - self.spawn(['find', root, '-type', 'f', *test, '-exec', *codesign, "{}", ";"]) - else: - self.spawn([*codesign, root]) - - PYTHON = join(APP,'Contents/Frameworks/Python.framework') - codesign('%s/Versions/Current/lib'%PYTHON, name="*.dylib") - codesign('%s/Versions/Current/lib'%PYTHON, name="*.o") - codesign('%s/Versions/Current/lib'%PYTHON, name="*.a") - codesign('%s/Versions/Current/lib'%PYTHON, exec=True) - codesign('%s/Versions/Current/bin'%PYTHON, exec=True) - codesign('%s/Versions/Current/bin'%PYTHON, name="python3.*", entitlement=True) - codesign('%s/Versions/Current/Resources/Python.app'%PYTHON, entitlement=True) - codesign(PYTHON) - - codesign('%s/Versions/Current/Updater.app'%SPARKLE) - codesign(SPARKLE) - - codesign(APP, entitlement=True) - self.spawn(['codesign', '--verify', '--deep', '-vv', APP]) - - # create versioned zipfile of the app & notarize it - self.spawn(['ditto', '-ck', '--keepParent', APP, ZIP]) - self.spawn(['xcrun', 'notarytool', 'submit', ZIP, '--keychain-profile', 'AC_NOTARY', '--wait']) - - # staple notarization ticket and regenerate zip - self.spawn(['xcrun', 'stapler', 'staple', APP]) - self.spawn(['ditto','-ck', '--keepParent', APP, ZIP]) - - # write out the release metadata for plotdevice-site to consume/merge - with open('dist/release.json','w') as f: - release = dict(zipfile=basename(ZIP), bytes=os.path.getsize(ZIP), - version=VERSION, revision=last_commit(), - timestamp=timestamp()) - json.dump(release, f) - - print("\nBuilt PlotDevice.app, %s, and release.json in ./dist" % basename(ZIP)) - -# common config between module and app builds -config = dict( - name = MODULE, - version = VERSION, - description = DESCRIPTION, - long_description = LONG_DESCRIPTION, - long_description_content_type = 'text/markdown', - author = AUTHOR, - author_email = AUTHOR_EMAIL, - url = URL, - license = LICENSE, - classifiers = CLASSIFIERS, - packages = find_packages(exclude=['tests']), - ext_modules = [Extension( +setup( + ext_modules=[Extension( '_plotdevice', - sources = ['deps/extensions/module.m', *glob('deps/extensions/*/*.[cm]')], + sources=['deps/extensions/module.m', *glob('deps/extensions/*/*.[cm]')], extra_objects=['deps/extensions/svg/SwiftDraw.o'], extra_link_args=sum((['-framework', fmwk] for fmwk in ['AppKit', 'Foundation', 'Quartz', 'Security', 'AVFoundation', 'CoreMedia', 'CoreVideo', 'CoreText'] - ), []) + ), []), )], - install_requires = [ - 'requests', - 'cachecontrol[filecache]', - 'pyobjc-core==11.0', - 'pyobjc-framework-Quartz==11.0', - 'pyobjc-framework-LaunchServices==11.0', - 'pyobjc-framework-WebKit==11.0', - ], - scripts = ["app/plotdevice"], - zip_safe=False, cmdclass={ - 'app': BuildAppCommand, - 'build_py': BuildCommand, 'build_ext': BuildExtCommand, - 'clean': CleanCommand, - 'distclean': DistCleanCommand, - 'dist': DistCommand, - 'sdist': BuildDistCommand, - 'test': TestCommand, - 'dev': LocalDevCommand, + 'sdist': SdistPrepCommand, }, ) - -## Run Build ## - -if __name__=='__main__': - # make sure we're at the project root regardless of the cwd - # (this means the various commands don't have to play path games) - os.chdir(dirname(abspath(__file__))) - - # clear away any finder droppings that may have accumulated - call('find . -name .DS_Store -delete', shell=True) - - # py2app-specific config - if 'py2app' in sys.argv: - config.update(dict( - app = [{ - 'script': "app/plotdevice-app.py", - "plist":info_plist(), - }], - data_files = [ - "app/Resources/ui", - "app/Resources/colors.json", - "app/Resources/en.lproj", - "app/Resources/PlotDevice.icns", - "app/Resources/PlotDeviceFile.icns", - "examples", - ], - options = { - "py2app": { - "iconfile": "app/Resources/PlotDevice.icns", - "semi_standalone":True, - "site_packages":True, - "strip":False, - } - }, - cmdclass={ - 'build_py': BuildCommand, - 'py2app': BuildPy2AppCommand, - } - )) - - # include a backport of dataclasses on 3.6 - if sys.version_info < (3,7): - config['install_requires'].append('dataclasses') - - # begin the build process - setup(**config) diff --git a/tests/__init__.py b/tests/__init__.py index a28c5fd6..b310a78b 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -70,10 +70,10 @@ def render(self, save_output=True): pass def suites(): - from . import typography, primitives, drawing, compositing, geometry, module + from . import typography, primitives, drawing, compositing, geometry, module, canvas suite = unittest.TestSuite() - for mod in (typography, primitives, drawing, compositing, geometry, module): + for mod in (typography, primitives, drawing, compositing, geometry, module, canvas): suite.addTest(mod.suite()) return suite diff --git a/tests/__main__.py b/tests/__main__.py index f3035676..0f2d0da5 100644 --- a/tests/__main__.py +++ b/tests/__main__.py @@ -14,5 +14,6 @@ tests = suites() verb = 2 if '-v' in sys.argv else 1 -unittest.TextTestRunner(verbosity=verb).run(tests) -report() \ No newline at end of file +result = unittest.TextTestRunner(verbosity=verb).run(tests) +report() +sys.exit(0 if result.wasSuccessful() else 1) diff --git a/tests/_in/tiny-triangle.pdf b/tests/_in/tiny-triangle.pdf new file mode 100644 index 00000000..a90db929 Binary files /dev/null and b/tests/_in/tiny-triangle.pdf differ diff --git a/tests/_ref/compositing/clip-vector-image-rotate.png b/tests/_ref/compositing/clip-vector-image-rotate.png new file mode 100644 index 00000000..a47dab8b Binary files /dev/null and b/tests/_ref/compositing/clip-vector-image-rotate.png differ diff --git a/tests/_ref/compositing/clip-vector-image-scale.png b/tests/_ref/compositing/clip-vector-image-scale.png new file mode 100644 index 00000000..29846974 Binary files /dev/null and b/tests/_ref/compositing/clip-vector-image-scale.png differ diff --git a/tests/_ref/compositing/clip-vector-image-transform.png b/tests/_ref/compositing/clip-vector-image-transform.png new file mode 100644 index 00000000..248cd06f Binary files /dev/null and b/tests/_ref/compositing/clip-vector-image-transform.png differ diff --git a/tests/_ref/compositing/clip-vector-image.png b/tests/_ref/compositing/clip-vector-image.png new file mode 100644 index 00000000..94474931 Binary files /dev/null and b/tests/_ref/compositing/clip-vector-image.png differ diff --git a/tests/_ref/compositing/mask-vector-image.png b/tests/_ref/compositing/mask-vector-image.png new file mode 100644 index 00000000..4cb785e4 Binary files /dev/null and b/tests/_ref/compositing/mask-vector-image.png differ diff --git a/tests/_ref/drawing/pathmatics-contours.png b/tests/_ref/drawing/pathmatics-contours.png index 75381ff8..5b8ab508 100644 Binary files a/tests/_ref/drawing/pathmatics-contours.png and b/tests/_ref/drawing/pathmatics-contours.png differ diff --git a/tests/_ref/drawing/paths-broken.jpg b/tests/_ref/drawing/paths-broken.jpg index 8e284ede..6e123ee2 100644 Binary files a/tests/_ref/drawing/paths-broken.jpg and b/tests/_ref/drawing/paths-broken.jpg differ diff --git a/tests/_ref/drawing/paths-transform-post.png b/tests/_ref/drawing/paths-transform-post.png index a9bee548..fe6ec7db 100644 Binary files a/tests/_ref/drawing/paths-transform-post.png and b/tests/_ref/drawing/paths-transform-post.png differ diff --git a/tests/_ref/drawing/paths-transform-pre.png b/tests/_ref/drawing/paths-transform-pre.png index 776d9f15..27cd56bb 100644 Binary files a/tests/_ref/drawing/paths-transform-pre.png and b/tests/_ref/drawing/paths-transform-pre.png differ diff --git a/tests/_ref/typography/typography-advanced-flow.png b/tests/_ref/typography/typography-advanced-flow.png index 3f606814..a3cc9d9d 100644 Binary files a/tests/_ref/typography/typography-advanced-flow.png and b/tests/_ref/typography/typography-advanced-flow.png differ diff --git a/tests/_ref/typography/typography-advanced-flow2.png b/tests/_ref/typography/typography-advanced-flow2.png index 5edc7d91..ff84fb28 100644 Binary files a/tests/_ref/typography/typography-advanced-flow2.png and b/tests/_ref/typography/typography-advanced-flow2.png differ diff --git a/tests/_ref/typography/typography-advanced-flow3.png b/tests/_ref/typography/typography-advanced-flow3.png index fb7e9e70..f7619f84 100644 Binary files a/tests/_ref/typography/typography-advanced-flow3.png and b/tests/_ref/typography/typography-advanced-flow3.png differ diff --git a/tests/_ref/typography/typography-layout-fragments.png b/tests/_ref/typography/typography-layout-fragments.png index e7dea91c..55adbb6d 100644 Binary files a/tests/_ref/typography/typography-layout-fragments.png and b/tests/_ref/typography/typography-layout-fragments.png differ diff --git a/tests/_ref/typography/typography-layout-select2.png b/tests/_ref/typography/typography-layout-select2.png index 7bfad3d8..4d188113 100644 Binary files a/tests/_ref/typography/typography-layout-select2.png and b/tests/_ref/typography/typography-layout-select2.png differ diff --git a/tests/_ref/typography/typography-layout-words.png b/tests/_ref/typography/typography-layout-words.png index 907515e0..75cdf49b 100644 Binary files a/tests/_ref/typography/typography-layout-words.png and b/tests/_ref/typography/typography-layout-words.png differ diff --git a/tests/_ref/typography/typography-styles-font.png b/tests/_ref/typography/typography-styles-font.png index c0de410c..080c2866 100644 Binary files a/tests/_ref/typography/typography-styles-font.png and b/tests/_ref/typography/typography-styles-font.png differ diff --git a/tests/_ref/typography/typography-styles-named.png b/tests/_ref/typography/typography-styles-named.png index 897be1a5..2fa439bb 100644 Binary files a/tests/_ref/typography/typography-styles-named.png and b/tests/_ref/typography/typography-styles-named.png differ diff --git a/tests/canvas.py b/tests/canvas.py new file mode 100644 index 00000000..0bfbd528 --- /dev/null +++ b/tests/canvas.py @@ -0,0 +1,82 @@ +# encoding: utf-8 +import unittest +from types import SimpleNamespace +from collections import UserDict +from . import PlotDeviceTestCase +from plotdevice import * + +class CanvasTests(PlotDeviceTestCase): + def test_ordered_by_dotted_attr(self): + size(100, 100) + positions = [80, 20, 50] + for y in positions: + rect(10, y, 10, 10) + + sorted_grobs = ordered(canvas, 'bounds.y') + self.assertEqual([g.bounds.y for g in sorted_grobs], sorted(positions)) + + def test_ordered_by_dict_like_non_dict(self): + items = [UserDict({'y': 80}), UserDict({'y': 20}), UserDict({'y': 50})] + sorted_items = ordered(items, 'y') + self.assertEqual([d['y'] for d in sorted_items], [20, 50, 80]) + + def test_ordered_heterogeneous_items(self): + items = [{'y': 80}, SimpleNamespace(y=20), {'y': 50}] + sorted_items = ordered(items, 'y') + ys = [it['y'] if isinstance(it, dict) else it.y for it in sorted_items] + self.assertEqual(ys, [20, 50, 80]) + + def test_dimension_range(self): + # reproduces https://github.com/plotdevice/plotdevice/issues/67 + size(300, 200) + self.assertEqual(list(range(0, WIDTH)), list(range(0, 300))) + self.assertEqual(list(range(0, HEIGHT)), list(range(0, 200))) + + def test_magicnumber_protocol(self): + # exercise the dunder methods on MagicNumber that make it behave like a real float + size(300, 200) + for magic in (WIDTH, HEIGHT, px, inch, pica, cm, mm): + expected = float(magic) + with self.subTest(magic=magic): + self.assertEqual(list(range(0, magic)), list(range(0, int(expected)))) + self.assertEqual(round(magic), round(expected)) + self.assertEqual(hash(magic), hash(expected)) + self.assertTrue(magic <= expected) + self.assertTrue(magic >= expected) + self.assertEqual(format(magic, '.2f'), format(expected, '.2f')) + self.assertEqual(144 / magic, 144 / expected) + + def test_magicnumber_cross_comparisons(self): + # confirm dimension-to-unit comparisons work + size(10 * cm, 20 * cm) + self.assertEqual(WIDTH / cm, 10) + self.assertEqual(HEIGHT / cm, 20) + for a, b in [(inch, pica), (cm, mm), (WIDTH, cm), (HEIGHT, inch), (WIDTH, HEIGHT)]: + with self.subTest(a=a, b=b): + self.assertEqual(a <= b, float(a) <= float(b)) + self.assertEqual(a >= b, float(a) >= float(b)) + + def test_magicnumber_unsupported_operators(self): + # confirm errors blame the actual type (Dimension or Unit) rather than + # the spurious 'float' comparison from earlier releases + size(300, 200) + for magic in (WIDTH, HEIGHT, px, inch, pica, cm, mm): + typename = type(magic).__name__ + ops = [ + lambda m: m << 2, + lambda m: m >> 2, + lambda m: 2 << m, + lambda m: 2 >> m, + lambda m: ~m, + ] + for op in ops: + with self.subTest(magic=magic, op=op): + with self.assertRaises(TypeError) as exc: + op(magic) + self.assertIn(typename, str(exc.exception)) + self.assertNotIn('float', str(exc.exception)) + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(CanvasTests)) + return suite diff --git a/tests/compositing.py b/tests/compositing.py index 5db32747..26a609cc 100644 --- a/tests/compositing.py +++ b/tests/compositing.py @@ -42,6 +42,35 @@ def test_clip_text(self): with clip(text('Hi', 5, 100)): image('tests/_in/plaid.png') + @reference('compositing/clip-vector-image.png') + def test_clip_image_vector(self): + size(125, 125) + # ensure tiny PDF is scaled up before rasterizing into a larger mask + with clip(image('tests/_in/tiny-triangle.pdf', width=125, height=125)): + image('tests/_in/plaid.png') + + @reference('compositing/clip-vector-image-scale.png') + def test_clip_image_vector_scale(self): + size(125, 125) + scale(2) + with clip(image('tests/_in/tiny-triangle.pdf', width=62, height=62)): + image('tests/_in/plaid.png') + + @reference('compositing/clip-vector-image-rotate.png') + def test_clip_image_vector_rotate(self): + size(125, 125) + rotate(30) + with clip(image('tests/_in/tiny-triangle.pdf', width=125, height=125)): + image('tests/_in/plaid.png') + + @reference('compositing/clip-vector-image-transform.png') + def test_clip_image_vector_transform(self): + size(125, 125) + scale(1.5) + rotate(20) + with clip(image('tests/_in/tiny-triangle.pdf', width=83, height=83)): + image('tests/_in/plaid.png') + @reference('compositing/mask.png') def test_mask(self): # ref/Compositing/commands/mask() @@ -64,6 +93,13 @@ def test_mask_text(self): with mask(text('Hi', 5, 100)): image('tests/_in/plaid.png') + @reference('compositing/mask-vector-image.png') + def test_mask_image_vector(self): + size(125, 125) + # ensure tiny PDF is scaled up before rasterizing into a larger mask + with mask(image('tests/_in/tiny-triangle.pdf', width=125, height=125)): + image('tests/_in/plaid.png') + @reference('compositing/shadow-multi.png') def test_shadow_multi(self): # ref/Compositing/commands/shadow() diff --git a/tests/drawing.py b/tests/drawing.py index 1d0dbe14..3d01bb30 100644 --- a/tests/drawing.py +++ b/tests/drawing.py @@ -8,7 +8,7 @@ class DrawingTests(PlotDeviceTestCase): def test_paths_transform_pre(self): # tut/Bezier_Paths (1) size(180, 180) - font("Dolly", "bold", 300) + font("Rockwell", "bold", 280) path = textpath("e", 10, 150) bezier(path, stroke='black', fill=None) @@ -16,7 +16,7 @@ def test_paths_transform_pre(self): def test_paths_transform_post(self): # tut/Bezier_Paths (2) size(180, 180) - font("Dolly", "bold", 300) + font("Rockwell", "bold", 280) path = textpath("e", 10, 150) curves = [] for curve in path: @@ -30,7 +30,7 @@ def test_paths_transform_post(self): def test_paths_broken(self): # tut/Bezier_Paths (3) size(334, 87) - font("Dolly", "bold", 100) + font("Rockwell", "bold", 90) path = textpath("broken", 0,80) curves = [] @@ -48,7 +48,7 @@ def test_paths_broken(self): def test_pathmatics_contours(self): # tut/Bezier_Paths (4) size(181, 70) - font("Dolly", "bold", 50) + font("Rockwell", "bold", 50) with pen(2), nofill(): path = textpath("@#$&!", 10, 50) for contour in path.contours: diff --git a/tests/module.py b/tests/module.py index 77a30bba..4f55a646 100644 --- a/tests/module.py +++ b/tests/module.py @@ -1,4 +1,4 @@ -import os +import os, sys import unittest from . import PlotDeviceTestCase, reference from subprocess import check_output, STDOUT @@ -9,7 +9,7 @@ class ModuleTests(PlotDeviceTestCase): def test_pyobjc(self): import objc - self.assertIn(sdist_path, objc.__file__) + self.assertIsNotNone(objc.lookUpClass('Vandercook')) @reference('module/nodebox-compat.png') def test_nodebox_compat(self): @@ -27,10 +27,9 @@ def test_compliance(self): def test_cli(self): self._image = 'module/cli.png' - plod_bin = '%s/app/plotdevice'%sdist_path script = '%s/tests/_in/cli.pv'%sdist_path output = '%s/tests/_out/%s'%(sdist_path, self._image) - check_output([plod_bin, script, '--export', output], stderr=STDOUT, cwd=sdist_path) + check_output([sys.executable, '-m', 'plotdevice', script, '--export', output], stderr=STDOUT, cwd=sdist_path) self.render(save_output=False) @@ -40,4 +39,4 @@ def suite(): suite = TestSuite() suite.addTest(defaultTestLoader.loadTestsFromTestCase(ModuleTests)) - return suite \ No newline at end of file + return suite diff --git a/tests/typography.py b/tests/typography.py index 2f777dc4..1c7f1500 100644 --- a/tests/typography.py +++ b/tests/typography.py @@ -88,7 +88,7 @@ def test_typography_align_block(self): def test_typography_styles_font(self): # tut/Typography (8) size(200, 220) - font('jenson', 'medium', 22) + font('Avenir Next', 'medium', 22) text("September 1972", 20,40) font(osf=True) # old-style figures @@ -124,7 +124,7 @@ def test_typography_styles_named(self): text('handgloves', 10,70, style='emph') text('handgloves', 10,100, style='bright') - font('Joanna MT', 28) + font('Hoefler Text', 28) text('handgloves', 10,150) text('handgloves', 10,180, style='emph') text('handgloves', 10,210, style='bright') @@ -183,8 +183,8 @@ def test_typography_layout_lines(self): @reference('typography/typography-layout-fragments.png') def test_typography_layout_fragments(self): # tut/Typography (15) - size(300, 210) - font('Joanna MT', 80, italic=True) + size(380, 210) + font('Palatino', 80, italic=True) t = text(20,120, str='Axiomatic') first = t[0] @@ -213,10 +213,10 @@ def test_typography_layout_glyphs(self): @reference('typography/typography-layout-words.png') def test_typography_layout_words(self): # tut/Typography (17) - size(300, 140) + size(300, 180) rhyme = "Tinker, tailor, soldier, sailor, rich man, poor man, begger man, thief" - font('Joanna MT', 32, italic=True) + font('Palatino', 32, italic=True) t = text(20,40, 270,160, str=rhyme) nofill() @@ -250,10 +250,10 @@ def test_typography_layout_select(self): @reference('typography/typography-layout-select2.png') def test_typography_layout_select2(self): # tut/Typography (20) - size(300, 240) + size(300, 270) flaubert = "“Five hundred lines for all the class!” shouted in a furious voice stopped, like the Quos ego1, a fresh outburst. “Silence!” continued the master indignantly, wiping his brow with his handkerchief, which he had just taken from his cap. “As to you, ‘new boy,’ you will conjugate ‘ridiculus sum’2 twenty times.”\nThen, in a gentler tone, “Come, you’ll find your cap again; it hasn’t been stolen.”" - font('Adobe Jenson', 14) + font('STIX Two Text', 14) layout(hyphenate=True, indent=True) stylesheet('fn', vpos=1, fill='red') @@ -323,7 +323,7 @@ def test_typography_advanced_flow(self): size(300, 150) kafka = 'Someone must have been telling lies about Josef K., he knew he had done nothing wrong but, one morning, he was arrested. Every day at eight in the morning he was brought his breakfast by Mrs. Grubach’s cook. Mrs. Gru-bach was his landlady but today she didn’t come. That had never happened before. K. waited a little while, looked from his pillow at the old woman who lived opposite and who was watching him with an inquisitiveness quite unusual for her, and finally, both hungry and disconcerted, rang the bell. There was immediately a knock at the door and a man entered.' - font('Adobe Garamond', size=10) + font('Hoefler Text', size=10) layout(align=JUSTIFY, hyphenate=True) t = text(20,20, 120,120, str=kafka) for block in t.flow(2): @@ -335,7 +335,7 @@ def test_typography_advanced_flow2(self): size(300, 330) kafka = 'and a man entered. He had never seen the man in this house before. He was slim but firmly built, his clothes were black and close-fitting, with many folds and pockets, buckles and buttons and a belt, all of which gave the impression of being very practical but without making it very clear what they were actually for. “Who are you?” asked K., sitting half upright in his bed. The man, however, ignored the question as if his arrival simply had to be accepted, and merely replied, “You rang?” “Anna should have brought me my breakfast,” said K. He tried to work out who the man actually was, first in silence, just through observation and by thinking about it, but the man didn’t stay still to be looked at for very long. Instead he went over to the door, opened it slightly, and said to someone who was clearly standing immediately behind it, “He wants Anna to bring him his breakfast.” There was a little laughter in the neighbouring room, it was not clear from the sound of it whether there were several people laughing. The strange man could not have learned anything from it that he hadn’t known already, but now he said to K., as if making his report “It is not possible.” “It would be the first time that’s happened,” said K., as he jumped out of bed and quickly pulled on his trousers. “I want to see who that is in the next room, and why it is that Mrs. Grubach has let me be disturbed in this way.” It immediately occurred to him that he needn’t have said this out loud, and that he must to some extent have acknowledged their authority by doing so, but that ...' - font('Adobe Garamond', size=10) + font('Hoefler Text', size=10) layout(align=JUSTIFY, hyphenate=True) def leftright(block): @@ -354,7 +354,7 @@ def test_typography_advanced_flow3(self): size(300, 240) welles = 'Before the law, there stands a guard. A man comes from the country, begging admittance to the law. But the guard cannot admit him. May he hope to enter at a later time? That is possible, said the guard. The man tries to peer through the entrance. He’d been taught that the law was to be accessible to every man. “Do not attempt to enter without my permission”, says the guard. I am very powerful. Yet I am the least of all the guards. From hall to hall, door after door, each guard is more powerful than the last. By the guard’s permission, the man sits by the side of the door, and there he waits. For years, he waits. Everything he has, he gives away in the hope of bribing the guard, who never fails to say to him “I take what you give me only so that you will not feel that you left something undone.” Keeping his watch during the long years, the man has come to know even the fleas on the guard’s fur collar. Growing childish in old age, he begs the fleas to persuade the guard to change his mind and allow him to enter. His sight has dimmed, but in the darkness he perceives a radiance streaming immortally from the door of the law. And now, before he dies, all he’s experienced condenses into one question, a question he’s never asked. He beckons the guard. Says the guard, “You are insatiable! What is it now?” Says the man, “Every man strives to attain the law. How is it then that in all these years, no one else has ever come here, seeking admittance?” His hearing has failed, so the guard yells into his ear. “Nobody else but you could ever have obtained admittance. No one else could enter this door! This door was intended only for you! And now, I’m going to close it.” This tale is told during the story called “The Trial”. It’s been said that the logic of this story is the logic of a dream... a nightmare.' - font('Adobe Garamond', size=10) + font('Hoefler Text', size=10) t = text(20,26, 80,120, str=welles) for block in t.flow(3): block.x += block.width + 10