Linux vps-61133.fhnet.fr 4.9.0-19-amd64 #1 SMP Debian 4.9.320-2 (2022-06-30) x86_64
Apache/2.4.25 (Debian)
Server IP : 93.113.207.21 & Your IP : 216.73.216.119
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
var /
www /
html_old /
btm2000.bak /
includes /
ace /
Delete
Unzip
Name
Size
Permission
Date
Action
snippets
[ DIR ]
drwxr-xr-x
2025-11-25 13:47
ace.js
662.35
KB
-rw-r--r--
2025-11-25 13:48
ext-beautify.js
8.08
KB
-rw-r--r--
2025-11-25 13:48
ext-chromevox.js
13.32
KB
-rw-r--r--
2025-11-25 13:48
ext-elastic_tabstops_lite.js
8.55
KB
-rw-r--r--
2025-11-25 13:48
ext-emmet.js
42.22
KB
-rw-r--r--
2025-11-25 13:48
ext-error_marker.js
141
B
-rw-r--r--
2025-11-25 13:48
ext-keybinding_menu.js
5.72
KB
-rw-r--r--
2025-11-25 13:48
ext-language_tools.js
66.45
KB
-rw-r--r--
2025-11-25 13:48
ext-linking.js
1.76
KB
-rw-r--r--
2025-11-25 13:48
ext-modelist.js
5.99
KB
-rw-r--r--
2025-11-25 13:48
ext-old_ie.js
15.78
KB
-rw-r--r--
2025-11-25 13:48
ext-searchbox.js
16.2
KB
-rw-r--r--
2025-11-25 13:48
ext-settings_menu.js
20.67
KB
-rw-r--r--
2025-11-25 13:48
ext-spellcheck.js
2.35
KB
-rw-r--r--
2025-11-25 13:48
ext-split.js
7.22
KB
-rw-r--r--
2025-11-25 13:48
ext-static_highlight.js
4.91
KB
-rw-r--r--
2025-11-25 13:48
ext-statusbar.js
1.68
KB
-rw-r--r--
2025-11-25 13:48
ext-textarea.js
15.9
KB
-rw-r--r--
2025-11-25 13:48
ext-themelist.js
2.44
KB
-rw-r--r--
2025-11-25 13:48
ext-whitespace.js
6.07
KB
-rw-r--r--
2025-11-25 13:48
keybinding-emacs.js
40.08
KB
-rw-r--r--
2025-11-25 13:48
keybinding-vim.js
201.11
KB
-rw-r--r--
2025-11-25 13:48
mode-abap.js
8.87
KB
-rw-r--r--
2025-11-25 13:48
mode-abc.js
8.85
KB
-rw-r--r--
2025-11-25 13:48
mode-actionscript.js
24.06
KB
-rw-r--r--
2025-11-25 13:48
mode-ada.js
2.71
KB
-rw-r--r--
2025-11-25 13:48
mode-apache_conf.js
18.61
KB
-rw-r--r--
2025-11-25 13:48
mode-applescript.js
9.34
KB
-rw-r--r--
2025-11-25 13:48
mode-asciidoc.js
13.47
KB
-rw-r--r--
2025-11-25 13:48
mode-assembly_x86.js
11.44
KB
-rw-r--r--
2025-11-25 13:48
mode-autohotkey.js
65.67
KB
-rw-r--r--
2025-11-25 13:48
mode-batchfile.js
8.04
KB
-rw-r--r--
2025-11-25 13:48
mode-bro.js
10.78
KB
-rw-r--r--
2025-11-25 13:48
mode-c9search.js
9.46
KB
-rw-r--r--
2025-11-25 13:48
mode-c_cpp.js
18.05
KB
-rw-r--r--
2025-11-25 13:48
mode-cirru.js
5.83
KB
-rw-r--r--
2025-11-25 13:48
mode-clojure.js
12.46
KB
-rw-r--r--
2025-11-25 13:48
mode-cobol.js
3.29
KB
-rw-r--r--
2025-11-25 13:48
mode-coffee.js
14.03
KB
-rw-r--r--
2025-11-25 13:48
mode-coldfusion.js
101.72
KB
-rw-r--r--
2025-11-25 13:48
mode-csharp.js
16.08
KB
-rw-r--r--
2025-11-25 13:48
mode-css.js
30.18
KB
-rw-r--r--
2025-11-25 13:48
mode-curly.js
99.81
KB
-rw-r--r--
2025-11-25 13:48
mode-d.js
17.11
KB
-rw-r--r--
2025-11-25 13:48
mode-dart.js
23.84
KB
-rw-r--r--
2025-11-25 13:48
mode-diff.js
4.36
KB
-rw-r--r--
2025-11-25 13:48
mode-django.js
100.62
KB
-rw-r--r--
2025-11-25 13:48
mode-dockerfile.js
15.79
KB
-rw-r--r--
2025-11-25 13:48
mode-dot.js
13.51
KB
-rw-r--r--
2025-11-25 13:48
mode-drools.js
17.28
KB
-rw-r--r--
2025-11-25 13:48
mode-eiffel.js
4.84
KB
-rw-r--r--
2025-11-25 13:48
mode-ejs.js
117.48
KB
-rw-r--r--
2025-11-25 13:48
mode-elixir.js
22.76
KB
-rw-r--r--
2025-11-25 13:48
mode-elm.js
9.16
KB
-rw-r--r--
2025-11-25 13:48
mode-erlang.js
45.31
KB
-rw-r--r--
2025-11-25 13:48
mode-forth.js
10.98
KB
-rw-r--r--
2025-11-25 13:48
mode-fortran.js
14.72
KB
-rw-r--r--
2025-11-25 13:48
mode-ftl.js
49.7
KB
-rw-r--r--
2025-11-25 13:48
mode-gcode.js
2.78
KB
-rw-r--r--
2025-11-25 13:48
mode-gherkin.js
4.59
KB
-rw-r--r--
2025-11-25 13:48
mode-gitignore.js
1.45
KB
-rw-r--r--
2025-11-25 13:48
mode-glsl.js
21.1
KB
-rw-r--r--
2025-11-25 13:48
mode-gobstones.js
34.77
KB
-rw-r--r--
2025-11-25 13:48
mode-golang.js
13.5
KB
-rw-r--r--
2025-11-25 13:48
mode-graphqlschema.js
6.38
KB
-rw-r--r--
2025-11-25 13:48
mode-groovy.js
37.69
KB
-rw-r--r--
2025-11-25 13:48
mode-haml.js
63.54
KB
-rw-r--r--
2025-11-25 13:48
mode-handlebars.js
101.37
KB
-rw-r--r--
2025-11-25 13:48
mode-haskell.js
16.72
KB
-rw-r--r--
2025-11-25 13:48
mode-haskell_cabal.js
4.15
KB
-rw-r--r--
2025-11-25 13:48
mode-haxe.js
11.96
KB
-rw-r--r--
2025-11-25 13:48
mode-hjson.js
10.77
KB
-rw-r--r--
2025-11-25 13:48
mode-html.js
98.26
KB
-rw-r--r--
2025-11-25 13:48
mode-html_elixir.js
123.61
KB
-rw-r--r--
2025-11-25 13:48
mode-html_ruby.js
118.22
KB
-rw-r--r--
2025-11-25 13:48
mode-ini.js
4.58
KB
-rw-r--r--
2025-11-25 13:48
mode-io.js
9.17
KB
-rw-r--r--
2025-11-25 13:48
mode-jack.js
10.71
KB
-rw-r--r--
2025-11-25 13:48
mode-jade.js
86.1
KB
-rw-r--r--
2025-11-25 13:48
mode-java.js
36.31
KB
-rw-r--r--
2025-11-25 13:48
mode-javascript.js
30.68
KB
-rw-r--r--
2025-11-25 13:48
mode-json.js
9.93
KB
-rw-r--r--
2025-11-25 13:48
mode-jsoniq.js
320.04
KB
-rw-r--r--
2025-11-25 13:48
mode-jsp.js
56.89
KB
-rw-r--r--
2025-11-25 13:48
mode-jsx.js
13.05
KB
-rw-r--r--
2025-11-25 13:48
mode-julia.js
11.61
KB
-rw-r--r--
2025-11-25 13:48
mode-kotlin.js
23.86
KB
-rw-r--r--
2025-11-25 13:48
mode-latex.js
7.21
KB
-rw-r--r--
2025-11-25 13:48
mode-lean.js
9.46
KB
-rw-r--r--
2025-11-25 13:48
mode-less.js
34.33
KB
-rw-r--r--
2025-11-25 13:48
mode-liquid.js
49.28
KB
-rw-r--r--
2025-11-25 13:48
mode-lisp.js
3.16
KB
-rw-r--r--
2025-11-25 13:48
mode-live_script.js
26.71
KB
-rw-r--r--
2025-11-25 13:48
mode-livescript.js
7.92
KB
-rw-r--r--
2025-11-25 13:48
mode-logiql.js
10.35
KB
-rw-r--r--
2025-11-25 13:48
mode-lsl.js
30.83
KB
-rw-r--r--
2025-11-25 13:48
mode-lua.js
14.15
KB
-rw-r--r--
2025-11-25 13:48
mode-luapage.js
114.33
KB
-rw-r--r--
2025-11-25 13:48
mode-lucene.js
2.07
KB
-rw-r--r--
2025-11-25 13:48
mode-makefile.js
12.81
KB
-rw-r--r--
2025-11-25 13:48
mode-markdown.js
110.88
KB
-rw-r--r--
2025-11-25 13:48
mode-mask.js
69.49
KB
-rw-r--r--
2025-11-25 13:48
mode-matlab.js
22.58
KB
-rw-r--r--
2025-11-25 13:48
mode-mavens_mate_log.js
5.21
KB
-rw-r--r--
2025-11-25 13:48
mode-maze.js
8.85
KB
-rw-r--r--
2025-11-25 13:48
mode-mel.js
28.16
KB
-rw-r--r--
2025-11-25 13:48
mode-mips_assembler.js
9.33
KB
-rw-r--r--
2025-11-25 13:48
mode-mipsassembler.js
6.08
KB
-rw-r--r--
2025-11-25 13:48
mode-mushcode.js
11.77
KB
-rw-r--r--
2025-11-25 13:48
mode-mysql.js
8.48
KB
-rw-r--r--
2025-11-25 13:48
mode-nix.js
22.78
KB
-rw-r--r--
2025-11-25 13:48
mode-nsis.js
14.16
KB
-rw-r--r--
2025-11-25 13:48
mode-objectivec.js
63.48
KB
-rw-r--r--
2025-11-25 13:48
mode-ocaml.js
20.95
KB
-rw-r--r--
2025-11-25 13:48
mode-pascal.js
7.43
KB
-rw-r--r--
2025-11-25 13:48
mode-perl.js
12.73
KB
-rw-r--r--
2025-11-25 13:48
mode-pgsql.js
78.37
KB
-rw-r--r--
2025-11-25 13:48
mode-php.js
588.2
KB
-rw-r--r--
2025-11-25 13:48
mode-pig.js
10.59
KB
-rw-r--r--
2025-11-25 13:48
mode-plain_text.js
757
B
-rw-r--r--
2025-11-25 13:48
mode-powershell.js
37.91
KB
-rw-r--r--
2025-11-25 13:48
mode-praat.js
17.09
KB
-rw-r--r--
2025-11-25 13:48
mode-prolog.js
13.75
KB
-rw-r--r--
2025-11-25 13:48
mode-properties.js
2.02
KB
-rw-r--r--
2025-11-25 13:48
mode-protobuf.js
21.22
KB
-rw-r--r--
2025-11-25 13:48
mode-python.js
8.52
KB
-rw-r--r--
2025-11-25 13:47
mode-r.js
9.41
KB
-rw-r--r--
2025-11-25 13:47
mode-razor.js
110.43
KB
-rw-r--r--
2025-11-25 13:47
mode-rdoc.js
6.64
KB
-rw-r--r--
2025-11-25 13:47
mode-rhtml.js
107.56
KB
-rw-r--r--
2025-11-25 13:47
mode-rst.js
5.52
KB
-rw-r--r--
2025-11-25 13:47
mode-ruby.js
18.45
KB
-rw-r--r--
2025-11-25 13:47
mode-rust.js
10.68
KB
-rw-r--r--
2025-11-25 13:47
mode-sass.js
18.32
KB
-rw-r--r--
2025-11-25 13:47
mode-scad.js
12.58
KB
-rw-r--r--
2025-11-25 13:47
mode-scala.js
37.8
KB
-rw-r--r--
2025-11-25 13:47
mode-scheme.js
6.83
KB
-rw-r--r--
2025-11-25 13:47
mode-scss.js
23.46
KB
-rw-r--r--
2025-11-25 13:47
mode-sh.js
14.17
KB
-rw-r--r--
2025-11-25 13:47
mode-sjs.js
36.65
KB
-rw-r--r--
2025-11-25 13:47
mode-smarty.js
103.22
KB
-rw-r--r--
2025-11-25 13:47
mode-snippets.js
6.62
KB
-rw-r--r--
2025-11-25 13:47
mode-soy_template.js
111.52
KB
-rw-r--r--
2025-11-25 13:47
mode-space.js
4.69
KB
-rw-r--r--
2025-11-25 13:47
mode-sparql.js
12.03
KB
-rw-r--r--
2025-11-25 13:47
mode-sql.js
3.03
KB
-rw-r--r--
2025-11-25 13:47
mode-sqlserver.js
22.76
KB
-rw-r--r--
2025-11-25 13:47
mode-stylus.js
20.5
KB
-rw-r--r--
2025-11-25 13:47
mode-svg.js
57.13
KB
-rw-r--r--
2025-11-25 13:47
mode-swift.js
12.91
KB
-rw-r--r--
2025-11-25 13:47
mode-swig.js
47.08
KB
-rw-r--r--
2025-11-25 13:47
mode-tcl.js
11.83
KB
-rw-r--r--
2025-11-25 13:47
mode-tex.js
4.82
KB
-rw-r--r--
2025-11-25 13:47
mode-text.js
1
B
-rw-r--r--
2025-11-25 13:47
mode-textile.js
3.87
KB
-rw-r--r--
2025-11-25 13:47
mode-toml.js
3.87
KB
-rw-r--r--
2025-11-25 13:47
mode-tsx.js
34.25
KB
-rw-r--r--
2025-11-25 13:47
mode-turtle.js
8.99
KB
-rw-r--r--
2025-11-25 13:47
mode-twig.js
103.92
KB
-rw-r--r--
2025-11-25 13:47
mode-typescript.js
33.82
KB
-rw-r--r--
2025-11-25 13:47
mode-vala.js
26.77
KB
-rw-r--r--
2025-11-25 13:47
mode-vbscript.js
7.25
KB
-rw-r--r--
2025-11-25 13:47
mode-velocity.js
107.39
KB
-rw-r--r--
2025-11-25 13:47
mode-verilog.js
3.86
KB
-rw-r--r--
2025-11-25 13:47
mode-vhdl.js
3.5
KB
-rw-r--r--
2025-11-25 13:47
mode-wollok.js
34.54
KB
-rw-r--r--
2025-11-25 13:47
mode-xml.js
22.97
KB
-rw-r--r--
2025-11-25 13:47
mode-xquery.js
317.31
KB
-rw-r--r--
2025-11-25 13:47
mode-yaml.js
8.79
KB
-rw-r--r--
2025-11-25 13:47
theme-ambiance.js
27.54
KB
-rw-r--r--
2025-11-25 13:47
theme-chaos.js
3.13
KB
-rw-r--r--
2025-11-25 13:47
theme-chrome.js
2.96
KB
-rw-r--r--
2025-11-25 13:47
theme-clouds.js
2.28
KB
-rw-r--r--
2025-11-25 13:47
theme-clouds_midnight.js
2.63
KB
-rw-r--r--
2025-11-25 13:47
theme-cobalt.js
2.58
KB
-rw-r--r--
2025-11-25 13:47
theme-crimson_editor.js
3.04
KB
-rw-r--r--
2025-11-25 13:47
theme-dawn.js
2.46
KB
-rw-r--r--
2025-11-25 13:47
theme-dreamweaver.js
3.41
KB
-rw-r--r--
2025-11-25 13:47
theme-eclipse.js
2.33
KB
-rw-r--r--
2025-11-25 13:47
theme-github.js
2.4
KB
-rw-r--r--
2025-11-25 13:47
theme-gob.js
2.61
KB
-rw-r--r--
2025-11-25 13:47
theme-gruvbox.js
1.85
KB
-rw-r--r--
2025-11-25 13:47
theme-idle_fingers.js
2.45
KB
-rw-r--r--
2025-11-25 13:47
theme-iplastic.js
6.63
KB
-rw-r--r--
2025-11-25 13:47
theme-katzenmilch.js
3.35
KB
-rw-r--r--
2025-11-25 13:47
theme-kr_theme.js
2.51
KB
-rw-r--r--
2025-11-25 13:47
theme-kuroir.js
2.19
KB
-rw-r--r--
2025-11-25 13:47
theme-merbivore.js
2.43
KB
-rw-r--r--
2025-11-25 13:47
theme-merbivore_soft.js
2.64
KB
-rw-r--r--
2025-11-25 13:47
theme-mono_industrial.js
3
KB
-rw-r--r--
2025-11-25 13:47
theme-monokai.js
2.59
KB
-rw-r--r--
2025-11-25 13:47
theme-pastel_on_dark.js
2.85
KB
-rw-r--r--
2025-11-25 13:47
theme-solarized_dark.js
2.49
KB
-rw-r--r--
2025-11-25 13:47
theme-solarized_light.js
2.55
KB
-rw-r--r--
2025-11-25 13:47
theme-sqlserver.js
3.16
KB
-rw-r--r--
2025-11-25 13:47
theme-terminal.js
3.13
KB
-rw-r--r--
2025-11-25 13:47
theme-textmate.js
2.84
KB
-rw-r--r--
2025-11-25 13:47
theme-tomorrow.js
2.77
KB
-rw-r--r--
2025-11-25 13:47
theme-tomorrow_night.js
3.03
KB
-rw-r--r--
2025-11-25 13:47
theme-tomorrow_night_blue.js
3.23
KB
-rw-r--r--
2025-11-25 13:47
theme-tomorrow_night_bright.js
3.71
KB
-rw-r--r--
2025-11-25 13:47
theme-tomorrow_night_eighties.js
3.42
KB
-rw-r--r--
2025-11-25 13:47
theme-twilight.js
2.72
KB
-rw-r--r--
2025-11-25 13:47
theme-vibrant_ink.js
2.4
KB
-rw-r--r--
2025-11-25 13:47
theme-xcode.js
2.11
KB
-rw-r--r--
2025-11-25 13:47
worker-coffee.js
220.38
KB
-rw-r--r--
2025-11-25 13:47
worker-css.js
290.28
KB
-rw-r--r--
2025-11-25 13:47
worker-html.js
330.32
KB
-rw-r--r--
2025-11-25 13:47
worker-javascript.js
337.14
KB
-rw-r--r--
2025-11-25 13:47
worker-json.js
71.04
KB
-rw-r--r--
2025-11-25 13:47
worker-lua.js
103.33
KB
-rw-r--r--
2025-11-25 13:47
worker-php.js
147.68
KB
-rw-r--r--
2025-11-25 13:47
worker-xml.js
110.19
KB
-rw-r--r--
2025-11-25 13:47
worker-xquery.js
3.36
MB
-rw-r--r--
2025-11-25 13:47
Save
Rename
ace.define("ace/ext/chromevox",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { var cvoxAce = {}; cvoxAce.SpeechProperty; cvoxAce.Cursor; cvoxAce.Token; cvoxAce.Annotation; var CONSTANT_PROP = { 'rate': 0.8, 'pitch': 0.4, 'volume': 0.9 }; var DEFAULT_PROP = { 'rate': 1, 'pitch': 0.5, 'volume': 0.9 }; var ENTITY_PROP = { 'rate': 0.8, 'pitch': 0.8, 'volume': 0.9 }; var KEYWORD_PROP = { 'rate': 0.8, 'pitch': 0.3, 'volume': 0.9 }; var STORAGE_PROP = { 'rate': 0.8, 'pitch': 0.7, 'volume': 0.9 }; var VARIABLE_PROP = { 'rate': 0.8, 'pitch': 0.8, 'volume': 0.9 }; var DELETED_PROP = { 'punctuationEcho': 'none', 'relativePitch': -0.6 }; var ERROR_EARCON = 'ALERT_NONMODAL'; var MODE_SWITCH_EARCON = 'ALERT_MODAL'; var NO_MATCH_EARCON = 'INVALID_KEYPRESS'; var INSERT_MODE_STATE = 'insertMode'; var COMMAND_MODE_STATE = 'start'; var REPLACE_LIST = [ { substr: ';', newSubstr: ' semicolon ' }, { substr: ':', newSubstr: ' colon ' } ]; var Command = { SPEAK_ANNOT: 'annots', SPEAK_ALL_ANNOTS: 'all_annots', TOGGLE_LOCATION: 'toggle_location', SPEAK_MODE: 'mode', SPEAK_ROW_COL: 'row_col', TOGGLE_DISPLACEMENT: 'toggle_displacement', FOCUS_TEXT: 'focus_text' }; var KEY_PREFIX = 'CONTROL + SHIFT '; cvoxAce.editor = null; var lastCursor = null; var annotTable = {}; var shouldSpeakRowLocation = false; var shouldSpeakDisplacement = false; var changed = false; var vimState = null; var keyCodeToShortcutMap = {}; var cmdToShortcutMap = {}; var getKeyShortcutString = function(keyCode) { return KEY_PREFIX + String.fromCharCode(keyCode); }; var isVimMode = function() { var keyboardHandler = cvoxAce.editor.keyBinding.getKeyboardHandler(); return keyboardHandler.$id === 'ace/keyboard/vim'; }; var getCurrentToken = function(cursor) { return cvoxAce.editor.getSession().getTokenAt(cursor.row, cursor.column + 1); }; var getCurrentLine = function(cursor) { return cvoxAce.editor.getSession().getLine(cursor.row); }; var onRowChange = function(currCursor) { if (annotTable[currCursor.row]) { cvox.Api.playEarcon(ERROR_EARCON); } if (shouldSpeakRowLocation) { cvox.Api.stop(); speakChar(currCursor); speakTokenQueue(getCurrentToken(currCursor)); speakLine(currCursor.row, 1); } else { speakLine(currCursor.row, 0); } }; var isWord = function(cursor) { var line = getCurrentLine(cursor); var lineSuffix = line.substr(cursor.column - 1); if (cursor.column === 0) { lineSuffix = ' ' + line; } var firstWordRegExp = /^\W(\w+)/; var words = firstWordRegExp.exec(lineSuffix); return words !== null; }; var rules = { 'constant': { prop: CONSTANT_PROP }, 'entity': { prop: ENTITY_PROP }, 'keyword': { prop: KEYWORD_PROP }, 'storage': { prop: STORAGE_PROP }, 'variable': { prop: VARIABLE_PROP }, 'meta': { prop: DEFAULT_PROP, replace: [ { substr: '</', newSubstr: ' closing tag ' }, { substr: '/>', newSubstr: ' close tag ' }, { substr: '<', newSubstr: ' tag start ' }, { substr: '>', newSubstr: ' tag end ' } ] } }; var DEFAULT_RULE = { prop: DEFAULT_RULE }; var expand = function(value, replaceRules) { var newValue = value; for (var i = 0; i < replaceRules.length; i++) { var replaceRule = replaceRules[i]; var regexp = new RegExp(replaceRule.substr, 'g'); newValue = newValue.replace(regexp, replaceRule.newSubstr); } return newValue; }; var mergeTokens = function(tokens, start, end) { var newToken = {}; newToken.value = ''; newToken.type = tokens[start].type; for (var j = start; j < end; j++) { newToken.value += tokens[j].value; } return newToken; }; var mergeLikeTokens = function(tokens) { if (tokens.length <= 1) { return tokens; } var newTokens = []; var lastLikeIndex = 0; for (var i = 1; i < tokens.length; i++) { var lastLikeToken = tokens[lastLikeIndex]; var currToken = tokens[i]; if (getTokenRule(lastLikeToken) !== getTokenRule(currToken)) { newTokens.push(mergeTokens(tokens, lastLikeIndex, i)); lastLikeIndex = i; } } newTokens.push(mergeTokens(tokens, lastLikeIndex, tokens.length)); return newTokens; }; var isRowWhiteSpace = function(row) { var line = cvoxAce.editor.getSession().getLine(row); var whiteSpaceRegexp = /^\s*$/; return whiteSpaceRegexp.exec(line) !== null; }; var speakLine = function(row, queue) { var tokens = cvoxAce.editor.getSession().getTokens(row); if (tokens.length === 0 || isRowWhiteSpace(row)) { cvox.Api.playEarcon('EDITABLE_TEXT'); return; } tokens = mergeLikeTokens(tokens); var firstToken = tokens[0]; tokens = tokens.filter(function(token) { return token !== firstToken; }); speakToken_(firstToken, queue); tokens.forEach(speakTokenQueue); }; var speakTokenFlush = function(token) { speakToken_(token, 0); }; var speakTokenQueue = function(token) { speakToken_(token, 1); }; var getTokenRule = function(token) { if (!token || !token.type) { return; } var split = token.type.split('.'); if (split.length === 0) { return; } var type = split[0]; var rule = rules[type]; if (!rule) { return DEFAULT_RULE; } return rule; }; var speakToken_ = function(token, queue) { var rule = getTokenRule(token); var value = expand(token.value, REPLACE_LIST); if (rule.replace) { value = expand(value, rule.replace); } cvox.Api.speak(value, queue, rule.prop); }; var speakChar = function(cursor) { var line = getCurrentLine(cursor); cvox.Api.speak(line[cursor.column], 1); }; var speakDisplacement = function(lastCursor, currCursor) { var line = getCurrentLine(currCursor); var displace = line.substring(lastCursor.column, currCursor.column); displace = displace.replace(/ /g, ' space '); cvox.Api.speak(displace); }; var speakCharOrWordOrLine = function(lastCursor, currCursor) { if (Math.abs(lastCursor.column - currCursor.column) !== 1) { var currLineLength = getCurrentLine(currCursor).length; if (currCursor.column === 0 || currCursor.column === currLineLength) { speakLine(currCursor.row, 0); return; } if (isWord(currCursor)) { cvox.Api.stop(); speakTokenQueue(getCurrentToken(currCursor)); return; } } speakChar(currCursor); }; var onColumnChange = function(lastCursor, currCursor) { if (!cvoxAce.editor.selection.isEmpty()) { speakDisplacement(lastCursor, currCursor); cvox.Api.speak('selected', 1); } else if (shouldSpeakDisplacement) { speakDisplacement(lastCursor, currCursor); } else { speakCharOrWordOrLine(lastCursor, currCursor); } }; var onCursorChange = function(evt) { if (changed) { changed = false; return; } var currCursor = cvoxAce.editor.selection.getCursor(); if (currCursor.row !== lastCursor.row) { onRowChange(currCursor); } else { onColumnChange(lastCursor, currCursor); } lastCursor = currCursor; }; var onSelectionChange = function(evt) { if (cvoxAce.editor.selection.isEmpty()) { cvox.Api.speak('unselected'); } }; var onChange = function(delta) { switch (delta.action) { case 'remove': cvox.Api.speak(delta.text, 0, DELETED_PROP); changed = true; break; case 'insert': cvox.Api.speak(delta.text, 0); changed = true; break; } }; var isNewAnnotation = function(annot) { var row = annot.row; var col = annot.column; return !annotTable[row] || !annotTable[row][col]; }; var populateAnnotations = function(annotations) { annotTable = {}; for (var i = 0; i < annotations.length; i++) { var annotation = annotations[i]; var row = annotation.row; var col = annotation.column; if (!annotTable[row]) { annotTable[row] = {}; } annotTable[row][col] = annotation; } }; var onAnnotationChange = function(evt) { var annotations = cvoxAce.editor.getSession().getAnnotations(); var newAnnotations = annotations.filter(isNewAnnotation); if (newAnnotations.length > 0) { cvox.Api.playEarcon(ERROR_EARCON); } populateAnnotations(annotations); }; var speakAnnot = function(annot) { var annotText = annot.type + ' ' + annot.text + ' on ' + rowColToString(annot.row, annot.column); annotText = annotText.replace(';', 'semicolon'); cvox.Api.speak(annotText, 1); }; var speakAnnotsByRow = function(row) { var annots = annotTable[row]; for (var col in annots) { speakAnnot(annots[col]); } }; var rowColToString = function(row, col) { return 'row ' + (row + 1) + ' column ' + (col + 1); }; var speakCurrRowAndCol = function() { cvox.Api.speak(rowColToString(lastCursor.row, lastCursor.column)); }; var speakAllAnnots = function() { for (var row in annotTable) { speakAnnotsByRow(row); } }; var speakMode = function() { if (!isVimMode()) { return; } switch (cvoxAce.editor.keyBinding.$data.state) { case INSERT_MODE_STATE: cvox.Api.speak('Insert mode'); break; case COMMAND_MODE_STATE: cvox.Api.speak('Command mode'); break; } }; var toggleSpeakRowLocation = function() { shouldSpeakRowLocation = !shouldSpeakRowLocation; if (shouldSpeakRowLocation) { cvox.Api.speak('Speak location on row change enabled.'); } else { cvox.Api.speak('Speak location on row change disabled.'); } }; var toggleSpeakDisplacement = function() { shouldSpeakDisplacement = !shouldSpeakDisplacement; if (shouldSpeakDisplacement) { cvox.Api.speak('Speak displacement on column changes.'); } else { cvox.Api.speak('Speak current character or word on column changes.'); } }; var onKeyDown = function(evt) { if (evt.ctrlKey && evt.shiftKey) { var shortcut = keyCodeToShortcutMap[evt.keyCode]; if (shortcut) { shortcut.func(); } } }; var onChangeStatus = function(evt, editor) { if (!isVimMode()) { return; } var state = editor.keyBinding.$data.state; if (state === vimState) { return; } switch (state) { case INSERT_MODE_STATE: cvox.Api.playEarcon(MODE_SWITCH_EARCON); cvox.Api.setKeyEcho(true); break; case COMMAND_MODE_STATE: cvox.Api.playEarcon(MODE_SWITCH_EARCON); cvox.Api.setKeyEcho(false); break; } vimState = state; }; var contextMenuHandler = function(evt) { var cmd = evt.detail['customCommand']; var shortcut = cmdToShortcutMap[cmd]; if (shortcut) { shortcut.func(); cvoxAce.editor.focus(); } }; var initContextMenu = function() { var ACTIONS = SHORTCUTS.map(function(shortcut) { return { desc: shortcut.desc + getKeyShortcutString(shortcut.keyCode), cmd: shortcut.cmd }; }); var body = document.querySelector('body'); body.setAttribute('contextMenuActions', JSON.stringify(ACTIONS)); body.addEventListener('ATCustomEvent', contextMenuHandler, true); }; var onFindSearchbox = function(evt) { if (evt.match) { speakLine(lastCursor.row, 0); } else { cvox.Api.playEarcon(NO_MATCH_EARCON); } }; var focus = function() { cvoxAce.editor.focus(); }; var SHORTCUTS = [ { keyCode: 49, func: function() { speakAnnotsByRow(lastCursor.row); }, cmd: Command.SPEAK_ANNOT, desc: 'Speak annotations on line' }, { keyCode: 50, func: speakAllAnnots, cmd: Command.SPEAK_ALL_ANNOTS, desc: 'Speak all annotations' }, { keyCode: 51, func: speakMode, cmd: Command.SPEAK_MODE, desc: 'Speak Vim mode' }, { keyCode: 52, func: toggleSpeakRowLocation, cmd: Command.TOGGLE_LOCATION, desc: 'Toggle speak row location' }, { keyCode: 53, func: speakCurrRowAndCol, cmd: Command.SPEAK_ROW_COL, desc: 'Speak row and column' }, { keyCode: 54, func: toggleSpeakDisplacement, cmd: Command.TOGGLE_DISPLACEMENT, desc: 'Toggle speak displacement' }, { keyCode: 55, func: focus, cmd: Command.FOCUS_TEXT, desc: 'Focus text' } ]; var onFocus = function(_, editor) { cvoxAce.editor = editor; editor.getSession().selection.on('changeCursor', onCursorChange); editor.getSession().selection.on('changeSelection', onSelectionChange); editor.getSession().on('change', onChange); editor.getSession().on('changeAnnotation', onAnnotationChange); editor.on('changeStatus', onChangeStatus); editor.on('findSearchBox', onFindSearchbox); editor.container.addEventListener('keydown', onKeyDown); lastCursor = editor.selection.getCursor(); }; var init = function(editor) { onFocus(null, editor); SHORTCUTS.forEach(function(shortcut) { keyCodeToShortcutMap[shortcut.keyCode] = shortcut; cmdToShortcutMap[shortcut.cmd] = shortcut; }); editor.on('focus', onFocus); if (isVimMode()) { cvox.Api.setKeyEcho(false); } initContextMenu(); }; function cvoxApiExists() { return (typeof(cvox) !== 'undefined') && cvox && cvox.Api; } var tries = 0; var MAX_TRIES = 15; function watchForCvoxLoad(editor) { if (cvoxApiExists()) { init(editor); } else { tries++; if (tries >= MAX_TRIES) { return; } window.setTimeout(watchForCvoxLoad, 500, editor); } } var Editor = require('../editor').Editor; require('../config').defineOptions(Editor.prototype, 'editor', { enableChromevoxEnhancements: { set: function(val) { if (val) { watchForCvoxLoad(this); } }, value: true // turn it on by default or check for window.cvox } }); }); (function() { ace.require(["ace/ext/chromevox"], function() {}); })();