1
0
mirror of https://github.com/adobe/brackets.git synced 2024-11-20 18:02:54 +01:00

Merge pull request #13510 from adobe/master

Merge master into release
This commit is contained in:
Swagatam Mitra 2017-07-03 17:21:47 +05:30 committed by GitHub
commit e19db0ea9f
150 changed files with 13456 additions and 1084 deletions

View File

@ -7,6 +7,7 @@ module.exports = {
"no-empty": 1,
"no-invalid-regexp": 2,
"no-regex-spaces": 2,
"no-unsafe-negation": 1,
"valid-jsdoc": 0,
"valid-typeof": 2,
// http://eslint.org/docs/rules/#best-practices
@ -23,6 +24,7 @@ module.exports = {
"no-new-wrappers": 2,
"no-new": 2,
"no-proto": 2,
"no-redeclare": 1,
"no-script-url": 2,
"wrap-iife": [2, "outside"],
// http://eslint.org/docs/rules/#strict-mode

View File

@ -268,21 +268,20 @@ module.exports = function (grunt) {
]
},
watch: {
all : {
files: ['**/*', '!**/node_modules/**'],
tasks: ['eslint']
},
grunt : {
files: ['<%= meta.grunt %>', 'tasks/**/*'],
grunt: {
files: ['<%= meta.grunt %>'],
tasks: ['eslint:grunt']
},
src : {
files: ['<%= meta.src %>', 'src/**/*'],
src: {
files: ['<%= meta.src %>'],
tasks: ['eslint:src']
},
test : {
files: ['<%= meta.test %>', 'test/**/*'],
test: {
files: ['<%= meta.test %>'],
tasks: ['eslint:test']
},
options: {
spawn: false
}
},
/* FIXME (jasonsanjose): how to handle extension tests */

View File

@ -1,6 +1,6 @@
{
"version": "release-1.9-prerelease-2",
"title" : "Brackets 1.9 Stable Pre-release for community testing",
"description" : "This is a Brackets 1.9 pre-release build.",
"version": "release-1.10-prerelease-3",
"title" : "Brackets 1.10 Pre-release for community testing",
"description" : "This is a Brackets 1.10 3rd pre-release build. This release removes the utf-8 encoding limitation, adds native menus for Linux, provides backward/forward navigation in edit history, Search History with UI, enable/disable default exetensions from extension manager, pseudo selector and AtRules hints in CSS, CSS hints in style attribute value for HTML documents.",
"prerelease": true
}

428
npm-shrinkwrap.json generated
View File

@ -1,6 +1,6 @@
{
"name": "Brackets",
"version": "1.9.0-0",
"version": "1.10.0-0",
"dependencies": {
"abbrev": {
"version": "1.1.0",
@ -190,6 +190,12 @@
"from": "aws4@>=1.2.1 <2.0.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz"
},
"babel-code-frame": {
"version": "6.22.0",
"from": "babel-code-frame@>=6.16.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
"dev": true
},
"balanced-match": {
"version": "0.4.2",
"from": "balanced-match@>=0.4.1 <0.5.0",
@ -249,6 +255,26 @@
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
"dev": true
},
"body-parser": {
"version": "1.14.2",
"from": "body-parser@>=1.14.0 <1.15.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz",
"dev": true,
"dependencies": {
"iconv-lite": {
"version": "0.4.13",
"from": "iconv-lite@0.4.13",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
"dev": true
},
"qs": {
"version": "5.2.0",
"from": "qs@5.2.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz",
"dev": true
}
}
},
"boom": {
"version": "2.10.1",
"from": "boom@>=2.0.0 <3.0.0",
@ -340,6 +366,12 @@
"resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
"dev": true
},
"bytes": {
"version": "2.2.0",
"from": "bytes@2.2.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz",
"dev": true
},
"caller-path": {
"version": "0.1.0",
"from": "caller-path@>=0.1.0 <0.2.0",
@ -505,6 +537,12 @@
"resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
"dev": true
},
"content-type": {
"version": "1.0.2",
"from": "content-type@>=1.0.1 <1.1.0",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz",
"dev": true
},
"core-util-is": {
"version": "1.0.2",
"from": "core-util-is@>=1.0.0 <1.1.0",
@ -577,10 +615,18 @@
"dev": true
},
"debug": {
"version": "0.7.4",
"from": "debug@>=0.7.0 <0.8.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz",
"dev": true
"version": "2.2.0",
"from": "debug@>=2.2.0 <2.3.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
"dev": true,
"dependencies": {
"ms": {
"version": "0.7.1",
"from": "ms@0.7.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
"dev": true
}
}
},
"decamelize": {
"version": "1.2.0",
@ -622,6 +668,12 @@
"from": "delayed-stream@>=1.0.0 <1.1.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
},
"depd": {
"version": "1.1.0",
"from": "depd@>=1.1.0 <1.2.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz",
"dev": true
},
"des.js": {
"version": "1.0.0",
"from": "des.js@>=1.0.0 <2.0.0",
@ -635,9 +687,9 @@
"dev": true
},
"doctrine": {
"version": "1.5.0",
"from": "doctrine@>=1.2.2 <2.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
"version": "2.0.0",
"from": "doctrine@>=2.0.0 <3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz",
"dev": true
},
"domain-browser": {
@ -652,6 +704,12 @@
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
"optional": true
},
"ee-first": {
"version": "1.1.1",
"from": "ee-first@1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"dev": true
},
"elliptic": {
"version": "6.4.0",
"from": "elliptic@>=6.0.0 <7.0.0",
@ -695,16 +753,68 @@
"dev": true
},
"es6-map": {
"version": "0.1.4",
"version": "0.1.5",
"from": "es6-map@>=0.1.3 <0.2.0",
"resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.4.tgz",
"dev": true
"resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
"dev": true,
"dependencies": {
"d": {
"version": "1.0.0",
"from": "d@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
"dev": true
},
"es5-ext": {
"version": "0.10.15",
"from": "es5-ext@>=0.10.14 <0.11.0",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.15.tgz",
"dev": true
},
"es6-iterator": {
"version": "2.0.1",
"from": "es6-iterator@>=2.0.1 <2.1.0",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz",
"dev": true
},
"es6-symbol": {
"version": "3.1.1",
"from": "es6-symbol@>=3.1.1 <3.2.0",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
"dev": true
}
}
},
"es6-set": {
"version": "0.1.4",
"from": "es6-set@>=0.1.3 <0.2.0",
"resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.4.tgz",
"dev": true
"version": "0.1.5",
"from": "es6-set@>=0.1.5 <0.2.0",
"resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
"dev": true,
"dependencies": {
"d": {
"version": "1.0.0",
"from": "d@1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
"dev": true
},
"es5-ext": {
"version": "0.10.15",
"from": "es5-ext@~0.10.14",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.15.tgz",
"dev": true
},
"es6-iterator": {
"version": "2.0.1",
"from": "es6-iterator@~2.0.1",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz",
"dev": true
},
"es6-symbol": {
"version": "3.1.1",
"from": "es6-symbol@3.1.1",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
"dev": true
}
}
},
"es6-symbol": {
"version": "3.1.0",
@ -713,10 +823,36 @@
"dev": true
},
"es6-weak-map": {
"version": "2.0.1",
"version": "2.0.2",
"from": "es6-weak-map@>=2.0.1 <3.0.0",
"resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.1.tgz",
"dev": true
"resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
"dev": true,
"dependencies": {
"d": {
"version": "1.0.0",
"from": "d@1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
"dev": true
},
"es5-ext": {
"version": "0.10.15",
"from": "es5-ext@^0.10.14",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.15.tgz",
"dev": true
},
"es6-iterator": {
"version": "2.0.1",
"from": "es6-iterator@^2.0.1",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz",
"dev": true
},
"es6-symbol": {
"version": "3.1.1",
"from": "es6-symbol@^3.1.1",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
"dev": true
}
}
},
"escape-string-regexp": {
"version": "1.0.5",
@ -730,9 +866,9 @@
"dev": true
},
"eslint": {
"version": "2.13.1",
"from": "eslint@>=2.0.0 <3.0.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz",
"version": "3.18.0",
"from": "eslint@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-3.18.0.tgz",
"dev": true,
"dependencies": {
"argparse": {
@ -758,6 +894,12 @@
"from": "js-yaml@>=3.5.1 <4.0.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.2.tgz",
"dev": true
},
"strip-bom": {
"version": "3.0.0",
"from": "strip-bom@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
"dev": true
}
}
},
@ -773,6 +915,12 @@
"resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz",
"dev": true
},
"esquery": {
"version": "1.0.0",
"from": "esquery@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
"dev": true
},
"esrecurse": {
"version": "4.1.0",
"from": "esrecurse@>=4.1.0 <5.0.0",
@ -800,10 +948,24 @@
"dev": true
},
"event-emitter": {
"version": "0.3.4",
"from": "event-emitter@>=0.3.4 <0.4.0",
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz",
"dev": true
"version": "0.3.5",
"from": "event-emitter@>=0.3.5 <0.4.0",
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
"dev": true,
"dependencies": {
"d": {
"version": "1.0.0",
"from": "d@1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
"dev": true
},
"es5-ext": {
"version": "0.10.15",
"from": "es5-ext@~0.10.14",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.15.tgz",
"dev": true
}
}
},
"eventemitter2": {
"version": "0.4.14",
@ -867,9 +1029,9 @@
"dev": true
},
"faye-websocket": {
"version": "0.4.4",
"from": "faye-websocket@>=0.4.3 <0.5.0",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz",
"version": "0.10.0",
"from": "faye-websocket@>=0.10.0 <0.11.0",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
"dev": true
},
"figures": {
@ -879,9 +1041,9 @@
"dev": true
},
"file-entry-cache": {
"version": "1.3.1",
"from": "file-entry-cache@>=1.1.1 <2.0.0",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz",
"version": "2.0.0",
"from": "file-entry-cache@>=2.0.0 <3.0.0",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
"dev": true
},
"filename-regex": {
@ -1073,6 +1235,20 @@
"resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
"dev": true
},
"globule": {
"version": "1.1.0",
"from": "globule@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/globule/-/globule-1.1.0.tgz",
"dev": true,
"dependencies": {
"lodash": {
"version": "4.16.6",
"from": "lodash@>=4.16.4 <4.17.0",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.6.tgz",
"dev": true
}
}
},
"graceful-fs": {
"version": "4.1.11",
"from": "graceful-fs@>=4.1.2 <5.0.0",
@ -1229,15 +1405,35 @@
"dev": true
},
"grunt-contrib-watch": {
"version": "0.4.3",
"from": "grunt-contrib-watch@0.4.3",
"resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.4.3.tgz",
"dev": true
"version": "1.0.0",
"from": "grunt-contrib-watch@1.0.0",
"resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz",
"dev": true,
"dependencies": {
"async": {
"version": "1.5.2",
"from": "async@>=1.5.0 <2.0.0",
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
"dev": true
},
"gaze": {
"version": "1.1.2",
"from": "gaze@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz",
"dev": true
},
"lodash": {
"version": "3.10.1",
"from": "lodash@>=3.10.1 <4.0.0",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
"dev": true
}
}
},
"grunt-eslint": {
"version": "18.1.0",
"from": "grunt-eslint@18.1.0",
"resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-18.1.0.tgz",
"version": "19.0.0",
"from": "grunt-eslint@19.0.0",
"resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-19.0.0.tgz",
"dev": true
},
"grunt-jasmine-node": {
@ -1400,6 +1596,12 @@
"resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-0.5.6.tgz",
"dev": true
},
"http-errors": {
"version": "1.3.1",
"from": "http-errors@>=1.3.1 <1.4.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz",
"dev": true
},
"http-signature": {
"version": "1.1.1",
"from": "http-signature@>=1.1.0 <1.2.0",
@ -1438,9 +1640,9 @@
"dev": true
},
"ignore": {
"version": "3.2.4",
"from": "ignore@>=3.1.2 <4.0.0",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-3.2.4.tgz",
"version": "3.2.6",
"from": "ignore@>=3.2.0 <4.0.0",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-3.2.6.tgz",
"dev": true
},
"image-size": {
@ -1675,6 +1877,12 @@
"resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz",
"optional": true
},
"js-tokens": {
"version": "3.0.1",
"from": "js-tokens@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz",
"dev": true
},
"js-yaml": {
"version": "2.0.5",
"from": "js-yaml@>=2.0.5 <2.1.0",
@ -1790,6 +1998,12 @@
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
"dev": true
},
"livereload-js": {
"version": "2.2.2",
"from": "livereload-js@>=2.2.0 <3.0.0",
"resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.2.2.tgz",
"dev": true
},
"load-grunt-tasks": {
"version": "3.5.0",
"from": "load-grunt-tasks@3.5.0",
@ -1831,6 +2045,12 @@
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
"dev": true
},
"media-typer": {
"version": "0.3.0",
"from": "media-typer@0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"dev": true
},
"memory-fs": {
"version": "0.4.1",
"from": "memory-fs@>=0.4.1 <0.5.0",
@ -1922,6 +2142,12 @@
"from": "nan@>=1.0.0 <1.1.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-1.0.0.tgz"
},
"natural-compare": {
"version": "1.4.0",
"from": "natural-compare@>=1.4.0 <2.0.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"dev": true
},
"node-libs-browser": {
"version": "2.0.0",
"from": "node-libs-browser@>=2.0.0 <3.0.0",
@ -1933,20 +2159,6 @@
"from": "nopt@>=3.0.1 <4.0.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz"
},
"noptify": {
"version": "0.0.3",
"from": "noptify@latest",
"resolved": "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz",
"dev": true,
"dependencies": {
"nopt": {
"version": "2.0.0",
"from": "nopt@>=2.0.0 <2.1.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz",
"dev": true
}
}
},
"normalize-package-data": {
"version": "2.3.6",
"from": "normalize-package-data@>=2.3.2 <3.0.0",
@ -3488,6 +3700,12 @@
"from": "object.omit@>=2.0.0 <3.0.0",
"resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz"
},
"on-finished": {
"version": "2.3.0",
"from": "on-finished@>=2.3.0 <2.4.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"dev": true
},
"once": {
"version": "1.4.0",
"from": "once@>=1.3.0 <2.0.0",
@ -3588,6 +3806,12 @@
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
"dev": true
},
"parseurl": {
"version": "1.3.1",
"from": "parseurl@>=1.3.0 <1.4.0",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz",
"dev": true
},
"path-browserify": {
"version": "0.0.0",
"from": "path-browserify@0.0.0",
@ -3611,6 +3835,12 @@
"resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
"dev": true
},
"path-parse": {
"version": "1.0.5",
"from": "path-parse@>=1.0.5 <2.0.0",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
"dev": true
},
"path-type": {
"version": "1.1.0",
"from": "path-type@>=1.0.0 <2.0.0",
@ -3888,6 +4118,26 @@
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz",
"dev": true
},
"raw-body": {
"version": "2.1.7",
"from": "raw-body@>=2.1.5 <2.2.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz",
"dev": true,
"dependencies": {
"bytes": {
"version": "2.4.0",
"from": "bytes@2.4.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
"dev": true
},
"iconv-lite": {
"version": "0.4.13",
"from": "iconv-lite@0.4.13",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
"dev": true
}
}
},
"read-pkg": {
"version": "1.1.0",
"from": "read-pkg@>=1.0.0 <2.0.0",
@ -3916,6 +4166,20 @@
"resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz",
"dev": true
},
"rechoir": {
"version": "0.6.2",
"from": "rechoir@>=0.6.2 <0.7.0",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
"dev": true,
"dependencies": {
"resolve": {
"version": "1.3.2",
"from": "resolve@>=1.1.6 <2.0.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.2.tgz",
"dev": true
}
}
},
"regex-cache": {
"version": "0.4.3",
"from": "regex-cache@>=0.4.2 <0.5.0",
@ -4068,9 +4332,9 @@
"dev": true
},
"shelljs": {
"version": "0.6.1",
"from": "shelljs@>=0.6.0 <0.7.0",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz",
"version": "0.7.7",
"from": "shelljs@>=0.7.5 <0.8.0",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz",
"dev": true
},
"sigmund": {
@ -4138,6 +4402,12 @@
}
}
},
"statuses": {
"version": "1.3.1",
"from": "statuses@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
"dev": true
},
"stream-browserify": {
"version": "2.0.1",
"from": "stream-browserify@>=2.0.1 <3.0.0",
@ -4178,9 +4448,9 @@
"dev": true
},
"strip-json-comments": {
"version": "1.0.4",
"from": "strip-json-comments@>=1.0.1 <1.1.0",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
"version": "2.0.1",
"from": "strip-json-comments@>=2.0.1 <2.1.0",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"dev": true
},
"supports-color": {
@ -4250,15 +4520,15 @@
"dev": true
},
"tiny-lr": {
"version": "0.0.4",
"from": "tiny-lr@0.0.4",
"resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.0.4.tgz",
"version": "0.2.1",
"from": "tiny-lr@>=0.2.1 <0.3.0",
"resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz",
"dev": true,
"dependencies": {
"qs": {
"version": "0.5.6",
"from": "qs@>=0.5.2 <0.6.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz",
"version": "5.1.0",
"from": "qs@>=5.1.0 <5.2.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz",
"dev": true
}
}
@ -4325,6 +4595,12 @@
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
"dev": true
},
"type-is": {
"version": "1.6.14",
"from": "type-is@>=1.6.10 <1.7.0",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.14.tgz",
"dev": true
},
"typedarray": {
"version": "0.0.6",
"from": "typedarray@>=0.0.6 <0.0.7",
@ -4369,6 +4645,12 @@
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
"dev": true
},
"unpipe": {
"version": "1.0.0",
"from": "unpipe@1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"dev": true
},
"url": {
"version": "0.11.0",
"from": "url@>=0.11.0 <0.12.0",
@ -4476,6 +4758,18 @@
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.5.tgz",
"dev": true
},
"websocket-driver": {
"version": "0.6.5",
"from": "websocket-driver@>=0.5.1",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
"dev": true
},
"websocket-extensions": {
"version": "0.1.1",
"from": "websocket-extensions@>=0.1.1",
"resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz",
"dev": true
},
"which": {
"version": "1.0.9",
"from": "which@>=1.0.5 <1.1.0",

View File

@ -1,7 +1,7 @@
{
"name": "Brackets",
"version": "1.9.0-0",
"apiVersion": "1.9.0",
"version": "1.10.0-0",
"apiVersion": "1.10.0",
"homepage": "http://brackets.io",
"issues": {
"url": "http://github.com/adobe/brackets/issues"
@ -35,8 +35,8 @@
"grunt-cli": "0.1.9",
"phantomjs": "1.9.18",
"grunt-lib-phantomjs": "0.3.0",
"grunt-eslint": "18.1.0",
"grunt-contrib-watch": "0.4.3",
"grunt-eslint": "19.0.0",
"grunt-contrib-watch": "1.0.0",
"grunt-contrib-jasmine": "0.4.2",
"grunt-template-jasmine-requirejs": "0.1.0",
"grunt-contrib-cssmin": "0.6.0",
@ -68,4 +68,4 @@
"url": "https://github.com/adobe/brackets/blob/master/LICENSE"
}
]
}
}

View File

@ -14,7 +14,7 @@
<h2>まずはこのガイドからスタート</h2>
<!--
MADE WITH <3 AND JAVASCRIPT
<3 JAVASCRIPT で作成
-->
<p>
@ -22,7 +22,7 @@
</p>
<!--
WHAT IS BRACKETS?
Brackets とは何ですか?
-->
<p>
<em>Brackets は、新しいタイプのエディターです。</em>
@ -30,7 +30,7 @@
</p>
<!--
GET STARTED WITH YOUR OWN FILES
自分のファイルで始めましょう
-->
<h3>Brackets のプロジェクト</h3>
@ -45,7 +45,7 @@
</samp>
<!--
THE RELATIONSHIP BETWEEN HTML, CSS AND JAVASCRIPT
HTML、CSS と JavaScript との関係
-->
<h3>CSS と JavaScript のクイック編集</h3>
<p>
@ -71,7 +71,7 @@
</p>
<!--
LIVE PREVIEW
ライブプレビュー
-->
<h3>HTML および CSS の編集結果をブラウザーでライブプレビュー</h3>
<p>
@ -114,7 +114,7 @@
</p>
<!--
LET US KNOW WHAT YOU THINK
ご意見をお聞かせください
-->
<h2>Brackets プロジェクトに参加</h2>
<p>
@ -155,4 +155,4 @@
[:::::::::::::: ::::::::::::::]
[[[[[[[[[[[[[[[ ]]]]]]]]]]]]]]]
-->
-->

View File

@ -0,0 +1,193 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>BRACKETS 入门</title>
<meta name="description" content="Brackets 互动式入门指引。">
<link rel="stylesheet" href="main.css">
</head>
<body>
<h1>BRACKETS 入门</h1>
<h2>让我为你好好介绍!</h2>
<!--
<3 JAVASCRIPT 写出来的
-->
<p>
欢迎使用 Brackets这是个很懂网页设计的现代化开放原始码程式编辑器。
轻巧又不失威力,整合多项视觉化的编辑功能,在需要时提供您适当的协助。
</p>
<!--
BRACKETS 是什麽?
-->
<p>
<em>Brackets 与众不同。</em>
Brackets 提供「快速编辑」、「即时预览」等别的编辑器没有的独家功能。
而且 Brackets 是用 JavaScript, HTML 及 CSS 写出来的。这代表大多数使用 Brackets 的人都有能力修改及扩充它。
事实上Brackets 本身就是我们用 Brackets 一天天打造出来的。
如果您想学会如何使用这些功能,请继续看下去。
</p>
<!--
用您自己的档案开始上手
-->
<h3>Brackets 中的「专案」</h3>
<p>
只要开启包含您程式码的资料夹,就能使用 Brackets 来编辑。
Brackets 会将目前开启的资料夹视为一个「专案」,「程式提示」、「即时预览」及「快速编辑」等功能都只会参考到专案裡的档案。
</p>
<samp>
要是您已经准备好关掉这个范例专案,开始编辑自已的程式,可以使用左边侧栏的下拉式选单切换资料夹。
现在应该是选到「Getting Started」也就是您看的这份文件所在的资料夹。
按一下下拉式选单,点选「开启资料夹…」选项,就能开启您自已的资料夹。
之后您也可以透过同样的下拉式选单切回开启过的资料夹,包含这个范例专案。
</samp>
<!--
HTML, CSS 及 JAVASCRIPT 之间的关系
-->
<h3>CSS 及 JavaScript 快速编辑</h3>
<p>
别再因为不断切换档案而一直分神失焦了。编辑 HTML 时,按下 <kbd>Cmd/Ctrl + E</kbd>
快速键就地开启编辑器,秀出所有相关的 CSS 规则。
调好 CSS 样式后按 <kbd>ESC</kbd> 马上就能回到 HTML 继续编辑。
此外,也可以放手让那些 CSS 规则一直开在 HTML 编辑器裡。
只要在快速编辑器的范围外按下 <kbd>ESC</kbd> 键,就能关掉所有快速编辑器。
快速编辑也能找到定义在 LESS 及 SCSS 档案中的规则,就算是巢状规则也没问题。
</p>
<samp>
想亲身体验吗? 把游标移到上面的 <!-- <samp> --> 标籤中,按下 <kbd>Cmd/Ctrl + E</kbd>
您应该就会看到 CSS 快速编辑器出现在上方,显示出所有套用到的 CSS 规则。
快速编辑功能也支援 class 及 id 属性。搭配 LESS 或 SCSS 档嘛会通喔。
您也可以透过这个方式新增规则。在上方随便一个 <!-- <p> --> 标籤上点一下,按 <kbd>Cmd/Ctrl + E</kbd>
可以看到它上面并没有任何 CSS 规则但您可以按一下「新增规则」按钮就会新增 <!-- <p> --> 规则。
</samp>
<a href="screenshots/quick-edit.png">
<img alt="使用 CSS 快速编辑的画面撷图" src="screenshots/quick-edit.png" />
</a>
<p>
您也能使用相同的快速键编辑其他东西,例如 JavaScript 函式、CSS 色彩、CSS 动画计时函式等,持续增加中。
</p>
<p>
目前还不能在快速编辑器中巢状开启其他快速编辑器,只有游标在主编辑器时才能开快速编辑功能。
</p>
<!--
即时预览
-->
<h3>在浏览器裡即时预览 HTML 及 CSS 变更</h3>
<p>
有一种舞叫做「存档再重新载入探戈」,我们跳了好多年,您听过吗?
就是在编辑器裡改一改东西,储存好,马上再切过去浏览器,按「重新整理」后才能真正的看到结果,超鸟的!
用 Brackets您永远不必再这麽「跳」。
</p>
<p>
Brackets 会跟您本机的浏览器<em>即时连线</em>,在您修改的同时将 HTML 及 CSS 内容更新过去!
说不定活在 21 世纪的您已经用浏览器提供的开发者工具做过类似的事了。
但是用 Brackets您不用再手动把总算是会动的程式複製贴回编辑器。
您的程式虽然是跑在浏览器上,但是所有的血与肉都还是在编辑器裡啊!
</p>
<h3>即时突显 HTML 元素及 CSS 规则</h3>
<p>
Brackets 让您更容易看到 HTML 及 CSS 的修改会对页面造成什麽影响。
当游标停在 CSS 规则上时Brackets 会在浏览器裡将所有会受影响的元素突显出来。
编辑 HTML 档案时Brackets 也会在浏览器中突显对应的 HTML 元素。
</p>
<samp>
如果您安装了 Google Chrome马上就可以试看看。
按一下 Brackets 视窗右上角的闪电图示,或是按 <kbd>Cmd/Ctrl + Alt + P</kbd>
当即时预览功能在 HTML 档案上启用后,所有连结到的 CSS 档案也都可以马上编辑马上生效。
Brackets 与您的浏览器建立连线时,图示会由灰转金。
就是现在,把游标移到上面的 <!-- <img> --> 标籤。注意看 Chrome 在图片上显示的蓝色框。
接下来,按 <kbd>Cmd/Ctrl + E</kbd> 开启相关的 CSS 规则定义。
试著将框线 (border) 值由 10px 改成 20px或将背景色 (background-color) 由透明 "transparent" 改成 "hotpink"。
如果您把 Brackets 跟浏览器并排放好,就能看到所有异动都直接反应在浏览器上了。酷吧?!
</samp>
<p class="note">
目前 Brackets 只能即时预览 HTML 及 CSS。不过储存修改过的 JavaScript 档案时也会自动重新载入页面。
我们正在努力让即时预览功能支援 JavaScript。
此外,即时预览现在只能在 Google Chrome 上执行,我们希望将来能支援所有主流的浏览器。
</p>
<h3>快速检视</h3>
<p>
为了那些记不得色彩十六进位值或是 RGB 值的人Brackets 能快速又简单的让您看见色彩的真相。
不管在 CSS 或 HTML 中只要将滑鼠游标移到任何色彩值或是渐变色上Brackets 就会自动显示预览。
对图片也同样有用,在 Brackets 裡将滑鼠游标移到图片连结上,就会自动显示预览缩图。
</p>
<samp>
自已试试快速检视,只要将游标移到这份文件最上方的 <!-- <body> --> 标籤上,按下 <kbd>Cmd/Ctrl + E</kbd>
开启 CSS 快速编辑器,将滑鼠游标移到 CSS 上的任何一个色彩值上就能看到。
想要预览渐变色,您也可以在 <!-- <html> --> 标籤上开启 CSS 快速编辑器,移到随便一个背景图片 (background-image) 值就能看到。
要试图片预览,则是将游标移到前几段提到的画面撷图上就能看到。
</samp>
<h3>还不够吗? 安装扩充功能吧!</h3>
<p>
除了 Brackets 内建的这些好物外,我们那深具规模,且日益状大的开发者社群已经写出了数百个扩充功能。
如果您觉得 Brackets 少了什麽,说不定早就有人写好扩充功能了。
点一下 <strong>档案 > 扩充功能管理员...</strong>,再点一下「可使用」页籤,就能浏览或搜寻扩充功能清单。
一旦找到想要的扩充功能,按一下后面的「安装」按钮就可以了。
</p>
<!--
跟我们说说您的想法
-->
<h2>一起参与</h2>
<p>
Brackets 专案是开放原始码的。世界各地的网页开发者贡献一己之力,只为打造出更好的程式编辑器。
也有不少人正在开发扩充功能,让 Brackets 更强大。
告诉我们您的想法,分享您的构想,或是直接为本专案做点事吧。
</p>
<ul>
<li><a href="http://brackets.io">Brackets.io</a></li>
<li><a href="http://blog.brackets.io">Brackets 开发团队网志</a></li>
<li><a href="https://github.com/adobe/brackets">GitHub 上的 Brackets</a></li>
<li><a href="https://brackets-registry.aboutweb.com">Brackets 扩充功能登录库</a></li>
<li><a href="https://github.com/adobe/brackets/wiki">Brackets 维基</a></li>
<li><a href="https://groups.google.com/forum/#!forum/brackets-dev">Brackets 开发者邮寄清单</a></li>
<li><a href="https://twitter.com/brackets">Twitter 上的 @brackets</a></li>
<li><a href="http://webchat.freenode.net/?channels=brackets&uio=d4">Freenode 的 #brackets</a> IRC 频道上与 Brackets 开发者聊天</li>
</ul>
</body>
</html>
<!--
[[[[[[[[[[[[[[[ ]]]]]]]]]]]]]]]
[:::::::::::::: ::::::::::::::]
[:::::::::::::: ::::::::::::::]
[::::::[[[[[[[: :]]]]]]]::::::]
[:::::[ ]:::::]
[:::::[ ]:::::]
[:::::[ ]:::::]
[:::::[ ]:::::]
[:::::[ CODE THE WEB ]:::::]
[:::::[ http://brackets.io ]:::::]
[:::::[ ]:::::]
[:::::[ ]:::::]
[:::::[ ]:::::]
[:::::[ ]:::::]
[::::::[[[[[[[: :]]]]]]]::::::]
[:::::::::::::: ::::::::::::::]
[:::::::::::::: ::::::::::::::]
[[[[[[[[[[[[[[[ ]]]]]]]]]]]]]]]
-->

View File

@ -0,0 +1,60 @@
html {
background: #e6e9e9;
background-image: linear-gradient(270deg, rgb(230, 233, 233) 0%, rgb(216, 221, 221) 100%);
-webkit-font-smoothing: antialiased;
}
body {
background: #fff;
box-shadow: 0 0 2px rgba(0, 0, 0, 0.06);
color: #545454;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 1.5;
margin: 0 auto;
max-width: 800px;
padding: 2em 2em 4em;
}
h1, h2, h3, h4, h5, h6 {
color: #222;
font-weight: 700;
line-height: 1.3;
}
h2 {
margin-top: 1.3em;
}
a {
color: #0083e8;
}
b, strong {
font-weight: 700;
}
samp {
display: none;
}
img {
animation: colorize 2s cubic-bezier(0, 0, .78, .36) 1;
background: transparent;
border: 10px solid rgba(0, 0, 0, 0.12);
border-radius: 4px;
display: block;
margin: 1.3em auto;
max-width: 95%;
}
@keyframes colorize {
0% {
-webkit-filter: grayscale(100%);
filter: grayscale(100%);
}
100% {
-webkit-filter: grayscale(0%);
filter: grayscale(0%);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

View File

@ -131,7 +131,7 @@ define(function RemoteAgent(require, exports, module) {
_stopKeepAliveInterval();
// inject RemoteFunctions
var command = "window._LD=" + RemoteFunctions + "(" + LiveDevelopment.config.experimental + "," + PreferencesManager.get("livedev.wsPort") + ");";
var command = "window._LD=" + RemoteFunctions + "(" + JSON.stringify(LiveDevelopment.config) + "," + PreferencesManager.get("livedev.wsPort") + ");";
Inspector.Runtime.evaluate(command, function onEvaluate(response) {
if (response.error || response.wasThrown) {

View File

@ -30,10 +30,29 @@
* modules should define a single function that returns an object of all
* exported functions.
*/
function RemoteFunctions(experimental, remoteWSPort) {
function RemoteFunctions(config, remoteWSPort) {
"use strict";
var experimental;
if (!config) {
experimental = false;
} else {
experimental = config.experimental;
}
var lastKeepAliveTime = Date.now();
var req, timeout;
var animateHighlight = function (time) {
if(req) {
window.cancelAnimationFrame(req);
window.clearTimeout(timeout);
}
req = window.requestAnimationFrame(redrawHighlights);
timeout = setTimeout(function () {
window.cancelAnimationFrame(req);
req = null;
}, time * 1000);
};
/**
* @type {DOMEditHandler}
@ -250,56 +269,209 @@ function RemoteFunctions(experimental, remoteWSPort) {
}
return false;
},
_makeHighlightDiv: function (element, doAnimation) {
var elementBounds = element.getBoundingClientRect(),
highlight = window.document.createElement("div"),
styles = window.getComputedStyle(element);
elementStyling = window.getComputedStyle(element),
transitionDuration = parseFloat(elementStyling.getPropertyValue('transition-duration')),
animationDuration = parseFloat(elementStyling.getPropertyValue('animation-duration'));
if (transitionDuration) {
animateHighlight(transitionDuration);
}
if (animationDuration) {
animateHighlight(animationDuration);
}
// Don't highlight elements with 0 width & height
if (elementBounds.width === 0 && elementBounds.height === 0) {
return;
}
var realElBorder = {
right: elementStyling.getPropertyValue('border-right-width'),
left: elementStyling.getPropertyValue('border-left-width'),
top: elementStyling.getPropertyValue('border-top-width'),
bottom: elementStyling.getPropertyValue('border-bottom-width')
};
var borderBox = elementStyling.boxSizing === 'border-box';
var innerWidth = parseFloat(elementStyling.width),
innerHeight = parseFloat(elementStyling.height),
outerHeight = innerHeight,
outerWidth = innerWidth;
if (!borderBox) {
innerWidth += parseFloat(elementStyling.paddingLeft) + parseFloat(elementStyling.paddingRight);
innerHeight += parseFloat(elementStyling.paddingTop) + parseFloat(elementStyling.paddingBottom);
outerWidth = innerWidth + parseFloat(realElBorder.right) +
parseFloat(realElBorder.left),
outerHeight = innerHeight + parseFloat(realElBorder.bottom) + parseFloat(realElBorder.top);
}
var visualisations = {
horizontal: "left, right",
vertical: "top, bottom"
};
var drawPaddingRect = function(side) {
var elStyling = {};
if (visualisations.horizontal.indexOf(side) >= 0) {
elStyling['width'] = elementStyling.getPropertyValue('padding-' + side);
elStyling['height'] = innerHeight + "px";
elStyling['top'] = 0;
if (borderBox) {
elStyling['height'] = innerHeight - parseFloat(realElBorder.top) - parseFloat(realElBorder.bottom) + "px";
}
} else {
elStyling['height'] = elementStyling.getPropertyValue('padding-' + side);
elStyling['width'] = innerWidth + "px";
elStyling['left'] = 0;
if (borderBox) {
elStyling['width'] = innerWidth - parseFloat(realElBorder.left) - parseFloat(realElBorder.right) + "px";
}
}
elStyling[side] = 0;
elStyling['position'] = 'absolute';
return elStyling;
};
var drawMarginRect = function(side) {
var elStyling = {};
var margin = [];
margin['right'] = parseFloat(elementStyling.getPropertyValue('margin-right'));
margin['top'] = parseFloat(elementStyling.getPropertyValue('margin-top'));
margin['bottom'] = parseFloat(elementStyling.getPropertyValue('margin-bottom'));
margin['left'] = parseFloat(elementStyling.getPropertyValue('margin-left'));
if(visualisations['horizontal'].indexOf(side) >= 0) {
elStyling['width'] = elementStyling.getPropertyValue('margin-' + side);
elStyling['height'] = outerHeight + margin['top'] + margin['bottom'] + "px";
elStyling['top'] = "-" + (margin['top'] + parseFloat(realElBorder.top)) + "px";
} else {
elStyling['height'] = elementStyling.getPropertyValue('margin-' + side);
elStyling['width'] = outerWidth + "px";
elStyling['left'] = "-" + realElBorder.left;
}
elStyling[side] = "-" + (margin[side] + parseFloat(realElBorder[side])) + "px";
elStyling['position'] = 'absolute';
return elStyling;
};
var setVisibility = function (el) {
if (
!config.remoteHighlight.showPaddingMargin ||
parseInt(el.height, 10) <= 0 ||
parseInt(el.width, 10) <= 0
) {
el.display = 'none';
} else {
el.display = 'block';
}
};
var mainBoxStyles = config.remoteHighlight.stylesToSet;
var paddingVisualisations = [
drawPaddingRect('top'),
drawPaddingRect('right'),
drawPaddingRect('bottom'),
drawPaddingRect('left')
];
var marginVisualisations = [
drawMarginRect('top'),
drawMarginRect('right'),
drawMarginRect('bottom'),
drawMarginRect('left')
];
var setupVisualisations = function (arr, config) {
var i;
for (i = 0; i < arr.length; i++) {
setVisibility(arr[i]);
// Applies to every visualisationElement (padding or margin div)
arr[i]["transform"] = "none";
var el = window.document.createElement("div"),
styles = Object.assign(
{},
config,
arr[i]
);
_setStyleValues(styles, el.style);
highlight.appendChild(el);
}
};
setupVisualisations(
marginVisualisations,
config.remoteHighlight.marginStyling
);
setupVisualisations(
paddingVisualisations,
config.remoteHighlight.paddingStyling
);
highlight.className = HIGHLIGHT_CLASSNAME;
var offset = _screenOffset(element);
var el = element,
offsetLeft = 0,
offsetTop = 0;
// Probably the easiest way to get elements position without including transform
do {
offsetLeft += el.offsetLeft;
offsetTop += el.offsetTop;
el = el.offsetParent;
} while(el);
var stylesToSet = {
"left": offset.left + "px",
"top": offset.top + "px",
"width": elementBounds.width + "px",
"height": elementBounds.height + "px",
"left": offsetLeft + "px",
"top": offsetTop + "px",
"width": innerWidth + "px",
"height": innerHeight + "px",
"z-index": 2000000,
"margin": 0,
"padding": 0,
"position": "absolute",
"pointer-events": "none",
"border-top-left-radius": styles.borderTopLeftRadius,
"border-top-right-radius": styles.borderTopRightRadius,
"border-bottom-left-radius": styles.borderBottomLeftRadius,
"border-bottom-right-radius": styles.borderBottomRightRadius,
"border-style": "solid",
"border-width": "1px",
"border-color": "#00a2ff",
"box-shadow": "0 0 1px #fff",
"box-sizing": "border-box"
"box-sizing": elementStyling.getPropertyValue('box-sizing'),
"border-right": elementStyling.getPropertyValue('border-right'),
"border-left": elementStyling.getPropertyValue('border-left'),
"border-top": elementStyling.getPropertyValue('border-top'),
"border-bottom": elementStyling.getPropertyValue('border-bottom'),
"transform": elementStyling.getPropertyValue('transform'),
"transform-origin": elementStyling.getPropertyValue('transform-origin'),
"border-color": config.remoteHighlight.borderColor
};
var mergedStyles = Object.assign({}, stylesToSet, config.remoteHighlight.stylesToSet);
var animateStartValues = {
"background-color": "rgba(0, 162, 255, 0.5)",
"opacity": 0
};
var animateStartValues = config.remoteHighlight.animateStartValue;
var animateEndValues = {
"background-color": "rgba(0, 162, 255, 0)",
"opacity": 1
};
var animateEndValues = config.remoteHighlight.animateEndValue;
var transitionValues = {
"-webkit-transition-property": "opacity, background-color",
"-webkit-transition-duration": "300ms, 2.3s",
"transition-property": "opacity, background-color",
"transition-property": "opacity, background-color, transform",
"transition-duration": "300ms, 2.3s"
};
@ -311,7 +483,7 @@ function RemoteFunctions(experimental, remoteWSPort) {
}
}
_setStyleValues(stylesToSet, highlight.style);
_setStyleValues(mergedStyles, highlight.style);
_setStyleValues(
doAnimation ? animateStartValues : animateEndValues,
highlight.style
@ -842,6 +1014,11 @@ function RemoteFunctions(experimental, remoteWSPort) {
function getSimpleDOM() {
return JSON.stringify(_domElementToJSON(window.document.documentElement));
}
function updateConfig(newConfig) {
config = JSON.parse(newConfig);
return JSON.stringify(config);
}
// init
_editHandler = new DOMEditHandler(window.document);
@ -871,10 +1048,10 @@ function RemoteFunctions(experimental, remoteWSPort) {
_ws.onopen = function () {
window.document.addEventListener("click", onDocumentClick);
};
_ws.onmessage = function (evt) {
};
_ws.onclose = function () {
// websocket is closed
window.document.removeEventListener("click", onDocumentClick);
@ -894,6 +1071,7 @@ function RemoteFunctions(experimental, remoteWSPort) {
"highlightRule" : highlightRule,
"redrawHighlights" : redrawHighlights,
"applyDOMEdits" : applyDOMEdits,
"getSimpleDOM" : getSimpleDOM
"getSimpleDOM" : getSimpleDOM,
"updateConfig" : updateConfig
};
}

View File

@ -79,6 +79,31 @@ define(function main(require, exports, module) {
description: Strings.DESCRIPTION_LIVE_DEV_MULTIBROWSER
});
// "livedev.remoteHighlight" preference
var PREF_REMOTEHIGHLIGHT = "remoteHighlight";
var remoteHighlightPref = prefs.definePreference(PREF_REMOTEHIGHLIGHT, "object", {
animateStartValue: {
"background-color": "rgba(0, 162, 255, 0.5)",
"opacity": 0
},
animateEndValue: {
"background-color": "rgba(0, 162, 255, 0)",
"opacity": 0.6
},
"paddingStyling": {
"border-width": "1px",
"border-style": "dashed",
"border-color": "rgba(0, 162, 255, 0.5)"
},
"marginStyling": {
"background-color": "rgba(21, 165, 255, 0.58)"
},
"borderColor": "rgba(21, 165, 255, 0.85)",
"showPaddingMargin": true
}, {
description: Strings.DESCRIPTION_LIVE_DEV_HIGHLIGHT_SETTINGS
});
/** Toggles or sets the preference **/
function _togglePref(key, value) {
var val,
@ -302,6 +327,7 @@ define(function main(require, exports, module) {
/** Initialize LiveDevelopment */
AppInit.appReady(function () {
params.parse();
config.remoteHighlight = prefs.get(PREF_REMOTEHIGHLIGHT);
Inspector.init(config);
LiveDevelopment.init(config);
@ -353,6 +379,15 @@ define(function main(require, exports, module) {
_setImplementation(prefs.get(PREF_MULTIBROWSER));
}
});
remoteHighlightPref
.on("change", function () {
config.remoteHighlight = prefs.get(PREF_REMOTEHIGHLIGHT);
if (LiveDevImpl && LiveDevImpl.status >= LiveDevImpl.STATUS_ACTIVE) {
LiveDevImpl.agents.remote.call("updateConfig",JSON.stringify(config));
}
});
});

View File

@ -23,8 +23,8 @@
"healthDataServerURL": "https://healthdev.brackets.io/healthDataLog"
},
"name": "Brackets",
"version": "1.9.0-0",
"apiVersion": "1.9.0",
"version": "1.10.0-0",
"apiVersion": "1.10.0",
"homepage": "http://brackets.io",
"issues": {
"url": "http://github.com/adobe/brackets/issues"
@ -58,8 +58,8 @@
"grunt-cli": "0.1.9",
"phantomjs": "1.9.18",
"grunt-lib-phantomjs": "0.3.0",
"grunt-eslint": "18.1.0",
"grunt-contrib-watch": "0.4.3",
"grunt-eslint": "19.0.0",
"grunt-contrib-watch": "1.0.0",
"grunt-contrib-jasmine": "0.4.2",
"grunt-template-jasmine-requirejs": "0.1.0",
"grunt-contrib-cssmin": "0.6.0",

View File

@ -758,6 +758,25 @@ define(function (require, exports, module) {
return this.file instanceof InMemoryFile;
};
/**
* Reloads the document from FileSystem
* @return {promise} - to check if reload was successful or not
*/
Document.prototype.reload = function () {
var $deferred = $.Deferred();
var self = this;
FileUtils.readAsText(this.file)
.done(function (text, readTimestamp) {
self.refreshText(text, readTimestamp);
$deferred.resolve();
})
.fail(function (error) {
console.log("Error reloading contents of " + self.file.fullPath, error);
$deferred.reject();
});
return $deferred.promise();
};
// We dispatch events from the module level, and the instance level. Instance events are wired up
// in the Document constructor.
EventDispatcher.makeEventDispatcher(exports);

View File

@ -322,6 +322,22 @@ define(function (require, exports, module) {
});
var file = FileSystem.getFileForPath(fullPath);
if (options && options.encoding) {
file._encoding = options.encoding;
} else {
var projectRoot = ProjectManager.getProjectRoot(),
context = {
location : {
scope: "user",
layer: "project",
layerID: projectRoot.fullPath
}
};
var encoding = PreferencesManager.getViewState("encoding", context);
if (encoding[fullPath]) {
file._encoding = encoding[fullPath];
}
}
MainViewManager._open(paneId, file, options)
.done(function () {
result.resolve(file);
@ -451,7 +467,7 @@ define(function (require, exports, module) {
_doOpenWithOptionalPath(fileInfo.path, silent, paneId, commandData && commandData.options)
.done(function (file) {
HealthLogger.fileOpened(file._path);
HealthLogger.fileOpened(file._path, false, file._encoding);
if (!commandData || !commandData.options || !commandData.options.noPaneActivate) {
MainViewManager.setActivePaneId(paneId);
}
@ -626,10 +642,8 @@ define(function (require, exports, module) {
// If a file is currently selected in the tree, put it next to it.
// If a directory is currently selected in the tree, put it in it.
// If an Untitled document is selected or nothing is selected in the tree, put it at the root of the project.
// (Note: 'selected' may be an item that's selected in the workingset and not the tree; but in that case
// ProjectManager.createNewItem() ignores the baseDir we give it and falls back to the project root on its own)
var baseDirEntry,
selected = ProjectManager.getSelectedItem();
selected = ProjectManager.getFileTreeContext();
if ((!selected) || (selected instanceof InMemoryFile)) {
selected = ProjectManager.getProjectRoot();
}
@ -902,7 +916,21 @@ define(function (require, exports, module) {
doc.isSaving = true; // mark that we're saving the document
// First, write document's current text to new file
if (doc.file._encoding && doc.file._encoding !== "UTF-8") {
var projectRoot = ProjectManager.getProjectRoot(),
context = {
location : {
scope: "user",
layer: "project",
layerID: projectRoot.fullPath
}
};
var encoding = PreferencesManager.getViewState("encoding", context);
encoding[path] = doc.file._encoding;
PreferencesManager.setViewState("encoding", encoding, context);
}
newFile = FileSystem.getFileForPath(path);
newFile._encoding = doc.file._encoding;
// Save as warns you when you're about to overwrite a file, so we
// explicitly allow "blind" writes to the filesystem in this case,

View File

@ -93,6 +93,7 @@ define(function (require, exports, module) {
Commands = require("command/Commands"),
PerfUtils = require("utils/PerfUtils"),
LanguageManager = require("language/LanguageManager"),
ProjectManager = require("project/ProjectManager"),
Strings = require("strings");
@ -419,7 +420,7 @@ define(function (require, exports, module) {
if (doc) {
result.resolve(doc.getText(), doc.diskTimestamp, checkLineEndings ? doc._lineEndings : null);
} else {
file.read(function (err, contents, stat) {
file.read(function (err, contents, encoding, stat) {
if (err) {
result.reject(err);
} else {
@ -498,6 +499,18 @@ define(function (require, exports, module) {
// via notifyFileDeleted
FileSyncManager.syncOpenDocuments(Strings.FILE_DELETED_TITLE);
var projectRoot = ProjectManager.getProjectRoot(),
context = {
location : {
scope: "user",
layer: "project",
layerID: projectRoot.fullPath
}
};
var encoding = PreferencesManager.getViewState("encoding", context);
delete encoding[fullPath];
PreferencesManager.setViewState("encoding", encoding, context);
if (!getOpenDocumentForPath(fullPath) &&
!MainViewManager.findInAllWorkingSets(fullPath).length) {
// For images not open in the workingset,

View File

@ -75,11 +75,13 @@ define(function (require, exports, module) {
TextRange = require("document/TextRange").TextRange,
TokenUtils = require("utils/TokenUtils"),
ValidationUtils = require("utils/ValidationUtils"),
HTMLUtils = require("language/HTMLUtils"),
ViewUtils = require("utils/ViewUtils"),
MainViewManager = require("view/MainViewManager"),
_ = require("thirdparty/lodash");
/** Editor preferences */
var CLOSE_BRACKETS = "closeBrackets",
CLOSE_TAGS = "closeTags",
DRAG_DROP = "dragDropText",
@ -96,7 +98,9 @@ define(function (require, exports, module) {
UPPERCASE_COLORS = "uppercaseColors",
USE_TAB_CHAR = "useTabChar",
WORD_WRAP = "wordWrap",
INDENT_LINE_COMMENT = "indentLineComment";
INDENT_LINE_COMMENT = "indentLineComment",
INPUT_STYLE = "inputStyle";
/**
* A list of gutter name and priorities currently registered for editors.
@ -137,6 +141,7 @@ define(function (require, exports, module) {
cmOptions[TAB_SIZE] = "tabSize";
cmOptions[USE_TAB_CHAR] = "indentWithTabs";
cmOptions[WORD_WRAP] = "lineWrapping";
cmOptions[INPUT_STYLE] = "inputStyle";
PreferencesManager.definePreference(CLOSE_BRACKETS, "boolean", true, {
description: Strings.DESCRIPTION_CLOSE_BRACKETS
@ -223,10 +228,12 @@ define(function (require, exports, module) {
PreferencesManager.definePreference(WORD_WRAP, "boolean", true, {
description: Strings.DESCRIPTION_WORD_WRAP
});
PreferencesManager.definePreference(INDENT_LINE_COMMENT, "boolean", false, {
description: Strings.DESCRIPTION_INDENT_LINE_COMMENT
});
PreferencesManager.definePreference(INPUT_STYLE, "string", "textarea", {
description: Strings.DESCRIPTION_INPUT_STYLE
});
var editorOptions = Object.keys(cmOptions);
@ -413,7 +420,7 @@ define(function (require, exports, module) {
highlightSelectionMatches : currentOptions[HIGHLIGHT_MATCHES],
indentUnit : currentOptions[USE_TAB_CHAR] ? currentOptions[TAB_SIZE] : currentOptions[SPACE_UNITS],
indentWithTabs : currentOptions[USE_TAB_CHAR],
inputStyle : "textarea", // the "contenteditable" mode used on mobiles could cause issues
inputStyle : currentOptions[INPUT_STYLE],
lineNumbers : currentOptions[SHOW_LINE_NUMBERS],
lineWiseCopyCut : currentOptions[LINEWISE_COPY_CUT],
lineWrapping : currentOptions[WORD_WRAP],
@ -1010,6 +1017,9 @@ define(function (require, exports, module) {
this._codeMirror.on("cursorActivity", function (instance) {
self.trigger("cursorActivity", self);
});
this._codeMirror.on("beforeSelectionChange", function (instance, selectionObj) {
self.trigger("beforeSelectionChange", selectionObj);
});
this._codeMirror.on("scroll", function (instance) {
// If this editor is visible, close all dropdowns on scroll.
// (We don't want to do this if we're just scrolling in a non-visible editor
@ -2203,6 +2213,19 @@ define(function (require, exports, module) {
isMixed = (outerMode.name !== startMode.name);
if (isMixed) {
// This is the magic code to let the code view know that we are in 'css' context
// if the CodeMirror outermode is 'htmlmixed' and we are in 'style' attributes
// value context. This has to be done as CodeMirror doesn't yet think this as 'css'
// This magic is executed only when user is having a cursor and not selection
// We will enable selection handling one we figure a way out to handle mixed scope selection
if (outerMode.name === 'htmlmixed' && primarySel.start.line === primarySel.end.line && primarySel.start.ch === primarySel.end.ch) {
var tagInfo = HTMLUtils.getTagInfo(this, primarySel.start, true),
tokenType = tagInfo.position.tokenType;
if (tokenType === HTMLUtils.ATTR_VALUE && tagInfo.attr.name.toLowerCase() === 'style') {
return 'css';
}
}
// Shortcut the first check to avoid getModeAt(), which can be expensive
if (primarySel.start.line !== primarySel.end.line || primarySel.start.ch !== primarySel.end.ch) {
var endMode = TokenUtils.getModeAt(this._codeMirror, primarySel.end);
@ -2682,8 +2705,8 @@ define(function (require, exports, module) {
};
/**
* Sets lineCommentIndent option.
*
* Sets indentLineComment option.
* Affects any editors that share the same preference location.
* @param {boolean} value
* @param {string=} fullPath Path to file to get preference for
* @return {boolean} true if value was valid
@ -2694,7 +2717,7 @@ define(function (require, exports, module) {
};
/**
* Returns true if word wrap is enabled for the specified or current file
* Returns true if indentLineComment is enabled for the specified or current file
* @param {string=} fullPath Path to file to get preference for
* @return {boolean}
*/

View File

@ -297,6 +297,22 @@ define(function (require, exports, module) {
return false;
}
/**
* Return the column of the first non whitespace char in the given line.
*
* @private
* @param {!Document} doc
* @param {number} lineNum
* @returns {number} the column index or null
*/
function _firstNotWs(doc, lineNum) {
var text = doc.getLine(lineNum);
if (text === null || text === undefined) {
return 0;
}
return text.search(/\S|$/);
}
/**
* Generates an edit that adds or removes block-comment tokens to the selection, preserving selection
@ -320,12 +336,13 @@ define(function (require, exports, module) {
* The selection to block comment/uncomment.
* @param {?Array.<{!{start:{line:number, ch:number}, end:{line:number, ch:number}, reversed:boolean, primary:boolean}}>} selectionsToTrack
* An array of selections that should be tracked through this edit.
* @param {String} command The command callee. It cans be "line" or "block".
* @return {{edit: {text: string, start:{line: number, ch: number}, end:?{line: number, ch: number}}|Array.<{text: string, start:{line: number, ch: number}, end:?{line: number, ch: number}}>,
* selection: {start:{line:number, ch:number}, end:{line:number, ch:number}, primary:boolean, reversed: boolean, isBeforeEdit: boolean}>}|
* Array.<{start:{line:number, ch:number}, end:{line:number, ch:number}, primary:boolean, reversed: boolean, isBeforeEdit: boolean}>}}
* An edit description suitable for including in the edits array passed to `Document.doMultipleEdits()`.
*/
function _getBlockCommentPrefixSuffixEdit(editor, prefix, suffix, linePrefixes, sel, selectionsToTrack) {
function _getBlockCommentPrefixSuffixEdit(editor, prefix, suffix, linePrefixes, sel, selectionsToTrack, command) {
var doc = editor.document,
ctx = TokenUtils.getInitialContext(editor._codeMirror, {line: sel.start.line, ch: sel.start.ch}),
selEndIndex = editor.indexFromPos(sel.end),
@ -345,6 +362,12 @@ define(function (require, exports, module) {
var searchCtx, atSuffix, suffixEnd, initialPos, endLine;
var indentLineComment = Editor.getIndentLineComment();
function isIndentLineCommand() {
return indentLineComment && command === "line";
}
if (!selectionsToTrack) {
// Track the original selection.
selectionsToTrack = [_.cloneDeep(sel)];
@ -467,12 +490,31 @@ define(function (require, exports, module) {
// Comment out - add the suffix to the start and the prefix to the end.
if (canComment) {
var completeLineSel = sel.start.ch === 0 && sel.end.ch === 0 && sel.start.line < sel.end.line;
var startCh = _firstNotWs(doc, sel.start.line);
if (completeLineSel) {
editGroup.push({text: suffix + "\n", start: sel.end});
editGroup.push({text: prefix + "\n", start: sel.start});
if (isIndentLineCommand()) {
var endCh = _firstNotWs(doc, sel.end.line - 1);
var useTabChar = Editor.getUseTabChar(editor.document.file.fullPath);
var indentChar = useTabChar ? "\t" : " ";
editGroup.push({
text: _.repeat(indentChar, endCh) + suffix + "\n",
start: {line: sel.end.line, ch: 0}
});
editGroup.push({
text: prefix + "\n" + _.repeat(indentChar, startCh),
start: {line: sel.start.line, ch: startCh}
});
} else {
editGroup.push({text: suffix + "\n", start: sel.end});
editGroup.push({text: prefix + "\n", start: sel.start});
}
} else {
editGroup.push({text: suffix, start: sel.end});
editGroup.push({text: prefix, start: sel.start});
if (isIndentLineCommand()) {
editGroup.push({text: prefix, start: { line: sel.start.line, ch: startCh }});
} else {
editGroup.push({text: prefix, start: sel.start});
}
}
// Correct the tracked selections. We can't just use the default selection fixup,
@ -497,7 +539,7 @@ define(function (require, exports, module) {
if (completeLineSel) {
// Just move the line down.
pos.line++;
} else if (pos.line === sel.start.line) {
} else if (pos.line === sel.start.line && !(isIndentLineCommand() && pos.ch < startCh)) {
pos.ch += prefix.length;
}
}
@ -513,16 +555,21 @@ define(function (require, exports, module) {
// If both are found we assume that a complete line selection comment added new lines, so we remove them.
var line = doc.getLine(prefixPos.line).trim(),
prefixAtStart = prefixPos.ch === 0 && prefix.length === line.length,
suffixAtStart = false;
prefixIndented = indentLineComment && prefix.length === line.length,
suffixAtStart = false,
suffixIndented = false;
if (suffixPos) {
line = doc.getLine(suffixPos.line).trim();
suffixAtStart = suffixPos.ch === 0 && suffix.length === line.length;
suffixIndented = indentLineComment && suffix.length === line.length;
}
// Remove the suffix if there is one
if (suffixPos) {
if (prefixAtStart && suffixAtStart) {
if (suffixIndented) {
editGroup.push({text: "", start: {line: suffixPos.line, ch: 0}, end: {line: suffixPos.line + 1, ch: 0}});
} else if (prefixAtStart && suffixAtStart) {
editGroup.push({text: "", start: suffixPos, end: {line: suffixPos.line + 1, ch: 0}});
} else {
editGroup.push({text: "", start: suffixPos, end: {line: suffixPos.line, ch: suffixPos.ch + suffix.length}});
@ -530,7 +577,9 @@ define(function (require, exports, module) {
}
// Remove the prefix
if (prefixAtStart && suffixAtStart) {
if (prefixIndented) {
editGroup.push({text: "", start: {line: prefixPos.line, ch: 0}, end: {line: prefixPos.line + 1, ch: 0}});
} else if (prefixAtStart && suffixAtStart) {
editGroup.push({text: "", start: prefixPos, end: {line: prefixPos.line + 1, ch: 0}});
} else {
editGroup.push({text: "", start: prefixPos, end: {line: prefixPos.line, ch: prefixPos.ch + prefix.length}});
@ -566,12 +615,13 @@ define(function (require, exports, module) {
* lineSel A line selection as returned from `Editor.convertToLineSelections()`. `selectionForEdit` is the selection to perform
* the line comment operation on, and `selectionsToTrack` are a set of selections associated with this line that need to be
* tracked through the edit.
* @param {String} command The command callee. It cans be "line" or "block".
* @return {{edit: {text: string, start:{line: number, ch: number}, end:?{line: number, ch: number}}|Array.<{text: string, start:{line: number, ch: number}, end:?{line: number, ch: number}}>,
* selection: {start:{line:number, ch:number}, end:{line:number, ch:number}, primary:boolean, reversed: boolean, isBeforeEdit: boolean}>}|
* Array.<{start:{line:number, ch:number}, end:{line:number, ch:number}, primary:boolean, reversed: boolean, isBeforeEdit: boolean}>}}
* An edit description suitable for including in the edits array passed to `Document.doMultipleEdits()`.
*/
function _getLineCommentPrefixSuffixEdit(editor, prefix, suffix, lineSel) {
function _getLineCommentPrefixSuffixEdit(editor, prefix, suffix, lineSel, command) {
var sel = lineSel.selectionForEdit;
// For one-line selections, we shrink the selection to exclude the trailing newline.
@ -581,7 +631,7 @@ define(function (require, exports, module) {
// Now just run the standard block comment code, but make sure to track any associated selections
// that were subsumed into this line selection.
return _getBlockCommentPrefixSuffixEdit(editor, prefix, suffix, [], sel, lineSel.selectionsToTrack);
return _getBlockCommentPrefixSuffixEdit(editor, prefix, suffix, [], sel, lineSel.selectionsToTrack, command);
}
/**
@ -591,12 +641,13 @@ define(function (require, exports, module) {
* @param {!Editor} editor The editor to edit within.
* @param {Array.<{start:{line:number, ch:number}, end:{line:number, ch:number}, primary:boolean, reversed: boolean, isBeforeEdit: boolean}>}
* selections The selections we want to line-comment.
* @param {String} command The command callee. It cans be "line" or "block".
* @return {Array.<{edit: {text: string, start:{line: number, ch: number}, end:?{line: number, ch: number}}|Array.<{text: string, start:{line: number, ch: number}, end:?{line: number, ch: number}}>,
* selection: {start:{line:number, ch:number}, end:{line:number, ch:number}, primary:boolean, reversed: boolean, isBeforeEdit: boolean}>}|
* Array.<{start:{line:number, ch:number}, end:{line:number, ch:number}, primary:boolean, reversed: boolean, isBeforeEdit: boolean}>}>}
* An array of edit descriptions suitable for including in the edits array passed to `Document.doMultipleEdits()`.
*/
function _getLineCommentEdits(editor, selections) {
function _getLineCommentEdits(editor, selections, command) {
// We need to expand line selections in order to coalesce cursors on the same line, but we
// don't want to merge adjacent line selections.
var lineSelections = editor.convertToLineSelections(selections, { mergeAdjacent: false }),
@ -611,7 +662,7 @@ define(function (require, exports, module) {
if (language.hasLineCommentSyntax()) {
edit = _getLineCommentPrefixEdit(editor, language.getLineCommentPrefixes(), language.getBlockCommentPrefix(), language.getBlockCommentSuffix(), lineSel);
} else if (language.hasBlockCommentSyntax()) {
edit = _getLineCommentPrefixSuffixEdit(editor, language.getBlockCommentPrefix(), language.getBlockCommentSuffix(), lineSel);
edit = _getLineCommentPrefixSuffixEdit(editor, language.getBlockCommentPrefix(), language.getBlockCommentSuffix(), lineSel, command);
}
}
if (!edit) {
@ -633,7 +684,7 @@ define(function (require, exports, module) {
return;
}
editor.setSelections(editor.document.doMultipleEdits(_getLineCommentEdits(editor, editor.getSelections())));
editor.setSelections(editor.document.doMultipleEdits(_getLineCommentEdits(editor, editor.getSelections(), "line")));
}
/**
@ -674,7 +725,7 @@ define(function (require, exports, module) {
// Handle any line-comment edits. It's okay if these are out-of-order with the other edits, since
// they shouldn't overlap, and `doMultipleEdits()` will take care of sorting the edits so the
// selections can be tracked appropriately.
edits.push.apply(edits, _getLineCommentEdits(editor, lineCommentSels));
edits.push.apply(edits, _getLineCommentEdits(editor, lineCommentSels, "block"));
editor.setSelections(editor.document.doMultipleEdits(edits));
}

View File

@ -40,10 +40,24 @@ define(function (require, exports, module) {
PreferencesManager = require("preferences/PreferencesManager"),
StatusBar = require("widgets/StatusBar"),
Strings = require("strings"),
FileUtils = require("file/FileUtils"),
InMemoryFile = require("document/InMemoryFile"),
Dialogs = require("widgets/Dialogs"),
DefaultDialogs = require("widgets/DefaultDialogs"),
ProjectManager = require("project/ProjectManager"),
Async = require("utils/Async"),
FileSystem = require("filesystem/FileSystem"),
CommandManager = require("command/CommandManager"),
Commands = require("command/Commands"),
DocumentManager = require("document/DocumentManager"),
StringUtils = require("utils/StringUtils");
var SupportedEncodingsText = require("text!supported-encodings.json"),
SupportedEncodings = JSON.parse(SupportedEncodingsText);
/* StatusBar indicators */
var languageSelect, // this is a DropdownButton instance
encodingSelect, // this is a DropdownButton instance
$cursorInfo,
$fileInfo,
$indentType,
@ -74,12 +88,24 @@ define(function (require, exports, module) {
var doc = editor.document,
lang = doc.getLanguage();
// Ensure width isn't left locked by a previous click of the dropdown (which may not have resulted in a "change" event at the time)
languageSelect.$button.css("width", "auto");
// Show the current language as button title
languageSelect.$button.text(lang.getName());
}
/**
* Update encoding
* @param {Editor} editor Current editor
*/
function _updateEncodingInfo(editor) {
var doc = editor.document;
// Show the current encoding as button title
if (!doc.file._encoding) {
doc.file._encoding = "UTF-8";
}
encodingSelect.$button.text(doc.file._encoding);
}
/**
* Update file information
* @param {Editor} editor Current editor
@ -277,6 +303,7 @@ define(function (require, exports, module) {
_updateCursorInfo(null, current);
_updateLanguageInfo(current);
_updateEncodingInfo(current);
_updateFileInfo(current);
_initOverwriteMode(current);
_updateIndentType(fullPath);
@ -305,6 +332,40 @@ define(function (require, exports, module) {
languageSelect.items.unshift(LANGUAGE_SET_AS_DEFAULT);
}
/**
* Change the encoding and reload the current document.
* If passed then save the preferred encoding in state.
*/
function _changeEncodingAndReloadDoc(document) {
var promise = document.reload();
promise.done(function (text, readTimestamp) {
encodingSelect.$button.text(document.file._encoding);
// Store the preferred encoding in the state
var projectRoot = ProjectManager.getProjectRoot(),
context = {
location : {
scope: "user",
layer: "project",
layerID: projectRoot.fullPath
}
};
var encoding = PreferencesManager.getViewState("encoding", context);
encoding[document.file.fullPath] = document.file._encoding;
PreferencesManager.setViewState("encoding", encoding, context);
});
promise.fail(function (error) {
console.log("Error reloading contents of " + document.file.fullPath, error);
});
}
/**
* Populate the encodingSelect DropdownButton's menu with all registered encodings
*/
function _populateEncodingDropdown() {
encodingSelect.items = SupportedEncodings;
}
/**
* Initialize
*/
@ -343,6 +404,27 @@ define(function (require, exports, module) {
$("#status-language").append(languageSelect.$button);
languageSelect.$button.attr("title", Strings.STATUSBAR_LANG_TOOLTIP);
encodingSelect = new DropdownButton("", [], function (item, index) {
var document = EditorManager.getActiveEditor().document;
var html = _.escape(item);
// Show indicators for currently selected & default languages for the current file
if (item === "UTF-8") {
html += " <span class='default-language'>" + Strings.STATUSBAR_DEFAULT_LANG + "</span>";
}
if (item === document.file._encoding) {
html = "<span class='checked-language'></span>" + html;
}
return html;
});
encodingSelect.dropdownExtraClasses = "dropdown-status-bar";
encodingSelect.$button.addClass("btn-status-bar");
$("#status-encoding").append(encodingSelect.$button);
encodingSelect.$button.attr("title", Strings.STATUSBAR_ENCODING_TOOLTIP);
// indentation event handlers
$indentType.on("click", _toggleIndentType);
$indentWidthLabel
@ -389,16 +471,78 @@ define(function (require, exports, module) {
}
});
// Encoding select change handler
encodingSelect.on("select", function (e, encoding) {
var document = EditorManager.getActiveEditor().document,
originalPath = document.file.fullPath,
originalEncoding = document.file._encoding;
document.file._encoding = encoding;
if (!(document.file instanceof InMemoryFile) && document.isDirty) {
CommandManager.execute(Commands.FILE_SAVE_AS, {doc: document}).done(function () {
var doc = DocumentManager.getCurrentDocument();
if (originalPath === doc.file.fullPath) {
_changeEncodingAndReloadDoc(doc);
} else {
document.file._encoding = originalEncoding;
}
});
} else if (document.file instanceof InMemoryFile) {
encodingSelect.$button.text(encoding);
} else if (!document.isDirty) {
_changeEncodingAndReloadDoc(document);
}
});
$statusOverwrite.on("click", _updateEditorOverwriteMode);
}
// Initialize: status bar focused listener
EditorManager.on("activeEditorChange", _onActiveEditorChange);
function _checkFileExistance(filePath, index, encoding) {
var deferred = new $.Deferred(),
fileEntry = FileSystem.getFileForPath(filePath);
fileEntry.exists(function (err, exists) {
if (!err && exists) {
deferred.resolve();
} else {
delete encoding[filePath];
deferred.reject();
}
});
return deferred.promise();
}
ProjectManager.on("projectOpen", function () {
var projectRoot = ProjectManager.getProjectRoot(),
context = {
location : {
scope: "user",
layer: "project",
layerID: projectRoot.fullPath
}
};
var encoding = PreferencesManager.getViewState("encoding", context);
if (!encoding) {
encoding = {};
PreferencesManager.setViewState("encoding", encoding, context);
}
Async.doSequentially(Object.keys(encoding), function (filePath, index) {
return _checkFileExistance(filePath, index, encoding);
}, false)
.always(function () {
PreferencesManager.setViewState("encoding", encoding, context);
});
});
AppInit.htmlReady(_init);
AppInit.appReady(function () {
// Populate language switcher with all languages after startup; update it later if this set changes
_populateLanguageDropdown();
_populateEncodingDropdown();
LanguageManager.on("languageAdded languageModified", _populateLanguageDropdown);
_onActiveEditorChange(null, EditorManager.getActiveEditor(), null);
StatusBar.show();

View File

@ -321,6 +321,7 @@ define(function (require, exports, module) {
}
models.push(new ExtensionManagerViewModel.InstalledViewModel());
models.push(new ExtensionManagerViewModel.DefaultViewModel());
function updateSearchDisabled() {
var model = models[_activeTabIndex],

View File

@ -336,10 +336,10 @@ define(function (require, exports, module) {
context.removalAllowed = this.model.source === "installed" &&
!context.failedToStart && !hasPendingAction;
context.disablingAllowed = this.model.source === "installed" &&
!context.disabled && !hasPendingAction;
context.enablingAllowed = this.model.source === "installed" &&
context.disabled && !hasPendingAction;
var isDefaultOrInstalled = this.model.source === "default" || this.model.source === "installed";
var isDefaultAndTheme = this.model.source === "default" && context.metadata.theme;
context.disablingAllowed = isDefaultOrInstalled && !isDefaultAndTheme && !context.disabled && !hasPendingAction;
context.enablingAllowed = isDefaultOrInstalled && !isDefaultAndTheme && context.disabled && !hasPendingAction;
// Copy over helper functions that we share with the registry app.
["lastVersionDate", "authorInfo"].forEach(function (helper) {

View File

@ -80,6 +80,12 @@ define(function (require, exports, module) {
*/
ExtensionManagerViewModel.prototype.SOURCE_INSTALLED = "installed";
/**
* @type {string}
* Constant indicating that this model/view should initialize from the list of default bundled extensions.
*/
ExtensionManagerViewModel.prototype.SOURCE_DEFAULT = "default";
/**
* @type {Object}
* The current set of extensions managed by this model. Same as ExtensionManager.extensions.
@ -509,6 +515,65 @@ define(function (require, exports, module) {
return entry;
};
/**
* Model for displaying default extensions that come bundled with Brackets
*/
function DefaultViewModel() {
ExtensionManagerViewModel.call(this);
}
// Inheritance setup
DefaultViewModel.prototype = Object.create(ExtensionManagerViewModel.prototype);
DefaultViewModel.prototype.constructor = DefaultViewModel;
/**
* Add SOURCE_DEFAULT to DefaultViewModel
*/
DefaultViewModel.prototype.source = ExtensionManagerViewModel.prototype.SOURCE_DEFAULT;
/**
* Initializes the model from the set of default extensions, sorted alphabetically by id
* @return {$.Promise} a promise that's resolved when we're done initializing.
*/
DefaultViewModel.prototype._initializeFromSource = function () {
var self = this;
this.extensions = ExtensionManager.extensions;
this.sortedFullSet = Object.keys(this.extensions)
.filter(function (key) {
return self.extensions[key].installInfo &&
self.extensions[key].installInfo.locationType === ExtensionManager.LOCATION_DEFAULT;
});
this._sortFullSet();
this._setInitialFilter();
return new $.Deferred().resolve().promise();
};
/**
* @private
* Re-sorts the current full set
*/
DefaultViewModel.prototype._sortFullSet = function () {
var self = this;
this.sortedFullSet = this.sortedFullSet.sort(function (key1, key2) {
var metadata1 = self.extensions[key1].installInfo.metadata,
metadata2 = self.extensions[key2].installInfo.metadata,
id1 = (metadata1.title || metadata1.name).toLocaleLowerCase(),
id2 = (metadata2.title || metadata2.name).toLocaleLowerCase();
return id1.localeCompare(id2);
});
};
/**
* @private
* Finds the default extension metadata by id. If there is no default extension matching the given id,
* this returns `null`.
* @param {string} id of the theme extension
* @return {Object?} extension metadata or null if there's no matching extension
*/
DefaultViewModel.prototype._getEntry = function (id) {
return this.extensions[id] ? this.extensions[id].installInfo : null;
};
/**
* The model for the ExtensionManagerView that is responsible for handling registry-based theme extensions.
* This extends ExtensionManagerViewModel.
@ -573,4 +638,5 @@ define(function (require, exports, module) {
exports.RegistryViewModel = RegistryViewModel;
exports.ThemesViewModel = ThemesViewModel;
exports.InstalledViewModel = InstalledViewModel;
exports.DefaultViewModel = DefaultViewModel;
});

View File

@ -43,6 +43,11 @@ define(function (require, exports, module) {
description: Strings.DESCRIPTION_PROXY
});
var PREF_EXTENSIONS_DEFAULT_DISABLED = "extensions.default.disabled";
PreferencesManager.definePreference(PREF_EXTENSIONS_DEFAULT_DISABLED, "array", [], {
description: Strings.DESCRIPTION_DISABLED_DEFAULT_EXTENSIONS
});
var Errors = {
ERROR_LOADING: "ERROR_LOADING",
MALFORMED_URL: "MALFORMED_URL",
@ -436,6 +441,23 @@ define(function (require, exports, module) {
});
}
/**
* This function manages the PREF_EXTENSIONS_DEFAULT_DISABLED preference
* holding an array of default extension paths that should not be loaded
* on Brackets startup
*/
function toggleDefaultExtension(path, enabled) {
var arr = PreferencesManager.get(PREF_EXTENSIONS_DEFAULT_DISABLED);
if (!Array.isArray(arr)) { arr = []; }
var io = arr.indexOf(path);
if (enabled === true && io !== -1) {
arr.splice(io, 1);
} else if (enabled === false && io === -1) {
arr.push(path);
}
PreferencesManager.set(PREF_EXTENSIONS_DEFAULT_DISABLED, arr);
}
/**
* Disables the extension at the given path.
*
@ -446,12 +468,19 @@ define(function (require, exports, module) {
function disable(path) {
var result = new $.Deferred(),
file = FileSystem.getFileForPath(path + "/.disabled");
var defaultExtensionPath = ExtensionLoader.getDefaultExtensionPath();
if (file.fullPath.indexOf(defaultExtensionPath) === 0) {
toggleDefaultExtension(path, false);
result.resolve();
return result.promise();
}
file.write("", function (err) {
if (err) {
result.reject(err);
} else {
result.resolve();
return result.reject(err);
}
result.resolve();
});
return result.promise();
}
@ -466,14 +495,25 @@ define(function (require, exports, module) {
function enable(path) {
var result = new $.Deferred(),
file = FileSystem.getFileForPath(path + "/.disabled");
file.unlink(function (err) {
if (err) {
result.reject(err);
return;
}
function afterEnable() {
ExtensionLoader.loadExtension(FileUtils.getBaseName(path), { baseUrl: path }, "main")
.done(result.resolve)
.fail(result.reject);
}
var defaultExtensionPath = ExtensionLoader.getDefaultExtensionPath();
if (file.fullPath.indexOf(defaultExtensionPath) === 0) {
toggleDefaultExtension(path, true);
afterEnable();
return result.promise();
}
file.unlink(function (err) {
if (err) {
return result.reject(err);
}
afterEnable();
});
return result.promise();
}

View File

@ -114,7 +114,7 @@ function performNpmInstallIfRequired(npmOptions, validationResult, callback) {
packageJson = null;
}
if (!packageJson || !packageJson.dependencies) {
if (!packageJson || !packageJson.dependencies || !Object.keys(packageJson.dependencies).length) {
return finish();
}

View File

@ -0,0 +1,10 @@
{
"@charset": "Defines the character set used by the style sheet.",
"@import": "Tells the CSS engine to include an external style sheet.",
"@namespace": "Tells the CSS engine that all its content must be considered prefixed with an XML namespace.",
"@media": "A conditional group rule which will apply its content if the device meets the criteria of the condition defined using a media query.",
"@supports": "A conditional group rule which will apply its content if the browser meets the criteria of the given condition.",
"@page": "Describes the aspect of layout changes which will be applied when printing the document.",
"@font-face": "Describes the aspect of an external font to be downloaded.",
"@keyframes": "Describes the aspect of intermediate steps in a CSS animation sequence."
}

View File

@ -0,0 +1,118 @@
/*
* Copyright (c) 2017 - present Adobe Systems Incorporated. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
define(function (require, exports, module) {
"use strict";
// Load dependent modules
var AppInit = brackets.getModule("utils/AppInit"),
CodeHintManager = brackets.getModule("editor/CodeHintManager"),
AtRulesText = require("text!AtRulesDef.json"),
AtRules = JSON.parse(AtRulesText);
/**
* @constructor
*/
function AtRuleHints() {
}
// As we are only going to provide @rules name hints
// we should claim that we don't have hints for anything else
AtRuleHints.prototype.hasHints = function (editor, implicitChar) {
var pos = editor.getCursorPos(),
token = editor._codeMirror.getTokenAt(pos),
cmState;
this.editor = editor;
if (token.state.base && token.state.base.localState) {
cmState = token.state.base.localState;
} else {
cmState = token.state;
}
// Check if we are at '@' rule 'def' context
if ((token.type === "def" && cmState.context.type === "at")
|| (token.type === "variable-2" && (cmState.context.type === "top" || cmState.context.type === "block"))) {
this.filter = token.string;
return true;
} else {
this.filter = null;
return false;
}
};
AtRuleHints.prototype.getHints = function (implicitChar) {
var pos = this.editor.getCursorPos(),
token = this.editor._codeMirror.getTokenAt(pos);
this.filter = token.string;
this.token = token;
if (!this.filter) {
return null;
}
// Filter the property list based on the token string
var result = Object.keys(AtRules).filter(function (key) {
if (key.indexOf(token.string) === 0) {
return key;
}
}).sort();
return {
hints: result,
match: this.filter,
selectInitial: true,
defaultDescriptionWidth: true,
handleWideResults: false
};
};
/**
* Inserts a given @<rule> hint into the current editor context.
*
* @param {string} completion
* The hint to be inserted into the editor context.
*
* @return {boolean}
* Indicates whether the manager should follow hint insertion with an
* additional explicit hint request.
*/
AtRuleHints.prototype.insertHint = function (completion) {
var cursor = this.editor.getCursorPos();
this.editor.document.replaceRange(completion, {line: cursor.line, ch: this.token.start}, {line: cursor.line, ch: this.token.end});
return false;
};
AppInit.appReady(function () {
// Register code hint providers
var restrictedBlockHints = new AtRuleHints();
CodeHintManager.registerHintProvider(restrictedBlockHints, ["css", "less", "scss"], 0);
// For unit testing
exports.restrictedBlockHints = restrictedBlockHints;
});
});

View File

@ -0,0 +1,236 @@
/*
* Copyright (c) 2017 - present Adobe Systems Incorporated. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*global describe, it, xit, expect, beforeEach, afterEach */
define(function (require, exports, module) {
"use strict";
var SpecRunnerUtils = brackets.getModule("spec/SpecRunnerUtils"),
CSSAtRuleCodeHints = require("main");
describe("CSS '@' rules Code Hinting", function () {
var defaultContent = "@ { \n" +
"} \n" +
" \n" +
"@m ";
var testDocument, testEditor;
/*
* Create a mockup editor with the given content and language id.
*
* @param {string} content - content for test window
* @param {string} languageId
*/
function setupTest(content, languageId) {
var mock = SpecRunnerUtils.createMockEditor(content, languageId);
testDocument = mock.doc;
testEditor = mock.editor;
}
function tearDownTest() {
SpecRunnerUtils.destroyMockEditor(testDocument);
testEditor = null;
testDocument = null;
}
// Ask provider for hints at current cursor position; expect it to return some
function expectHints(provider, implicitChar, returnWholeObj) {
expect(provider.hasHints(testEditor, implicitChar)).toBe(true);
var hintsObj = provider.getHints();
expect(hintsObj).toBeTruthy();
// return just the array of hints if returnWholeObj is falsy
return returnWholeObj ? hintsObj : hintsObj.hints;
}
// Ask provider for hints at current cursor position; expect it NOT to return any
function expectNoHints(provider, implicitChar) {
expect(provider.hasHints(testEditor, implicitChar)).toBe(false);
}
// compares lists to ensure they are the same
function verifyListsAreIdentical(hintList, values) {
var i;
expect(hintList.length).toBe(values.length);
for (i = 0; i < values.length; i++) {
expect(hintList[i]).toBe(values[i]);
}
}
function selectHint(provider, expectedHint, implicitChar) {
var hintList = expectHints(provider, implicitChar);
expect(hintList.indexOf(expectedHint)).not.toBe(-1);
return provider.insertHint(expectedHint);
}
// Helper function for testing cursor position
function fixPos(pos) {
if (!("sticky" in pos)) {
pos.sticky = null;
}
return pos;
}
function expectCursorAt(pos) {
var selection = testEditor.getSelection();
expect(fixPos(selection.start)).toEqual(fixPos(selection.end));
expect(fixPos(selection.start)).toEqual(fixPos(pos));
}
function verifyFirstEntry(hintList, expectedFirstHint) {
expect(hintList[0]).toBe(expectedFirstHint);
}
// Helper function to
// a) ensure the hintList and the list with the available values have the same size
// b) ensure that all possible values are mentioned in the hintList
function verifyAllValues(hintList, values) {
expect(hintList.length).toBe(values.length);
expect(hintList.sort().toString()).toBe(values.sort().toString());
}
var modesToTest = ['css', 'scss', 'less'],
modeCounter;
var selectMode = function () {
return modesToTest[modeCounter];
};
describe("'@' rules in styles mode (selection of correct restricted block based on input)", function () {
beforeEach(function () {
// create Editor instance (containing a CodeMirror instance)
var mock = SpecRunnerUtils.createMockEditor(defaultContent, selectMode());
testEditor = mock.editor;
testDocument = mock.doc;
});
afterEach(function () {
SpecRunnerUtils.destroyMockEditor(testDocument);
testEditor = null;
testDocument = null;
});
var testAllHints = function () {
testEditor.setCursorPos({ line: 0, ch: 1 }); // after @
var hintList = expectHints(CSSAtRuleCodeHints.restrictedBlockHints);
verifyFirstEntry(hintList, "@charset"); // filtered on "empty string"
verifyListsAreIdentical(hintList, ["@charset",
"@font-face",
"@import",
"@keyframes",
"@media",
"@namespace",
"@page",
"@supports"]);
},
testFilteredHints = function () {
testEditor.setCursorPos({ line: 3, ch: 2 }); // after @m
var hintList = expectHints(CSSAtRuleCodeHints.restrictedBlockHints);
verifyFirstEntry(hintList, "@media"); // filtered on "@m"
verifyListsAreIdentical(hintList, ["@media"]);
},
testNoHintsOnSpace = function () {
testEditor.setCursorPos({ line: 3, ch: 3 }); // after {
expect(CSSAtRuleCodeHints.restrictedBlockHints.hasHints(testEditor, '')).toBe(false);
},
testNoHints = function () {
testEditor.setCursorPos({ line: 0, ch: 0 }); // after {
expect(CSSAtRuleCodeHints.restrictedBlockHints.hasHints(testEditor, 'c')).toBe(false);
};
for (modeCounter in modesToTest) {
it("should list all rule hints right after @", testAllHints);
it("should list filtered rule hints right after @m", testFilteredHints);
it("should not list rule hints on space", testNoHintsOnSpace);
it("should not list rule hints if the cursor is before @", testNoHints);
}
});
describe("'@' rules in LESS mode (selection of correct restricted block based on input)", function () {
defaultContent = "@ { \n" +
"} \n" +
" \n" +
"@m \n" +
"@green: green;\n" +
".div { \n" +
"color: @" +
"} \n";
beforeEach(function () {
// create Editor instance (containing a CodeMirror instance)
var mock = SpecRunnerUtils.createMockEditor(defaultContent, "less");
testEditor = mock.editor;
testDocument = mock.doc;
});
afterEach(function () {
SpecRunnerUtils.destroyMockEditor(testDocument);
testEditor = null;
testDocument = null;
});
it("should not list rule hints in less variable evaluation scope", function () {
testEditor.setCursorPos({ line: 3, ch: 3 }); // after {
expect(CSSAtRuleCodeHints.restrictedBlockHints.hasHints(testEditor, '')).toBe(false);
});
});
describe("'@' rule hint insertion", function () {
beforeEach(function () {
// create Editor instance (containing a CodeMirror instance)
var mock = SpecRunnerUtils.createMockEditor(defaultContent, "css");
testEditor = mock.editor;
testDocument = mock.doc;
});
afterEach(function () {
SpecRunnerUtils.destroyMockEditor(testDocument);
testEditor = null;
testDocument = null;
});
it("should insert @rule selected", function () {
testEditor.setCursorPos({ line: 0, ch: 1 }); // cursor after '@'
selectHint(CSSAtRuleCodeHints.restrictedBlockHints, "@charset");
expect(testDocument.getLine(0)).toBe("@charset { ");
expectCursorAt({ line: 0, ch: 8 });
});
it("should insert filtered selection by replacing the existing rule", function () {
testEditor.setCursorPos({ line: 3, ch: 2 }); // cursor after '@m'
selectHint(CSSAtRuleCodeHints.restrictedBlockHints, "@media");
expect(testDocument.getLine(3)).toBe("@media ");
expectCursorAt({ line: 3, ch: 6 });
});
});
});
});

View File

@ -2,6 +2,7 @@
"align-content": {"values": ["center", "flex-end", "flex-start", "space-around", "space-between", "stretch"]},
"align-items": {"values": ["baseline", "center", "flex-end", "flex-start", "stretch"]},
"align-self": {"values": ["auto", "baseline", "center", "flex-end", "flex-start", "stretch"]},
"all": {"values": []},
"animation": {"values": []},
"animation-delay": {"values": []},
"animation-direction": {"values": ["alternate", "alternate-reverse", "normal", "reverse"]},
@ -14,7 +15,7 @@
"backface-visibility": {"values": ["hidden", "visible"]},
"background": {"values": []},
"background-attachment": {"values": ["fixed", "local", "scroll", "inherit"]},
"background-blend-mode": {"values": ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "lighten", "luminosity", "normal", "multiply", "overlay", "saturation", "screen", "soft-light"]},
"background-blend-mode": {"values": ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light"]},
"background-clip": {"values": ["border-box", "content-box", "padding-box", "inherit"]},
"background-color": {"values": ["inherit"], "type": "color"},
"background-image": {"values": ["image()", "linear-gradient()", "radial-gradient()", "repeating-linear-gradient()", "repeating-radial-gradient()", "url()"]},
@ -55,14 +56,15 @@
"border-top-style": {"values": ["dashed", "dotted", "double", "groove", "hidden", "inset", "none", "outset", "ridge", "solid", "inherit"]},
"border-top-width": {"values": ["medium", "thin", "thick", "inherit"]},
"border-width": {"values": ["medium", "thin", "thick", "inherit"]},
"box-decoration-break": {"values": []},
"box-decoration-break": {"values": ["clone", "slice"]},
"box-shadow": {"values": []},
"box-sizing": {"values": ["border-box", "content-box", "padding-box", "inherit"]},
"box-sizing": {"values": ["border-box", "content-box", "inherit"]},
"bottom": {"values": ["auto", "inherit"]},
"break-after": {"values": ["always", "auto", "avoid", "avoid-column", "avoid-page", "avoid-region", "column", "left", "page", "region", "right"]},
"break-before": {"values": ["always", "auto", "avoid", "avoid-column", "avoid-page", "avoid-region", "column", "left", "page", "region", "right"]},
"break-inside": {"values": ["auto", "avoid", "avoid-column", "avoid-page", "avoid-region"]},
"caption-side": {"values": ["bottom", "top", "inherit"]},
"caret-color": {"values": ["auto"], "type": "color"},
"clear": {"values": ["both", "left", "none", "right", "inherit"]},
"clip": {"values": ["auto", "inherit"]},
"color": {"values": ["inherit"], "type": "color"},
@ -81,7 +83,7 @@
"counter-reset": {"values": ["none", "inherit"]},
"cursor": {"values": ["alias", "all-scroll", "auto", "cell", "col-resize", "context-menu", "copy", "crosshair", "default", "e-resize", "ew-resize", "grab", "grabbing", "help", "inherit", "move", "n-resize", "ne-resize", "nesw-resize", "no-drop", "none", "not-allowed", "ns-resize", "nw-resize", "nwse-resize", "pointer", "progress", "row-resize", "s-resize", "se-resize", "sw-resize", "text", "vertical-text", "w-resize", "wait", "zoom-in", "zoom-out"]},
"direction": {"values": ["ltr", "rtl", "inherit"]},
"display": {"values": ["block", "flex", "grid", "inline", "inline-block", "inline-flex", "inline-grid", "inline-table", "list-item", "none", "run-in", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "inherit"]},
"display": {"values": ["block", "contents", "flex", "flow-root", "grid", "inline", "inline-block", "inline-flex", "inline-grid", "inline-table", "list-item", "none", "run-in", "subgrid", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "inherit"]},
"empty-cells": {"values": ["hide", "show", "inherit"]},
"filter": {"values": ["blur()", "brightness()", "contrast()", "custom()", "drop-shadow()", "grayscale()", "hue-rotate()", "invert()", "none", "opacity()", "sepia()", "saturate()", "url()"]},
"flex": {"values": ["auto", "initial", "none"]},
@ -127,13 +129,16 @@
"grid-row-end": {"values": []},
"grid-row-start": {"values": []},
"grid-row-gap": {"values": []},
"grid-template": {"values": ["none"]},
"grid-template-areas": {"values": []},
"grid-template-columns": {"values": ["auto"]},
"grid-template-rows": {"values": ["auto"]},
"hanging-punctuation": {"values": ["allow-end", "first", "force-end", "last", "none"]},
"height": {"values": ["auto", "inherit"]},
"hyphens": {"values": ["auto", "manual", "none"]},
"image-orientation": {"values": []},
"image-resolution": {"values": ["from-image", "snap"]},
"isolation": {"values": ["auto", "isolate"]},
"justify-content": {"values": ["center", "flex-end", "flex-start", "space-around", "space-between"]},
"left": {"values": ["auto", "inherit"]},
"letter-spacing": {"values": ["normal", "inherit"]},
@ -151,6 +156,7 @@
"max-width": {"values": ["none", "inherit"]},
"min-height": {"values": ["inherit"]},
"min-width": {"values": ["inherit"]},
"mix-blend-mode": {"values": ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light"]},
"object-fit": {"values": ["contain", "cover", "fill", "none", "scale-down"]},
"object-position": {"values": ["left", "center", "right", "bottom", "top"]},
"opacity": {"values": ["inherit"]},
@ -183,11 +189,13 @@
"region-fragment": {"values": ["auto", "break"]},
"resize": {"values": ["both", "horizontal", "none", "vertical", "inherit"]},
"right": {"values": ["auto", "inherit"]},
"scroll-behavior": {"values": ["auto", "smooth"]},
"src": {"values": [ "url()"]},
"shape-image-threshold": {"values": []},
"shape-inside": {"values": ["auto", "circle()", "ellipse()", "inherit", "outside-shape", "polygon()", "rectangle()"]},
"shape-margin": {"values": []},
"shape-outside": {"values": ["none", "inherit", "circle()", "ellipse()", "polygon()", "inset()", "margin-box", "border-box", "padding-box", "content-box", "url()", "image()", "linear-gradient()", "radial-gradient()", "repeating-linear-gradient()", "repeating-radial-gradient()"]},
"tab-size": {"values": []},
"table-layout": {"values": ["auto", "fixed", "inherit"]},
"text-align": {"values": ["center", "left", "justify", "right", "inherit"]},
"text-align-last": {"values": ["center", "left", "justify", "right", "inherit"]},
@ -217,6 +225,7 @@
"transition-timing-function": {"values": ["cubic-bezier()", "ease", "ease-in", "ease-in-out", "ease-out", "linear", "step-end", "step-start", "steps()"]},
"unicode-bidi": {"values": ["bidi-override", "embed", "normal", "inherit"]},
"unicode-range": {"values": []},
"user-select": {"values": ["all", "auto", "contain", "none", "text"]},
"vertical-align": {"values": ["baseline", "bottom", "middle", "sub", "super", "text-bottom", "text-top", "top", "inherit"]},
"visibility": {"values": ["collapse", "hidden", "visible", "inherit"]},
"white-space": {"values": ["normal", "nowrap", "pre", "pre-line", "pre-wrap", "inherit"]},

View File

@ -468,7 +468,7 @@ define(function (require, exports, module) {
AppInit.appReady(function () {
var cssPropHints = new CssPropHints();
CodeHintManager.registerHintProvider(cssPropHints, ["css", "scss", "less"], 0);
CodeHintManager.registerHintProvider(cssPropHints, ["css", "scss", "less"], 1);
ExtensionUtils.loadStyleSheet(module, "styles/brackets-css-hints.css");

View File

@ -51,6 +51,21 @@ define(function (require, exports, module) {
" bordborder: \n" +
" color\n" +
"} \n";
var defaultHTMLContent = "<html> \n" +
"<head> \n" +
"</head> \n" +
"<body> \n" +
"<div style=' \n" + // line 4
" \n" +
" b\n" +
" bord\n" +
" border-\n" +
" border-colo\n" +
" border-color: red;'>\n" + // line 10
"</div> \n" +
"</body> \n" +
"</html> \n";
var testDocument, testEditor;
@ -437,6 +452,92 @@ define(function (require, exports, module) {
});
});
describe("CSS Hint provider in style attribute value context for html mode", function () {
beforeEach(function () {
// create Editor instance (containing a CodeMirror instance)
var mock = SpecRunnerUtils.createMockEditor(defaultHTMLContent, "html");
testEditor = mock.editor;
testDocument = mock.doc;
});
afterEach(function () {
SpecRunnerUtils.destroyMockEditor(testDocument);
testEditor = null;
testDocument = null;
});
it("should list all prop-name hints right after the open quote for style value context", function () {
testEditor.setCursorPos({ line: 4, ch: 12 }); // after "='"
var hintList = expectHints(CSSCodeHints.cssPropHintProvider);
verifyAttrHints(hintList, "align-content"); // filtered on "empty string"
});
it("should list all prop-name hints in new line for style value context", function () {
testEditor.setCursorPos({ line: 5, ch: 0 });
var hintList = expectHints(CSSCodeHints.cssPropHintProvider);
verifyAttrHints(hintList, "align-content"); // filtered on "empty string"
});
it("should list all prop-name hints starting with 'b' in new line for style value context", function () {
testEditor.setCursorPos({ line: 6, ch: 2 });
var hintList = expectHints(CSSCodeHints.cssPropHintProvider);
verifyAttrHints(hintList, "backface-visibility"); // filtered on "b"
});
it("should list all prop-name hints starting with 'bord' for style value context", function () {
// insert semicolon after previous rule to avoid incorrect tokenizing
testDocument.replaceRange(";", { line: 6, ch: 2 });
testEditor.setCursorPos({ line: 7, ch: 5 });
var hintList = expectHints(CSSCodeHints.cssPropHintProvider);
verifyAttrHints(hintList, "border"); // filtered on "bord"
});
it("should list all prop-name hints starting with 'border-' for style value context", function () {
// insert semicolon after previous rule to avoid incorrect tokenizing
testDocument.replaceRange(";", { line: 7, ch: 5 });
testEditor.setCursorPos({ line: 8, ch: 8 });
var hintList = expectHints(CSSCodeHints.cssPropHintProvider);
verifyAttrHints(hintList, "border-bottom"); // filtered on "border-"
});
it("should list only prop-name hint border-color for style value context", function () {
// insert semicolon after previous rule to avoid incorrect tokenizing
testDocument.replaceRange(";", { line: 8, ch: 8 });
testEditor.setCursorPos({ line: 9, ch: 12 });
var hintList = expectHints(CSSCodeHints.cssPropHintProvider);
verifyAttrHints(hintList, "border-color"); // filtered on "border-color"
verifyListsAreIdentical(hintList, ["border-color",
"border-left-color",
"border-top-color",
"border-bottom-color",
"border-right-color"]);
});
it("should list prop-name hints at end of property-value finished by ; for style value context", function () {
testEditor.setCursorPos({ line: 10, ch: 19 }); // after ;
var hintList = expectHints(CSSCodeHints.cssPropHintProvider);
verifyAttrHints(hintList, "align-content"); // filtered on "empty string"
});
it("should NOT list prop-name hints right before style value context", function () {
testEditor.setCursorPos({ line: 4, ch: 11 }); // after =
expectNoHints(CSSCodeHints.cssPropHintProvider);
});
it("should NOT list prop-name hints after style value context", function () {
testEditor.setCursorPos({ line: 10, ch: 20 }); // after "'"
expectNoHints(CSSCodeHints.cssPropHintProvider);
});
});
describe("CSS hint provider in other filecontext (e.g. javascript)", function () {
var defaultContent = "function foobar (args) { \n " +

View File

@ -0,0 +1,52 @@
{
"selectors":
{
"active": {"desc": "Selects the active link"},
"checked": {"desc": "Selects every checked <input> element"},
"default": {"desc": "Selects every UI element that is the default among a group of similar elements"},
"dir(direction)": {"desc": "Selects every element whose text direction is 'direction'", "text": "dir()"},
"disabled": {"desc": "Selects every disabled <input> element"},
"empty": {"desc": "Selects every element that has no children/text (including text nodes)"},
"enabled": {"desc": "Selects every enabled <input> element"},
"first-child": {"desc": "Selects every element that is the first child of its parent"},
"first-of-type": {"desc": "Selects every element that is the first element identified by 'type' of its parent"},
"focus": {"desc": "Selects the input element which has focus"},
"focus-within": {"desc": "Selects every element which or whose descendant has focus"},
"fullscreen": {"desc": "Selects the element being in full-screen mode"},
"hover": {"desc": "Selects elements on mouse over"},
"in-range": {"desc": "Selects input elements with a value within a specified range"},
"indeterminate": {"desc": "Selects every indeterminate checkbox or radio button"},
"invalid": {"desc": "Selects all input elements with an invalid value"},
"lang(language)": {"desc": "Selects every element with a lang attribute equal to 'language'", "text": "lang()"},
"last-child": {"desc": "Selects every element that is the last child of its parent"},
"last-of-type": {"desc": "Selects every element that is the last element of its parent"},
"link": {"desc": "Selects all unvisited links"},
"matches(selectors)": {"desc": "Selects every element that is matched by one or more selectors in the 'selectors' list", "text": "matches()"},
"not(selector)": {"desc": "Selects every element that is not an element identified by 'selector'", "text": "not()"},
"nth-child(n)": {"desc": "Selects every element that is the second child of its parent", "text": "nth-child()"},
"nth-last-child(n)": {"desc": "Selects every element that is the second child of its parent, counting from the last child", "text": "nth-last-child()"},
"nth-last-of-type(n)": {"desc": "Selects every element that is the nth element of its parent, counting from the last child", "text": "nth-last-of-type()"},
"nth-of-type(n)": {"desc": "Selects every element that is the nth element of its parent", "text": "nth-of-type(n)"},
"only-child": {"desc": "Selects every element that is the only child of its parent"},
"only-of-type": {"desc": "Selects every element that is the only element of this type of its parent"},
"optional": {"desc": "Selects input elements with no 'required' attribute"},
"out-of-range": {"desc": "Selects input elements with a value outside a specified range"},
"placeholder-shown": {"desc": "Selects all <input> and <textarea> elements currently showing placeholder text"},
"read-only": {"desc": "Selects input elements with the 'readonly' attribute specified"},
"read-write": {"desc": "Selects input elements with the 'readonly' attribute NOT specified"},
"required": {"desc": "Selects input elements with the 'required' attribute specified"},
"root": {"desc": "Selects the document's root element"},
"target": {"desc": "Selects the current active element (clicked on a URL containing that anchor name)"},
"valid": {"desc": "Selects all input elements with a valid value"},
"visited": {"desc": "Selects all visited links"}
},
"elements":
{
"after": {"desc": "Insert something after the content of each element identified by this selector"},
"before": {"desc": "Insert something before the content of each element identified by this selector"},
"first-letter": {"desc": "Selects the first letter of every element identified by this selector"},
"first-line": {"desc": "Selects the first line of every element identified by this selector"},
"placeholder": {"desc": "Selects the placeholder text of <input> and <textarea> elements"},
"selection": {"desc": "Selects the portion of an element identified by this selector that is selected by a user"}
}
}

View File

@ -0,0 +1,181 @@
/*
* Copyright (c) 2017 - present Adobe Systems Incorporated. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
define(function (require, exports, module) {
"use strict";
// Load dependent modules
var AppInit = brackets.getModule("utils/AppInit"),
CodeHintManager = brackets.getModule("editor/CodeHintManager"),
TokenUtils = brackets.getModule("utils/TokenUtils"),
PseudoRulesText = require("text!PseudoSelectors.json"),
PseudoRules = JSON.parse(PseudoRulesText);
var TOKEN_TYPE_PSEUDO_SELECTOR = 0,
TOKEN_TYPE_PSEUDO_ELEMENT = 1,
PUNCTUATION_CHAR = ':';
function _getPseudoContext(token, cursorText, ctx) {
var slicedToken,
contextType = -1;
// Magic code to get around CM's 'pseudo' identification logic
// As per CSS3 spec :
// -> ':' identifies pseudo slectors
// -> '::' identifies pseudo elements
// We should strictly check for single or double occurance of ':' by slicing
// the line text till the token start position
if (token.state.state === "pseudo") {
slicedToken = cursorText.substr(0, token.start + 1).slice(-3);
} else if (token.type === "variable-3") {
slicedToken = cursorText.substr(0, token.start).slice(-3);
}
if (!slicedToken) {
//We get here when in SCSS mode and the cursor is right after ':'
//Test the previous token first
TokenUtils.movePrevToken(ctx);
if (ctx.token.string === PUNCTUATION_CHAR) {
//We are in pseudo elemnt context ('::')
contextType = TOKEN_TYPE_PSEUDO_ELEMENT;
} else {
contextType = TOKEN_TYPE_PSEUDO_SELECTOR;
}
} else {
if (slicedToken.slice(-2) === "::") {
contextType = TOKEN_TYPE_PSEUDO_ELEMENT;
} else if (slicedToken.slice(-1) === ":") {
contextType = TOKEN_TYPE_PSEUDO_SELECTOR;
}
}
return contextType;
}
/**
* @constructor
*/
function PsudoSelectorHints() {
}
function _validatePseudoContext(token) {
return token.state.state === "pseudo" || token.type === "variable-3" || token.string === PUNCTUATION_CHAR;
}
// As we are only going to provide :<pseudo> name hints
// we should claim that we don't have hints for anything else
PsudoSelectorHints.prototype.hasHints = function (editor, implicitChar) {
var pos = editor.getCursorPos(),
token = editor._codeMirror.getTokenAt(pos);
this.editor = editor;
// Check if we are at ':' pseudo rule or in 'variable-3' 'def' context
return _validatePseudoContext(token);
};
PsudoSelectorHints.prototype.getHints = function (implicitChar) {
var pos = this.editor.getCursorPos(),
token = this.editor._codeMirror.getTokenAt(pos),
filter = token.type === "variable-3" ? token.string : "",
lineTillCursor = this.editor._codeMirror.getLine(pos.line),
ctx = TokenUtils.getInitialContext(this.editor._codeMirror, pos);
if (!_validatePseudoContext(token)) {
return null;
}
// validate and keep the context in scope so that it can be used while getting description
this.context = _getPseudoContext(token, lineTillCursor, ctx);
// If we are not able to find context, don't proceed
if (this.context === -1) {
return null;
}
this.token = token;
// Filter the property list based on the token string
var result = Object.keys(this.context === TOKEN_TYPE_PSEUDO_SELECTOR ? PseudoRules.selectors : PseudoRules.elements).filter(function (key) {
if (key.indexOf(filter) === 0) {
return key;
}
}).sort();
return {
hints: result,
match: filter,
selectInitial: true,
defaultDescriptionWidth: true,
handleWideResults: false
};
};
/**
* Inserts a given ':<pseudo>' hint into the current editor context.
*
* @param {string} completion
* The hint to be inserted into the editor context.
*
* @return {boolean}
* Indicates whether the manager should follow hint insertion with an
* additional explicit hint request.
*/
PsudoSelectorHints.prototype.insertHint = function (completion) {
var cursor = this.editor.getCursorPos();
var startPos = {line: cursor.line, ch: this.token.start},
endPos = {line: cursor.line, ch: this.token.end};
if (this.token.state.state === "pseudo") {
// We have just started the 'pseudo' context, start replacing the current token by leaving ':' char
startPos.ch = startPos.ch + 1;
endPos = startPos;
}
if (this.context === TOKEN_TYPE_PSEUDO_SELECTOR) {
// If the hint label contains annotated data for illustration, then we might have
// different text to be inserted.
completion = PseudoRules.selectors[completion].text || completion;
}
this.editor.document.replaceRange(completion, startPos, endPos);
if (completion.slice(-1) === ")") {
cursor = this.editor.getCursorPos();
this.editor.setCursorPos({line: cursor.line, ch: cursor.ch - 1});
}
return false;
};
AppInit.appReady(function () {
// Register code hint providers
var pseudoSelectorHints = new PsudoSelectorHints();
CodeHintManager.registerHintProvider(pseudoSelectorHints, ["css", "scss", "less"], 0);
// For test
exports.pseudoSelectorHints = pseudoSelectorHints;
});
});

View File

@ -0,0 +1,219 @@
/*
* Copyright (c) 2017 - present Adobe Systems Incorporated. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*global describe, it, xit, expect, beforeEach, afterEach */
define(function (require, exports, module) {
"use strict";
var SpecRunnerUtils = brackets.getModule("spec/SpecRunnerUtils"),
CSSPseudoSelectorCodeHints = require("main"),
PseudoStaticDataRaw = require("text!PseudoSelectors.json"),
PseudoStaticData = JSON.parse(PseudoStaticDataRaw);
describe("CSS Pseudo selector/element Code Hinting", function () {
var defaultContent = ".selector1: { \n" +
"} \n" +
".selector2:: { \n" +
"} \n" +
".selector3:n { \n" +
"} \n" +
".selector4::f { \n" +
"} \n";
var testDocument, testEditor;
/*
* Create a mockup editor with the given content and language id.
*
* @param {string} content - content for test window
* @param {string} languageId
*/
function setupTest(content, languageId) {
var mock = SpecRunnerUtils.createMockEditor(content, languageId);
testDocument = mock.doc;
testEditor = mock.editor;
}
function tearDownTest() {
SpecRunnerUtils.destroyMockEditor(testDocument);
testEditor = null;
testDocument = null;
}
// Ask provider for hints at current cursor position; expect it to return some
function expectHints(provider, implicitChar, returnWholeObj) {
expect(provider.hasHints(testEditor, implicitChar)).toBe(true);
var hintsObj = provider.getHints();
expect(hintsObj).toBeTruthy();
// return just the array of hints if returnWholeObj is falsy
return returnWholeObj ? hintsObj : hintsObj.hints;
}
// Ask provider for hints at current cursor position; expect it NOT to return any
function expectNoHints(provider, implicitChar) {
expect(provider.hasHints(testEditor, implicitChar)).toBe(false);
}
// compares lists to ensure they are the same
function verifyListsAreIdentical(hintList, values) {
var i;
expect(hintList.length).toBe(values.length);
for (i = 0; i < values.length; i++) {
expect(hintList[i]).toBe(values[i]);
}
}
function selectHint(provider, expectedHint, implicitChar) {
var hintList = expectHints(provider, implicitChar);
expect(hintList.indexOf(expectedHint)).not.toBe(-1);
return provider.insertHint(expectedHint);
}
// Helper function for testing cursor position
function fixPos(pos) {
if (!("sticky" in pos)) {
pos.sticky = null;
}
return pos;
}
function expectCursorAt(pos) {
var selection = testEditor.getSelection();
expect(fixPos(selection.start)).toEqual(fixPos(selection.end));
expect(fixPos(selection.start)).toEqual(fixPos(pos));
}
function verifyFirstEntry(hintList, expectedFirstHint) {
expect(hintList[0]).toBe(expectedFirstHint);
}
// Helper function to
// a) ensure the hintList and the list with the available values have the same size
// b) ensure that all possible values are mentioned in the hintList
function verifyAllValues(hintList, values) {
expect(hintList.length).toBe(values.length);
expect(hintList.sort().toString()).toBe(values.sort().toString());
}
var modesToTest = ['css', 'scss', 'less'],
modeCounter;
var selectMode = function () {
return modesToTest[modeCounter];
};
describe("Pseudo selectors in different style modes", function () {
beforeEach(function () {
// create Editor instance (containing a CodeMirror instance)
var mock = SpecRunnerUtils.createMockEditor(defaultContent, selectMode());
testEditor = mock.editor;
testDocument = mock.doc;
});
afterEach(function () {
SpecRunnerUtils.destroyMockEditor(testDocument);
testEditor = null;
testDocument = null;
});
var testAllHints = function () {
testEditor.setCursorPos({ line: 0, ch: 11 }); // after :
var hintList = expectHints(CSSPseudoSelectorCodeHints.pseudoSelectorHints);
console.log(JSON.stringify(hintList));
verifyFirstEntry(hintList, "active"); // filtered on "empty string"
verifyListsAreIdentical(hintList, Object.keys(PseudoStaticData.selectors).sort());
},
testFilteredHints = function () {
testEditor.setCursorPos({ line: 4, ch: 12 }); // after :n
var hintList = expectHints(CSSPseudoSelectorCodeHints.pseudoSelectorHints);
console.log(JSON.stringify(hintList));
verifyFirstEntry(hintList, "not(selector)"); // filtered on "n"
verifyListsAreIdentical(hintList, ["not(selector)",
"nth-child(n)",
"nth-last-child(n)",
"nth-last-of-type(n)",
"nth-of-type(n)"]);
},
testNoHints = function () {
testEditor.setCursorPos({ line: 0, ch: 10 }); // after {
expect(CSSPseudoSelectorCodeHints.pseudoSelectorHints.hasHints(testEditor, 'a')).toBe(false);
};
for (modeCounter in modesToTest) {
it("should list all Pseudo selectors right after :", testAllHints);
it("should list filtered pseudo selectors right after :n", testFilteredHints);
it("should not list rule hints if the cursor is before :", testNoHints);
}
});
describe("Pseudo elements in various style modes", function () {
beforeEach(function () {
// create Editor instance (containing a CodeMirror instance)
var mock = SpecRunnerUtils.createMockEditor(defaultContent, selectMode());
testEditor = mock.editor;
testDocument = mock.doc;
});
afterEach(function () {
SpecRunnerUtils.destroyMockEditor(testDocument);
testEditor = null;
testDocument = null;
});
var testAllHints = function () {
testEditor.setCursorPos({ line: 2, ch: 12 }); // after ::
var hintList = expectHints(CSSPseudoSelectorCodeHints.pseudoSelectorHints);
console.log(JSON.stringify(hintList));
verifyFirstEntry(hintList, "after"); // filtered on "empty string"
verifyListsAreIdentical(hintList, Object.keys(PseudoStaticData.elements).sort());
},
testFilteredHints = function () {
testEditor.setCursorPos({ line: 6, ch: 13 }); // after ::f
var hintList = expectHints(CSSPseudoSelectorCodeHints.pseudoSelectorHints);
console.log(JSON.stringify(hintList));
verifyFirstEntry(hintList, "first-letter"); // filtered on "f"
verifyListsAreIdentical(hintList, ["first-letter",
"first-line"]);
},
testNoHints = function () {
testEditor.setCursorPos({ line: 2, ch: 10 }); // after ::f
expect(CSSPseudoSelectorCodeHints.pseudoSelectorHints.hasHints(testEditor, 'c')).toBe(false);
};
for (modeCounter in modesToTest) {
it("should list all Pseudo selectors right after :", testAllHints);
it("should list filtered pseudo selectors right after ::f", testFilteredHints);
it("should not list rule hints if the cursor is before :", testNoHints);
}
});
});
});

View File

@ -139,7 +139,7 @@ define(function (require, exports, module) {
keys.forEach(function (lineNumber) {
lineNumber = +lineNumber;
if (lineNumber >= cm.firstLine() && lineNumber <= cm.lastLine()) {
range = rf(cm, CodeMirror.Pos(lineNumber));
range = rf(cm, CodeMirror.Pos(lineNumber, 0));
cachedRange = folds[lineNumber];
if (range && cachedRange && range.from.line === cachedRange.from.line &&
range.to.line === cachedRange.to.line) {

View File

@ -92,7 +92,7 @@ define(function (require, exports, module) {
var sr = _isCurrentlyFolded(i), // surrounding range for the current line if one exists
range;
var mark = marker("CodeMirror-foldgutter-blank");
var pos = CodeMirror.Pos(i),
var pos = CodeMirror.Pos(i, 0),
func = opts.rangeFinder || CodeMirror.fold.auto;
// don't look inside collapsed ranges
if (sr) {
@ -147,7 +147,7 @@ define(function (require, exports, module) {
* @returns {TextMarker} A CodeMirror TextMarker object
*/
function getFoldOnLine(cm, line) {
var pos = CodeMirror.Pos(line);
var pos = CodeMirror.Pos(line, 0);
var folds = cm.findMarksAt(pos) || [];
folds = folds.filter(isFold);
return folds.length ? folds[0] : undefined;
@ -220,7 +220,7 @@ define(function (require, exports, module) {
if (linesDiff === 0) {
if (foldedLines.indexOf(from) >= 0) {
newRange = rf(cm, CodeMirror.Pos(from));
newRange = rf(cm, CodeMirror.Pos(from, 0));
if (newRange && newRange.to.line - newRange.from.line >= minFoldSize) {
cm._lineFolds[from] = newRange;
} else {

View File

@ -117,13 +117,19 @@ define(function (require, exports, module) {
}
var saveFolds = prefs.getSetting("saveFoldStates");
if (!editor || !saveFolds) {
if (editor) {
editor._codeMirror._lineFolds = editor._codeMirror._lineFolds || {};
}
return;
}
var viewState = ViewStateManager.getViewState(editor.document.file);
var cm = editor._codeMirror;
var viewState = ViewStateManager.getViewState(editor.document.file);
var path = editor.document.file.fullPath;
var folds = cm._lineFolds || prefs.getFolds(path) || {};
//separate out selection folds from non-selection folds
var nonSelectionFolds = {}, selectionFolds = {}, range;
Object.keys(folds).forEach(function (line) {
@ -323,14 +329,14 @@ define(function (require, exports, module) {
}
/**
* When a brand new editor is seen, initialise fold-gutter and restore line folds in it. Save line folds in
* departing editor in case it's getting closed.
* When a brand new editor is seen, initialise fold-gutter and restore line folds in it.
* Save line folds in departing editor in case it's getting closed.
* @param {object} event the event object
* @param {Editor} current the current editor
* @param {Editor} previous the previous editor
*/
function onActiveEditorChanged(event, current, previous) {
if (current) {
if (current && !current._codeMirror._lineFolds) {
enableFoldingInEditor(current);
}
if (previous) {

View File

@ -1,9 +1,17 @@
<html>
<head>
<style>
.test {
/* this should be collapsible */
}
</style>
<script>
function () {
/* this should be collapsible */
}
</script>
</head>
<body>
<form action="#" method="post">
<div>
<label for="name">Text Input:</label>
@ -12,7 +20,9 @@
<table>
<thead>
<tr>
<th></th>
<th>
{{handlebars}}
</th>
</tr>
</thead>
<tbody>

View File

@ -37,10 +37,10 @@ define(function (require, exports, module) {
},
html: {
filePath: testDocumentDirectory + "test.html",
foldableLines: [1, 2, 5, 7, 8, 12, 13, 14, 18, 19, 24, 27],
sameLevelFoldableLines: [8, 24],
firstSelection: {start: {line: 3, ch: 0}, end: {line: 10, ch: 0}},
secondSelection: {start: {line: 6, ch: 0}, end: {line: 17, ch: 4}}
foldableLines: [1, 2, 3, 4, 8, 9, 14, 15, 16, 20, 21, 22, 23, 28, 29, 34, 37],
sameLevelFoldableLines: [3, 8],
firstSelection: {start: {line: 38, ch: 0}, end: {line: 41, ch: 0}},
secondSelection: {start: {line: 42, ch: 0}, end: {line: 45, ch: 4}}
},
hbs: {
filePath: testDocumentDirectory + "test.hbs",
@ -382,7 +382,7 @@ define(function (require, exports, module) {
});
});
it("can be disable persistence of fold states", function () {
it("can disable persistence of fold states", function () {
setPreference("saveFoldStates", false);
runs(function () {
foldCodeOnLine(foldableLines[0]);
@ -399,6 +399,14 @@ define(function (require, exports, module) {
var marks = getEditorFoldMarks();
expect(marks.length).toEqual(0);
});
runs(function () {
var lineNumbers = foldableLines;
var marks = getGutterFoldMarks();
var gutterNumbers = marks.filter(filterOpen)
.map(getLineNumber);
expect(gutterNumbers).toEqual(toZeroIndex(lineNumbers));
});
});
it("can set the minimum fold size", function () {

View File

@ -21,6 +21,7 @@
*
*/
/*global define, $, brackets,navigator, console, appshell */
define(function (require, exports, module) {
"use strict";
@ -30,20 +31,18 @@ define(function (require, exports, module) {
UrlParams = brackets.getModule("utils/UrlParams").UrlParams,
Strings = brackets.getModule("strings"),
HealthDataUtils = require("HealthDataUtils"),
uuid = require("thirdparty/uuid");
var prefs = PreferencesManager.getExtensionPrefs("healthData");
uuid = require("thirdparty/uuid"),
prefs = PreferencesManager.getExtensionPrefs("healthData"),
params = new UrlParams(),
ONE_MINUTE = 60 * 1000,
ONE_DAY = 24 * 60 * ONE_MINUTE,
FIRST_LAUNCH_SEND_DELAY = 30 * ONE_MINUTE,
timeoutVar;
prefs.definePreference("healthDataTracking", "boolean", true, {
description: Strings.DESCRIPTION_HEALTH_DATA_TRACKING
});
var ONE_MINUTE = 60 * 1000,
ONE_DAY = 24 * 60 * ONE_MINUTE,
FIRST_LAUNCH_SEND_DELAY = 30 * ONE_MINUTE,
timeoutVar;
var params = new UrlParams();
params.parse();
/**
@ -53,14 +52,6 @@ define(function (require, exports, module) {
var result = new $.Deferred(),
oneTimeHealthData = {};
var userUuid = PreferencesManager.getViewState("UUID");
if (!userUuid) {
userUuid = uuid.v4();
PreferencesManager.setViewState("UUID", userUuid);
}
oneTimeHealthData.uuid = userUuid;
oneTimeHealthData.snapshotTime = Date.now();
oneTimeHealthData.os = brackets.platform;
oneTimeHealthData.userAgent = window.navigator.userAgent;
@ -79,7 +70,61 @@ define(function (require, exports, module) {
oneTimeHealthData.bracketsTheme = bracketsTheme;
})
.always(function () {
return result.resolve(oneTimeHealthData);
var userUuid = PreferencesManager.getViewState("UUID");
var olderUuid = PreferencesManager.getViewState("OlderUUID");
if (userUuid && olderUuid) {
oneTimeHealthData.uuid = userUuid;
oneTimeHealthData.olderuuid = olderUuid;
return result.resolve(oneTimeHealthData);
} else {
// So we are going to get the Machine hash in either of the cases.
if (appshell.app.getMachineHash) {
appshell.app.getMachineHash(function (err, macHash) {
var generatedUuid;
if (err) {
generatedUuid = uuid.v4();
} else {
generatedUuid = macHash;
}
if (!userUuid) {
// Could be a new user. In this case
// both will remain the same.
userUuid = olderUuid = generatedUuid;
} else {
// For existing user, we will still cache
// the older uuid, so that we can improve
// our reporting in terms of figuring out
// the new users accurately.
olderUuid = userUuid;
userUuid = generatedUuid;
}
PreferencesManager.setViewState("UUID", userUuid);
PreferencesManager.setViewState("OlderUUID", olderUuid);
oneTimeHealthData.uuid = userUuid;
oneTimeHealthData.olderuuid = olderUuid;
return result.resolve(oneTimeHealthData);
});
} else {
// Probably running on older shell, in which case we will
// assign the same uuid to olderuuid.
if (!userUuid) {
oneTimeHealthData.uuid = oneTimeHealthData.olderuuid = uuid.v4();
} else {
oneTimeHealthData.olderuuid = userUuid;
}
PreferencesManager.setViewState("UUID", oneTimeHealthData.uuid);
PreferencesManager.setViewState("OlderUUID", oneTimeHealthData.olderuuid);
return result.resolve(oneTimeHealthData);
}
}
});
});
@ -127,13 +172,16 @@ define(function (require, exports, module) {
* for opt-out/in is closed.
*/
function checkHealthDataSend() {
var result = new $.Deferred(),
isHDTracking = prefs.get("healthDataTracking");
var result = new $.Deferred(),
isHDTracking = prefs.get("healthDataTracking"),
nextTimeToSend,
currentTime;
HealthLogger.setHealthLogsEnabled(isHDTracking);
window.clearTimeout(timeoutVar);
if (isHDTracking) {
var nextTimeToSend = PreferencesManager.getViewState("nextHealthDataSendTime"),
currentTime = Date.now();
nextTimeToSend = PreferencesManager.getViewState("nextHealthDataSendTime");
currentTime = Date.now();
// Never send data before FIRST_LAUNCH_SEND_DELAY has ellapsed on a fresh install. This gives the user time to read the notification
// popup, learn more, and opt out if desired

View File

@ -29,9 +29,10 @@ define(function (require, exports, module) {
var Acorn = require("node_modules/acorn/dist/acorn");
var LANGUAGE_ID = "javascript",
JSX_LANGUAGE_ID = "jsx",
HTML_LANGUAGE_ID = "html",
PHP_LANGUAGE_ID = "php",
SUPPORTED_LANGUAGES = [LANGUAGE_ID, HTML_LANGUAGE_ID, PHP_LANGUAGE_ID],
SUPPORTED_LANGUAGES = [LANGUAGE_ID, JSX_LANGUAGE_ID, HTML_LANGUAGE_ID, PHP_LANGUAGE_ID],
SINGLE_QUOTE = "'",
DOUBLE_QUOTE = "\"";

View File

@ -0,0 +1,6 @@
define(function (require, exports, module) {
"use strict";
// To make sure we load this extension in order to define LESS mode for tests
require("main");
});

View File

@ -1,4 +1,4 @@
<div class="css-prop-defn" tabIndex="0"> <!-- tabIndex needed: otherwise click focuses CodeMirror scroller and Esc won't work -->
<div class="css-prop-defn {{#fullscreenSummary}}fullscreen-summary{{/fullscreenSummary}}" tabIndex="0"> <!-- tabIndex needed: otherwise click focuses CodeMirror scroller and Esc won't work -->
<div class="css-prop-summary">
<h1>{{propName}}</h1>
<div>{{{summary}}}</div>

View File

@ -22,7 +22,7 @@
*/
/**
* Inline widget to display WebPlatformDocs JSON data nicely formatted
* Inline widget to display MDNDocs JSON data nicely formatted
*/
define(function (require, exports, module) {
'use strict';
@ -42,22 +42,23 @@ define(function (require, exports, module) {
var SCROLL_LINE_HEIGHT = 40;
// Load CSS
ExtensionUtils.loadStyleSheet(module, "WebPlatformDocs.less");
ExtensionUtils.loadStyleSheet(module, "MDNDocs.less");
/**
* @param {!string} cssPropName
* @param {!{SUMMARY:string, URL:string, VALUES:?Array.<{value:string, description:string}>}} cssPropDetails
*/
function InlineDocsViewer(cssPropName, cssPropDetails) {
function InlineDocsViewer(PropName, PropDetails) {
InlineWidget.call(this);
var templateVars = {
propName : cssPropName,
summary : cssPropDetails.SUMMARY,
propValues : cssPropDetails.VALUES || [],
url : cssPropDetails.URL,
Strings : Strings
propName : PropName,
summary : PropDetails.SUMMARY,
fullscreenSummary : !(PropDetails.VALUES && PropDetails.VALUES.length),
propValues : PropDetails.VALUES || [],
url : PropDetails.URL,
Strings : Strings
};
var html = Mustache.render(inlineEditorTemplate, templateVars);

View File

@ -144,6 +144,16 @@
}
}
.fullscreen-summary {
.css-prop-summary {
width: 95%;
}
.css-prop-values, .divider-holder {
display: none;
}
}
.content-bottom {
// Used to pull bottom edge of .css-prop-defn down below its two floated children.
// Also prevents .more-info (after us in DOM order) from overlapping the float: right content.

View File

@ -0,0 +1,3 @@
# Updating the Docs
* Use the Node script [scrape-mdn](https://github.com/mozilla/brackets/tree/master/src/extensions/extra/MDNDocs/tools/scrape-mdn) to update the `css.json` and `html.json` contents:
* Both the JSON files will have URL and Summary, but for css.json we need to have possible values of each css property along with small description, so use this Node script [MDNDocsScrapper](https://github.com/saurabh95/MDNDocsScrapper), this takes css.json as input and then creates a newcss.json with the desired content.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,550 @@
{
"<a>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a",
"SUMMARY": "The <em>HTML <code>&lt;a&gt;</code> Element</em> (or the HTML Anchor Element) defines a hyperlink, the named target destination for a hyperlink, or both."
},
"<abbr>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/abbr",
"SUMMARY": "The <em>HTML Abbreviation element</em> (<strong>&lt;abbr&gt;</strong>) represents an abbreviation and optionally provides a full description for it. If present, the <code>title</code> attribute must contain this full description and nothing else."
},
"<acronym>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/acronym",
"SUMMARY": "The HTML Acronym Element (<code>&lt;acronym&gt;)</code> allows authors to clearly indicate a sequence of characters that compose an acronym or abbreviation for a word."
},
"<address>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/address",
"SUMMARY": "The <em>HTML <code>Address</code> Element</em> (<strong>&lt;address&gt;</strong>) should be used by authors to supply contact information for its nearest <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/article\" title=\"The HTML Article Element (&lt;article&gt;) represents a self-contained composition in a document, page, application, or site, which is intended to be independently distributable or reusable, e.g., in syndication. This could be a forum post, a magazine or newspaper article, a blog entry, or any other independent item of content. Each &lt;article&gt; should be identified, typically by including a heading (h1-h6 element) as a child of the &lt;article&gt; element.\"><code>&lt;article&gt;</code></a> or <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/body\" title=\"The HTML Body Element (&lt;body&gt;) represents the content of an HTML&#xA0;document. There can be only one &lt;body&gt; element in a document.\"><code>&lt;body&gt;</code></a> ancestor; in the latter case, it applies to the whole document."
},
"<applet>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/applet",
"SUMMARY": "The HTML Applet Element (<code>&lt;applet&gt;</code>) identifies the inclusion of a Java applet."
},
"<area>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/area",
"SUMMARY": "The <em>HTML <code>&lt;area&gt;</code> element</em> defines a hot-spot region on an image, and optionally associates it with a <a class=\"glossaryLink\" href=\"https://developer.mozilla.org/en-US/docs/Glossary/Hyperlink\" title=\"hypertext link: Hyperlinks connect web pages, or data items, to one another. In HTML, anchor elements define the hyperlinks from a part of a Web page, such as a text string or image, to another site, page or even a particular point within a page.\">hypertext link</a>. This element is used only within a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map\" title=\"The HTML &lt;map&gt; element is used with &lt;area&gt; elements to define an image map (a clickable link area).\"><code>&lt;map&gt;</code></a> element."
},
"<article>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/article",
"SUMMARY": "The <em>HTML <code>Article</code> Element</em> (<strong>&lt;article&gt;</strong>) represents a self-contained composition in a document, page, application, or site, which is intended to be independently distributable or reusable, e.g., in syndication. This could be a forum post, a magazine or newspaper article, a blog entry, or any other independent item of content. Each <em><code>&lt;article&gt;</code></em> should be identified, typically by including a heading (<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements\">h1-h6</a> element) as a child of the <em><code>&lt;article&gt;</code></em> element."
},
"<aside>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/aside",
"SUMMARY": "The <em>HTML <code>&lt;aside&gt;</code> element</em> represents a section of the page with content connected tangentially to the rest, which could be considered separate from that content. These sections are often represented as sidebars or inserts. They often contain the definitions on the sidebars, such as definitions from the glossary; there may also be other types of information, such as related advertisements; the biography of the author; web applications; profile information or related links on the blog."
},
"<audio>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio",
"SUMMARY": "The <strong>HTML <code>&lt;audio&gt;</code> element</strong> is used to embed sound content in documents. It may contain several audio sources, represented using the <code>src</code> attribute or the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source\" title=\"The HTML &lt;source&gt; element is used to specify multiple media resources for &lt;picture&gt;, &lt;audio&gt; and &lt;video&gt; elements. It is an empty element. It is commonly used to serve the same media in multiple formats supported by different browsers.\"><code>&lt;source&gt;</code></a> element; the browser will choose the most suitable one."
},
"<b>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b",
"SUMMARY": "The <strong>HTML <code>&lt;b&gt;</code> Element</strong> represents a span of text stylistically different from normal text, without conveying any special importance or relevance. It is typically used for keywords in a summary, product names in a review, or other spans of text whose typical presentation would be boldfaced. Another example of its use is to mark the lead sentence of each paragraph of an article."
},
"<base>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base",
"SUMMARY": "The <em>HTML Base Element</em> (<strong>&lt;base&gt;</strong>) specifies the base URL to use for all relative URLs contained within a document. There can be only one &lt;base&gt; element in a document."
},
"<basefont>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/basefont",
"SUMMARY": "The HTML basefont element (<code>&lt;basefont&gt;</code>) establishes a default font size for a document. Font size then can be varied relative to the base font size using the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/font\" title=\"The HTML Font Element (&lt;font&gt;) defines the font size, color and face for its content.\"><code>&lt;font&gt;</code></a> element."
},
"<bdi>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdi",
"SUMMARY": "The <em>HTML <code>&lt;bdi&gt;</code> Element</em> (or Bi-Directional Isolation Element) isolates a span of text that might be formatted in a different direction from other text outside it."
},
"<bdo>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bdo",
"SUMMARY": "The <strong>HTML <code>&lt;bdo&gt;</code> Element</strong> (or <em>HTML bidirectional override element</em>) is used to override the current directionality of text. It causes the directionality of the characters to be ignored in favor of the specified directionality."
},
"<bgsound>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/bgsound",
"SUMMARY": "The HTML Background Sound Element (<bgsound>) is an Internet Explorer element associating a background sound with a page."
},
"<big>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/big",
"SUMMARY": "The HTML Big Element (<code>&lt;big&gt;</code>) makes the text <em>font size</em> one size bigger (for example, from small to medium, or from large to x-large) up to the browser's maximum font size."
},
"<blink>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blink",
"SUMMARY": "The HTML Blink Element (<code>&lt;blink&gt;</code>) is a non-standard element causing the enclosed text to flash slowly."
},
"<blockquote>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote",
"SUMMARY": "The <strong>HTML <code>&lt;blockquote&gt;</code> Element</strong> (or <em>HTML Block Quotation Element</em>) indicates that the enclosed text is an extended quotation. Usually, this is rendered visually by indentation (see <a href=\"https://developer.mozilla.org/en-US/docs/HTML/Element/blockquote#Notes\" title=\"HTML/Element/blockquote#Notes\">Notes</a> for how to change it). A URL for the source of the quotation may be given using the <strong>cite</strong> attribute, while a text representation of the source can be given using the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/cite\" title=\"The&#xA0;HTML Citation Element&#xA0;(&lt;cite&gt;) represents a reference to a creative work. It must include the title of a work or a URL reference,&#xA0;which may be in an abbreviated form according to the conventions used for the addition of citation metadata.\"><code>&lt;cite&gt;</code></a> element."
},
"<body>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/body",
"SUMMARY": "The <em>HTML Body Element</em> (<strong>&lt;body&gt;</strong>) represents the content of an HTML document. There can be only one <code>&lt;body&gt;</code> element in a document."
},
"<br>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/br",
"SUMMARY": "The <strong>HTML <code>&lt;br&gt;</code> Element</strong> (or <em>HTML </em><em>Line Break Element</em>) produces a line break in text (carriage-return). It is useful for writing a poem or an address, where the division of lines is significant."
},
"<button>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button",
"SUMMARY": "The <strong>HTML <em><code>&lt;button&gt;</code></em> Element</strong> represents a clickable button."
},
"<canvas>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas",
"SUMMARY": "The <strong>HTML <code>&lt;canvas&gt;</code> Element</strong> can be used to draw graphics via scripting (usually <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript\" title=\"JavaScript\">JavaScript</a>). For example, it can be used to draw graphs, make photo compositions or even perform animations. You may (and should) provide alternate content inside the <code>&lt;canvas&gt;</code> block. That content will be rendered both on older browsers that don't support canvas <strong>and</strong> in browsers with JavaScript disabled."
},
"<caption>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/caption",
"SUMMARY": "The <strong>HTML <code>&lt;caption&gt;</code> Element</strong> (or <em>HTML Table Caption Element</em>) represents the title of a table. Though it is always the first descendant of a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table\" title=\"The HTML Table Element (&lt;table&gt;) represents data in two dimensions or more.\"><code>&lt;table&gt;</code></a>, its styling, using CSS, may place it elsewhere, relative to the table."
},
"<center>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/center",
"SUMMARY": "The HTML Center Element (<code>&lt;center&gt;</code>) is a <a href=\"https://developer.mozilla.org/en-US/docs/HTML/Block-level_elements\" title=\"HTML/Block-level_elements\">block-level element</a> that can contain paragraphs and other block-level and inline elements. The entire content of this element is centered horizontally within its containing element (typically, the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/body\" title=\"The HTML Body Element (&lt;body&gt;) represents the content of an HTML&#xA0;document. There can be only one &lt;body&gt; element in a document.\"><code>&lt;body&gt;</code></a>)."
},
"<cite>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/cite",
"SUMMARY": "The <em>HTML Citation Element</em> (<strong>&lt;cite&gt;</strong>) represents a reference to a creative work. It must include the title of a work or a URL reference, which may be in an abbreviated form according to the conventions used for the addition of citation metadata."
},
"<code>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/code",
"SUMMARY": "The <em>HTML Code Element</em> (<strong>&lt;code&gt;</strong>) represents a fragment of computer code. By default, it is displayed in the browser's default monospace font."
},
"<col>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col",
"SUMMARY": "The <em>HTML Table Column Element</em> (<strong>&lt;col&gt;</strong>) defines a column within a table and is used for defining common semantics on all common cells. It is generally found within a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup\" title=\"The HTML &lt;colgroup&gt; Element (or HTML Table Column Group Element) defines a group of columns within a table.\"><code>&lt;colgroup&gt;</code></a> element."
},
"<colgroup>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup",
"SUMMARY": "The <em>HTML Table Column Group Element</em> (<strong>&lt;colgroup&gt;</strong>) defines a group of columns within a table."
},
"<command>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/command",
"SUMMARY": "The <code>command</code> element represents a command which the user can invoke."
},
"<content>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/content",
"SUMMARY": "The <strong><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML\">HTML</a> <code>&lt;content&gt;</code></strong> element is used inside of <a href=\"https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM\">Shadow DOM</a> as an <a class=\"glossaryLink\" href=\"https://developer.mozilla.org/en-US/docs/Glossary/insertion_point\" title=\"The definition of that term (insertion point) has not been written yet; please consider contributing it!\">insertion point</a>. It is not intended to be used in ordinary HTML. It is used with <a href=\"https://developer.mozilla.org/en-US/docs/Web/Web_Components\">Web Components</a>."
},
"<data>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/data",
"SUMMARY": "The <strong>HTML <code>&lt;data&gt;</code> Element</strong> links a given content with a machine-readable translation. If the content is time- or date-related, the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/time\" title=\"The HTML &lt;time&gt; element represents either a time on a 24-hour clock or a precise date in the Gregorian calendar (with optional time and timezone information).\"><code>&lt;time&gt;</code></a> must be used."
},
"<datalist>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist",
"SUMMARY": "The <em>HTML Datalist Element</em> (<strong>&lt;datalist&gt;</strong>) contains a set of <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option\" title=\"In a Web form, the HTML &lt;option&gt; element is used to create a control representing an item within a &lt;select&gt;, an &lt;optgroup&gt; or a &lt;datalist&gt; HTML5 element.\"><code>&lt;option&gt;</code></a> elements that represent the values available for other controls."
},
"<dd>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dd",
"SUMMARY": "The <em>HTML Description Element</em> (<strong>&lt;dd&gt;</strong>) indicates the description of a term in a description list (<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl\" title=\"The HTML &lt;dl&gt; Element (or HTML Description List Element) encloses a list of pairs of terms and descriptions. Common uses for this element are to implement a glossary or to display metadata (a list of key-value pairs).\"><code>&lt;dl&gt;</code></a>) element. This element can occur only as a child element of a definition list and it must follow a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dt\" title=\"The HTML &lt;dt&gt; element (or HTML Definition Term Element) identifies a term in a definition list. This element can occur only as a child element of a &lt;dl&gt;. It is usually followed by a &lt;dd&gt; element; however, multiple &lt;dt&gt; elements in a row indicate several terms that are all defined by the immediate next &lt;dd&gt; element.\"><code>&lt;dt&gt;</code></a> element."
},
"<del>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/del",
"SUMMARY": "The <em>HTML Deleted Text Element</em> (<strong>&lt;del&gt;</strong>) represents a range of text that has been deleted from a document. This element is often (but need not be) rendered with strike-through text."
},
"<details>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details",
"SUMMARY": "The <em>HTML Details Element</em> (<strong>&lt;details&gt;</strong>) is used as a disclosure widget from which the user can retrieve additional information."
},
"<dfn>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dfn",
"SUMMARY": "The <em>HTML Definition Element</em> (<strong>&lt;dfn&gt;</strong>) represents the defining instance of a term."
},
"<dialog>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog",
"SUMMARY": "The <strong>HTML <code>&lt;dialog&gt;</code> element</strong> represents a dialog box or other interactive component, such as an inspector or window. <code>&lt;form&gt;</code> elements can be integrated within a dialog by specifying them with the attribute <code>method=\"dialog\"</code>. When such a form is submitted, the dialog is closed with a <code>returnValue</code> attribute set to the <code>value</code> of the submit button used."
},
"<dir>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dir",
"SUMMARY": "The <em>HTML directory element</em> (<code>&lt;dir&gt;</code>) represents a directory, namely a collection of filenames."
},
"<div>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div",
"SUMMARY": "The <strong><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML\">HTML</a> <code>&lt;div&gt;</code> element</strong> (or <em>HTML Document Division Element</em>) is the generic container for flow content, which does not inherently represent anything. It can be used to group elements for styling purposes (using the <strong>class</strong> or <strong>id</strong> attributes), or because they share attribute values, such as <strong>lang</strong>. It should be used only when no other semantic element (such as <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/article\" title=\"The HTML &lt;article&gt; Element represents a self-contained composition in a document, page, application, or site, which is intended to be independently distributable or reusable, e.g., in syndication. This could be a forum post, a magazine or newspaper article, a blog entry, a user-submitted comment, an interactive widget or gadget, or any other independent item of content.\"><code>&lt;article&gt;</code></a> or <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/nav\" title=\"The HTML Navigation Element (&lt;nav&gt;) represents a section of a page that links to other pages or to parts within the page: a section with navigation links.\"><code>&lt;nav&gt;</code></a>) is appropriate."
},
"<dl>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl",
"SUMMARY": "The <strong>HTML <code>&lt;dl&gt;</code> Element</strong> (or <em>HTML</em> <em>Description List Element</em>) encloses a list of pairs of terms and descriptions. Common uses for this element are to implement a glossary or to display metadata (a list of key-value pairs)."
},
"<dt>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dt",
"SUMMARY": "The <strong>HTML <code>&lt;dt&gt;</code> element</strong> (or HTML Definition Term Element) identifies a term in a definition list. This element can occur only as a child element of a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl\" title=\"The HTML &lt;dl&gt; Element (or HTML Description List Element) encloses a list of pairs of terms and descriptions. Common uses for this element are to implement a glossary or to display metadata (a list of key-value pairs).\"><code>&lt;dl&gt;</code></a>. It is usually followed by a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dd\" title=\"The HTML &lt;dd&gt; Element (or HTML Description Element) indicates the description of a term in a description list (&lt;dl&gt;) element. This element can occur only as a child element of a definition list and it must follow a &lt;dt&gt; element.\"><code>&lt;dd&gt;</code></a> element; however, multiple <code>&lt;dt&gt;</code> elements in a row indicate several terms that are all defined by the immediate next <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dd\" title=\"The HTML &lt;dd&gt; Element (or HTML Description Element) indicates the description of a term in a description list (&lt;dl&gt;) element. This element can occur only as a child element of a definition list and it must follow a &lt;dt&gt; element.\"><code>&lt;dd&gt;</code></a> element."
},
"<element>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/element",
"SUMMARY": "The <strong><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML\">HTML</a> <code>&lt;element&gt;</code> element</strong> is used to define new custom DOM elements."
},
"<em>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em",
"SUMMARY": "The <em>HTML Emphasis Element</em> (<strong>&lt;em&gt;</strong>) marks text that has stress emphasis. The <code>&lt;em&gt;</code> element can be nested, with each level of nesting indicating a greater degree of emphasis."
},
"<embed>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed",
"SUMMARY": "The <strong>HTML <code>&lt;embed&gt;</code> Element</strong> represents an integration point for an external application or interactive content (in other words, a plug-in)."
},
"<fieldset>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset",
"SUMMARY": "The <strong>HTML <code>&lt;fieldset&gt;</code> element</strong> is used to group several controls as well as labels (<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label\" title=\"The HTML Label&#xA0;Element (&lt;label&gt;) represents a caption for an item in a user interface. It can be associated with a control either by placing the control element inside the &lt;label&gt; element, or by using the for attribute. Such a control is called the labeled control of the label element.\"><code>&lt;label&gt;</code></a>) within a web form."
},
"<figcaption>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figcaption",
"SUMMARY": "The <strong>HTML <code>&lt;figcaption&gt;</code> Element</strong> represents a caption or a legend associated with a figure or an illustration described by the rest of the data of the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figure\" title=\"The HTML &lt;figure&gt; Element represents self-contained content, frequently with a caption&#xA0;(&lt;figcaption&gt;), and is&#xA0;typically referenced as a single unit. While it is related to the main flow, its position is independent of the main flow. Usually this is an image, an illustration, a diagram, a code snippet, or a schema that is referenced in the main text, but that can be moved to another page or to an appendix without affecting the main flow.\"><code>&lt;figure&gt;</code></a> element which is its immediate ancestor which means <code>&lt;figcaption&gt;</code> can be the first or last element inside a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figure\" title=\"The HTML &lt;figure&gt; Element represents self-contained content, frequently with a caption&#xA0;(&lt;figcaption&gt;), and is&#xA0;typically referenced as a single unit. While it is related to the main flow, its position is independent of the main flow. Usually this is an image, an illustration, a diagram, a code snippet, or a schema that is referenced in the main text, but that can be moved to another page or to an appendix without affecting the main flow.\"><code>&lt;figure&gt;</code></a> block. Also, the <em>HTML Figcaption Element </em>is optional; if not provided, then the parent figure element will have no caption."
},
"<figure>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figure",
"SUMMARY": "The <strong>HTML <code>&lt;figure&gt;</code> Element</strong> represents self-contained content, frequently with a caption (<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figcaption\" title=\"The HTML &lt;figcaption&gt; Element represents a caption or a legend associated with a figure or an illustration described by the rest of the data of the &lt;figure&gt; element which is its immediate ancestor which means &lt;figcaption&gt; can be the first or last element inside a &lt;figure&gt; block.&#xA0;Also, the HTML Figcaption Element&#xA0;is optional; if not provided, then the parent figure element will have no caption.\"><code>&lt;figcaption&gt;</code></a>)<em><code>,</code></em> and is typically referenced as a single unit. While it is related to the main flow, its position is independent of the main flow. Usually this is an image, an illustration, a diagram, a code snippet, or a schema that is referenced in the main text, but that can be moved to another page or to an appendix without affecting the main flow."
},
"<font>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/font",
"SUMMARY": "The <em>HTML Font Element</em> (<span style=\"font-family: Courier New;\">&lt;font&gt;</span>) defines the font size, color and face for its content."
},
"<footer>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/footer",
"SUMMARY": "The <em>HTML Footer Element</em> (<strong>&lt;footer&gt;</strong>) represents a footer for its nearest <a href=\"https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Sections_and_Outlines_of_an_HTML5_document#Defining_Sections_in_HTML5\">sectioning content</a> or <a href=\"https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Sections_and_Outlines_of_an_HTML5_document#Sectioning_root\" title=\"Sections and Outlines of an HTML5 document#Sectioning root\">sectioning root</a> element. A footer typically contains information about the author of the section, copyright data or links to related documents."
},
"<form>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form",
"SUMMARY": "The <strong>HTML <code>&lt;form&gt;</code> element</strong> represents a document section that contains interactive controls to submit information to a web server."
},
"<frame>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frame",
"SUMMARY": "<code>&lt;frame&gt;</code> is an HTML element which defines a particular area in which another HTML document can be displayed. A frame should be used within a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frameset\" title=\"&lt;frameset&gt; is an HTML element which is used to contain &lt;frame&gt; elements.\"><code>&lt;frameset&gt;</code></a>."
},
"<frameset>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frameset",
"SUMMARY": "<code>&lt;frameset&gt;</code> is an HTML element which is used to contain <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frame\" title=\"&lt;frame&gt; is an HTML element which defines a particular area in which another HTML document can be displayed. A frame should be used within a &lt;frameset&gt;.\"><code>&lt;frame&gt;</code></a> elements."
},
"<head>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head",
"SUMMARY": "The <em>HTML Head Element</em> (<strong>&lt;head&gt;</strong>) provides general information (metadata) about the document, including its title and links to or definitions of scripts and style sheets"
},
"<header>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/header",
"SUMMARY": "The <strong>HTML <code>&lt;header&gt;</code> Element</strong> represents a group of introductory or navigational aids. It may contain some heading elements but also other elements like a logo, wrapped section's header, a search form, and so on."
},
"<hgroup>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hgroup",
"SUMMARY": "The <strong>HTML <code>&lt;hgroup&gt;</code> Element</strong> (<em>HTML Headings Group Element</em>) represents the heading of a section. It defines a single title that participates in <a href=\"https://developer.mozilla.org/en-US/docs/Sections_and_Outlines_of_an_HTML5_document\" title=\"Sections and Outlines of an HTML5 document\">the outline of the document</a> as the heading of the implicit or explicit section that it belongs to."
},
"<hr>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hr",
"SUMMARY": "The <strong>HTML <code>&lt;hr&gt;</code> element</strong> represents a thematic break between paragraph-level elements (for example, a change of scene in a story, or a shift of topic with a section). In previous versions of HTML, it represented a horizontal rule. It may still be displayed as a horizontal rule in visual browsers, but is now defined in semantic terms, rather than presentational terms."
},
"<html>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/html",
"SUMMARY": "The <em>HTML Root Element</em> (<strong><code>&lt;html&gt;</code></strong>) represents the root of an HTML document. All other elements must be descendants of this element."
},
"<i>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/i",
"SUMMARY": "The <strong>HTML <code>&lt;i&gt;</code> Element</strong> represents a range of text that is set off from the normal text for some reason, for example, technical terms, foreign language phrases, or fictional character thoughts. It is typically displayed in italic type."
},
"<iframe>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe",
"SUMMARY": "The <em>HTML Inline Frame Element</em> (<code><strong>&lt;iframe&gt;</strong></code>) represents a nested browsing context, effectively embedding another HTML page into the current page. In HTML 4.01, a document may contain a <code>head</code> and a <code>body</code> or a <code>head</code> and a <code>frame-set</code>, but not both a <code>body</code> and a <code>frame-set</code>. However, an <code>&lt;iframe&gt;</code> can be used within a normal document body. Each browsing context has its own session history and active document. The browsing context that contains the embedded content is called the <dfn>parent</dfn> browsing context. The <dfn>top-level</dfn> browsing context (which has no parent) is typically the browser window."
},
"<image>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/image",
"SUMMARY": "The HTML <code>&lt;image&gt;</code> element was an experimental element designed to display pictures. It never was implemented and the standard <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img\" title=\"The HTML &lt;img&gt; Element (or HTML Image Element) represents an image of the document.\"><code>&lt;img&gt;</code></a> element must be used."
},
"<img>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img",
"SUMMARY": "The <em>HTML Image Element</em> (<strong>&lt;img&gt;</strong>) represents an image of the document."
},
"<input>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input",
"SUMMARY": "The HTML <strong><code>&lt;input&gt;</code> element</strong> is used to create interactive controls for web-based forms in order to accept data from the user. The semantics of an <code>&lt;input&gt;</code> varies considerably depending on the value of its <code>type</code> attribute."
},
"<ins>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ins",
"SUMMARY": "The <strong>HTML <code>&lt;ins&gt;</code> Element</strong> (or <em>HTML Inserted Text</em>) HTML represents a range of text that has been added to a document."
},
"<isindex>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/isindex",
"SUMMARY": "<code>&lt;isindex&gt;</code> is an HTML element which is used for putting a text field in the document for querying document. <code>&lt;isindex&gt;</code> is intented to use inside of <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head\" title=\"The HTML &lt;head&gt; element represents a collection of metadata about the document, including links to or definitions of scripts and style sheets\"><code>&lt;head&gt;</code></a> element by W3C, however browsers provide support wherever it is used in the document."
},
"<kbd>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/kbd",
"SUMMARY": "The <em>HTML Keyboard Input Element</em> (<strong>&lt;kbd&gt;</strong>) represents user input and produces an inline element displayed in the browser's default monospace font."
},
"<keygen>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/keygen",
"SUMMARY": "The HTML <code>&lt;keygen&gt;</code> element exists to facilitate generation of key material, and submission of the public key as part of an <a href=\"https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Forms\">HTML form</a>. This mechanism is designed for use with Web-based certificate management systems. It is expected that the <code>&lt;keygen&gt;</code> element will be used in an HTML form along with other information needed to construct a certificate request, and that the result of the process will be a signed certificate."
},
"<label>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label",
"SUMMARY": "The<em> </em><em>HTML Label Element</em> (<code><strong>&lt;label&gt;</strong></code>) represents a caption for an item in a user interface. It can be associated with a control either by placing the control element inside the <code>&lt;label&gt;</code> element, or by using the <code>for</code> attribute. Such a control is called the <em>labeled control</em> of the label element."
},
"<legend>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/legend",
"SUMMARY": "The <strong>HTML <span style=\"font-family: Courier New;\">&lt;legend&gt;</span> Element</strong> (or <em>HTML Legend Field Element</em>) represents a caption for the content of its parent <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset\" title=\"The HTML &lt;fieldset&gt; element is used to group several controls as well as labels (&lt;label&gt;) within a web form.\"><code>&lt;fieldset&gt;</code></a>."
},
"<li>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li",
"SUMMARY": "The <em>HTML List Item Element</em> (<code>&lt;li&gt;</code>) is used to represent an item in a list. It must be contained in a parent element: an ordered list (<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol\" title=\"The HTML &lt;ol&gt; Element (or HTML Ordered List Element) represents an ordered list of items. Typically, ordered-list items are displayed with a preceding numbering, which can be of any form, like numerals, letters or Romans numerals or even simple bullets. This numbered style is not defined in the HTML description of the page, but in its associated CSS, using the list-style-type property.\"><code>&lt;ol&gt;</code></a>), an unordered list (<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul\" title=\"The HTML unordered list element (&lt;ul&gt;) represents an unordered list of items, namely a collection of items that do not have a numerical ordering, and their order in the list is meaningless. Typically, unordered-list items are displayed with a bullet, which can be of several forms, like a dot, a circle or a squared. The bullet style is not defined in the HTML description of the page, but in its associated CSS, using the list-style-type property.\"><code>&lt;ul&gt;</code></a>), or a menu (<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/menu\" title=\"The HTML &lt;menu&gt; element represents a group of commands that a user can perform or activate. This includes both list menus, which might appear across the top of a screen, as well as context menus, such as those that might appear underneath a button after it has been clicked.\"><code>&lt;menu&gt;</code></a>). In menus and unordered lists, list items are usually displayed using bullet points. In ordered lists, they are usually displayed with an ascending counter on the left, such as a number or letter."
},
"<link>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link",
"SUMMARY": "The <em>HTML Link Element</em> (<strong>&lt;link&gt;</strong>) specifies relationships between the current document and an external resource. Possible uses for this element include defining a relational framework for navigation. This Element is most used to link to style sheets."
},
"<listing>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/listing",
"SUMMARY": "The <em>HTML Listing Element</em> (<code>&lt;listing&gt;</code>) renders text between the start and end tags without interpreting the HTML in between and using a monospaced font. The HTML 2 standard recommended that lines shouldn't be broken when not greater than 132 characters."
},
"<main>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/main",
"SUMMARY": "The <em>HTML Main Element</em> (<strong>&lt;main&gt;</strong>) represents the main content of  the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/body\" title=\"The HTML Body Element (&lt;body&gt;) represents the content of an HTML&#xA0;document. There can be only one &lt;body&gt; element in a document.\"><code>&lt;body&gt;</code></a> of a document or application. The main content area consists of content that is directly related to, or expands upon the central topic of a document or the central functionality of an application. This content should be unique to the document, excluding any content that is repeated across a set of documents such as sidebars, navigation links, copyright information, site logos, and search forms (unless, of course, the document's main function is as a search form)."
},
"<map>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map",
"SUMMARY": "The <strong>HTML <code>&lt;map&gt;</code> element</strong> is used with <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/area\" title=\"The HTML &lt;area&gt; element defines a hot-spot region on an image, and optionally associates it with a hypertext link. This element is used only within a &lt;map&gt; element.\"><code>&lt;area&gt;</code></a> elements to define an image map (a clickable link area)."
},
"<mark>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/mark",
"SUMMARY": "The <em>HTML Mark Element</em> (&lt;mark&gt;) represents highlighted text, i.e., a run of text marked for reference purpose, due to its <em>relevance</em> in a particular context. For example it can be used in a page showing search results to highlight every instance of the searched-for word."
},
"<marquee>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/marquee",
"SUMMARY": "The HTML <code>&lt;marquee&gt;</code> element is used to insert a scrolling area of text."
},
"<menu>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/menu",
"SUMMARY": "The <strong>HTML <code>&lt;menu&gt;</code> element</strong> represents a group of commands that a user can perform or activate. This includes both list menus, which might appear across the top of a screen, as well as context menus, such as those that might appear underneath a button after it has been clicked."
},
"<menuitem>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/menuitem",
"SUMMARY": "The <strong>HTML <code>&lt;menuitem&gt;</code> element</strong> represents a command that a user is able to invoke through a popup menu. This includes context menus, as well as menus that might be attached to a menu button."
},
"<meta>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta",
"SUMMARY": "The <em><a class=\"glossaryLink\" href=\"https://developer.mozilla.org/en-US/docs/Glossary/HTML\" title=\"HTML: HTML (hypertext markup language) is a descriptive language that specifies webpage structure.\">HTML</a> Meta Element </em>(<strong>&lt;meta&gt;</strong>) represents any metadata information that cannot be represented by one of the other HTML meta-related elements (<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base\" title=\"The HTML Base Element (&lt;base&gt;) specifies the base URL to use for all relative URLs contained within a document. There can be only one &lt;base&gt; element in a document.\"><code>&lt;base&gt;</code></a>, <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link\" title=\"The HTML Link Element (&lt;link&gt;) specifies relationships between the current document and an external resource. Possible uses for this element include defining a relational framework for navigation. This Element is most used to link to style sheets.\"><code>&lt;link&gt;</code></a>, <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script\" title=\"The HTML &lt;script&gt; element is used to embed or reference an executable script within an HTML or XHTML document.\"><code>&lt;script&gt;</code></a>, <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style\" title=\"The HTML Style Element (&lt;style&gt;) contains style information for a document, or part of a document. By default, the style instructions written inside that element are expected to be CSS.\"><code>&lt;style&gt;</code></a> or <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title\" title=\"The HTML Title Element (&lt;title&gt;) defines the title of the document, shown in a browser's title bar or on the page's tab. It can only contain text and any contained tags are not interpreted.\"><code>&lt;title&gt;</code></a>)."
},
"<meter>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meter",
"SUMMARY": "The <strong>HTML <code>&lt;meter&gt;</code> Element</strong> represents either a scalar value within a known range or a fractional value."
},
"<multicol>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/multicol",
"SUMMARY": "The HTML <code>&lt;multicol&gt;</code> element was an experimental element designed to allow multi-column layouts. It never got any significant traction and is not implemented in any major browsers."
},
"<nav>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/nav",
"SUMMARY": "The <em>HTML Navigation Element</em> (<code>&lt;nav&gt;</code>) represents a section of a page that links to other pages or to parts within the page: a section with navigation links."
},
"<nobr>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/nobr",
"SUMMARY": "The HTML <code>&lt;nobr&gt;</code> element prevents a text from breaking into a new line automatically, so it is displayed on one long line and scrolling might be necessary. This tag is not standard HTML and should not be used."
},
"<noembed>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noembed",
"SUMMARY": "The <code><strong>&lt;noembed&gt;</strong></code> element is a deprecated and non-standard way to provide alternative, or \"fallback\", content for browsers that do not support the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed\" title=\"The HTML &lt;embed&gt; Element represents an integration point for an external application or interactive content (in other words, a plug-in).\"><code>&lt;embed&gt;</code></a> element or do not support <a href=\"https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Embedded_content\">embedded content</a> an author wishes to use."
},
"<noframes>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noframes",
"SUMMARY": "<code>&lt;noframes&gt;</code> is an HTML element which is used to supporting browsers which are not able to support <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frame\" title=\"&lt;frame&gt; is an HTML element which defines a particular area in which another HTML document can be displayed. A frame should be used within a &lt;frameset&gt;.\"><code>&lt;frame&gt;</code></a> elements or configured to do so."
},
"<noscript>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript",
"SUMMARY": "The <strong>HTML <code>&lt;noscript&gt;</code> Element</strong> defines a section of html to be inserted if a script type on the page is unsupported or if scripting is currently turned off in the browser."
},
"<object>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object",
"SUMMARY": "The <em>HTML Embedded Object Element</em> (<strong>&lt;object&gt;</strong>) represents an external resource, which can be treated as an image, a nested browsing context, or a resource to be handled by a plugin."
},
"<ol>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol",
"SUMMARY": "The <strong>HTML <code>&lt;ol&gt;</code> Element</strong> (or <em>HTML Ordered List Element</em>) represents an ordered list of items. Typically, ordered-list items are displayed with a preceding numbering, which can be of any form, like numerals, letters or Romans numerals or even simple bullets. This numbered style is not defined in the HTML description of the page, but in its associated CSS, using the <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type\" title=\"The list-style-type property specifies the appearance of a list item element. Because it is the only property that&#xA0;defaults to display:list-item, this is usually a &lt;li&gt; element, but can be any element with this display value.\"><code>list-style-type</code></a> property."
},
"<optgroup>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/optgroup",
"SUMMARY": "In a Web form, the <strong>HTML <code>&lt;optgroup&gt;</code> element</strong>  creates a grouping of options within a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select\" title=\"The HTML select (&lt;select&gt;) element represents a control that presents a menu of options. The options within the menu are represented by &lt;option&gt; elements, which can be grouped by &lt;optgroup&gt; elements. Options can be pre-selected for the user.\"><code>&lt;select&gt;</code></a> element."
},
"<option>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option",
"SUMMARY": "In a Web form, the <strong>HTML<em> </em><code>&lt;option&gt;</code><em> </em>element</strong> is used to create a control representing an item within a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select\" title=\"The HTML select (&lt;select&gt;) element represents a control that presents a menu of options. The options within the menu are represented by &lt;option&gt; elements, which can be grouped by &lt;optgroup&gt; elements. Options can be pre-selected for the user.\"><code>&lt;select&gt;</code></a>, an <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/optgroup\" title=\"In a Web form, the HTML &lt;optgroup&gt; element&#xA0; creates a grouping of options within a &lt;select&gt; element.\"><code>&lt;optgroup&gt;</code></a> or a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist\" title=\"The HTML &lt;datalist&gt; Element contains a set of &lt;option&gt; elements that represent the values available for other controls.\"><code>&lt;datalist&gt;</code></a> HTML5 element."
},
"<output>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/output",
"SUMMARY": "The <strong>HTML <code>&lt;output&gt;</code> element</strong> represents the result of a calculation or user action."
},
"<p>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p",
"SUMMARY": "The <strong>HTML <code>&lt;p&gt;</code> element</strong> <em>(</em>or <em>HTML Paragraph Element)</em> represents a paragraph of text."
},
"<param>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/param",
"SUMMARY": "The <strong>HTML <code>&lt;param&gt;</code> Element</strong> (or <em>HTML Parameter Element)</em> defines parameters for <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object\" title=\"The HTML &lt;object&gt; Element (or HTML Embedded Object Element) represents an external resource, which can be treated as an image, a nested browsing context, or a resource to be handled by a plugin.\"><code>&lt;object&gt;</code></a>."
},
"<picture>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture",
"SUMMARY": "The <strong>HTML <code>&lt;picture&gt;</code> element</strong> is a container used to specify multiple <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source\" title=\"The HTML &lt;source&gt; element is used to specify multiple media resources for &lt;picture&gt;, &lt;audio&gt; and &lt;video&gt; elements. It is an empty element. It is commonly used to serve the same media in multiple formats supported by different browsers.\"><code>&lt;source&gt;</code></a>s for a specific <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img\" title=\"The&#xA0;HTML Image Element&#xA0;(&lt;img&gt;) represents an image of the document.\"><code>&lt;img&gt;</code></a> contained in it. The browser will choose the most suitable source according to the current layout of the page (the constraints of the box the image will appear in) and the device it will be displayed on (e.g. a normal or hiDPI device)."
},
"<plaintext>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/plaintext",
"SUMMARY": "The <em>HTML Plaintext Element</em> (<code>&lt;plaintext&gt;</code>) renders everything following the start tag as raw text, without interpreting any HTML. There is no closing tag, since everything after it is considered raw text."
},
"<pre>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre",
"SUMMARY": "The <em>HTML Preformatted Text</em> (<strong>&lt;pre&gt;</strong>) represents preformatted text. Text within this element is typically displayed in a non-proportional font exactly as it is laid out in the file. Whitespaces inside this element are displayed as typed."
},
"<progress>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/progress",
"SUMMARY": "The <strong>HTML<em> </em><code>&lt;progress&gt;</code> Element</strong> is used to view the completion progress of a task. While the specifics of how it's displayed is left up to the browser developer, it's typically displayed as a progress bar. Javascript can be used to manipulate the value of progress bar."
},
"<q>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/q",
"SUMMARY": "The <em>HTML Quote Element</em> (<strong>&lt;q&gt;</strong>) indicates that the enclosed text is a short inline quotation. This element is intended for short quotations that don't require paragraph breaks; for long quotations use <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote\" title=\"The HTML &lt;blockquote&gt; Element (or HTML Block Quotation Element) indicates that the enclosed text is an extended quotation. Usually, this is rendered visually by indentation (see Notes for how to change it). A URL for the source of the quotation may be given using the cite attribute, while a text representation of the source can be given using the &lt;cite&gt; element.\"><code>&lt;blockquote&gt;</code></a> element."
},
"<rp>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rp",
"SUMMARY": "The <strong>HTML <code>&lt;rp&gt;</code> element</strong> is used to provide fall-back parenthesis for browsers non-supporting ruby annotations. Ruby annotations are for showing pronounciation of East Asian characters, like using Japanese furigana or Taiwainese bopomofo characters. The <code>&lt;rp&gt;</code> element is used in the case of lack of <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby\" title=\"The HTML &lt;ruby&gt; Element represents a ruby annotation. Ruby annotations are for showing pronounciation of East Asian characters.\"><code>&lt;ruby&gt;</code></a> element support its content has what should be displayed in order to indicate the presence of a ruby annotation, usually parentheses."
},
"<rt>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rt",
"SUMMARY": "The <strong>HTML <code>&lt;rt&gt;</code> Element</strong> embraces pronunciation of character presented in a ruby annotations, which are for showing pronunciation of East Asian characters and the <code>&lt;rt&gt;</code> element is used inside of <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby\" title=\"The HTML &lt;ruby&gt; Element represents a ruby annotation. Ruby annotations are for showing pronunciation of East Asian characters.\"><code>&lt;ruby&gt;</code></a> element."
},
"<rtc>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rtc",
"SUMMARY": "The <strong>HTML <code>&lt;rtc&gt;</code> Element</strong> embraces semantic annotations of characters presented in a ruby of <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rb\" title=\"This article hasn't been written yet. Please consider contributing!\"><code>&lt;rb&gt;</code></a> elements used inside of <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby\" title=\"The HTML &lt;ruby&gt; Element represents a ruby annotation. Ruby annotations are for showing pronounciation of East Asian characters.\"><code>&lt;ruby&gt;</code></a> element. <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rb\" title=\"This article hasn't been written yet. Please consider contributing!\"><code>&lt;rb&gt;</code></a> elements can have both pronunciation (<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rt\" title=\"The HTML &lt;rt&gt; Element embraces pronunciation of character presented in a ruby annotations, which are for showing pronunciation of East Asian characters and the &lt;rt&gt; element is used inside of &lt;ruby&gt; element.\"><code>&lt;rt&gt;</code></a> and semantic (<code>&lt;rtc&gt;</code>) annotations."
},
"<ruby>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby",
"SUMMARY": "The <strong>HTML <code>&lt;ruby&gt;</code> Element</strong> represents a ruby annotation. Ruby annotations are for showing pronunciation of East Asian characters."
},
"<s>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/s",
"SUMMARY": "The <em>HTML Strikethrough Element</em> (<code>&lt;s&gt;</code>) renders text with a strikethrough, or a line through it. Use the <code>&lt;s&gt;</code> element to represent things that are no longer relevant or no longer accurate. However, <code>&lt;s&gt;</code> is not appropriate when indicating document edits; for that, use the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/del\" title=\"The HTML &lt;del&gt; element (or HTML Deleted Text Element) represents a range of text that has been deleted from a document. This element is often (but need not be) rendered with strike-through text.\"><code>&lt;del&gt;</code></a> and <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ins\" title=\"The HTML &lt;ins&gt; Element (or HTML Inserted Text) HTML represents a range of text that has been added to a document.\"><code>&lt;ins&gt;</code></a> elements, as appropriate."
},
"<samp>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/samp",
"SUMMARY": "The HTML <span style=\"font-family: Courier New;\">&lt;samp&gt;</span> element is an element intended to identify sample output from a computer program. It is usually displayed in the browser's default monotype font (such as Lucida Console)."
},
"<script>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script",
"SUMMARY": "The <strong>HTML <code>&lt;script&gt;</code> element</strong> is used to embed or reference an executable script within an <abbr title=\"Hypertext Markup Language\">HTML</abbr> or <abbr title=\"Extensible Hypertext Markup Language\">XHTML</abbr> document."
},
"<section>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/section",
"SUMMARY": "The <em>HTML Section Element</em> (<code>&lt;section&gt;</code>) represents a generic section of a document, i.e., a thematic grouping of content, typically with a heading. Each <code>&lt;section&gt;</code> should be identified, typically by including a heading (<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h1\" title=\"Heading elements implement six levels of document headings, &lt;h1&gt; is the most important and &lt;h6&gt; is the least. A heading element briefly describes the topic of the section it introduces. Heading information may be used by user agents, for example, to construct a table of contents for a document automatically.\"><code>&lt;h1&gt;</code></a>-<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/h6\" title=\"Heading elements implement six levels of document headings, &lt;h1&gt; is the most important and &lt;h6&gt; is the least. A heading element briefly describes the topic of the section it introduces. Heading information may be used by user agents, for example, to construct a table of contents for a document automatically.\"><code>&lt;h6&gt;</code></a> element) as a child of the <code>&lt;section&gt;</code> element."
},
"<select>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select",
"SUMMARY": "The HTML <em>select</em> (<code>&lt;select&gt;</code>) element represents a control that presents a menu of options. The options within the menu are represented by <code><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/option\" title=\"In a Web form, the HTML &lt;option&gt; element is used to create a control representing an item within a &lt;select&gt;, an &lt;optgroup&gt; or a &lt;datalist&gt; HTML5 element.\"><code>&lt;option&gt;</code></a></code> elements, which can be grouped by <code><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/optgroup\" title=\"In a Web form, the HTML &lt;optgroup&gt; element  creates a grouping of options within a &lt;select&gt; element.\"><code>&lt;optgroup&gt;</code></a></code> elements. Options can be pre-selected for the user."
},
"<shadow>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Shadow",
"SUMMARY": "The <strong><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML\">HTML</a> <code>&lt;shadow&gt;</code></strong> element is used as a shadow DOM <a class=\"glossaryLink\" href=\"https://developer.mozilla.org/en-US/docs/Glossary/insertion_point\" title=\"The definition of that term (insertion point) has not been written yet; please consider contributing it!\">insertion point</a>. You might use it if you have created multiple shadow roots under a shadow host. It is not useful in ordinary HTML. It is used with <a href=\"https://developer.mozilla.org/en-US/docs/Web/Web_Components\">Web Components</a>."
},
"<small>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/small",
"SUMMARY": "The HTML Small Element (<span style=\"font-family: Courier New;\">&lt;small&gt;</span>) makes the text <em>font size</em> one size smaller (for example, from large to medium, or from small to x-small) down to the browser's minimum font size.  In HTML5, this element is repurposed to represent side-comments and small print, including copyright and legal text, independent of its styled presentation."
},
"<source>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source",
"SUMMARY": "The <strong>HTML <code>&lt;source&gt;</code> element</strong> is used to specify multiple media resources for <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture\" title=\"The HTML &lt;picture&gt; element is a container used to specified multiple {{HTMLElement(&quot;source&quot;)}} for a specific {{HTMLElement(&quot;img&quot;)}} contained in it. The browser will choose the most suitable source according to the current layout (constraints of the box the image will appear in) of the page and the device it will be displayed on (like a normal or hiDPI device).\"><code>&lt;picture&gt;</code></a>, <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio\" title=\"The HTML &lt;audio&gt; element is used to embed sound content in documents. It may contain several audio sources, represented using the src attribute or the &lt;source&gt; element; the browser will choose the most suitable one.\"><code>&lt;audio&gt;</code></a> and <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video\" title=\"The HTML &lt;video&gt; element is used to embed video content. It may contain several video sources, represented using the src attribute or the &lt;source&gt; element; the browser will choose the most suitable one.\"><code>&lt;video&gt;</code></a> elements. It is an empty element. It is commonly used to serve the same media in <a href=\"https://developer.mozilla.org/en-US/docs/Media_formats_supported_by_the_audio_and_video_elements\" title=\"Media formats supported by the audio and video elements\">multiple formats supported by different browsers</a>."
},
"<spacer>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/spacer",
"SUMMARY": "<code>&lt;spacer&gt;</code> is an HTML element which is used for inserting white spaces to web pages. It was created by NetScape for achieving same effect as a single-pixel layout GIF image, which was something web designers used to use to add white spaces to web pages, without actually using a GIF. However <code>&lt;spacer&gt; </code>is not supported by any major browser and same effects can be created with various CSS rules. In Mozilla applications, support for this element was removed in <span title=\"(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\">Gecko 2.0</span>. Therefore usage of <code>&lt;spacer&gt;</code> is unnecessary."
},
"<span>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span",
"SUMMARY": "The <strong>HTML <code>&lt;span&gt;</code> element</strong> is a generic inline container for phrasing content, which does not inherently represent anything. It can be used to group elements for styling purposes (using the <code>class</code> or <code>id</code> attributes), or because they share attribute values, such as <code>lang</code>. It should be used only when no other semantic element is appropriate. <code>&lt;span&gt;</code> is very much like a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div\" title=\"The HTML &lt;div&gt; element (or HTML Document Division Element) is the generic container for flow content, which does not inherently represent anything. It can be used to group elements for styling purposes (using the class or id attributes), or because they share attribute values, such as lang. It should be used only when no other semantic element (such as &lt;article&gt; or &lt;nav&gt;) is appropriate.\"><code>&lt;div&gt;</code></a> element, but <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div\" title=\"The HTML &lt;div&gt; element (or HTML Document Division Element) is the generic container for flow content, which does not inherently represent anything. It can be used to group elements for styling purposes (using the class or id attributes), or because they share attribute values, such as lang. It should be used only when no other semantic element (such as &lt;article&gt; or &lt;nav&gt;) is appropriate.\"><code>&lt;div&gt;</code></a> is a <a href=\"https://developer.mozilla.org/en-US/docs/HTML/Block-level_elements\">block-level element</a> whereas a <code>&lt;span&gt;</code> is an<a href=\"https://developer.mozilla.org/en-US/docs/HTML/Inline_elements\"> inline element</a>."
},
"<strike>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strike",
"SUMMARY": "The <em>HTML Strikethrough Element</em> (<code>&lt;strike&gt;</code>) renders text with a strikethrough, or a line through it."
},
"<strong>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strong",
"SUMMARY": "The HTML Strong Element (<code>&lt;strong&gt;</code>) gives text strong importance, and is typically displayed in bold."
},
"<style>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style",
"SUMMARY": "The <em>HTML Style Element</em> (<strong>&lt;style&gt;</strong>) contains style information for a document, or part of a document. By default, the style instructions written inside that element are expected to be <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS\">CSS</a>."
},
"<sub>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sub",
"SUMMARY": "The <em>HTML Subscript Element</em> (<code>&lt;sub&gt;</code>) defines a span of text that should be displayed, for typographic reasons, lower, and often smaller, than the main span of text."
},
"<summary>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/summary",
"SUMMARY": "The HTML <em>summary </em>element (<code>&lt;summary&gt;</code>) is used as a summary, caption, or legend for the content of a <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details\" title=\"The HTML &lt;details&gt; Element is used as a disclosure widget from which the user can retrieve additional information.\"><code>&lt;details&gt;</code></a> element."
},
"<sup>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sup",
"SUMMARY": "The <em>HTML Superscript Element</em> (<code>&lt;sup&gt;</code>) defines a span of text that should be displayed, for typographic reasons, higher, and often smaller, than the main span of text."
},
"<table>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table",
"SUMMARY": "The <em>HTML Table Element </em>(<code>&lt;table&gt;</code>) represents data in two dimensions or more."
},
"<tbody>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody",
"SUMMARY": "The HTML Table Body Element (<tbody>) defines one or more <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tr\" title=\"The HTML Table Row Element (&lt;tr&gt;) defines a row of cells in a table. Those can be a mix of &lt;td&gt; and &lt;th&gt; elements.\"><code>&lt;tr&gt;</code></a> element data-rows to be the body of its parent <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table\" title=\"The HTML Table Element (&lt;table&gt;) represents data in two dimensions or more.\"><code>&lt;table&gt;</code></a> element (as long as no &lt;tr&gt; elements are immediate children of that table element.)  In conjunction with a preceding <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead\" title=\"The HTML Table Head Element (&lt;thead&gt;) defines a set of rows defining the head of the columns of the table.\"><code>&lt;thead&gt;</code></a> and/or <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tfoot\" title=\"The HTML Table Foot Element (&lt;tfoot&gt;) defines a set of rows summarizing the columns of the table.\"><code>&lt;tfoot&gt;</code></a> element, &lt;tbody&gt; provides additional semantic information for devices such as printers and displays. Of the parent table's child elements, &lt;tbody&gt; represents the content which, when longer than a page, will most likely differ for each page printed; while the content of <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead\" title=\"The HTML Table Head Element (&lt;thead&gt;) defines a set of rows defining the head of the columns of the table.\"><code>&lt;thead&gt;</code></a> and <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tfoot\" title=\"The HTML Table Foot Element (&lt;tfoot&gt;) defines a set of rows summarizing the columns of the table.\"><code>&lt;tfoot&gt;</code></a> will be the same or similar for each page printed. For displays, &lt;tbody&gt; will enable separate scrolling of the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead\" title=\"The HTML Table Head Element (&lt;thead&gt;) defines a set of rows defining the head of the columns of the table.\"><code>&lt;thead&gt;</code></a>, <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tfoot\" title=\"The HTML Table Foot Element (&lt;tfoot&gt;) defines a set of rows summarizing the columns of the table.\"><code>&lt;tfoot&gt;</code></a>, and <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/caption\" title=\"The HTML &lt;caption&gt; Element (or HTML Table Caption Element) represents the title of a table. Though it is always the first descendant of a &lt;table&gt;, its styling, using CSS, may place it elsewhere, relative to the table.\"><code>&lt;caption&gt;</code></a> elements of the same parent <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table\" title=\"The HTML Table Element (&lt;table&gt;) represents data in two dimensions or more.\"><code>&lt;table&gt;</code></a> element.  Note that unlike the &lt;thead&gt;, &lt;tfoot&gt;, and &lt;caption&gt; elements however, multiple<strong> </strong><span style=\"font-family: consolas,monaco,andale mono,monospace;\">&lt;tbody&gt; </span>elements are permitted (if consecutive), allowing the data-rows in long tables to be divided into different sections, each separately formatted as needed."
},
"<td>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td",
"SUMMARY": "The <em>Table cell</em> <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML\">HTML</a> element (<strong><code>&lt;td&gt;</code></strong>) defines a cell of a table that contains data. It participates in the <em>table model</em>."
},
"<template>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template",
"SUMMARY": "The <strong><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML\">HTML</a> template element <code>&lt;template&gt;</code></strong> is a mechanism for holding client-side content that is not to be rendered when a page is loaded but may subsequently be instantiated during runtime using JavaScript. "
},
"<textarea>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea",
"SUMMARY": "The <strong>HTML <code>&lt;textarea&gt; </code>element</strong> represents a multi-line plain-text editing control."
},
"<tfoot>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tfoot",
"SUMMARY": "The <em>HTML Table Foot Element</em> (<code>&lt;tfoot&gt;</code>) defines a set of rows summarizing the columns of the table."
},
"<th>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th",
"SUMMARY": "The <em>HTML Table Header Cell Element</em> (<code>&lt;th&gt;</code>) defines a cell that is a header for a group of cells of a table. The group of cells that the header refers to is defined by the <code><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th#attr-scope\">scope</a></code> and <code><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th#attr-headers\">headers</a></code> attribute."
},
"<thead>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead",
"SUMMARY": "The <em>HTML Table Head Element</em> (<code>&lt;thead&gt;</code>) defines a set of rows defining the head of the columns of the table."
},
"<time>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/time",
"SUMMARY": "The <strong>HTML <code>&lt;time&gt;</code> element</strong> represents either a time on a 24-hour clock or a precise date in the <a class=\"external\" href=\"http://en.wikipedia.org/wiki/Gregorian_calendar\" title=\"http://en.wikipedia.org/wiki/Gregorian_calendar\">Gregorian calendar</a> (with optional time and timezone information)."
},
"<title>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title",
"SUMMARY": "The <em>HTML Title Element</em> (<strong>&lt;title&gt;</strong>) defines the title of the document, shown in a browser's title bar or on the page's tab. It can only contain text and any contained tags are not interpreted."
},
"<tr>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tr",
"SUMMARY": "The <em>HTML Table Row Element</em> (<code>&lt;tr&gt;</code>) defines a row of cells in a table. Those can be a mix of <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td\" title=\"The Table cell HTML element (&lt;td&gt;) defines a cell of a table that contains data. It participates in the table model.\"><code>&lt;td&gt;</code></a> and <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th\" title=\"The HTML Table Header Cell Element (&lt;th&gt;) defines a cell that is a header for a group of cells of a table. The group of cells that the header refers to is defined by the scope and headers attribute.\"><code>&lt;th&gt;</code></a> elements."
},
"<track>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track",
"SUMMARY": "The <strong>HTML <code>&lt;track&gt;</code> element</strong> is used as a child of the media elements—<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio\" title=\"The HTML &lt;audio&gt; element is used to embed sound content in documents. It may contain several audio sources, represented using the src attribute or the &lt;source&gt; element; the browser will choose the most suitable one.\"><code>&lt;audio&gt;</code></a> and <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video\" title=\"The HTML &lt;video&gt; element is used to embed video content. It may contain several video sources, represented using the src attribute or the &lt;source&gt; element; the browser will choose the most suitable one.\"><code>&lt;video&gt;</code></a>. It lets you specify timed text tracks (or time-based data), for example to automatically handle subtitles. The tracks are formatted in <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Web_Video_Text_Tracks_Format\">WebVTT format</a> (<code>.vtt</code> files) — Web Video Text Tracks."
},
"<tt>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tt",
"SUMMARY": "The HTML Teletype Text Element (<code>&lt;tt&gt;</code>) produces an inline element displayed in the browser's default monotype font. This element was intended to style text as it would display on a fixed width display, such as a teletype. It probably is more common to display fixed width type using the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/code\" title=\"The HTML &lt;code&gt; Element represents a fragment of computer code. By default, it is displayed in the browser's default monospace font.\"><code>&lt;code&gt;</code></a> element."
},
"<u>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/u",
"SUMMARY": "The <em>HTML Underline Element</em> (<code>&lt;u&gt;</code>) renders text with an underline, a line under the baseline of its content."
},
"<ul>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul",
"SUMMARY": "The HTML <em>unordered list</em> element (<code>&lt;ul&gt;</code>) represents an unordered list of items, namely a collection of items that do not have a numerical ordering, and their order in the list is meaningless. Typically, unordered-list items are displayed with a bullet, which can be of several forms, like a dot, a circle or a squared. The bullet style is not defined in the HTML description of the page, but in its associated CSS, using the <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type\" title=\"The list-style-type property specifies the appearance of a list item element. Because it is the only property that&#xA0;defaults to display:list-item, this is usually a &lt;li&gt; element, but can be any element with this display value.\"><code>list-style-type</code></a> property."
},
"<var>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/var",
"SUMMARY": "The HTML Variable Element (<code>&lt;var&gt;</code>) represents a variable in a mathematical expression or a programming context."
},
"<video>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video",
"SUMMARY": "The <strong>HTML <code>&lt;video&gt;</code> element</strong> is used to embed video content. It may contain several video sources, represented using the <code>src</code> attribute or the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source\" title=\"The HTML &lt;source&gt; element is used to specify multiple media resources for &lt;picture&gt;, &lt;audio&gt; and &lt;video&gt; elements. It is an empty element. It is commonly used to serve the same media in multiple formats supported by different browsers.\"><code>&lt;source&gt;</code></a> element; the browser will choose the most suitable one."
},
"<wbr>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr",
"SUMMARY": "The <em>Word Break Opportunit</em><em>y</em> (<code>&lt;wbr&gt;</code>) HTML element represents a position within text where the browser may optionally break a line, though its line-breaking rules would not otherwise create a break at that location."
},
"<xmp>": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/xmp",
"SUMMARY": "The <em>HTML Example Element</em> (<code>&lt;xmp&gt;</code>) renders text between the start and end tags without interpreting the HTML in between and using a monospaced font. The HTML2 specification recommended that it should be rendered wide enough to allow 80 characters per line."
},
"Heading elements": {
"URL": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements",
"SUMMARY": "<strong>Heading</strong> elements implement six levels of document headings, <code>&lt;h1&gt;</code> is the most important and <code>&lt;h6&gt;</code> is the least. A heading element briefly describes the topic of the section it introduces. Heading information may be used by user agents, for example, to construct a table of contents for a document automatically."
}
}

View File

@ -0,0 +1,186 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="73px" height="64px" viewBox="0 0 73 64" enable-background="new 0 0 73 64" xml:space="preserve">
<g id="only_logo">
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-1815.3298" y1="803.0175" x2="-1815.3298" y2="772.748" gradientTransform="matrix(1.98 0 0 1.98 3630.6501 -1528.0078)">
<stop offset="0" style="stop-color:#2075BC"/>
<stop offset="1" style="stop-color:#29AAE1"/>
</linearGradient>
<polygon fill="url(#SVGID_1_)" points="53.239,2.139 53.239,2.033 53.239,2.139 53.134,2.033 53.134,2.139 36.297,8.809
19.355,2.139 19.355,2.033 19.249,2.139 19.249,2.033 19.249,2.139 2.306,8.915 2.306,61.967 19.249,55.507 36.297,61.967
36.297,61.967 36.297,61.967 36.297,61.967 36.297,61.967 53.239,55.507 70.288,61.967 70.288,8.915 "/>
<g>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-1828.1918" y1="803.0175" x2="-1828.1918" y2="772.748" gradientTransform="matrix(1.98 0 0 1.98 3630.6501 -1528.0078)">
<stop offset="0" style="stop-color:#0A6AA8"/>
<stop offset="1" style="stop-color:#1699C8"/>
</linearGradient>
<polygon fill="url(#SVGID_2_)" points="2.306,8.915 2.306,61.967 19.355,55.507 19.355,2.033 "/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-1819.6349" y1="803.0175" x2="-1819.6349" y2="772.748" gradientTransform="matrix(1.98 0 0 1.98 3630.6501 -1528.0078)">
<stop offset="0" style="stop-color:#2075BC"/>
<stop offset="1" style="stop-color:#29AAE1"/>
</linearGradient>
<polygon fill="url(#SVGID_3_)" points="36.297,8.915 36.297,61.967 19.249,55.507 19.249,2.033 "/>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-1811.0514" y1="803.0175" x2="-1811.0514" y2="772.748" gradientTransform="matrix(1.98 0 0 1.98 3630.6501 -1528.0078)">
<stop offset="0" style="stop-color:#0A6AA8"/>
<stop offset="1" style="stop-color:#1699C8"/>
</linearGradient>
<polygon fill="url(#SVGID_4_)" points="36.297,8.915 36.297,61.967 53.239,55.507 53.239,2.033 "/>
<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-1802.4946" y1="803.0175" x2="-1802.4946" y2="772.748" gradientTransform="matrix(1.98 0 0 1.98 3630.6501 -1528.0078)">
<stop offset="0" style="stop-color:#2075BC"/>
<stop offset="1" style="stop-color:#29AAE1"/>
</linearGradient>
<polygon fill="url(#SVGID_5_)" points="70.288,8.915 70.288,61.967 53.134,55.507 53.134,2.033 "/>
</g>
<g>
<g>
<g>
<g>
<g>
<defs>
<path id="SVGID_6_" d="M60.546,33.164c-0.635-1.8-0.423-4.871-0.742-5.295c-2.012-2.753-9.212-3.176-12.495-6.777
c0.529-1.8-0.635-3.176-1.8-4.341c-1.8-1.271-4.236-0.742-6.141-0.212c-2.117-0.423-4.13-1.271-6.247-1.8
c-4.659-0.529-9.319,2.753-9.319,2.753c-3.388,2.117-8.577,6.566-11.119,9.106c0.635,0.106,1.271-0.423,2.012-0.423
l4.871-1.271c-2.012,1.694-6.247,4.553-7.518,6.883c1.482-0.529,4.659-2.224,6.247-2.436
c-1.377,1.165-4.236,3.494-5.189,4.976c0.106,0.106,0,0.212,0,0.317c1.165-0.635,4.024-2.33,5.401-2.436
c-1.377,1.377-3.812,4.13-4.341,5.93c1.165-0.742,4.13-2.33,5.401-2.753c-0.317,0.742-0.953,1.271-1.377,1.906
c-0.635,0.953-2.012,2.117-2.012,3.282c1.059-0.953,2.33-1.8,3.601-2.436c-0.529,1.165-1.588,2.117-1.906,3.601
c0.847-0.847,2.436-1.271,3.494-1.588l-0.106,0.106c-0.106,0.106-1.271,0.953-2.117,1.906c0.742,0,0.212-0.106,1.165,0.106
h0.529c-0.212,0.106-0.529,0.317-0.847,0.423l0,0c-0.423,0.212-0.953,0.529-1.377,0.742
c2.012,2.542,4.447,4.659,7.306,6.035c3.707,1.8,7.73,2.436,11.859,1.906c0-0.212-0.106-0.423-0.212-0.742l0,0l0,0
c-0.106-0.317-0.212-0.529-0.212-0.847l0,0l0,0c1.377-2.542,0.635-6.989,4.236-8.789c2.436-1.271,2.647-1.906,5.401-1.377
c1.482,0.317,4.765,1.377,6.247,1.059c1.377-0.742,2.117-1.165,3.388-2.012c1.482,0.317,2.012,0.106,2.542-0.635
c-0.529,0.742,0.953-2.753,1.588-4.024L60.546,33.164z"/>
</defs>
<clipPath id="SVGID_7_">
<use xlink:href="#SVGID_6_" overflow="visible"/>
</clipPath>
<ellipse clip-path="url(#SVGID_7_)" fill="#FFFFFF" cx="36.297" cy="33.377" rx="31.555" ry="21.39"/>
</g>
</g>
</g>
</g>
<g>
<g>
<g>
<g>
<defs>
<path id="SVGID_8_" d="M60.546,33.164c-0.635-1.8-0.423-4.871-0.742-5.295c-2.012-2.753-9.212-3.176-12.495-6.777
c0.529-1.8-0.635-3.176-1.8-4.341c-1.8-1.271-4.236-0.742-6.141-0.212c-2.117-0.423-4.13-1.271-6.247-1.8
c-4.659-0.529-9.319,2.753-9.319,2.753c-3.388,2.117-8.577,6.566-11.119,9.106c0.635,0.106,1.271-0.423,2.012-0.423
l4.871-1.271c-2.012,1.694-6.247,4.553-7.518,6.883c1.482-0.529,4.659-2.224,6.247-2.436
c-1.377,1.165-4.236,3.494-5.189,4.976c0.106,0.106,0,0.212,0,0.317c1.165-0.635,4.024-2.33,5.401-2.436
c-1.377,1.377-3.812,4.13-4.341,5.93c1.165-0.742,4.13-2.33,5.401-2.753c-0.317,0.742-0.953,1.271-1.377,1.906
c-0.635,0.953-2.012,2.117-2.012,3.282c1.059-0.953,2.33-1.8,3.601-2.436c-0.529,1.165-1.588,2.117-1.906,3.601
c0.847-0.847,2.436-1.271,3.494-1.588l-0.106,0.106c-0.106,0.106-1.271,0.953-2.117,1.906c0.742,0,0.212-0.106,1.165,0.106
h0.529c-0.212,0.106-0.529,0.317-0.847,0.423l0,0c-0.423,0.212-0.953,0.529-1.377,0.742
c2.012,2.542,4.447,4.659,7.306,6.035c3.707,1.8,7.73,2.436,11.859,1.906c0-0.212-0.106-0.423-0.212-0.742l0,0l0,0
c-0.106-0.317-0.212-0.529-0.212-0.847l0,0l0,0c1.377-2.542,0.635-6.989,4.236-8.789c2.436-1.271,2.647-1.906,5.401-1.377
c1.482,0.317,4.765,1.377,6.247,1.059c1.377-0.742,2.117-1.165,3.388-2.012c1.482,0.317,2.012,0.106,2.542-0.635
c-0.529,0.742,0.953-2.753,1.588-4.024L60.546,33.164z"/>
</defs>
<clipPath id="SVGID_9_">
<use xlink:href="#SVGID_8_" overflow="visible"/>
</clipPath>
<polygon clip-path="url(#SVGID_9_)" fill="#F2F2F2" points="2.73,9.869 2.73,63.555 19.566,56.884 19.566,3.091 "/>
</g>
</g>
</g>
</g>
<g>
<g>
<g>
<g>
<defs>
<path id="SVGID_10_" d="M60.546,33.164c-0.635-1.8-0.423-4.871-0.742-5.295c-2.012-2.753-9.212-3.176-12.495-6.777
c0.529-1.8-0.635-3.176-1.8-4.341c-1.8-1.271-4.236-0.742-6.141-0.212c-2.117-0.423-4.13-1.271-6.247-1.8
c-4.659-0.529-9.319,2.753-9.319,2.753c-3.388,2.117-8.577,6.566-11.119,9.106c0.635,0.106,1.271-0.423,2.012-0.423
l4.871-1.271c-2.012,1.694-6.247,4.553-7.518,6.883c1.482-0.529,4.659-2.224,6.247-2.436
c-1.377,1.165-4.236,3.494-5.189,4.976c0.106,0.106,0,0.212,0,0.317c1.165-0.635,4.024-2.33,5.401-2.436
c-1.377,1.377-3.812,4.13-4.341,5.93c1.165-0.742,4.13-2.33,5.401-2.753c-0.317,0.742-0.953,1.271-1.377,1.906
c-0.635,0.953-2.012,2.117-2.012,3.282c1.059-0.953,2.33-1.8,3.601-2.436c-0.529,1.165-1.588,2.117-1.906,3.601
c0.847-0.847,2.436-1.271,3.494-1.588l-0.106,0.106c-0.106,0.106-1.271,0.953-2.117,1.906c0.742,0,0.212-0.106,1.165,0.106
h0.529c-0.212,0.106-0.529,0.317-0.847,0.423l0,0c-0.423,0.212-0.953,0.529-1.377,0.742
c2.012,2.542,4.447,4.659,7.306,6.035c3.707,1.8,7.73,2.436,11.859,1.906c0-0.212-0.106-0.423-0.212-0.742l0,0l0,0
c-0.106-0.317-0.212-0.529-0.212-0.847l0,0l0,0c1.377-2.542,0.635-6.989,4.236-8.789c2.436-1.271,2.647-1.906,5.401-1.377
c1.482,0.317,4.765,1.377,6.247,1.059c1.377-0.742,2.117-1.165,3.388-2.012c1.482,0.317,2.012,0.106,2.542-0.635
c-0.529,0.742,0.953-2.753,1.588-4.024L60.546,33.164z"/>
</defs>
<clipPath id="SVGID_11_">
<use xlink:href="#SVGID_10_" overflow="visible"/>
</clipPath>
<polygon clip-path="url(#SVGID_11_)" fill="#FFFFFF" points="36.403,9.869 36.403,63.555 19.46,56.884 19.46,3.091
"/>
</g>
</g>
</g>
</g>
<g>
<g>
<g>
<g>
<defs>
<path id="SVGID_12_" d="M60.546,33.164c-0.635-1.8-0.423-4.871-0.742-5.295c-2.012-2.753-9.212-3.176-12.495-6.777
c0.529-1.8-0.635-3.176-1.8-4.341c-1.8-1.271-4.236-0.742-6.141-0.212c-2.117-0.423-4.13-1.271-6.247-1.8
c-4.659-0.529-9.319,2.753-9.319,2.753c-3.388,2.117-8.577,6.566-11.119,9.106c0.635,0.106,1.271-0.423,2.012-0.423
l4.871-1.271c-2.012,1.694-6.247,4.553-7.518,6.883c1.482-0.529,4.659-2.224,6.247-2.436
c-1.377,1.165-4.236,3.494-5.189,4.976c0.106,0.106,0,0.212,0,0.317c1.165-0.635,4.024-2.33,5.401-2.436
c-1.377,1.377-3.812,4.13-4.341,5.93c1.165-0.742,4.13-2.33,5.401-2.753c-0.317,0.742-0.953,1.271-1.377,1.906
c-0.635,0.953-2.012,2.117-2.012,3.282c1.059-0.953,2.33-1.8,3.601-2.436c-0.529,1.165-1.588,2.117-1.906,3.601
c0.847-0.847,2.436-1.271,3.494-1.588l-0.106,0.106c-0.106,0.106-1.271,0.953-2.117,1.906c0.742,0,0.212-0.106,1.165,0.106
h0.529c-0.212,0.106-0.529,0.317-0.847,0.423l0,0c-0.423,0.212-0.953,0.529-1.377,0.742
c2.012,2.542,4.447,4.659,7.306,6.035c3.707,1.8,7.73,2.436,11.859,1.906c0-0.212-0.106-0.423-0.212-0.742l0,0l0,0
c-0.106-0.317-0.212-0.529-0.212-0.847l0,0l0,0c1.377-2.542,0.635-6.989,4.236-8.789c2.436-1.271,2.647-1.906,5.401-1.377
c1.482,0.317,4.765,1.377,6.247,1.059c1.377-0.742,2.117-1.165,3.388-2.012c1.482,0.317,2.012,0.106,2.542-0.635
c-0.529,0.742,0.953-2.753,1.588-4.024L60.546,33.164z"/>
</defs>
<clipPath id="SVGID_13_">
<use xlink:href="#SVGID_12_" overflow="visible"/>
</clipPath>
<polygon clip-path="url(#SVGID_13_)" fill="#F2F2F2" points="36.403,9.869 36.403,63.555 53.134,56.884 53.134,3.091
"/>
</g>
</g>
</g>
</g>
<g>
<g>
<g>
<g>
<defs>
<path id="SVGID_14_" d="M60.546,33.164c-0.635-1.8-0.423-4.871-0.742-5.295c-2.012-2.753-9.212-3.176-12.495-6.777
c0.529-1.8-0.635-3.176-1.8-4.341c-1.8-1.271-4.236-0.742-6.141-0.212c-2.117-0.423-4.13-1.271-6.247-1.8
c-4.659-0.529-9.319,2.753-9.319,2.753c-3.388,2.117-8.577,6.566-11.119,9.106c0.635,0.106,1.271-0.423,2.012-0.423
l4.871-1.271c-2.012,1.694-6.247,4.553-7.518,6.883c1.482-0.529,4.659-2.224,6.247-2.436
c-1.377,1.165-4.236,3.494-5.189,4.976c0.106,0.106,0,0.212,0,0.317c1.165-0.635,4.024-2.33,5.401-2.436
c-1.377,1.377-3.812,4.13-4.341,5.93c1.165-0.742,4.13-2.33,5.401-2.753c-0.317,0.742-0.953,1.271-1.377,1.906
c-0.635,0.953-2.012,2.117-2.012,3.282c1.059-0.953,2.33-1.8,3.601-2.436c-0.529,1.165-1.588,2.117-1.906,3.601
c0.847-0.847,2.436-1.271,3.494-1.588l-0.106,0.106c-0.106,0.106-1.271,0.953-2.117,1.906c0.742,0,0.212-0.106,1.165,0.106
h0.529c-0.212,0.106-0.529,0.317-0.847,0.423l0,0c-0.423,0.212-0.953,0.529-1.377,0.742
c2.012,2.542,4.447,4.659,7.306,6.035c3.707,1.8,7.73,2.436,11.859,1.906c0-0.212-0.106-0.423-0.212-0.742l0,0l0,0
c-0.106-0.317-0.212-0.529-0.212-0.847l0,0l0,0c1.377-2.542,0.635-6.989,4.236-8.789c2.436-1.271,2.647-1.906,5.401-1.377
c1.482,0.317,4.765,1.377,6.247,1.059c1.377-0.742,2.117-1.165,3.388-2.012c1.482,0.317,2.012,0.106,2.542-0.635
c-0.529,0.742,0.953-2.753,1.588-4.024L60.546,33.164z"/>
</defs>
<clipPath id="SVGID_15_">
<use xlink:href="#SVGID_14_" overflow="visible"/>
</clipPath>
<polygon clip-path="url(#SVGID_15_)" fill="#FFFFFF" points="70.076,9.869 70.076,63.555 53.134,56.884 53.134,3.091
"/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
<g id="logo_white">
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -25,29 +25,34 @@ define(function (require, exports, module) {
"use strict";
// Core modules
var EditorManager = brackets.getModule("editor/EditorManager"),
var _ = brackets.getModule("thirdparty/lodash"),
EditorManager = brackets.getModule("editor/EditorManager"),
FileSystem = brackets.getModule("filesystem/FileSystem"),
FileUtils = brackets.getModule("file/FileUtils"),
ExtensionUtils = brackets.getModule("utils/ExtensionUtils"),
CSSUtils = brackets.getModule("language/CSSUtils");
CSSUtils = brackets.getModule("language/CSSUtils"),
HTMLUtils = brackets.getModule("language/HTMLUtils"),
ExtensionUtils = brackets.getModule("utils/ExtensionUtils");
// Extension modules
var InlineDocsViewer = require("InlineDocsViewer");
/** @type {?$.Promise} */
var _cssDocsPromise = null;
/*
* Caches docs promises
*/
var promiseCache = {};
/**
* Lazily loads JSON docs files. Returns a Promise the is resolved with the parsed Object, or
* rejected if the file is missing/corrupt.
* @param {string} fileName JSON file to load
* @return {!$.Promise}
*/
function getCSSDocs() {
if (!_cssDocsPromise) {
function getDocs(fileName) {
if (!promiseCache[fileName]) {
var result = new $.Deferred();
var path = ExtensionUtils.getModulePath(module, "css.json"),
var path = ExtensionUtils.getModulePath(module, fileName),
file = FileSystem.getFileForPath(path);
FileUtils.readAsText(file)
@ -56,34 +61,44 @@ define(function (require, exports, module) {
try {
jsonData = JSON.parse(text);
} catch (ex) {
console.error("Malformed CSS documentation database: ", ex);
console.error("Malformed documentation database: ", ex);
result.reject();
}
result.resolve(jsonData); // ignored if we already reject()ed above
})
.fail(function (err) {
console.error("Unable to load CSS documentation database: ", err);
console.error("Unable to load documentation database: ", err);
result.reject();
});
_cssDocsPromise = result.promise();
promiseCache[fileName] = result.promise();
}
return _cssDocsPromise;
return promiseCache[fileName];
}
/**
* Inline docs provider. Currently looks up docs based on CSS properties only.
* Inline docs provider.
*
* @param {!Editor} editor
* @param {!{line:Number, ch:Number}} pos
* @return {?$.Promise} resolved with an InlineWidget; null if we're not going to provide anything
*/
function inlineProvider(hostEditor, pos) {
var langId = hostEditor.getLanguageForSelection().getId();
// Only provide docs when cursor is in CSS content
if (langId !== "css" && langId !== "scss" && langId !== "less") {
var jsonFile, propInfo,
propQueue = [], // priority queue of propNames to try
langId = hostEditor.getLanguageForSelection().getId(),
supportedLangs = {
"css": true,
"scss": true,
"less": true,
"html": true
},
isQuickDocAvailable = langId ? supportedLangs[langId] : -1; // fail if langId is falsy
// Only provide docs when cursor is in supported language
if (!isQuickDocAvailable) {
return null;
}
@ -93,30 +108,49 @@ define(function (require, exports, module) {
return null;
}
// Explicitly use selection start rather than pos, which is usually selection end
var cssInfo = CSSUtils.getInfoAtPos(hostEditor, sel.start);
if (langId === "html") { // HTML
jsonFile = "html.json";
propInfo = HTMLUtils.getTagInfo(hostEditor, sel.start);
if (propInfo.position.tokenType === HTMLUtils.ATTR_NAME && propInfo.attr && propInfo.attr.name) {
// we're on an HTML attribute (and not on its value)
propQueue.push(propInfo.attr.name.toLowerCase());
}
if (propInfo.tagName) { // we're somehow on an HTML tag (no matter where exactly)
propInfo = propInfo.tagName.toLowerCase();
propQueue.push("<" + propInfo + ">");
}
} else { // CSS-like language
jsonFile = "css.json";
propInfo = CSSUtils.getInfoAtPos(hostEditor, sel.start);
if (propInfo.name) {
propQueue.push(propInfo.name);
// remove possible vendor prefixes
propQueue.push(propInfo.name.replace(/^-(?:webkit|moz|ms|o)-/, ""));
}
}
// Are we at a propety name (or in a value where name is discernible?)
if (cssInfo && cssInfo.name) {
var cssPropName = cssInfo.name,
result = new $.Deferred();
// Are we on a supported property? (no matter if info is available for the property)
if (propQueue.length) {
var result = new $.Deferred();
// Load JSON file if not done yet
getCSSDocs()
.done(function (cssDocs) {
getDocs(jsonFile)
.done(function (docs) {
// Construct inline widget (if we have docs for this property)
var cssPropDetails = cssDocs.PROPERTIES["css/properties/" + cssPropName];
if (!cssPropDetails) {
cssPropName = cssPropName.replace(/^-(webkit|moz|ms|o)-/, ""); // remove possible vendor prefixes
if (cssPropName) {
cssPropDetails = cssDocs.PROPERTIES["css/properties/" + cssPropName];
}
var displayName, propDetails,
propName = _.find(propQueue, function (propName) { // find the first property where info is available
return docs.hasOwnProperty(propName);
});
if (propName) {
propDetails = docs[propName];
displayName = propName.substr(propName.lastIndexOf("/") + 1);
}
if (cssPropDetails) {
var inlineWidget = new InlineDocsViewer(cssPropName, cssPropDetails);
if (propDetails) {
var inlineWidget = new InlineDocsViewer(displayName, propDetails);
inlineWidget.load(hostEditor);
result.resolve(inlineWidget);
} else {
result.reject();
}
@ -135,6 +169,6 @@ define(function (require, exports, module) {
// Register as inline docs provider
EditorManager.registerInlineDocsProvider(inlineProvider);
exports._getCSSDocs = getCSSDocs;
exports._getDocs = getDocs;
exports._inlineProvider = inlineProvider;
});

View File

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html>
<head>
<style>
body {
{{0}}border: 1px solid black;
}
</style>
</head>
<body style="background-color{{1}}: #000">
<{{2}}nonexistent></nonexistent>
<div>{{3}}some text</div>
<!-- <{{4}}div></div> -->
<div {{5}}class="{{6}}muted" {{7}}nonexistent="false"></div>
<nonexistent {{8}}nonexistent="false"></nonexistent>
</body>
</html>

View File

@ -33,7 +33,7 @@ define(function (require, exports, module) {
testCSS = require("text!unittest-files/test1.css"),
testHTML = require("text!unittest-files/test1.html");
describe("WebPlatformDocs", function () {
describe("MDNDocs", function () {
var testCSSInfo = SpecRunnerUtils.parseOffsetsFromText(testCSS),
testHTMLInfo = SpecRunnerUtils.parseOffsetsFromText(testHTML),
@ -64,10 +64,10 @@ define(function (require, exports, module) {
if (expectInline) {
// expecting a valid CSS property
waitsForDone(promise, "WebPlatformDocs _inlineProvider", 1000);
waitsForDone(promise, "MDNDocs _inlineProvider", 1000);
} else {
// expecting an invalid css property
waitsForFail(promise, "WebPlatformDocs _inlineProvider", 1000);
waitsForFail(promise, "MDNDocs _inlineProvider", 1000);
}
}
});
@ -90,7 +90,7 @@ define(function (require, exports, module) {
var json;
runs(function () {
main._getCSSDocs().done(function (result) {
main._getDocs("css.json").done(function (result) {
json = result;
});
});
@ -98,7 +98,23 @@ define(function (require, exports, module) {
waitsFor(function () { return json !== undefined; }, "read css.json database", 5000);
runs(function () {
expect(Object.keys(json.PROPERTIES).length).toBeGreaterThan(0);
expect(Object.keys(json).length).toBeGreaterThan(0);
});
});
it("should retrieve the HTML docs database", function () {
var json;
runs(function () {
main._getDocs("html.json").done(function (result) {
json = result;
});
});
waitsFor(function () { return json !== undefined; }, "read html.json database", 5000);
runs(function () {
expect(Object.keys(json).length).toBeGreaterThan(0);
});
});
@ -165,8 +181,36 @@ define(function (require, exports, module) {
queryInlineAtPos(testHTMLInfo, 0, true, "border");
});
it("should not open docs for inline style attributes", function () {
queryInlineAtPos(testHTMLInfo, 1, false);
it("should open docs when the selection is on an HTML tag", function () {
queryInlineAtPos(testHTMLInfo, 1, true, "<body>");
});
it("should not open docs when the selection is on an invalid HTML tag", function () {
queryInlineAtPos(testHTMLInfo, 2, false);
});
it("should not open docs when the selection is not an HTML tag", function () {
/* Text */
queryInlineAtPos(testHTMLInfo, 3, false);
/* Commented tag */
queryInlineAtPos(testHTMLInfo, 4, false);
});
it("should open docs when the selection is on an HTML attribute", function () {
queryInlineAtPos(testHTMLInfo, 5, true, "<div>");
});
it("should open docs for tag (fallback) when the selection is on an HTML attribute's value", function () {
queryInlineAtPos(testHTMLInfo, 6, true, "<div>");
});
it("should open docs for tag (fallback) when the selection is on an invalid HTML attribute", function () {
queryInlineAtPos(testHTMLInfo, 7, true, "<div>");
});
it("should not open docs when the selection is on an invalid HTML attribute on an invalid HTML tag", function () {
queryInlineAtPos(testHTMLInfo, 8, false);
});
});

View File

@ -0,0 +1,553 @@
/*
* Copyright (c) 2017 - present Adobe Systems Incorporated. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/**
* Manages Editor navigation history to aid back/fwd movement between the edit positions
* in the active project context. The navigation history is purely in-memory and not
* persisted to file system when a project is being closed.
*/
define(function (require, exports, module) {
"use strict";
var Strings = brackets.getModule("strings"),
MainViewManager = brackets.getModule("view/MainViewManager"),
Document = brackets.getModule("document/Document"),
DocumentManager = brackets.getModule("document/DocumentManager"),
DocumentCommandHandlers = brackets.getModule("document/DocumentCommandHandlers"),
EditorManager = brackets.getModule("editor/EditorManager"),
Editor = brackets.getModule("editor/Editor"),
ProjectManager = brackets.getModule("project/ProjectManager"),
CommandManager = brackets.getModule("command/CommandManager"),
Commands = brackets.getModule("command/Commands"),
Menus = brackets.getModule("command/Menus"),
KeyBindingManager = brackets.getModule("command/KeyBindingManager"),
FileSystem = brackets.getModule("filesystem/FileSystem");
var KeyboardPrefs = JSON.parse(require("text!keyboard.json"));
// Command constants for navigation history
var NAVIGATION_JUMP_BACK = "navigation.jump.back",
NAVIGATION_JUMP_FWD = "navigation.jump.fwd";
// The latency time to capture an explicit cursor movement as a navigation frame
var NAV_FRAME_CAPTURE_LATENCY = 2000,
MAX_NAV_FRAMES_COUNT = 30;
/**
* Contains list of most recently known cursor positions.
* @private
* @type {Array.<Object>}
*/
var jumpBackwardStack = [];
/**
* Contains list of most recently traversed cursor positions using NAVIGATION_JUMP_BACK command.
* @private
* @type {Array.<Object>}
*/
var jumpForwardStack = [],
activePosNotSynced = false,
captureTimer = null,
currentEditPos = null,
jumpInProgress = false,
commandJumpBack,
commandJumpFwd;
/**
* Function to check if there are any navigatable frame backward.
* @private
*/
function _hasNavBackFrames() {
return (jumpForwardStack.length > 0 && jumpBackwardStack.length > 0)
|| (!jumpForwardStack.length && jumpBackwardStack.length > 1);
}
/**
* Function to enable/disable navigation command based on cursor positions availability.
* @private
*/
function _validateNavigationCmds() {
commandJumpBack.setEnabled(_hasNavBackFrames());
commandJumpFwd.setEnabled(jumpForwardStack.length > 0);
}
/**
* Function to check existence of a file entry, validity of markers
* @private
*/
function _validateFrame(entry) {
var deferred = new $.Deferred(),
fileEntry = FileSystem.getFileForPath(entry.filePath);
if (entry.inMem) {
var indexInWS = MainViewManager.findInWorkingSet(entry.paneId, entry.filePath);
// Remove entry if InMemoryFile is not found in Working set
if (indexInWS === -1) {
deferred.reject();
} else {
deferred.resolve();
}
} else {
fileEntry.exists(function (err, exists) {
if (!err && exists) {
// Additional check to handle external modification and mutation of the doc text affecting markers
if (fileEntry._stat !== entry.fileStat) {
deferred.reject();
} else if (!entry._validateMarkers()) {
deferred.reject();
} else {
deferred.resolve();
}
} else {
deferred.reject();
}
});
}
return deferred.promise();
}
/**
* Prototype to capture a navigation frame and it's various data/functional attributues
*/
function NavigationFrame(editor, selectionObj) {
this.cm = editor._codeMirror;
this.filePath = editor.document.file._path;
this.inMem = editor.document.file.constructor.name === "InMemoryFile";
this.paneId = editor._paneId;
this.fileStat = editor.document.file._stat;
this.uId = (new Date()).getTime();
this.selections = [];
this.bookMarkIds = [];
this._createMarkers(selectionObj.ranges);
}
/**
* Lifecycle event handler of the editor for which this frame is captured
*/
NavigationFrame.prototype._handleEditorDestroy = function (editor) {
this._backupSelectionRanges();
this._clearMarkers();
this.cm = null;
this.bookMarkIds = null;
};
/**
* Function to re-create CM TextMarkers for previously backed up ranges
* This logic is required to ensure that the captured navigation positions
* stay valid and contextual even when the actual document text mutates.
* The mutations which are handled here :
* -> Addition/Deletion of lines before the captured position
* -> Addition/Updation of characters in the captured selection
*/
NavigationFrame.prototype._reinstateMarkers = function (editor) {
this.cm = editor._codeMirror;
this.paneId = editor._paneId;
this._createMarkers(this.selections);
};
/**
* Function to create CM TextMarkers for the navigated positions/selections.
* This logic is required to ensure that the captured navigation positions
* stay valid and contextual even when the actual document text mutates.
* The mutations which are handled here :
* -> Addition/Deletion of lines before the captured position
* -> Addition/Updation of characters in the captured selection
*/
NavigationFrame.prototype._createMarkers = function (ranges) {
var range,
rangeStart,
rangeEnd,
index,
bookMark;
this.bookMarkIds = [];
for (index in ranges) {
range = ranges[index];
rangeStart = range.anchor || range.start;
rangeEnd = range.head || range.end;
// 'markText' has to used for a non-zero length position, if current selection is
// of zero length use bookmark instead.
if (rangeStart.line === rangeEnd.line && rangeStart.ch === rangeEnd.ch) {
bookMark = this.cm.setBookmark(rangeStart, rangeEnd);
this.bookMarkIds.push(bookMark.id);
} else {
this.cm.markText(rangeStart, rangeEnd, {className: (this.uId)});
}
}
};
/**
* Function to actually convert the CM markers to CM positions which can be used to
* set selections or cursor positions in Editor.
*/
NavigationFrame.prototype._backupSelectionRanges = function () {
if (!this.cm) {
return;
}
var marker,
selection,
index;
// Reset selections first.
this.selections = [];
var self = this;
// Collate only the markers we used to mark selections/cursors
var markers = this.cm.getAllMarks().filter(function (entry) {
if (entry.className === self.uId || self.bookMarkIds.indexOf(entry.id) !== -1) {
return entry;
}
});
// Iterate over CM textmarkers and collate the updated(if?) positions
for (index in markers) {
marker = markers[index];
selection = marker.find();
if (marker.type === "bookmark") {
this.selections.push({start: selection, end: selection});
} else {
this.selections.push({start: selection.from, end: selection.to});
}
}
};
/**
* Function to clean up the markers in cm
*/
NavigationFrame.prototype._clearMarkers = function () {
if (!this.cm) {
return;
}
var self = this;
// clear only the markers we used to mark selections/cursors
this.cm.getAllMarks().filter(function (entry) {
if (entry.className === self.uId || self.bookMarkIds.indexOf(entry.id) !== -1) {
entry.clear();
}
});
};
/**
* Function to check if we have valid markers in cm for this frame
*/
NavigationFrame.prototype._validateMarkers = function () {
this._backupSelectionRanges();
return this.selections.length;
};
/**
* Function to actually navigate to the position(file,selections) captured in this frame
*/
NavigationFrame.prototype.goTo = function () {
var self = this;
this._backupSelectionRanges();
jumpInProgress = true;
// To ensure we don't reopen the same doc in the last known pane
// rather bring it to the same pane where user has opened it
var thisDoc = DocumentManager.getOpenDocumentForPath(this.filePath);
if (thisDoc && thisDoc._masterEditor) {
this.paneId = thisDoc._masterEditor._paneId;
}
CommandManager.execute(Commands.FILE_OPEN, {fullPath: this.filePath, paneId: this.paneId}).done(function () {
EditorManager.getCurrentFullEditor().setSelections(self.selections, true);
_validateNavigationCmds();
}).always(function () {
jumpInProgress = false;
});
};
/**
* Function to capture a non-zero set of selections as a navigation frame.
* The assumptions behind capturing a frame as a navigation frame are :
*
* -> If it's set by user explicitly (using mouse click or jump to definition)
* -> By clicking on search results
* -> Change of cursor by keyboard navigation keys or actual edits are not captured.
*
* @private
*/
function _recordJumpDef(event, selectionObj) {
// Don't capture frames if we are navigating or document text is being refreshed(fileSync in progress)
if (jumpInProgress || (event.target && event.target.document._refreshInProgress)) {
return;
}
// Reset forward navigation stack if we are capturing a new event
jumpForwardStack = [];
if (captureTimer) {
window.clearTimeout(captureTimer);
captureTimer = null;
}
// Ensure cursor activity has not happened because of arrow keys or edit
if (selectionObj.origin !== "+move" && (!window.event || window.event.type !== "input")) {
captureTimer = window.setTimeout(function () {
// Check if we have reached MAX_NAV_FRAMES_COUNT
// If yes, control overflow
if (jumpBackwardStack.length === MAX_NAV_FRAMES_COUNT) {
var navFrame = jumpBackwardStack.shift();
navFrame._clearMarkers();
}
currentEditPos = new NavigationFrame(event.target, selectionObj);
jumpBackwardStack.push(currentEditPos);
_validateNavigationCmds();
activePosNotSynced = false;
}, NAV_FRAME_CAPTURE_LATENCY);
} else {
activePosNotSynced = true;
}
}
/**
* Command handler to navigate backward
*/
function _navigateBack() {
if (!jumpForwardStack.length) {
if (activePosNotSynced) {
currentEditPos = new NavigationFrame(EditorManager.getCurrentFullEditor(), {ranges: EditorManager.getCurrentFullEditor()._codeMirror.listSelections()});
jumpForwardStack.push(currentEditPos);
}
}
var navFrame = jumpBackwardStack.pop();
// Check if the poped frame is the current active frame or doesn't have any valid marker information
// if true, jump again
if (navFrame && navFrame === currentEditPos) {
jumpForwardStack.push(navFrame);
_validateNavigationCmds();
CommandManager.execute(NAVIGATION_JUMP_BACK);
return;
}
if (navFrame) {
// We will check for the file existence now, if it doesn't exist we will jump back again
// but discard the popped frame as invalid.
_validateFrame(navFrame).done(function () {
jumpForwardStack.push(navFrame);
navFrame.goTo();
currentEditPos = navFrame;
}).fail(function () {
CommandManager.execute(NAVIGATION_JUMP_BACK);
}).always(function () {
_validateNavigationCmds();
});
}
}
/**
* Command handler to navigate forward
*/
function _navigateForward() {
var navFrame = jumpForwardStack.pop();
if (!navFrame) {
return;
}
// Check if the poped frame is the current active frame or doesn't have any valid marker information
// if true, jump again
if (navFrame === currentEditPos) {
jumpBackwardStack.push(navFrame);
_validateNavigationCmds();
CommandManager.execute(NAVIGATION_JUMP_FWD);
return;
}
// We will check for the file existence now, if it doesn't exist we will jump back again
// but discard the popped frame as invalid.
_validateFrame(navFrame).done(function () {
jumpBackwardStack.push(navFrame);
navFrame.goTo();
currentEditPos = navFrame;
}).fail(function () {
_validateNavigationCmds();
CommandManager.execute(NAVIGATION_JUMP_FWD);
}).always(function () {
_validateNavigationCmds();
});
}
/**
* Function to initialize navigation menu items.
* @private
*/
function _initNavigationMenuItems() {
var menu = Menus.getMenu(Menus.AppMenuBar.NAVIGATE_MENU);
menu.addMenuItem(NAVIGATION_JUMP_BACK, "", Menus.AFTER, Commands.NAVIGATE_PREV_DOC);
menu.addMenuItem(NAVIGATION_JUMP_FWD, "", Menus.AFTER, NAVIGATION_JUMP_BACK);
}
/**
* Function to initialize navigation commands and it's keyboard shortcuts.
* @private
*/
function _initNavigationCommands() {
CommandManager.register(Strings.CMD_NAVIGATE_BACKWARD, NAVIGATION_JUMP_BACK, _navigateBack);
CommandManager.register(Strings.CMD_NAVIGATE_FORWARD, NAVIGATION_JUMP_FWD, _navigateForward);
commandJumpBack = CommandManager.get(NAVIGATION_JUMP_BACK);
commandJumpFwd = CommandManager.get(NAVIGATION_JUMP_FWD);
commandJumpBack.setEnabled(false);
commandJumpFwd.setEnabled(false);
KeyBindingManager.addBinding(NAVIGATION_JUMP_BACK, KeyboardPrefs[NAVIGATION_JUMP_BACK]);
KeyBindingManager.addBinding(NAVIGATION_JUMP_FWD, KeyboardPrefs[NAVIGATION_JUMP_FWD]);
_initNavigationMenuItems();
}
/**
* Function to request a navigation frame creation explicitly.
* @private
*/
function _captureFrame(editor) {
// Capture the active position now if it was not captured earlier
if ((activePosNotSynced || !jumpBackwardStack.length) && !jumpInProgress) {
jumpBackwardStack.push(new NavigationFrame(editor, {ranges: editor._codeMirror.listSelections()}));
}
}
/**
* Create snapshot of last known live markers.
* @private
*/
function _backupLiveMarkers(frames, editor) {
var index, frame;
for (index in frames) {
frame = frames[index];
if (frame.cm === editor._codeMirror) {
frame._handleEditorDestroy();
}
}
}
/**
* Handle Editor destruction to create backup of live marker positions
* @private
*/
function _handleEditorCleanup(event, editor) {
_backupLiveMarkers(jumpBackwardStack, editor);
_backupLiveMarkers(jumpForwardStack, editor);
}
/**
* Removes all frames from backward navigation stack for the given file only if the file is changed on disk.
* @private
*/
function _removeBackwardFramesForFile(file) {
jumpBackwardStack = jumpBackwardStack.filter(function (frame) {
return frame.filePath !== file._path && frame.stat !== file._stat;
});
}
/**
* Removes all frames from forward navigation stack for the given file only if the file is changed on disk.
* @private
*/
function _removeForwardFramesForFile(file) {
jumpForwardStack = jumpForwardStack.filter(function (frame) {
return frame.filePath !== file._path && frame.stat !== file._stat;
});
}
/**
* Handles explicit content reset for a document caused by external changes
* @private
*/
function _handleExternalChange(evt, doc) {
if (doc) {
_removeBackwardFramesForFile(doc.file);
_removeForwardFramesForFile(doc.file);
_validateNavigationCmds();
}
}
function _handleProjectOpen() {
jumpBackwardStack = [];
jumpForwardStack = [];
}
/**
* Required to make offline markers alive again to track document mutation
* @private
*/
function _reinstateMarkers(editor, frames) {
var index, frame;
for (index in frames) {
frame = frames[index];
if (!frame.cm && frame.filePath === editor.document.file._path) {
frame._reinstateMarkers(editor);
}
}
}
/**
* Handle Active Editor change to update navigation information
* @private
*/
function _handleActiveEditorChange(event, current, previous) {
if (previous && previous._paneId) { // Handle only full editors
previous.off("beforeSelectionChange", _recordJumpDef);
_captureFrame(previous);
_validateNavigationCmds();
}
if (current && current._paneId) { // Handle only full editors
activePosNotSynced = true;
current.off("beforeSelectionChange", _recordJumpDef);
current.on("beforeSelectionChange", _recordJumpDef);
current.off("beforeDestroy", _handleEditorCleanup);
current.on("beforeDestroy", _handleEditorCleanup);
}
}
function _initHandlers() {
EditorManager.on("activeEditorChange", _handleActiveEditorChange);
ProjectManager.on("projectOpen", _handleProjectOpen);
EditorManager.on("_fullEditorCreatedForDocument", function (event, document, editor) {
_handleExternalChange(event, {file: document.file});
_reinstateMarkers(editor, jumpBackwardStack);
_reinstateMarkers(editor, jumpForwardStack);
});
FileSystem.on("change", function (event, entry) {
if (entry) {
_handleExternalChange(event, {file: entry});
}
});
Document.on("_documentRefreshed", function (event, doc) {
_handleExternalChange(event, {file: doc.file});
});
}
function init() {
_initNavigationCommands();
_initHandlers();
}
exports.init = init;
});

View File

@ -27,5 +27,15 @@
"key": "Cmd-Shift-[",
"platform": "mac"
}
],
"navigation.jump.back": [
{
"key": "Alt-I"
}
],
"navigation.jump.fwd": [
{
"key": "Alt-Shift-I"
}
]
}

View File

@ -45,7 +45,8 @@ define(function (require, exports, module) {
PreferencesManager = brackets.getModule("preferences/PreferencesManager"),
KeyBindingManager = brackets.getModule("command/KeyBindingManager"),
ExtensionUtils = brackets.getModule("utils/ExtensionUtils"),
Mustache = brackets.getModule("thirdparty/mustache/mustache");
Mustache = brackets.getModule("thirdparty/mustache/mustache"),
NavigationProvider = require("NavigationProvider");
var KeyboardPrefs = JSON.parse(require("text!keyboard.json"));
@ -250,7 +251,7 @@ define(function (require, exports, module) {
// Try to see if we have same doc split
// Check existing list for this doc path and active pane entry
var entryIndex = _.findIndex(_mrofList, function (record) {
return (record.file === value.file && record.paneId === MainViewManager.getActivePaneId());
return (record && record.file === value.file && record.paneId === MainViewManager.getActivePaneId());
});
// If found don't process this entry, as the document is already present in active pane
@ -558,7 +559,7 @@ define(function (require, exports, module) {
// Check existing list for this doc path and pane entry
var index = _.findIndex(_mrofList, function (record) {
return (record.file === filePath && record.paneId === paneId);
return (record && record.file === filePath && record.paneId === paneId);
});
var entry;
@ -586,7 +587,7 @@ define(function (require, exports, module) {
// Check existing list for this doc path and pane entry
var index = _.findIndex(_mrofList, function (record) {
return (record.file === filePath && record.paneId === paneId);
return (record && record.file === filePath && record.paneId === paneId);
});
var entry;
@ -620,13 +621,13 @@ define(function (require, exports, module) {
function _handleWorkingSetMove(event, file, sourcePaneId, destinationPaneId) {
// Check existing list for this doc path and source pane entry
var index = _.findIndex(_mrofList, function (record) {
return (record.file === file.fullPath && record.paneId === sourcePaneId);
return (record && record.file === file.fullPath && record.paneId === sourcePaneId);
}), tIndex;
// If an entry is found update the pane info
if (index >= 0) {
// But an entry with the target pane Id should not exist
tIndex = _.findIndex(_mrofList, function (record) {
return (record.file === file.fullPath && record.paneId === destinationPaneId);
return (record && record.file === file.fullPath && record.paneId === destinationPaneId);
});
if (tIndex === -1) {
_mrofList[index].paneId = destinationPaneId;
@ -645,6 +646,10 @@ define(function (require, exports, module) {
function _initRecentFilesList() {
_mrofList = PreferencesManager.getViewState(OPEN_FILES_VIEW_STATE, _getPrefsContext()) || [];
_mrofList = _mrofList.filter(function (entry) {
return entry;
});
// Have a check on the number of entries to fallback to working set if we detect corruption
if (_mrofList.length < MainViewManager.getWorkingSetSize(MainViewManager.ALL_PANES)) {
_mrofList = _createMROFList();
@ -701,7 +706,7 @@ define(function (require, exports, module) {
if (value && value.paneId === paneId) { // We have got an entry which needs merge
// Before modifying the actual pane info check if an entry exists with same target pane
index = _.findIndex(_mrofList, function (record) {
return (record.file === value.file && record.paneId === targetPaneId);
return (record && record.file === value.file && record.paneId === targetPaneId);
});
if (index !== -1) { // A duplicate entry found, remove the current one instead of updating
_mrofList[index] = null;
@ -829,5 +834,6 @@ define(function (require, exports, module) {
AppInit.appReady(function () {
ExtensionUtils.loadStyleSheet(module, "styles/recent-files.css");
NavigationProvider.init();
});
});

View File

@ -1,5 +0,0 @@
# Updating the Docs
Use the Node script [update-wpd-docs](https://github.com/MarcelGerber/update-wpd-docs) to update the `css.json` contents:
```
[sudo] node update-wpd-docs --exclude-vendor-prefixed --output <bracketsRepo>/src/extensions/default/WebPlatformDocs/css.json
```

File diff suppressed because one or more lines are too long

View File

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="61.643px" height="62px" viewBox="0 0 61.643 62" enable-background="new 0 0 61.643 62" xml:space="preserve">
<g>
<g>
<path fill="#F89C20" d="M0,8.359v45.277c0.001-2.138,0.817-4.275,2.448-5.906l14.27-14.27V8.359c0-4.614-3.738-8.355-8.351-8.359
H8.35C3.737,0.004,0,3.746,0,8.359z M11.779,8.359c0,1.889-1.531,3.419-3.42,3.419c-1.888,0-3.419-1.531-3.419-3.419
s1.531-3.42,3.419-3.42C10.249,4.939,11.779,6.471,11.779,8.359z"/>
<path fill="#E54E26" d="M24.912,25.268c1.632-1.632,3.771-2.448,5.91-2.448c-2.139,0-4.279,0.815-5.912,2.448l-8.191,8.192v20.181
c0,2.308-0.936,4.398-2.449,5.911L30.822,43l-5.91-5.91C21.647,33.826,21.647,28.533,24.912,25.268z"/>
<path fill="#D02E27" d="M0,53.636c0,0.001,0,0.002,0,0.004c0,0.035,0,0.069,0,0.103c0,0.018,0,0.035,0.001,0.053
c0,0.017,0,0.034,0,0.05c0.001,0.024,0.002,0.049,0.003,0.072c0,0.009,0,0.019,0,0.028c0.001,0.029,0.002,0.059,0.003,0.088
c0,0.004,0,0.007,0,0.009c0.045,0.932,0.244,1.855,0.598,2.732c0.002,0.005,0.004,0.009,0.006,0.014
c0.007,0.018,0.015,0.035,0.021,0.052c0.007,0.017,0.014,0.034,0.021,0.05c0.002,0.005,0.004,0.01,0.007,0.016
c0.369,0.869,0.881,1.662,1.508,2.351c0.003,0.004,0.006,0.007,0.008,0.01c0.019,0.021,0.039,0.041,0.058,0.063
c0.007,0.007,0.015,0.015,0.021,0.022c0.016,0.017,0.032,0.033,0.047,0.05c0.013,0.013,0.026,0.026,0.039,0.041
c0.01,0.01,0.021,0.021,0.031,0.032c0.024,0.024,0.05,0.05,0.074,0.075c0.024,0.024,0.049,0.048,0.074,0.073
c0.01,0.01,0.022,0.021,0.033,0.032c0.014,0.013,0.027,0.026,0.04,0.039c0.016,0.016,0.033,0.031,0.05,0.047
c0.007,0.006,0.015,0.014,0.023,0.021c0.021,0.019,0.042,0.039,0.062,0.058c0.003,0.003,0.006,0.005,0.01,0.007
c0.688,0.626,1.482,1.139,2.351,1.508c0.006,0.002,0.012,0.005,0.018,0.008c0.016,0.006,0.032,0.013,0.048,0.02
c0.018,0.008,0.036,0.015,0.053,0.021c0.004,0.002,0.009,0.004,0.013,0.006c0.877,0.354,1.802,0.555,2.732,0.598
c0.003,0.001,0.005,0.001,0.008,0.001c0.03,0.001,0.06,0.003,0.09,0.004c0.009,0,0.018,0,0.026,0
c0.025,0.002,0.049,0.002,0.074,0.003c0.016,0.001,0.03,0.001,0.047,0.001c0.018,0.001,0.037,0.001,0.055,0.001
C8.288,61.999,8.32,62,8.352,62h0.014c0.033,0,0.064-0.001,0.097-0.001c0.018,0,0.036,0,0.054-0.001c0.016,0,0.031,0,0.047-0.001
c0.025-0.001,0.049-0.001,0.074-0.003c0.009,0,0.017,0,0.026,0c0.03-0.001,0.06-0.003,0.09-0.004l0.008-0.001
c0.93-0.043,1.854-0.243,2.731-0.597c0.004-0.003,0.009-0.005,0.014-0.007c0.017-0.006,0.034-0.014,0.051-0.021
c0.017-0.006,0.034-0.014,0.051-0.021c0.005-0.002,0.01-0.004,0.016-0.006c0.869-0.369,1.663-0.882,2.352-1.509
c0.002-0.002,0.005-0.003,0.007-0.006c0.021-0.02,0.043-0.039,0.065-0.06c0.006-0.006,0.014-0.012,0.021-0.019
c0.017-0.017,0.035-0.033,0.052-0.049c0.012-0.011,0.024-0.024,0.036-0.035c0.013-0.012,0.025-0.023,0.038-0.035
c0.025-0.024,0.05-0.049,0.073-0.073c1.513-1.514,2.449-3.603,2.449-5.911V33.46L2.449,47.73C0.817,49.361,0.001,51.498,0,53.636z
M8.359,57.066c-1.889,0-3.42-1.531-3.42-3.42c0-1.889,1.531-3.42,3.42-3.42c1.89,0,3.42,1.531,3.42,3.42
C11.779,55.535,10.249,57.066,8.359,57.066z"/>
<path fill="#694D9F" d="M44.924,53.641V33.46l-8.19-8.192c-1.633-1.633-3.773-2.448-5.912-2.448c2.139,0,4.277,0.816,5.91,2.448
c0.612,0.612,1.109,1.296,1.492,2.023c1.657,3.156,1.16,7.146-1.492,9.799L30.822,43l16.547,16.545
c-0.801-0.802-1.435-1.77-1.857-2.844C45.137,55.753,44.924,54.723,44.924,53.641z"/>
<path fill="#7F1333" d="M38.224,27.292c-0.383-0.728-0.88-1.411-1.492-2.023c-1.633-1.632-3.771-2.448-5.91-2.448
c-2.139,0-4.278,0.816-5.91,2.448c-3.264,3.265-3.264,8.558,0,11.822l5.91,5.91l5.91-5.91
C39.384,34.438,39.881,30.447,38.224,27.292z M28.403,33.597c-1.335-1.335-1.335-3.5,0-4.836c0.668-0.667,1.543-1.003,2.419-1.002
c0.875-0.001,1.75,0.334,2.419,1.002c1.336,1.336,1.336,3.5,0,4.836c-0.668,0.668-1.543,1.001-2.419,1.001
C29.946,34.599,29.072,34.266,28.403,33.597z"/>
<path fill="#263C81" d="M45.511,56.702c0.423,1.074,1.057,2.042,1.857,2.844c0.002,0.002,0.003,0.004,0.004,0.006
c0.025,0.024,0.05,0.048,0.074,0.073c0.013,0.012,0.024,0.024,0.038,0.035c0.011,0.011,0.023,0.024,0.036,0.035
c0.018,0.017,0.034,0.033,0.052,0.049c0.007,0.006,0.014,0.012,0.021,0.019c0.021,0.02,0.042,0.041,0.064,0.06
c0.003,0.003,0.005,0.004,0.008,0.006c0.688,0.626,1.482,1.14,2.353,1.508c0.005,0.002,0.01,0.005,0.017,0.007
c0.016,0.007,0.032,0.014,0.05,0.021c0.017,0.007,0.034,0.014,0.053,0.021c0.003,0.001,0.008,0.003,0.012,0.006
c0.877,0.354,1.803,0.554,2.732,0.597l0.009,0.001c0.029,0.001,0.06,0.003,0.09,0.004c0.008,0,0.018,0,0.025,0.001
c0.024,0,0.049,0.001,0.073,0.002c0.017,0,0.032,0.001,0.048,0.001c0.019,0,0.037,0.001,0.054,0.001c0.032,0,0.064,0,0.097,0
h0.016c0.031,0,0.062,0,0.095,0c0.018,0,0.037-0.001,0.055-0.001c0.017,0,0.032-0.001,0.048-0.001
c0.023-0.001,0.049-0.002,0.073-0.002c0.009-0.001,0.018-0.001,0.026-0.001c0.029-0.001,0.061-0.003,0.09-0.004
c0.002,0,0.005,0,0.007-0.001c0.932-0.043,1.855-0.243,2.733-0.598c0.005-0.002,0.009-0.004,0.013-0.005
c0.019-0.007,0.036-0.015,0.054-0.022c0.016-0.006,0.033-0.013,0.049-0.02c0.006-0.003,0.012-0.006,0.016-0.008
c0.869-0.369,1.664-0.881,2.353-1.507c0.003-0.003,0.007-0.005,0.009-0.009c0.021-0.019,0.042-0.038,0.063-0.057
c0.008-0.007,0.016-0.015,0.022-0.021c0.017-0.016,0.033-0.032,0.051-0.047c0.014-0.012,0.026-0.025,0.039-0.039
c0.011-0.011,0.022-0.021,0.033-0.032c0.025-0.024,0.05-0.049,0.074-0.073c0.025-0.024,0.05-0.05,0.073-0.075
c0.011-0.011,0.021-0.022,0.032-0.032c0.013-0.014,0.026-0.027,0.039-0.042c0.015-0.016,0.031-0.032,0.047-0.049
c0.007-0.008,0.015-0.015,0.021-0.022c0.019-0.021,0.038-0.042,0.057-0.063c0.003-0.003,0.007-0.006,0.009-0.01
c0.626-0.688,1.138-1.482,1.508-2.351c0.002-0.006,0.005-0.011,0.007-0.016c0.007-0.017,0.014-0.034,0.021-0.05
c0.008-0.017,0.015-0.035,0.022-0.052c0.001-0.005,0.003-0.009,0.005-0.014c0.354-0.875,0.554-1.8,0.598-2.731
c0-0.003,0-0.006,0-0.01c0.002-0.029,0.003-0.059,0.005-0.088c0-0.009,0-0.019,0-0.028c0.001-0.023,0.002-0.047,0.003-0.072
c0-0.017,0.001-0.034,0.001-0.05c0-0.018,0-0.035,0.001-0.053c0-0.034,0-0.068,0-0.103c0-2.14-0.816-4.279-2.448-5.911
l-14.27-14.27v20.181C44.925,54.723,45.137,55.753,45.511,56.702z M53.285,50.226c1.889,0,3.42,1.531,3.42,3.42
c0,1.889-1.531,3.42-3.42,3.42s-3.421-1.531-3.421-3.42C49.864,51.757,51.396,50.226,53.285,50.226z"/>
<path fill="#2EB3C4" d="M44.925,8.359V33.46l14.271,14.27c1.631,1.632,2.447,3.771,2.447,5.911V8.359
C61.643,3.742,57.9,0,53.285,0C48.667,0,44.925,3.742,44.925,8.359z M53.285,4.939c1.889,0,3.42,1.531,3.42,3.42
s-1.531,3.42-3.42,3.42c-1.89,0-3.421-1.532-3.421-3.42S51.395,4.939,53.285,4.939z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.8 KiB

View File

@ -1,12 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<style>
body {
{{0}}border: 1px solid black;
}
</style>
</head>
<body style="background-color{{1}}: #000">
</body>
</html>

View File

@ -77,7 +77,7 @@ define(function (require, exports, module) {
});
// Read file
file.read(function (err, data, stat) {
file.read(function (err, data, encoding, stat) {
if (!err) {
result.resolve(data, stat.mtime);
} else {
@ -188,6 +188,12 @@ define(function (require, exports, module) {
result = Strings.UNSUPPORTED_ENCODING_ERR;
} else if (name === FileSystemError.EXCEEDS_MAX_FILE_SIZE) {
result = StringUtils.format(Strings.EXCEEDS_MAX_FILE_SIZE, MAX_FILE_SIZE_MB);
} else if (name === FileSystemError.ENCODE_FILE_FAILED) {
result = Strings.ENCODE_FILE_FAILED_ERR;
} else if (name === FileSystemError.DECODE_FILE_FAILED) {
result = Strings.DECODE_FILE_FAILED_ERR;
} else if (name === FileSystemError.UNSUPPORTED_UTF16_ENCODING) {
result = Strings.UNSUPPORTED_UTF16_ENCODING_ERR;
} else {
result = StringUtils.format(Strings.GENERIC_ERROR, name);
}

View File

@ -54,6 +54,21 @@ define(function (require, exports, module) {
* @type {?string}
*/
File.prototype._contents = null;
/**
* Encoding detected by brackets-shell
* @private
* @type {?string}
*/
File.prototype._encoding = null;
/**
* BOM detected by brackets-shell
* @private
* @type {?bool}
*/
File.prototype._preserveBOM = false;
/**
* Consistency hash for this file. Reads and writes update this value, and
@ -86,14 +101,16 @@ define(function (require, exports, module) {
if (typeof (options) === "function") {
callback = options;
options = {};
options.encoding = this._encoding;
}
options.encoding = this._encoding || "utf8";
// We don't need to check isWatched() here because contents are only saved
// for watched files. Note that we need to explicitly test this._contents
// for a default value; otherwise it could be the empty string, which is
// falsey.
if (this._contents !== null && this._stat) {
callback(null, this._contents, this._stat);
callback(null, this._contents, this._encoding, this._stat);
return;
}
@ -102,7 +119,7 @@ define(function (require, exports, module) {
options.stat = this._stat;
}
this._impl.readFile(this._path, options, function (err, data, stat) {
this._impl.readFile(this._path, options, function (err, data, encoding, preserveBOM, stat) {
if (err) {
this._clearCachedData();
callback(err);
@ -111,6 +128,8 @@ define(function (require, exports, module) {
// Always store the hash
this._hash = stat._hash;
this._encoding = encoding;
this._preserveBOM = preserveBOM;
// Only cache data for watched files
if (watched) {
@ -118,7 +137,7 @@ define(function (require, exports, module) {
this._contents = data;
}
callback(err, data, stat);
callback(err, data, encoding, stat);
}.bind(this));
};
@ -147,6 +166,10 @@ define(function (require, exports, module) {
options.expectedHash = this._hash;
options.expectedContents = this._contents;
}
if (!options.encoding) {
options.encoding = this._encoding || "utf8";
}
options.preserveBOM = this._preserveBOM;
// Block external change events until after the write has finished
this._fileSystem._beginChange();

View File

@ -48,7 +48,10 @@ define(function (require, exports, module) {
CONTENTS_MODIFIED : "ContentsModified",
ROOT_NOT_WATCHED : "RootNotBeingWatched",
EXCEEDS_MAX_FILE_SIZE : "ExceedsMaxFileSize",
NETWORK_DRIVE_NOT_SUPPORTED : "NetworkDriveNotSupported"
NETWORK_DRIVE_NOT_SUPPORTED : "NetworkDriveNotSupported",
ENCODE_FILE_FAILED : "EncodeFileFailed",
DECODE_FILE_FAILED : "DecodeFileFailed",
UNSUPPORTED_UTF16_ENCODING : "UnsupportedUTF16Encoding"
// FUTURE: Add remote connection errors: timeout, not logged in, connection err, etc.
};

View File

@ -160,6 +160,12 @@ define(function (require, exports, module) {
return FileSystemError.OUT_OF_SPACE;
case appshell.fs.ERR_FILE_EXISTS:
return FileSystemError.ALREADY_EXISTS;
case appshell.fs.ERR_ENCODE_FILE_FAILED:
return FileSystemError.ENCODE_FILE_FAILED;
case appshell.fs.ERR_DECODE_FILE_FAILED:
return FileSystemError.DECODE_FILE_FAILED;
case appshell.fs.ERR_UNSUPPORTED_UTF16_ENCODING:
return FileSystemError.UNSUPPORTED_UTF16_ENCODING;
}
return FileSystemError.UNKNOWN;
}
@ -363,11 +369,11 @@ define(function (require, exports, module) {
if (stat.size > (FileUtils.MAX_FILE_SIZE)) {
callback(FileSystemError.EXCEEDS_MAX_FILE_SIZE);
} else {
appshell.fs.readFile(path, encoding, function (_err, _data) {
appshell.fs.readFile(path, encoding, function (_err, _data, encoding, preserveBOM) {
if (_err) {
callback(_mapError(_err));
} else {
callback(null, _data, stat);
callback(null, _data, encoding, preserveBOM, stat);
}
});
}
@ -403,10 +409,11 @@ define(function (require, exports, module) {
* @param {function(?string, FileSystemStats=, boolean)} callback
*/
function writeFile(path, data, options, callback) {
var encoding = options.encoding || "utf8";
var encoding = options.encoding || "utf8",
preserveBOM = options.preserveBOM;
function _finishWrite(created) {
appshell.fs.writeFile(path, data, encoding, function (err) {
appshell.fs.writeFile(path, data, encoding, preserveBOM, function (err) {
if (err) {
callback(_mapError(err));
} else {

View File

@ -14,7 +14,7 @@
</p>
<p class="dialog-message"><!-- $NON-NLS$ -->Copyright 2012 - present Adobe Systems Incorporated and its licensors. All rights reserved.</p>
<p class="dialog-message">{{{Strings.ABOUT_TEXT_WEB_PLATFORM_DOCS}}}</p>
<p class="dialog-message">{{{Strings.ABOUT_TEXT_MDN_DOCS}}}</p>
<p class="dialog-message">{{{Strings.ABOUT_TEXT_LINE3}}}</p>
<p class="dialog-message">{{{Strings.ABOUT_TEXT_LINE4}}}</p>
<p class="dialog-message">

View File

@ -6,7 +6,21 @@
<li><a href="#themes" class="themes" data-toggle="tab"><img src="styles/images/themes-icon.svg"/><br/>{{Strings.EXTENSIONS_THEMES_TITLE}}</a></li>
<!--<li><a href="#updates" class="updates" data-toggle="tab"><img src="styles/images/extension-manager-updates.svg"/><br/>{{Strings.EXTENSIONS_UPDATES_TITLE}}</a></li>-->
{{/showRegistry}}
<li><a href="#installed" class="installed" data-toggle="tab"><span class="notification"></span><img src="styles/images/extension-manager-installed.svg"/><br/>{{Strings.EXTENSIONS_INSTALLED_TITLE}}</a></li>
<li>
<a href="#installed" class="installed" data-toggle="tab">
<span class="notification"></span>
<img src="styles/images/extension-manager-installed.svg"/>
<br/>
{{Strings.EXTENSIONS_INSTALLED_TITLE}}
</a>
</li>
<li>
<a href="#default" class="default" data-toggle="tab">
<img src="styles/images/extension-manager-installed.svg"/>
<br/>
{{Strings.EXTENSIONS_DEFAULT_TITLE}}
</a>
</li>
</ul>
<div>
<div class="ext-sort-group">
@ -16,8 +30,10 @@
<option value="downloadCount">{{Strings.EXTENSIONS_DOWNLOADS}}</option>
</select>
</div>
<button class="search-clear">&times;</button>
<input class="search" type="text" placeholder="{{Strings.EXTENSION_SEARCH_PLACEHOLDER}}">
<div class="search-container">
<button class="search-clear">&times;</button>
<input class="search" type="text" placeholder="{{Strings.EXTENSION_SEARCH_PLACEHOLDER}}">
</div>
</div>
</div>
<div class="modal-body no-padding table-striped tab-content">

View File

@ -102,4 +102,4 @@
{{/isInstalled}}
</div>
</td>
</tr>
</tr>

View File

@ -1,6 +1,6 @@
<div class="find-input-group">
<div id="find-group"><!--
--><div class="search-input-container"><input type="text" id="find-what" placeholder="{{queryPlaceholder}}" value="{{initialQuery}}" /><div class="error"></div><span id="find-counter"></span></div><!--
--><div class="search-input-container"><input type="text" id="find-what" placeholder="{{queryPlaceholder}}" value="{{initialQuery}}" /><div class="dropdown-icon"></div><div class="error"></div><span id="find-counter"></span></div><!--
--><button id="find-case-sensitive" class="btn no-focus" tabindex="-1" title="{{Strings.BUTTON_CASESENSITIVE_HINT}}"><div class="button-icon"></div></button><!--
--><button id="find-regexp" class="btn no-focus" tabindex="-1" title="{{Strings.BUTTON_REGEXP_HINT}}"><div class="button-icon"></div></button><!--
{{^multifile}}

View File

@ -2,7 +2,7 @@
<tbody>
{{#reportList}}
<tr class="inspector-section">
<td colspan="3">
<td colspan="4">
<span class="disclosure-triangle {{#isExpanded}}expanded{{/isExpanded}}"></span>
<input type="hidden" value="{{providerName}}" />
{{providerName}} ({{results.length}})
@ -11,6 +11,9 @@
{{#results}}
<tr class="{{display}}">
<td class="line-number" data-character="{{pos.ch}}">{{friendlyLine}}</td>
<td class="line-icon">
<div class="line-icon-default line-icon-{{type}}"></div>
</td>
<td class="line-text">{{message}}</td>
<td class="line-snippet">{{codeSnippet}}</td>
</tr>

View File

@ -90,8 +90,13 @@ define(function (require, exports, module) {
return null;
}
var state = ctx.token.state.localState || ctx.token.state;
if (!state.context && ctx.token.state.html && ctx.token.state.html.localState) {
state = ctx.token.state.html.localState;
// if state contains a valid html inner state use that first
if (state.htmlState) {
state = ctx.token.state.htmlState;
} else {
if (!state.context && ctx.token.state.html && ctx.token.state.html.localState) {
state = ctx.token.state.html.localState;
}
}
return state;
}
@ -435,11 +440,13 @@ define(function (require, exports, module) {
* range: {start: {line: number, ch: number},
* end: {line: number, ch: number}}}} A CSS context info object.
*/
function _getRuleInfoStartingFromPropValue(ctx, editor) {
var propNamePos = $.extend({}, ctx.pos),
function _getRuleInfoStartingFromPropValue(ctx, editorParam) {
var editor = editorParam._codeMirror || editorParam,
contextDoc = editor.document || editor.doc,
propNamePos = $.extend({}, ctx.pos),
backwardPos = $.extend({}, ctx.pos),
forwardPos = $.extend({}, ctx.pos),
propNameCtx = TokenUtils.getInitialContext(editor._codeMirror, propNamePos),
propNameCtx = TokenUtils.getInitialContext(editor, propNamePos),
backwardCtx,
forwardCtx,
lastValue = "",
@ -448,7 +455,7 @@ define(function (require, exports, module) {
offset = TokenUtils.offsetInToken(ctx),
canAddNewOne = false,
testPos = {ch: ctx.pos.ch + 1, line: ctx.pos.line},
testToken = editor._codeMirror.getTokenAt(testPos, true),
testToken = editor.getTokenAt(testPos, true),
propName,
range;
@ -460,7 +467,7 @@ define(function (require, exports, module) {
}
// Scan backward to collect all preceding property values
backwardCtx = TokenUtils.getInitialContext(editor._codeMirror, backwardPos);
backwardCtx = TokenUtils.getInitialContext(editor, backwardPos);
propValues = _getPrecedingPropValues(backwardCtx);
lastValue = "";
@ -492,14 +499,14 @@ define(function (require, exports, module) {
offset = 0;
// If pos is at EOL, then there's implied whitespace (newline).
if (editor.document.getLine(ctx.pos.line).length > ctx.pos.ch &&
if (contextDoc.getLine(ctx.pos.line).length > ctx.pos.ch &&
(testToken.string.length === 0 || testToken.string.match(/\S/))) {
canAddNewOne = false;
}
}
// Scan forward to collect all succeeding property values and append to all propValues.
forwardCtx = TokenUtils.getInitialContext(editor._codeMirror, forwardPos);
forwardCtx = TokenUtils.getInitialContext(editor, forwardPos);
propValues = propValues.concat(_getSucceedingPropValues(forwardCtx, lastValue));
if (propValues.length) {
@ -613,16 +620,34 @@ define(function (require, exports, module) {
return createInfo();
}
// Context from the current editor will have htmlState if we are in css mode
// and in attribute value state of a tag with attribute name style
if (ctx.token.state.htmlState && (!ctx.token.state.localMode || ctx.token.state.localMode.name !== "css")) {
// tagInfo is required to aquire the style attr value
var tagInfo = HTMLUtils.getTagInfo(editor, pos, true),
// To be used as relative character position
offset = tagInfo.position.offset;
/**
* We will use this CM to cook css context in case of style attribute value
* as CM in htmlmixed mode doesn't yet identify this as css context. We provide
* a no-op display function to run CM without a DOM head.
*/
var _contextCM = new CodeMirror(function () {}, {
value: "{" + tagInfo.attr.value.replace(/(^")|("$)/g, ""),
mode: "css"
});
ctx = TokenUtils.getInitialContext(_contextCM, {line: 0, ch: offset + 1});
}
if (_isInPropName(ctx)) {
return _getPropNameInfo(ctx, editor);
return _getPropNameInfo(ctx, ctx.editor);
}
if (_isInPropValue(ctx)) {
return _getRuleInfoStartingFromPropValue(ctx, editor);
}
if (_isInAtRule(ctx)) {
return _getImportUrlInfo(ctx, editor);
return _getRuleInfoStartingFromPropValue(ctx, ctx.editor);
}
return createInfo();

View File

@ -226,6 +226,18 @@ define(function (require, exports, module) {
return createTagInfo();
}
}
//Skip all the 'string' tokens backwards. Required to reach to the first line
//of multiline HTML attribute value.
while (TokenUtils.moveSkippingWhitespace(TokenUtils.movePrevToken, ctx)) {
if (ctx.token.type !== "string") {
break;
}
}
//As we have skipped all the string tokens, make a forward navigation to move to the
//first 'string token so that in next backward navigation we can find '='.
TokenUtils.moveSkippingWhitespace(TokenUtils.moveNextToken, ctx);
//Move to the prev token, and check if it's "="
if (!TokenUtils.moveSkippingWhitespace(TokenUtils.movePrevToken, ctx) || ctx.token.string !== "=") {
@ -299,13 +311,14 @@ define(function (require, exports, module) {
* className:tag string:"></span>"
* @param {Editor} editor An instance of a Brackets editor
* @param {{ch: number, line: number}} constPos A CM pos (likely from editor.getCursorPos())
* @param {isHtmlMode:boolean} let the module know we are in html mode
* @return {{tagName:string,
* attr:{name:string, value:string, valueAssigned:boolean, quoteChar:string, hasEndQuote:boolean},
* position:{tokenType:string, offset:number}
* }}
* A tagInfo object with some context about the current tag hint.
*/
function getTagInfo(editor, constPos) {
function getTagInfo(editor, constPos, isHtmlMode) {
// We're going to be changing pos a lot, but we don't want to mess up
// the pos the caller passed in so we use extend to make a safe copy of it.
var pos = $.extend({}, constPos),
@ -314,8 +327,8 @@ define(function (require, exports, module) {
tagInfo,
tokenType;
// Check if this is inside a style block.
if (editor.getModeForSelection() !== "html") {
// Check if this is not known to be in html mode and inside a style block.
if (!isHtmlMode && editor.getModeForSelection() !== "html") {
return createTagInfo();
}

View File

@ -449,7 +449,7 @@ define({
"ABOUT_TEXT_LINE4" : "Документацията и изходният код могат да бъдат открити тук: <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5" : "Създадено с \u2764 и JavaScript от:",
"ABOUT_TEXT_LINE6" : "Много хора (но в момента не може да заредим данните за тях).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "Документацията и логото на платформата за уеб приложения са лицензирани под лиценз за признание от вида „Криейтив Комънс“: <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Нелокализиран</a>.",
"ABOUT_TEXT_MDN_DOCS" : "Документацията и логото на MDN са лицензирани под лиценз за признание от вида „Криейтив Комънс“: <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Нелокализиран</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "Има ново издание на {APP_NAME}! Щракнете тук за подробности.",
"UPDATE_AVAILABLE_TITLE" : "Има ново обновление",
"UPDATE_MESSAGE" : "Хей, има ново издание на {APP_NAME}. Ето някои от новите функционалности:",
@ -660,7 +660,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS" : "Скорошни проекти",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "Прочетете повече",
// extensions/default/CodeFolding

View File

@ -25,5 +25,5 @@ define({
// Relative to the samples folder
"GETTING_STARTED" : "bg/Getting Started",
"ADOBE_THIRD_PARTY" : "http://www.adobe.com/go/thirdparty/",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/deed.bg"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.bg"
});

View File

@ -448,7 +448,7 @@ define({
"ABOUT_TEXT_LINE4" : "Dokumentace a zdrojový kód na stránce <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>.",
"ABOUT_TEXT_LINE5" : "Vytvořeno s \u2764 a pomocí JavaScriptu těmito lidmi:",
"ABOUT_TEXT_LINE6" : "Mnoho lidí (ale momentálně máme problém s načítáním dat).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "Web Platform Docs a Web Platform logo využívají licenci Creative Commons Attribution, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS" : "MDN Docs a MDN logo využívají licenci Creative Commons Attribution, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "Je dostupná nová verze {APP_NAME}! Klikněte zde pro více informací.",
"UPDATE_AVAILABLE_TITLE" : "Dostupná aktualizace",
"UPDATE_MESSAGE" : "Nová verze {APP_NAME} je dostupná. Seznam některých vylepšení:",
@ -659,7 +659,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS" : "Nedávné projekty",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "Více",
// extensions/default/CodeFolding

View File

@ -25,5 +25,5 @@ define({
// Relative to the samples folder
"GETTING_STARTED" : "cs/Getting Started",
"ADOBE_THIRD_PARTY" : "http://www.adobe.com/go/thirdparty_cz/",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/deed.cs"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.cs"
});

View File

@ -393,7 +393,7 @@ define({
"ABOUT_TEXT_LINE4" : "Dokumentation og kildekode på <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5" : "Skabt med \u2764 og JavaScript af:",
"ABOUT_TEXT_LINE6" : "En masse mennesker (men vi har problemer med at hente det data i øjeblikket).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "Dokumentationen og det grafiske logo fra Web Platform er udgivet under en Creative Commons Attribution licens, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS" : "Dokumentationen og det grafiske logo fra MDN er udgivet under en Creative Commons Attribution licens, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "Der ligger en ny version af {APP_NAME} klar! Klik her for at læse mere.",
"UPDATE_AVAILABLE_TITLE" : "Opdatering klar",
"UPDATE_MESSAGE" : "Hey! Der er en ny version af {APP_NAME} tilgængelig. Her er nogen af de nye funktioner:",
@ -555,7 +555,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS" : "Seneste projekter",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "Læs mere"
});

View File

@ -129,6 +129,7 @@ define({
"SAVE_CLOSE_MULTI_MESSAGE" : "Wollen Sie Ihre Änderungen in den folgenden Dateien speichern?",
"EXT_MODIFIED_TITLE" : "Externe Änderungen",
"CONFIRM_DELETE_TITLE" : "Löschen bestätigen",
"CONFIRM_FILE_DELETE" : "Sind Sie sich sicher, dass Sie die Datei <span class='dialog-filename'>{0}</span> löschen wollen?",
"CONFIRM_FOLDER_DELETE" : "Sind Sie sich sicher, dass Sie den Ordner <span class='dialog-filename'>{0}</span> löschen wollen?",
"FILE_DELETED_TITLE" : "Datei gelöscht",
"EXT_MODIFIED_WARNING" : "<span class='dialog-filename'>{0}</span> wurde außerhalb von {APP_NAME} geändert.<br /><br />Wollen Sie die Datei speichern und die externen Änderungen ersetzen?",
@ -151,8 +152,10 @@ define({
"FIND_MATCH_INDEX" : "{0} von {1}",
"FIND_NO_RESULTS" : "Keine Ergebnisse",
"FIND_QUERY_PLACEHOLDER" : "Suchen\u2026",
"FIND_HISTORY_MAX_COUNT" : "Höchstzahl an Ergebnissen im Suchverlauf",
"REPLACE_PLACEHOLDER" : "Ersetzen mit\u2026",
"BUTTON_REPLACE_ALL" : "Mehrere\u2026",
"BUTTON_REPLACE_ALL" : "Alle ersetzen",
"BUTTON_REPLACE_BATCH" : "Mehrere\u2026",
"BUTTON_REPLACE_ALL_IN_FILES" : "Ersetzen\u2026",
"BUTTON_REPLACE" : "Ersetzen",
"BUTTON_NEXT" : "\u25B6",
@ -208,6 +211,7 @@ define({
"FILE_FILTER_DIALOG" : "Filter bearbeiten",
"FILE_FILTER_INSTRUCTIONS" : "Schließe Dateien und Ordner aus, auf die einer der folgenden Pfade / Teilpfade oder <a href='{0}' title='{0}'>Platzhalter</a> zutrifft. Nutze für jeden Pfad eine neue Zeile.",
"FILTER_NAME_PLACEHOLDER" : "Benenne diesen Filter (optional)",
"FILTER_NAME_REMAINING" : "Noch {0} Zeichen",
"FILE_FILTER_CLIPPED_SUFFIX" : "und {0} weitere",
"FILTER_COUNTING_FILES" : "Dateien werden gezählt\u2026",
"FILTER_FILE_COUNT" : "Lässt {0} von {1} Dateien {2} zu",
@ -417,6 +421,7 @@ define({
"CMD_SHOW_IN_EXPLORER" : "Im Explorer anzeigen",
"CMD_SHOW_IN_FINDER" : "Im Finder anzeigen",
"CMD_SHOW_IN_OS" : "Im Dateisystem anzeigen",
"CMD_SWITCH_PANE_FOCUS" : "In andere Ansicht wechseln",
// Help menu commands
"HELP_MENU" : "Hilfe",
@ -450,7 +455,7 @@ define({
"ABOUT_TEXT_LINE4" : "Dokumentation und Quellcode unter <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5" : "Gemacht mit \u2764 und JavaScript von:",
"ABOUT_TEXT_LINE6" : "…vielen Leuten (…leider haben wir aber gerade Probleme, diese Daten zu laden).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "Web Platform-Dokumente und das grafische Logo von Web Platform sind unter einer Creative-Commons-Namensnennungs-Lizenz lizenziert, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS" : "MDN-Dokumente und das grafische Logo von MDN sind unter einer Creative-Commons-Namensnennungs-Lizenz lizenziert, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "Eine neue Version von {APP_NAME} ist verfügbar! Für Details hier klicken.",
"UPDATE_AVAILABLE_TITLE" : "Update verfügbar",
"UPDATE_MESSAGE" : "Hallo! Eine neue Version von {APP_NAME} ist verfügbar. Hier sind einige der neuen Funktionen:",
@ -500,15 +505,18 @@ define({
"INSTALL_CANCELED" : "Installation abgebrochen.",
"VIEW_COMPLETE_DESCRIPTION" : "Komplette Beschreibung anzeigen",
"VIEW_TRUNCATED_DESCRIPTION" : "Gekürzte Beschreibung anzeigen",
"SORT_EXTENSION_METHOD" : "Erweiterungen nach Downloadzahl oder Veröffentlichungsdatum sortieren",
// These must match the error codes in ExtensionsDomain.Errors.* :
"INVALID_ZIP_FILE" : "Der heruntergeladene Inhalt ist keine gültige ZIP-Datei.",
"INVALID_PACKAGE_JSON" : "Die JSON-Paketdatei ist ungültig (Fehler: {0}).",
"MISSING_PACKAGE_NAME" : "Die JSON-Paketdatei hat kein definierten Paketnamen.",
"MISSING_PACKAGE_JSON" : "Die package.json-Datei ist nicht vorhanden.",
"INVALID_PACKAGE_JSON" : "Die package.json-Datei ist ungültig (Fehler: {0}).",
"MISSING_PACKAGE_NAME" : "Die package.json-Datei hat keinen definierten Paketnamen.",
"BAD_PACKAGE_NAME" : "{0} ist ein ungültiger Paketname.",
"MISSING_PACKAGE_VERSION" : "Die JSON-Paketdatei hat keine definierte Paketversion.",
"MISSING_PACKAGE_VERSION" : "Die package.json-Datein hat keine definierte Paketversion.",
"INVALID_VERSION_NUMBER" : "Die Paket-Versionsnummer ({0}) ist ungültig.",
"INVALID_BRACKETS_VERSION" : "Die {APP_NAME}-Kompatibilitäts-Zeichenkette ({0}) ist ungültig.",
"DISALLOWED_WORDS" : "Die Wörter ({1}) sind im Feld {0} nicht erlaubt.",
"NPM_INSTALL_FAILED" : "Der Befehl 'npm install' ist fehlgeschlagen: {0}",
"API_NOT_COMPATIBLE" : "Die Erweiterung ist nicht mit der aktuellen Version von {APP_NAME} kompatibel. Die Erweiterung wurde in den Ordner für die deaktivierten Erweiterungen installiert.",
"MISSING_MAIN" : "Das Paket hat keine main.js-Datei.",
"EXTENSION_ALREADY_INSTALLED" : "Durch die Installation dieses Pakets wird eine zuvor installierte Erweiterung überschrieben. Alte Erweiterung überschreiben?",
@ -572,9 +580,12 @@ define({
"NO_EXTENSION_MATCHES" : "Keine Erweiterungen passen auf Ihre Suchanfrage.",
"REGISTRY_SANITY_CHECK_WARNING" : "ACHTUNG: Diese Erweiterungen stammen nicht unbedingt von den Machern von {APP_NAME}. Erweiterungen werden nicht überprüft und haben uneingeschränkte lokale Rechte. Seien Sie vorsichtig, wenn Sie Erweiterungen aus unbekannter Quelle installieren.",
"EXTENSIONS_INSTALLED_TITLE" : "Installiert",
"EXTENSIONS_DEFAULT_TITLE" : "Standard",
"EXTENSIONS_AVAILABLE_TITLE" : "Verfügbar",
"EXTENSIONS_THEMES_TITLE" : "Designs",
"EXTENSIONS_UPDATES_TITLE" : "Updates",
"EXTENSIONS_LAST_UPDATED" : "Zuletzt aktualisiert",
"EXTENSIONS_DOWNLOADS" : "Downloads",
"INLINE_EDITOR_NO_MATCHES" : "Keine Ergebnisse verfügbar.",
"INLINE_EDITOR_HIDDEN_MATCHES" : "Alle Ergebnisse sind ausglendet. Klicken Sie auf die rechts gelisteten Dateien, um die dazugehörigen Ergebnisse anzuzeigen.",
@ -642,6 +653,7 @@ define({
"COLOR_EDITOR_RGBA_BUTTON_TIP" : "RGBa-Format",
"COLOR_EDITOR_HEX_BUTTON_TIP" : "Hex-Format",
"COLOR_EDITOR_HSLA_BUTTON_TIP" : "HSLa-Format",
"COLOR_EDITOR_0X_BUTTON_TIP" : "Hex-Format (0x)",
"COLOR_EDITOR_USED_COLOR_TIP_SINGULAR" : "{0} ({1} Mal verwendet)",
"COLOR_EDITOR_USED_COLOR_TIP_PLURAL" : "{0} ({1} Mal verwendet)",
@ -661,7 +673,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS" : "Zuletzt verwendete Projekte",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "Weiterlesen",
// extensions/default/CodeFolding
@ -693,6 +705,7 @@ define({
"DESCRIPTION_CODE_FOLDING_MIN_FOLD_SIZE" : "Mindestzahl an Zeilen, bevor eine einklappbare Folding-Markierung erscheint",
"DESCRIPTION_CODE_FOLDING_SAVE_FOLD_STATES" : "Aktiviert das Speichern der eingeklappten Abschnitte",
"DESCRIPTION_CODE_FOLDING_MAKE_SELECTIONS_FOLDABLE": "Aktiviert das Einklappen von ausgewähltem Text",
"DESCRIPTION_DISABLED_DEFAULT_EXTENSIONS" : "Standardmäßig installierte Erweiterungen, die deaktiviert sind",
"DESCRIPTION_ATTR_HINTS" : "Aktiviert Code Hints für HTML-Attribute",
"DESCRIPTION_CSS_PROP_HINTS" : "Aktiviert Code Hints für CSS/LESS/SCSS",
"DESCRIPTION_JS_HINTS" : "Aktiviert Code Hints für JavaScript",
@ -742,6 +755,8 @@ define({
"DESCRIPTION_LANGUAGE" : "Sprachspezifische Einstellungen",
"DESCRIPTION_LANGUAGE_FILE_EXTENSIONS" : "Zusätzliche Zuordnungen von Dateierweiterung zu Programmiersprache",
"DESCRIPTION_LANGUAGE_FILE_NAMES" : "Zusätzliche Zuordnungen von Dateiname zu Programmiersprache",
"DESCRIPTION_LINEWISE_COPY_CUT" : "Kopieren und Ausschneiden ohne Auswahl kopiert alle Zeilen mit Cursor bzw. schneidet diese aus",
"DESCRIPTION_INPUT_STYLE" : "Die Art, wie CodeMirror mit Eingaben und Auswahlen umgeht. Kann 'textarea' (Standard) oder 'contenteditable' sein, wobei letzteres besser für Screenreader geeignet ist",
"DESCRIPTION_LINTING_ENABLED" : "Aktiviert Linten beim Speichern",
"DESCRIPTION_ASYNC_TIMEOUT" : "Die Zeitbegrenzung in Millisekunden, nach der asynchrone Linter gestoppt werden",
"DESCRIPTION_LINTING_PREFER" : "Array der Linter, die als erstes ausgeführt werden",
@ -786,7 +801,9 @@ define({
"DEFAULT_PREFERENCES_JSON_DEFAULT" : "Standard",
"DESCRIPTION_PURE_CODING_SURFACE" : "Aktiviert den Ablenkungsfreien Modus, bei dem alle UI-Elemente außer dem Code ausgeblendet werden",
"DESCRIPTION_INDENT_LINE_COMMENT" : "Aktiviert das Einrücken von Zeilenkommentaren",
"DESCRIPTION_RECENT_FILES_NAV" : "Aktiviert das Navigieren durch kürzlich verwendete Dateien"
"DESCRIPTION_RECENT_FILES_NAV" : "Aktiviert das Navigieren durch kürzlich verwendete Dateien",
"DESCRIPTION_LIVEDEV_WEBSOCKET_PORT" : "Der Port, der für den WebSocket-Server der Live-Vorschau genutzt wird",
"DESCRIPTION_LIVE_DEV_HIGHLIGHT_SETTINGS" : "Live-Vorschau Highlight-Einstellungen"
});
/* Last translated for 96f34a04b0cb3226fff29ae43bc3bc07bedc2d16 */
/* Last translated for ae015b5be491e1d97d86b1f7f4fd352157063110 */

View File

@ -25,5 +25,5 @@ define({
// Relative to the samples folder
"GETTING_STARTED" : "de/Erste Schritte",
"ADOBE_THIRD_PARTY" : "http://www.adobe.com/go/thirdparty_de/",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/deed.de"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.de"
});

View File

@ -332,7 +332,7 @@ define({
"ABOUT_TEXT_LINE4" : "Documentation και πηγαίος κώδικας στο <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5" : "Φτιαγμένο με \u2764 και JavaScript από:",
"ABOUT_TEXT_LINE6" : "Πολλούς ανθρώπους (απλά αντιμετωπίζουμε ένα πρόβλημα με την φόρτωση των δεδομένων αυτήν την στιγμή).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "Τα Web Platform Docs και το Web Platform γραφικό logo είναι αδειοδοτημένα κάτω από την άδεια Creative Commons Attribution, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS" : "Τα MDN Docs και το MDN γραφικό logo είναι αδειοδοτημένα κάτω από την άδεια Creative Commons Attribution, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "Υπάρχει ένα νέο build του {APP_NAME} διαθέσιμο! Πατήστε εδώ για λεπτομέρειες.",
"UPDATE_AVAILABLE_TITLE" : "Διαθέσιμη Αναβάθμιση",
"UPDATE_MESSAGE" : "Ψιτ, υπάρχει ένα νέο build του {APP_NAME} διαθέσιμο. Μερικές από τις καινούργιες λειτουργίες:",
@ -501,7 +501,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS" : "Πρόσφατα Project",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "Διαβάστε Περισσότερα"
});

View File

@ -25,5 +25,5 @@ define({
// Relative to the samples folder
"GETTING_STARTED" : "el/Ξεκινώντας",
"ADOBE_THIRD_PARTY" : "http://www.adobe.com/go/thirdparty/",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/deed.el"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.el"
});

View File

@ -439,7 +439,7 @@ define({
"ABOUT_TEXT_LINE4" : "Puedes encontrar la documentación y código fuente en <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5" : "Hecho con \u2764 y JavaScript por:",
"ABOUT_TEXT_LINE6" : "Mucha gente (pero ahora mismo estamos teniendo problemas para cargar esos datos).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "El contenido de Web Platform Docs y el logo de Web Platform están disponibles bajo Licencia de Reconocimiento de Creative Commons, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS" : "El contenido de MDN Docs y el logo de MDN están disponibles bajo Licencia de Reconocimiento de Creative Commons, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "¡Hay una nueva versión de {APP_NAME} disponible! Haz clic aquí para ver más detalles.",
"UPDATE_AVAILABLE_TITLE" : "Actualización disponible",
"UPDATE_MESSAGE" : "¡Hay una nueva versión de {APP_NAME} disponible! Éstas son algunas de las nuevas características:",
@ -647,7 +647,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS" : "Proyectos recientes",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "Más",
// extensions/default/CodeFolding

View File

@ -25,6 +25,6 @@ define({
// Relative to the samples folder
"GETTING_STARTED" : "es/Primeros Pasos",
"ADOBE_THIRD_PARTY" : "http://www.adobe.com/go/thirdparty_es/",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/deed.es"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.es"
});

View File

@ -434,7 +434,7 @@ define({
"ABOUT_TEXT_LINE4" : "اسناد و منابع در <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5" : "ساخته شده با \u2764 و جاوا اسکریپت توسط:",
"ABOUT_TEXT_LINE6" : "بسیاری از مردم (اما اکنون در بارگذاری داده ها ما مشکل داریم ).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "اسناد و مدارک صفحات وب و آرم اصلی گرافیکی تحت مجوز , <a href='#' class='clickable-link' data-href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 .پایه ریزی شده است</a>.",
"ABOUT_TEXT_MDN_DOCS" : "اسناد و مدارک صفحات وب و آرم اصلی گرافیکی تحت مجوز , <a href='#' class='clickable-link' data-href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 .پایه ریزی شده است</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "ساخته ی جدیدی از {APP_NAME} هم اکنون در دسترس است! جهت مشاهده جزئیات کلیک کنید.",
"UPDATE_AVAILABLE_TITLE" : "بروزرسانی جدید در دسترس است",
"UPDATE_MESSAGE" : "نسخه جدیدی از {APP_NAME} هم اکنون در دسترس است. برخی از مشخصه های آن:",
@ -620,7 +620,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS" : "پروژه های اخیر",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "بیشتر بخوانید"
});
/* Last translated for eef9c68a1fdff372b9ea6352cacb5e2506e55be9 */

View File

@ -25,5 +25,5 @@ define({
// Relative to the samples folder
"GETTING_STARTED" : "fa-ir/Getting Started",
"ADOBE_THIRD_PARTY" : "http://www.adobe.com/go/thirdparty/",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/deed.fa"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.fa"
});

View File

@ -453,7 +453,7 @@ define({
"ABOUT_TEXT_LINE4" : "Dokumentaatio ja lähdekoodi osoitteessa <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5" : "He tekivät tämän \u2764:lla ja JavaScriptillä:",
"ABOUT_TEXT_LINE6" : "Monet ihmiset (mutta meillä on juuri nyt vaikeuksia ladata näitä tietoja).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "Web Platform \u2011dokumentit ja graafinen Web Platform \u2011logo on lisensoitu Creative Commons Attribution \u2011lisenssillä, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS" : "MDN \u2011dokumentit ja graafinen MDN \u2011logo on lisensoitu Creative Commons Attribution \u2011lisenssillä, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "Uusi {APP_NAME}-versio on saatavilla! Saat lisätietoja napsauttamalla tästä.",
"UPDATE_AVAILABLE_TITLE" : "Päivitys saatavilla",
"UPDATE_MESSAGE" : "Hei, uusi {APP_NAME}-versio on saatavilla. Tässä on joitakin uusista ominaisuuksista:",
@ -669,7 +669,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS" : "Viimeaikaiset projektit",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "Lue lisää",
// extensions/default/CodeFolding

View File

@ -25,5 +25,5 @@ define({
// Relative to the samples folder
"GETTING_STARTED" : "fi/Aloitus",
"ADOBE_THIRD_PARTY" : "http://www.adobe.com/go/thirdparty_fi/",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/deed.fi"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.fi"
});

View File

@ -35,7 +35,10 @@ define({
"NO_MODIFICATION_ALLOWED_ERR": "Le répertoire cible ne peut pas être modifié.",
"NO_MODIFICATION_ALLOWED_ERR_FILE": "Vous nêtes pas autorisé à effectuer des modifications.",
"CONTENTS_MODIFIED_ERR": "Le fichier a été modifié dans une application autre que {APP_NAME}.",
"UNSUPPORTED_ENCODING_ERR": "Pour le moment, {APP_NAME} ne prend en charge que les fichiers texte avec encodage UTF-8.",
"UNSUPPORTED_ENCODING_ERR": "Format de codage inconnu",
"ENCODE_FILE_FAILED_ERR": "{APP_NAME} na pas pu coder le contenu du fichier.",
"DECODE_FILE_FAILED_ERR": "{APP_NAME} na pas pu décoder le contenu du fichier.",
"UNSUPPORTED_UTF16_ENCODING_ERR": "Actuellement, {APP_NAME} ne prend pas en charge les fichiers texte codés UTF-16.",
"FILE_EXISTS_ERR": "Le fichier ou le répertoire existe déjà.",
"FILE": "fichier",
"FILE_TITLE": "Fichier",
@ -152,6 +155,7 @@ define({
"FIND_MATCH_INDEX": "{0} sur {1}",
"FIND_NO_RESULTS": "Aucun résultat",
"FIND_QUERY_PLACEHOLDER": "Rechercher\u2026",
"FIND_HISTORY_MAX_COUNT": "Nombre maximal d'éléments de recherche dans l'historique des recherches",
"REPLACE_PLACEHOLDER": "Remplacer par\u2026",
"BUTTON_REPLACE_ALL": "Tout remplacer",
"BUTTON_REPLACE_BATCH": "Traiter par lots\u2026",
@ -217,13 +221,13 @@ define({
"FILTER_FILE_COUNT_ALL": "Autorise les {0} fichiers {1}",
// Quick Edit
"ERROR_QUICK_EDIT_PROVIDER_NOT_FOUND": "Fonction Edition rapide non disponible pour la position actuelle du curseur",
"ERROR_CSSQUICKEDIT_BETWEENCLASSES": "Edition rapide CSS : placez le curseur sur un seul nom de classe",
"ERROR_CSSQUICKEDIT_CLASSNOTFOUND": "Edition rapide CSS : attribut de classe incomplet",
"ERROR_CSSQUICKEDIT_IDNOTFOUND": "Edition rapide CSS : attribut dID incomplet",
"ERROR_CSSQUICKEDIT_UNSUPPORTEDATTR": "Edition rapide CSS : placez le curseur dans la balise, la classe ou lID",
"ERROR_TIMINGQUICKEDIT_INVALIDSYNTAX": "Edition rapide des fonctions de temporisation CSS : syntaxe incorrecte",
"ERROR_JSQUICKEDIT_FUNCTIONNOTFOUND": "Edition rapide JS : placez le curseur dans le nom de fonction",
"ERROR_QUICK_EDIT_PROVIDER_NOT_FOUND": "Fonction Édition rapide non disponible pour la position actuelle du curseur",
"ERROR_CSSQUICKEDIT_BETWEENCLASSES": "Édition rapide CSS : placez le curseur sur un seul nom de classe",
"ERROR_CSSQUICKEDIT_CLASSNOTFOUND": "Édition rapide CSS : attribut de classe incomplet",
"ERROR_CSSQUICKEDIT_IDNOTFOUND": "Édition rapide CSS : attribut dID incomplet",
"ERROR_CSSQUICKEDIT_UNSUPPORTEDATTR": "Édition rapide CSS : placez le curseur dans la balise, la classe ou lID",
"ERROR_TIMINGQUICKEDIT_INVALIDSYNTAX": "Édition rapide des fonctions de temporisation CSS : syntaxe incorrecte",
"ERROR_JSQUICKEDIT_FUNCTIONNOTFOUND": "Édition rapide JS : placez le curseur dans le nom de fonction",
// Quick Docs
"ERROR_QUICK_DOCS_PROVIDER_NOT_FOUND": "Fonction Documentation rapide non disponible pour la position actuelle du curseur",
@ -290,6 +294,7 @@ define({
"STATUSBAR_CODE_INSPECTION_TOOLTIP": "{0}. Cliquez pour afficher/masquer le panneau des rapports.",
"STATUSBAR_DEFAULT_LANG": "(par défaut)",
"STATUSBAR_SET_DEFAULT_LANG": "Utiliser par défaut pour les fichiers .{0}",
"STATUSBAR_ENCODING_TOOLTIP": "Sélectionner le codage",
// CodeInspection: errors/warnings
"ERRORS_PANEL_TITLE_MULTIPLE": "{0} problèmes",
@ -414,6 +419,8 @@ define({
"CMD_CSS_QUICK_EDIT_NEW_RULE": "Nouvelle règle",
"CMD_NEXT_DOC": "Document suivant",
"CMD_PREV_DOC": "Document précédent",
"CMD_NAVIGATE_BACKWARD": "Naviguer vers larrière",
"CMD_NAVIGATE_FORWARD": "Naviguer vers lavant",
"CMD_NEXT_DOC_LIST_ORDER": "Document suivant de la liste",
"CMD_PREV_DOC_LIST_ORDER": "Document précédent de la liste",
"CMD_SHOW_IN_TREE": "Afficher dans larborescence de fichiers",
@ -454,7 +461,7 @@ define({
"ABOUT_TEXT_LINE4": "La documentation et le code source sont disponibles à ladresse <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5": "Développé avec \u2764 et JavaScript par :",
"ABOUT_TEXT_LINE6": "De nombreux contributeurs (information indisponible pour le moment).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS": "Web Platform Docs et le logo Web Platform font lobjet dune licence Creative Commons Attribution, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS": "MDN Docs et le logo graphique MDN sont sous licence Creative Commons Attribution, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a>.",
"UPDATE_NOTIFICATION_TOOLTIP": "Une nouvelle version de {APP_NAME} est disponible. Cliquez ici pour plus de détails.",
"UPDATE_AVAILABLE_TITLE": "Mise à jour disponible",
"UPDATE_MESSAGE": "Une nouvelle version de {APP_NAME} est disponible. Voici quelques-unes des nouvelles fonctionnalités proposées :",
@ -498,7 +505,7 @@ define({
"INSTALL_EXTENSION_HINT": "URL du fichier zip de lextension ou du référentiel GitHub",
"INSTALLING_FROM": "Installation de lextension depuis·{0}\u2026",
"INSTALL_SUCCEEDED": "Installation réussie !",
"INSTALL_FAILED": "Echec de linstallation.",
"INSTALL_FAILED": "Échec de linstallation.",
"CANCELING_INSTALL": "Annulation en cours\u2026",
"CANCELING_HUNG": "Lannulation de linstallation prend beaucoup de temps. Il est possible quune erreur interne se soit produite.",
"INSTALL_CANCELED": "Installation annulée.",
@ -579,6 +586,7 @@ define({
"NO_EXTENSION_MATCHES": "Aucune extension ne correspond à votre recherche.",
"REGISTRY_SANITY_CHECK_WARNING": "REMARQUE : ces extensions peuvent provenir dautres sources que lapplication {APP_NAME} elle-même. Les extensions ne sont pas contrôlées et disposent de privilèges locaux complets. Soyez prudents lorsque vous installez des extensions provenant dune source inconnue.",
"EXTENSIONS_INSTALLED_TITLE": "Installées",
"EXTENSIONS_DEFAULT_TITLE": "Par défaut",
"EXTENSIONS_AVAILABLE_TITLE": "Disponibles",
"EXTENSIONS_THEMES_TITLE": "Thèmes",
"EXTENSIONS_UPDATES_TITLE": "Mises à jour",
@ -671,7 +679,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS": "Projets récents",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK": "En savoir plus",
// extensions/default/CodeFolding
@ -702,6 +710,7 @@ define({
"DESCRIPTION_CODE_FOLDING_MIN_FOLD_SIZE": "Nombre minimum de lignes pour quune icône de section réductible apparaisse",
"DESCRIPTION_CODE_FOLDING_SAVE_FOLD_STATES": "vrai pour mémoriser les sections réduites si vous fermez et rouvrez un fichier ou un projet",
"DESCRIPTION_CODE_FOLDING_MAKE_SELECTIONS_FOLDABLE": "vrai pour activer le pliage de code sur le texte sélectionné dans léditeur",
"DESCRIPTION_DISABLED_DEFAULT_EXTENSIONS": "Extensions par défaut qui sont désactivées",
"DESCRIPTION_ATTR_HINTS": "Activer/désactiver les indicateurs dattribut HTML",
"DESCRIPTION_CSS_PROP_HINTS": "Activer/désactiver les indicateurs de propriété CSS/LESS/SCSS",
"DESCRIPTION_JS_HINTS": "Activer/désactiver les indicateurs de code JavaScript",
@ -752,6 +761,7 @@ define({
"DESCRIPTION_LANGUAGE_FILE_EXTENSIONS": "Mappages supplémentaires entre extension de fichier et nom de langue",
"DESCRIPTION_LANGUAGE_FILE_NAMES": "Mappages supplémentaires entre nom de fichier et nom de langue",
"DESCRIPTION_LINEWISE_COPY_CUT": "En cas dabsence de sélection, un couper-copier coupe ou copie les lignes entières comportant des curseurs.",
"DESCRIPTION_INPUT_STYLE": "Sélectionne la manière dont CodeMirror gère l'entrée et la mise au point. Il peut s'agir de zone de texte, qui est la sélection par défaut, ou de contenu modifiable, qui est la meilleure méthode pour les lecteurs d'écran (instable)",
"DESCRIPTION_LINTING_ENABLED": "vrai pour activer linspection de code",
"DESCRIPTION_ASYNC_TIMEOUT": "Durée, en millisecondes, après laquelle les utilitaires lint asynchrones échouent",
"DESCRIPTION_LINTING_PREFER": "Ensemble dutilitaires lint à exécuter en premier",
@ -796,5 +806,6 @@ define({
"DESCRIPTION_PURE_CODING_SURFACE": "vrai pour activer le mode code seul et masquer tous les autres éléments de linterface utilisateur dans {APP_NAME}",
"DESCRIPTION_INDENT_LINE_COMMENT": "vrai pour activer la mise en retrait des commentaires sur une ligne",
"DESCRIPTION_RECENT_FILES_NAV": "Activer/désactiver la navigation dans les fichiers récents",
"DESCRIPTION_LIVEDEV_WEBSOCKET_PORT": "Port sur lequel sexécute le serveur WebSocket pour le mode Aperçu en direct"
"DESCRIPTION_LIVEDEV_WEBSOCKET_PORT": "Port sur lequel sexécute le serveur WebSocket pour le mode Aperçu en direct",
"DESCRIPTION_LIVE_DEV_HIGHLIGHT_SETTINGS": "Paramètres de surbrillance de l'Aperçu en direct"
});

View File

@ -25,5 +25,5 @@ define({
// Relative to the samples folder
"GETTING_STARTED" : "fr/Premiers pas",
"ADOBE_THIRD_PARTY" : "http://www.adobe.com/go/thirdparty_fr/",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/deed.fr"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.fr"
});

View File

@ -422,7 +422,7 @@ define({
"ABOUT_TEXT_LINE4" : "Podes atopar a documentación e código fonte en <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5" : "Feito con \u2764 e JavaScript por:",
"ABOUT_TEXT_LINE6" : "Moita xente (pero agora mesmo estamos tendo problemas para cargar eses datos).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "O contido de Web Platform Docs e o logo de Web Platform están dispoñibles baixo unha Licencia de Recoñecemento de Creative Commons, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS" : "O contido de MDN Docs e o logo de MDN están dispoñibles baixo unha Licencia de Recoñecemento de Creative Commons, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "¡Hai unha nova versión de {APP_NAME} dispoñible! Fai click aquí para máis detalles.",
"UPDATE_AVAILABLE_TITLE" : "Actualización dispoñible",
"UPDATE_MESSAGE" : "¡Hai unha nova versión de {APP_NAME} dispoñible! Éstas son algunas das novas características:",
@ -605,7 +605,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS" : "Proxectos recentes",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "Máis"
});

View File

@ -382,7 +382,7 @@ define({
"ABOUT_TEXT_LINE4" : "Dokumentacija i izvorni kôd na <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5" : "Napravili sa \u2764 i JavaScriptom:",
"ABOUT_TEXT_LINE6" : "Mnogo ljudi (ali trenutno imamo poteškoća sa učitavanjem tih podataka).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "Web Platform Docs i Web Platform graphical logo su zaštićeni pod Creative Commons Attribution licencom, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS" : "MDN Docs i MDN graphical logo su zaštićeni pod Creative Commons Attribution licencom, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "Dostupna je nova verzija aplikacije {APP_NAME}! Kliknite ovdje za detalje.",
"UPDATE_AVAILABLE_TITLE" : "Novija verzija je dostupna",
"UPDATE_MESSAGE" : "Nova verzija aplikacije {APP_NAME} je dostupna. Ovo su neke od najnovijih izmjena:",
@ -558,7 +558,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS" : "Nedavni projekti",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "Pročitaj više",
// extensions/default/CodeFolding

View File

@ -24,5 +24,5 @@
define({
// Relative to the samples folder
"ADOBE_THIRD_PARTY" : "http://www.adobe.com/go/thirdparty/",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/deed.hr"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.hr"
});

View File

@ -265,7 +265,7 @@ define({
"ABOUT_TEXT_LINE4" : "Documentation and source at <a 'https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5" : "Készítve \u2764 és JavaScript-el a következők által:",
"ABOUT_TEXT_LINE6" : "Sok ember (de ezt az adatot nem tudjuk megjeleníteni jelenleg).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "A Web Platform Dokumentáció és a Web Platform grafikai logó a Creative Commons Attribution license alatt vannak licencelve, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS" : "A MDN Dokumentáció és a MDN grafikai logó a Creative Commons Attribution license alatt vannak licencelve, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "Új {APP_NAME} verzió elérhető! Kattints ide a részletekért.",
"UPDATE_AVAILABLE_TITLE" : "Új verzió elérhető",
"UPDATE_MESSAGE" : "Hé, új {APP_NAME} verzió elérhető. Íme néhány kulcsfontosságú frissítés:",
@ -383,6 +383,6 @@ define({
// extensions/default/QuickView
"CMD_ENABLE_QUICK_VIEW" : "Gyors Nézet rámutatáskor",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "Olvasd tovább"
});

View File

@ -434,7 +434,7 @@ define({
"ABOUT_TEXT_LINE4" : "Dokumentasi dan kode sumber di <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5" : "Dibuat dengan \u2764 dan JavaScript oleh:",
"ABOUT_TEXT_LINE6" : "Banyak sekali orang (tetapi kami tidak dapat menampilkan daftarnya saat ini).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "Dokumentasi dan logo grafis Web Platform berlisensi Creative Commons Attribution, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS" : "Dokumentasi dan logo grafis MDN berlisensi Creative Commons Attribution, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "Versi terbaru dari {APP_NAME} telah tersedia! Klik disini untuk lebih detail.",
"UPDATE_AVAILABLE_TITLE" : "Pembaruan Tersedia",
"UPDATE_MESSAGE" : "Hai, versi terbaru {APP_NAME} sudah ada. Ini fitur terbarunya:",
@ -618,7 +618,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS" : "Proyek Terkini",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "Baca selengkapnya"
});
/* Last translated for eef9c68a1fdff372b9ea6352cacb5e2506e55be9 */

View File

@ -24,5 +24,5 @@
define({
// Relative to the samples folder
"GETTING_STARTED" : "id/Memulai",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/deed.id"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.id"
});

View File

@ -448,7 +448,7 @@ define({
"ABOUT_TEXT_LINE4" : "Documentazione e codice sorgente sono disponibili allindirizzo <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>",
"ABOUT_TEXT_LINE5" : "Fatto con \u2764 e JavaScript da:",
"ABOUT_TEXT_LINE6" : "Molte persone (abbiamo qualche difficoltà a caricare questi dati ora).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS" : "I loghi di 'Web Platform Docs'e 'Web Platform' sono sotto licenza Creative Common Attribution, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS" : "I loghi di 'MDN Docs'e 'MDN' sono sotto licenza Creative Common Attribution, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a>.",
"UPDATE_NOTIFICATION_TOOLTIP" : "È disponibile una nuova versione di {APP_NAME}! Clicca qui per i dettagli.",
"UPDATE_AVAILABLE_TITLE" : "Aggiornamento Disponibile",
"UPDATE_MESSAGE" : "Hey, è disponibile una nuova versione di {APP_NAME}. Nuove caratteristiche:",
@ -659,7 +659,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS" : "Progetti recenti",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK" : "Leggi tutto",
// extensions/default/CodeFolding

View File

@ -25,5 +25,5 @@ define({
// Relative to the samples folder
"GETTING_STARTED" : "it/Primi passi",
"ADOBE_THIRD_PARTY" : "http://www.adobe.com/go/thirdparty_it/",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/deed.it"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.it"
});

View File

@ -35,7 +35,10 @@ define({
"NO_MODIFICATION_ALLOWED_ERR": "対象ディレクトリは変更できません。",
"NO_MODIFICATION_ALLOWED_ERR_FILE": "ファイルを変更する権限がありません。",
"CONTENTS_MODIFIED_ERR": "このファイルは {APP_NAME} 以外で変更されています。",
"UNSUPPORTED_ENCODING_ERR": "{APP_NAME} は現在 UTF-8 でエンコードされたテキストファイルのみをサポートしています。",
"UNSUPPORTED_ENCODING_ERR": "不明なエンコード形式",
"ENCODE_FILE_FAILED_ERR": "{APP_NAME} でファイルの内容をエンコードすることができませんでした。",
"DECODE_FILE_FAILED_ERR": "{APP_NAME} でファイルの内容をデコードすることができませんでした。",
"UNSUPPORTED_UTF16_ENCODING_ERR": "{APP_NAME} は現在 UTF-16 でエンコードされたテキストファイルに対応していません。",
"FILE_EXISTS_ERR": "ファイルまたはディレクトリは既に存在しています。",
"FILE": "ファイル",
"FILE_TITLE": "ファイル",
@ -152,6 +155,7 @@ define({
"FIND_MATCH_INDEX": "{0} / {1}",
"FIND_NO_RESULTS": "該当なし",
"FIND_QUERY_PLACEHOLDER": "検索\u2026",
"FIND_HISTORY_MAX_COUNT": "検索履歴内の検索項目の最大数",
"REPLACE_PLACEHOLDER": "\u2026 に置換",
"BUTTON_REPLACE_ALL": "すべて置換",
"BUTTON_REPLACE_BATCH": "バッチ¥u2026",
@ -290,6 +294,7 @@ define({
"STATUSBAR_CODE_INSPECTION_TOOLTIP": "{0}。クリックしてレポートパネルを切り替えます。",
"STATUSBAR_DEFAULT_LANG": "(指定なし)",
"STATUSBAR_SET_DEFAULT_LANG": ".{0} ファイルのデフォルトとして設定",
"STATUSBAR_ENCODING_TOOLTIP": "エンコードを選択",
// CodeInspection: errors/warnings
"ERRORS_PANEL_TITLE_MULTIPLE": "{0} 個の問題",
@ -414,6 +419,8 @@ define({
"CMD_CSS_QUICK_EDIT_NEW_RULE": "新規ルール",
"CMD_NEXT_DOC": "次の文書",
"CMD_PREV_DOC": "前の文書",
"CMD_NAVIGATE_BACKWARD": "前に戻る",
"CMD_NAVIGATE_FORWARD": "次に進む",
"CMD_NEXT_DOC_LIST_ORDER": "リストの次の文書",
"CMD_PREV_DOC_LIST_ORDER": "リストの前の文書",
"CMD_SHOW_IN_TREE": "ファイルツリー内で表示",
@ -454,7 +461,7 @@ define({
"ABOUT_TEXT_LINE4": "ドキュメントとソースコードは <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a> から入手できます。",
"ABOUT_TEXT_LINE5": "\u2764 および JavaScript を使用して次の人によって作成されました :",
"ABOUT_TEXT_LINE6": "多くの人々 (ただし、人物データの読み込みに問題が発生しています)。",
"ABOUT_TEXT_WEB_PLATFORM_DOCS": "Web Platform Docs and the Web Platform graphical logo are licensed under a Creative Commons Attribution license, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a>.",
"ABOUT_TEXT_MDN_DOCS": "MDN Docs および MDN グラフィックロゴは Creative Commons の帰属ライセンス、<a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a> によってライセンス付与されています。",
"UPDATE_NOTIFICATION_TOOLTIP": "{APP_NAME} の新しいビルドを利用できます。詳細はここをクリックしてください。",
"UPDATE_AVAILABLE_TITLE": "利用可能なアップデートがあります",
"UPDATE_MESSAGE": "{APP_NAME} の新しいビルドが利用できます。新機能の一部を以下にご紹介します :",
@ -579,6 +586,7 @@ define({
"NO_EXTENSION_MATCHES": "検索条件に一致する拡張機能がありません。",
"REGISTRY_SANITY_CHECK_WARNING": "注意 : これらの拡張機能の作成元が {APP_NAME} 以外である可能性があります。拡張機能はレビューされず、ローカルアクセス権が一杯です。不明なソースから拡張機能をインストールするときは十分に注意してください。",
"EXTENSIONS_INSTALLED_TITLE": "インストール済み",
"EXTENSIONS_DEFAULT_TITLE": "初期設定",
"EXTENSIONS_AVAILABLE_TITLE": "入手可能",
"EXTENSIONS_THEMES_TITLE": "テーマ",
"EXTENSIONS_UPDATES_TITLE": "アップデート",
@ -671,7 +679,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS": "最近使用したプロジェクト",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK": "詳細",
// extensions/default/CodeFolding
@ -702,6 +710,7 @@ define({
"DESCRIPTION_CODE_FOLDING_MIN_FOLD_SIZE": "次の行数に達したら折りたたみ可能なセクションのアイコンを表示する",
"DESCRIPTION_CODE_FOLDING_SAVE_FOLD_STATES": "ファイルまたはプロジェクトを閉じて再度開く場合に折りたたまれたセクションを記憶するには true",
"DESCRIPTION_CODE_FOLDING_MAKE_SELECTIONS_FOLDABLE": "エディター内の選択したテキストでコード折りたたみを有効にするには true",
"DESCRIPTION_DISABLED_DEFAULT_EXTENSIONS": "無効化された初期設定のエクステンション",
"DESCRIPTION_ATTR_HINTS": "HTML 属性ヒントを有効化/無効化",
"DESCRIPTION_CSS_PROP_HINTS": "CSS/LESS/SCSS プロパティヒントを有効化/無効化",
"DESCRIPTION_JS_HINTS": "JavaScript のコードヒントを有効化/無効化",
@ -752,6 +761,7 @@ define({
"DESCRIPTION_LANGUAGE_FILE_EXTENSIONS": "ファイル拡張子から言語名への追加のマッピング",
"DESCRIPTION_LANGUAGE_FILE_NAMES": "ファイル名から言語名への追加のマッピング",
"DESCRIPTION_LINEWISE_COPY_CUT": "何も選択せずにコピーやカットを行うと、カーソルのあるすべての行がコピーまたはカットされます。",
"DESCRIPTION_INPUT_STYLE": "CodeMirror による入力とフォーカスの処理方法を選択します。Textarea (初期設定) や counterditable (スクリーンリーダー向け)(不安定) などを選択できます",
"DESCRIPTION_LINTING_ENABLED": "コード検証を有効にするには true",
"DESCRIPTION_ASYNC_TIMEOUT": "非同期の構文チェックがタイムアウトするまでの時間 (ミリ秒)",
"DESCRIPTION_LINTING_PREFER": "最初に実行する構文チェックの配列",
@ -796,5 +806,6 @@ define({
"DESCRIPTION_PURE_CODING_SURFACE": "{APP_NAME} でコードのみモードを有効にし、その他すべての UI エレメントを非表示にするには true",
"DESCRIPTION_INDENT_LINE_COMMENT": "行コメントのインデントを有効にするには true",
"DESCRIPTION_RECENT_FILES_NAV": "最近使用したファイルのナビゲーションを有効化/無効化",
"DESCRIPTION_LIVEDEV_WEBSOCKET_PORT": "WebSocket サーバーがライブプレビューで実行するポート"
"DESCRIPTION_LIVEDEV_WEBSOCKET_PORT": "ライブプレビューで WebSocket サーバーが実行されるポート",
"DESCRIPTION_LIVE_DEV_HIGHLIGHT_SETTINGS": "ライブプレビューハイライト設定"
});

View File

@ -25,5 +25,5 @@ define({
// Relative to the samples folder
"GETTING_STARTED" : "ja/Getting Started",
"ADOBE_THIRD_PARTY" : "http://www.adobe.com/go/thirdparty_jp/",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.ja"
});

View File

@ -448,7 +448,7 @@ define({
"ABOUT_TEXT_LINE4": "문서와 소스 코드는 <a href='https://github.com/adobe/brackets/'>https://github.com/adobe/brackets/</a>에서 구할 수 있습니다.",
"ABOUT_TEXT_LINE5": "\u2764 및 JavaScript를 사용하여 다음의 사람에 의해 작성되었습니다 :",
"ABOUT_TEXT_LINE6": "많은 사람들 (단, 인물 데이터 로딩에 문제가 발생하고 있습니다).",
"ABOUT_TEXT_WEB_PLATFORM_DOCS": "웹 플랫폼 문서와 웹 플랫폼 로고는 크리에이티브 커먼즈 저작자표시 라이선스, <a href='{WEB_PLATFORM_DOCS_LICENSE}'>CC-BY 3.0 Unported</a> 로 배포됩니다.",
"ABOUT_TEXT_MDN_DOCS": "MDN 문서와 MDN 로고는 크리에이티브 커먼즈 저작자표시 라이선스, <a href='{MDN_DOCS_LICENSE}'>CC-BY-SA 2.5 Unported</a> 로 배포됩니다.",
"UPDATE_NOTIFICATION_TOOLTIP": "{APP_NAME}의 새로운 빌드를 사용할 수 있습니다. 자세한 내용은 여기를 클릭하세요.",
"UPDATE_AVAILABLE_TITLE": "사용 가능한 업데이트가 있습니다",
"UPDATE_MESSAGE": "{APP_NAME}의 새로운 빌드를 사용할 수 있습니다. 새로운 기능의 일부를 다음에 소개합니다 :",
@ -659,7 +659,7 @@ define({
// extensions/default/RecentProjects
"CMD_TOGGLE_RECENT_PROJECTS": "최근에 사용한 프로젝트",
// extensions/default/WebPlatformDocs
// extensions/default/MDNDocs
"DOCS_MORE_LINK": "상세 정보",
// extensions/default/CodeFolding

View File

@ -24,5 +24,5 @@
define({
// Relative to the samples folder
"ADOBE_THIRD_PARTY" : "http://www.adobe.com/go/thirdparty_kr/",
"WEB_PLATFORM_DOCS_LICENSE" : "http://creativecommons.org/licenses/by/3.0/deed.ko"
"MDN_DOCS_LICENSE" : "http://creativecommons.org/licenses/by-sa/2.5/deed.ko"
});

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