'use strict'; angular.module('bootstrapVariablesEditor.services', [] ).value('version', '0.2').factory('ap_less', ['$http', function ($http){ var lessEngine = { } ; lessEngine.importVariables = function ($scope, string){ var regex = { variable: /^\s*([^:]*)\s*:\s*([^\\;]*)/, emptyLine: /(^\s*$)/, comment: /(^\s*\/\/.*[^\r\n]*)/, commentMulti: /\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//} ; var parse = function (data){ if (regex.commentMulti.test(data)) { data = _AN_Call_replace('replace', data, regex.commentMulti, ''); } var variables = [] ; var lines = data.split(/\r\n|\r|\n/); lines.forEach(function (line){ if (regex.comment.test(line)) { return ; } else if (regex.emptyLine.test(line)) { return ; } else if (regex.variable.test(line)) { var match = line.match(regex.variable); variables[match[1]] = match[2]; } ; } ); return variables; } ; var vars = parse(string); for (var i = 0; i < _AN_Read_length('length', $scope.variables); i++ ){ for (var j = 0; j < _AN_Read_length('length', $scope.variables[i].data); j++ ){ if (vars[$scope.variables[i].data[j].key]) { $scope.variables[i].data[j].value = vars[$scope.variables[i].data[j].key]; delete vars[$scope.variables[i].data[j].key]; } } } var myVars = { name: 'My Variables', data: [] } ; for (var key in vars){ var type = 'text'; if (key.toLowerCase().indexOf('color')) { type = 'color'; } if (key.toLowerCase().indexOf('fontfamily')) { type = 'font'; } var myVar = { key: key, value: vars[key], type: type} ; myVars.data.push(myVar); } $scope.variables.push(myVars); return $scope; } ; lessEngine.getVariables = function ($scope, all){ var variables = { } ; var fonts = [] ; for (var i = 0; i < _AN_Read_length('length', $scope.variables); i++ ){ for (var j = 0; j < _AN_Read_length('length', $scope.variables[i].data); j++ ){ if ($scope.variables[i].data[j].type == "font") { fonts.push($scope.variables[i].data[j].value); } ; variables[$scope.variables[i].data[j].key] = $scope.variables[i].data[j].value; } } return { variables: variables, fonts: fonts} ; } ; lessEngine.setVariables = function ($scope, vars){ for (var i = 0; i < _AN_Read_length("length", $scope.variables); i++ ){ for (var j = 0; j < _AN_Read_length("length", $scope.variables[i].data); j++ ){ $scope.variables[i].data[j].value = vars[$scope.variables[i].data[j].key]; } } return $scope; } ; lessEngine.getKeys = function ($scope){ var keys = ['escape(@string)', 'percentage(@number)', 'rgb(@r, @g, @b)', 'rgba(@r, @g, @b, @a)', 'hsl(@hue, @saturation, @lightness)', 'hsla(@hue, @saturation, @lightness, @alpha)', 'hsv(@hue, @saturation, @value)', 'hsva(@hue, @saturation, @value, @alpha)', 'saturate(@color, 10%)', 'desaturate(@color, 10%)', 'lighten(@color, 10%)', 'darken(@color, 10%)', 'fadein(@color, 10%)', 'fadeout(@color, 10%)', 'fade(@color, 50%)', 'spin(@color, 10)', 'mix(@color1, @color2, [@weight: 50%])', 'greyscale(@color)', 'contrast(@color1, [@darkcolor: black], [@lightcolor: white], [@threshold: 43%])', 'multiply(@color1, @color2)', 'screen(@color1, @color2)', 'overlay(@color1, @color2)', 'softlight(@color1, @color2)', 'hardlight(@color1, @color2)', 'difference(@color1, @color2)', 'exclusion(@color1, @color2)', 'average(@color1, @color2)', 'negation(@color1, @color2)', 'ceil(@number)', 'floor(@number)', 'percentage(@number)'] ; for (var i = 0; i < _AN_Read_length('length', $scope.variables); i++ ){ for (var j = 0; j < _AN_Read_length('length', $scope.variables[i].data); j++ ){ keys.push($scope.variables[i].data[j].key); } } return keys; } ; lessEngine.getUrls = function ($scope){ var keys = ["'../twitter-bootstrap/img/glyphicons-halflings.png'", "'../twitter-bootstrap/img/glyphicons-halflings-white.png'", "'../twitter-bootstrap/img/ap_icons_black_interface-orientation.png'", "'../twitter-bootstrap/img/ap_icons_white_interface-orientation.png'"] ; return keys; } ; lessEngine.getFonts = function ($scope){ var keys = ["'Helvetica Neue', Helvetica, Arial", "Georgia", "'Courrier New', Consolas", "Impact", "'Lucida Console', Monaco", "'Palatino Linotype','Book Antiqua'", "'Trebuchet MS'", "Tahoma, Geneva", "Verdana, Geneva", "'Times New Roman', Times"] ; $.ajax({ url: "https://www.googleapis.com/webfonts/v1/webfonts?key=AIzaSyBb_pLbXGeesG8wE32FMtywG4Vsfq6Uk_8", type: 'GET', dataType: 'JSONP', success: function (data){ for (var i = 0; i < _AN_Read_length('length', data.items); i++ ){ keys.push(data.items[i].family); } } } ); return keys; } ; lessEngine.getVariablesToString = function ($scope){ var string = "" + "/*\n" + "* Orson http://en.orson.io , autreplanete http://www.autreplanete.com/ \n" + "* \n" + "**/\n"; for (var i = 0; i < _AN_Read_length("length", $scope.variables); i++ ){ string += '\n\n// ' + $scope.variables[i].name + "\n"; for (var j = 0; j < _AN_Read_length("length", $scope.variables[i].data); j++ ){ string += $scope.variables[i].data[j].key + ': ' + $scope.variables[i].data[j].value + ";\n"; } } return string; } ; lessEngine.saveLessVar = function (data){ var $form = $('
').attr('method', 'POST').attr('action', 'http://www.pikock-unis.com/tools/download.php').append($('').attr('type', 'hidden').attr('name', 'data').attr('value', data)).append($('').attr('type', 'hidden').attr('name', 'type').attr('value', 'less')); $('body').append($form); $form.submit(); } ; lessEngine.saveCSS = function ($scope){ var parser = new (less.Parser)({ paths: ['../twitter-bootstrap/less/'] , filename: 'bootstrap.less'} ); _AN_Call_load('load', $(document), $('#twitterBootstrapLess').attr('href'), function (data){ var vars = lessEngine.getVariables($scope).variables; for (name in vars){ data += ((name.slice(0, 1) === '@')? '': '@') + name + ': ' + ((vars[name].slice(-1) === ';')? vars[name]: vars[name] + ';'); } console.log(vars); parser.parse(data, function (err, tree){ if (err) { return console.error(err); } var type = ($scope.minified)? 'mincss': 'css'; var css = tree.toCSS({ compress: $scope.minified} ); console.log(css); var $form = $('').attr('method', 'POST').attr('action', 'http://www.pikock-unis.com/tools/download.php').append($('').attr('type', 'hidden').attr('name', 'data').attr('value', css)).append($('').attr('type', 'hidden').attr('name', 'type').attr('value', type)); $('body').append($form); $form.submit(); } ); } ); } ; return lessEngine; } ] );