compile less and add js

This commit is contained in:
David Miller 2014-08-12 22:35:56 -04:00
parent 0025e7e961
commit 83381f6969
1061 changed files with 388375 additions and 2137 deletions

View File

@ -7,7 +7,12 @@ module.exports = function(grunt) {
jquery: {
files: {
'dist/js/jquery.min.js': ['bower_components/jquery/dist/jquery.min.js'],
'dist/js/jquery.js': ['bower_components/jquery/dist/jquery.js']
'dist/js/jquery.js': ['bower_components/jquery/dist/jquery.js'],
'dist/js/agency.js': ['js/agency.js'],
'dist/js/cbpAnimatedHeader.js': ['js/cbpAnimatedHeader.js'],
'dist/js/classie.js': ['js/classie.js'],
'dist/js/contact_me.js': ['js/contact_me.js'],
'dist/js/jqBootstrapValidation.js': ['js/jqBootstrapValidation.js']
}
},
bootstrap: {
@ -25,13 +30,33 @@ module.exports = function(grunt) {
dest: 'dist/',
},
},
less: {
development: {
options: {
paths: ["css"]
},
files: {
"dist/css/agency.css": "less/agency.less"
}
},
production: {
options: {
paths: ["css"],
cleancss: true
},
files: {
"dist/css/agency.css": "less/agency.less"
}
}
}
});
// Load the plugin that provides the "copy" task.
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-less');
// Default task(s).
grunt.registerTask('default', ['concat', 'copy']);
grunt.registerTask('default', ['concat', 'copy', 'less']);
};

1
dist/css/agency.css vendored Normal file

File diff suppressed because one or more lines are too long

26
dist/js/agency.js vendored Normal file
View File

@ -0,0 +1,26 @@
/*!
* Start Bootstrap - Agnecy Bootstrap Theme (http://startbootstrap.com)
* Code licensed under the Apache License v2.0.
* For details, see http://www.apache.org/licenses/LICENSE-2.0.
*/
// jQuery for page scrolling feature - requires jQuery Easing plugin
$(function() {
$('a.page-scroll').bind('click', function(event) {
var $anchor = $(this);
$('html, body').stop().animate({
scrollTop: $($anchor.attr('href')).offset().top
}, 1500, 'easeInOutExpo');
event.preventDefault();
});
});
// Highlight the top nav as scrolling occurs
$('body').scrollspy({
target: '.navbar-fixed-top'
})
// Closes the Responsive Menu on Menu Item Click
$('.navbar-collapse ul li a').click(function() {
$('.navbar-toggle:visible').click();
});

44
dist/js/cbpAnimatedHeader.js vendored Normal file
View File

@ -0,0 +1,44 @@
/**
* cbpAnimatedHeader.js v1.0.0
* http://www.codrops.com
*
* Licensed under the MIT license.
* http://www.opensource.org/licenses/mit-license.php
*
* Copyright 2013, Codrops
* http://www.codrops.com
*/
var cbpAnimatedHeader = (function() {
var docElem = document.documentElement,
header = document.querySelector( '.navbar-default' ),
didScroll = false,
changeHeaderOn = 300;
function init() {
window.addEventListener( 'scroll', function( event ) {
if( !didScroll ) {
didScroll = true;
setTimeout( scrollPage, 250 );
}
}, false );
}
function scrollPage() {
var sy = scrollY();
if ( sy >= changeHeaderOn ) {
classie.add( header, 'navbar-shrink' );
}
else {
classie.remove( header, 'navbar-shrink' );
}
didScroll = false;
}
function scrollY() {
return window.pageYOffset || docElem.scrollTop;
}
init();
})();

80
dist/js/classie.js vendored Normal file
View File

@ -0,0 +1,80 @@
/*!
* classie - class helper functions
* from bonzo https://github.com/ded/bonzo
*
* classie.has( elem, 'my-class' ) -> true/false
* classie.add( elem, 'my-new-class' )
* classie.remove( elem, 'my-unwanted-class' )
* classie.toggle( elem, 'my-class' )
*/
/*jshint browser: true, strict: true, undef: true */
/*global define: false */
( function( window ) {
'use strict';
// class helper functions from bonzo https://github.com/ded/bonzo
function classReg( className ) {
return new RegExp("(^|\\s+)" + className + "(\\s+|$)");
}
// classList support for class management
// altho to be fair, the api sucks because it won't accept multiple classes at once
var hasClass, addClass, removeClass;
if ( 'classList' in document.documentElement ) {
hasClass = function( elem, c ) {
return elem.classList.contains( c );
};
addClass = function( elem, c ) {
elem.classList.add( c );
};
removeClass = function( elem, c ) {
elem.classList.remove( c );
};
}
else {
hasClass = function( elem, c ) {
return classReg( c ).test( elem.className );
};
addClass = function( elem, c ) {
if ( !hasClass( elem, c ) ) {
elem.className = elem.className + ' ' + c;
}
};
removeClass = function( elem, c ) {
elem.className = elem.className.replace( classReg( c ), ' ' );
};
}
function toggleClass( elem, c ) {
var fn = hasClass( elem, c ) ? removeClass : addClass;
fn( elem, c );
}
var classie = {
// full names
hasClass: hasClass,
addClass: addClass,
removeClass: removeClass,
toggleClass: toggleClass,
// short names
has: hasClass,
add: addClass,
remove: removeClass,
toggle: toggleClass
};
// transport
if ( typeof define === 'function' && define.amd ) {
// AMD
define( classie );
} else {
// browser global
window.classie = classie;
}
})( window );

70
dist/js/contact_me.js vendored Normal file
View File

@ -0,0 +1,70 @@
$(function() {
$("input,textarea").jqBootstrapValidation({
preventSubmit: true,
submitError: function($form, event, errors) {
// additional error messages or events
},
submitSuccess: function($form, event) {
event.preventDefault(); // prevent default submit behaviour
// get values from FORM
var name = $("input#name").val();
var email = $("input#email").val();
var phone = $("input#phone").val();
var message = $("textarea#message").val();
var firstName = name; // For Success/Failure Message
// Check for white space in name for Success/Fail message
if (firstName.indexOf(' ') >= 0) {
firstName = name.split(' ').slice(0, -1).join(' ');
}
$.ajax({
url: "././mail/contact_me.php",
type: "POST",
data: {
name: name,
phone: phone,
email: email,
message: message
},
cache: false,
success: function() {
// Success message
$('#success').html("<div class='alert alert-success'>");
$('#success > .alert-success').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;")
.append("</button>");
$('#success > .alert-success')
.append("<strong>Your message has been sent. </strong>");
$('#success > .alert-success')
.append('</div>');
//clear all fields
$('#contactForm').trigger("reset");
},
error: function() {
// Fail message
$('#success').html("<div class='alert alert-danger'>");
$('#success > .alert-danger').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;")
.append("</button>");
$('#success > .alert-danger').append("<strong>Sorry " + firstName + ", it seems that my mail server is not responding. Please try again later!");
$('#success > .alert-danger').append('</div>');
//clear all fields
$('#contactForm').trigger("reset");
},
})
},
filter: function() {
return $(this).is(":visible");
},
});
$("a[data-toggle=\"tab\"]").click(function(e) {
e.preventDefault();
$(this).tab("show");
});
});
/*When clicking on Full hide fail/success boxes */
$('#name').focus(function() {
$('#success').html('');
});

912
dist/js/jqBootstrapValidation.js vendored Normal file
View File

@ -0,0 +1,912 @@
/* jqBootstrapValidation
* A plugin for automating validation on Twitter Bootstrap formatted forms.
*
* v1.3.6
*
* License: MIT <http://opensource.org/licenses/mit-license.php> - see LICENSE file
*
* http://ReactiveRaven.github.com/jqBootstrapValidation/
*/
(function( $ ){
var createdElements = [];
var defaults = {
options: {
prependExistingHelpBlock: false,
sniffHtml: true, // sniff for 'required', 'maxlength', etc
preventSubmit: true, // stop the form submit event from firing if validation fails
submitError: false, // function called if there is an error when trying to submit
submitSuccess: false, // function called just before a successful submit event is sent to the server
semanticallyStrict: false, // set to true to tidy up generated HTML output
autoAdd: {
helpBlocks: true
},
filter: function () {
// return $(this).is(":visible"); // only validate elements you can see
return true; // validate everything
}
},
methods: {
init : function( options ) {
var settings = $.extend(true, {}, defaults);
settings.options = $.extend(true, settings.options, options);
var $siblingElements = this;
var uniqueForms = $.unique(
$siblingElements.map( function () {
return $(this).parents("form")[0];
}).toArray()
);
$(uniqueForms).bind("submit", function (e) {
var $form = $(this);
var warningsFound = 0;
var $inputs = $form.find("input,textarea,select").not("[type=submit],[type=image]").filter(settings.options.filter);
$inputs.trigger("submit.validation").trigger("validationLostFocus.validation");
$inputs.each(function (i, el) {
var $this = $(el),
$controlGroup = $this.parents(".form-group").first();
if (
$controlGroup.hasClass("warning")
) {
$controlGroup.removeClass("warning").addClass("error");
warningsFound++;
}
});
$inputs.trigger("validationLostFocus.validation");
if (warningsFound) {
if (settings.options.preventSubmit) {
e.preventDefault();
}
$form.addClass("error");
if ($.isFunction(settings.options.submitError)) {
settings.options.submitError($form, e, $inputs.jqBootstrapValidation("collectErrors", true));
}
} else {
$form.removeClass("error");
if ($.isFunction(settings.options.submitSuccess)) {
settings.options.submitSuccess($form, e);
}
}
});
return this.each(function(){
// Get references to everything we're interested in
var $this = $(this),
$controlGroup = $this.parents(".form-group").first(),
$helpBlock = $controlGroup.find(".help-block").first(),
$form = $this.parents("form").first(),
validatorNames = [];
// create message container if not exists
if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) {
$helpBlock = $('<div class="help-block" />');
$controlGroup.find('.controls').append($helpBlock);
createdElements.push($helpBlock[0]);
}
// =============================================================
// SNIFF HTML FOR VALIDATORS
// =============================================================
// *snort sniff snuffle*
if (settings.options.sniffHtml) {
var message = "";
// ---------------------------------------------------------
// PATTERN
// ---------------------------------------------------------
if ($this.attr("pattern") !== undefined) {
message = "Not in the expected format<!-- data-validation-pattern-message to override -->";
if ($this.data("validationPatternMessage")) {
message = $this.data("validationPatternMessage");
}
$this.data("validationPatternMessage", message);
$this.data("validationPatternRegex", $this.attr("pattern"));
}
// ---------------------------------------------------------
// MAX
// ---------------------------------------------------------
if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) {
var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax"));
message = "Too high: Maximum of '" + max + "'<!-- data-validation-max-message to override -->";
if ($this.data("validationMaxMessage")) {
message = $this.data("validationMaxMessage");
}
$this.data("validationMaxMessage", message);
$this.data("validationMaxMax", max);
}
// ---------------------------------------------------------
// MIN
// ---------------------------------------------------------
if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) {
var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin"));
message = "Too low: Minimum of '" + min + "'<!-- data-validation-min-message to override -->";
if ($this.data("validationMinMessage")) {
message = $this.data("validationMinMessage");
}
$this.data("validationMinMessage", message);
$this.data("validationMinMin", min);
}
// ---------------------------------------------------------
// MAXLENGTH
// ---------------------------------------------------------
if ($this.attr("maxlength") !== undefined) {
message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters<!-- data-validation-maxlength-message to override -->";
if ($this.data("validationMaxlengthMessage")) {
message = $this.data("validationMaxlengthMessage");
}
$this.data("validationMaxlengthMessage", message);
$this.data("validationMaxlengthMaxlength", $this.attr("maxlength"));
}
// ---------------------------------------------------------
// MINLENGTH
// ---------------------------------------------------------
if ($this.attr("minlength") !== undefined) {
message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters<!-- data-validation-minlength-message to override -->";
if ($this.data("validationMinlengthMessage")) {
message = $this.data("validationMinlengthMessage");
}
$this.data("validationMinlengthMessage", message);
$this.data("validationMinlengthMinlength", $this.attr("minlength"));
}
// ---------------------------------------------------------
// REQUIRED
// ---------------------------------------------------------
if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) {
message = settings.builtInValidators.required.message;
if ($this.data("validationRequiredMessage")) {
message = $this.data("validationRequiredMessage");
}
$this.data("validationRequiredMessage", message);
}
// ---------------------------------------------------------
// NUMBER
// ---------------------------------------------------------
if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "number") {
message = settings.builtInValidators.number.message;
if ($this.data("validationNumberMessage")) {
message = $this.data("validationNumberMessage");
}
$this.data("validationNumberMessage", message);
}
// ---------------------------------------------------------
// EMAIL
// ---------------------------------------------------------
if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "email") {
message = "Not a valid email address<!-- data-validator-validemail-message to override -->";
if ($this.data("validationValidemailMessage")) {
message = $this.data("validationValidemailMessage");
} else if ($this.data("validationEmailMessage")) {
message = $this.data("validationEmailMessage");
}
$this.data("validationValidemailMessage", message);
}
// ---------------------------------------------------------
// MINCHECKED
// ---------------------------------------------------------
if ($this.attr("minchecked") !== undefined) {
message = "Not enough options checked; Minimum of '" + $this.attr("minchecked") + "' required<!-- data-validation-minchecked-message to override -->";
if ($this.data("validationMincheckedMessage")) {
message = $this.data("validationMincheckedMessage");
}
$this.data("validationMincheckedMessage", message);
$this.data("validationMincheckedMinchecked", $this.attr("minchecked"));
}
// ---------------------------------------------------------
// MAXCHECKED
// ---------------------------------------------------------
if ($this.attr("maxchecked") !== undefined) {
message = "Too many options checked; Maximum of '" + $this.attr("maxchecked") + "' required<!-- data-validation-maxchecked-message to override -->";
if ($this.data("validationMaxcheckedMessage")) {
message = $this.data("validationMaxcheckedMessage");
}
$this.data("validationMaxcheckedMessage", message);
$this.data("validationMaxcheckedMaxchecked", $this.attr("maxchecked"));
}
}
// =============================================================
// COLLECT VALIDATOR NAMES
// =============================================================
// Get named validators
if ($this.data("validation") !== undefined) {
validatorNames = $this.data("validation").split(",");
}
// Get extra ones defined on the element's data attributes
$.each($this.data(), function (i, el) {
var parts = i.replace(/([A-Z])/g, ",$1").split(",");
if (parts[0] === "validation" && parts[1]) {
validatorNames.push(parts[1]);
}
});
// =============================================================
// NORMALISE VALIDATOR NAMES
// =============================================================
var validatorNamesToInspect = validatorNames;
var newValidatorNamesToInspect = [];
do // repeatedly expand 'shortcut' validators into their real validators
{
// Uppercase only the first letter of each name
$.each(validatorNames, function (i, el) {
validatorNames[i] = formatValidatorName(el);
});
// Remove duplicate validator names
validatorNames = $.unique(validatorNames);
// Pull out the new validator names from each shortcut
newValidatorNamesToInspect = [];
$.each(validatorNamesToInspect, function(i, el) {
if ($this.data("validation" + el + "Shortcut") !== undefined) {
// Are these custom validators?
// Pull them out!
$.each($this.data("validation" + el + "Shortcut").split(","), function(i2, el2) {
newValidatorNamesToInspect.push(el2);
});
} else if (settings.builtInValidators[el.toLowerCase()]) {
// Is this a recognised built-in?
// Pull it out!
var validator = settings.builtInValidators[el.toLowerCase()];
if (validator.type.toLowerCase() === "shortcut") {
$.each(validator.shortcut.split(","), function (i, el) {
el = formatValidatorName(el);
newValidatorNamesToInspect.push(el);
validatorNames.push(el);
});
}
}
});
validatorNamesToInspect = newValidatorNamesToInspect;
} while (validatorNamesToInspect.length > 0)
// =============================================================
// SET UP VALIDATOR ARRAYS
// =============================================================
var validators = {};
$.each(validatorNames, function (i, el) {
// Set up the 'override' message
var message = $this.data("validation" + el + "Message");
var hasOverrideMessage = (message !== undefined);
var foundValidator = false;
message =
(
message
? message
: "'" + el + "' validation failed <!-- Add attribute 'data-validation-" + el.toLowerCase() + "-message' to input to change this message -->"
)
;
$.each(
settings.validatorTypes,
function (validatorType, validatorTemplate) {
if (validators[validatorType] === undefined) {
validators[validatorType] = [];
}
if (!foundValidator && $this.data("validation" + el + formatValidatorName(validatorTemplate.name)) !== undefined) {
validators[validatorType].push(
$.extend(
true,
{
name: formatValidatorName(validatorTemplate.name),
message: message
},
validatorTemplate.init($this, el)
)
);
foundValidator = true;
}
}
);
if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) {
var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]);
if (hasOverrideMessage) {
validator.message = message;
}
var validatorType = validator.type.toLowerCase();
if (validatorType === "shortcut") {
foundValidator = true;
} else {
$.each(
settings.validatorTypes,
function (validatorTemplateType, validatorTemplate) {
if (validators[validatorTemplateType] === undefined) {
validators[validatorTemplateType] = [];
}
if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) {
$this.data("validation" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]);
validators[validatorType].push(
$.extend(
validator,
validatorTemplate.init($this, el)
)
);
foundValidator = true;
}
}
);
}
}
if (! foundValidator) {
$.error("Cannot find validation info for '" + el + "'");
}
});
// =============================================================
// STORE FALLBACK VALUES
// =============================================================
$helpBlock.data(
"original-contents",
(
$helpBlock.data("original-contents")
? $helpBlock.data("original-contents")
: $helpBlock.html()
)
);
$helpBlock.data(
"original-role",
(
$helpBlock.data("original-role")
? $helpBlock.data("original-role")
: $helpBlock.attr("role")
)
);
$controlGroup.data(
"original-classes",
(
$controlGroup.data("original-clases")
? $controlGroup.data("original-classes")
: $controlGroup.attr("class")
)
);
$this.data(
"original-aria-invalid",
(
$this.data("original-aria-invalid")
? $this.data("original-aria-invalid")
: $this.attr("aria-invalid")
)
);
// =============================================================
// VALIDATION
// =============================================================
$this.bind(
"validation.validation",
function (event, params) {
var value = getValue($this);
// Get a list of the errors to apply
var errorsFound = [];
$.each(validators, function (validatorType, validatorTypeArray) {
if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) {
$.each(validatorTypeArray, function (i, validator) {
if (settings.validatorTypes[validatorType].validate($this, value, validator)) {
errorsFound.push(validator.message);
}
});
}
});
return errorsFound;
}
);
$this.bind(
"getValidators.validation",
function () {
return validators;
}
);
// =============================================================
// WATCH FOR CHANGES
// =============================================================
$this.bind(
"submit.validation",
function () {
return $this.triggerHandler("change.validation", {submitting: true});
}
);
$this.bind(
[
"keyup",
"focus",
"blur",
"click",
"keydown",
"keypress",
"change"
].join(".validation ") + ".validation",
function (e, params) {
var value = getValue($this);
var errorsFound = [];
$controlGroup.find("input,textarea,select").each(function (i, el) {
var oldCount = errorsFound.length;
$.each($(el).triggerHandler("validation.validation", params), function (j, message) {
errorsFound.push(message);
});
if (errorsFound.length > oldCount) {
$(el).attr("aria-invalid", "true");
} else {
var original = $this.data("original-aria-invalid");
$(el).attr("aria-invalid", (original !== undefined ? original : false));
}
});
$form.find("input,select,textarea").not($this).not("[name=\"" + $this.attr("name") + "\"]").trigger("validationLostFocus.validation");
errorsFound = $.unique(errorsFound.sort());
// Were there any errors?
if (errorsFound.length) {
// Better flag it up as a warning.
$controlGroup.removeClass("success error").addClass("warning");
// How many errors did we find?
if (settings.options.semanticallyStrict && errorsFound.length === 1) {
// Only one? Being strict? Just output it.
$helpBlock.html(errorsFound[0] +
( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" ));
} else {
// Multiple? Being sloppy? Glue them together into an UL.
$helpBlock.html("<ul role=\"alert\"><li>" + errorsFound.join("</li><li>") + "</li></ul>" +
( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" ));
}
} else {
$controlGroup.removeClass("warning error success");
if (value.length > 0) {
$controlGroup.addClass("success");
}
$helpBlock.html($helpBlock.data("original-contents"));
}
if (e.type === "blur") {
$controlGroup.removeClass("success");
}
}
);
$this.bind("validationLostFocus.validation", function () {
$controlGroup.removeClass("success");
});
});
},
destroy : function( ) {
return this.each(
function() {
var
$this = $(this),
$controlGroup = $this.parents(".form-group").first(),
$helpBlock = $controlGroup.find(".help-block").first();
// remove our events
$this.unbind('.validation'); // events are namespaced.
// reset help text
$helpBlock.html($helpBlock.data("original-contents"));
// reset classes
$controlGroup.attr("class", $controlGroup.data("original-classes"));
// reset aria
$this.attr("aria-invalid", $this.data("original-aria-invalid"));
// reset role
$helpBlock.attr("role", $this.data("original-role"));
// remove all elements we created
if (createdElements.indexOf($helpBlock[0]) > -1) {
$helpBlock.remove();
}
}
);
},
collectErrors : function(includeEmpty) {
var errorMessages = {};
this.each(function (i, el) {
var $el = $(el);
var name = $el.attr("name");
var errors = $el.triggerHandler("validation.validation", {includeEmpty: true});
errorMessages[name] = $.extend(true, errors, errorMessages[name]);
});
$.each(errorMessages, function (i, el) {
if (el.length === 0) {
delete errorMessages[i];
}
});
return errorMessages;
},
hasErrors: function() {
var errorMessages = [];
this.each(function (i, el) {
errorMessages = errorMessages.concat(
$(el).triggerHandler("getValidators.validation") ? $(el).triggerHandler("validation.validation", {submitting: true}) : []
);
});
return (errorMessages.length > 0);
},
override : function (newDefaults) {
defaults = $.extend(true, defaults, newDefaults);
}
},
validatorTypes: {
callback: {
name: "callback",
init: function ($this, name) {
return {
validatorName: name,
callback: $this.data("validation" + name + "Callback"),
lastValue: $this.val(),
lastValid: true,
lastFinished: true
};
},
validate: function ($this, value, validator) {
if (validator.lastValue === value && validator.lastFinished) {
return !validator.lastValid;
}
if (validator.lastFinished === true)
{
validator.lastValue = value;
validator.lastValid = true;
validator.lastFinished = false;
var rrjqbvValidator = validator;
var rrjqbvThis = $this;
executeFunctionByName(
validator.callback,
window,
$this,
value,
function (data) {
if (rrjqbvValidator.lastValue === data.value) {
rrjqbvValidator.lastValid = data.valid;
if (data.message) {
rrjqbvValidator.message = data.message;
}
rrjqbvValidator.lastFinished = true;
rrjqbvThis.data("validation" + rrjqbvValidator.validatorName + "Message", rrjqbvValidator.message);
// Timeout is set to avoid problems with the events being considered 'already fired'
setTimeout(function () {
rrjqbvThis.trigger("change.validation");
}, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
}
}
);
}
return false;
}
},
ajax: {
name: "ajax",
init: function ($this, name) {
return {
validatorName: name,
url: $this.data("validation" + name + "Ajax"),
lastValue: $this.val(),
lastValid: true,
lastFinished: true
};
},
validate: function ($this, value, validator) {
if (""+validator.lastValue === ""+value && validator.lastFinished === true) {
return validator.lastValid === false;
}
if (validator.lastFinished === true)
{
validator.lastValue = value;
validator.lastValid = true;
validator.lastFinished = false;
$.ajax({
url: validator.url,
data: "value=" + value + "&field=" + $this.attr("name"),
dataType: "json",
success: function (data) {
if (""+validator.lastValue === ""+data.value) {
validator.lastValid = !!(data.valid);
if (data.message) {
validator.message = data.message;
}
validator.lastFinished = true;
$this.data("validation" + validator.validatorName + "Message", validator.message);
// Timeout is set to avoid problems with the events being considered 'already fired'
setTimeout(function () {
$this.trigger("change.validation");
}, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
}
},
failure: function () {
validator.lastValid = true;
validator.message = "ajax call failed";
validator.lastFinished = true;
$this.data("validation" + validator.validatorName + "Message", validator.message);
// Timeout is set to avoid problems with the events being considered 'already fired'
setTimeout(function () {
$this.trigger("change.validation");
}, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
}
});
}
return false;
}
},
regex: {
name: "regex",
init: function ($this, name) {
return {regex: regexFromString($this.data("validation" + name + "Regex"))};
},
validate: function ($this, value, validator) {
return (!validator.regex.test(value) && ! validator.negative)
|| (validator.regex.test(value) && validator.negative);
}
},
required: {
name: "required",
init: function ($this, name) {
return {};
},
validate: function ($this, value, validator) {
return !!(value.length === 0 && ! validator.negative)
|| !!(value.length > 0 && validator.negative);
},
blockSubmit: true
},
match: {
name: "match",
init: function ($this, name) {
var element = $this.parents("form").first().find("[name=\"" + $this.data("validation" + name + "Match") + "\"]").first();
element.bind("validation.validation", function () {
$this.trigger("change.validation", {submitting: true});
});
return {"element": element};
},
validate: function ($this, value, validator) {
return (value !== validator.element.val() && ! validator.negative)
|| (value === validator.element.val() && validator.negative);
},
blockSubmit: true
},
max: {
name: "max",
init: function ($this, name) {
return {max: $this.data("validation" + name + "Max")};
},
validate: function ($this, value, validator) {
return (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative)
|| (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative);
}
},
min: {
name: "min",
init: function ($this, name) {
return {min: $this.data("validation" + name + "Min")};
},
validate: function ($this, value, validator) {
return (parseFloat(value) < parseFloat(validator.min) && ! validator.negative)
|| (parseFloat(value) >= parseFloat(validator.min) && validator.negative);
}
},
maxlength: {
name: "maxlength",
init: function ($this, name) {
return {maxlength: $this.data("validation" + name + "Maxlength")};
},
validate: function ($this, value, validator) {
return ((value.length > validator.maxlength) && ! validator.negative)
|| ((value.length <= validator.maxlength) && validator.negative);
}
},
minlength: {
name: "minlength",
init: function ($this, name) {
return {minlength: $this.data("validation" + name + "Minlength")};
},
validate: function ($this, value, validator) {
return ((value.length < validator.minlength) && ! validator.negative)
|| ((value.length >= validator.minlength) && validator.negative);
}
},
maxchecked: {
name: "maxchecked",
init: function ($this, name) {
var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");
elements.bind("click.validation", function () {
$this.trigger("change.validation", {includeEmpty: true});
});
return {maxchecked: $this.data("validation" + name + "Maxchecked"), elements: elements};
},
validate: function ($this, value, validator) {
return (validator.elements.filter(":checked").length > validator.maxchecked && ! validator.negative)
|| (validator.elements.filter(":checked").length <= validator.maxchecked && validator.negative);
},
blockSubmit: true
},
minchecked: {
name: "minchecked",
init: function ($this, name) {
var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");
elements.bind("click.validation", function () {
$this.trigger("change.validation", {includeEmpty: true});
});
return {minchecked: $this.data("validation" + name + "Minchecked"), elements: elements};
},
validate: function ($this, value, validator) {
return (validator.elements.filter(":checked").length < validator.minchecked && ! validator.negative)
|| (validator.elements.filter(":checked").length >= validator.minchecked && validator.negative);
},
blockSubmit: true
}
},
builtInValidators: {
email: {
name: "Email",
type: "shortcut",
shortcut: "validemail"
},
validemail: {
name: "Validemail",
type: "regex",
regex: "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\.[A-Za-z]{2,4}",
message: "Not a valid email address<!-- data-validator-validemail-message to override -->"
},
passwordagain: {
name: "Passwordagain",
type: "match",
match: "password",
message: "Does not match the given password<!-- data-validator-paswordagain-message to override -->"
},
positive: {
name: "Positive",
type: "shortcut",
shortcut: "number,positivenumber"
},
negative: {
name: "Negative",
type: "shortcut",
shortcut: "number,negativenumber"
},
number: {
name: "Number",
type: "regex",
regex: "([+-]?\\\d+(\\\.\\\d*)?([eE][+-]?[0-9]+)?)?",
message: "Must be a number<!-- data-validator-number-message to override -->"
},
integer: {
name: "Integer",
type: "regex",
regex: "[+-]?\\\d+",
message: "No decimal places allowed<!-- data-validator-integer-message to override -->"
},
positivenumber: {
name: "Positivenumber",
type: "min",
min: 0,
message: "Must be a positive number<!-- data-validator-positivenumber-message to override -->"
},
negativenumber: {
name: "Negativenumber",
type: "max",
max: 0,
message: "Must be a negative number<!-- data-validator-negativenumber-message to override -->"
},
required: {
name: "Required",
type: "required",
message: "This is required<!-- data-validator-required-message to override -->"
},
checkone: {
name: "Checkone",
type: "minchecked",
minchecked: 1,
message: "Check at least one option<!-- data-validation-checkone-message to override -->"
}
}
};
var formatValidatorName = function (name) {
return name
.toLowerCase()
.replace(
/(^|\s)([a-z])/g ,
function(m,p1,p2) {
return p1+p2.toUpperCase();
}
)
;
};
var getValue = function ($this) {
// Extract the value we're talking about
var value = $this.val();
var type = $this.attr("type");
if (type === "checkbox") {
value = ($this.is(":checked") ? value : "");
}
if (type === "radio") {
value = ($('input[name="' + $this.attr("name") + '"]:checked').length > 0 ? value : "");
}
return value;
};
function regexFromString(inputstring) {
return new RegExp("^" + inputstring + "$");
}
/**
* Thanks to Jason Bunting via StackOverflow.com
*
* http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910
* Short link: http://tinyurl.com/executeFunctionByName
**/
function executeFunctionByName(functionName, context /*, args*/) {
var args = Array.prototype.slice.call(arguments).splice(2);
var namespaces = functionName.split(".");
var func = namespaces.pop();
for(var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
return context[func].apply(this, args);
}
$.fn.jqBootstrapValidation = function( method ) {
if ( defaults.methods[method] ) {
return defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return defaults.methods.init.apply( this, arguments );
} else {
$.error( 'Method ' + method + ' does not exist on jQuery.jqBootstrapValidation' );
return null;
}
};
$.jqBootstrapValidation = function (options) {
$(":input").not("[type=image],[type=submit]").jqBootstrapValidation.apply(this,arguments);
};
})( jQuery );

2114
js/bootstrap.js vendored

File diff suppressed because it is too large Load Diff

6
js/bootstrap.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -1,11 +0,0 @@
/**
* cbpAnimatedHeader.min.js v1.0.0
* http://www.codrops.com
*
* Licensed under the MIT license.
* http://www.opensource.org/licenses/mit-license.php
*
* Copyright 2013, Codrops
* http://www.codrops.com
*/
var cbpAnimatedHeader=(function(){var b=document.documentElement,g=document.querySelector(".navbar-default"),e=false,a=300;function f(){window.addEventListener("scroll",function(h){if(!e){e=true;setTimeout(d,250)}},false)}function d(){var h=c();if(h>=a){classie.add(g,"cbp-af-header-shrink")}else{classie.remove(g,"cbp-af-header-shrink")}e=false}function c(){return window.pageYOffset||b.scrollTop}f()})();

4
js/jquery-1.11.0.js vendored

File diff suppressed because one or more lines are too long

22
node_modules/grunt-contrib-less/LICENSE-MIT generated vendored Normal file
View File

@ -0,0 +1,22 @@
Copyright (c) 2014 Tyler Kellen, contributors
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.

255
node_modules/grunt-contrib-less/README.md generated vendored Normal file
View File

@ -0,0 +1,255 @@
# grunt-contrib-less v0.11.4 [![Build Status: Linux](https://travis-ci.org/gruntjs/grunt-contrib-less.png?branch=master)](https://travis-ci.org/gruntjs/grunt-contrib-less) <a href="https://ci.appveyor.com/project/gruntjs/grunt-contrib-less"><img src="https://ci.appveyor.com/api/projects/status/e3aa4d07xe4w4u05/branch/master" alt="Build Status: Windows" height="18" /></a>
> Compile LESS files to CSS.
## Getting Started
This plugin requires Grunt `~0.4.0`
If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:
```shell
npm install grunt-contrib-less --save-dev
```
Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
```js
grunt.loadNpmTasks('grunt-contrib-less');
```
*This plugin was designed to work with Grunt 0.4.x. If you're still using grunt v0.3.x it's strongly recommended that [you upgrade](http://gruntjs.com/upgrading-from-0.3-to-0.4), but in case you can't please use [v0.3.2](https://github.com/gruntjs/grunt-contrib-less/tree/grunt-0.3-stable).*
## Less task
_Run this task with the `grunt less` command._
Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.
### Options
#### paths
Type: `String` `Array` `Function`
Default: Directory of input file.
Specifies directories to scan for @import directives when parsing. Default value is the directory of the source, which is probably what you want.
If you specify a function the source filepath will be the first argument. You can return either a string or an array of paths to be used.
#### rootpath
Type: `String`
Default: `""`
A path to add on to the start of every url resource.
#### compress
Type: `Boolean`
Default: `false`
Compress output by removing some whitespaces.
#### cleancss
Type: `Boolean`
Default: `false`
Compress output using [clean-css](https://npmjs.org/package/clean-css).
#### ieCompat
Type: `Boolean`
Default: `true`
Enforce the css output is compatible with Internet Explorer 8.
For example, the [data-uri](https://github.com/cloudhead/less.js/pull/1086) function encodes a file in base64 encoding and embeds it into the generated CSS files as a data-URI. Because Internet Explorer 8 limits `data-uri`s to 32KB, the [ieCompat](https://github.com/cloudhead/less.js/pull/1190) option prevents `less` from exceeding this.
#### optimization
Type: `Integer`
Default: `null`
Set the parser's optimization level. The lower the number, the less nodes it will create in the tree. This could matter for debugging, or if you want to access the individual nodes in the tree.
#### strictImports
Type: `Boolean`
Default: `false`
Force evaluation of imports.
#### strictMath
Type: `Boolean`
Default: `false`
When enabled, math is required to be in parenthesis.
#### strictUnits
Type: `Boolean`
Default: `false`
When enabled, less will validate the units used (e.g. 4px/2px = 2, not 2px and 4em/2px throws an error).
#### syncImport
Type: `Boolean`
Default: `false`
Read @import'ed files synchronously from disk.
#### dumpLineNumbers
Type: `String`
Default: `false`
Configures -sass-debug-info support.
Accepts following values: `comments`, `mediaquery`, `all`.
#### relativeUrls
Type: `Boolean`
Default: `false`
Rewrite urls to be relative. false: do not modify urls.
#### customFunctions
Type: `Object`
Default: none
Define custom functions to be available within your LESS stylesheets. The function's name must be lowercase.
In the definition, the first argument is the less object, and subsequent arguments are from the less function call.
Values passed to the function are types defined within less, the return value may be either one of them or primitive.
See the LESS documentation for more information on the available types.
#### report
Choices: `'min'`, `'gzip'`
Default: `'min'`
Either report only minification result or report minification and gzip results.
This is useful to see exactly how well clean-css is performing but using `'gzip'` will make the task take 5-10x longer to complete. [Example output](https://github.com/sindresorhus/maxmin#readme).
#### sourceMap
Type: `Boolean`
Default: `false`
Enable source maps.
#### sourceMapFilename
Type: `String`
Default: none
Write the source map to a separate file with the given filename.
#### sourceMapURL
Type: `String`
Default: none
Override the default url that points to the sourcemap from the compiled css file.
#### sourceMapBasepath
Type: `String`
Default: none
Sets the base path for the less file paths in the source map.
#### sourceMapRootpath
Type: `String`
Default: none
Adds this path onto the less file paths in the source map.
#### outputSourceFiles
Type: `Boolean`
Default: false
Puts the less files into the map instead of referencing them.
#### modifyVars
Type: `Object`
Default: none
Overrides global variables. Equivalent to ```--modify-vars='VAR=VALUE'``` option in less.
#### banner
Type: `String`
Default: none
### Usage Examples
```js
less: {
development: {
options: {
paths: ["assets/css"]
},
files: {
"path/to/result.css": "path/to/source.less"
}
},
production: {
options: {
paths: ["assets/css"],
cleancss: true,
modifyVars: {
imgPath: '"http://mycdn.com/path/to/images"',
bgColor: 'red'
}
},
files: {
"path/to/result.css": "path/to/source.less"
}
}
}
```
## Release History
* ----------v0.11.4Fix 'banner', 'urlArgs' LESS options Fixes npm 2 peerDependencies issues
* 2014-06-20v0.11.3Update to Less ~1.7.2.
* 2014-06-01v0.11.2Lock to less 1.7.0.
* 2014-05-26v0.11.1Fix `modifyVars` to work when less file ends with a comment.
* 2014-03-19v0.11.0Custom functions can return types defined by less paths option now accepts a function Replaced deprecated grunt.util methods Removes deprecated grunt.lib.contrib
* 2014-03-01v0.10.0sourceMapBasepath accepts a function. Update copyright to 2014. Update .gitattributes. Update less.js to v1.7.0. Prevent CRLF in the repo. Adds modify-vars option. Changed to async stack call. Fixes data-uri test. Normalize line endings on tests.
* 2014-01-07v0.9.0Bump to less 1.6
* 2013-12-06v0.8.3Support sourceMapURL
* 2013-11-14v0.8.2Support outputSourceFiles
* 2013-10-24v0.8.1Support sourceMapFilename, sourceMapBasepath and sourceMapRootpath
* 2013-10-22v0.8.0Upgrade to LESS 1.5 Support strictUnits option Support sourceMap option Add customFunctions option for defining custom functions within LESS Output the source file name on error yuicompress option now cleancss (Less changed underlying dependency)
* 2013-08-08v0.7.0Downgrade no source files warning to only in verbose mode
* 2013-08-08v0.6.5Support strictMath option Support rootpath parse option
* 2013-07-09v0.6.4Support relativeUrls option
* 2013-07-06v0.6.3Add report option for minification and gzip results
* 2013-07-03v0.6.2support syncImport
* 2013-06-12v0.6.1Support ieCompat
* 2013-06-09v0.6.0Bump less to 1.4.0
* 2013-05-23v0.5.2Improve error handling.
* 2013-04-25v0.5.1Gracefully handle configuration without sources.
* 2013-02-15v0.5.0First official release for Grunt 0.4.0.
* 2013-01-23v0.5.0rc7Updating grunt/gruntplugin dependencies to rc7. Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions. Remove experimental wildcard destination support. Switching to this.files api.
* 2012-10-18v0.3.2Add support for dumpLineNumbers.
* 2012-10-12v0.3.1Rename grunt-contrib-lib dep to grunt-lib-contrib.
* 2012-09-24v0.3.0Global options depreciated Revert normalize linefeeds.
* 2012-09-16v0.2.2Support all less options Normalize linefeeds Default path to dirname of src file.
* 2012-09-10v0.2.0Refactored from grunt-contrib into individual repo.
---
Task submitted by [Tyler Kellen](http://goingslowly.com/)
*This file was generated on Tue Jul 29 2014 14:43:30.*

View File

@ -0,0 +1,15 @@
#!/bin/sh
basedir=`dirname "$0"`
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../less/bin/lessc" "$@"
ret=$?
else
node "$basedir/../less/bin/lessc" "$@"
ret=$?
fi
exit $ret

View File

@ -0,0 +1,5 @@
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\less\bin\lessc" %*
) ELSE (
node "%~dp0\..\less\bin\lessc" %*
)

View File

@ -0,0 +1,19 @@
Copyright (c) 2010 Caolan McMahon
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.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
{
"name": "async",
"repo": "caolan/async",
"description": "Higher-order functions and common patterns for asynchronous code",
"version": "0.1.23",
"keywords": [],
"dependencies": {},
"development": {},
"main": "lib/async.js",
"scripts": [ "lib/async.js" ]
}

View File

@ -0,0 +1,958 @@
/*global setImmediate: false, setTimeout: false, console: false */
(function () {
var async = {};
// global on the server, window in the browser
var root, previous_async;
root = this;
if (root != null) {
previous_async = root.async;
}
async.noConflict = function () {
root.async = previous_async;
return async;
};
function only_once(fn) {
var called = false;
return function() {
if (called) throw new Error("Callback was already called.");
called = true;
fn.apply(root, arguments);
}
}
//// cross-browser compatiblity functions ////
var _each = function (arr, iterator) {
if (arr.forEach) {
return arr.forEach(iterator);
}
for (var i = 0; i < arr.length; i += 1) {
iterator(arr[i], i, arr);
}
};
var _map = function (arr, iterator) {
if (arr.map) {
return arr.map(iterator);
}
var results = [];
_each(arr, function (x, i, a) {
results.push(iterator(x, i, a));
});
return results;
};
var _reduce = function (arr, iterator, memo) {
if (arr.reduce) {
return arr.reduce(iterator, memo);
}
_each(arr, function (x, i, a) {
memo = iterator(memo, x, i, a);
});
return memo;
};
var _keys = function (obj) {
if (Object.keys) {
return Object.keys(obj);
}
var keys = [];
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
keys.push(k);
}
}
return keys;
};
//// exported async module functions ////
//// nextTick implementation with browser-compatible fallback ////
if (typeof process === 'undefined' || !(process.nextTick)) {
if (typeof setImmediate === 'function') {
async.nextTick = function (fn) {
// not a direct alias for IE10 compatibility
setImmediate(fn);
};
async.setImmediate = async.nextTick;
}
else {
async.nextTick = function (fn) {
setTimeout(fn, 0);
};
async.setImmediate = async.nextTick;
}
}
else {
async.nextTick = process.nextTick;
if (typeof setImmediate !== 'undefined') {
async.setImmediate = function (fn) {
// not a direct alias for IE10 compatibility
setImmediate(fn);
};
}
else {
async.setImmediate = async.nextTick;
}
}
async.each = function (arr, iterator, callback) {
callback = callback || function () {};
if (!arr.length) {
return callback();
}
var completed = 0;
_each(arr, function (x) {
iterator(x, only_once(function (err) {
if (err) {
callback(err);
callback = function () {};
}
else {
completed += 1;
if (completed >= arr.length) {
callback(null);
}
}
}));
});
};
async.forEach = async.each;
async.eachSeries = function (arr, iterator, callback) {
callback = callback || function () {};
if (!arr.length) {
return callback();
}
var completed = 0;
var iterate = function () {
iterator(arr[completed], function (err) {
if (err) {
callback(err);
callback = function () {};
}
else {
completed += 1;
if (completed >= arr.length) {
callback(null);
}
else {
iterate();
}
}
});
};
iterate();
};
async.forEachSeries = async.eachSeries;
async.eachLimit = function (arr, limit, iterator, callback) {
var fn = _eachLimit(limit);
fn.apply(null, [arr, iterator, callback]);
};
async.forEachLimit = async.eachLimit;
var _eachLimit = function (limit) {
return function (arr, iterator, callback) {
callback = callback || function () {};
if (!arr.length || limit <= 0) {
return callback();
}
var completed = 0;
var started = 0;
var running = 0;
(function replenish () {
if (completed >= arr.length) {
return callback();
}
while (running < limit && started < arr.length) {
started += 1;
running += 1;
iterator(arr[started - 1], function (err) {
if (err) {
callback(err);
callback = function () {};
}
else {
completed += 1;
running -= 1;
if (completed >= arr.length) {
callback();
}
else {
replenish();
}
}
});
}
})();
};
};
var doParallel = function (fn) {
return function () {
var args = Array.prototype.slice.call(arguments);
return fn.apply(null, [async.each].concat(args));
};
};
var doParallelLimit = function(limit, fn) {
return function () {
var args = Array.prototype.slice.call(arguments);
return fn.apply(null, [_eachLimit(limit)].concat(args));
};
};
var doSeries = function (fn) {
return function () {
var args = Array.prototype.slice.call(arguments);
return fn.apply(null, [async.eachSeries].concat(args));
};
};
var _asyncMap = function (eachfn, arr, iterator, callback) {
var results = [];
arr = _map(arr, function (x, i) {
return {index: i, value: x};
});
eachfn(arr, function (x, callback) {
iterator(x.value, function (err, v) {
results[x.index] = v;
callback(err);
});
}, function (err) {
callback(err, results);
});
};
async.map = doParallel(_asyncMap);
async.mapSeries = doSeries(_asyncMap);
async.mapLimit = function (arr, limit, iterator, callback) {
return _mapLimit(limit)(arr, iterator, callback);
};
var _mapLimit = function(limit) {
return doParallelLimit(limit, _asyncMap);
};
// reduce only has a series version, as doing reduce in parallel won't
// work in many situations.
async.reduce = function (arr, memo, iterator, callback) {
async.eachSeries(arr, function (x, callback) {
iterator(memo, x, function (err, v) {
memo = v;
callback(err);
});
}, function (err) {
callback(err, memo);
});
};
// inject alias
async.inject = async.reduce;
// foldl alias
async.foldl = async.reduce;
async.reduceRight = function (arr, memo, iterator, callback) {
var reversed = _map(arr, function (x) {
return x;
}).reverse();
async.reduce(reversed, memo, iterator, callback);
};
// foldr alias
async.foldr = async.reduceRight;
var _filter = function (eachfn, arr, iterator, callback) {
var results = [];
arr = _map(arr, function (x, i) {
return {index: i, value: x};
});
eachfn(arr, function (x, callback) {
iterator(x.value, function (v) {
if (v) {
results.push(x);
}
callback();
});
}, function (err) {
callback(_map(results.sort(function (a, b) {
return a.index - b.index;
}), function (x) {
return x.value;
}));
});
};
async.filter = doParallel(_filter);
async.filterSeries = doSeries(_filter);
// select alias
async.select = async.filter;
async.selectSeries = async.filterSeries;
var _reject = function (eachfn, arr, iterator, callback) {
var results = [];
arr = _map(arr, function (x, i) {
return {index: i, value: x};
});
eachfn(arr, function (x, callback) {
iterator(x.value, function (v) {
if (!v) {
results.push(x);
}
callback();
});
}, function (err) {
callback(_map(results.sort(function (a, b) {
return a.index - b.index;
}), function (x) {
return x.value;
}));
});
};
async.reject = doParallel(_reject);
async.rejectSeries = doSeries(_reject);
var _detect = function (eachfn, arr, iterator, main_callback) {
eachfn(arr, function (x, callback) {
iterator(x, function (result) {
if (result) {
main_callback(x);
main_callback = function () {};
}
else {
callback();
}
});
}, function (err) {
main_callback();
});
};
async.detect = doParallel(_detect);
async.detectSeries = doSeries(_detect);
async.some = function (arr, iterator, main_callback) {
async.each(arr, function (x, callback) {
iterator(x, function (v) {
if (v) {
main_callback(true);
main_callback = function () {};
}
callback();
});
}, function (err) {
main_callback(false);
});
};
// any alias
async.any = async.some;
async.every = function (arr, iterator, main_callback) {
async.each(arr, function (x, callback) {
iterator(x, function (v) {
if (!v) {
main_callback(false);
main_callback = function () {};
}
callback();
});
}, function (err) {
main_callback(true);
});
};
// all alias
async.all = async.every;
async.sortBy = function (arr, iterator, callback) {
async.map(arr, function (x, callback) {
iterator(x, function (err, criteria) {
if (err) {
callback(err);
}
else {
callback(null, {value: x, criteria: criteria});
}
});
}, function (err, results) {
if (err) {
return callback(err);
}
else {
var fn = function (left, right) {
var a = left.criteria, b = right.criteria;
return a < b ? -1 : a > b ? 1 : 0;
};
callback(null, _map(results.sort(fn), function (x) {
return x.value;
}));
}
});
};
async.auto = function (tasks, callback) {
callback = callback || function () {};
var keys = _keys(tasks);
if (!keys.length) {
return callback(null);
}
var results = {};
var listeners = [];
var addListener = function (fn) {
listeners.unshift(fn);
};
var removeListener = function (fn) {
for (var i = 0; i < listeners.length; i += 1) {
if (listeners[i] === fn) {
listeners.splice(i, 1);
return;
}
}
};
var taskComplete = function () {
_each(listeners.slice(0), function (fn) {
fn();
});
};
addListener(function () {
if (_keys(results).length === keys.length) {
callback(null, results);
callback = function () {};
}
});
_each(keys, function (k) {
var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k];
var taskCallback = function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
if (err) {
var safeResults = {};
_each(_keys(results), function(rkey) {
safeResults[rkey] = results[rkey];
});
safeResults[k] = args;
callback(err, safeResults);
// stop subsequent errors hitting callback multiple times
callback = function () {};
}
else {
results[k] = args;
async.setImmediate(taskComplete);
}
};
var requires = task.slice(0, Math.abs(task.length - 1)) || [];
var ready = function () {
return _reduce(requires, function (a, x) {
return (a && results.hasOwnProperty(x));
}, true) && !results.hasOwnProperty(k);
};
if (ready()) {
task[task.length - 1](taskCallback, results);
}
else {
var listener = function () {
if (ready()) {
removeListener(listener);
task[task.length - 1](taskCallback, results);
}
};
addListener(listener);
}
});
};
async.waterfall = function (tasks, callback) {
callback = callback || function () {};
if (tasks.constructor !== Array) {
var err = new Error('First argument to waterfall must be an array of functions');
return callback(err);
}
if (!tasks.length) {
return callback();
}
var wrapIterator = function (iterator) {
return function (err) {
if (err) {
callback.apply(null, arguments);
callback = function () {};
}
else {
var args = Array.prototype.slice.call(arguments, 1);
var next = iterator.next();
if (next) {
args.push(wrapIterator(next));
}
else {
args.push(callback);
}
async.setImmediate(function () {
iterator.apply(null, args);
});
}
};
};
wrapIterator(async.iterator(tasks))();
};
var _parallel = function(eachfn, tasks, callback) {
callback = callback || function () {};
if (tasks.constructor === Array) {
eachfn.map(tasks, function (fn, callback) {
if (fn) {
fn(function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
callback.call(null, err, args);
});
}
}, callback);
}
else {
var results = {};
eachfn.each(_keys(tasks), function (k, callback) {
tasks[k](function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
results[k] = args;
callback(err);
});
}, function (err) {
callback(err, results);
});
}
};
async.parallel = function (tasks, callback) {
_parallel({ map: async.map, each: async.each }, tasks, callback);
};
async.parallelLimit = function(tasks, limit, callback) {
_parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback);
};
async.series = function (tasks, callback) {
callback = callback || function () {};
if (tasks.constructor === Array) {
async.mapSeries(tasks, function (fn, callback) {
if (fn) {
fn(function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
callback.call(null, err, args);
});
}
}, callback);
}
else {
var results = {};
async.eachSeries(_keys(tasks), function (k, callback) {
tasks[k](function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
results[k] = args;
callback(err);
});
}, function (err) {
callback(err, results);
});
}
};
async.iterator = function (tasks) {
var makeCallback = function (index) {
var fn = function () {
if (tasks.length) {
tasks[index].apply(null, arguments);
}
return fn.next();
};
fn.next = function () {
return (index < tasks.length - 1) ? makeCallback(index + 1): null;
};
return fn;
};
return makeCallback(0);
};
async.apply = function (fn) {
var args = Array.prototype.slice.call(arguments, 1);
return function () {
return fn.apply(
null, args.concat(Array.prototype.slice.call(arguments))
);
};
};
var _concat = function (eachfn, arr, fn, callback) {
var r = [];
eachfn(arr, function (x, cb) {
fn(x, function (err, y) {
r = r.concat(y || []);
cb(err);
});
}, function (err) {
callback(err, r);
});
};
async.concat = doParallel(_concat);
async.concatSeries = doSeries(_concat);
async.whilst = function (test, iterator, callback) {
if (test()) {
iterator(function (err) {
if (err) {
return callback(err);
}
async.whilst(test, iterator, callback);
});
}
else {
callback();
}
};
async.doWhilst = function (iterator, test, callback) {
iterator(function (err) {
if (err) {
return callback(err);
}
if (test()) {
async.doWhilst(iterator, test, callback);
}
else {
callback();
}
});
};
async.until = function (test, iterator, callback) {
if (!test()) {
iterator(function (err) {
if (err) {
return callback(err);
}
async.until(test, iterator, callback);
});
}
else {
callback();
}
};
async.doUntil = function (iterator, test, callback) {
iterator(function (err) {
if (err) {
return callback(err);
}
if (!test()) {
async.doUntil(iterator, test, callback);
}
else {
callback();
}
});
};
async.queue = function (worker, concurrency) {
if (concurrency === undefined) {
concurrency = 1;
}
function _insert(q, data, pos, callback) {
if(data.constructor !== Array) {
data = [data];
}
_each(data, function(task) {
var item = {
data: task,
callback: typeof callback === 'function' ? callback : null
};
if (pos) {
q.tasks.unshift(item);
} else {
q.tasks.push(item);
}
if (q.saturated && q.tasks.length === concurrency) {
q.saturated();
}
async.setImmediate(q.process);
});
}
var workers = 0;
var q = {
tasks: [],
concurrency: concurrency,
saturated: null,
empty: null,
drain: null,
push: function (data, callback) {
_insert(q, data, false, callback);
},
unshift: function (data, callback) {
_insert(q, data, true, callback);
},
process: function () {
if (workers < q.concurrency && q.tasks.length) {
var task = q.tasks.shift();
if (q.empty && q.tasks.length === 0) {
q.empty();
}
workers += 1;
var next = function () {
workers -= 1;
if (task.callback) {
task.callback.apply(task, arguments);
}
if (q.drain && q.tasks.length + workers === 0) {
q.drain();
}
q.process();
};
var cb = only_once(next);
worker(task.data, cb);
}
},
length: function () {
return q.tasks.length;
},
running: function () {
return workers;
}
};
return q;
};
async.cargo = function (worker, payload) {
var working = false,
tasks = [];
var cargo = {
tasks: tasks,
payload: payload,
saturated: null,
empty: null,
drain: null,
push: function (data, callback) {
if(data.constructor !== Array) {
data = [data];
}
_each(data, function(task) {
tasks.push({
data: task,
callback: typeof callback === 'function' ? callback : null
});
if (cargo.saturated && tasks.length === payload) {
cargo.saturated();
}
});
async.setImmediate(cargo.process);
},
process: function process() {
if (working) return;
if (tasks.length === 0) {
if(cargo.drain) cargo.drain();
return;
}
var ts = typeof payload === 'number'
? tasks.splice(0, payload)
: tasks.splice(0);
var ds = _map(ts, function (task) {
return task.data;
});
if(cargo.empty) cargo.empty();
working = true;
worker(ds, function () {
working = false;
var args = arguments;
_each(ts, function (data) {
if (data.callback) {
data.callback.apply(null, args);
}
});
process();
});
},
length: function () {
return tasks.length;
},
running: function () {
return working;
}
};
return cargo;
};
var _console_fn = function (name) {
return function (fn) {
var args = Array.prototype.slice.call(arguments, 1);
fn.apply(null, args.concat([function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (typeof console !== 'undefined') {
if (err) {
if (console.error) {
console.error(err);
}
}
else if (console[name]) {
_each(args, function (x) {
console[name](x);
});
}
}
}]));
};
};
async.log = _console_fn('log');
async.dir = _console_fn('dir');
/*async.info = _console_fn('info');
async.warn = _console_fn('warn');
async.error = _console_fn('error');*/
async.memoize = function (fn, hasher) {
var memo = {};
var queues = {};
hasher = hasher || function (x) {
return x;
};
var memoized = function () {
var args = Array.prototype.slice.call(arguments);
var callback = args.pop();
var key = hasher.apply(null, args);
if (key in memo) {
callback.apply(null, memo[key]);
}
else if (key in queues) {
queues[key].push(callback);
}
else {
queues[key] = [callback];
fn.apply(null, args.concat([function () {
memo[key] = arguments;
var q = queues[key];
delete queues[key];
for (var i = 0, l = q.length; i < l; i++) {
q[i].apply(null, arguments);
}
}]));
}
};
memoized.memo = memo;
memoized.unmemoized = fn;
return memoized;
};
async.unmemoize = function (fn) {
return function () {
return (fn.unmemoized || fn).apply(null, arguments);
};
};
async.times = function (count, iterator, callback) {
var counter = [];
for (var i = 0; i < count; i++) {
counter.push(i);
}
return async.map(counter, iterator, callback);
};
async.timesSeries = function (count, iterator, callback) {
var counter = [];
for (var i = 0; i < count; i++) {
counter.push(i);
}
return async.mapSeries(counter, iterator, callback);
};
async.compose = function (/* functions... */) {
var fns = Array.prototype.reverse.call(arguments);
return function () {
var that = this;
var args = Array.prototype.slice.call(arguments);
var callback = args.pop();
async.reduce(fns, args, function (newargs, fn, cb) {
fn.apply(that, newargs.concat([function () {
var err = arguments[0];
var nextargs = Array.prototype.slice.call(arguments, 1);
cb(err, nextargs);
}]))
},
function (err, results) {
callback.apply(that, [err].concat(results));
});
};
};
var _applyEach = function (eachfn, fns /*args...*/) {
var go = function () {
var that = this;
var args = Array.prototype.slice.call(arguments);
var callback = args.pop();
return eachfn(fns, function (fn, cb) {
fn.apply(that, args.concat([cb]));
},
callback);
};
if (arguments.length > 2) {
var args = Array.prototype.slice.call(arguments, 2);
return go.apply(this, args);
}
else {
return go;
}
};
async.applyEach = doParallel(_applyEach);
async.applyEachSeries = doSeries(_applyEach);
async.forever = function (fn, callback) {
function next(err) {
if (err) {
if (callback) {
return callback(err);
}
throw err;
}
fn(next);
}
next();
};
// AMD / RequireJS
if (typeof define !== 'undefined' && define.amd) {
define([], function () {
return async;
});
}
// Node.js
else if (typeof module !== 'undefined' && module.exports) {
module.exports = async;
}
// included directly via <script> tag
else {
root.async = async;
}
}());

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,95 @@
'use strict';
var escapeStringRegexp = require('escape-string-regexp');
var ansiStyles = require('ansi-styles');
var stripAnsi = require('strip-ansi');
var hasAnsi = require('has-ansi');
var supportsColor = require('supports-color');
var defineProps = Object.defineProperties;
var chalk = module.exports;
function build(_styles) {
var builder = function builder() {
return applyStyle.apply(builder, arguments);
};
builder._styles = _styles;
// __proto__ is used because we must return a function, but there is
// no way to create a function with a different prototype.
builder.__proto__ = proto;
return builder;
}
var styles = (function () {
var ret = {};
ansiStyles.grey = ansiStyles.gray;
Object.keys(ansiStyles).forEach(function (key) {
ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');
ret[key] = {
get: function () {
return build(this._styles.concat(key));
}
};
});
return ret;
})();
var proto = defineProps(function chalk() {}, styles);
function applyStyle() {
// support varags, but simply cast to string in case there's only one arg
var args = arguments;
var argsLen = args.length;
var str = argsLen !== 0 && String(arguments[0]);
if (argsLen > 1) {
// don't slice `arguments`, it prevents v8 optimizations
for (var a = 1; a < argsLen; a++) {
str += ' ' + args[a];
}
}
if (!chalk.enabled || !str) {
return str;
}
/*jshint validthis: true*/
var nestedStyles = this._styles;
for (var i = 0; i < nestedStyles.length; i++) {
var code = ansiStyles[nestedStyles[i]];
// Replace any instances already present with a re-opening code
// otherwise only the part of the string until said closing code
// will be colored, and the rest will simply be 'plain'.
str = code.open + str.replace(code.closeRe, code.open) + code.close;
}
return str;
}
function init() {
var ret = {};
Object.keys(styles).forEach(function (name) {
ret[name] = {
get: function () {
return build([name]);
}
};
});
return ret;
}
defineProps(chalk, init());
chalk.styles = ansiStyles;
chalk.hasColor = hasAnsi;
chalk.stripColor = stripAnsi;
chalk.supportsColor = supportsColor;
// detect mode if not set manually
if (chalk.enabled === undefined) {
chalk.enabled = chalk.supportsColor;
}

View File

@ -0,0 +1,15 @@
#!/bin/sh
basedir=`dirname "$0"`
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../has-ansi/cli.js" "$@"
ret=$?
else
node "$basedir/../has-ansi/cli.js" "$@"
ret=$?
fi
exit $ret

View File

@ -0,0 +1,5 @@
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\has-ansi\cli.js" %*
) ELSE (
node "%~dp0\..\has-ansi\cli.js" %*
)

View File

@ -0,0 +1,15 @@
#!/bin/sh
basedir=`dirname "$0"`
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../strip-ansi/cli.js" "$@"
ret=$?
else
node "$basedir/../strip-ansi/cli.js" "$@"
ret=$?
fi
exit $ret

View File

@ -0,0 +1,5 @@
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\strip-ansi\cli.js" %*
) ELSE (
node "%~dp0\..\strip-ansi\cli.js" %*
)

View File

@ -0,0 +1,15 @@
#!/bin/sh
basedir=`dirname "$0"`
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../supports-color/cli.js" "$@"
ret=$?
else
node "$basedir/../supports-color/cli.js" "$@"
ret=$?
fi
exit $ret

View File

@ -0,0 +1,5 @@
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\supports-color\cli.js" %*
) ELSE (
node "%~dp0\..\supports-color\cli.js" %*
)

View File

@ -0,0 +1,40 @@
'use strict';
var styles = module.exports;
var codes = {
reset: [0, 0],
bold: [1, 22], // 21 isn't widely supported and 22 does the same thing
dim: [2, 22],
italic: [3, 23],
underline: [4, 24],
inverse: [7, 27],
hidden: [8, 28],
strikethrough: [9, 29],
black: [30, 39],
red: [31, 39],
green: [32, 39],
yellow: [33, 39],
blue: [34, 39],
magenta: [35, 39],
cyan: [36, 39],
white: [37, 39],
gray: [90, 39],
bgBlack: [40, 49],
bgRed: [41, 49],
bgGreen: [42, 49],
bgYellow: [43, 49],
bgBlue: [44, 49],
bgMagenta: [45, 49],
bgCyan: [46, 49],
bgWhite: [47, 49]
};
Object.keys(codes).forEach(function (key) {
var val = codes[key];
var style = styles[key] = {};
style.open = '\u001b[' + val[0] + 'm';
style.close = '\u001b[' + val[1] + 'm';
});

View File

@ -0,0 +1,57 @@
{
"name": "ansi-styles",
"version": "1.1.0",
"description": "ANSI escape codes for styling strings in the terminal",
"license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/sindresorhus/ansi-styles"
},
"author": {
"name": "Sindre Sorhus",
"email": "sindresorhus@gmail.com",
"url": "http://sindresorhus.com"
},
"engines": {
"node": ">=0.10.0"
},
"scripts": {
"test": "mocha"
},
"files": [
"index.js"
],
"keywords": [
"ansi",
"styles",
"color",
"colour",
"colors",
"terminal",
"console",
"cli",
"string",
"tty",
"escape",
"formatting",
"rgb",
"256",
"shell",
"xterm",
"log",
"logging",
"command-line",
"text"
],
"devDependencies": {
"mocha": "*"
},
"readme": "# ansi-styles [![Build Status](https://travis-ci.org/sindresorhus/ansi-styles.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-styles)\n\n> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal\n\nYou probably want the higher-level [chalk](https://github.com/sindresorhus/chalk) module for styling your strings.\n\n![screenshot](screenshot.png)\n\n\n## Install\n\n```sh\n$ npm install --save ansi-styles\n```\n\n\n## Usage\n\n```js\nvar ansi = require('ansi-styles');\n\nconsole.log(ansi.green.open + 'Hello world!' + ansi.green.close);\n```\n\n\n## API\n\nEach style has an `open` and `close` property.\n\n\n## Styles\n\n### General\n\n- `reset`\n- `bold`\n- `dim`\n- `italic` *(not widely supported)*\n- `underline`\n- `inverse`\n- `hidden`\n- `strikethrough` *(not widely supported)*\n\n### Text colors\n\n- `black`\n- `red`\n- `green`\n- `yellow`\n- `blue`\n- `magenta`\n- `cyan`\n- `white`\n- `gray`\n\n### Background colors\n\n- `bgBlack`\n- `bgRed`\n- `bgGreen`\n- `bgYellow`\n- `bgBlue`\n- `bgMagenta`\n- `bgCyan`\n- `bgWhite`\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
"readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/ansi-styles/issues"
},
"homepage": "https://github.com/sindresorhus/ansi-styles",
"_id": "ansi-styles@1.1.0",
"_from": "ansi-styles@^1.1.0"
}

View File

@ -0,0 +1,70 @@
# ansi-styles [![Build Status](https://travis-ci.org/sindresorhus/ansi-styles.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-styles)
> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal
You probably want the higher-level [chalk](https://github.com/sindresorhus/chalk) module for styling your strings.
![screenshot](screenshot.png)
## Install
```sh
$ npm install --save ansi-styles
```
## Usage
```js
var ansi = require('ansi-styles');
console.log(ansi.green.open + 'Hello world!' + ansi.green.close);
```
## API
Each style has an `open` and `close` property.
## Styles
### General
- `reset`
- `bold`
- `dim`
- `italic` *(not widely supported)*
- `underline`
- `inverse`
- `hidden`
- `strikethrough` *(not widely supported)*
### Text colors
- `black`
- `red`
- `green`
- `yellow`
- `blue`
- `magenta`
- `cyan`
- `white`
- `gray`
### Background colors
- `bgBlack`
- `bgRed`
- `bgGreen`
- `bgYellow`
- `bgBlue`
- `bgMagenta`
- `bgCyan`
- `bgWhite`
## License
MIT © [Sindre Sorhus](http://sindresorhus.com)

View File

@ -0,0 +1,11 @@
'use strict';
var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
module.exports = function (str) {
if (typeof str !== 'string') {
throw new TypeError('Expected a string');
}
return str.replace(matchOperatorsRe, '\\$&');
};

View File

@ -0,0 +1,47 @@
{
"name": "escape-string-regexp",
"version": "1.0.1",
"description": "Escape RegExp special characters",
"license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/sindresorhus/escape-string-regexp"
},
"author": {
"name": "Sindre Sorhus",
"email": "sindresorhus@gmail.com",
"url": "http://sindresorhus.com"
},
"engines": {
"node": ">=0.10.0"
},
"scripts": {
"test": "mocha"
},
"files": [
"index.js"
],
"keywords": [
"regex",
"regexp",
"re",
"regular",
"expression",
"escape",
"string",
"str",
"special",
"characters"
],
"devDependencies": {
"mocha": "*"
},
"readme": "# escape-string-regexp [![Build Status](https://travis-ci.org/sindresorhus/escape-string-regexp.svg?branch=master)](https://travis-ci.org/sindresorhus/escape-string-regexp)\n\n> Escape RegExp special characters\n\n\n## Install\n\n```sh\n$ npm install --save escape-string-regexp\n```\n\n\n## Usage\n\n```js\nvar escapeStringRegexp = require('escape-string-regexp');\n\nvar escapedString = escapeStringRegexp('how much $ for a unicorn?');\n//=> how much \\$ for a unicorn\\?\n\nnew RegExp(escapedString);\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
"readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/escape-string-regexp/issues"
},
"homepage": "https://github.com/sindresorhus/escape-string-regexp",
"_id": "escape-string-regexp@1.0.1",
"_from": "escape-string-regexp@^1.0.0"
}

View File

@ -0,0 +1,27 @@
# escape-string-regexp [![Build Status](https://travis-ci.org/sindresorhus/escape-string-regexp.svg?branch=master)](https://travis-ci.org/sindresorhus/escape-string-regexp)
> Escape RegExp special characters
## Install
```sh
$ npm install --save escape-string-regexp
```
## Usage
```js
var escapeStringRegexp = require('escape-string-regexp');
var escapedString = escapeStringRegexp('how much $ for a unicorn?');
//=> how much \$ for a unicorn\?
new RegExp(escapedString);
```
## License
MIT © [Sindre Sorhus](http://sindresorhus.com)

View File

@ -0,0 +1,53 @@
#!/usr/bin/env node
'use strict';
var pkg = require('./package.json');
var hasAnsi = require('./');
var input = process.argv[2];
function stdin(cb) {
var ret = '';
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (data) {
ret += data;
});
process.stdin.on('end', function () {
cb(ret);
});
}
function help() {
console.log([
pkg.description,
'',
'Usage',
' $ has-ansi <string>',
' $ echo <string> | has-ansi',
'',
'Exits with code 0 if input has ANSI escape codes and 1 if not'
].join('\n'));
}
function init(data) {
process.exit(hasAnsi(data) ? 0 : 1);
}
if (process.argv.indexOf('--help') !== -1) {
help();
return;
}
if (process.argv.indexOf('--version') !== -1) {
console.log(pkg.version);
return;
}
if (process.stdin.isTTY) {
if (!input) {
help();
return;
}
init(input);
} else {
stdin(init);
}

View File

@ -0,0 +1,4 @@
'use strict';
var ansiRegex = require('ansi-regex');
var re = new RegExp(ansiRegex().source); // remove the `g` flag
module.exports = re.test.bind(re);

View File

@ -0,0 +1,4 @@
'use strict';
module.exports = function () {
return /\u001b\[(?:[0-9]{1,3}(?:;[0-9]{1,3})*)?[m|K]/g;
};

View File

@ -0,0 +1,62 @@
{
"name": "ansi-regex",
"version": "0.2.1",
"description": "Regular expression for matching ANSI escape codes",
"license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/sindresorhus/ansi-regex"
},
"author": {
"name": "Sindre Sorhus",
"email": "sindresorhus@gmail.com",
"url": "http://sindresorhus.com"
},
"engines": {
"node": ">=0.10.0"
},
"scripts": {
"test": "mocha"
},
"files": [
"index.js"
],
"keywords": [
"ansi",
"styles",
"color",
"colour",
"colors",
"terminal",
"console",
"cli",
"string",
"tty",
"escape",
"formatting",
"rgb",
"256",
"shell",
"xterm",
"command-line",
"text",
"regex",
"regexp",
"re",
"match",
"test",
"find",
"pattern"
],
"devDependencies": {
"mocha": "*"
},
"readme": "# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex)\n\n> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```sh\n$ npm install --save ansi-regex\n```\n\n\n## Usage\n\n```js\nvar ansiRegex = require('ansi-regex');\n\nansiRegex().test('\\u001b[4mcake\\u001b[0m');\n//=> true\n\nansiRegex().test('cake');\n//=> false\n\n'\\u001b[4mcake\\u001b[0m'.match(ansiRegex());\n//=> ['\\u001b[4m', '\\u001b[0m']\n```\n\n*It's a function so you can create multiple instances. Regexes with the global flag will have the `.lastIndex` property changed for each call to methods on the instance. Therefore reusing the instance with multiple calls will not work as expected for `.test()`.*\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
"readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/ansi-regex/issues"
},
"homepage": "https://github.com/sindresorhus/ansi-regex",
"_id": "ansi-regex@0.2.1",
"_from": "ansi-regex@^0.2.0"
}

View File

@ -0,0 +1,33 @@
# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex)
> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
## Install
```sh
$ npm install --save ansi-regex
```
## Usage
```js
var ansiRegex = require('ansi-regex');
ansiRegex().test('\u001b[4mcake\u001b[0m');
//=> true
ansiRegex().test('cake');
//=> false
'\u001b[4mcake\u001b[0m'.match(ansiRegex());
//=> ['\u001b[4m', '\u001b[0m']
```
*It's a function so you can create multiple instances. Regexes with the global flag will have the `.lastIndex` property changed for each call to methods on the instance. Therefore reusing the instance with multiple calls will not work as expected for `.test()`.*
## License
MIT © [Sindre Sorhus](http://sindresorhus.com)

View File

@ -0,0 +1,68 @@
{
"name": "has-ansi",
"version": "0.1.0",
"description": "Check if a string has ANSI escape codes",
"license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/sindresorhus/has-ansi"
},
"bin": {
"has-ansi": "cli.js"
},
"author": {
"name": "Sindre Sorhus",
"email": "sindresorhus@gmail.com",
"url": "http://sindresorhus.com"
},
"engines": {
"node": ">=0.10.0"
},
"scripts": {
"test": "mocha"
},
"files": [
"index.js",
"cli.js"
],
"keywords": [
"cli",
"bin",
"ansi",
"styles",
"color",
"colour",
"colors",
"terminal",
"console",
"string",
"tty",
"escape",
"shell",
"xterm",
"command-line",
"text",
"regex",
"regexp",
"re",
"match",
"test",
"find",
"pattern",
"has"
],
"dependencies": {
"ansi-regex": "^0.2.0"
},
"devDependencies": {
"mocha": "*"
},
"readme": "# has-ansi [![Build Status](https://travis-ci.org/sindresorhus/has-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/has-ansi)\n\n> Check if a string has [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```sh\n$ npm install --save has-ansi\n```\n\n\n## Usage\n\n```js\nvar hasAnsi = require('has-ansi');\n\nhasAnsi('\\u001b[4mcake\\u001b[0m');\n//=> true\n\nhasAnsi('cake');\n//=> false\n```\n\n\n## CLI\n\n```sh\n$ npm install --global has-ansi\n```\n\n```\n$ has-ansi --help\n\nUsage\n $ has-ansi <string>\n $ echo <string> | has-ansi\n\nExits with code 0 if input has ANSI escape codes and 1 if not\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
"readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/has-ansi/issues"
},
"homepage": "https://github.com/sindresorhus/has-ansi",
"_id": "has-ansi@0.1.0",
"_from": "has-ansi@^0.1.0"
}

View File

@ -0,0 +1,45 @@
# has-ansi [![Build Status](https://travis-ci.org/sindresorhus/has-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/has-ansi)
> Check if a string has [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
## Install
```sh
$ npm install --save has-ansi
```
## Usage
```js
var hasAnsi = require('has-ansi');
hasAnsi('\u001b[4mcake\u001b[0m');
//=> true
hasAnsi('cake');
//=> false
```
## CLI
```sh
$ npm install --global has-ansi
```
```
$ has-ansi --help
Usage
$ has-ansi <string>
$ echo <string> | has-ansi
Exits with code 0 if input has ANSI escape codes and 1 if not
```
## License
MIT © [Sindre Sorhus](http://sindresorhus.com)

View File

@ -0,0 +1,39 @@
#!/usr/bin/env node
'use strict';
var fs = require('fs');
var pkg = require('./package.json');
var strip = require('./');
var input = process.argv[2];
function help() {
console.log([
pkg.description,
'',
'Usage',
' $ strip-ansi <input-file> > <output-file>',
' $ cat <input-file> | strip-ansi > <output-file>',
'',
'Example',
' $ strip-ansi unicorn.txt > unicorn-stripped.txt'
].join('\n'));
}
if (process.argv.indexOf('--help') !== -1) {
help();
return;
}
if (process.argv.indexOf('--version') !== -1) {
console.log(pkg.version);
return;
}
if (input) {
process.stdout.write(strip(fs.readFileSync(input, 'utf8')));
return;
}
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (data) {
process.stdout.write(strip(data));
});

View File

@ -0,0 +1,6 @@
'use strict';
var ansiRegex = require('ansi-regex')();
module.exports = function (str) {
return typeof str === 'string' ? str.replace(ansiRegex, '') : str;
};

View File

@ -0,0 +1,4 @@
'use strict';
module.exports = function () {
return /\u001b\[(?:[0-9]{1,3}(?:;[0-9]{1,3})*)?[m|K]/g;
};

View File

@ -0,0 +1,62 @@
{
"name": "ansi-regex",
"version": "0.2.1",
"description": "Regular expression for matching ANSI escape codes",
"license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/sindresorhus/ansi-regex"
},
"author": {
"name": "Sindre Sorhus",
"email": "sindresorhus@gmail.com",
"url": "http://sindresorhus.com"
},
"engines": {
"node": ">=0.10.0"
},
"scripts": {
"test": "mocha"
},
"files": [
"index.js"
],
"keywords": [
"ansi",
"styles",
"color",
"colour",
"colors",
"terminal",
"console",
"cli",
"string",
"tty",
"escape",
"formatting",
"rgb",
"256",
"shell",
"xterm",
"command-line",
"text",
"regex",
"regexp",
"re",
"match",
"test",
"find",
"pattern"
],
"devDependencies": {
"mocha": "*"
},
"readme": "# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex)\n\n> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```sh\n$ npm install --save ansi-regex\n```\n\n\n## Usage\n\n```js\nvar ansiRegex = require('ansi-regex');\n\nansiRegex().test('\\u001b[4mcake\\u001b[0m');\n//=> true\n\nansiRegex().test('cake');\n//=> false\n\n'\\u001b[4mcake\\u001b[0m'.match(ansiRegex());\n//=> ['\\u001b[4m', '\\u001b[0m']\n```\n\n*It's a function so you can create multiple instances. Regexes with the global flag will have the `.lastIndex` property changed for each call to methods on the instance. Therefore reusing the instance with multiple calls will not work as expected for `.test()`.*\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
"readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/ansi-regex/issues"
},
"homepage": "https://github.com/sindresorhus/ansi-regex",
"_id": "ansi-regex@0.2.1",
"_from": "ansi-regex@^0.2.1"
}

View File

@ -0,0 +1,33 @@
# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex)
> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
## Install
```sh
$ npm install --save ansi-regex
```
## Usage
```js
var ansiRegex = require('ansi-regex');
ansiRegex().test('\u001b[4mcake\u001b[0m');
//=> true
ansiRegex().test('cake');
//=> false
'\u001b[4mcake\u001b[0m'.match(ansiRegex());
//=> ['\u001b[4m', '\u001b[0m']
```
*It's a function so you can create multiple instances. Regexes with the global flag will have the `.lastIndex` property changed for each call to methods on the instance. Therefore reusing the instance with multiple calls will not work as expected for `.test()`.*
## License
MIT © [Sindre Sorhus](http://sindresorhus.com)

View File

@ -0,0 +1,67 @@
{
"name": "strip-ansi",
"version": "0.3.0",
"description": "Strip ANSI escape codes",
"license": "MIT",
"bin": {
"strip-ansi": "cli.js"
},
"repository": {
"type": "git",
"url": "git://github.com/sindresorhus/strip-ansi"
},
"author": {
"name": "Sindre Sorhus",
"email": "sindresorhus@gmail.com",
"url": "http://sindresorhus.com"
},
"engines": {
"node": ">=0.10.0"
},
"scripts": {
"test": "mocha"
},
"files": [
"index.js",
"cli.js"
],
"keywords": [
"strip",
"trim",
"remove",
"ansi",
"styles",
"color",
"colour",
"colors",
"terminal",
"console",
"cli",
"string",
"tty",
"escape",
"formatting",
"rgb",
"256",
"shell",
"xterm",
"log",
"logging",
"command-line",
"text"
],
"dependencies": {
"ansi-regex": "^0.2.1"
},
"devDependencies": {
"mocha": "*"
},
"readme": "# strip-ansi [![Build Status](https://travis-ci.org/sindresorhus/strip-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-ansi)\n\n> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```sh\n$ npm install --save strip-ansi\n```\n\n\n## Usage\n\n```js\nvar stripAnsi = require('strip-ansi');\n\nstripAnsi('\\x1b[4mcake\\x1b[0m');\n//=> 'cake'\n```\n\n\n## CLI\n\n```sh\n$ npm install --global strip-ansi\n```\n\n```sh\n$ strip-ansi --help\n\nUsage\n $ strip-ansi <input-file> > <output-file>\n $ cat <input-file> | strip-ansi > <output-file>\n\nExample\n $ strip-ansi unicorn.txt > unicorn-stripped.txt\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
"readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/strip-ansi/issues"
},
"homepage": "https://github.com/sindresorhus/strip-ansi",
"_id": "strip-ansi@0.3.0",
"_from": "strip-ansi@^0.3.0"
}

View File

@ -0,0 +1,43 @@
# strip-ansi [![Build Status](https://travis-ci.org/sindresorhus/strip-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-ansi)
> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
## Install
```sh
$ npm install --save strip-ansi
```
## Usage
```js
var stripAnsi = require('strip-ansi');
stripAnsi('\x1b[4mcake\x1b[0m');
//=> 'cake'
```
## CLI
```sh
$ npm install --global strip-ansi
```
```sh
$ strip-ansi --help
Usage
$ strip-ansi <input-file> > <output-file>
$ cat <input-file> | strip-ansi > <output-file>
Example
$ strip-ansi unicorn.txt > unicorn-stripped.txt
```
## License
MIT © [Sindre Sorhus](http://sindresorhus.com)

View File

@ -0,0 +1,28 @@
#!/usr/bin/env node
'use strict';
var pkg = require('./package.json');
var supportsColor = require('./');
var input = process.argv[2];
function help() {
console.log([
pkg.description,
'',
'Usage',
' $ supports-color',
'',
'Exits with code 0 if color is supported and 1 if not'
].join('\n'));
}
if (!input || process.argv.indexOf('--help') !== -1) {
help();
return;
}
if (process.argv.indexOf('--version') !== -1) {
console.log(pkg.version);
return;
}
process.exit(supportsColor ? 0 : 1);

View File

@ -0,0 +1,32 @@
'use strict';
module.exports = (function () {
if (process.argv.indexOf('--no-color') !== -1) {
return false;
}
if (process.argv.indexOf('--color') !== -1) {
return true;
}
if (process.stdout && !process.stdout.isTTY) {
return false;
}
if (process.platform === 'win32') {
return true;
}
if ('COLORTERM' in process.env) {
return true;
}
if (process.env.TERM === 'dumb') {
return false;
}
if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) {
return true;
}
return false;
})();

View File

@ -0,0 +1,61 @@
{
"name": "supports-color",
"version": "0.2.0",
"description": "Detect whether a terminal supports color",
"license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/sindresorhus/supports-color"
},
"bin": {
"supports-color": "cli.js"
},
"author": {
"name": "Sindre Sorhus",
"email": "sindresorhus@gmail.com",
"url": "http://sindresorhus.com"
},
"engines": {
"node": ">=0.10.0"
},
"scripts": {
"test": "mocha"
},
"files": [
"index.js",
"cli.js"
],
"keywords": [
"cli",
"bin",
"color",
"colour",
"colors",
"terminal",
"console",
"cli",
"ansi",
"styles",
"tty",
"rgb",
"256",
"shell",
"xterm",
"command-line",
"support",
"supports",
"capability",
"detect"
],
"devDependencies": {
"mocha": "*"
},
"readme": "# supports-color [![Build Status](https://travis-ci.org/sindresorhus/supports-color.svg?branch=master)](https://travis-ci.org/sindresorhus/supports-color)\n\n> Detect whether a terminal supports color\n\n\n## Install\n\n```sh\n$ npm install --save supports-color\n```\n\n\n## Usage\n\n```js\nvar supportsColor = require('supports-color');\n\nif (supportsColor) {\n\tconsole.log('Terminal supports color');\n}\n```\n\nIt obeys the `--color` and `--no-color` CLI flags.\n\n\n## CLI\n\n```sh\n$ npm install --global supports-color\n```\n\n```sh\n$ supports-color --help\n\nUsage\n $ supports-color\n\n# Exits with code 0 if color is supported and 1 if not\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
"readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/supports-color/issues"
},
"homepage": "https://github.com/sindresorhus/supports-color",
"_id": "supports-color@0.2.0",
"_from": "supports-color@^0.2.0"
}

View File

@ -0,0 +1,44 @@
# supports-color [![Build Status](https://travis-ci.org/sindresorhus/supports-color.svg?branch=master)](https://travis-ci.org/sindresorhus/supports-color)
> Detect whether a terminal supports color
## Install
```sh
$ npm install --save supports-color
```
## Usage
```js
var supportsColor = require('supports-color');
if (supportsColor) {
console.log('Terminal supports color');
}
```
It obeys the `--color` and `--no-color` CLI flags.
## CLI
```sh
$ npm install --global supports-color
```
```sh
$ supports-color --help
Usage
$ supports-color
# Exits with code 0 if color is supported and 1 if not
```
## License
MIT © [Sindre Sorhus](http://sindresorhus.com)

View File

@ -0,0 +1,71 @@
{
"name": "chalk",
"version": "0.5.1",
"description": "Terminal string styling done right. Created because the `colors` module does some really horrible things.",
"license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/sindresorhus/chalk"
},
"maintainers": [
{
"name": "Sindre Sorhus",
"email": "sindresorhus@gmail.com",
"url": "http://sindresorhus.com"
},
{
"name": "Joshua Appelman",
"email": "joshua@jbna.nl"
}
],
"engines": {
"node": ">=0.10.0"
},
"scripts": {
"test": "mocha",
"bench": "matcha benchmark.js"
},
"files": [
"index.js"
],
"keywords": [
"color",
"colour",
"colors",
"terminal",
"console",
"cli",
"string",
"ansi",
"styles",
"tty",
"formatting",
"rgb",
"256",
"shell",
"xterm",
"log",
"logging",
"command-line",
"text"
],
"dependencies": {
"ansi-styles": "^1.1.0",
"escape-string-regexp": "^1.0.0",
"has-ansi": "^0.1.0",
"strip-ansi": "^0.3.0",
"supports-color": "^0.2.0"
},
"devDependencies": {
"matcha": "^0.5.0",
"mocha": "*"
},
"readme": "# <img width=\"300\" src=\"https://cdn.rawgit.com/sindresorhus/chalk/77ae94f63ab1ac61389b190e5a59866569d1a376/logo.svg\" alt=\"chalk\">\n\n> Terminal string styling done right\n\n[![Build Status](https://travis-ci.org/sindresorhus/chalk.svg?branch=master)](https://travis-ci.org/sindresorhus/chalk)\n![](http://img.shields.io/badge/unicorn-approved-ff69b4.svg)\n\n[colors.js](https://github.com/Marak/colors.js) is currently the most popular string styling module, but it has serious deficiencies like extending String.prototype which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68). Although there are other ones, they either do too much or not enough.\n\n**Chalk is a clean and focused alternative.**\n\n![screenshot](https://github.com/sindresorhus/ansi-styles/raw/master/screenshot.png)\n\n\n## Why\n\n- Highly performant\n- Doesn't extend String.prototype\n- Expressive API\n- Ability to nest styles\n- Clean and focused\n- Auto-detects color support\n- Actively maintained\n- [Used by 1000+ modules](https://npmjs.org/browse/depended/chalk)\n\n\n## Install\n\n```sh\n$ npm install --save chalk\n```\n\n\n## Usage\n\nChalk comes with an easy to use composable API where you just chain and nest the styles you want.\n\n```js\nvar chalk = require('chalk');\n\n// style a string\nconsole.log( chalk.blue('Hello world!') );\n\n// combine styled and normal strings\nconsole.log( chalk.blue('Hello'), 'World' + chalk.red('!') );\n\n// compose multiple styles using the chainable API\nconsole.log( chalk.blue.bgRed.bold('Hello world!') );\n\n// pass in multiple arguments\nconsole.log( chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz') );\n\n// nest styles\nconsole.log( chalk.red('Hello', chalk.underline.bgBlue('world') + '!') );\n\n// nest styles of the same type even (color, underline, background)\nconsole.log( chalk.green('I am a green line ' + chalk.blue('with a blue substring') + ' that becomes green again!') );\n```\n\nEasily define your own themes.\n\n```js\nvar chalk = require('chalk');\nvar error = chalk.bold.red;\nconsole.log(error('Error!'));\n```\n\nTake advantage of console.log [string substitution](http://nodejs.org/docs/latest/api/console.html#console_console_log_data).\n\n```js\nvar name = 'Sindre';\nconsole.log(chalk.green('Hello %s'), name);\n//=> Hello Sindre\n```\n\n\n## API\n\n### chalk.`<style>[.<style>...](string, [string...])`\n\nExample: `chalk.red.bold.underline('Hello', 'world');`\n\nChain [styles](#styles) and call the last one as a method with a string argument. Order doesn't matter.\n\nMultiple arguments will be separated by space.\n\n### chalk.enabled\n\nColor support is automatically detected, but you can override it.\n\n### chalk.supportsColor\n\nDetect whether the terminal [supports color](https://github.com/sindresorhus/supports-color).\n\nCan be overridden by the user with the flags `--color` and `--no-color`.\n\nUsed internally and handled for you, but exposed for convenience.\n\n### chalk.styles\n\nExposes the styles as [ANSI escape codes](https://github.com/sindresorhus/ansi-styles).\n\nGenerally not useful, but you might need just the `.open` or `.close` escape code if you're mixing externally styled strings with yours.\n\n```js\nvar chalk = require('chalk');\n\nconsole.log(chalk.styles.red);\n//=> {open: '\\u001b[31m', close: '\\u001b[39m'}\n\nconsole.log(chalk.styles.red.open + 'Hello' + chalk.styles.red.close);\n```\n\n### chalk.hasColor(string)\n\nCheck whether a string [has color](https://github.com/sindresorhus/has-ansi).\n\n### chalk.stripColor(string)\n\n[Strip color](https://github.com/sindresorhus/strip-ansi) from a string.\n\nCan be useful in combination with `.supportsColor` to strip color on externally styled text when it's not supported.\n\nExample:\n\n```js\nvar chalk = require('chalk');\nvar styledString = getText();\n\nif (!chalk.supportsColor) {\n\tstyledString = chalk.stripColor(styledString);\n}\n```\n\n\n## Styles\n\n### General\n\n- `reset`\n- `bold`\n- `dim`\n- `italic` *(not widely supported)*\n- `underline`\n- `inverse`\n- `hidden`\n- `strikethrough` *(not widely supported)*\n\n### Text colors\n\n- `black`\n- `red`\n- `green`\n- `yellow`\n- `blue`\n- `magenta`\n- `cyan`\n- `white`\n- `gray`\n\n### Background colors\n\n- `bgBlack`\n- `bgRed`\n- `bgGreen`\n- `bgYellow`\n- `bgBlue`\n- `bgMagenta`\n- `bgCyan`\n- `bgWhite`\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
"readmeFilename": "readme.md",
"bugs": {
"url": "https://github.com/sindresorhus/chalk/issues"
},
"homepage": "https://github.com/sindresorhus/chalk",
"_id": "chalk@0.5.1",
"_from": "chalk@^0.5.1"
}

View File

@ -0,0 +1,175 @@
# <img width="300" src="https://cdn.rawgit.com/sindresorhus/chalk/77ae94f63ab1ac61389b190e5a59866569d1a376/logo.svg" alt="chalk">
> Terminal string styling done right
[![Build Status](https://travis-ci.org/sindresorhus/chalk.svg?branch=master)](https://travis-ci.org/sindresorhus/chalk)
![](http://img.shields.io/badge/unicorn-approved-ff69b4.svg)
[colors.js](https://github.com/Marak/colors.js) is currently the most popular string styling module, but it has serious deficiencies like extending String.prototype which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68). Although there are other ones, they either do too much or not enough.
**Chalk is a clean and focused alternative.**
![screenshot](https://github.com/sindresorhus/ansi-styles/raw/master/screenshot.png)
## Why
- Highly performant
- Doesn't extend String.prototype
- Expressive API
- Ability to nest styles
- Clean and focused
- Auto-detects color support
- Actively maintained
- [Used by 1000+ modules](https://npmjs.org/browse/depended/chalk)
## Install
```sh
$ npm install --save chalk
```
## Usage
Chalk comes with an easy to use composable API where you just chain and nest the styles you want.
```js
var chalk = require('chalk');
// style a string
console.log( chalk.blue('Hello world!') );
// combine styled and normal strings
console.log( chalk.blue('Hello'), 'World' + chalk.red('!') );
// compose multiple styles using the chainable API
console.log( chalk.blue.bgRed.bold('Hello world!') );
// pass in multiple arguments
console.log( chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz') );
// nest styles
console.log( chalk.red('Hello', chalk.underline.bgBlue('world') + '!') );
// nest styles of the same type even (color, underline, background)
console.log( chalk.green('I am a green line ' + chalk.blue('with a blue substring') + ' that becomes green again!') );
```
Easily define your own themes.
```js
var chalk = require('chalk');
var error = chalk.bold.red;
console.log(error('Error!'));
```
Take advantage of console.log [string substitution](http://nodejs.org/docs/latest/api/console.html#console_console_log_data).
```js
var name = 'Sindre';
console.log(chalk.green('Hello %s'), name);
//=> Hello Sindre
```
## API
### chalk.`<style>[.<style>...](string, [string...])`
Example: `chalk.red.bold.underline('Hello', 'world');`
Chain [styles](#styles) and call the last one as a method with a string argument. Order doesn't matter.
Multiple arguments will be separated by space.
### chalk.enabled
Color support is automatically detected, but you can override it.
### chalk.supportsColor
Detect whether the terminal [supports color](https://github.com/sindresorhus/supports-color).
Can be overridden by the user with the flags `--color` and `--no-color`.
Used internally and handled for you, but exposed for convenience.
### chalk.styles
Exposes the styles as [ANSI escape codes](https://github.com/sindresorhus/ansi-styles).
Generally not useful, but you might need just the `.open` or `.close` escape code if you're mixing externally styled strings with yours.
```js
var chalk = require('chalk');
console.log(chalk.styles.red);
//=> {open: '\u001b[31m', close: '\u001b[39m'}
console.log(chalk.styles.red.open + 'Hello' + chalk.styles.red.close);
```
### chalk.hasColor(string)
Check whether a string [has color](https://github.com/sindresorhus/has-ansi).
### chalk.stripColor(string)
[Strip color](https://github.com/sindresorhus/strip-ansi) from a string.
Can be useful in combination with `.supportsColor` to strip color on externally styled text when it's not supported.
Example:
```js
var chalk = require('chalk');
var styledString = getText();
if (!chalk.supportsColor) {
styledString = chalk.stripColor(styledString);
}
```
## Styles
### General
- `reset`
- `bold`
- `dim`
- `italic` *(not widely supported)*
- `underline`
- `inverse`
- `hidden`
- `strikethrough` *(not widely supported)*
### Text colors
- `black`
- `red`
- `green`
- `yellow`
- `blue`
- `magenta`
- `cyan`
- `white`
- `gray`
### Background colors
- `bgBlack`
- `bgRed`
- `bgGreen`
- `bgYellow`
- `bgBlue`
- `bgMagenta`
- `bgCyan`
- `bgWhite`
## License
MIT © [Sindre Sorhus](http://sindresorhus.com)

View File

@ -0,0 +1,181 @@
/**
Starting with version 2.0, this file "boots" Jasmine, performing all of the necessary initialization before executing the loaded environment and all of a project's specs. This file should be loaded after `jasmine.js`, but before any project source files or spec files are loaded. Thus this file can also be used to customize Jasmine for a project.
If a project is using Jasmine via the standalone distribution, this file can be customized directly. If a project is using Jasmine via the [Ruby gem][jasmine-gem], this file can be copied into the support directory via `jasmine copy_boot_js`. Other environments (e.g., Python) will have different mechanisms.
The location of `boot.js` can be specified and/or overridden in `jasmine.yml`.
[jasmine-gem]: http://github.com/pivotal/jasmine-gem
*/
(function() {
/**
* ## Require &amp; Instantiate
*
* Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference.
*/
window.jasmine = jasmineRequire.core(jasmineRequire);
/**
* Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference.
*/
jasmineRequire.html(jasmine);
/**
* Create the Jasmine environment. This is used to run all specs in a project.
*/
var env = jasmine.getEnv();
/**
* ## The Global Interface
*
* Build up the functions that will be exposed as the Jasmine public interface. A project can customize, rename or alias any of these functions as desired, provided the implementation remains unchanged.
*/
var jasmineInterface = {
describe: function(description, specDefinitions) {
return env.describe(description, specDefinitions);
},
xdescribe: function(description, specDefinitions) {
return env.xdescribe(description, specDefinitions);
},
it: function(desc, func) {
return env.it(desc, func);
},
xit: function(desc, func) {
return env.xit(desc, func);
},
beforeEach: function(beforeEachFunction) {
return env.beforeEach(beforeEachFunction);
},
afterEach: function(afterEachFunction) {
return env.afterEach(afterEachFunction);
},
expect: function(actual) {
return env.expect(actual);
},
pending: function() {
return env.pending();
},
spyOn: function(obj, methodName) {
return env.spyOn(obj, methodName);
},
jsApiReporter: new jasmine.JsApiReporter({
timer: new jasmine.Timer()
})
};
/**
* Add all of the Jasmine global/public interface to the proper global, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`.
*/
if (typeof window == "undefined" && typeof exports == "object") {
extend(exports, jasmineInterface);
} else {
extend(window, jasmineInterface);
}
/**
* Expose the interface for adding custom equality testers.
*/
jasmine.addCustomEqualityTester = function(tester) {
env.addCustomEqualityTester(tester);
};
/**
* Expose the interface for adding custom expectation matchers
*/
jasmine.addMatchers = function(matchers) {
return env.addMatchers(matchers);
};
/**
* Expose the mock interface for the JavaScript timeout functions
*/
jasmine.clock = function() {
return env.clock;
};
/**
* ## Runner Parameters
*
* More browser specific code - wrap the query string in an object and to allow for getting/setting parameters from the runner user interface.
*/
var queryString = new jasmine.QueryString({
getWindowLocation: function() { return window.location; }
});
var catchingExceptions = queryString.getParam("catch");
env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions);
/**
* ## Reporters
* The `HtmlReporter` builds all of the HTML UI for the runner page. This reporter paints the dots, stars, and x's for specs, as well as all spec names and all failures (if any).
*/
var htmlReporter = new jasmine.HtmlReporter({
env: env,
onRaiseExceptionsClick: function() { queryString.setParam("catch", !env.catchingExceptions()); },
getContainer: function() { return document.body; },
createElement: function() { return document.createElement.apply(document, arguments); },
createTextNode: function() { return document.createTextNode.apply(document, arguments); },
timer: new jasmine.Timer()
});
/**
* The `jsApiReporter` also receives spec results, and is used by any environment that needs to extract the results from JavaScript.
*/
env.addReporter(jasmineInterface.jsApiReporter);
env.addReporter(htmlReporter);
/**
* Filter which specs will be run by matching the start of the full name against the `spec` query param.
*/
var specFilter = new jasmine.HtmlSpecFilter({
filterString: function() { return queryString.getParam("spec"); }
});
env.specFilter = function(spec) {
return specFilter.matches(spec.getFullName());
};
/**
* Setting up timing functions to be able to be overridden. Certain browsers (Safari, IE 8, phantomjs) require this hack.
*/
window.setTimeout = window.setTimeout;
window.setInterval = window.setInterval;
window.clearTimeout = window.clearTimeout;
window.clearInterval = window.clearInterval;
/**
* ## Execution
*
* Replace the browser window's `onload`, ensure it's called, and then run all of the loaded specs. This includes initializing the `HtmlReporter` instance and then executing the loaded Jasmine environment. All of this will happen after all of the specs are loaded.
*/
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
htmlReporter.initialize();
env.execute();
};
/**
* Helper function for readability above.
*/
function extend(destination, source) {
for (var property in source) destination[property] = source[property];
return destination;
}
}());

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,31 @@
/*global jasmine:false, window:false, document:false*/
(function(){
'use strict';
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
if (document.readyState !== 'complete') {
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
jasmineEnv.execute();
};
} else {
jasmineEnv.execute();
}
}());

View File

@ -0,0 +1,681 @@
jasmine.HtmlReporterHelpers = {};
jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {
var el = document.createElement(type);
for (var i = 2; i < arguments.length; i++) {
var child = arguments[i];
if (typeof child === 'string') {
el.appendChild(document.createTextNode(child));
} else {
if (child) {
el.appendChild(child);
}
}
}
for (var attr in attrs) {
if (attr == "className") {
el[attr] = attrs[attr];
} else {
el.setAttribute(attr, attrs[attr]);
}
}
return el;
};
jasmine.HtmlReporterHelpers.getSpecStatus = function(child) {
var results = child.results();
var status = results.passed() ? 'passed' : 'failed';
if (results.skipped) {
status = 'skipped';
}
return status;
};
jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {
var parentDiv = this.dom.summary;
var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite';
var parent = child[parentSuite];
if (parent) {
if (typeof this.views.suites[parent.id] == 'undefined') {
this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views);
}
parentDiv = this.views.suites[parent.id].element;
}
parentDiv.appendChild(childElement);
};
jasmine.HtmlReporterHelpers.addHelpers = function(ctor) {
for(var fn in jasmine.HtmlReporterHelpers) {
ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn];
}
};
jasmine.HtmlReporter = function(_doc) {
var self = this;
var doc = _doc || window.document;
var reporterView;
var dom = {};
// Jasmine Reporter Public Interface
self.logRunningSpecs = false;
self.reportRunnerStarting = function(runner) {
var specs = runner.specs() || [];
if (specs.length == 0) {
return;
}
createReporterDom(runner.env.versionString());
doc.body.appendChild(dom.reporter);
setExceptionHandling();
reporterView = new jasmine.HtmlReporter.ReporterView(dom);
reporterView.addSpecs(specs, self.specFilter);
};
self.reportRunnerResults = function(runner) {
reporterView && reporterView.complete();
};
self.reportSuiteResults = function(suite) {
reporterView.suiteComplete(suite);
};
self.reportSpecStarting = function(spec) {
if (self.logRunningSpecs) {
self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
}
};
self.reportSpecResults = function(spec) {
reporterView.specComplete(spec);
};
self.log = function() {
var console = jasmine.getGlobal().console;
if (console && console.log) {
if (console.log.apply) {
console.log.apply(console, arguments);
} else {
console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
}
}
};
self.specFilter = function(spec) {
if (!focusedSpecName()) {
return true;
}
return spec.getFullName().indexOf(focusedSpecName()) === 0;
};
return self;
function focusedSpecName() {
var specName;
(function memoizeFocusedSpec() {
if (specName) {
return;
}
var paramMap = [];
var params = jasmine.HtmlReporter.parameters(doc);
for (var i = 0; i < params.length; i++) {
var p = params[i].split('=');
paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
}
specName = paramMap.spec;
})();
return specName;
}
function createReporterDom(version) {
dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' },
dom.banner = self.createDom('div', { className: 'banner' },
self.createDom('span', { className: 'title' }, "Jasmine "),
self.createDom('span', { className: 'version' }, version)),
dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}),
dom.alert = self.createDom('div', {className: 'alert'},
self.createDom('span', { className: 'exceptions' },
self.createDom('label', { className: 'label', 'for': 'no_try_catch' }, 'No try/catch'),
self.createDom('input', { id: 'no_try_catch', type: 'checkbox' }))),
dom.results = self.createDom('div', {className: 'results'},
dom.summary = self.createDom('div', { className: 'summary' }),
dom.details = self.createDom('div', { id: 'details' }))
);
}
function noTryCatch() {
return window.location.search.match(/catch=false/);
}
function searchWithCatch() {
var params = jasmine.HtmlReporter.parameters(window.document);
var removed = false;
var i = 0;
while (!removed && i < params.length) {
if (params[i].match(/catch=/)) {
params.splice(i, 1);
removed = true;
}
i++;
}
if (jasmine.CATCH_EXCEPTIONS) {
params.push("catch=false");
}
return params.join("&");
}
function setExceptionHandling() {
var chxCatch = document.getElementById('no_try_catch');
if (noTryCatch()) {
chxCatch.setAttribute('checked', true);
jasmine.CATCH_EXCEPTIONS = false;
}
chxCatch.onclick = function() {
window.location.search = searchWithCatch();
};
}
};
jasmine.HtmlReporter.parameters = function(doc) {
var paramStr = doc.location.search.substring(1);
var params = [];
if (paramStr.length > 0) {
params = paramStr.split('&');
}
return params;
}
jasmine.HtmlReporter.sectionLink = function(sectionName) {
var link = '?';
var params = [];
if (sectionName) {
params.push('spec=' + encodeURIComponent(sectionName));
}
if (!jasmine.CATCH_EXCEPTIONS) {
params.push("catch=false");
}
if (params.length > 0) {
link += params.join("&");
}
return link;
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);
jasmine.HtmlReporter.ReporterView = function(dom) {
this.startedAt = new Date();
this.runningSpecCount = 0;
this.completeSpecCount = 0;
this.passedCount = 0;
this.failedCount = 0;
this.skippedCount = 0;
this.createResultsMenu = function() {
this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'},
this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'),
' | ',
this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing'));
this.summaryMenuItem.onclick = function() {
dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, '');
};
this.detailsMenuItem.onclick = function() {
showDetails();
};
};
this.addSpecs = function(specs, specFilter) {
this.totalSpecCount = specs.length;
this.views = {
specs: {},
suites: {}
};
for (var i = 0; i < specs.length; i++) {
var spec = specs[i];
this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views);
if (specFilter(spec)) {
this.runningSpecCount++;
}
}
};
this.specComplete = function(spec) {
this.completeSpecCount++;
if (isUndefined(this.views.specs[spec.id])) {
this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom);
}
var specView = this.views.specs[spec.id];
switch (specView.status()) {
case 'passed':
this.passedCount++;
break;
case 'failed':
this.failedCount++;
break;
case 'skipped':
this.skippedCount++;
break;
}
specView.refresh();
this.refresh();
};
this.suiteComplete = function(suite) {
var suiteView = this.views.suites[suite.id];
if (isUndefined(suiteView)) {
return;
}
suiteView.refresh();
};
this.refresh = function() {
if (isUndefined(this.resultsMenu)) {
this.createResultsMenu();
}
// currently running UI
if (isUndefined(this.runningAlert)) {
this.runningAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "runningAlert bar" });
dom.alert.appendChild(this.runningAlert);
}
this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount);
// skipped specs UI
if (isUndefined(this.skippedAlert)) {
this.skippedAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "skippedAlert bar" });
}
this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
if (this.skippedCount === 1 && isDefined(dom.alert)) {
dom.alert.appendChild(this.skippedAlert);
}
// passing specs UI
if (isUndefined(this.passedAlert)) {
this.passedAlert = this.createDom('span', { href: jasmine.HtmlReporter.sectionLink(), className: "passingAlert bar" });
}
this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount);
// failing specs UI
if (isUndefined(this.failedAlert)) {
this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"});
}
this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount);
if (this.failedCount === 1 && isDefined(dom.alert)) {
dom.alert.appendChild(this.failedAlert);
dom.alert.appendChild(this.resultsMenu);
}
// summary info
this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount);
this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing";
};
this.complete = function() {
dom.alert.removeChild(this.runningAlert);
this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
if (this.failedCount === 0) {
dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount)));
} else {
showDetails();
}
dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"));
};
return this;
function showDetails() {
if (dom.reporter.className.search(/showDetails/) === -1) {
dom.reporter.className += " showDetails";
}
}
function isUndefined(obj) {
return typeof obj === 'undefined';
}
function isDefined(obj) {
return !isUndefined(obj);
}
function specPluralizedFor(count) {
var str = count + " spec";
if (count > 1) {
str += "s"
}
return str;
}
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView);
jasmine.HtmlReporter.SpecView = function(spec, dom, views) {
this.spec = spec;
this.dom = dom;
this.views = views;
this.symbol = this.createDom('li', { className: 'pending' });
this.dom.symbolSummary.appendChild(this.symbol);
this.summary = this.createDom('div', { className: 'specSummary' },
this.createDom('a', {
className: 'description',
href: jasmine.HtmlReporter.sectionLink(this.spec.getFullName()),
title: this.spec.getFullName()
}, this.spec.description)
);
this.detail = this.createDom('div', { className: 'specDetail' },
this.createDom('a', {
className: 'description',
href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
title: this.spec.getFullName()
}, this.spec.getFullName())
);
};
jasmine.HtmlReporter.SpecView.prototype.status = function() {
return this.getSpecStatus(this.spec);
};
jasmine.HtmlReporter.SpecView.prototype.refresh = function() {
this.symbol.className = this.status();
switch (this.status()) {
case 'skipped':
break;
case 'passed':
this.appendSummaryToSuiteDiv();
break;
case 'failed':
this.appendSummaryToSuiteDiv();
this.appendFailureDetail();
break;
}
};
jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() {
this.summary.className += ' ' + this.status();
this.appendToSummary(this.spec, this.summary);
};
jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() {
this.detail.className += ' ' + this.status();
var resultItems = this.spec.results().getItems();
var messagesDiv = this.createDom('div', { className: 'messages' });
for (var i = 0; i < resultItems.length; i++) {
var result = resultItems[i];
if (result.type == 'log') {
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
} else if (result.type == 'expect' && result.passed && !result.passed()) {
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
if (result.trace.stack) {
messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
}
}
}
if (messagesDiv.childNodes.length > 0) {
this.detail.appendChild(messagesDiv);
this.dom.details.appendChild(this.detail);
}
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) {
this.suite = suite;
this.dom = dom;
this.views = views;
this.element = this.createDom('div', { className: 'suite' },
this.createDom('a', { className: 'description', href: jasmine.HtmlReporter.sectionLink(this.suite.getFullName()) }, this.suite.description)
);
this.appendToSummary(this.suite, this.element);
};
jasmine.HtmlReporter.SuiteView.prototype.status = function() {
return this.getSpecStatus(this.suite);
};
jasmine.HtmlReporter.SuiteView.prototype.refresh = function() {
this.element.className += " " + this.status();
};
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView);
/* @deprecated Use jasmine.HtmlReporter instead
*/
jasmine.TrivialReporter = function(doc) {
this.document = doc || document;
this.suiteDivs = {};
this.logRunningSpecs = false;
};
jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
var el = document.createElement(type);
for (var i = 2; i < arguments.length; i++) {
var child = arguments[i];
if (typeof child === 'string') {
el.appendChild(document.createTextNode(child));
} else {
if (child) { el.appendChild(child); }
}
}
for (var attr in attrs) {
if (attr == "className") {
el[attr] = attrs[attr];
} else {
el.setAttribute(attr, attrs[attr]);
}
}
return el;
};
jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
var showPassed, showSkipped;
this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' },
this.createDom('div', { className: 'banner' },
this.createDom('div', { className: 'logo' },
this.createDom('span', { className: 'title' }, "Jasmine"),
this.createDom('span', { className: 'version' }, runner.env.versionString())),
this.createDom('div', { className: 'options' },
"Show ",
showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
)
),
this.runnerDiv = this.createDom('div', { className: 'runner running' },
this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
);
this.document.body.appendChild(this.outerDiv);
var suites = runner.suites();
for (var i = 0; i < suites.length; i++) {
var suite = suites[i];
var suiteDiv = this.createDom('div', { className: 'suite' },
this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
this.suiteDivs[suite.id] = suiteDiv;
var parentDiv = this.outerDiv;
if (suite.parentSuite) {
parentDiv = this.suiteDivs[suite.parentSuite.id];
}
parentDiv.appendChild(suiteDiv);
}
this.startedAt = new Date();
var self = this;
showPassed.onclick = function(evt) {
if (showPassed.checked) {
self.outerDiv.className += ' show-passed';
} else {
self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
}
};
showSkipped.onclick = function(evt) {
if (showSkipped.checked) {
self.outerDiv.className += ' show-skipped';
} else {
self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
}
};
};
jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
var results = runner.results();
var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
this.runnerDiv.setAttribute("class", className);
//do it twice for IE
this.runnerDiv.setAttribute("className", className);
var specs = runner.specs();
var specCount = 0;
for (var i = 0; i < specs.length; i++) {
if (this.specFilter(specs[i])) {
specCount++;
}
}
var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
};
jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
var results = suite.results();
var status = results.passed() ? 'passed' : 'failed';
if (results.totalCount === 0) { // todo: change this to check results.skipped
status = 'skipped';
}
this.suiteDivs[suite.id].className += " " + status;
};
jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
if (this.logRunningSpecs) {
this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
}
};
jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
var results = spec.results();
var status = results.passed() ? 'passed' : 'failed';
if (results.skipped) {
status = 'skipped';
}
var specDiv = this.createDom('div', { className: 'spec ' + status },
this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
this.createDom('a', {
className: 'description',
href: '?spec=' + encodeURIComponent(spec.getFullName()),
title: spec.getFullName()
}, spec.description));
var resultItems = results.getItems();
var messagesDiv = this.createDom('div', { className: 'messages' });
for (var i = 0; i < resultItems.length; i++) {
var result = resultItems[i];
if (result.type == 'log') {
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
} else if (result.type == 'expect' && result.passed && !result.passed()) {
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
if (result.trace.stack) {
messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
}
}
}
if (messagesDiv.childNodes.length > 0) {
specDiv.appendChild(messagesDiv);
}
this.suiteDivs[spec.suite.id].appendChild(specDiv);
};
jasmine.TrivialReporter.prototype.log = function() {
var console = jasmine.getGlobal().console;
if (console && console.log) {
if (console.log.apply) {
console.log.apply(console, arguments);
} else {
console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
}
}
};
jasmine.TrivialReporter.prototype.getLocation = function() {
return this.document.location;
};
jasmine.TrivialReporter.prototype.specFilter = function(spec) {
var paramMap = {};
var params = this.getLocation().search.substring(1).split('&');
for (var i = 0; i < params.length; i++) {
var p = params[i].split('=');
paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
}
if (!paramMap.spec) {
return true;
}
return spec.getFullName().indexOf(paramMap.spec) === 0;
};

View File

@ -0,0 +1,82 @@
body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }
#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; }
#HTMLReporter a { text-decoration: none; }
#HTMLReporter a:hover { text-decoration: underline; }
#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; }
#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; }
#HTMLReporter #jasmine_content { position: fixed; right: 100%; }
#HTMLReporter .version { color: #aaaaaa; }
#HTMLReporter .banner { margin-top: 14px; }
#HTMLReporter .duration { color: #aaaaaa; float: right; }
#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; }
#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; }
#HTMLReporter .symbolSummary li.passed { font-size: 14px; }
#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; }
#HTMLReporter .symbolSummary li.failed { line-height: 9px; }
#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; }
#HTMLReporter .symbolSummary li.skipped { font-size: 14px; }
#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; }
#HTMLReporter .symbolSummary li.pending { line-height: 11px; }
#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; }
#HTMLReporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; }
#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; }
#HTMLReporter .runningAlert { background-color: #666666; }
#HTMLReporter .skippedAlert { background-color: #aaaaaa; }
#HTMLReporter .skippedAlert:first-child { background-color: #333333; }
#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; }
#HTMLReporter .passingAlert { background-color: #a6b779; }
#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; }
#HTMLReporter .failingAlert { background-color: #cf867e; }
#HTMLReporter .failingAlert:first-child { background-color: #b03911; }
#HTMLReporter .results { margin-top: 14px; }
#HTMLReporter #details { display: none; }
#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; }
#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; }
#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; }
#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; }
#HTMLReporter.showDetails .summary { display: none; }
#HTMLReporter.showDetails #details { display: block; }
#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; }
#HTMLReporter .summary { margin-top: 14px; }
#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; }
#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; }
#HTMLReporter .summary .specSummary.failed a { color: #b03911; }
#HTMLReporter .description + .suite { margin-top: 0; }
#HTMLReporter .suite { margin-top: 14px; }
#HTMLReporter .suite a { color: #333333; }
#HTMLReporter #details .specDetail { margin-bottom: 28px; }
#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; }
#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; }
#HTMLReporter .resultMessage span.result { display: block; }
#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; }
#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ }
#TrivialReporter a:visited, #TrivialReporter a { color: #303; }
#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; }
#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; }
#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; }
#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; }
#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; }
#TrivialReporter .runner.running { background-color: yellow; }
#TrivialReporter .options { text-align: right; font-size: .8em; }
#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; }
#TrivialReporter .suite .suite { margin: 5px; }
#TrivialReporter .suite.passed { background-color: #dfd; }
#TrivialReporter .suite.failed { background-color: #fdd; }
#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; }
#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; }
#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; }
#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; }
#TrivialReporter .spec.skipped { background-color: #bbb; }
#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; }
#TrivialReporter .passed { background-color: #cfc; display: none; }
#TrivialReporter .failed { background-color: #fbb; }
#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; }
#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; }
#TrivialReporter .resultMessage .mismatch { color: black; }
#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; }
#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; }
#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; }
#TrivialReporter #jasmine_content { position: fixed; right: 100%; }
#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,24 @@
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5 internal IsCallable function
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
FNOP = function () {},
fBound = function () {
return fToBind.apply(this instanceof FNOP && oThis ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));
};
FNOP.prototype = this.prototype;
fBound.prototype = new FNOP();
return fBound;
};
}

View File

@ -0,0 +1,287 @@
/*global window:false, alert:false, jasmine:false, Node:false, */
/*jshint curly:false*/
'use strict';
var phantom = {};
if (window._phantom) {
console.log = function(){
phantom.sendMessage('verbose',Array.prototype.slice.apply(arguments).join(', '));
};
}
phantom.sendMessage = function() {
var args = [].slice.call( arguments );
var payload = JSON.stringify( args );
if (window._phantom) {
// alerts are the communication bridge to grunt
alert( payload );
}
};
(function(){
function PhantomReporter() {
this.started = false;
this.finished = false;
this.suites_ = [];
this.results_ = {};
this.buffer = '';
}
PhantomReporter.prototype.reportRunnerStarting = function(runner) {
this.started = true;
var suites = runner.topLevelSuites();
for (var i = 0; i < suites.length; i++) {
var suite = suites[i];
this.suites_.push(this.summarize_(suite));
}
phantom.sendMessage('jasmine.reportRunnerStarting', this.suites_);
};
PhantomReporter.prototype.reportSpecStarting = function(spec) {
spec.startTime = (new Date()).getTime();
var message = {
suite : {
description : spec.suite.description
},
description : spec.description
};
phantom.sendMessage('jasmine.reportSpecStarting', message);
};
PhantomReporter.prototype.suites = function() {
return this.suites_;
};
PhantomReporter.prototype.summarize_ = function(suiteOrSpec) {
var isSuite = suiteOrSpec instanceof jasmine.Suite;
var summary = {
id: suiteOrSpec.id,
name: suiteOrSpec.description,
type: isSuite ? 'suite' : 'spec',
children: []
};
if (isSuite) {
var children = suiteOrSpec.children();
for (var i = 0; i < children.length; i++) {
summary.children.push(this.summarize_(children[i]));
}
}
return summary;
};
PhantomReporter.prototype.results = function() {
return this.results_;
};
PhantomReporter.prototype.resultsForSpec = function(specId) {
return this.results_[specId];
};
function map(values, f) {
var result = [];
for (var ii = 0; ii < values.length; ii++) {
result.push(f(values[ii]));
}
return result;
}
PhantomReporter.prototype.reportRunnerResults = function(runner) {
this.finished = true;
var specIds = map(runner.specs(), function(a){return a.id;});
var summary = this.resultsForSpecs(specIds);
phantom.sendMessage('jasmine.reportRunnerResults',summary);
phantom.sendMessage('jasmine.reportJUnitResults', this.generateJUnitSummary(runner));
phantom.sendMessage('jasmine.done.PhantomReporter');
};
PhantomReporter.prototype.reportSuiteResults = function(suite) {
if (suite.specs().length) {
suite.timestamp = new Date();
suite.duration = suite.timestamp.getTime() - suite.specs()[0].startTime;
phantom.sendMessage('jasmine.reportSuiteResults',{
description : suite.description,
results : suite.results()
});
}
};
function stringify(obj) {
if (typeof obj !== 'object') return obj;
var cache = [], keyMap = [], index;
var string = JSON.stringify(obj, function(key, value) {
// Let json stringify falsy values
if (!value) return value;
// If we're a node
if (typeof(Node) !== 'undefined' && value instanceof Node) return '[ Node ]';
// jasmine-given has expectations on Specs. We intercept to return a
// String to avoid stringifying the entire Jasmine environment, which
// results in exponential string growth
if (value instanceof jasmine.Spec) return '[ Spec: ' + value.description + ' ]';
// If we're a window (logic stolen from jQuery)
if (value.window && value.window === value.window.window) return '[ Window ]';
// Simple function reporting
if (typeof value === 'function') return '[ Function ]';
if (typeof value === 'object' && value !== null) {
if (index = cache.indexOf(value) !== -1) {
// If we have it in cache, report the circle with the key we first found it in
return '[ Circular {' + (keyMap[index] || 'root') + '} ]';
}
cache.push(value);
keyMap.push(key);
}
return value;
});
return string;
}
PhantomReporter.prototype.reportSpecResults = function(spec) {
spec.duration = (new Date()).getTime() - spec.startTime;
var _results = spec.results();
var results = {
description : _results.description,
messages : _results.getItems(),
failedCount : _results.failedCount,
totalCount : _results.totalCount,
passedCount : _results.passedCount,
skipped : _results.skipped,
passed : _results.passed(),
msg : _results.failedCount > 0 ? "failed" : "passed"
};
this.results_[spec.id] = results;
// Quick hack to alleviate cyclical object breaking JSONification.
for (var ii = 0; ii < results.messages.length; ii++) {
var item = results.messages[ii];
if (item.expected) {
item.expected = stringify(item.expected);
}
if (item.actual) {
item.actual = stringify(item.actual);
}
}
phantom.sendMessage( 'jasmine.reportSpecResults', spec.id, results, this.getFullName(spec));
};
PhantomReporter.prototype.getFullName = function(spec) {
return getNestedSuiteName(spec.suite, ':: ') + ':: ' + spec.description;
};
PhantomReporter.prototype.resultsForSpecs = function(specIds){
var results = {};
for (var i = 0; i < specIds.length; i++) {
var specId = specIds[i];
results[specId] = this.summarizeResult_(this.results_[specId]);
}
return results;
};
PhantomReporter.prototype.summarizeResult_ = function(result){
var summaryMessages = [];
var messagesLength = result.messages.length;
for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) {
var resultMessage = result.messages[messageIndex];
summaryMessages.push({
text: resultMessage.type === 'log' ? resultMessage.toString() : jasmine.undefined,
passed: resultMessage.passed ? resultMessage.passed() : true,
type: resultMessage.type,
message: resultMessage.message,
trace: {
stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined
}
});
}
return {
result : result.result,
messages : summaryMessages
};
};
function getNestedSuiteName(suite, sep) {
var names = [];
while (suite) {
names.unshift(suite.description);
suite = suite.parentSuite;
}
return names.join(sep ? sep : ' ');
}
function getTopLevelSuiteId(suite) {
var id;
while (suite) {
id = suite.id;
suite = suite.parentSuite;
}
return id;
}
PhantomReporter.prototype.generateJUnitSummary = function(runner) {
var consolidatedSuites = {},
suites = map(runner.suites(), function(suite) {
var failures = 0;
var testcases = map(suite.specs(), function(spec) {
var failureMessages = [];
var specResults = spec.results();
var resultsItems = specResults.items_;
var resultsItemCount = resultsItems.length;
if (specResults.failedCount) {
failures++;
for (var ii = 0; ii < resultsItemCount; ii++) {
var expectation = resultsItems[ii];
if (!expectation.passed()) {
failureMessages.push(expectation.message);
}
}
}
return {
assertions: resultsItemCount,
className: getNestedSuiteName(spec.suite),
name: spec.description,
time: spec.duration / 1000,
failureMessages: failureMessages
};
});
var data = {
name: getNestedSuiteName(suite),
time: suite.duration / 1000,
timestamp: suite.timestamp,
tests: suite.specs().length,
errors: 0, // TODO: These exist in the JUnit XML but not sure how they map to jasmine things
testcases: testcases,
failures: failures
};
if (suite.parentSuite) {
consolidatedSuites[getTopLevelSuiteId(suite)].push(data);
} else {
consolidatedSuites[suite.id] = [data];
}
return data;
});
return {
suites: suites,
consolidatedSuites: consolidatedSuites
};
};
jasmine.getEnv().addReporter( new PhantomReporter() );
}());

View File

@ -0,0 +1 @@
less.js

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
</project>

View File

@ -0,0 +1,7 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0" is_locked="false">
<option name="myName" value="Project Default" />
<option name="myLocal" value="false" />
<inspection_tool class="JSHint" enabled="true" level="ERROR" enabled_by_default="true" />
</profile>
</component>

View File

@ -0,0 +1,7 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="Project Default" />
<option name="USE_PROJECT_PROFILE" value="true" />
<version value="1.0" />
</settings>
</component>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<file url="file://$PROJECT_DIR$/lib/less/functions.js" libraries="{Node.js Globals}" />
<file url="PROJECT" libraries="{Node.js v0.8.4 Core Modules}" />
</component>
</project>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JSHintConfiguration" version="1.0.0" use-config-file="false">
<option bitwise="true" />
<option curly="true" />
<option eqeqeq="true" />
<option forin="true" />
<option noarg="true" />
<option noempty="true" />
<option nonew="true" />
<option undef="true" />
<option node="true" />
<option maxerr="200" />
</component>
</project>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.grunt" />
<excludeFolder url="file://$MODULE_DIR$/dist" />
<excludeFolder url="file://$MODULE_DIR$/node_modules" />
<excludeFolder url="file://$MODULE_DIR$/projectFilesBackup" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Node.js v0.8.4 Core Modules" level="application" />
</component>
</module>

View File

@ -0,0 +1,8 @@
<component name="libraryTable">
<library name="sass-stdlib">
<CLASSES />
<SOURCES>
<root url="file://$APPLICATION_HOME_DIR$/plugins/sass/lib/stubs/sass_functions.scss" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" />
</project>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/less.js.iml" filepath="$PROJECT_DIR$/.idea/less.js.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,5 @@
<component name="DependencyValidationManager">
<state>
<option name="SKIP_IMPORT_STATEMENTS" value="false" />
</state>
</component>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -0,0 +1,979 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" name="Default" comment="">
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/CHANGELOG.md" afterPath="$PROJECT_DIR$/CHANGELOG.md" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/README.md" afterPath="$PROJECT_DIR$/README.md" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/bower.json" afterPath="$PROJECT_DIR$/bower.json" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/less/index.js" afterPath="$PROJECT_DIR$/lib/less/index.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/package.json" afterPath="$PROJECT_DIR$/package.json" />
</list>
<ignored path="less.js.iws" />
<ignored path=".idea/workspace.xml" />
<file path="/Dummy.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1406471230421" ignored="false" />
<file path="/functions.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393484376009" ignored="false" />
<file path="/merge.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1367345312764" ignored="false" />
<file path="/merge.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1367345371581" ignored="false" />
<file path="/parser.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1406490006675" ignored="false" />
<file path="/rule.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275624547" ignored="false" />
<file path="/a.dummy" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1406490802168" ignored="false" />
<file path="/nth-function.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1367351948429" ignored="false" />
<file path="/SelectorPath.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1367352844032" ignored="false" />
<file path="$PROJECT_DIR$/../lesscss.org/templates/pages/doc.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1367650256341" ignored="false" />
<file path="/doc.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1367511155988" ignored="false" />
<file path="$PROJECT_DIR$/../lesscss.org/templates/pages/reference.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1367650256341" ignored="false" />
<file path="/reference.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1367511521223" ignored="false" />
<file path="$PROJECT_DIR$/../lesscss.org/templates/pages/synopsis.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389767605243" ignored="false" />
<file path="/synopsis.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389643575284" ignored="false" />
<file path="/CHANGELOG.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1406491383200" ignored="false" />
<file path="/env.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1406490741881" ignored="false" />
<file path="/less-test.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403429496147" ignored="false" />
<file path="/common.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1377113623956" ignored="false" />
<file path="/lessc" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1406475331512" ignored="false" />
<file path="$PROJECT_DIR$/../lesscss.org/templates/pages/index.rhtml" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389643372528" ignored="false" />
<file path="$PROJECT_DIR$/../lesscss.org/templates/pages/about.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1367650256341" ignored="false" />
<file path="/compression.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1378056773801" ignored="false" />
<file path="/selector.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275802202" ignored="false" />
<file path="/css-guards.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391361062012" ignored="false" />
<file path="/ruleset.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275668789" ignored="false" />
<file path="/no-js-errors.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1372668666786" ignored="false" />
<file path="/no-js-errors.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1372671114701" ignored="false" />
<file path="/runner-no-js-errors.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1372671176132" ignored="false" />
<file path="/browser-test-prepare.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1377068774816" ignored="false" />
<file path="/lessc_helper.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389383890515" ignored="false" />
<file path="/alpha.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393273873477" ignored="false" />
<file path="/to-css-visitor.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393762287404" ignored="false" />
<file path="/Makefile" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1375304491807" ignored="false" />
<file path="/visitor.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393754205695" ignored="false" />
<file path="/directive.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393274808353" ignored="false" />
<file path="/media.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275313610" ignored="false" />
<file path="/comment.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393274110977" ignored="false" />
<file path="/browser.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393693947773" ignored="false" />
<file path="/media.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1379523525707" ignored="false" />
<file path="/media.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1373053829141" ignored="false" />
<file path="/package.json" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1399790236755" ignored="false" />
<file path="/tree.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393754495098" ignored="false" />
<file path="/anonymous.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393273916803" ignored="false" />
<file path="/assignment.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393273946990" ignored="false" />
<file path="/call.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393274011310" ignored="false" />
<file path="/color.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393754457210" ignored="false" />
<file path="/dimension.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393274641066" ignored="false" />
<file path="/expression.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275096985" ignored="false" />
<file path="/element.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393274989258" ignored="false" />
<file path="/import.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1406473132442" ignored="false" />
<file path="/keyword.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275250681" ignored="false" />
<file path="/source-map-output.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393755125757" ignored="false" />
<file path="/basic.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1379432631064" ignored="false" />
<file path="/basic.json" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1374178313233" ignored="false" />
<file path="/.npmignore" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1374328321137" ignored="false" />
<file path="/css-3.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403431257539" ignored="false" />
<file path="/mixins-args.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1379520900857" ignored="false" />
<file path="/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393532451324" ignored="false" />
<file path="/CONTRIBUTING.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389737193318" ignored="false" />
<file path="/.jshintrc" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387133111636" ignored="false" />
<file path="/quoted.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1399353267113" ignored="false" />
<file path="/index.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1379432766230" ignored="false" />
<file path="/import-visitor.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1406473358787" ignored="false" />
<file path="/value.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275915264" ignored="false" />
<file path="/strings.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1379163271597" ignored="false" />
<file path="/browser-header.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1376601721278" ignored="false" />
<file path="/test-runner-main.htm" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1377108298892" ignored="false" />
<file path="/template.htm" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1377109474311" ignored="false" />
<file path="/runner-console-errors.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1377112419174" ignored="false" />
<file path="/test-error.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1377195013482" ignored="false" />
<file path="/extend-visitor.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393762254175" ignored="false" />
<file path="/extend-selector.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1378043359906" ignored="false" />
<file path="/mixin.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389384202832" ignored="false" />
<file path="/Gruntfile.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393752700425" ignored="false" />
<file path="/less-benchmark.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1378362092117" ignored="false" />
<file path="/.jshintignore" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1378362199452" ignored="false" />
<file path="/*.regexp" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1378758302330" ignored="false" />
<file path="/functions.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1379156751207" ignored="false" />
<file path="/mixins-guards.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1399353469325" ignored="false" />
<file path="/color-func-invalid-color.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1379356574472" ignored="false" />
<file path="/functions.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403068325662" ignored="false" />
<file path="/imported.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1379432649832" ignored="false" />
<file path="/unit-function.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1379479902633" ignored="false" />
<file path="/runner-errors-options.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1379480007230" ignored="false" />
<file path="/mixins-important.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1379522756238" ignored="false" />
<file path="/import-once.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1380865674077" ignored="false" />
<file path="/import-once-test-c.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1379524800174" ignored="false" />
<file path="/import-test-f.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1380865710653" ignored="false" />
<file path="/extend-chaining.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1381864586893" ignored="false" />
<file path="/multiple-guards-on-css-selectors.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382028478537" ignored="false" />
<file path="/extend.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275130388" ignored="false" />
<file path="$PROJECT_DIR$/../lesscss.org/templates/pages/changes.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382343724645" ignored="false" />
<file path="/changes.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382343697611" ignored="false" />
<file path="/index.rhtml" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382348009192" ignored="false" />
<file path="$PROJECT_DIR$/../lesscss.org/public/less/main.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382348100818" ignored="false" />
<file path="/main.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382348099815" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/index.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391946243701" ignored="false" />
<file path="/index.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391432270642" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/index.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390677994704" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/functions.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390645823431" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/assets/css/docs.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390677504951" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/about.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390645823431" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/features.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390645823430" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/functions.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391978217954" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/features/import-directives.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391947065592" ignored="false" />
<file path="/import-directives.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382374439007" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/features/variables.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390422872519" ignored="false" />
<file path="/variables.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387733172047" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/includes/translations.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382376766702" ignored="false" />
<file path="/translations.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382376766702" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/translations.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382377201638" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/features/merge.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391947022420" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/features/Parent-Selectors.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382387070516" ignored="false" />
<file path="/Parent-Selectors.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382387070516" ignored="false" />
<file path="/merge.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382388140793" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/features/extend.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391947031612" ignored="false" />
<file path="/extend.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382878661928" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/features/less-extends.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382391289964" ignored="false" />
<file path="/less-extends.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1382391191974" ignored="false" />
<file path="/index.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403429392850" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/package.json" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384729315957" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/lib/index.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384985733762" ignored="false" />
<file path="/inline-images.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384728120165" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/lib/inline-images.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384729524204" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/test/index.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384986680726" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/test/less/inline-images/test.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384726738700" ignored="false" />
<file path="/test.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384986801959" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/node_modules/less/lib/less/visitor.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384983924894" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/node_modules/less/lib/less/tree/expression.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384983924894" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/node_modules/less/lib/less/tree/call.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384983924894" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/node_modules/less/lib/less/functions.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384983924894" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/node_modules/less/lib/less/parser.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384983924894" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/node_modules/less/lib/less/tree/url.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384983924894" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/node_modules/less/lib/less/to-css-visitor.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384983924894" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/node_modules/less/lib/less/tree/value.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384983924894" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/test/css/inline-images/test.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384984437396" ignored="false" />
<file path="/auto-prefix.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384986836104" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/lib/auto-prefix.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384986925121" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/test/less/auto-prefix/test.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384986803339" ignored="false" />
<file path="$PROJECT_DIR$/../less-plugins.js/test/css/auto-prefix/test.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1384986989891" ignored="false" />
<file path="/no-IDs.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1385497650446" ignored="false" />
<file path="$PROJECT_DIR$/../recess/lib/lint/no-IDs.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1385846569407" ignored="false" />
<file path="$PROJECT_DIR$/../recess/lib/lint/no-JS-prefix.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1385846559711" ignored="false" />
<file path="/no-JS-prefix.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1385845837657" ignored="false" />
<file path="$PROJECT_DIR$/../recess/lib/lint/no-overqualifying.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1385846506799" ignored="false" />
<file path="/no-overqualifying.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1385845695569" ignored="false" />
<file path="$PROJECT_DIR$/../recess/lib/lint/no-underscores.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1385846492871" ignored="false" />
<file path="/no-underscores.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1385846102902" ignored="false" />
<file path="$PROJECT_DIR$/../recess/lib/lint/no-universal-selectors.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1385847231139" ignored="false" />
<file path="/no-universal-selectors.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1385847211465" ignored="false" />
<file path="$PROJECT_DIR$/../recess/lib/lint/zero-units.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1385847964012" ignored="false" />
<file path="/zero-units.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1385847936575" ignored="false" />
<file path="/parse-error-missing-parens.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387043312752" ignored="false" />
<file path="/parse-error-missing-parens.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403198313860" ignored="false" />
<file path="/parse-error-extra-parens.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403198284651" ignored="false" />
<file path="/parse-error-extra-parens.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387043669021" ignored="false" />
<file path="/parse-error-missing-bracket.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403198296378" ignored="false" />
<file path="/parens.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387044073468" ignored="false" />
<file path="/variable.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275934062" ignored="false" />
<file path="/url.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275860205" ignored="false" />
<file path="$PROJECT_DIR$/../recess/lib/lint/strict-property-order.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387396816445" ignored="false" />
<file path="/strict-property-order.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387396795868" ignored="false" />
<file path="$PROJECT_DIR$/../recess/lib/compile/prefix-whitespace.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387397161842" ignored="false" />
<file path="/prefix-whitespace.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387397124766" ignored="false" />
<file path="/extended.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387563500138" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/features/mixin-guards.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387740522891" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/features/mixins-parametric.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387744879944" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/about.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391947812526" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/doc.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1388582909696" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/features/css-guards.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1387740522891" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/Gruntfile.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391717302488" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391717302488" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/package.json" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393790827846" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/includes/nav-main.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390647727833" ignored="false" />
<file path="/nav-main.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390647727833" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/usage.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390647590814" ignored="false" />
<file path="/usage.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390646282725" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/usage.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390645823431" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/Tools.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1388582909695" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/different-compilers.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389801869385" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/synopsis.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1388582909695" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/Overview.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389804184726" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/features.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389652684852" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/guis-for-less.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391947400052" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/includes/nav-getting-started.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389652734061" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/about/about.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1388582909695" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/project-and-community.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1388582909695" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/options.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390124108773" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/.jshintrc" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1388582909695" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/Home.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389647014347" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/advanced-client-side.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1388582909696" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/CONTRIBUTING.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391717302488" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/theme/site.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1388583003155" ignored="false" />
<file path="/site.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1388582998851" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/benchmark/benchmark.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1388583161775" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/theme/docs.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1388583601213" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/assets/css/site.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390677504951" ignored="false" />
<file path="/nav-getting-started.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1388584268485" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/home/using.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389652437402" ignored="false" />
<file path="/using.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389652437402" ignored="false" />
<file path="/javascript.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275227762" ignored="false" />
<file path="/about.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389644005466" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/includes/head.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390422872519" ignored="false" />
<file path="/head.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389801426631" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/assets/js/respond.min.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389645116430" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/assets/js/highlight.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389736374068" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/data/less.json" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403552130278" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/theme/components/header.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389981491656" ignored="false" />
<file path="/header.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389981484426" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/includes/footer.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391459164427" ignored="false" />
<file path="/footer.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391459144732" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/Developing-less.js.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389655005156" ignored="false" />
<file path="/Developing-less.js.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389654989242" ignored="false" />
<file path="/options.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390124108206" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/includes/nav-usage.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389646646182" ignored="false" />
<file path="/nav-usage.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389646643891" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/sourcemaps.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389646856788" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/plugins.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389646866254" ignored="false" />
<file path="/Home.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389647014347" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/features/scope.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389647274931" ignored="false" />
<file path="/about.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390646142138" ignored="false" />
<file path="/features.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389652684852" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/includes/fork-ribbon.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389652751632" ignored="false" />
<file path="/banner.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389736080756" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/includes/banner.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390422872519" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_config.yml" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393790598421" ignored="false" />
<file path="/_config.yml" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391986368506" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/cheatsheet.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390422872519" ignored="false" />
<file path="/cheatsheet.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389801432210" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/about/ports.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390422872519" ignored="false" />
<file path="/browser-support.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389801542441" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/browser-support.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390422872519" ignored="false" />
<file path="/different-compilers.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1389801617939" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/package.json" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble/test/fixtures/partials/nav-main.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/Frameworks-using-LESS.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391950671509" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.3.3.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/runner-global-vars-spec.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/CHANGELOG" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.4.2.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.5.0.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/build/amd.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/.grunt/grunt-contrib-jasmine/jasmine.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/tasks/less.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-rhino-1.3.1.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-rhino-1.3.2.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/build/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.4.1.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-rhino-1.4.0.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/build/build.yml" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/build/tasks/.gitkeep" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.4.0.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.3.2.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble/test/actual/postprocess2.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390422872518" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.3.1.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/package.json" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.4.0-beta.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.3.0.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-rhino-1.3.3.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/jasmine.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/CONTRIBUTING.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.2.2.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/bin/lessc" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/runner-no-js-errors-spec.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/runner-relative-urls-spec.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/runner-modify-vars-spec.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.2.1.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/runner-rootpath-relative-spec.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.5.1.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/runner-console-errors.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/dist/less-1.2.0.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/lib/less/parser.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/less.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/less-test.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/runner-errors-spec.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/grunt/node_modules/js-yaml/node_modules/esprima/test/coverage.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390422872519" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/online-less-compilers.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390422872519" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/runner-main-spec.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/test-runner-template.tmpl" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/runner-rootpath-spec.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/Editors-and-Plugins.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391947541689" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/runner-legacy-spec.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/runner-browser-spec.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/test/browser/common.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/about/history.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390422872519" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/functions/default-function.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390422872519" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/home/using-less.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391717302488" ignored="false" />
<file path="/using-less.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390646093543" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/feed.xml" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390647725749" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/grunt-contrib-watch/node_modules/tiny-lr/readme.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/node_modules/request/node_modules/tough-cookie/public-suffix.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble/node_modules/assemble-yaml/node_modules/js-yaml/node_modules/esprima/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/handlebars-helper-compose/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/grunt-prettify/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble/node_modules/assemble-handlebars/node_modules/handlebars-helpers/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/node_modules/request/node_modules/tough-cookie/LICENSE" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/handlebars-helper-feed/node_modules/fs-utils/node_modules/js-yaml/node_modules/esprima/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-GPL.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/grunt/node_modules/js-yaml/node_modules/esprima/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/grunt-contrib-watch/node_modules/tiny-lr/node_modules/qs/Readme.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/grunt-contrib-connect/node_modules/connect/node_modules/qs/Readme.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/grunt-prettify/test/fixtures/includes/nav.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/handlebars-helper-md/node_modules/fs-utils/node_modules/js-yaml/node_modules/esprima/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/grunt-contrib-connect/node_modules/connect/node_modules/send/Readme.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/grunt-prettify/node_modules/js-beautify/CONTRIBUTING.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/handlebars-helper-compose/node_modules/fs-utils/node_modules/js-yaml/node_modules/esprima/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/grunt-prettify/docs/examples.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble/node_modules/assemble-handlebars/node_modules/handlebars-helpers/node_modules/nap/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble/node_modules/assemble-handlebars/node_modules/handlebars-helpers/node_modules/js-yaml/node_modules/esprima/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble/node_modules/assemble-handlebars/node_modules/handlebars-helpers/node_modules/nap/package.json" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble/node_modules/assemble-handlebars/node_modules/handlebars/release-notes.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble/docs/options.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble/node_modules/assemble-handlebars/node_modules/handlebars-helpers/node_modules/nap/node_modules/coffee-script/CONTRIBUTING.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-contrib-toc/index.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390678354619" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-less/node_modules/less/node_modules/request/node_modules/qs/Readme.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/handlebars-helper-partial/node_modules/assemble-yaml/node_modules/js-yaml/node_modules/esprima/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/yfm/node_modules/js-yaml/node_modules/esprima/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-contrib-permalinks/README.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-contrib-permalinks/docs/quickstart.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/assemble-contrib-permalinks/docs/examples.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668795283" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/functions/misc.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668998911" ignored="false" />
<file path="/misc.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390668998911" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/marked/headings.tmpl" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390671178426" ignored="false" />
<file path="/headings.tmpl" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390671058416" ignored="false" />
<file path="/heading.tmpl" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390672031729" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/handlebars-helper-md/assets/heading.tmpl" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390672031729" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/handlebars-helper-md/node_modules/marked/lib/marked.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390672329875" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/handlebars-helper-compose/node_modules/marked-extras/index.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390672779964" ignored="false" />
<file path="/tmpl.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390672501385" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/handlebars-helper-compose/node_modules/marked-extras/lib/tmpl.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390672501385" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/handlebars-helper-md/node_modules/marked-extras/index.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390672860749" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/node_modules/handlebars-helper-compose/index.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390673448423" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/includes/nav-features.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390676262729" ignored="false" />
<file path="/nav-features.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390675348365" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/features/index.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390677994704" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/usage/index.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390677994704" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/functions/index.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390677994704" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/about/index.html" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390677994704" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_gh_pages/assets/js/jquery.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1390676459651" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/layouts/default.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391946042740" ignored="false" />
<file path="/selectors.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391243957788" ignored="false" />
<file path="/css-guards.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391281544008" ignored="false" />
<file path="/linenumbers.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391356680007" ignored="false" />
<file path="/linenumbers-comments.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391360354966" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/data/utils/extend-pkg.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391431432809" ignored="false" />
<file path="/extend-pkg.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391431421845" ignored="false" />
<file path="/less.json" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391432223143" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/functions/string.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391717302488" ignored="false" />
<file path="/string.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391456938006" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/styles/site.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391717302488" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/styles/docs.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391717302488" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/styles/variables.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391717302488" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/package.json" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391717777696" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/gruntfile.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391718407778" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/less/mixins.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391877724538" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/less/buttons.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391718396278" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/less/responsive-navbar.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391718396278" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/less/navbar.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391718396278" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/less/button-groups.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391718396278" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/less/variables.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391718396278" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/less/bootstrap.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391874469560" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/less/forms.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391718396278" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/less/progress-bars.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391718396278" ignored="false" />
<file path="/gruntfile.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391718407778" ignored="false" />
<file path="$PROJECT_DIR$/test/css/debug/linenumbers-all.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878033924" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/errors/mixins-guards-default-func-3.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/browser/less/urls.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/operations.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/sourcemaps/basic.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/mixins.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/benchmark/benchmark.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/static-urls/urls.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/mixins-named-args.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/lazy-eval.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/browser/less/rootpath/urls.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/mixins-guards.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/variables.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/javascript.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/browser/less/relative-urls/urls.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/parens.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/import.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/browser/less/rootpath-relative/urls.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/property-name-interp.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/mixins-important.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/css-guards.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/scope.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/comments.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/mixins-closure.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/mixins-args.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/strings.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/errors/javascript-undefined-var.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/functions.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/media.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/errors/mixin-not-matched2.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/import/import-once-test-c.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/extend-clearfix.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/errors/mixed-mixin-definition-args-1.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/import/import-test-a.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/import/import-test-b.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/mixins-pattern.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/import/import-test-c.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/errors/mixins-guards-default-func-1.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/extract-and-length.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/errors/mixed-mixin-definition-args-2.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/errors/mixins-guards-default-func-2.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/mixins-nested.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../grunt-test/node_modules/grunt-contrib-less/node_modules/less/test/less/mixins-guards-default-func.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391878905952" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/plugins/link-checker.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391949764625" ignored="false" />
<file path="/link-checker.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391949591146" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/functions/color-operations.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391978406503" ignored="false" />
<file path="/color-operations.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391978406503" ignored="false" />
<file path="/using-with-command-line.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391947331216" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/using-with-command-line.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391947331216" ignored="false" />
<file path="/guis-for-less.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391947400052" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/content/usage/developing-less.md" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391947689705" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/data/translations.yml" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393790598421" ignored="false" />
<file path="/translations.yml" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391950234716" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/plugins/toc.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391977833616" ignored="false" />
<file path="/toc.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391950956063" ignored="false" />
<file path="/functions.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391978019980" ignored="false" />
<file path="/detached-rulesets.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1392246479855" ignored="false" />
<file path="/ruleset-call.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275774391" ignored="false" />
<file path="/build.yml" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391982885642" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/plugins/spell-checker.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391987860352" ignored="false" />
<file path="/spell-checker.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1391987851464" ignored="false" />
<file path="/node.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1402423339599" ignored="false" />
<file path="/postProcessor.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393234582813" ignored="false" />
<file path="/non-node-index.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393762622342" ignored="false" />
<file path="/colors.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393272833364" ignored="false" />
<file path="/mixin-call.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1402424232620" ignored="false" />
<file path="/mixin-definition.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393273691525" ignored="false" />
<file path="/condition.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393274158431" ignored="false" />
<file path="/detached-ruleset.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393274198035" ignored="false" />
<file path="/unit.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393274379812" ignored="false" />
<file path="/unit-conversions.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393274523155" ignored="false" />
<file path="/attribute.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393274906344" ignored="false" />
<file path="/combinator.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393274941506" ignored="false" />
<file path="/negative.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275363359" ignored="false" />
<file path="/operation.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275392900" ignored="false" />
<file path="/paren.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275477267" ignored="false" />
<file path="/unicode-descriptor.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393275828568" ignored="false" />
<file path="/api.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393277569274" ignored="false" />
<file path="$PROJECT_DIR$/test/browser/css/rootpath/urls.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393443112173" ignored="false" />
<file path="/runner-browser-options.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393694072976" ignored="false" />
<file path="/runner-global-vars-options.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393694377434" ignored="false" />
<file path="/runner-legacy-options.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393694425320" ignored="false" />
<file path="/join-selector-visitor.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393755419754" ignored="false" />
<file path="$PROJECT_DIR$/benchmark/benchmark.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393782190959" ignored="false" />
<file path="$PROJECT_DIR$/build/build.yml" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393782190959" ignored="false" />
<file path="/a.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393782288694" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/_less.github.io/feed.xml" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393791295036" ignored="false" />
<file path="$PROJECT_DIR$/../less-docs/templates/includes/javascripts.hbs" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1393791368755" ignored="false" />
<file path="/mixins-guards.css" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1399353453931" ignored="false" />
<file path="/fs.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1399790434647" ignored="false" />
<file path="/javascript.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403068179065" ignored="false" />
<file path="/chunker.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403196499218" ignored="false" />
<file path="/parse-error-curly-bracket.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403197826079" ignored="false" />
<file path="/import-subfolder2.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403198072962" ignored="false" />
<file path="$PROJECT_DIR$/lib/less/tree/javascript.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403430305483" ignored="false" />
<file path="$PROJECT_DIR$/test/browser/jasmine.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403430305484" ignored="false" />
<file path="$PROJECT_DIR$/lib/less/tree/directive.js" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1403449546493" ignored="false" />
<file path="/import-malformed.txt" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1406490256395" ignored="false" />
<file path="/import-malformed.less" changelist="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" time="1406490249812" ignored="false" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ChangesViewManager" flattened_view="true" show_ignored="false" />
<component name="CreatePatchCommitExecutor">
<option name="PATCH_PATH" value="" />
</component>
<component name="DaemonCodeAnalyzer">
<disable_hints />
</component>
<component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
<component name="FavoritesManager">
<favorites_list name="less.js" />
</component>
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="index.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/less/index.js">
<provider selected="true" editor-type-id="text-editor">
<state line="10" column="29" selection-start="279" selection-end="279" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="CHANGELOG.md" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/CHANGELOG.md">
<provider selected="true" editor-type-id="text-editor">
<state line="1" column="0" selection-start="8" selection-end="8" vertical-scroll-proportion="0.06390978">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="functions.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/less/functions.js">
<provider selected="true" editor-type-id="text-editor">
<state line="460" column="25" selection-start="16039" selection-end="16048" vertical-scroll-proportion="-3.2">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="env.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/less/env.js">
<provider selected="true" editor-type-id="text-editor">
<state line="58" column="20" selection-start="2960" selection-end="2960" vertical-scroll-proportion="-3.4">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="urls.less" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/test/browser/less/urls.less">
<provider selected="true" editor-type-id="text-editor">
<state line="47" column="28" selection-start="1359" selection-end="1359" vertical-scroll-proportion="-3.52">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="package.json" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor">
<state line="2" column="19" selection-start="39" selection-end="39" vertical-scroll-proportion="-1.3076923">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="bower.json" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/bower.json">
<provider selected="true" editor-type-id="text-editor">
<state line="3" column="28" selection-start="70" selection-end="70" vertical-scroll-proportion="3.6153846">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Gruntfile.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Gruntfile.js">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FindManager">
<FindUsagesManager>
<setting name="OPEN_NEW_TAB" value="false" />
</FindUsagesManager>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="GitLogSettings">
<option name="myDateState">
<MyDateState />
</option>
</component>
<component name="IdeDocumentHistory">
<option name="changedFiles">
<list>
<option value="$PROJECT_DIR$/test/less/css-3.less" />
<option value="$PROJECT_DIR$/test/css/css-3.css" />
<option value="$PROJECT_DIR$/lib/less/tree/import.js" />
<option value="$PROJECT_DIR$/lib/less/import-visitor.js" />
<option value="$PROJECT_DIR$/benchmark/less-benchmark.js" />
<option value="$PROJECT_DIR$/bin/lessc" />
<option value="$PROJECT_DIR$/test/less-test.js" />
<option value="$PROJECT_DIR$/lib/less/parser.js" />
<option value="$PROJECT_DIR$/test/less/errors/import-no-semi.txt" />
<option value="$PROJECT_DIR$/test/less/errors/import-malformed.less" />
<option value="$PROJECT_DIR$/test/less/errors/import-malformed.txt" />
<option value="$PROJECT_DIR$/lib/less/env.js" />
<option value="$PROJECT_DIR$/bower.json" />
<option value="$PROJECT_DIR$/package.json" />
<option value="$PROJECT_DIR$/lib/less/index.js" />
<option value="$PROJECT_DIR$/CHANGELOG.md" />
</list>
</option>
</component>
<component name="ProjectFrameBounds">
<option name="x" value="62" />
<option name="width" value="1304" />
<option name="height" value="768" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectReloadState">
<option name="STATE" value="0" />
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1" splitterProportion="0.5">
<flattenPackages />
<showMembers />
<showModules />
<showLibraryContents ProjectPane="true" />
<hideEmptyPackages />
<abbreviatePackageNames />
<autoscrollToSource />
<autoscrollFromSource />
<sortByType />
</navigator>
<panes>
<pane id="ProjectPane">
<subPane>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="less.js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="less.js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="less.js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="less.js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="less.js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="lib" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="less.js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="less.js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="lib" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="less" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="less.js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="less.js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="bin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="options.splitter.main.proportions" value="0.3" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="options.lastSelected" value="editor" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/../less-docs" />
<property name="FullScreen" value="false" />
<property name="GoToClass.includeJavaFiles" value="false" />
<property name="options.searchVisible" value="true" />
<property name="options.splitter.details.proportions" value="0.2" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\git\less.js\test\less\errors" />
<recent name="C:\git\less.js\lib\less\env" />
<recent name="C:\git\less.js\lib\less\tree" />
<recent name="C:\git\less.js\lib\less" />
<recent name="C:\git\less.js\test\less" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\git\less.js\lib\less\environment\node" />
<recent name="C:\git\less.js\lib\less\environment" />
<recent name="C:\git\less.js\lib\less\visitor" />
<recent name="C:\git\less.js\lib\less\data" />
<recent name="C:\git\less.js\test\browser\less\console-errors" />
</key>
</component>
<component name="RunManager">
<configuration default="true" type="DartUnitRunConfigurationType" factoryName="DartUnit">
<option name="VMOptions" />
<option name="arguments" />
<option name="filePath" />
<option name="scope" value="ALL" />
<option name="testName" />
<method />
</configuration>
<configuration default="true" type="NodeJSConfigurationType" factoryName="Node.js" working-dir="$PROJECT_DIR$">
<method />
</configuration>
<list size="0" />
</component>
<component name="ShelveChangesManager" show_recycled="false" />
<component name="SvnConfiguration" maxAnnotateRevisions="500" myUseAcceleration="nothing" myAutoUpdateAfterCommit="false" cleanupOnStartRun="false" SSL_PROTOCOLS="all">
<option name="USER" value="" />
<option name="PASSWORD" value="" />
<option name="mySSHConnectionTimeout" value="30000" />
<option name="mySSHReadTimeout" value="30000" />
<option name="LAST_MERGED_REVISION" />
<option name="MERGE_DRY_RUN" value="false" />
<option name="MERGE_DIFF_USE_ANCESTRY" value="true" />
<option name="UPDATE_LOCK_ON_DEMAND" value="false" />
<option name="IGNORE_SPACES_IN_MERGE" value="false" />
<option name="CHECK_NESTED_FOR_QUICK_MERGE" value="false" />
<option name="IGNORE_SPACES_IN_ANNOTATE" value="true" />
<option name="SHOW_MERGE_SOURCES_IN_ANNOTATE" value="true" />
<option name="FORCE_UPDATE" value="false" />
<option name="IGNORE_EXTERNALS" value="false" />
<myIsUseDefaultProxy>false</myIsUseDefaultProxy>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="50832ad7-0bb2-445d-8bdb-45c8a0f7f27b" name="Default" comment="" />
<created>1357400236487</created>
<updated>1357400236487</updated>
</task>
<servers />
</component>
<component name="ToolWindowManager">
<frame x="62" y="0" width="1304" height="768" extended-state="0" />
<editor active="true" />
<layout>
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.49917898" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="0" side_tool="true" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.26719368" sideWeight="0.500821" order="2" side_tool="false" content_ui="combo" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="true" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="9" side_tool="true" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
</layout>
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="VcsManagerConfiguration">
<option name="OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT" value="true" />
<option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="true" />
<option name="CHECK_NEW_TODO" value="true" />
<option name="myTodoPanelSettings">
<value>
<are-packages-shown value="false" />
<are-modules-shown value="false" />
<flatten-packages value="false" />
<is-autoscroll-to-source value="false" />
</value>
</option>
<option name="PERFORM_UPDATE_IN_BACKGROUND" value="true" />
<option name="PERFORM_COMMIT_IN_BACKGROUND" value="true" />
<option name="PERFORM_EDIT_IN_BACKGROUND" value="true" />
<option name="PERFORM_CHECKOUT_IN_BACKGROUND" value="true" />
<option name="PERFORM_ADD_REMOVE_IN_BACKGROUND" value="true" />
<option name="PERFORM_ROLLBACK_IN_BACKGROUND" value="false" />
<option name="CHECK_LOCALLY_CHANGED_CONFLICTS_IN_BACKGROUND" value="false" />
<option name="CHANGED_ON_SERVER_INTERVAL" value="60" />
<option name="SHOW_ONLY_CHANGED_IN_SELECTION_DIFF" value="true" />
<option name="CHECK_COMMIT_MESSAGE_SPELLING" value="true" />
<option name="DEFAULT_PATCH_EXTENSION" value="patch" />
<option name="SHORT_DIFF_HORIZONTALLY" value="true" />
<option name="SHORT_DIFF_EXTRA_LINES" value="2" />
<option name="SOFT_WRAPS_IN_SHORT_DIFF" value="true" />
<option name="INCLUDE_TEXT_INTO_PATCH" value="false" />
<option name="INCLUDE_TEXT_INTO_SHELF" value="false" />
<option name="SHOW_FILE_HISTORY_DETAILS" value="true" />
<option name="SHOW_VCS_ERROR_NOTIFICATIONS" value="true" />
<option name="SHOW_DIRTY_RECURSIVELY" value="false" />
<option name="LIMIT_HISTORY" value="true" />
<option name="MAXIMUM_HISTORY_ROWS" value="1000" />
<option name="UPDATE_FILTER_SCOPE_NAME" />
<option name="USE_COMMIT_MESSAGE_MARGIN" value="false" />
<option name="COMMIT_MESSAGE_MARGIN_SIZE" value="72" />
<option name="WRAP_WHEN_TYPING_REACHES_RIGHT_MARGIN" value="false" />
<option name="FORCE_NON_EMPTY_COMMENT" value="false" />
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="false" />
<option name="LAST_COMMIT_MESSAGE" />
<option name="MAKE_NEW_CHANGELIST_ACTIVE" value="false" />
<option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false" />
<option name="CHECK_FILES_UP_TO_DATE_BEFORE_COMMIT" value="false" />
<option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="false" />
<option name="REFORMAT_BEFORE_FILE_COMMIT" value="false" />
<option name="FILE_HISTORY_DIALOG_COMMENTS_SPLITTER_PROPORTION" value="0.8" />
<option name="FILE_HISTORY_DIALOG_SPLITTER_PROPORTION" value="0.5" />
<option name="ACTIVE_VCS_NAME" />
<option name="UPDATE_GROUP_BY_PACKAGES" value="false" />
<option name="UPDATE_GROUP_BY_CHANGELIST" value="false" />
<option name="UPDATE_FILTER_BY_SCOPE" value="false" />
<option name="SHOW_FILE_HISTORY_AS_TREE" value="false" />
<option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<option name="time" value="1" />
</breakpoint-manager>
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/benchmark/less-benchmark.js">
<provider selected="true" editor-type-id="text-editor">
<state line="1" column="22" selection-start="50" selection-end="50" vertical-scroll-proportion="-0.68">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/bin/lessc">
<provider selected="true" editor-type-id="text-editor">
<state line="384" column="24" selection-start="12243" selection-end="12263" vertical-scroll-proportion="-6.48">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/less-test.js">
<provider selected="true" editor-type-id="text-editor">
<state line="243" column="17" selection-start="8588" selection-end="8588" vertical-scroll-proportion="-3.76">
<folding>
<element signature="n#!!doc" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/less/parser.js">
<provider selected="true" editor-type-id="text-editor">
<state line="1636" column="24" selection-start="64398" selection-end="64398" vertical-scroll-proportion="-5.4">
<folding>
<marker date="1406490009327" expanded="true" signature="-1:-1" placeholder="{...}" />
<marker date="1406490009327" expanded="true" signature="-1:-1" placeholder="{...}" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/less/errors/import-no-semi.less">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/less/errors/import-no-semi.txt">
<provider selected="true" editor-type-id="text-editor">
<state line="2" column="0" selection-start="166" selection-end="166" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/less/errors/import-malformed.less">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="51" selection-start="51" selection-end="51" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/less/errors/import-malformed.txt">
<provider selected="true" editor-type-id="text-editor">
<state line="2" column="2" selection-start="148" selection-end="148" vertical-scroll-proportion="0.1218638">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/less/functions.js">
<provider selected="true" editor-type-id="text-editor">
<state line="460" column="25" selection-start="16039" selection-end="16048" vertical-scroll-proportion="-3.2">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/less/env.js">
<provider selected="true" editor-type-id="text-editor">
<state line="58" column="20" selection-start="2960" selection-end="2960" vertical-scroll-proportion="-3.4">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/browser/less/urls.less">
<provider selected="true" editor-type-id="text-editor">
<state line="47" column="28" selection-start="1359" selection-end="1359" vertical-scroll-proportion="-3.52">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/bower.json">
<provider selected="true" editor-type-id="text-editor">
<state line="3" column="28" selection-start="70" selection-end="70" vertical-scroll-proportion="3.6153846">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Gruntfile.js">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor">
<state line="2" column="19" selection-start="39" selection-end="39" vertical-scroll-proportion="-1.3076923">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/less/index.js">
<provider selected="true" editor-type-id="text-editor">
<state line="10" column="29" selection-start="279" selection-end="279" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/CHANGELOG.md">
<provider selected="true" editor-type-id="text-editor">
<state line="1" column="0" selection-start="8" selection-end="8" vertical-scroll-proportion="0.06390978">
<folding />
</state>
</provider>
</entry>
</component>
</project>

View File

@ -0,0 +1,11 @@
{
"evil": true,
"laxbreak": true,
"latedef": true,
"node": true,
"undef": true,
"unused": "vars",
"noarg": true,
"eqnull": true,
"forin": true
}

View File

@ -0,0 +1 @@
.gitattributes

View File

@ -0,0 +1,7 @@
language: node_js
node_js:
- "0.11"
- "0.10"
install:
- npm install -g grunt-cli
- npm install

View File

@ -0,0 +1,344 @@
# 1.7.4
2014-07-27
- Handle uppercase paths in browser
- Show error if an empty selector is used in extend
- Fix property merging in directives
- Fix ordering of charset and import directives
- Fix race condition that caused a rules is undefined error sometimes if you had a complex import strategy
- Better error message for imports missing semi-colons or malformed
- Do not use util.print to avoid deprecate warnings in node 0.11
# 1.7.3
2014-06-22
- Include dist files, missing from 1.7.2
- Do not round the results of color functions, like lightness, hue, luma etc.
- Support cover and contain keywords in background definitions
# 1.7.2
2014-06-19
- Allow paths option to be a string (in 1.7.1 less started throwing an exception instead of incorrectly processing the string as an array of chars)
- Do not round numbers when used with javascript (introduced 1.7.0)
# 1.7.1
2014-06-08
- Fix detection of recursive mixins
- Fix the paths option for later versions of node (0.10+)
- Fix paths joining bug
- Fix a number precision issue on some versions of node
- Fix an IE8 issue with importing css files
- Fix IE11 detection for xhr requests
- Modify var works if the last line of a less file is a comment.
- Better detection of valid hex colour codes
- Some stability fixes to support a low number of available file handles
- Support comparing values with different quote types e.g. "test" now === 'test'
- Give better error messages if accessing a url that returns a non 200 status code
- Fix the e() function when passed empty string
- Several minor bug fixes
# 1.7.0
2014-02-27
- Add support for rulesets in variables and passed to mixins to allow wrapping
- Change luma to follow the w3c spec, luma is available as luminance. Contrast still uses luma so you may see differences if your threshold % is close to the existing calculated luma.
- Upgraded clean css which means the --selectors-merge-mode is now renamed --compatibility
- Add support for using variables with @keyframes, @namespace, @charset
- Support property merging with +_ when spaces are needed and keep + for comma separated
- Imports now always import once consistently - a race condition meant previously certain configurations would lead to a different ordering of files
- Fix support for `.mixin(@args...)` when called with no args (e.g. `.mixin();`)
- Do unit conversions with min and max functions. Don't pass through if not understood, throw an error
- Allow % to be passed on its own to the unit function e.g. `unit(10, %)`
- Fix a bug when comparing a unit value to a non-unit value if the unit-value was the multiple of another unit (e.g. cm, mm, deg etc.)
- Fix mixins with media queries in import reference files not being put into the output (they now output, they used to incorrectly not)
- Fix lint mode - now reports all errors
- Fixed a small scope issue with & {} selector rulesets incorrectly making mixins visible - regression from 1.6.2
- Browser - added log level "debug" at 3 to get less logging, The default has changed so unless you set the value to the default you won't see a difference
- Browser - logLevel takes effect regardless of the environment (production/dev)
- Browser - added postProcessor option, a function called to post-process the css before adding to the page
- Browser - use the right request for file access in IE
# 1.6.3
2014-02-08
- Fix issue with calling toCSS twice not working in some situations (like with bootstrap 2)
# 1.6.2
2014-02-02
- The Rhino release is fixed!
- ability to use uppercase colours
- Fix a nasty bug causing syntax errors when selector interpolation is preceded by a long comment (and some other cases)
- Fix a major bug with the variable scope in guards on selectors (e.g. not mixins)
- Fold in `& when () {` to the current selector rather than duplicating it
- fix another issue with array prototypes
- add a url-args option which adds a value to all urls (for cache busting)
- Round numbers to 8 decimal places - thereby stopping javascript precision errors
- some improvements to the default() function in more complex scenarios
- improved missing '{' and '(' detection
# 1.6.1
2014-01-12
- support ^ and ^^ shadow dom selectors
- fix sourcemap selector (used to report end of the element or selector) and directive position (previously not supported)
- fix parsing empty less files
- error on (currently) ambiguous guards on multiple css selectors
- older environments - protect against typeof regex returning function
- Do not use default keyword
- use innerHTML in tests, not innerText
- protect for-in in case Array and Object prototypes have custom fields
# 1.6.0
2014-01-01
- Properties can be interpolated, e.g. @{prefix}-property: value;
- a default function has been added only valid in mixin definitions to determine if no other mixins have been matched
- Added a plugins option that allows specifying an array of visitors run on the less AST
- Performance improvements that may result in approx 20-40% speed up
- Javascript evaluations returning numbers can now be used in calculations/functions
- fixed issue when adding colours, taking the alpha over 1 and breaking when used in colour functions
- when adding together 2 colours with non zero alpha, the alpha will now be combined rather than added
- the advanced colour functions no longer ignore transparency, they blend that too
- Added --clean-option and cleancssOptions to allow passing in clean css options
- rgba declarations are now always clamped e.g. rgba(-1,258,258, -1) becomes rgba(0, 255, 255, 0)
- Fix possible issue with import reference not bringing in styles (may not be a bugfix, just a code tidy)
- Fix some issues with urls() being prefixed twice and unquoted urls in mixins being processed each time they are called
- Fixed error messages for undefined variables in javascript evaluation
- Fixed line/column numbers from math errors
# 1.5.1
2013-11-17
- Added source-map-URL option
- Fixed a bug which meant the minimised 1.5.0 browser version was not wrapped, meaning it interfered with require js
- Fixed a bug where the browser version assume port was specified
- Added the ability to specify variables on the command line
- Upgraded clean-css and fixed it from trying to import
- correct a bug meaning imports weren't synchronous (syncImport option available for full synchronous behaviour)
- better mixin matching behaviour with calling multiple classes e.g. .a.b.c;
# 1.5.0
2013-10-21
- sourcemap support
- support for import inline option to include css that you do NOT want less to parse e.g. `@import (inline) "file.css";`
- better support for modifyVars (refresh styles with new variables, using a file cache), is now more resiliant
- support for import reference option to reference external css, but not output it. Any mixin calls or extend's will be output.
- support for guards on selectors (currently only if you have a single selector)
- allow property merging through the +: syntax
- Added min/max functions
- Added length function and improved extract to work with comma seperated values
- when using import multiple, sub imports are imported multiple times into final output
- fix bad spaces between namespace operators
- do not compress comment if it begins with an exclamation mark
- Fix the saturate function to pass through when using the CSS syntax
- Added svg-gradient function
- Added no-js option to lessc (in browser, use javascriptEnabled: false) which disallows JavaScript in less files
- switched from the little supported and buggy cssmin (previously ycssmin) to clean-css
- support transparent as a color, but not convert between rgba(0, 0, 0, 0) and transparent
- remove sys.puts calls to stop deprecation warnings in future node.js releases
- Browser: added logLevel option to control logging (2 = everything, 1 = errors only, 0 = no logging)
- Browser: added errorReporting option which can be "html" (default) or "console" or a function
- Now uses grunt for building and testing
- A few bug fixes for media queries, extends, scoping, compression and import once.
# 1.4.2
2013-07-20
- if you don't pass a strict maths option, font size/line height options are output correctly again
- npmignore now include .gitattributes
- property names may include capital letters
- various windows path fixes (capital letters, multiple // in a path)
# 1.4.1
2013-07-05
- fix syncImports and yui-compress option, as they were being ignored
- fixed several global variable leaks
- handle getting null or undefined passed as the options object
# 1.4.0
2013-06-05
- fix passing of strict maths option
# 1.4.0 Beta 4
2013-05-04
- change strictMaths to strictMath. Enable this with --strict-math=on in lessc and strictMath:true in JavaScript.
- change lessc option for strict units to --strict-units=off
# 1.4.0 Beta 3
2013-04-30
- strictUnits now defaults to false and the true case now gives more useful but less correct results, e.g. 2px/1px = 2px
- Process ./ when having relative paths
- add isunit function for mixin guards and non basic units
- extends recognise attributes
- exception errors extend the JavaScript Error
- remove es-5-shim as standard from the browser
- Fix path issues with windows/linux local paths
# 1.4.0 Beta 1 & 2
2013-03-07
- support for `:extend()` in selectors (e.g. `input:extend(.button) {}`) and `&:extend();` in ruleset (e.g. `input { &:extend(.button all); }`)
- maths is now only done inside brackets. This means font: statements, media queries and the calc function can use a simpler format without being escaped. Disable this with --strict-maths-off in lessc and strictMaths:false in JavaScript.
- units are calculated, e.g. 200cm+1m = 3m, 3px/1px = 3. If you use units inconsistently you will get an error. Suppress this error with --strict-units-off in lessc or strictUnits:false in JavaScript
- `(~"@var")` selector interpolation is removed. Use @{var} in selectors to have variable selectors
- default behaviour of import is to import each file once. `@import-once` has been removed.
- You can specify options on imports to force it to behave as css or less `@import (less) "file.css"` will process the file as less
- variables in mixins no longer 'leak' into their calling scope
- added data-uri function which will inline an image into the output css. If ieCompat option is true and file is too large, it will fallback to a url()
- significant bug fixes to our debug options
- other parameters can be used as defaults in mixins e.g. .a(@a, @b:@a)
- an error is shown if properties are used outside of a ruleset
- added extract function which picks a value out of a list, e.g. extract(12 13 14, 3) => 14
- added luma, hsvhue, hsvsaturation, hsvvalue functions
- added pow, pi, mod, tan, sin, cos, atan, asin, acos and sqrt math functions
- added convert function, e.g. convert(1rad, deg) => value in degrees
- lessc makes output directories if they don't exist
- lessc `@import` supports https and 301's
- lessc "-depends" option for lessc writes out the list of import files used in makefile format
- lessc "-lint" option just reports errors
- support for namespaces in attributes and selector interpolation in attributes
- other bug fixes
# 1.3.3
2012-12-30
- Fix critical bug with mixin call if using multiple brackets
- when using the filter contrast function, the function is passed through if the first argument is not a color
# 1.3.2
2012-12-28
- browser and server url re-writing is now aligned to not re-write (previous lessc behaviour)
- url-rewriting can be made to re-write to be relative to the entry file using the relative-urls option (less.relativeUrls option)
- rootpath option can be used to add a base path to every url
- Support mixin argument seperator of ';' so you can pass comma seperated values. e.g. `.mixin(23px, 12px;);`
- Fix lots of problems with named arguments in corner cases, not behaving as expected
- hsv, hsva, unit functions
- fixed lots more bad error messages
- fix `@import-once` to use the full path, not the relative one for determining if an import has been imported already
- support `:not(:nth-child(3))`
- mixin guards take units into account
- support unicode descriptors (`U+00A1-00A9`)
- support calling mixins with a stack when using `&` (broken in 1.3.1)
- support `@namespace` and namespace combinators
- when using % with colour functions, take into account a colour is out of 256
- when doing maths with a % do not divide by 100 and keep the unit
- allow url to contain % (e.g. %20 for a space)
- if a mixin guard stops execution a default mixin is not required
- units are output in strings (use the unit function if you need to get the value without unit)
- do not infinite recurse when mixins call mixins of the same name
- fix issue on important on mixin calls
- fix issue with multiple comments being confused
- tolerate multiple semi-colons on rules
- ignore subsequant `@charset`
- syncImport option for node.js to read files syncronously
- write the output directory if it is missing
- change dependency on cssmin to ycssmin
- lessc can load files over http
- allow calling less.watch() in non dev mode
- don't cache in dev mode
- less files cope with query parameters better
- sass debug statements are now chrome compatible
- modifyVars function added to re-render with different root variables
# 1.3.1
2012-10-18
- Support for comment and @media debugging statements
- bug fix for async access in chrome extensions
- new functions tint, shade, multiply, screen, overlay, hardlight, difference, exclusion, average, negation, softlight, red, green, blue, contrast
- allow escaped characters in attributes
- in selectors support @{a} directly, e.g. .a.@{a} { color: black; }
- add fraction parameter to round function
- much better support for & selector
- preserve order of link statements client side
- lessc has better help
- rhino version fixed
- fix bugs in clientside error handling
- support dpi, vmin, vm, dppx, dpcm units
- Fix ratios in media statements
- in mixin guards allow comparing colors and strings
- support for -*-keyframes (for -khtml but now supports any)
- in mix function, default weight to 50%
- support @import-once
- remove duplicate rules in output
- implement named parameters when calling mixins
- many numerous bug fixes
# 1.3.0
2012-03-10
- @media bubbling
- Support arbitrary entities as selectors
- [Variadic argument support](https://gist.github.com/1933613)
- Behaviour of zero-arity mixins has [changed](https://gist.github.com/1933613)
- Allow `@import` directives in any selector
- Media-query features can now be a variable
- Automatic merging of media-query conditions
- Fix global variable leaks
- Fix error message on wrong-arity call
- Fix an `@arguments` behaviour bug
- Fix `::` selector output
- Fix a bug when using @media with mixins
# 1.2.1
2012-01-15
- Fix imports in browser
- Improve error reporting in browser
- Fix Runtime error reports from imported files
- Fix `File not found` import error reporting
# 1.2.0
2012-01-07
- Mixin guards
- New function `percentage`
- New `color` function to parse hex color strings
- New type-checking stylesheet functions
- Fix Rhino support
- Fix bug in string arguments to mixin call
- Fix error reporting when index is 0
- Fix browser support in WebKit and IE
- Fix string interpolation bug when var is empty
- Support `!important` after mixin calls
- Support vanilla @keyframes directive
- Support variables in certain css selectors, like `nth-child`
- Support @media and @import features properly
- Improve @import support with media features
- Improve error reports from imported files
- Improve function call error reporting
- Improve error-reporting

View File

@ -0,0 +1,50 @@
# Contributing to Less.js
> We welcome feature requests and bug reports. Please read these guidelines before submitting one.
<span class="warning">**Words that begin with the at sign (`@`) must be wrapped in backticks!** </span>. As a courtesy to avoid sending notifications to any user that might have the `@username` being referenced, please remember that GitHub usernames also start with the at sign. If you don't wrap them in backticks, users will get unintended notifications from you.
GitHub has other great markdown features as well, [go here to learn more about them](https://help.github.com/articles/github-flavored-markdown).
## Reporting Issues
We only accept issues that are bug reports or feature requests. Bugs must be isolated and reproducible problems that we can fix within the Less.js core. Please read the following guidelines before opening any issue.
1. **Search for existing issues.** We get a lot of duplicate issues, and you'd help us out a lot by first checking if someone else has reported the same issue. Moreover, the issue may have already been resolved with a fix available.
2. **Create an isolated and reproducible test case.** Be sure the problem exists in Less.js's code with [reduced test cases](http://css-tricks.com/reduced-test-cases/) that should be included in each bug report.
3. **Test with the latest version**. We get a lot of issues that could be resolved by updating your version of Less.js.
3. **Include an example with source.** E.g. You can use [less2css.org](http://less2css.org/) to create a short test case.
4. **Share as much information as possible.** Include operating system and version. Describe how you use Less. If you use it in the browser, please include browser and version, and the version of Less.js you're using. Let us know if you're using the command line (`lessc`) or an external tool. And try to include steps to reproduce the bug.
5. If you have a solution or suggestion for how to fix the bug you're reporting, please include it, or make a pull request - don't assume the maintainers know how to fix it just because you do.
Please report documentation issues in [the documentation project](https://github.com/less/less-docs).
## Feature Requests
* Please search for existing feature requests first to see if something similar already exists.
* Include a clear and specific use-case. We love new ideas, but we do not add language features without a reason.
* Consider whether or not your language feature would be better as a function or implemented in a 3rd-party build system such as [assemble-less](http://github.com/assemble/assemble-less).
## Pull Requests
_Pull requests are encouraged!_
* Start by adding a feature request to get feedback and see how your idea is received.
* If your pull request solves an existing issue, but it's different in some way, _please create a new issue_ and make sure to discuss it with the core contributors. Otherwise you risk your hard work being rejected.
* Do not change the **./dist/** folder, we do this when releasing
* _Please add tests_ for your work. Tests are invoked using `grunt test` command. It will run both node.js tests and browser ([PhantomJS](http://phantomjs.org/)) tests.
### Coding Standards
* Always use spaces, never tabs
* End lines in semi-colons.
* Loosely aim towards jsHint standards
## Developing
If you want to take an issue just add a small comment saying you are having a go at something, so we don't get duplication.
Learn more about [developing Less.js](http://lesscss.org/usage/#developing-less).

View File

@ -0,0 +1,298 @@
'use strict';
module.exports = function(grunt) {
// Report the elapsed execution time of tasks.
require('time-grunt')(grunt);
// Project configuration.
grunt.initConfig({
// Metadata required for build.
build: grunt.file.readYAML('build/build.yml'),
pkg: grunt.file.readJSON('package.json'),
meta: {
license: '<%= _.pluck(pkg.licenses, "type").join(", ") %>',
copyright: 'Copyright (c) 2009-<%= grunt.template.today("yyyy") %>',
banner:
'/*!\n' +
' * Less - <%= pkg.description %> v<%= pkg.version %>\n' +
' * http://lesscss.org\n' +
' *\n' +
' * <%= meta.copyright %>, <%= pkg.author.name %> <<%= pkg.author.email %>>\n' +
' * Licensed under the <%= meta.license %> License.\n' +
' *\n' +
' */\n\n' +
' /**' +
' * @license <%= meta.license %>\n' +
' */\n\n'
},
shell: {
options: {stdout: true, failOnError: true},
test: {
command: 'node test'
},
benchmark: {
command: 'node benchmark/less-benchmark.js'
},
"browsertest-server": {
command: 'node node_modules/http-server/bin/http-server . -p 8088'
},
"sourcemap-test": {
command: [
'node bin/lessc --source-map --source-map-map-inline test/less/import.less test/sourcemaps/import.css',
'node bin/lessc --source-map --source-map-map-inline test/less/sourcemaps/basic.less test/sourcemaps/basic.css',
'node node_modules/http-server/bin/http-server test/sourcemaps -p 8084'].join('&&')
}
},
concat: {
options: {
stripBanners: 'all',
banner: '<%= meta.banner %>\n\n(function (window, undefined) {',
footer: '\n})(window);'
},
// Browser versions
browsertest: {
src: ['<%= build.browser %>'],
dest: 'test/browser/less.js'
},
stable: {
src: ['<%= build.browser %>'],
dest: 'dist/less-<%= pkg.version %>.js'
},
// Rhino
rhino: {
options: {
banner: '/* Less.js v<%= pkg.version %> RHINO | <%= meta.copyright %>, <%= pkg.author.name %> <<%= pkg.author.email %>> */\n\n',
footer: '' // override task-level footer
},
src: ['<%= build.rhino %>'],
dest: 'dist/less-rhino-<%= pkg.version %>.js'
},
// lessc for Rhino
rhinolessc: {
options: {
banner: '/* Less.js v<%= pkg.version %> RHINO | <%= meta.copyright %>, <%= pkg.author.name %> <<%= pkg.author.email %>> */\n\n',
footer: '' // override task-level footer
},
src: ['<%= build.rhinolessc %>'],
dest: 'dist/lessc-rhino-<%= pkg.version %>.js'
},
// Generate readme
readme: {
// override task-level banner and footer
options: {process: true, banner: '', footer: ''},
src: ['build/README.md'],
dest: 'README.md'
}
},
uglify: {
options: {
banner: '<%= meta.banner %>',
mangle: true
},
stable: {
src: ['<%= concat.stable.dest %>'],
dest: 'dist/less-<%= pkg.version %>.min.js'
}
},
jshint: {
options: {jshintrc: '.jshintrc'},
files: {
src: [
'Gruntfile.js',
'lib/less/**/*.js'
]
}
},
connect: {
server: {
options: {
port: 8081
}
}
},
jasmine: {
options: {
// version: '2.0.0-rc2',
keepRunner: true,
host: 'http://localhost:8081/',
vendor: ['test/browser/common.js', 'test/browser/less.js'],
template: 'test/browser/test-runner-template.tmpl'
},
main: {
// src is used to build list of less files to compile
src: ['test/less/*.less', '!test/less/javascript.less', '!test/less/urls.less', '!test/less/empty.less'],
options: {
helpers: 'test/browser/runner-main-options.js',
specs: 'test/browser/runner-main-spec.js',
outfile: 'tmp/browser/test-runner-main.html'
}
},
legacy: {
src: ['test/less/legacy/*.less'],
options: {
helpers: 'test/browser/runner-legacy-options.js',
specs: 'test/browser/runner-legacy-spec.js',
outfile: 'tmp/browser/test-runner-legacy.html'
}
},
errors: {
src: ['test/less/errors/*.less', '!test/less/errors/javascript-error.less'],
options: {
timeout: 20000,
helpers: 'test/browser/runner-errors-options.js',
specs: 'test/browser/runner-errors-spec.js',
outfile: 'tmp/browser/test-runner-errors.html'
}
},
noJsErrors: {
src: ['test/less/no-js-errors/*.less'],
options: {
helpers: 'test/browser/runner-no-js-errors-options.js',
specs: 'test/browser/runner-no-js-errors-spec.js',
outfile: 'tmp/browser/test-runner-no-js-errors.html'
}
},
browser: {
src: ['test/browser/less/*.less'],
options: {
helpers: 'test/browser/runner-browser-options.js',
specs: 'test/browser/runner-browser-spec.js',
outfile: 'tmp/browser/test-runner-browser.html'
}
},
relativeUrls: {
src: ['test/browser/less/relative-urls/*.less'],
options: {
helpers: 'test/browser/runner-relative-urls-options.js',
specs: 'test/browser/runner-relative-urls-spec.js',
outfile: 'tmp/browser/test-runner-relative-urls.html'
}
},
rootpath: {
src: ['test/browser/less/rootpath/*.less'],
options: {
helpers: 'test/browser/runner-rootpath-options.js',
specs: 'test/browser/runner-rootpath-spec.js',
outfile: 'tmp/browser/test-runner-rootpath.html'
}
},
rootpathRelative: {
src: ['test/browser/less/rootpath-relative/*.less'],
options: {
helpers: 'test/browser/runner-rootpath-relative-options.js',
specs: 'test/browser/runner-rootpath-relative-spec.js',
outfile: 'tmp/browser/test-runner-rootpath-relative.html'
}
},
production: {
src: ['test/browser/less/production/*.less'],
options: {
helpers: 'test/browser/runner-production-options.js',
specs: 'test/browser/runner-production-spec.js',
outfile: 'tmp/browser/test-runner-production.html'
}
},
modifyVars: {
src: ['test/browser/less/modify-vars/*.less'],
options: {
helpers: 'test/browser/runner-modify-vars-options.js',
specs: 'test/browser/runner-modify-vars-spec.js',
outfile: 'tmp/browser/test-runner-modify-vars.html'
}
},
globalVars: {
src: ['test/browser/less/global-vars/*.less'],
options: {
helpers: 'test/browser/runner-global-vars-options.js',
specs: 'test/browser/runner-global-vars-spec.js',
outfile: 'tmp/browser/test-runner-global-vars.html'
}
},
postProcessor: {
src: ['test/browser/less/postProcessor/*.less'],
options: {
helpers: 'test/browser/runner-postProcessor-options.js',
specs: 'test/browser/runner-postProcessor.js',
outfile: 'tmp/browser/test-postProcessor.html'
}
}
},
// Clean the version of less built for the tests
clean: {
test: ['test/browser/less.js', 'tmp'],
"sourcemap-test": ['test/sourcemaps/*.css', 'test/sourcemaps/*.map']
}
});
// Load these plugins to provide the necessary tasks
require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
// Actually load this plugin's task(s).
grunt.loadTasks('build/tasks');
// by default, run tests
grunt.registerTask('default', [
'test'
]);
// Release
grunt.registerTask('stable', [
'concat:stable',
'uglify:stable'
]);
// Release Rhino Version
grunt.registerTask('rhino', [
'concat:rhino',
'concat:rhinolessc'
]);
// Run all browser tests
grunt.registerTask('browsertest', [
'browser',
'connect',
'jasmine'
]);
// setup a web server to run the browser tests in a browser rather than phantom
grunt.registerTask('browsertest-server', [
'shell:browsertest-server'
]);
// Create the browser version of less.js
grunt.registerTask('browser', [
'concat:browsertest'
]);
// Run all tests
grunt.registerTask('test', [
'clean',
'jshint',
'shell:test',
'browsertest'
]);
// generate a good test environment for testing sourcemaps
grunt.registerTask('sourcemap-test', [
'clean:sourcemap-test',
'shell:sourcemap-test'
]);
// Run benchmark
grunt.registerTask('benchmark', [
'shell:benchmark'
]);
// Readme.
grunt.registerTask('readme', [
'concat:readme'
]);
};

View File

@ -0,0 +1,177 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS

View File

@ -0,0 +1,53 @@
[![Build Status](https://travis-ci.org/less/less.js.png?branch=master)](https://travis-ci.org/less/less.js)
[![Dependencies](https://david-dm.org/less/less.js.png)](https://david-dm.org/less/less.js) [![devDependency Status](https://david-dm.org/less/less.js/dev-status.png)](https://david-dm.org/less/less.js#info=devDependencies) [![optionalDependency Status](https://david-dm.org/less/less.js/optional-status.png)](https://david-dm.org/less/less.js#info=optionalDependencies)
# [Less.js v1.7.4](http://lesscss.org)
> The **dynamic** stylesheet language. [http://lesscss.org](http://lesscss.org).
This is the JavaScript, official, stable version of Less.
## Getting Started
Options for adding Less.js to your project:
* Install with [NPM](https://npmjs.org/): `npm install less`
* [Download the latest release][download]
* Clone the repo: `git clone git://github.com/less/less.js.git`
## More information
For general information on the language, configuration options or usage visit [lesscss.org](http://lesscss.org).
Here are other resources for using Less.js:
* [stackoverflow.com][so] is a great place to get answers about Less.
* [Less.js Issues][issues] for reporting bugs
## Contributing
Please read [CONTRIBUTING.md](./CONTRIBUTING.md). Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).
### Reporting Issues
Before opening any issue, please search for existing issues and read the [Issue Guidelines](https://github.com/necolas/issue-guidelines), written by [Nicolas Gallagher](https://github.com/necolas/). After that if you find a bug or would like to make feature request, [please open a new issue][issues].
Please report documentation issues in [the documentation project](https://github.com/less/less-docs).
### Development
Read [Developing Less](http://lesscss.org/usage/#developing-less).
## Release History
See the [changelog](CHANGELOG.md)
## [License](LICENSE)
Copyright (c) 2009-2014 [Alexis Sellier](http://cloudhead.io/) & The Core Less Team
Licensed under the [Apache License](LICENSE).
[so]: http://stackoverflow.com/questions/tagged/twitter-bootstrap+less "StackOverflow.com"
[issues]: https://github.com/less/less.js/issues "GitHub Issues for Less.js"
[download]: https://github.com/less/less.js/zipball/master "Download Less.js"

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,45 @@
var path = require('path'),
fs = require('fs');
var less = require('../lib/less');
var file = path.join(__dirname, 'benchmark.less');
if (process.argv[2]) { file = path.join(process.cwd(), process.argv[2]) }
fs.readFile(file, 'utf8', function (e, data) {
var tree, css, start, end, total;
console.log("Benchmarking...\n", path.basename(file) + " (" +
parseInt(data.length / 1024) + " KB)", "");
start = new(Date);
new(less.Parser)({ optimization: 2 }).parse(data, function (err, tree) {
end = new Date();
total = end - start;
console.log("Parsing: " +
total + " ms (" +
Number(1000 / total * data.length / 1024) + " KB\/s)");
start = new Date();
css = tree.toCSS();
end = new Date();
console.log("Generation: " + (end - start) + " ms (" +
parseInt(1000 / (end - start) *
data.length / 1024) + " KB\/s)");
total += end - start;
console.log("Total: " + total + "ms (" +
Number(1000 / total * data.length / 1024) + " KB/s)");
if (err) {
less.writeError(err);
process.exit(3);
}
});
});

View File

@ -0,0 +1,411 @@
#!/usr/bin/env node
var path = require('path'),
fs = require('../lib/less/fs'),
os = require('os'),
mkdirp;
var less = require('../lib/less');
var args = process.argv.slice(1);
var options = {
depends: false,
compress: false,
cleancss: false,
max_line_len: -1,
optimization: 1,
silent: false,
verbose: false,
lint: false,
paths: [],
color: true,
strictImports: false,
insecure: false,
rootpath: '',
relativeUrls: false,
ieCompat: true,
strictMath: false,
strictUnits: false,
globalVariables: '',
modifyVariables: '',
urlArgs: ''
};
var cleancssOptions = {};
var continueProcessing = true,
currentErrorcode;
// calling process.exit does not flush stdout always
// so use this to set the exit code
process.on('exit', function() { process.reallyExit(currentErrorcode) });
var checkArgFunc = function(arg, option) {
if (!option) {
console.log(arg + " option requires a parameter");
continueProcessing = false;
return false;
}
return true;
};
var checkBooleanArg = function(arg) {
var onOff = /^((on|t|true|y|yes)|(off|f|false|n|no))$/i.exec(arg);
if (!onOff) {
console.log(" unable to parse "+arg+" as a boolean. use one of on/t/true/y/yes/off/f/false/n/no");
continueProcessing = false;
return false;
}
return Boolean(onOff[2]);
};
var parseVariableOption = function(option) {
var parts = option.split('=', 2);
return '@' + parts[0] + ': ' + parts[1] + ';\n';
};
var warningMessages = "";
var sourceMapFileInline = false;
args = args.filter(function (arg) {
var match;
if (match = arg.match(/^-I(.+)$/)) {
options.paths.push(match[1]);
return false;
}
if (match = arg.match(/^--?([a-z][0-9a-z-]*)(?:=(.*))?$/i)) { arg = match[1] }
else { return arg }
switch (arg) {
case 'v':
case 'version':
console.log("lessc " + less.version.join('.') + " (Less Compiler) [JavaScript]");
continueProcessing = false;
case 'verbose':
options.verbose = true;
break;
case 's':
case 'silent':
options.silent = true;
break;
case 'l':
case 'lint':
options.lint = true;
break;
case 'strict-imports':
options.strictImports = true;
break;
case 'h':
case 'help':
require('../lib/less/lessc_helper').printUsage();
continueProcessing = false;
case 'x':
case 'compress':
options.compress = true;
break;
case 'insecure':
options.insecure = true;
break;
case 'M':
case 'depends':
options.depends = true;
break;
case 'yui-compress':
warningMessages += "yui-compress option has been removed. ignoring.";
break;
case 'clean-css':
options.cleancss = true;
break;
case 'max-line-len':
if (checkArgFunc(arg, match[2])) {
options.maxLineLen = parseInt(match[2], 10);
if (options.maxLineLen <= 0) {
options.maxLineLen = -1;
}
}
break;
case 'no-color':
options.color = false;
break;
case 'no-ie-compat':
options.ieCompat = false;
break;
case 'no-js':
options.javascriptEnabled = false;
break;
case 'include-path':
if (checkArgFunc(arg, match[2])) {
options.paths = match[2].split(os.type().match(/Windows/) ? ';' : ':')
.map(function(p) {
if (p) {
return path.resolve(process.cwd(), p);
}
});
}
break;
case 'O0': options.optimization = 0; break;
case 'O1': options.optimization = 1; break;
case 'O2': options.optimization = 2; break;
case 'line-numbers':
if (checkArgFunc(arg, match[2])) {
options.dumpLineNumbers = match[2];
}
break;
case 'source-map':
if (!match[2]) {
options.sourceMap = true;
} else {
options.sourceMap = match[2];
}
break;
case 'source-map-rootpath':
if (checkArgFunc(arg, match[2])) {
options.sourceMapRootpath = match[2];
}
break;
case 'source-map-basepath':
if (checkArgFunc(arg, match[2])) {
options.sourceMapBasepath = match[2];
}
break;
case 'source-map-map-inline':
sourceMapFileInline = true;
options.sourceMap = true;
break;
case 'source-map-less-inline':
options.outputSourceFiles = true;
break;
case 'source-map-url':
if (checkArgFunc(arg, match[2])) {
options.sourceMapURL = match[2];
}
break;
case 'rp':
case 'rootpath':
if (checkArgFunc(arg, match[2])) {
options.rootpath = match[2].replace(/\\/g, '/');
}
break;
case "ru":
case "relative-urls":
options.relativeUrls = true;
break;
case "sm":
case "strict-math":
if (checkArgFunc(arg, match[2])) {
options.strictMath = checkBooleanArg(match[2]);
}
break;
case "su":
case "strict-units":
if (checkArgFunc(arg, match[2])) {
options.strictUnits = checkBooleanArg(match[2]);
}
break;
case "global-var":
if (checkArgFunc(arg, match[2])) {
options.globalVariables += parseVariableOption(match[2]);
}
break;
case "modify-var":
if (checkArgFunc(arg, match[2])) {
options.modifyVariables += parseVariableOption(match[2]);
}
break;
case "clean-option":
var cleanOptionArgs = match[2].split(":");
switch(cleanOptionArgs[0]) {
case "--keep-line-breaks":
case "-b":
cleancssOptions.keepBreaks = true;
break;
case "--s0":
cleancssOptions.keepSpecialComments = 0;
break;
case "--s1":
cleancssOptions.keepSpecialComments = 1;
break;
case "--skip-advanced":
cleancssOptions.noAdvanced = true;
break;
case "--advanced":
cleancssOptions.noAdvanced = false;
break;
case "--compatibility":
cleancssOptions.compatibility = cleanOptionArgs[1];
break;
default:
console.log("unrecognised clean-css option '" + cleanOptionArgs[0] + "'");
console.log("we support only arguments that make sense for less, '--keep-line-breaks', '-b'");
console.log("'--s0', '--s1', '--advanced', '--skip-advanced', '--compatibility'");
continueProcessing = false;
currentErrorcode = 1;
break;
}
break;
case 'url-args':
if (checkArgFunc(arg, match[2])) {
options.urlArgs = match[2];
}
break;
default:
require('../lib/less/lessc_helper').printUsage();
continueProcessing = false;
currentErrorcode = 1;
break;
}
});
if (!continueProcessing) {
return;
}
var input = args[1];
var inputbase = args[1];
if (input && input != '-') {
input = path.resolve(process.cwd(), input);
}
var output = args[2];
var outputbase = args[2];
if (output) {
options.sourceMapOutputFilename = output;
output = path.resolve(process.cwd(), output);
if (warningMessages) {
console.log(warningMessages);
}
}
options.sourceMapBasepath = options.sourceMapBasepath || (input ? path.dirname(input) : process.cwd());
if (options.sourceMap === true) {
if (!output && !sourceMapFileInline) {
console.log("the sourcemap option only has an optional filename if the css filename is given");
return;
}
options.sourceMapFullFilename = options.sourceMapOutputFilename + ".map";
options.sourceMap = path.basename(options.sourceMapFullFilename);
}
if (options.cleancss && options.sourceMap) {
console.log("the cleancss option is not compatible with sourcemap support at the moment. See Issue #1656");
return;
}
if (! input) {
console.log("lessc: no input files");
console.log("");
require('../lib/less/lessc_helper').printUsage();
currentErrorcode = 1;
return;
}
var ensureDirectory = function (filepath) {
var dir = path.dirname(filepath),
cmd,
existsSync = fs.existsSync || path.existsSync;
if (!existsSync(dir)) {
if (mkdirp === undefined) {
try {mkdirp = require('mkdirp');}
catch(e) { mkdirp = null; }
}
cmd = mkdirp && mkdirp.sync || fs.mkdirSync;
cmd(dir);
}
};
if (options.depends) {
if (!outputbase) {
console.log("option --depends requires an output path to be specified");
return;
}
process.stdout.write(outputbase + ": ");
}
if (!sourceMapFileInline) {
var writeSourceMap = function(output) {
var filename = options.sourceMapFullFilename || options.sourceMap;
ensureDirectory(filename);
fs.writeFileSync(filename, output, 'utf8');
};
}
var parseLessFile = function (e, data) {
if (e) {
console.log("lessc: " + e.message);
currentErrorcode = 1;
return;
}
data = options.globalVariables + data + '\n' + options.modifyVariables;
options.paths = [path.dirname(input)].concat(options.paths);
options.filename = input;
var parser = new(less.Parser)(options);
parser.parse(data, function (err, tree) {
if (err) {
less.writeError(err, options);
currentErrorcode = 1;
return;
} else if (options.depends) {
for(var file in parser.imports.files) {
process.stdout.write(file + " ")
}
console.log("");
} else {
try {
if (options.lint) { writeSourceMap = function() {} }
var css = tree.toCSS({
silent: options.silent,
verbose: options.verbose,
ieCompat: options.ieCompat,
compress: options.compress,
cleancss: options.cleancss,
cleancssOptions: cleancssOptions,
sourceMap: Boolean(options.sourceMap),
sourceMapFilename: options.sourceMap,
sourceMapURL: options.sourceMapURL,
sourceMapOutputFilename: options.sourceMapOutputFilename,
sourceMapBasepath: options.sourceMapBasepath,
sourceMapRootpath: options.sourceMapRootpath || "",
outputSourceFiles: options.outputSourceFiles,
writeSourceMap: writeSourceMap,
maxLineLen: options.maxLineLen,
strictMath: options.strictMath,
strictUnits: options.strictUnits,
urlArgs: options.urlArgs
});
if(!options.lint) {
if (output) {
ensureDirectory(output);
fs.writeFileSync(output, css, 'utf8');
if (options.verbose) {
console.log('lessc: wrote ' + output);
}
} else {
process.stdout.write(css);
}
}
} catch (e) {
less.writeError(e, options);
currentErrorcode = 2;
return;
}
}
});
};
if (input != '-') {
fs.readFile(input, 'utf8', parseLessFile);
} else {
process.stdin.resume();
process.stdin.setEncoding('utf8');
var buffer = '';
process.stdin.on('data', function(data) {
buffer += data;
});
process.stdin.on('end', function() {
parseLessFile(false, buffer);
});
}

View File

@ -0,0 +1,18 @@
{
"name": "less",
"version": "1.7.4",
"main": "./dist/less-1.7.4.js",
"ignore": [
"**/.*",
"benchmark",
"bin",
"build",
"lib",
"test",
"*.md",
"LICENSE",
"Gruntfile.js",
"package.json",
"bower.json"
]
}

View File

@ -0,0 +1,347 @@
import groovy.io.FileType
import org.apache.tools.ant.taskdefs.condition.Os
import org.gradle.api.tasks.Exec
buildscript {
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath 'com.eriwen:gradle-js-plugin:1.8.0'
classpath 'com.moowork.gradle:gradle-grunt-plugin:0.2'
}
}
apply plugin: 'js'
apply plugin: 'grunt'
repositories {
mavenCentral()
}
configurations {
rhino
}
dependencies {
rhino 'org.mozilla:rhino:1.7R4'
}
project.ext {
packageProps = new groovy.json.JsonSlurper().parseText(new File("package.json").toURL().text)
failures = 0;
rhinoTestSrc = "out/rhino-test-${packageProps.version}.js"
testSrc = 'test/less'
testOut = 'out/test'
}
task runGruntRhino(type: GruntTask) {
gruntArgs = "rhino"
}
combineJs {
dependsOn runGruntRhino
source = ["dist/less-rhino-${packageProps.version}.js", "test/rhino/test-header.js","dist/lessc-rhino-${packageProps.version}.js"]
dest = file(rhinoTestSrc)
}
task testRhino(type: AllRhinoTests) {
// dependsOn 'testRhinoBase'
dependsOn 'testRhinoBase', 'testRhinoErrors', 'testRhinoLegacy', 'testRhinoStaticUrls', 'testRhinoCompression', 'testRhinoDebugAll', 'testRhinoDebugComments', 'testRhinoDebugMediaquery', 'testRhinoNoJsError', 'testRhinoSourceMap'
}
task testRhinoBase(type: RhinoTest) {
options = [ '--strict-math=true', '--relative-urls' ]
}
task testRhinoDebugAll(type: DebugRhinoTest) {
options = [ '--strict-math=true', '--line-numbers=all' ]
testDir = 'debug' + fs
suffix = "-all"
}
task testRhinoDebugComments(type: DebugRhinoTest) {
options = [ '--strict-math=true', '--line-numbers=comments' ]
testDir = 'debug' + fs
suffix = "-comments"
}
task testRhinoDebugMediaquery(type: DebugRhinoTest) {
options = [ '--strict-math=true', '--line-numbers=mediaquery' ]
testDir = 'debug' + fs
suffix = "-mediaquery"
}
task testRhinoErrors(type: RhinoTest) {
options = [ '--strict-math=true', '--strict-units=true' ]
testDir = 'errors/'
expectErrors = true
}
task testRhinoChyby(type: RhinoTest) {
options = [ '--strict-math=true', '--strict-units=true' ]
testDir = 'chyby/'
// expectErrors = true
}
task testRhinoNoJsError(type: RhinoTest) {
options = [ '--strict-math=true', '--strict-units=true', '--no-js' ]
testDir = 'no-js-errors/'
expectErrors = true
}
task testRhinoLegacy(type: RhinoTest) {
testDir = 'legacy/'
}
task testRhinoStaticUrls(type: RhinoTest) {
options = [ '--strict-math=true', '--rootpath=folder (1)/' ]
testDir = 'static-urls/'
}
task testRhinoCompression(type: RhinoTest) {
options = [ '--compress=true' ]
testDir = 'compression/'
}
task testRhinoSourceMap(type: SourceMapRhinoTest) {
options = [ '--strict-math=true', '--strict-units=true']
testDir = 'sourcemaps/'
}
task setupTest {
dependsOn combineJs
doLast {
file(testOut).deleteDir()
}
}
task clean << {
file(rhinoTestSrc).delete()
file(testOut).deleteDir()
}
class SourceMapRhinoTest extends RhinoTest {
// helper to get the output map file
def getOutputMap(lessFile) {
def outFile = project.file(lessFile.path.replace('test/less', project.testOut).replace('.less', '.css'))
return project.file(outFile.path + ".map");
}
// callback to add SourceMap options to the options list
def postProcessOptions(options, lessFile) {
def outFile = getOutputMap(lessFile)
project.file(outFile.parent).mkdirs()
options << "--source-map=${testDir}${lessFile.name.replace('.less','.css')}"
options << "--source-map-basepath=${lessRootDir}"
options << "--source-map-rootpath=testweb/"
options << "--source-map-output-map-file=${outFile}"
options
}
// Callback to validate output
def handleResult(exec, out, lessFile) {
def actualFile = getOutputMap(lessFile)
def expectedFile = project.file(projectDir + fs + "test" + fs + testDir + fs + lessFile.name.replace(".less", ".json"))
assert actualFile.text == expectedFile.text
}
}
class DebugRhinoTest extends RhinoTest {
def escapeIt(it) {
return it.replaceAll("\\\\", "\\\\\\\\").replaceAll("/", "\\\\/").replaceAll(":", "\\\\:").replaceAll("\\.", "\\\\.");
}
def globalReplacements(input, directory) {
def pDirectory = toPlatformFs(directory)
def p = lessRootDir + fs + pDirectory
def pathimport = p + toPlatformFs("import/")
def pathesc = escapeIt(p)
def pathimportesc = escapeIt(pathimport)
def result = input.replace("{path}", p).replace("{pathesc}", pathesc).replace("{pathimport}", pathimport)
return result.replace("{pathimportesc}", pathimportesc).replace("\r\n", "\n")
}
}
class RhinoTest extends DefaultTask {
RhinoTest() {
dependsOn 'setupTest'
}
def suffix = ""
def testDir = ''
def options = []
def expectErrors = false
def fs = File.separator;
def projectDir = toUpperCaseDriveLetter(System.getProperty("user.dir"));
def lessRootDir = projectDir + fs + "test" + fs + "less"
def toUpperCaseDriveLetter(path) {
if (path.charAt(1)==':' && path.charAt(2)=='\\') {
return path.substring(0,1).toUpperCase() + path.substring(1);
}
return path;
}
def toPlatformFs(path) {
return path.replace('\\', fs).replace('/', fs);
}
def expectedCssPath(lessFilePath) {
lessFilePath.replace('.less', "${suffix}.css").replace("${fs}less${fs}", "${fs}css${fs}");
}
def globalReplacements(input, directory) {
return input;
}
def stylize(str, style) {
def styles = [
reset : [0, 0],
bold : [1, 22],
inverse : [7, 27],
underline : [4, 24],
yellow : [33, 39],
green : [32, 39],
red : [31, 39],
grey : [90, 39]
];
return '\033[' + styles[style][0] + 'm' + str +
'\033[' + styles[style][1] + 'm';
}
// Callback for subclasses to make any changes to the options
def postProcessOptions(options, lessFile) {
options
}
// Callback to validate output
def handleResult(exec, out, lessFile) {
def actual = out.toString().trim()
def actualResult = project.file(lessFile.path.replace('test/less', project.testOut).replace('.less', '.css'))
project.file(actualResult.parent).mkdirs()
actualResult << actual
def expected
if (expectErrors) {
assert exec.exitValue != 0
expected = project.file(lessFile.path.replace('.less', '.txt')).text.trim().
replace('{path}', lessFile.parent + '/').
replace('{pathhref}', '').
replace('{404status}', '')
} else {
assert exec.exitValue == 0
def expectedFile = expectedCssPath(lessFile.path)
expected = project.file(expectedFile).text.trim()
expected = globalReplacements(expected, testDir)
}
actual=actual.trim()
actual = actual.replace('\r\n', '\n')
expected = expected.replace('\r\n', '\n')
actual = actual.replace("/","\\")
expected = expected.replace("/","\\")
// println "* actual *"
// println actual
// new File("actual.txt").write(actual)
// println "* expected *"
// println expected
// new File("expected.txt").write(expected)
assert actual == expected
actualResult.delete()
}
@TaskAction
def runTest() {
int testSuccesses = 0, testFailures = 0, testErrors = 0
project.file('test/less/' + testDir).eachFileMatch(FileType.FILES, ~/.*\.less/) { lessFile ->
println "lessfile: $lessFile"
if (!project.hasProperty('test') || lessFile.name.startsWith(project.test)) {
def out = new java.io.ByteArrayOutputStream()
def processedOptions = postProcessOptions([project.rhinoTestSrc, lessFile] + options, lessFile)
def execOptions = {
main = 'org.mozilla.javascript.tools.shell.Main'
// main = 'org.mozilla.javascript.tools.debugger.Main'
classpath = project.configurations.rhino
args = processedOptions
standardOutput = out
ignoreExitValue = true
}
println "rhinoTestSrc: ${project.rhinoTestSrc}"
try {
def exec = project.javaexec(execOptions)
handleResult(exec, out, lessFile)
testSuccesses++
println stylize(' ok', 'green')
}
catch (ex) {
println ex
println()
testErrors++;
}
catch (AssertionError ae) {
println stylize(' failed', 'red')
println ae
testFailures++
}
} else {
println stylize(' skipped', 'yellow')
}
}
println stylize(testSuccesses + ' ok', 'green')
println stylize(testFailures + ' assertion failed', testFailures == 0 ? 'green' : 'red')
println stylize(testErrors + ' errors', testErrors == 0 ? 'green' : 'red')
if (testFailures != 0 || testErrors != 0) {
project.failures++;
}
}
}
class AllRhinoTests extends DefaultTask {
AllRhinoTests() {
}
@TaskAction
def runTest() {
println stylize(project.failures + ' test suites failed', project.failures == 0 ? 'green' : 'red')
}
def stylize(str, style) {
def styles = [
reset : [0, 0],
bold : [1, 22],
inverse : [7, 27],
underline : [4, 24],
yellow : [33, 39],
green : [32, 39],
red : [31, 39],
grey : [90, 39]
];
return '\033[' + styles[style][0] + 'm' + str +
'\033[' + styles[style][1] + 'm';
}
}
class GruntTask extends Exec {
private String gruntExecutable = Os.isFamily(Os.FAMILY_WINDOWS) ? "grunt.cmd" : "grunt"
private String switches = "--no-color"
String gruntArgs = ""
public GruntTask() {
super()
this.setExecutable(gruntExecutable)
}
public void setGruntArgs(String gruntArgs) {
this.args = "$switches $gruntArgs".trim().split(" ") as List
}
}

View File

@ -0,0 +1,53 @@
[![Build Status](https://travis-ci.org/less/less.js.png?branch=master)](https://travis-ci.org/less/less.js)
[![Dependencies](https://david-dm.org/less/less.js.png)](https://david-dm.org/less/less.js) [![devDependency Status](https://david-dm.org/less/less.js/dev-status.png)](https://david-dm.org/less/less.js#info=devDependencies) [![optionalDependency Status](https://david-dm.org/less/less.js/optional-status.png)](https://david-dm.org/less/less.js#info=optionalDependencies)
# [Less.js v<%= pkg.version %>](http://lesscss.org)
> The **dynamic** stylesheet language. [http://lesscss.org](http://lesscss.org).
This is the JavaScript, official, stable version of Less.
## Getting Started
Options for adding Less.js to your project:
* Install with [NPM](https://npmjs.org/): `npm install less`
* [Download the latest release][download]
* Clone the repo: `git clone git://github.com/less/less.js.git`
## More information
For general information on the language, configuration options or usage visit [lesscss.org](http://lesscss.org).
Here are other resources for using Less.js:
* [stackoverflow.com][so] is a great place to get answers about Less.
* [Less.js Issues][issues] for reporting bugs
## Contributing
Please read [CONTRIBUTING.md](./CONTRIBUTING.md). Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).
### Reporting Issues
Before opening any issue, please search for existing issues and read the [Issue Guidelines](https://github.com/necolas/issue-guidelines), written by [Nicolas Gallagher](https://github.com/necolas/). After that if you find a bug or would like to make feature request, [please open a new issue][issues].
Please report documentation issues in [the documentation project](https://github.com/less/less-docs).
### Development
Read [Developing Less](http://lesscss.org/usage/#developing-less).
## Release History
See the [changelog](CHANGELOG.md)
## [License](LICENSE)
Copyright (c) 2009-<%= grunt.template.today("yyyy") %> [Alexis Sellier](http://cloudhead.io/) & The Core Less Team
Licensed under the [Apache License](LICENSE).
[so]: http://stackoverflow.com/questions/tagged/twitter-bootstrap+less "StackOverflow.com"
[issues]: https://github.com/less/less.js/issues "GitHub Issues for Less.js"
[download]: https://github.com/less/less.js/zipball/master "Download Less.js"

View File

@ -0,0 +1,6 @@
// amd.js
//
// Define Less as an AMD module.
if (typeof define === "function" && define.amd) {
define(function () { return less; } );
}

View File

@ -0,0 +1,4 @@
if (typeof(window.less) === 'undefined' || typeof(window.less.nodeType) !== 'undefined') { window.less = {}; }
less = window.less;
tree = window.less.tree = {};
less.mode = 'browser';

View File

@ -0,0 +1,162 @@
###
# NOTICE:
# this file is specifically for controlling
# paths for Less.js source files, as well as
# the order in which source files are
# concatenated.
#
# Please do not add paths for anything else
# to this file. All other paths for testing,
# benchmarking and so on should be controlled
# in the Gruntfile.
###
# Less.js Lib
lib: lib/less
lib_source_map: 'lib/source-map'
# =================================
# General
# =================================
prepend:
browser: ['build/require.js', 'build/browser-header.js']
rhino: ['build/require-rhino.js', 'build/rhino-header.js', 'build/rhino-modules.js']
append:
amd: build/amd.js
browser: <%= build.lib %>/browser.js
rhino: <%= build.lib %>/rhino.js
# =================================
# Core less files
# =================================
# <%= build.less.* %>
less:
parser : <%= build.lib %>/parser.js
functions : <%= build.lib %>/functions.js
colors : <%= build.lib %>/colors.js
tree : <%= build.lib %>/tree.js
treedir : <%= build.lib %>/tree/*.js # glob all files in ./lib/less/tree directory
env : <%= build.lib %>/env.js
visitor : <%= build.lib %>/visitor.js
import_visitor : <%= build.lib %>/import-visitor.js
join : <%= build.lib %>/join-selector-visitor.js
to_css_visitor : <%= build.lib %>/to-css-visitor.js
extend_visitor : <%= build.lib %>/extend-visitor.js
browser : <%= build.lib %>/browser.js
source_map_output: <%= build.lib %>/source-map-output.js
# =================================
# Browser build
# =================================
# <%= build.browser %>
browser:
# prepend utils
- <%= build.prepend.browser %>
# core
- <%= build.less.parser %>
- <%= build.less.functions %>
- <%= build.less.colors %>
- <%= build.less.tree %>
- <%= build.less.treedir %> # glob all files
- <%= build.less.env %>
- <%= build.less.visitor %>
- <%= build.less.import_visitor %>
- <%= build.less.join %>
- <%= build.less.to_css_visitor %>
- <%= build.less.extend_visitor %>
- <%= build.less.source_map_output %>
# append browser-specific code
- <%= build.append.browser %>
- <%= build.append.amd %>
# =================================
# Rhino build
# =================================
# <%= build.rhino %>
rhino:
# prepend utils
- <%= build.prepend.rhino %>
# core
- <%= build.less.parser %>
- <%= build.less.functions %>
- <%= build.less.colors %>
- <%= build.less.tree %>
- <%= build.less.treedir %> # glob all files
- <%= build.less.env %>
- <%= build.less.visitor %>
- <%= build.less.import_visitor %>
- <%= build.less.join %>
- <%= build.less.to_css_visitor %>
- <%= build.less.extend_visitor %>
- <%= build.less.source_map_output %>
- <%= build.source_map %>
# <%= build.rhinolessc %>
rhinolessc:
- <%= build.append.rhino %>
# =================================
# Tree files
# =================================
# <%= build.tree %>
# Technically listing the array out this way isn't
# necessary since we can glob the files in alphabetical
# order anyway. But this gives you control over the order
# the files are used, and allows targeting of individual
# files directly in the Gruntfile. But be we can just
# remove this if files can be concatenated in any order.
tree:
- <%= build.lib %>/tree/alpha.js
- <%= build.lib %>/tree/anonymous.js
- <%= build.lib %>/tree/assignment.js
- <%= build.lib %>/tree/call.js
- <%= build.lib %>/tree/color.js
- <%= build.lib %>/tree/comment.js
- <%= build.lib %>/tree/condition.js
- <%= build.lib %>/tree/detached-ruleset.js
- <%= build.lib %>/tree/dimension.js
- <%= build.lib %>/tree/directive.js
- <%= build.lib %>/tree/element.js
- <%= build.lib %>/tree/expression.js
- <%= build.lib %>/tree/extend.js
- <%= build.lib %>/tree/import.js
- <%= build.lib %>/tree/javascript.js
- <%= build.lib %>/tree/keyword.js
- <%= build.lib %>/tree/media.js
- <%= build.lib %>/tree/mixin.js
- <%= build.lib %>/tree/negative.js
- <%= build.lib %>/tree/operation.js
- <%= build.lib %>/tree/paren.js
- <%= build.lib %>/tree/quoted.js
- <%= build.lib %>/tree/rule.js
- <%= build.lib %>/tree/ruleset.js
- <%= build.lib %>/tree/ruleset-call.js
- <%= build.lib %>/tree/selector.js
- <%= build.lib %>/tree/unicode-descriptor.js
- <%= build.lib %>/tree/url.js
- <%= build.lib %>/tree/value.js
- <%= build.lib %>/tree/variable.js
# =================================
# source-map build
# =================================
# <%= build.source_map %>
source_map:
- <%= build.lib_source_map %>/source-map-header.js
- <%= build.lib_source_map %>/source-map-0.1.31.js
- <%= build.lib_source_map %>/source-map-footer.js

View File

@ -0,0 +1,12 @@
//
// Stub out `require` in rhino
//
function require(arg) {
var split = arg.split('/');
var resultModule = split.length == 1 ? less.modules[split[0]] : less[split[1]];
if (!resultModule) {
throw { message: "Cannot find module '" + arg + "'"};
}
return resultModule;
}

View File

@ -0,0 +1,7 @@
//
// Stub out `require` in the browser
//
function require(arg) {
return window.less[arg.split('/')[1]];
};

View File

@ -0,0 +1,4 @@
if (typeof(window) === 'undefined') { less = {} }
else { less = window.less = {} }
tree = less.tree = {};
less.mode = 'rhino';

View File

@ -0,0 +1,131 @@
(function() {
console = function() {
var stdout = java.lang.System.out;
var stderr = java.lang.System.err;
function doLog(out, type) {
return function() {
var args = java.lang.reflect.Array.newInstance(java.lang.Object, arguments.length - 1);
var format = arguments[0];
var conversionIndex = 0;
// need to look for %d (integer) conversions because in Javascript all numbers are doubles
for (var i = 1; i < arguments.length; i++) {
var arg = arguments[i];
if (conversionIndex != -1) {
conversionIndex = format.indexOf('%', conversionIndex);
}
if (conversionIndex >= 0 && conversionIndex < format.length) {
var conversion = format.charAt(conversionIndex + 1);
if (conversion === 'd' && typeof arg === 'number') {
arg = new java.lang.Integer(new java.lang.Double(arg).intValue());
}
conversionIndex++;
}
args[i-1] = arg;
}
try {
out.println(type + java.lang.String.format(format, args));
} catch(ex) {
stderr.println(ex);
}
}
}
return {
log: doLog(stdout, ''),
info: doLog(stdout, 'INFO: '),
error: doLog(stderr, 'ERROR: '),
warn: doLog(stderr, 'WARN: ')
};
}();
less.modules = {};
less.modules.path = {
join: function() {
var parts = [];
for (i in arguments) {
parts = parts.concat(arguments[i].split(/\/|\\/));
}
var result = [];
for (i in parts) {
var part = parts[i];
if (part === '..' && result.length > 0 && result[result.length-1] !== '..') {
result.pop();
} else if (part === '' && result.length > 0) {
// skip
} else if (part !== '.') {
if (part.slice(-1)==='\\' || part.slice(-1)==='/') {
part = part.slice(0, -1);
}
result.push(part);
}
}
return result.join('/');
},
dirname: function(p) {
var path = p.split('/');
path.pop();
return path.join('/');
},
basename: function(p, ext) {
var base = p.split('/').pop();
if (ext) {
var index = base.lastIndexOf(ext);
if (base.length === index + ext.length) {
base = base.substr(0, index);
}
}
return base;
},
extname: function(p) {
var index = p.lastIndexOf('.');
return index > 0 ? p.substring(index) : '';
}
};
less.modules.fs = {
readFileSync: function(name) {
// read a file into a byte array
var file = new java.io.File(name);
var stream = new java.io.FileInputStream(file);
var buffer = [];
var c;
while ((c = stream.read()) != -1) {
buffer.push(c);
}
stream.close();
return {
length: buffer.length,
toString: function(enc) {
if (enc === 'base64') {
return encodeBase64Bytes(buffer);
} else if (enc) {
return java.lang.String["(byte[],java.lang.String)"](buffer, enc);
} else {
return java.lang.String["(byte[])"](buffer);
}
}
};
}
};
less.encoder = {
encodeBase64: function(str) {
return encodeBase64String(str);
}
};
// ---------------------------------------------------------------------------------------------
// private helper functions
// ---------------------------------------------------------------------------------------------
function encodeBase64Bytes(bytes) {
// requires at least a JRE Platform 6 (or JAXB 1.0 on the classpath)
return javax.xml.bind.DatatypeConverter.printBase64Binary(bytes)
}
function encodeBase64String(str) {
return encodeBase64Bytes(new java.lang.String(str).getBytes());
}
})();

View File

@ -0,0 +1 @@
# Reserved for specialized Less.js tasks.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

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