|
|
@@ -0,0 +1,213 @@
|
|
|
+/* ***** BEGIN LICENSE BLOCK *****
|
|
|
+ * Distributed under the BSD license:
|
|
|
+ *
|
|
|
+ * Copyright (c) 2010, Ajax.org B.V.
|
|
|
+ * All rights reserved.
|
|
|
+ *
|
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
|
+ * modification, are permitted provided that the following conditions are met:
|
|
|
+ * * Redistributions of source code must retain the above copyright
|
|
|
+ * notice, this list of conditions and the following disclaimer.
|
|
|
+ * * Redistributions in binary form must reproduce the above copyright
|
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
|
+ * * Neither the name of Ajax.org B.V. nor the
|
|
|
+ * names of its contributors may be used to endorse or promote products
|
|
|
+ * derived from this software without specific prior written permission.
|
|
|
+ *
|
|
|
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
|
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
|
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
|
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
|
|
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
|
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
|
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
|
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
|
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
+ *
|
|
|
+ * ***** END LICENSE BLOCK ***** */
|
|
|
+
|
|
|
+define(function(require, exports, module) {
|
|
|
+"use strict";
|
|
|
+
|
|
|
+var propertyMap = {
|
|
|
+ "background": {"#$0": 1},
|
|
|
+ "background-color": {"#$0": 1, "transparent": 1, "fixed": 1},
|
|
|
+ "background-image": {"url('/$0')": 1},
|
|
|
+ "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1},
|
|
|
+ "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2},
|
|
|
+ "background-attachment": {"scroll": 1, "fixed": 1},
|
|
|
+ "background-size": {"cover": 1, "contain": 1},
|
|
|
+ "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1},
|
|
|
+ "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1},
|
|
|
+ "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1},
|
|
|
+ "border-color": {"#$0": 1},
|
|
|
+ "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2},
|
|
|
+ "border-collapse": {"collapse": 1, "separate": 1},
|
|
|
+ "bottom": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "clear": {"left": 1, "right": 1, "both": 1, "none": 1},
|
|
|
+ "color": {"#$0": 1, "rgb(#$00,0,0)": 1},
|
|
|
+ "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1},
|
|
|
+ "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1},
|
|
|
+ "empty-cells": {"show": 1, "hide": 1},
|
|
|
+ "float": {"left": 1, "right": 1, "none": 1},
|
|
|
+ "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1},
|
|
|
+ "font-size": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "font-weight": {"bold": 1, "normal": 1},
|
|
|
+ "font-style": {"italic": 1, "normal": 1},
|
|
|
+ "font-variant": {"normal": 1, "small-caps": 1},
|
|
|
+ "height": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "left": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "letter-spacing": {"normal": 1},
|
|
|
+ "line-height": {"normal": 1},
|
|
|
+ "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1},
|
|
|
+ "margin": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "margin-right": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "margin-left": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "margin-top": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "margin-bottom": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "max-height": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "max-width": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "min-height": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "min-width": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1},
|
|
|
+ "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1},
|
|
|
+ "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1},
|
|
|
+ "padding": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "padding-top": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "padding-right": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "padding-bottom": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "padding-left": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1},
|
|
|
+ "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1},
|
|
|
+ "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1},
|
|
|
+ "right": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "table-layout": {"fixed": 1, "auto": 1},
|
|
|
+ "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1},
|
|
|
+ "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1},
|
|
|
+ "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1},
|
|
|
+ "top": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "vertical-align": {"top": 1, "bottom": 1},
|
|
|
+ "visibility": {"hidden": 1, "visible": 1},
|
|
|
+ "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1},
|
|
|
+ "width": {"px": 1, "em": 1, "%": 1},
|
|
|
+ "word-spacing": {"normal": 1},
|
|
|
+
|
|
|
+ // opacity
|
|
|
+ "filter": {"alpha(opacity=$0100)": 1},
|
|
|
+
|
|
|
+ "text-shadow": {"$02px 2px 2px #777": 1},
|
|
|
+ "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1},
|
|
|
+
|
|
|
+ // border radius
|
|
|
+ "-moz-border-radius": 1,
|
|
|
+ "-moz-border-radius-topright": 1,
|
|
|
+ "-moz-border-radius-bottomright": 1,
|
|
|
+ "-moz-border-radius-topleft": 1,
|
|
|
+ "-moz-border-radius-bottomleft": 1,
|
|
|
+ "-webkit-border-radius": 1,
|
|
|
+ "-webkit-border-top-right-radius": 1,
|
|
|
+ "-webkit-border-top-left-radius": 1,
|
|
|
+ "-webkit-border-bottom-right-radius": 1,
|
|
|
+ "-webkit-border-bottom-left-radius": 1,
|
|
|
+
|
|
|
+ // dropshadows
|
|
|
+ "-moz-box-shadow": 1,
|
|
|
+ "-webkit-box-shadow": 1,
|
|
|
+
|
|
|
+ // transformations
|
|
|
+ "transform": {"rotate($00deg)": 1, "skew($00deg)": 1},
|
|
|
+ "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1},
|
|
|
+ "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 }
|
|
|
+};
|
|
|
+
|
|
|
+var CssCompletions = function() {
|
|
|
+
|
|
|
+};
|
|
|
+
|
|
|
+(function() {
|
|
|
+
|
|
|
+ this.completionsDefined = false;
|
|
|
+
|
|
|
+ this.defineCompletions = function() {
|
|
|
+ //fill in missing properties
|
|
|
+ if (document) {
|
|
|
+ var style = document.createElement('c').style;
|
|
|
+
|
|
|
+ for (var i in style) {
|
|
|
+ if (typeof style[i] !== 'string')
|
|
|
+ continue;
|
|
|
+
|
|
|
+ var name = i.replace(/[A-Z]/g, function(x) {
|
|
|
+ return '-' + x.toLowerCase();
|
|
|
+ });
|
|
|
+
|
|
|
+ if (!propertyMap.hasOwnProperty(name))
|
|
|
+ propertyMap[name] = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.completionsDefined = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.getCompletions = function(state, session, pos, prefix) {
|
|
|
+ if (!this.completionsDefined) {
|
|
|
+ this.defineCompletions();
|
|
|
+ }
|
|
|
+
|
|
|
+ var token = session.getTokenAt(pos.row, pos.column);
|
|
|
+
|
|
|
+ if (!token)
|
|
|
+ return [];
|
|
|
+ if (state==='ruleset'){
|
|
|
+ //css attribute value
|
|
|
+ var line = session.getLine(pos.row).substr(0, pos.column);
|
|
|
+ if (/:[^;]+$/.test(line)) {
|
|
|
+ /([\w\-]+):[^:]*$/.test(line);
|
|
|
+
|
|
|
+ return this.getPropertyValueCompletions(state, session, pos, prefix);
|
|
|
+ } else {
|
|
|
+ return this.getPropertyCompletions(state, session, pos, prefix);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return [];
|
|
|
+ };
|
|
|
+
|
|
|
+ this.getPropertyCompletions = function(state, session, pos, prefix) {
|
|
|
+ var properties = Object.keys(propertyMap);
|
|
|
+ return properties.map(function(property){
|
|
|
+ return {
|
|
|
+ caption: property,
|
|
|
+ snippet: property + ': $0',
|
|
|
+ meta: "property",
|
|
|
+ score: Number.MAX_VALUE
|
|
|
+ };
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ this.getPropertyValueCompletions = function(state, session, pos, prefix) {
|
|
|
+ var line = session.getLine(pos.row).substr(0, pos.column);
|
|
|
+ var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1];
|
|
|
+
|
|
|
+ if (!property)
|
|
|
+ return [];
|
|
|
+ var values = [];
|
|
|
+ if (property in propertyMap && typeof propertyMap[property] === "object") {
|
|
|
+ values = Object.keys(propertyMap[property]);
|
|
|
+ }
|
|
|
+ return values.map(function(value){
|
|
|
+ return {
|
|
|
+ caption: value,
|
|
|
+ snippet: value,
|
|
|
+ meta: "property value",
|
|
|
+ score: Number.MAX_VALUE
|
|
|
+ };
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+}).call(CssCompletions.prototype);
|
|
|
+
|
|
|
+exports.CssCompletions = CssCompletions;
|
|
|
+});
|