Monday, 7 December 2015

SCRIPT TUTORIALS CSSO CSS COMPOSER CODE

SCRIPT TUTORIALS CSSO CSS COMPOSER CODE


-----------------------------------------------------------------------------------------------------------------
COPY AND PASTE BELOW CODE IN POST HTML SECTION
-----------------------------------------------------------------------------------------------------------------

<html>
<head>
<style type='text/css'>
#stats{font-size:22px;font-weight:bold}.wpp-comments{}
.content{border-left:none!important}.syntaxhighlighter .lines.no-wrap{overflow:auto!important;overflow-y:hidden!important}.syntaxhighlighter
auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;background-color:#f7f7f7;border-color:#ebebeb;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);cursor:not-allowed}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:21px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:36px}input.span12,textarea.span12,.uneditable-input.span12{width:982px}input.span11,textarea.span11,.uneditable-input.span11{width:896px}input.span10,textarea.span10,.uneditable-input.span10{width:810px}input.span9,textarea.span9,.uneditable-input.span9{width:724px}input.span8,textarea.span8,.uneditable-input.span8{width:638px}input.span7,textarea.span7,.uneditable-input.span7{width:552px}input.span6,textarea.span6,.uneditable-input.span6{width:466px}input.span5,textarea.span5,.uneditable-input.span5{width:380px}input.span4,textarea.span4,.uneditable-input.span4{width:294px}input.span3,textarea.span3,.uneditable-input.span3{width:208px}input.span2,textarea.span2,.uneditable-input.span2{width:122px}input.span1,textarea.span1,.uneditable-input.span1{width:36px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning
textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning
textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error
textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error
textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success
textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success
textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info
textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info
textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:20px
20px 21px;margin-top:21px;margin-bottom:21px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10.5px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{display:inline-block;margin-bottom:10.5px;vertical-align:middle;font-size:0;white-space:nowrap}.input-append input,.input-append select,.input-append .uneditable-input,.input-append .dropdown-menu,.input-append .popover,.input-prepend input,.input-prepend select,.input-prepend .uneditable-input,.input-prepend .dropdown-menu,.input-prepend
.divider{*width:100%;height:1px;margin:9.5px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px
20px;clear:both;font-weight:normal;line-height:21px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#fff;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0076b2',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0076b2',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown
.container{width:1310px}.span12{width:1310px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:31px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.5641025641026%;*margin-left:2.5139017608897%}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.5641025641026%}.row-fluid
.container{width:748px}.span12{width:748px}.span11{width:684px}.span10{width:620px}.span9{width:556px}.span8{width:492px}.span7{width:428px}.span6{width:364px}.span5{width:300px}.span4{width:236px}.span3{width:172px}.span2{width:108px}.span1{width:44px}.offset12{margin-left:788px}.offset11{margin-left:724px}.offset10{margin-left:660px}.offset9{margin-left:596px}.offset8{margin-left:532px}.offset7{margin-left:468px}.offset6{margin-left:404px}.offset5{margin-left:340px}.offset4{margin-left:276px}.offset3{margin-left:212px}.offset2{margin-left:148px}.offset1{margin-left:84px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:31px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.6737967914439%;*margin-left:2.623595988231%}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.6737967914439%}.row-fluid
</style>
<script>
var $util = {};
$util.cleanInfo = function(tree) {
var r = [];
tree = tree.slice(1);
tree.forEach(function(e) {
r.push(Array.isArray(e) ? $util.cleanInfo(e) : e);
});
return r;
};
$util.treeToString = function(tree, level) {
var spaces = $util.dummySpaces(level),
level = level ? level : 0,
s = (level ? '\n' + spaces : '') + '[';
tree.forEach(function(e) {
s += (Array.isArray(e) ? $util.treeToString(e, level + 1) : e.f !== undefined ? $util.ircToString(e) : ('\'' + e.toString() + '\'')) + ', ';
});
return s.substr(0, s.length - 2) + ']';
};
$util.ircToString = function(o) {
return '{' + o.f + ',' + o.l + '}';
};
$util.dummySpaces = function(num) {
return '                                                  '.substr(0, num * 2);
};
function srcToCSSP(s, rule, _needInfo) {
var TokenType = {
StringSQ: 'StringSQ',
StringDQ: 'StringDQ',
CommentML: 'CommentML',
CommentSL: 'CommentSL',
Newline: 'Newline',
Space: 'Space',
Tab: 'Tab',
ExclamationMark: 'ExclamationMark',         // !
QuotationMark: 'QuotationMark',             // "
NumberSign: 'NumberSign',                   // #
DollarSign: 'DollarSign',                   // $
PercentSign: 'PercentSign',                 // %
Ampersand: 'Ampersand',                     // &
Apostrophe: 'Apostrophe',                   // '
LeftParenthesis: 'LeftParenthesis',         // (
RightParenthesis: 'RightParenthesis',       // )
Asterisk: 'Asterisk',                       // *
PlusSign: 'PlusSign',                       // +
Comma: 'Comma',                             // ,
HyphenMinus: 'HyphenMinus',                 // -
FullStop: 'FullStop',                       // .
Solidus: 'Solidus',                         // /
Colon: 'Colon',                             // :
Semicolon: 'Semicolon',                     // ;
LessThanSign: 'LessThanSign',               // <
EqualsSign: 'EqualsSign',                   // =
GreaterThanSign: 'GreaterThanSign',         // >
QuestionMark: 'QuestionMark',               // ?
CommercialAt: 'CommercialAt',               // @
LeftSquareBracket: 'LeftSquareBracket',     // [
ReverseSolidus: 'ReverseSolidus',           // \
RightSquareBracket: 'RightSquareBracket',   // ]
CircumflexAccent: 'CircumflexAccent',       // ^
LowLine: 'LowLine',                         // _
LeftCurlyBracket: 'LeftCurlyBracket',       // {
VerticalLine: 'VerticalLine',               // |
RightCurlyBracket: 'RightCurlyBracket',     // }
Tilde: 'Tilde',                             // ~
Identifier: 'Identifier',
DecimalNumber: 'DecimalNumber'
};
function getTokens(s) {
var Punctuation,
urlMode = false,
blockMode = 0;
Punctuation = {
' ': TokenType.Space,
'\n': TokenType.Newline,
'\r': TokenType.Newline,
'\t': TokenType.Tab,
'!': TokenType.ExclamationMark,
'"': TokenType.QuotationMark,
'#': TokenType.NumberSign,
'$': TokenType.DollarSign,
'%': TokenType.PercentSign,
'&': TokenType.Ampersand,
'\'': TokenType.Apostrophe,
'(': TokenType.LeftParenthesis,
')': TokenType.RightParenthesis,
'*': TokenType.Asterisk,
'+': TokenType.PlusSign,
',': TokenType.Comma,
'-': TokenType.HyphenMinus,
'.': TokenType.FullStop,
'/': TokenType.Solidus,
':': TokenType.Colon,
';': TokenType.Semicolon,
'<': TokenType.LessThanSign,
'=': TokenType.EqualsSign,
'>': TokenType.GreaterThanSign,
'?': TokenType.QuestionMark,
'@': TokenType.CommercialAt,
'[': TokenType.LeftSquareBracket,
//        '\\': TokenType.ReverseSolidus,
']': TokenType.RightSquareBracket,
'^': TokenType.CircumflexAccent,
'_': TokenType.LowLine,
'{': TokenType.LeftCurlyBracket,
'|': TokenType.VerticalLine,
'}': TokenType.RightCurlyBracket,
'~': TokenType.Tilde
};
function isDecimalDigit(c) {
return '0123456789'.indexOf(c) >= 0;
}
function throwError(message) {
throw message;
}
var buffer = '',
tokens = [],
pos,
tn = 0,
ln = 1;
function _getTokens(s) {
if (!s) return [];
tokens = [];
var c, cn;
for (pos = 0; pos < s.length; pos++) {
c = s.charAt(pos);
cn = s.charAt(pos + 1);
if (c === '/' && cn === '*') {
parseMLComment(s);
} else if (!urlMode && c === '/' && cn === '/') {
if (blockMode > 0) parseIdentifier(s);
else parseSLComment(s);
} else if (c === '"' || c === "'") {
parseString(s, c);
} else if (c === ' ') {
parseSpaces(s)
} else if (c in Punctuation) {
pushToken(Punctuation[c], c);
if (c === '\n' || c === '\r') ln++;
if (c === ')') urlMode = false;
if (c === '{') blockMode++;
if (c === '}') blockMode--;
} else if (isDecimalDigit(c)) {
parseDecimalNumber(s);
} else {
parseIdentifier(s);
}
}
mark();
return tokens;
}
function pushToken(type, value) {
tokens.push({ tn: tn++, ln: ln, type: type, value: value });
}
function parseSpaces(s) {
var start = pos;
for (; pos < s.length; pos++) {
if (s.charAt(pos) !== ' ') break;
}
pushToken(TokenType.Space, s.substring(start, pos));
pos--;
}
function parseMLComment(s) {
var start = pos;
for (pos = pos + 2; pos < s.length; pos++) {
if (s.charAt(pos) === '*') {
if (s.charAt(pos + 1) === '/') {
pos++;
break;
}
}
}
pushToken(TokenType.CommentML, s.substring(start, pos + 1));
}
function parseSLComment(s) {
var start = pos;
for (pos = pos + 2; pos < s.length; pos++) {
if (s.charAt(pos) === '\n' || s.charAt(pos) === '\r') {
pos++;
break;
}
}
pushToken(TokenType.CommentSL, s.substring(start, pos));
pos--;
}
function parseString(s, q) {
var start = pos;
for (pos = pos + 1; pos < s.length; pos++) {
if (s.charAt(pos) === '\\') pos++;
else if (s.charAt(pos) === q) break;
}
pushToken(q === '"' ? TokenType.StringDQ : TokenType.StringSQ, s.substring(start, pos + 1));
}
function parseDecimalNumber(s) {
var start = pos;
for (; pos < s.length; pos++) {
if (!isDecimalDigit(s.charAt(pos))) break;
}
pushToken(TokenType.DecimalNumber, s.substring(start, pos));
pos--;
}
function parseIdentifier(s) {
var start = pos;
while (s.charAt(pos) === '/') pos++;
for (; pos < s.length; pos++) {
if (s.charAt(pos) === '\\') pos++;
else if (s.charAt(pos) in Punctuation) break;
}
var ident = s.substring(start, pos);
urlMode = urlMode || ident === 'url';
pushToken(TokenType.Identifier, ident);
pos--;
}
// ====================================
// second run
// ====================================
function mark() {
var ps = [], // Parenthesis
sbs = [], // SquareBracket
cbs = [], // CurlyBracket
t;
for (var i = 0; i < tokens.length; i++) {
t = tokens[i];
switch(t.type) {
case TokenType.LeftParenthesis:
ps.push(i);
break;
case TokenType.RightParenthesis:
if (ps.length) {
t.left = ps.pop();
tokens[t.left].right = i;
}
break;
case TokenType.LeftSquareBracket:
sbs.push(i);
break;
case TokenType.RightSquareBracket:
if (sbs.length) {
t.left = sbs.pop();
tokens[t.left].right = i;
}
break;
case TokenType.LeftCurlyBracket:
cbs.push(i);
break;
case TokenType.RightCurlyBracket:
if (cbs.length) {
t.left = cbs.pop();
tokens[t.left].right = i;
}
break;
}
}
}
return _getTokens(s);
}
// version: 1.0.0
function getCSSPAST(_tokens, rule, _needInfo) {
var tokens,
pos,
failLN = 0,
currentBlockLN = 0,
needInfo = false;
var CSSPNodeType,
CSSLevel,
CSSPRules;
CSSPNodeType = {
IdentType: 'ident',
AtkeywordType: 'atkeyword',
StringType: 'string',
ShashType: 'shash',
VhashType: 'vhash',
NumberType: 'number',
PercentageType: 'percentage',
DimensionType: 'dimension',
CdoType: 'cdo',
CdcType: 'cdc',
DecldelimType: 'decldelim',
SType: 's',
AttrselectorType: 'attrselector',
AttribType: 'attrib',
NthType: 'nth',
NthselectorType: 'nthselector',
NamespaceType: 'namespace',
ClazzType: 'clazz',
PseudoeType: 'pseudoe',
PseudocType: 'pseudoc',
DelimType: 'delim',
StylesheetType: 'stylesheet',
AtrulebType: 'atruleb',
AtrulesType: 'atrules',
AtrulerqType: 'atrulerq',
AtrulersType: 'atrulers',
AtrulerType: 'atruler',
BlockType: 'block',
RulesetType: 'ruleset',
CombinatorType: 'combinator',
SimpleselectorType: 'simpleselector',
SelectorType: 'selector',
DeclarationType: 'declaration',
PropertyType: 'property',
ImportantType: 'important',
UnaryType: 'unary',
OperatorType: 'operator',
BracesType: 'braces',
ValueType: 'value',
ProgidType: 'progid',
FiltervType: 'filterv',
FilterType: 'filter',
CommentType: 'comment',
UriType: 'uri',
RawType: 'raw',
FunctionBodyType: 'functionBody',
FunktionType: 'funktion',
FunctionExpressionType: 'functionExpression',
UnknownType: 'unknown'
};
CSSPRules = {
'ident': function() { if (checkIdent(pos)) return getIdent() },
'atkeyword': function() { if (checkAtkeyword(pos)) return getAtkeyword() },
'string': function() { if (checkString(pos)) return getString() },
'shash': function() { if (checkShash(pos)) return getShash() },
'vhash': function() { if (checkVhash(pos)) return getVhash() },
'number': function() { if (checkNumber(pos)) return getNumber() },
'percentage': function() { if (checkPercentage(pos)) return getPercentage() },
'dimension': function() { if (checkDimension(pos)) return getDimension() },
//        'cdo': function() { if (checkCDO()) return getCDO() },
//        'cdc': function() { if (checkCDC()) return getCDC() },
'decldelim': function() { if (checkDecldelim(pos)) return getDecldelim() },
's': function() { if (checkS(pos)) return getS() },
'attrselector': function() { if (checkAttrselector(pos)) return getAttrselector() },
'attrib': function() { if (checkAttrib(pos)) return getAttrib() },
'nth': function() { if (checkNth(pos)) return getNth() },
'nthselector': function() { if (checkNthselector(pos)) return getNthselector() },
'namespace': function() { if (checkNamespace(pos)) return getNamespace() },
'clazz': function() { if (checkClazz(pos)) return getClazz() },
'pseudoe': function() { if (checkPseudoe(pos)) return getPseudoe() },
'pseudoc': function() { if (checkPseudoc(pos)) return getPseudoc() },
'delim': function() { if (checkDelim(pos)) return getDelim() },
'stylesheet': function() { if (checkStylesheet(pos)) return getStylesheet() },
'atruleb': function() { if (checkAtruleb(pos)) return getAtruleb() },
'atrules': function() { if (checkAtrules(pos)) return getAtrules() },
'atrulerq': function() { if (checkAtrulerq(pos)) return getAtrulerq() },
'atrulers': function() { if (checkAtrulers(pos)) return getAtrulers() },
'atruler': function() { if (checkAtruler(pos)) return getAtruler() },
'block': function() { if (checkBlock(pos)) return getBlock() },
'ruleset': function() { if (checkRuleset(pos)) return getRuleset() },
'combinator': function() { if (checkCombinator(pos)) return getCombinator() },
'simpleselector': function() { if (checkSimpleselector(pos)) return getSimpleSelector() },
'selector': function() { if (checkSelector(pos)) return getSelector() },
'declaration': function() { if (checkDeclaration(pos)) return getDeclaration() },
'property': function() { if (checkProperty(pos)) return getProperty() },
'important': function() { if (checkImportant(pos)) return getImportant() },
'unary': function() { if (checkUnary(pos)) return getUnary() },
'operator': function() { if (checkOperator(pos)) return getOperator() },
'braces': function() { if (checkBraces(pos)) return getBraces() },
'value': function() { if (checkValue(pos)) return getValue() },
'progid': function() { if (checkProgid(pos)) return getProgid() },
'filterv': function() { if (checkFilterv(pos)) return getFilterv() },
'filter': function() { if (checkFilter(pos)) return getFilter() },
'comment': function() { if (checkComment(pos)) return getComment() },
'uri': function() { if (checkUri(pos)) return getUri() },
'raw': function() { if (checkRaw(pos)) return getRaw() },
'funktion': function() { if (checkFunktion(pos)) return getFunktion() },
'functionExpression': function() { if (checkFunctionExpression(pos)) return getFunctionExpression() },
'unknown': function() { if (checkUnknown(pos)) return getUnknown() }
};
function fail(token) {
if (token && token.ln > failLN) failLN = token.ln;
}
function throwError() {
console.error('Please check the validity of the CSS block starting from the line #' + currentBlockLN);
if (process) process.exit(1);
throw new Error();
}
function _getAST(_tokens, rule, _needInfo) {
tokens = _tokens;
needInfo = _needInfo;
pos = 0;
markSC();
return rule ? CSSPRules[rule]() : CSSPRules['stylesheet']();
}
//any = braces | string | percentage | dimension | number | uri | functionExpression | funktion | ident | unary
function checkAny(_i) {
return checkBraces(_i) ||
checkString(_i) ||
checkPercentage(_i) ||
checkDimension(_i) ||
checkNumber(_i) ||
checkUri(_i) ||
checkFunctionExpression(_i) ||
checkFunktion(_i) ||
checkIdent(_i) ||
checkUnary(_i);
}
function getAny() {
if (checkBraces(pos)) return getBraces();
else if (checkString(pos)) return getString();
else if (checkPercentage(pos)) return getPercentage();
else if (checkDimension(pos)) return getDimension();
else if (checkNumber(pos)) return getNumber();
else if (checkUri(pos)) return getUri();
else if (checkFunctionExpression(pos)) return getFunctionExpression();
else if (checkFunktion(pos)) return getFunktion();
else if (checkIdent(pos)) return getIdent();
else if (checkUnary(pos)) return getUnary();
}
//atkeyword = '@' ident:x -> [#atkeyword, x]
function checkAtkeyword(_i) {
var l;
if (tokens[_i++].type !== TokenType.CommercialAt) return fail(tokens[_i - 1]);
if (l = checkIdent(_i)) return l + 1;
return fail(tokens[_i]);
}
function getAtkeyword() {
var startPos = pos;
pos++;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.AtkeywordType, getIdent()]:
[CSSPNodeType.AtkeywordType, getIdent()];
}
//attrib = '[' sc*:s0 ident:x sc*:s1 attrselector:a sc*:s2 (ident | string):y sc*:s3 ']' -> this.concat([#attrib], s0, [x], s1, [a], s2, [y], s3)
//       | '[' sc*:s0 ident:x sc*:s1 ']' -> this.concat([#attrib], s0, [x], s1),
function checkAttrib(_i) {
if (tokens[_i].type !== TokenType.LeftSquareBracket) return fail(tokens[_i]);
if (!tokens[_i].right) return fail(tokens[_i]);
return tokens[_i].right - _i + 1;
}
function checkAttrib1(_i) {
var start = _i;
_i++;
var l = checkSC(_i); // s0
if (l) _i += l;
if (l = checkIdent(_i)) _i += l; // x
else return fail(tokens[_i]);
if (l = checkSC(_i)) _i += l; // s1
if (l = checkAttrselector(_i)) _i += l; // a
else return fail(tokens[_i]);
if (l = checkSC(_i)) _i += l; // s2
if ((l = checkIdent(_i)) || (l = checkString(_i))) _i += l; // y
else return fail(tokens[_i]);
if (l = checkSC(_i)) _i += l; // s3
if (tokens[_i].type === TokenType.RightSquareBracket) return _i - start;
return fail(tokens[_i]);
}
function getAttrib1() {
var startPos = pos;
pos++;
var a = (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.AttribType] : [CSSPNodeType.AttribType])
.concat(getSC())
.concat([getIdent()])
.concat(getSC())
.concat([getAttrselector()])
.concat(getSC())
.concat([checkString(pos)? getString() : getIdent()])
.concat(getSC());
pos++;
return a;
}
function checkAttrib2(_i) {
var start = _i;
_i++;
var l = checkSC(_i);
if (l) _i += l;
if (l = checkIdent(_i)) _i += l;
if (l = checkSC(_i)) _i += l;
if (tokens[_i].type === TokenType.RightSquareBracket) return _i - start;
return fail(tokens[_i]);
}
function getAttrib2() {
var startPos = pos;
pos++;
var a = (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.AttribType] : [CSSPNodeType.AttribType])
.concat(getSC())
.concat([getIdent()])
.concat(getSC());
pos++;
return a;
}
function getAttrib() {
if (checkAttrib1(pos)) return getAttrib1();
if (checkAttrib2(pos)) return getAttrib2();
}
//attrselector = (seq('=') | seq('~=') | seq('^=') | seq('$=') | seq('*=') | seq('|=')):x -> [#attrselector, x]
function checkAttrselector(_i) {
if (tokens[_i].type === TokenType.EqualsSign) return 1;
if (tokens[_i].type === TokenType.VerticalLine && (!tokens[_i + 1] || tokens[_i + 1].type !== TokenType.EqualsSign)) return 1;
if (!tokens[_i + 1] || tokens[_i + 1].type !== TokenType.EqualsSign) return fail(tokens[_i]);
switch(tokens[_i].type) {
case TokenType.Tilde:
case TokenType.CircumflexAccent:
case TokenType.DollarSign:
case TokenType.Asterisk:
case TokenType.VerticalLine:
return 2;
}
return fail(tokens[_i]);
}
function getAttrselector() {
var startPos = pos,
s = tokens[pos++].value;
if (tokens[pos] && tokens[pos].type === TokenType.EqualsSign) s += tokens[pos++].value;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.AttrselectorType, s] :
[CSSPNodeType.AttrselectorType, s];
}
//atrule = atruler | atruleb | atrules
function checkAtrule(_i) {
var start = _i,
l;
if (tokens[start].atrule_l !== undefined) return tokens[start].atrule_l;
if (l = checkAtruler(_i)) tokens[_i].atrule_type = 1;
else if (l = checkAtruleb(_i)) tokens[_i].atrule_type = 2;
else if (l = checkAtrules(_i)) tokens[_i].atrule_type = 3;
else return fail(tokens[start]);
tokens[start].atrule_l = l;
return l;
}
function getAtrule() {
switch (tokens[pos].atrule_type) {
case 1: return getAtruler();
case 2: return getAtruleb();
case 3: return getAtrules();
}
}
//atruleb = atkeyword:ak tset*:ap block:b -> this.concat([#atruleb, ak], ap, [b])
function checkAtruleb(_i) {
var start = _i,
l;
if (l = checkAtkeyword(_i)) _i += l;
else return fail(tokens[_i]);
if (l = checkTsets(_i)) _i += l;
if (l = checkBlock(_i)) _i += l;
else return fail(tokens[_i]);
return _i - start;
}
function getAtruleb() {
return (needInfo?
[{ ln: tokens[pos].ln }, CSSPNodeType.AtrulebType, getAtkeyword()] :
[CSSPNodeType.AtrulebType, getAtkeyword()])
.concat(getTsets())
.concat([getBlock()]);
}
//atruler = atkeyword:ak atrulerq:x '{' atrulers:y '}' -> [#atruler, ak, x, y]
function checkAtruler(_i) {
var start = _i,
l;
if (l = checkAtkeyword(_i)) _i += l;
else return fail(tokens[_i]);
if (l = checkAtrulerq(_i)) _i += l;
if (_i < tokens.length && tokens[_i].type === TokenType.LeftCurlyBracket) _i++;
else return fail(tokens[_i]);
if (l = checkAtrulers(_i)) _i += l;
if (_i < tokens.length && tokens[_i].type === TokenType.RightCurlyBracket) _i++;
else return fail(tokens[_i]);
return _i - start;
}
function getAtruler() {
var atruler = needInfo?
[{ ln: tokens[pos].ln }, CSSPNodeType.AtrulerType, getAtkeyword(), getAtrulerq()] :
[CSSPNodeType.AtrulerType, getAtkeyword(), getAtrulerq()];
pos++;
atruler.push(getAtrulers());
pos++;
return atruler;
}
//atrulerq = tset*:ap -> [#atrulerq].concat(ap)
function checkAtrulerq(_i) {
return checkTsets(_i);
}
function getAtrulerq() {
return (needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.AtrulerqType] : [CSSPNodeType.AtrulerqType]).concat(getTsets());
}
//atrulers = sc*:s0 ruleset*:r sc*:s1 -> this.concat([#atrulers], s0, r, s1)
function checkAtrulers(_i) {
var start = _i,
l;
if (l = checkSC(_i)) _i += l;
while ((l = checkRuleset(_i)) || (l = checkAtrule(_i)) || (l = checkSC(_i))) {
_i += l;
}
tokens[_i].atrulers_end = 1;
if (l = checkSC(_i)) _i += l;
return _i - start;
}
function getAtrulers() {
var atrulers = (needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.AtrulersType] : [CSSPNodeType.AtrulersType]).concat(getSC()),
x;
while (!tokens[pos].atrulers_end) {
if (checkSC(pos)) {
atrulers = atrulers.concat(getSC());
} else if (checkRuleset(pos)) {
atrulers.push(getRuleset());
} else {
atrulers.push(getAtrule());
}
}
return atrulers.concat(getSC());
}
//atrules = atkeyword:ak tset*:ap ';' -> this.concat([#atrules, ak], ap)
function checkAtrules(_i) {
var start = _i,
l;
if (l = checkAtkeyword(_i)) _i += l;
else return fail(tokens[_i]);
if (l = checkTsets(_i)) _i += l;
if (_i >= tokens.length) return _i - start;
if (tokens[_i].type === TokenType.Semicolon) _i++;
else return fail(tokens[_i]);
return _i - start;
}
function getAtrules() {
var atrules = (needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.AtrulesType, getAtkeyword()] : [CSSPNodeType.AtrulesType, getAtkeyword()]).concat(getTsets());
pos++;
return atrules;
}
//block = '{' blockdecl*:x '}' -> this.concatContent([#block], x)
function checkBlock(_i) {
if (_i < tokens.length && tokens[_i].type === TokenType.LeftCurlyBracket) return tokens[_i].right - _i + 1;
return fail(tokens[_i]);
}
function getBlock() {
var block = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.BlockType] : [CSSPNodeType.BlockType],
end = tokens[pos].right;
pos++;
while (pos < end) {
if (checkBlockdecl(pos)) block = block.concat(getBlockdecl());
else throwError();
}
pos = end + 1;
return block;
}
//blockdecl = sc*:s0 (filter | declaration):x decldelim:y sc*:s1 -> this.concat(s0, [x], [y], s1)
//          | sc*:s0 (filter | declaration):x sc*:s1 -> this.concat(s0, [x], s1)
//          | sc*:s0 decldelim:x sc*:s1 -> this.concat(s0, [x], s1)
//          | sc+:s0 -> s0
function checkBlockdecl(_i) {
var l;
if (l = _checkBlockdecl0(_i)) tokens[_i].bd_type = 1;
else if (l = _checkBlockdecl1(_i)) tokens[_i].bd_type = 2;
else if (l = _checkBlockdecl2(_i)) tokens[_i].bd_type = 3;
else if (l = _checkBlockdecl3(_i)) tokens[_i].bd_type = 4;
else return fail(tokens[_i]);
return l;
}
function getBlockdecl() {
switch (tokens[pos].bd_type) {
case 1: return _getBlockdecl0();
case 2: return _getBlockdecl1();
case 3: return _getBlockdecl2();
case 4: return _getBlockdecl3();
}
}
//sc*:s0 (filter | declaration):x decldelim:y sc*:s1 -> this.concat(s0, [x], [y], s1)
function _checkBlockdecl0(_i) {
var start = _i,
l;
if (l = checkSC(_i)) _i += l;
if (l = checkFilter(_i)) {
tokens[_i].bd_filter = 1;
_i += l;
} else if (l = checkDeclaration(_i)) {
tokens[_i].bd_decl = 1;
_i += l;
} else return fail(tokens[_i]);
if (_i < tokens.length && (l = checkDecldelim(_i))) _i += l;
else return fail(tokens[_i]);
if (l = checkSC(_i)) _i += l;
return _i - start;
}
function _getBlockdecl0() {
return getSC()
.concat([tokens[pos].bd_filter? getFilter() : getDeclaration()])
.concat([getDecldelim()])
.concat(getSC());
}
//sc*:s0 (filter | declaration):x sc*:s1 -> this.concat(s0, [x], s1)
function _checkBlockdecl1(_i) {
var start = _i,
l;
if (l = checkSC(_i)) _i += l;
if (l = checkFilter(_i)) {
tokens[_i].bd_filter = 1;
_i += l;
} else if (l = checkDeclaration(_i)) {
tokens[_i].bd_decl = 1;
_i += l;
} else return fail(tokens[_i]);
if (l = checkSC(_i)) _i += l;
return _i - start;
}
function _getBlockdecl1() {
return getSC()
.concat([tokens[pos].bd_filter? getFilter() : getDeclaration()])
.concat(getSC());
}
//sc*:s0 decldelim:x sc*:s1 -> this.concat(s0, [x], s1)
function _checkBlockdecl2(_i) {
var start = _i,
l;
if (l = checkSC(_i)) _i += l;
if (l = checkDecldelim(_i)) _i += l;
else return fail(tokens[_i]);
if (l = checkSC(_i)) _i += l;
return _i - start;
}
function _getBlockdecl2() {
return getSC()
.concat([getDecldelim()])
.concat(getSC());
}
//sc+:s0 -> s0
function _checkBlockdecl3(_i) {
return checkSC(_i);
}
function _getBlockdecl3() {
return getSC();
}
//braces = '(' tset*:x ')' -> this.concat([#braces, '(', ')'], x)
//       | '[' tset*:x ']' -> this.concat([#braces, '[', ']'], x)
function checkBraces(_i) {
if (_i >= tokens.length ||
(tokens[_i].type !== TokenType.LeftParenthesis &&
tokens[_i].type !== TokenType.LeftSquareBracket)
) return fail(tokens[_i]);
return tokens[_i].right - _i + 1;
}
function getBraces() {
var startPos = pos,
left = pos,
right = tokens[pos].right;
pos++;
var tsets = getTsets();
pos++;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.BracesType, tokens[left].value, tokens[right].value].concat(tsets) :
[CSSPNodeType.BracesType, tokens[left].value, tokens[right].value].concat(tsets);
}
function checkCDC(_i) {}
function checkCDO(_i) {}
// node: Clazz
function checkClazz(_i) {
var l;
if (tokens[_i].clazz_l) return tokens[_i].clazz_l;
if (tokens[_i].type === TokenType.FullStop) {
if (l = checkIdent(_i + 1)) {
tokens[_i].clazz_l = l + 1;
return l + 1;
}
}
return fail(tokens[_i]);
}
function getClazz() {
var startPos = pos;
pos++;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.ClazzType, getIdent()] :
[CSSPNodeType.ClazzType, getIdent()];
}
// node: Combinator
function checkCombinator(_i) {
if (tokens[_i].type === TokenType.PlusSign ||
tokens[_i].type === TokenType.GreaterThanSign ||
tokens[_i].type === TokenType.Tilde) return 1;
return fail(tokens[_i]);
}
function getCombinator() {
return needInfo?
[{ ln: tokens[pos].ln }, CSSPNodeType.CombinatorType, tokens[pos++].value] :
[CSSPNodeType.CombinatorType, tokens[pos++].value];
}
// node: Comment
function checkComment(_i) {
if (tokens[_i].type === TokenType.CommentML) return 1;
return fail(tokens[_i]);
}
function getComment() {
var startPos = pos,
s = tokens[pos].value.substring(2),
l = s.length;
if (s.charAt(l - 2) === '*' && s.charAt(l - 1) === '/') s = s.substring(0, l - 2);
pos++;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.CommentType, s] :
[CSSPNodeType.CommentType, s];
}
// declaration = property:x ':' value:y -> [#declaration, x, y]
function checkDeclaration(_i) {
var start = _i,
l;
if (l = checkProperty(_i)) _i += l;
else return fail(tokens[_i]);
if (_i < tokens.length && tokens[_i].type === TokenType.Colon) _i++;
else return fail(tokens[_i]);
if (l = checkValue(_i)) _i += l;
else return fail(tokens[_i]);
return _i - start;
}
function getDeclaration() {
var declaration = needInfo?
[{ ln: tokens[pos].ln }, CSSPNodeType.DeclarationType, getProperty()] :
[CSSPNodeType.DeclarationType, getProperty()];
pos++;
declaration.push(getValue());
return declaration;
}
// node: Decldelim
function checkDecldelim(_i) {
if (_i < tokens.length && tokens[_i].type === TokenType.Semicolon) return 1;
return fail(tokens[_i]);
}
function getDecldelim() {
var startPos = pos;
pos++;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.DecldelimType] :
[CSSPNodeType.DecldelimType];
}
// node: Delim
function checkDelim(_i) {
if (_i < tokens.length && tokens[_i].type === TokenType.Comma) return 1;
if (_i >= tokens.length) return fail(tokens[tokens.length - 1]);
return fail(tokens[_i]);
}
function getDelim() {
var startPos = pos;
pos++;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.DelimType] :
[CSSPNodeType.DelimType];
}
// node: Dimension
function checkDimension(_i) {
var ln = checkNumber(_i),
li;
if (!ln || (ln && _i + ln >= tokens.length)) return fail(tokens[_i]);
if (li = checkNmName2(_i + ln)) return ln + li;
return fail(tokens[_i]);
}
function getDimension() {
var startPos = pos,
n = getNumber(),
dimension = needInfo ?
[{ ln: tokens[pos].ln }, CSSPNodeType.IdentType, getNmName2()] :
[CSSPNodeType.IdentType, getNmName2()];
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.DimensionType, n, dimension] :
[CSSPNodeType.DimensionType, n, dimension];
}
//filter = filterp:x ':' filterv:y -> [#filter, x, y]
function checkFilter(_i) {
var start = _i,
l;
if (l = checkFilterp(_i)) _i += l;
else return fail(tokens[_i]);
if (tokens[_i].type === TokenType.Colon) _i++;
else return fail(tokens[_i]);
if (l = checkFilterv(_i)) _i += l;
else return fail(tokens[_i]);
return _i - start;
}
function getFilter() {
var filter = needInfo?
[{ ln: tokens[pos].ln }, CSSPNodeType.FilterType, getFilterp()] :
[CSSPNodeType.FilterType, getFilterp()];
pos++;
filter.push(getFilterv());
return filter;
}
//filterp = (seq('-filter') | seq('_filter') | seq('*filter') | seq('-ms-filter') | seq('filter')):t sc*:s0 -> this.concat([#property, [#ident, t]], s0)
function checkFilterp(_i) {
var start = _i,
l,
x;
if (_i < tokens.length) {
if (tokens[_i].value === 'filter') l = 1;
else {
x = joinValues2(_i, 2);
if (x === '-filter' || x === '_filter' || x === '*filter') l = 2;
else {
x = joinValues2(_i, 4);
if (x === '-ms-filter') l = 4;
else return fail(tokens[_i]);
}
}
tokens[start].filterp_l = l;
_i += l;
if (checkSC(_i)) _i += l;
return _i - start;
}
return fail(tokens[_i]);
}
function getFilterp() {
var startPos = pos,
x = joinValues2(pos, tokens[pos].filterp_l),
ident = needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.IdentType, x] : [CSSPNodeType.IdentType, x];
pos += tokens[pos].filterp_l;
return (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.PropertyType, ident] : [CSSPNodeType.PropertyType, ident])
.concat(getSC());
}
//filterv = progid+:x -> [#filterv].concat(x)
function checkFilterv(_i) {
var start = _i,
l;
if (l = checkProgid(_i)) _i += l;
else return fail(tokens[_i]);
while (l = checkProgid(_i)) {
_i += l;
}
tokens[start].last_progid = _i;
if (_i < tokens.length && (l = checkSC(_i))) _i += l;
if (_i < tokens.length && (l = checkImportant(_i))) _i += l;
return _i - start;
}
function getFilterv() {
var filterv = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.FiltervType] : [CSSPNodeType.FiltervType],
last_progid = tokens[pos].last_progid;
while (pos < last_progid) {
filterv.push(getProgid());
}
filterv = filterv.concat(checkSC(pos) ? getSC() : []);
if (pos < tokens.length && checkImportant(pos)) filterv.push(getImportant());
return filterv;
}
//functionExpression = ``expression('' functionExpressionBody*:x ')' -> [#functionExpression, x.join('')],
function checkFunctionExpression(_i) {
var start = _i;
if (!tokens[_i] || tokens[_i++].value !== 'expression') return fail(tokens[_i - 1]);
if (!tokens[_i] || tokens[_i].type !== TokenType.LeftParenthesis) return fail(tokens[_i]);
return tokens[_i].right - start + 1;
}
function getFunctionExpression() {
var startPos = pos;
pos++;
var e = joinValues(pos + 1, tokens[pos].right - 1);
pos = tokens[pos].right + 1;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.FunctionExpressionType, e] :
[CSSPNodeType.FunctionExpressionType, e];
}
//funktion = ident:x '(' functionBody:y ')' -> [#funktion, x, y]
function checkFunktion(_i) {
var start = _i,
l = checkIdent(_i);
if (!l) return fail(tokens[_i]);
_i += l;
if (_i >= tokens.length || tokens[_i].type !== TokenType.LeftParenthesis) return fail(tokens[_i - 1]);
return tokens[_i].right - start + 1;
}
function getFunktion() {
var startPos = pos,
ident = getIdent();
pos++;
var body = ident[needInfo? 2 : 1] !== 'not'?
getFunctionBody() :
getNotFunctionBody(); // ok, here we have CSS3 initial draft: http://dev.w3.org/csswg/selectors3/#negation
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.FunktionType, ident, body] :
[CSSPNodeType.FunktionType, ident, body];
}
function getFunctionBody() {
var startPos = pos,
body = [],
x;
while (tokens[pos].type !== TokenType.RightParenthesis) {
if (checkTset(pos)) {
x = getTset();
if ((needInfo && typeof x[1] === 'string') || typeof x[0] === 'string') body.push(x);
else body = body.concat(x);
} else if (checkClazz(pos)) {
body.push(getClazz());
} else {
throwError();
}
}
pos++;
return (needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.FunctionBodyType] :
[CSSPNodeType.FunctionBodyType]
).concat(body);
}
function getNotFunctionBody() {
var startPos = pos,
body = [],
x;
while (tokens[pos].type !== TokenType.RightParenthesis) {
if (checkSimpleselector(pos)) {
body.push(getSimpleSelector());
} else {
throwError();
}
}
pos++;
return (needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.FunctionBodyType] :
[CSSPNodeType.FunctionBodyType]
).concat(body);
}
// node: Ident
function checkIdent(_i) {
var start = _i,
wasIdent = false;
// start char / word
if (_i < tokens.length &&
(tokens[_i].type === TokenType.HyphenMinus ||
tokens[_i].type === TokenType.LowLine ||
tokens[_i].type === TokenType.Identifier ||
tokens[_i].type === TokenType.DollarSign ||
tokens[_i].type === TokenType.Asterisk)) _i++;
else return fail(tokens[_i]);
wasIdent = tokens[_i - 1].type === TokenType.Identifier;
for (; _i < tokens.length; _i++) {
if (tokens[_i].type !== TokenType.HyphenMinus &&
tokens[_i].type !== TokenType.LowLine) {
if (tokens[_i].type !== TokenType.Identifier &&
(tokens[_i].type !== TokenType.DecimalNumber || !wasIdent)
) break;
else wasIdent = true;
}
}
if (!wasIdent && tokens[start].type !== TokenType.Asterisk) return fail(tokens[_i]);
tokens[start].ident_last = _i - 1;
return _i - start;
}
function getIdent() {
var startPos = pos,
s = joinValues(pos, tokens[pos].ident_last);
pos = tokens[pos].ident_last + 1;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.IdentType, s] :
[CSSPNodeType.IdentType, s];
}
//important = '!' sc*:s0 seq('important') -> [#important].concat(s0)
function checkImportant(_i) {
var start = _i,
l;
if (tokens[_i++].type !== TokenType.ExclamationMark) return fail(tokens[_i - 1]);
if (l = checkSC(_i)) _i += l;
if (tokens[_i].value !== 'important') return fail(tokens[_i]);
return _i - start + 1;
}
function getImportant() {
var startPos = pos;
pos++;
var sc = getSC();
pos++;
return (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.ImportantType] : [CSSPNodeType.ImportantType]).concat(sc);
}
// node: Namespace
function checkNamespace(_i) {
if (tokens[_i].type === TokenType.VerticalLine) return 1;
return fail(tokens[_i]);
}
function getNamespace() {
var startPos = pos;
pos++;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.NamespaceType] :
[CSSPNodeType.NamespaceType];
}
//nth = (digit | 'n')+:x -> [#nth, x.join('')]
//    | (seq('even') | seq('odd')):x -> [#nth, x]
function checkNth(_i) {
return checkNth1(_i) || checkNth2(_i);
}
function checkNth1(_i) {
var start = _i;
for (; _i < tokens.length; _i++) {
if (tokens[_i].type !== TokenType.DecimalNumber && tokens[_i].value !== 'n') break;
}
if (_i !== start) {
tokens[start].nth_last = _i - 1;
return _i - start;
}
return fail(tokens[_i]);
}
function getNth() {
var startPos = pos;
if (tokens[pos].nth_last) {
var n = needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.NthType, joinValues(pos, tokens[pos].nth_last)] :
[CSSPNodeType.NthType, joinValues(pos, tokens[pos].nth_last)];
pos = tokens[pos].nth_last + 1;
return n;
}
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.NthType, tokens[pos++].value] :
[CSSPNodeType.NthType, tokens[pos++].value];
}
function checkNth2(_i) {
if (tokens[_i].value === 'even' || tokens[_i].value === 'odd') return 1;
return fail(tokens[_i]);
}
//nthf = ':' seq('nth-'):x (seq('child') | seq('last-child') | seq('of-type') | seq('last-of-type')):y -> (x + y)
function checkNthf(_i) {
var start = _i,
l = 0;
if (tokens[_i++].type !== TokenType.Colon) return fail(tokens[_i - 1]); l++;
if (tokens[_i++].value !== 'nth' || tokens[_i++].value !== '-') return fail(tokens[_i - 1]); l += 2;
if ('child' === tokens[_i].value) {
l += 1;
} else if ('last-child' === tokens[_i].value +
tokens[_i + 1].value +
tokens[_i + 2].value) {
l += 3;
} else if ('of-type' === tokens[_i].value +
tokens[_i + 1].value +
tokens[_i + 2].value) {
l += 3;
} else if ('last-of-type' === tokens[_i].value +
tokens[_i + 1].value +
tokens[_i + 2].value +
tokens[_i + 3].value +
tokens[_i + 4].value) {
l += 5;
} else return fail(tokens[_i]);
tokens[start + 1].nthf_last = start + l - 1;
return l;
}
function getNthf() {
pos++;
var s = joinValues(pos, tokens[pos].nthf_last);
pos = tokens[pos].nthf_last + 1;
return s;
}
//nthselector = nthf:x '(' (sc | unary | nth)*:y ')' -> [#nthselector, [#ident, x]].concat(y)
function checkNthselector(_i) {
var start = _i,
l;
if (l = checkNthf(_i)) _i += l;
else return fail(tokens[_i]);
if (tokens[_i].type !== TokenType.LeftParenthesis || !tokens[_i].right) return fail(tokens[_i]);
l++;
var rp = tokens[_i++].right;
while (_i < rp) {
if (l = checkSC(_i)) _i += l;
else if (l = checkUnary(_i)) _i += l;
else if (l = checkNth(_i)) _i += l;
else return fail(tokens[_i]);
}
return rp - start + 1;
}
function getNthselector() {
var startPos = pos,
nthf = needInfo?
[{ ln: tokens[pos].ln }, CSSPNodeType.IdentType, getNthf()] :
[CSSPNodeType.IdentType, getNthf()],
ns = needInfo?
[{ ln: tokens[pos].ln }, CSSPNodeType.NthselectorType, nthf] :
[CSSPNodeType.NthselectorType, nthf];
pos++;
while (tokens[pos].type !== TokenType.RightParenthesis) {
if (checkSC(pos)) ns = ns.concat(getSC());
else if (checkUnary(pos)) ns.push(getUnary());
else if (checkNth(pos)) ns.push(getNth());
}
pos++;
return ns;
}
// node: Number
function checkNumber(_i) {
if (_i < tokens.length && tokens[_i].number_l) return tokens[_i].number_l;
if (_i < tokens.length && tokens[_i].type === TokenType.DecimalNumber &&
(!tokens[_i + 1] ||
(tokens[_i + 1] && tokens[_i + 1].type !== TokenType.FullStop))
) return (tokens[_i].number_l = 1, tokens[_i].number_l); // 10
if (_i < tokens.length &&
tokens[_i].type === TokenType.DecimalNumber &&
tokens[_i + 1] && tokens[_i + 1].type === TokenType.FullStop &&
(!tokens[_i + 2] || (tokens[_i + 2].type !== TokenType.DecimalNumber))
) return (tokens[_i].number_l = 2, tokens[_i].number_l); // 10.
if (_i < tokens.length &&
tokens[_i].type === TokenType.FullStop &&
tokens[_i + 1].type === TokenType.DecimalNumber
) return (tokens[_i].number_l = 2, tokens[_i].number_l); // .10
if (_i < tokens.length &&
tokens[_i].type === TokenType.DecimalNumber &&
tokens[_i + 1] && tokens[_i + 1].type === TokenType.FullStop &&
tokens[_i + 2] && tokens[_i + 2].type === TokenType.DecimalNumber
) return (tokens[_i].number_l = 3, tokens[_i].number_l); // 10.10
return fail(tokens[_i]);
}
function getNumber() {
var s = '',
startPos = pos,
l = tokens[pos].number_l;
for (var i = 0; i < l; i++) {
s += tokens[pos + i].value;
}
pos += l;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.NumberType, s] :
[CSSPNodeType.NumberType, s];
}
// node: Operator
function checkOperator(_i) {
if (_i < tokens.length &&
(tokens[_i].type === TokenType.Solidus ||
tokens[_i].type === TokenType.Comma ||
tokens[_i].type === TokenType.Colon ||
tokens[_i].type === TokenType.EqualsSign)) return 1;
return fail(tokens[_i]);
}
function getOperator() {
return needInfo?
[{ ln: tokens[pos].ln }, CSSPNodeType.OperatorType, tokens[pos++].value] :
[CSSPNodeType.OperatorType, tokens[pos++].value];
}
// node: Percentage
function checkPercentage(_i) {
var x = checkNumber(_i);
if (!x || (x && _i + x >= tokens.length)) return fail(tokens[_i]);
if (tokens[_i + x].type === TokenType.PercentSign) return x + 1;
return fail(tokens[_i]);
}
function getPercentage() {
var startPos = pos,
n = getNumber();
pos++;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.PercentageType, n] :
[CSSPNodeType.PercentageType, n];
}
//progid = sc*:s0 seq('progid:DXImageTransform.Microsoft.'):x letter+:y '(' (m_string | m_comment | ~')' char)+:z ')' sc*:s1
//                -> this.concat([#progid], s0, [[#raw, x + y.join('') + '(' + z.join('') + ')']], s1),
function checkProgid(_i) {
var start = _i,
l,
x;
if (l = checkSC(_i)) _i += l;
if ((x = joinValues2(_i, 6)) === 'progid:DXImageTransform.Microsoft.') {
_start = _i;
_i += 6;
} else return fail(tokens[_i - 1]);
if (l = checkIdent(_i)) _i += l;
else return fail(tokens[_i]);
if (l = checkSC(_i)) _i += l;
if (tokens[_i].type === TokenType.LeftParenthesis) {
tokens[start].progid_end = tokens[_i].right;
_i = tokens[_i].right + 1;
} else return fail(tokens[_i]);
if (l = checkSC(_i)) _i += l;
return _i - start;
}
function getProgid() {
var startPos = pos,
progid_end = tokens[pos].progid_end;
return (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.ProgidType] : [CSSPNodeType.ProgidType])
.concat(getSC())
.concat([_getProgid(progid_end)])
.concat(getSC());
}
function _getProgid(progid_end) {
var startPos = pos,
x = joinValues(pos, progid_end);
pos = progid_end + 1;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.RawType, x] :
[CSSPNodeType.RawType, x];
}
//property = ident:x sc*:s0 -> this.concat([#property, x], s0)
function checkProperty(_i) {
var start = _i,
l;
if (l = checkIdent(_i)) _i += l;
else return fail(tokens[_i]);
if (l = checkSC(_i)) _i += l;
return _i - start;
}
function getProperty() {
var startPos = pos;
return (needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.PropertyType, getIdent()] :
[CSSPNodeType.PropertyType, getIdent()])
.concat(getSC());
}
function checkPseudo(_i) {
return checkPseudoe(_i) ||
checkPseudoc(_i);
}
function getPseudo() {
if (checkPseudoe(pos)) return getPseudoe();
if (checkPseudoc(pos)) return getPseudoc();
}
function checkPseudoe(_i) {
var l;
if (tokens[_i++].type !== TokenType.Colon) return fail(tokens[_i - 1]);
if (tokens[_i++].type !== TokenType.Colon) return fail(tokens[_i - 1]);
if (l = checkIdent(_i)) return l + 2;
return fail(tokens[_i]);
}
function getPseudoe() {
var startPos = pos;
pos += 2;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.PseudoeType, getIdent()] :
[CSSPNodeType.PseudoeType, getIdent()];
}
//pseudoc = ':' (funktion | ident):x -> [#pseudoc, x]
function checkPseudoc(_i) {
var l;
if (tokens[_i++].type !== TokenType.Colon) return fail(tokens[_i - 1]);
if ((l = checkFunktion(_i)) || (l = checkIdent(_i))) return l + 1;
return fail(tokens[_i]);
}
function getPseudoc() {
var startPos = pos;
pos++;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.PseudocType, checkFunktion(pos)? getFunktion() : getIdent()] :
[CSSPNodeType.PseudocType, checkFunktion(pos)? getFunktion() : getIdent()];
}
//ruleset = selector*:x block:y -> this.concat([#ruleset], x, [y])
function checkRuleset(_i) {
var start = _i,
l;
if (tokens[start].ruleset_l !== undefined) return tokens[start].ruleset_l;
while (l = checkSelector(_i)) {
_i += l;
}
if (l = checkBlock(_i)) _i += l;
else return fail(tokens[_i]);
tokens[start].ruleset_l = _i - start;
return _i - start;
}
function getRuleset() {
var ruleset = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.RulesetType] : [CSSPNodeType.RulesetType];
while (!checkBlock(pos)) {
ruleset.push(getSelector());
}
ruleset.push(getBlock());
return ruleset;
}
// node: S
function checkS(_i) {
if (tokens[_i].ws) return tokens[_i].ws_last - _i + 1;
return fail(tokens[_i]);
}
function getS() {
var startPos = pos,
s = joinValues(pos, tokens[pos].ws_last);
pos = tokens[pos].ws_last + 1;
return needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.SType, s] : [CSSPNodeType.SType, s];
}
function checkSC(_i) {
var l,
lsc = 0;
while (_i < tokens.length) {
if (!(l = checkS(_i)) && !(l = checkComment(_i))) break;
_i += l;
lsc += l;
}
if (lsc) return lsc;
if (_i >= tokens.length) return fail(tokens[tokens.length - 1]);
return fail(tokens[_i]);
}
function getSC() {
var sc = [];
while (pos < tokens.length) {
if (checkS(pos)) sc.push(getS());
else if (checkComment(pos)) sc.push(getComment());
else break;
}
return sc;
}
//selector = (simpleselector | delim)+:x -> this.concat([#selector], x)
function checkSelector(_i) {
var start = _i,
l;
if (_i < tokens.length) {
while (l = checkSimpleselector(_i) || checkDelim(_i)) {
_i += l;
}
tokens[start].selector_end = _i - 1;
return _i - start;
}
}
function getSelector() {
var selector = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.SelectorType] : [CSSPNodeType.SelectorType],
selector_end = tokens[pos].selector_end;
while (pos <= selector_end) {
selector.push(checkDelim(pos) ? getDelim() : getSimpleSelector());
}
return selector;
}
// node: Shash
function checkShash(_i) {
if (tokens[_i].type !== TokenType.NumberSign) return fail(tokens[_i]);
var l = checkNmName(_i + 1);
if (l) return l + 1;
return fail(tokens[_i]);
}
function getShash() {
var startPos = pos;
pos++;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.ShashType, getNmName()] :
[CSSPNodeType.ShashType, getNmName()];
}
//simpleselector = (nthselector | combinator | attrib | pseudo | clazz | shash | any | sc | namespace)+:x -> this.concatContent([#simpleselector], [x])
function checkSimpleselector(_i) {
var start = _i,
l;
while (_i < tokens.length) {
if (l = _checkSimpleSelector(_i)) _i += l;
else break;
}
if (_i - start) return _i - start;
if (_i >= tokens.length) return fail(tokens[tokens.length - 1]);
return fail(tokens[_i]);
}
function _checkSimpleSelector(_i) {
return checkNthselector(_i) ||
checkCombinator(_i) ||
checkAttrib(_i) ||
checkPseudo(_i) ||
checkClazz(_i) ||
checkShash(_i) ||
checkAny(_i) ||
checkSC(_i) ||
checkNamespace(_i);
}
function getSimpleSelector() {
var ss = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.SimpleselectorType] : [CSSPNodeType.SimpleselectorType],
t;
while (pos < tokens.length && _checkSimpleSelector(pos)) {
t = _getSimpleSelector();
if ((needInfo && typeof t[1] === 'string') || typeof t[0] === 'string') ss.push(t);
else ss = ss.concat(t);
}
return ss;
}
function _getSimpleSelector() {
if (checkNthselector(pos)) return getNthselector();
else if (checkCombinator(pos)) return getCombinator();
else if (checkAttrib(pos)) return getAttrib();
else if (checkPseudo(pos)) return getPseudo();
else if (checkClazz(pos)) return getClazz();
else if (checkShash(pos)) return getShash();
else if (checkAny(pos)) return getAny();
else if (checkSC(pos)) return getSC();
else if (checkNamespace(pos)) return getNamespace();
}
// node: String
function checkString(_i) {
if (_i < tokens.length &&
(tokens[_i].type === TokenType.StringSQ || tokens[_i].type === TokenType.StringDQ)
) return 1;
return fail(tokens[_i]);
}
function getString() {
var startPos = pos;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.StringType, tokens[pos++].value] :
[CSSPNodeType.StringType, tokens[pos++].value];
}
//stylesheet = (cdo | cdc | sc | statement)*:x -> this.concat([#stylesheet], x)
function checkStylesheet(_i) {
var start = _i,
l;
while (_i < tokens.length) {
if (l = checkSC(_i)) _i += l;
else {
currentBlockLN = tokens[_i].ln;
if (l = checkAtrule(_i)) _i += l;
else if (l = checkRuleset(_i)) _i += l;
else if (l = checkUnknown(_i)) _i += l;
else throwError();
}
}
return _i - start;
}
function getStylesheet(_i) {
var t,
stylesheet = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.StylesheetType] : [CSSPNodeType.StylesheetType];
while (pos < tokens.length) {
if (checkSC(pos)) stylesheet = stylesheet.concat(getSC());
else {
currentBlockLN = tokens[pos].ln;
if (checkRuleset(pos)) stylesheet.push(getRuleset());
else if (checkAtrule(pos)) stylesheet.push(getAtrule());
else if (checkUnknown(pos)) stylesheet.push(getUnknown());
else throwError();
}
}
return stylesheet;
}
//tset = vhash | any | sc | operator
function checkTset(_i) {
return checkVhash(_i) ||
checkAny(_i) ||
checkSC(_i) ||
checkOperator(_i);
}
function getTset() {
if (checkVhash(pos)) return getVhash();
else if (checkAny(pos)) return getAny();
else if (checkSC(pos)) return getSC();
else if (checkOperator(pos)) return getOperator();
}
function checkTsets(_i) {
var start = _i,
l;
while (l = checkTset(_i)) {
_i += l;
}
return _i - start;
}
function getTsets() {
var tsets = [],
x;
while (x = getTset()) {
if ((needInfo && typeof x[1] === 'string') || typeof x[0] === 'string') tsets.push(x);
else tsets = tsets.concat(x);
}
return tsets;
}
// node: Unary
function checkUnary(_i) {
if (_i < tokens.length &&
(tokens[_i].type === TokenType.HyphenMinus ||
tokens[_i].type === TokenType.PlusSign)
) return 1;
return fail(tokens[_i]);
}
function getUnary() {
var startPos = pos;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.UnaryType, tokens[pos++].value] :
[CSSPNodeType.UnaryType, tokens[pos++].value];
}
// node: Unknown
function checkUnknown(_i) {
if (_i < tokens.length && tokens[_i].type === TokenType.CommentSL) return 1;
return fail(tokens[_i]);
}
function getUnknown() {
var startPos = pos;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.UnknownType, tokens[pos++].value] :
[CSSPNodeType.UnknownType, tokens[pos++].value];
}
//    uri = seq('url(') sc*:s0 string:x sc*:s1 ')' -> this.concat([#uri], s0, [x], s1)
//        | seq('url(') sc*:s0 (~')' ~m_w char)*:x sc*:s1 ')' -> this.concat([#uri], s0, [[#raw, x.join('')]], s1),
function checkUri(_i) {
var start = _i,
l;
if (_i < tokens.length && tokens[_i++].value !== 'url') return fail(tokens[_i - 1]);
if (!tokens[_i] || tokens[_i].type !== TokenType.LeftParenthesis) return fail(tokens[_i]);
return tokens[_i].right - start + 1;
}
function getUri() {
var startPos = pos,
uriExcluding = {};
pos += 2;
uriExcluding[TokenType.Space] = 1;
uriExcluding[TokenType.Tab] = 1;
uriExcluding[TokenType.Newline] = 1;
uriExcluding[TokenType.LeftParenthesis] = 1;
uriExcluding[TokenType.RightParenthesis] = 1;
if (checkUri1(pos)) {
var uri = (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.UriType] : [CSSPNodeType.UriType])
.concat(getSC())
.concat([getString()])
.concat(getSC());
pos++;
return uri;
} else {
var uri = (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.UriType] : [CSSPNodeType.UriType])
.concat(getSC()),
l = checkExcluding(uriExcluding, pos),
raw = needInfo?
[{ ln: tokens[pos].ln }, CSSPNodeType.RawType, joinValues(pos, pos + l)] :
[CSSPNodeType.RawType, joinValues(pos, pos + l)];
uri.push(raw);
pos += l + 1;
uri = uri.concat(getSC());
pos++;
return uri;
}
}
function checkUri1(_i) {
var start = _i,
l = checkSC(_i);
if (l) _i += l;
if (tokens[_i].type !== TokenType.StringDQ && tokens[_i].type !== TokenType.StringSQ) return fail(tokens[_i]);
_i++;
if (l = checkSC(_i)) _i += l;
return _i - start;
}
// value = (sc | vhash | any | block | atkeyword | operator | important)+:x -> this.concat([#value], x)
function checkValue(_i) {
var start = _i,
l;
while (_i < tokens.length) {
if (l = _checkValue(_i)) _i += l;
else break;
}
if (_i - start) return _i - start;
return fail(tokens[_i]);
}
function _checkValue(_i) {
return checkSC(_i) ||
checkVhash(_i) ||
checkAny(_i) ||
checkBlock(_i) ||
checkAtkeyword(_i) ||
checkOperator(_i) ||
checkImportant(_i);
}
function getValue() {
var ss = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.ValueType] : [CSSPNodeType.ValueType],
t;
while (pos < tokens.length && _checkValue(pos)) {
t = _getValue();
if ((needInfo && typeof t[1] === 'string') || typeof t[0] === 'string') ss.push(t);
else ss = ss.concat(t);
}
return ss;
}
function _getValue() {
if (checkSC(pos)) return getSC();
else if (checkVhash(pos)) return getVhash();
else if (checkAny(pos)) return getAny();
else if (checkBlock(pos)) return getBlock();
else if (checkAtkeyword(pos)) return getAtkeyword();
else if (checkOperator(pos)) return getOperator();
else if (checkImportant(pos)) return getImportant();
}
// node: Vhash
function checkVhash(_i) {
if (_i >= tokens.length || tokens[_i].type !== TokenType.NumberSign) return fail(tokens[_i]);
var l = checkNmName2(_i + 1);
if (l) return l + 1;
return fail(tokens[_i]);
}
function getVhash() {
var startPos = pos;
pos++;
return needInfo?
[{ ln: tokens[startPos].ln }, CSSPNodeType.VhashType, getNmName2()] :
[CSSPNodeType.VhashType, getNmName2()];
}
function checkNmName(_i) {
var start = _i;
// start char / word
if (tokens[_i].type === TokenType.HyphenMinus ||
tokens[_i].type === TokenType.LowLine ||
tokens[_i].type === TokenType.Identifier ||
tokens[_i].type === TokenType.DecimalNumber) _i++;
else return fail(tokens[_i]);
for (; _i < tokens.length; _i++) {
if (tokens[_i].type !== TokenType.HyphenMinus &&
tokens[_i].type !== TokenType.LowLine &&
tokens[_i].type !== TokenType.Identifier &&
tokens[_i].type !== TokenType.DecimalNumber) break;
}
tokens[start].nm_name_last = _i - 1;
return _i - start;
}
function getNmName() {
var s = joinValues(pos, tokens[pos].nm_name_last);
pos = tokens[pos].nm_name_last + 1;
return s;
}
function checkNmName2(_i) {
var start = _i;
if (tokens[_i].type === TokenType.Identifier) return 1;
else if (tokens[_i].type !== TokenType.DecimalNumber) return fail(tokens[_i]);
_i++;
if (!tokens[_i] || tokens[_i].type !== TokenType.Identifier) return 1;
return 2;
}
function getNmName2() {
var s = tokens[pos].value;
if (tokens[pos++].type === TokenType.DecimalNumber &&
pos < tokens.length &&
tokens[pos].type === TokenType.Identifier
) s += tokens[pos++].value;
return s;
}
function checkExcluding(exclude, _i) {
var start = _i;
while(_i < tokens.length) {
if (exclude[tokens[_i++].type]) break;
}
return _i - start - 2;
}
function joinValues(start, finish) {
var s = '';
for (var i = start; i < finish + 1; i++) {
s += tokens[i].value;
}
return s;
}
function joinValues2(start, num) {
if (start + num - 1 >= tokens.length) return;
var s = '';
for (var i = 0; i < num; i++) {
s += tokens[start + i].value;
}
return s;
}
function markSC() {
var ws = -1, // whitespaces
sc = -1, // ws and comments
t;
for (var i = 0; i < tokens.length; i++) {
t = tokens[i];
switch (t.type) {
case TokenType.Space:
case TokenType.Tab:
case TokenType.Newline:
t.ws = true;
t.sc = true;
if (ws === -1) ws = i;
if (sc === -1) sc = i;
break;
case TokenType.CommentML:
if (ws !== -1) {
tokens[ws].ws_last = i - 1;
ws = -1;
}
t.sc = true;
break;
default:
if (ws !== -1) {
tokens[ws].ws_last = i - 1;
ws = -1;
}
if (sc !== -1) {
tokens[sc].sc_last = i - 1;
sc = -1;
}
}
}
if (ws !== -1) tokens[ws].ws_last = i - 1;
if (sc !== -1) tokens[sc].sc_last = i - 1;
}
return _getAST(_tokens, rule, _needInfo);
}
return getCSSPAST(getTokens(s), rule, _needInfo);
}
var translator = new CSSOTranslator(),
cleanInfo = $util.cleanInfo;
function TRBL(name, imp) {
this.name = TRBL.extractMain(name);
this.sides = {
'top': null,
'right': null,
'bottom': null,
'left': null
};
this.imp = imp ? 4 : 0;
}
TRBL.props = {
'margin': 1,
'margin-top': 1,
'margin-right': 1,
'margin-bottom': 1,
'margin-left': 1,
'padding': 1,
'padding-top': 1,
'padding-right': 1,
'padding-bottom': 1,
'padding-left': 1
};
TRBL.extractMain = function(name) {
var i = name.indexOf('-');
return i === -1 ? name : name.substr(0, i);
};
TRBL.prototype.impSum = function() {
var imp = 0, n = 0;
for (var k in this.sides) {
if (this.sides[k]) {
n++;
if (this.sides[k].imp) imp++;
}
}
return imp === n ? imp : 0;
};
TRBL.prototype.add = function(name, sValue, tValue, imp) {
var s = this.sides,
currentSide,
i, x, side, a = [], last,
imp = imp ? 1 : 0,
wasUnary = false;
if ((i = name.lastIndexOf('-')) !== -1) {
side = name.substr(i + 1);
if (side in s) {
if (!(currentSide = s[side]) || (imp && !currentSide.imp)) {
s[side] = { s: imp ? sValue.substring(0, sValue.length - 10) : sValue, t: [tValue[0]], imp: imp };
if (tValue[0][1] === 'unary') s[side].t.push(tValue[1]);
}
return true;
}
} else if (name === this.name) {
for (i = 0; i < tValue.length; i++) {
x = tValue[i];
last = a[a.length - 1];
switch(x[1]) {
case 'unary':
a.push({ s: x[2], t: [x], imp: imp });
wasUnary = true;
break;
case 'number':
case 'ident':
if (wasUnary) {
last.t.push(x);
last.s += x[2];
} else {
a.push({ s: x[2], t: [x], imp: imp });
}
wasUnary = false;
break;
case 'percentage':
if (wasUnary) {
last.t.push(x);
last.s += x[2][2] + '%';
} else {
a.push({ s: x[2][2] + '%', t: [x], imp: imp });
}
wasUnary = false;
break;
case 'dimension':
if (wasUnary) {
last.t.push(x);
last.s += x[2][2] + x[3][2];
} else {
a.push({ s: x[2][2] + x[3][2], t: [x], imp: imp });
}
wasUnary = false;
break;
case 's':
case 'comment':
case 'important':
break;
default:
return false;
}
}
if (a.length > 4) return false;
if (!a[1]) a[1] = a[0];
if (!a[2]) a[2] = a[0];
if (!a[3]) a[3] = a[1];
if (!s.top) s.top = a[0];
if (!s.right) s.right = a[1];
if (!s.bottom) s.bottom = a[2];
if (!s.left) s.left = a[3];
return true;
}
};
TRBL.prototype.isOkToMinimize = function() {
var s = this.sides,
imp;
if (!!(s.top && s.right && s.bottom && s.left)) {
imp = s.top.imp + s.right.imp + s.bottom.imp + s.left.imp;
return (imp === 0 || imp === 4 || imp === this.imp);
}
return false;
};
TRBL.prototype.getValue = function() {
var s = this.sides,
a = [s.top, s.right, s.bottom, s.left],
r = [{}, 'value'];
if (s.left.s === s.right.s) {
a.length--;
if (s.bottom.s === s.top.s) {
a.length--;
if (s.right.s === s.top.s) {
a.length--;
}
}
}
for (var i = 0; i < a.length - 1; i++) {
r = r.concat(a[i].t);
r.push([{ s: ' ' }, 's', ' ']);
}
r = r.concat(a[i].t);
if (this.impSum()) r.push([{ s: '!important'}, 'important']);
return r;
};
TRBL.prototype.getProperty = function() {
return [{ s: this.name }, 'property', [{ s: this.name }, 'ident', this.name]];
};
TRBL.prototype.getString = function() {
var p = this.getProperty(),
v = this.getValue().slice(2),
r = p[0].s + ':';
for (var i = 0; i < v.length; i++) r += v[i][0].s;
return r;
};
function CSSOCompressor() {}
CSSOCompressor.prototype.init = function() {
this.props = {};
this.shorts = {};
this.shorts2 = {};
this.ccrules = {}; // clean comment rules — special case to resolve ambiguity
this.crules = {}; // compress rules
this.prules = {}; // prepare rules
this.frrules = {}; // freeze ruleset rules
this.msrules = {}; // mark shorthands rules
this.csrules = {}; // clean shorthands rules
this.rbrules = {}; // restructure block rules
this.rjrules = {}; // rejoin ruleset rules
this.rrrules = {}; // restructure ruleset rules
this.frules = {}; // finalize rules
this.initRules(this.crules, this.defCCfg);
this.initRules(this.ccrules, this.cleanCfg);
this.initRules(this.frrules, this.frCfg);
this.initRules(this.prules, this.preCfg);
this.initRules(this.msrules, this.msCfg);
this.initRules(this.csrules, this.csCfg);
this.initRules(this.rbrules, this.defRBCfg);
this.initRules(this.rjrules, this.defRJCfg);
this.initRules(this.rrrules, this.defRRCfg);
this.initRules(this.frules, this.defFCfg);
this.shortGroupID = 0;
this.lastShortGroupID = 0;
this.lastShortSelector = 0;
};
CSSOCompressor.prototype.initRules = function(r, cfg) {
var o = this.order,
p = this.profile,
x, i, k,
t = [];
for (i = 0; i < o.length; i++) if (o[i] in cfg) t.push(o[i]);
if (!t.length) t = o;
for (i = 0; i < t.length; i++) {
x = p[t[i]];
for (k in x) r[k] ? r[k].push(t[i]) : r[k] = [t[i]];
}
};
CSSOCompressor.prototype.cleanCfg = {
'cleanComment': 1
};
CSSOCompressor.prototype.defCCfg = {
'cleanCharset': 1,
'cleanImport': 1,
'cleanWhitespace': 1,
'cleanDecldelim': 1,
'compressNumber': 1,
'cleanUnary': 1,
'compressColor': 1,
'compressDimension': 1,
'compressString': 1,
'compressFontWeight': 1,
'compressFont': 1,
'compressBackground': 1,
'cleanEmpty': 1
};
CSSOCompressor.prototype.defRBCfg = {
'restructureBlock': 1
};
CSSOCompressor.prototype.defRJCfg = {
'rejoinRuleset': 1,
'cleanEmpty': 1
};
CSSOCompressor.prototype.defRRCfg = {
'restructureRuleset': 1,
'cleanEmpty': 1
};
CSSOCompressor.prototype.defFCfg = {
'cleanEmpty': 1,
'delimSelectors': 1,
'delimBlocks': 1
};
CSSOCompressor.prototype.preCfg = {
'destroyDelims': 1,
'preTranslate': 1
};
CSSOCompressor.prototype.msCfg = {
'markShorthands': 1
};
CSSOCompressor.prototype.frCfg = {
'freezeRulesets': 1
};
CSSOCompressor.prototype.csCfg = {
'cleanShorthands': 1,
'cleanEmpty': 1
};
CSSOCompressor.prototype.order = [
'cleanCharset',
'cleanImport',
'cleanComment',
'cleanWhitespace',
'compressNumber',
'cleanUnary',
'compressColor',
'compressDimension',
'compressString',
'compressFontWeight',
'compressFont',
'compressBackground',
'freezeRulesets',
'destroyDelims',
'preTranslate',
'markShorthands',
'cleanShorthands',
'restructureBlock',
'rejoinRuleset',
'restructureRuleset',
'cleanEmpty',
'delimSelectors',
'delimBlocks'
];
CSSOCompressor.prototype.profile = {
'cleanCharset': {
'atrules': 1
},
'cleanImport': {
'atrules': 1
},
'cleanWhitespace': {
's': 1
},
'compressNumber': {
'number': 1
},
'cleanUnary': {
'unary': 1
},
'compressColor': {
'vhash': 1,
'funktion': 1,
'ident': 1
},
'compressDimension': {
'dimension': 1
},
'compressString': {
'string': 1
},
'compressFontWeight': {
'declaration': 1
},
'compressFont': {
'declaration': 1
},
'compressBackground': {
'declaration': 1
},
'cleanComment': {
'comment': 1
},
'cleanDecldelim': {
'block': 1
},
'cleanEmpty': {
'ruleset': 1,
'atruleb': 1,
'atruler': 1
},
'destroyDelims': {
'decldelim': 1,
'delim': 1
},
'preTranslate': {
'declaration': 1,
'property': 1,
'simpleselector': 1,
'filter': 1,
'value': 1,
'number': 1,
'percentage': 1,
'dimension': 1,
'ident': 1
},
'restructureBlock': {
'block': 1
},
'rejoinRuleset': {
'ruleset': 1
},
'restructureRuleset': {
'ruleset': 1
},
'delimSelectors': {
'selector': 1
},
'delimBlocks': {
'block': 1
},
'markShorthands': {
'block': 1
},
'cleanShorthands': {
'declaration': 1
},
'freezeRulesets': {
'ruleset': 1
}
};
CSSOCompressor.prototype.isContainer = function(o) {
if (Array.isArray(o)) {
for (var i = 0; i < o.length; i++) if (Array.isArray(o[i])) return true;
}
};
CSSOCompressor.prototype.process = function(rules, token, container, i, path) {
var rule = token[1];
if (rule && rules[rule]) {
var r = rules[rule],
x1 = token, x2,
o = this.order, k;
for (var k = 0; k < r.length; k++) {
x2 = this[r[k]](x1, rule, container, i, path);
if (x2 === null) return null;
else if (x2 !== undefined) x1 = x2;
}
}
return x1;
};
CSSOCompressor.prototype.compress = function(tree, ro) {
tree = tree || ['stylesheet'];
this.init();
this.info = true;
var x = (typeof tree[0] !== 'string') ? tree : this.injectInfo([tree])[0],
l0, l1 = 100000000000, ls,
x0, x1, xs,
protectedComment = this.findProtectedComment(tree);
// compression without restructure
x = this.walk(this.ccrules, x, '/0');
x = this.walk(this.crules, x, '/0');
x = this.walk(this.prules, x, '/0');
x = this.walk(this.frrules, x, '/0');
ls = translator.translate(cleanInfo(x)).length;
if (!ro) { // restructure ON
xs = this.copyArray(x);
x = this.walk(this.rjrules, x, '/0');
this.disjoin(x);
x = this.walk(this.msrules, x, '/0');
x = this.walk(this.csrules, x, '/0');
x = this.walk(this.rbrules, x, '/0');
do {
l0 = l1;
x0 = this.copyArray(x);
x = this.walk(this.rjrules, x, '/0');
x = this.walk(this.rrrules, x, '/0');
l1 = translator.translate(cleanInfo(x)).length;
x1 = this.copyArray(x);
} while (l0 > l1);
if (ls < l0 && ls < l1) x = xs;
else if (l0 < l1) x = x0;
}
x = this.walk(this.frules, x, '/0');
if (protectedComment) x.splice(2, 0, protectedComment);
return x;
};
CSSOCompressor.prototype.findProtectedComment = function(tree) {
var token;
for (var i = 2; i < tree.length; i++) {
token = tree[i];
if (token[1] === 'comment' && token[2].length > 0 && token[2].charAt(0) === '!') return token;
if (token[1] !== 's') return;
}
};
CSSOCompressor.prototype.injectInfo = function(token) {
var t;
for (var i = token.length - 1; i > -1; i--) {
t = token[i];
if (t && Array.isArray(t)) {
if (this.isContainer(t)) t = this.injectInfo(t);
t.splice(0, 0, {});
}
}
return token;
};
CSSOCompressor.prototype.disjoin = function(container) {
var t, s, r, sr;
for (var i = container.length - 1; i > -1; i--) {
t = container[i];
if (t && Array.isArray(t)) {
if (t[1] === 'ruleset') {
t[0].shortGroupID = this.shortGroupID++;
s = t[2];
if (s.length > 3) {
sr = s.slice(0, 2);
for (var k = s.length - 1; k > 1; k--) {
r = this.copyArray(t);
r[2] = sr.concat([s[k]]);
r[2][0].s = s[k][0].s;
container.splice(i + 1, 0, r);
}
container.splice(i, 1);
}
}
}
if (this.isContainer(t)) this.disjoin(t);
}
};
CSSOCompressor.prototype.walk = function(rules, container, path) {
var t, x;
for (var i = container.length - 1; i > -1; i--) {
t = container[i];
if (t && Array.isArray(t)) {
t[0].parent = container;
if (this.isContainer(t)) t = this.walk(rules, t, path + '/' + i); // go inside
if (t === null) container.splice(i, 1);
else {
if (x = this.process(rules, t, container, i, path)) container[i] = x; // compressed not null
else if (x === null) container.splice(i, 1); // null is the mark to delete token
}
}
}
return container.length ? container : null;
};
CSSOCompressor.prototype.freezeRulesets = function(token, rule, container, i) {
var info = token[0],
selector = token[2];
info.freeze = this.freezeNeeded(selector);
info.freezeID = this.selectorSignature(selector);
info.pseudoID = this.composePseudoID(selector);
info.pseudoSignature = this.pseudoSelectorSignature(selector, this.allowedPClasses, true);
this.markSimplePseudo(selector);
return token;
};
CSSOCompressor.prototype.markSimplePseudo = function(selector) {
var ss, sg = {};
for (var i = 2; i < selector.length; i++) {
ss = selector[i];
ss[0].pseudo = this.containsPseudo(ss);
ss[0].sg = sg;
sg[ss[0].s] = 1;
}
};
CSSOCompressor.prototype.composePseudoID = function(selector) {
var a = [], ss;
for (var i = 2; i < selector.length; i++) {
ss = selector[i];
if (this.containsPseudo(ss)) {
a.push(ss[0].s);
}
}
a.sort();
return a.join(',');
};
CSSOCompressor.prototype.containsPseudo = function(sselector) {
for (var j = 2; j < sselector.length; j++) {
switch (sselector[j][1]) {
case 'pseudoc':
case 'pseudoe':
case 'nthselector':
if (!(sselector[j][2][2] in this.notFPClasses)) return true;
}
}
};
CSSOCompressor.prototype.selectorSignature = function(selector) {
var a = [];
for (var i = 2; i < selector.length; i++) {
a.push(translator.translate(cleanInfo(selector[i])));
}
a.sort();
return a.join(',');
};
CSSOCompressor.prototype.pseudoSelectorSignature = function(selector, exclude, dontAppendExcludeMark) {
var a = [], b = {}, ss, wasExclude = false;
exclude = exclude || {};
for (var i = 2; i < selector.length; i++) {
ss = selector[i];
for (var j = 2; j < ss.length; j++) {
switch (ss[j][1]) {
case 'pseudoc':
case 'pseudoe':
case 'nthselector':
if (!(ss[j][2][2] in exclude)) b[ss[j][2][2]] = 1;
else wasExclude = true;
break;
}
}
}
for (var k in b) a.push(k);
a.sort();
return a.join(',') + (dontAppendExcludeMark? '' : wasExclude);
};
CSSOCompressor.prototype.notFPClasses = {
'link': 1,
'visited': 1,
'hover': 1,
'active': 1,
'first-letter': 1,
'first-line': 1
};
CSSOCompressor.prototype.notFPElements = {
'first-letter': 1,
'first-line': 1
};
CSSOCompressor.prototype.freezeNeeded = function(selector) {
var ss;
for (var i = 2; i < selector.length; i++) {
ss = selector[i];
for (var j = 2; j < ss.length; j++) {
switch (ss[j][1]) {
case 'pseudoc':
if (!(ss[j][2][2] in this.notFPClasses)) return true;
break;
case 'pseudoe':
if (!(ss[j][2][2] in this.notFPElements)) return true;
break;
case 'nthselector':
return true;
break;
}
}
}
return false;
};
CSSOCompressor.prototype.cleanCharset = function(token, rule, container, i) {
if (token[2][2][2] === 'charset') {
for (i = i - 1; i > 1; i--) {
if (container[i][1] !== 's' && container[i][1] !== 'comment') return null;
}
}
};
CSSOCompressor.prototype.cleanImport = function(token, rule, container, i) {
var x;
for (i = i - 1; i > 1; i--) {
x = container[i][1];
if (x !== 's' && x !== 'comment') {
if (x === 'atrules') {
x = container[i][2][2][2];
if (x !== 'import' && x !== 'charset') return null;
} else return null;
}
}
};
CSSOCompressor.prototype.cleanComment = function(token, rule, container, i) {
var pr = ((container[1] === 'braces' && i === 4) ||
(container[1] !== 'braces' && i === 2)) ? null : container[i - 1][1],
nr = i === container.length - 1 ? null : container[i + 1][1];
if (nr !== null && pr !== null) {
if (this._cleanComment(nr) || this._cleanComment(pr)) return null;
} else return null;
};
CSSOCompressor.prototype._cleanComment = function(r) {
switch(r) {
case 's':
case 'operator':
case 'attrselector':
case 'block':
case 'decldelim':
case 'ruleset':
case 'declaration':
case 'atruleb':
case 'atrules':
case 'atruler':
case 'important':
case 'nth':
case 'combinator':
return true;
}
};
CSSOCompressor.prototype.nextToken = function(container, type, i, exactly) {
var t, r;
for (; i < container.length; i++) {
t = container[i];
if (Array.isArray(t)) {
r = t[1];
if (r === type) return t;
else if (exactly && r !== 's') return;
}
}
};
CSSOCompressor.prototype.cleanWhitespace = function(token, rule, container, i) {
var pr = ((container[1] === 'braces' && i === 4) ||
(container[1] !== 'braces' && i === 2)) ? null : container[i - 1][1],
nr = i === container.length - 1 ? null : container[i + 1][1];
if (nr === 'unknown') token[2] = '\n';
else {
if (!(container[1] === 'atrulerq' && !pr) && !this.issue16(container, i)) {
if (nr !== null && pr !== null) {
if (this._cleanWhitespace(nr, false) || this._cleanWhitespace(pr, true)) return null;
} else return null;
}
token[2] = ' ';
}
return token;
};
// See https://github.com/afelix/csso/issues/16
CSSOCompressor.prototype.issue16 = function(container, i) {
return (i !== 2 && i !== container.length - 1 && container[i - 1][1] === 'uri');
};
CSSOCompressor.prototype._cleanWhitespace = function(r, left) {
switch(r) {
case 's':
case 'operator':
case 'attrselector':
case 'block':
case 'decldelim':
case 'ruleset':
case 'declaration':
case 'atruleb':
case 'atrules':
case 'atruler':
case 'important':
case 'nth':
case 'combinator':
return true;
}
if (left) {
switch(r) {
case 'funktion':
case 'braces':
case 'uri':
return true;
}
}
};
CSSOCompressor.prototype.cleanDecldelim = function(token) {
for (var i = token.length - 1; i > 1; i--) {
if (token[i][1] === 'decldelim' &&
token[i + 1][1] !== 'declaration') token.splice(i, 1);
}
if (token[2][1] === 'decldelim') token.splice(2, 1);
return token;
};
CSSOCompressor.prototype.compressNumber = function(token, rule, container, i) {
var x = token[2];
if (/^0*/.test(x)) x = x.replace(/^0+/, '');
if (/\.0*$/.test(x)) x = x.replace(/\.0*$/, '');
if (/\..*[1-9]+0+$/.test(x)) x = x.replace(/0+$/, '');
if (x === '.' || x === '') x = '0';
token[2] = x;
token[0].s = x;
return token;
};
CSSOCompressor.prototype.findDeclaration = function(token) {
var parent = token;
while ((parent = parent[0].parent) && parent[1] !== 'declaration');
return parent;
};
CSSOCompressor.prototype.cleanUnary = function(token, rule, container, i) {
var next = container[i + 1];
if (next && next[1] === 'number' && next[2] === '0') return null;
return token;
};
CSSOCompressor.prototype.compressColor = function(token, rule, container, i) {
switch(rule) {
case 'vhash':
return this.compressHashColor(token);
case 'funktion':
return this.compressFunctionColor(token);
case 'ident':
return this.compressIdentColor(token, rule, container, i);
}
};
CSSOCompressor.prototype.compressIdentColor = function(token, rule, container) {
var map = { 'yellow': 'ff0',
'fuchsia': 'f0f',
'white': 'fff',
'black': '000',
'blue': '00f',
'aqua': '0ff' },
allow = { 'value': 1, 'functionBody': 1 },
_x = token[2].toLowerCase();
if (container[1] in allow && _x in map) return [{}, 'vhash', map[_x]];
};
CSSOCompressor.prototype.compressHashColor = function(token) {
return this._compressHashColor(token[2], token[0]);
};
CSSOCompressor.prototype._compressHashColor = function(x, info) {
var map = { 'f00': 'red',
'c0c0c0': 'silver',
'808080': 'gray',
'800000': 'maroon',
'800080': 'purple',
'008000': 'green',
'808000': 'olive',
'000080': 'navy',
'008080': 'teal'},
_x = x;
x = x.toLowerCase();
if (x.length === 6 &&
x.charAt(0) === x.charAt(1) &&
x.charAt(2) === x.charAt(3) &&
x.charAt(4) === x.charAt(5)) x = x.charAt(0) + x.charAt(2) + x.charAt(4);
return map[x] ? [info, 'string', map[x]] : [info, 'vhash', (x.length < _x.length ? x : _x)];
};
CSSOCompressor.prototype.compressFunctionColor = function(token) {
var i, v = [], t, h = '', body;
if (token[2][2] === 'rgb') {
body = token[3];
for (i = 2; i < body.length; i++) {
t = body[i][1];
if (t === 'number') v.push(body[i]);
else if (t !== 'operator') { v = []; break }
}
if (v.length === 3) {
h += (t = Number(v[0][2]).toString(16)).length === 1 ? '0' + t : t;
h += (t = Number(v[1][2]).toString(16)).length === 1 ? '0' + t : t;
h += (t = Number(v[2][2]).toString(16)).length === 1 ? '0' + t : t;
if (h.length === 6) return this._compressHashColor(h, {});
}
}
};
CSSOCompressor.prototype.compressDimension = function(token) {
var declaration;
if (token[2][2] === '0') {
if (token[3][2] === 's' && (declaration = this.findDeclaration(token))) {
var declName = declaration[2][2][2];
if  (declName === '-moz-transition') return; // https://github.com/css/csso/issues/82
if  (declName === '-moz-animation' || declName === 'animation') return; // https://github.com/css/csso/issues/100
}
return token[2];
}
};
CSSOCompressor.prototype.compressString = function(token, rule, container) {
var s = token[2], r = '', c;
for (var i = 0; i < s.length; i++) {
c = s.charAt(i);
if (c === '\\' && s.charAt(i + 1) === '\n') i++;
else r += c;
}
//    if (container[1] === 'attrib' && /^('|")[a-zA-Z0-9]*('|")$/.test(r)) {
//        r = r.substring(1, r.length - 1);
//    }
if (s.length !== r.length) return [{}, 'string', r];
};
CSSOCompressor.prototype.compressFontWeight = function(token) {
var p = token[2],
v = token[3];
if (p[2][2].indexOf('font-weight') !== -1 && v[2][1] === 'ident') {
if (v[2][2] === 'normal') v[2] = [{}, 'number', '400'];
else if (v[2][2] === 'bold') v[2] = [{}, 'number', '700'];
return token;
}
};
CSSOCompressor.prototype.compressFont = function(token) {
var p = token[2],
v = token[3],
i, x, t;
if (/font$/.test(p[2][2]) && v.length) {
v.splice(2, 0, [{}, 's', '']);
for (i = v.length - 1; i > 2; i--) {
x = v[i];
if (x[1] === 'ident') {
x = x[2];
if (x === 'bold') v[i] = [{}, 'number', '700'];
else if (x === 'normal') {
t = v[i - 1];
if (t[1] === 'operator' && t[2] === '/') v.splice(--i, 2);
else v.splice(i, 1);
if (v[i - 1][1] === 's') v.splice(--i, 1);
}
else if (x === 'medium' && v[i + 1] && v[i + 1][2] !== '/') {
v.splice(i, 1);
if (v[i - 1][1] === 's') v.splice(--i, 1);
}
}
}
if (v.length > 2 && v[2][1] === 's') v.splice(2, 1);
if (v.length === 2) v.push([{}, 'ident', 'normal']);
return token;
}
};
CSSOCompressor.prototype.compressBackground = function(token) {
var p = token[2],
v = token[3],
i, x, t,
n = v[v.length - 1][1] === 'important' ? 3 : 2;
if (/background$/.test(p[2][2]) && v.length) {
v.splice(2, 0, [{}, 's', '']);
for (i = v.length - 1; i > n; i--) {
x = v[i];
if (x[1] === 'ident') {
x = x[2];
if (x === 'transparent' || x === 'none' || x === 'repeat' || x === 'scroll') {
v.splice(i, 1);
if (v[i - 1][1] === 's') v.splice(--i, 1);
}
}
}
if (v.length > 2 && v[2][1] === 's') v.splice(2, 1);
if (v.length === 2) v.splice(2, 0, [{}, 'number', '0'], [{}, 's', ' '], [{}, 'number', '0']);
return token;
}
};
CSSOCompressor.prototype.cleanEmpty = function(token, rule) {
switch(rule) {
case 'ruleset':
if (token[3].length === 2) return null;
break;
case 'atruleb':
if (token[token.length - 1].length < 3) return null;
break;
case 'atruler':
if (token[4].length < 3) return null;
break;
}
};
CSSOCompressor.prototype.destroyDelims = function() {
return null;
};
CSSOCompressor.prototype.preTranslate = function(token) {
token[0].s = translator.translate(cleanInfo(token));
return token;
};
CSSOCompressor.prototype.markShorthands = function(token, rule, container, j, path) {
if (container[1] === 'ruleset') {
var selector = container[2][2][0].s,
freeze = container[0].freeze,
freezeID = container[0].freezeID;
} else {
var selector = '',
freeze = false,
freezeID = 'fake';
}
var x, p, v, imp, s, key, sh,
pre = this.pathUp(path) + '/' + (freeze ? '&' + freezeID + '&' : '') + selector + '/',
createNew, shortsI, shortGroupID = container[0].shortGroupID;
for (var i = token.length - 1; i > -1; i--) {
createNew = true;
x = token[i];
if (x[1] === 'declaration') {
v = x[3];
imp = v[v.length - 1][1] === 'important';
p = x[2][0].s;
x[0].id = path + '/' + i;
if (p in TRBL.props) {
key = pre + TRBL.extractMain(p);
var shorts = this.shorts2[key] || [];
shortsI = shorts.length === 0 ? 0 : shorts.length - 1;
if (!this.lastShortSelector || selector === this.lastShortSelector || shortGroupID === this.lastShortGroupID) {
if (shorts.length) {
sh = shorts[shortsI];
//if (imp && !sh.imp) sh.invalid = true;
createNew = false;
}
}
if (createNew) {
x[0].replaceByShort = true;
x[0].shorthandKey = { key: key, i: shortsI };
sh = new TRBL(p, imp);
shorts.push(sh);
}
if (!sh.invalid) {
x[0].removeByShort = true;
x[0].shorthandKey = { key: key, i: shortsI };
sh.add(p, v[0].s, v.slice(2), imp);
}
this.shorts2[key] = shorts;
this.lastShortSelector = selector;
this.lastShortGroupID = shortGroupID;
}
}
}
return token;
};
CSSOCompressor.prototype.cleanShorthands = function(token) {
if (token[0].removeByShort || token[0].replaceByShort) {
var s, t, sKey = token[0].shorthandKey;
s = this.shorts2[sKey.key][sKey.i];
if (!s.invalid && s.isOkToMinimize()) {
if (token[0].replaceByShort) {
t = [{}, 'declaration', s.getProperty(), s.getValue()];
t[0].s = translator.translate(cleanInfo(t));
return t;
} else return null;
}
}
};
CSSOCompressor.prototype.dontRestructure = {
'src': 1, // https://github.com/afelix/csso/issues/50
'clip': 1, // https://github.com/afelix/csso/issues/57
'display': 1 // https://github.com/afelix/csso/issues/71
};
CSSOCompressor.prototype.restructureBlock = function(token, rule, container, j, path) {
if (container[1] === 'ruleset') {
var props = this.props,
isPseudo = container[2][2][0].pseudo,
selector = container[2][2][0].s,
freeze = container[0].freeze,
freezeID = container[0].freezeID,
pseudoID = container[0].pseudoID,
sg = container[2][2][0].sg;
} else {
var props = {},
isPseudo = false,
selector = '',
freeze = false,
freezeID = 'fake',
pseudoID = 'fake',
sg = {};
}
var x, p, v, imp, t,
pre = this.pathUp(path) + '/' + selector + '/',
ppre;
for (var i = token.length - 1; i > -1; i--) {
x = token[i];
if (x[1] === 'declaration') {
v = x[3];
imp = v[v.length - 1][1] === 'important';
p = x[2][0].s;
ppre = this.buildPPre(pre, p, v, x, freeze);
x[0].id = path + '/' + i;
if (!this.dontRestructure[p] && (t = props[ppre])) {
if ((isPseudo && freezeID === t.freezeID) || // pseudo from equal selectors group
(!isPseudo && pseudoID === t.pseudoID) || // not pseudo from equal pseudo signature group
(isPseudo && pseudoID === t.pseudoID && this.hashInHash(sg, t.sg))) { // pseudo from covered selectors group
if (imp && !t.imp) {
props[ppre] = { block: token, imp: imp, id: x[0].id, sg: sg,
freeze: freeze, path: path, freezeID: freezeID, pseudoID: pseudoID };
this.deleteProperty(t.block, t.id);
} else {
token.splice(i, 1);
}
}
} else if (this.needless(p, props, pre, imp, v, x, freeze)) {
token.splice(i, 1);
} else {
props[ppre] = { block: token, imp: imp, id: x[0].id, sg: sg,
freeze: freeze, path: path, freezeID: freezeID, pseudoID: pseudoID };
}
}
}
return token;
};
CSSOCompressor.prototype.buildPPre = function(pre, p, v, d, freeze) {
var fp = freeze ? 'ft:' : 'ff:';
if (p.indexOf('background') !== -1) return fp + pre + d[0].s;
var _v = v.slice(2),
colorMark = [
0, // ident, vhash, rgb
0, // hsl
0, // hsla
0  // rgba
],
vID = '';
for (var i = 0; i < _v.length; i++) {
if (!vID) vID = this.getVendorIDFromToken(_v[i]);
switch(_v[i][1]) {
case 'vhash':
case 'ident':
colorMark[0] = 1; break;
case 'funktion':
switch(_v[i][2][2]) {
case 'rgb':
colorMark[0] = 1; break;
case 'hsl':
colorMark[1] = 1; break;
case 'hsla':
colorMark[2] = 1; break;
case 'rgba':
colorMark[3] = 1; break;
}
break;
}
}
return fp + pre + p + colorMark.join('') + (vID ? vID : '');
};
CSSOCompressor.prototype.vendorID = {
'-o-': 'o',
'-moz-': 'm',
'-webkit-': 'w',
'-ms-': 'i',
'-epub-': 'e',
'-apple-': 'a',
'-xv-': 'x',
'-wap-': 'p'
};
CSSOCompressor.prototype.getVendorIDFromToken = function(token) {
var vID;
switch(token[1]) {
case 'ident':
if (vID = this.getVendorFromString(token[2])) return this.vendorID[vID];
break;
case 'funktion':
if (vID = this.getVendorFromString(token[2][2])) return this.vendorID[vID];
break;
}
};
CSSOCompressor.prototype.getVendorFromString = function(string) {
var vendor = string.charAt(0), i;
if (vendor === '-') {
if ((i = string.indexOf('-', 2)) !== -1) return string.substr(0, i + 1);
}
return '';
};
CSSOCompressor.prototype.deleteProperty = function(block, id) {
var d;
for (var i = block.length - 1; i > 1; i--) {
d = block[i];
if (Array.isArray(d) && d[1] === 'declaration' && d[0].id === id) {
block.splice(i, 1);
return;
}
}
};
CSSOCompressor.prototype.nlTable = {
'border-width': ['border'],
'border-style': ['border'],
'border-color': ['border'],
'border-top': ['border'],
'border-right': ['border'],
'border-bottom': ['border'],
'border-left': ['border'],
'border-top-width': ['border-top', 'border-width', 'border'],
'border-right-width': ['border-right', 'border-width', 'border'],
'border-bottom-width': ['border-bottom', 'border-width', 'border'],
'border-left-width': ['border-left', 'border-width', 'border'],
'border-top-style': ['border-top', 'border-style', 'border'],
'border-right-style': ['border-right', 'border-style', 'border'],
'border-bottom-style': ['border-bottom', 'border-style', 'border'],
'border-left-style': ['border-left', 'border-style', 'border'],
'border-top-color': ['border-top', 'border-color', 'border'],
'border-right-color': ['border-right', 'border-color', 'border'],
'border-bottom-color': ['border-bottom', 'border-color', 'border'],
'border-left-color': ['border-left', 'border-color', 'border'],
'margin-top': ['margin'],
'margin-right': ['margin'],
'margin-bottom': ['margin'],
'margin-left': ['margin'],
'padding-top': ['padding'],
'padding-right': ['padding'],
'padding-bottom': ['padding'],
'padding-left': ['padding'],
'font-style': ['font'],
'font-variant': ['font'],
'font-weight': ['font'],
'font-size': ['font'],
'font-family': ['font'],
'list-style-type': ['list-style'],
'list-style-position': ['list-style'],
'list-style-image': ['list-style']
};
CSSOCompressor.prototype.needless = function(name, props, pre, imp, v, d, freeze) {
var hack = name.charAt(0);
if (hack === '*' || hack === '_' || hack === '$') name = name.substr(1);
else if (hack === '/' && name.charAt(1) === '/') {
hack = '//';
name = name.substr(2);
} else hack = '';
var vendor = this.getVendorFromString(name),
prop = name.substr(vendor.length),
x, t, ppre;
if (prop in this.nlTable) {
x = this.nlTable[prop];
for (var i = 0; i < x.length; i++) {
ppre = this.buildPPre(pre, hack + vendor + x[i], v, d, freeze);
if (t = props[ppre]) return (!imp || t.imp);
}
}
};
CSSOCompressor.prototype.rejoinRuleset = function(token, rule, container, i) {
var p = (i === 2 || container[i - 1][1] === 'unknown') ? null : container[i - 1],
ps = p ? p[2].slice(2) : [],
pb = p ? p[3].slice(2) : [],
ts = token[2].slice(2),
tb = token[3].slice(2),
ph, th, r;
if (!tb.length) return null;
if (ps.length && pb.length && token[0].pseudoSignature == p[0].pseudoSignature) {
if (token[1] !== p[1]) return;
// try to join by selectors
ph = this.getHash(ps);
th = this.getHash(ts);
if (this.equalHash(th, ph)) {
p[3] = p[3].concat(token[3].splice(2));
return null;
}
if (this.okToJoinByProperties(token, p)) {
// try to join by properties
r = this.analyze(token, p);
if (!r.ne1.length && !r.ne2.length) {
p[2] = this.cleanSelector(p[2].concat(token[2].splice(2)));
p[2][0].s = translator.translate(cleanInfo(p[2]));
return null;
}
}
}
};
CSSOCompressor.prototype.okToJoinByProperties = function(r0, r1) {
var i0 = r0[0], i1 = r1[0];
// same frozen ruleset
if (i0.freezeID === i1.freezeID) return true;
// same pseudo-classes in selectors
if (i0.pseudoID === i1.pseudoID) return true;
// different frozen rulesets
if (i0.freeze && i1.freeze) {
return this.pseudoSelectorSignature(r0[2], this.allowedPClasses) === this.pseudoSelectorSignature(r1[2], this.allowedPClasses);
}
// is it frozen at all?
return !(i0.freeze || i1.freeze);
};
CSSOCompressor.prototype.allowedPClasses = {
'after': 1,
'before': 1
};
CSSOCompressor.prototype.containsOnlyAllowedPClasses = function(selector) {
var ss;
for (var i = 2; i < selector.length; i++) {
ss = selector[i];
for (var j = 2; j < ss.length; j++) {
if (ss[j][1] == 'pseudoc' || ss[j][1] == 'pseudoe') {
if (!(ss[j][2][2] in this.allowedPClasses)) return false;
}
}
}
return true;
};
CSSOCompressor.prototype.restructureRuleset = function(token, rule, container, i) {
var p = (i === 2 || container[i - 1][1] === 'unknown') ? null : container[i - 1],
ps = p ? p[2].slice(2) : [],
pb = p ? p[3].slice(2) : [],
tb = token[3].slice(2),
r, nr;
if (!tb.length) return null;
if (ps.length && pb.length && token[0].pseudoSignature == p[0].pseudoSignature) {
if (token[1] !== p[1]) return;
// try to join by properties
r = this.analyze(token, p);
if (r.eq.length && (r.ne1.length || r.ne2.length)) {
if (r.ne1.length && !r.ne2.length) { // p in token
var ns = token[2].slice(2), // TODO: copypaste
nss = translator.translate(cleanInfo(token[2])),
sl = nss.length + // selector length
ns.length - 1, // delims length
bl = this.calcLength(r.eq) + // declarations length
r.eq.length - 1; // decldelims length
if (sl < bl) {
p[2] = this.cleanSelector(p[2].concat(token[2].slice(2)));
token[3].splice(2);
token[3] = token[3].concat(r.ne1);
return token;
}
} else if (r.ne2.length && !r.ne1.length) { // token in p
var ns = p[2].slice(2),
nss = translator.translate(cleanInfo(p[2])),
sl = nss.length + // selector length
ns.length - 1, // delims length
bl = this.calcLength(r.eq) + // declarations length
r.eq.length - 1; // decldelims length
if (sl < bl) {
token[2] = this.cleanSelector(p[2].concat(token[2].slice(2)));
p[3].splice(2);
p[3] = p[3].concat(r.ne2);
return token;
}
} else { // extract equal block?
var ns = this.cleanSelector(p[2].concat(token[2].slice(2))),
nss = translator.translate(cleanInfo(ns)),
rl = nss.length + // selector length
ns.length - 1 + // delims length
2, // braces length
bl = this.calcLength(r.eq) + // declarations length
r.eq.length - 1; // decldelims length
if (bl >= rl) { // ok, it's good enough to extract
ns[0].s = nss;
nr = [{f:0, l:0}, 'ruleset', ns, [{f:0,l:0}, 'block'].concat(r.eq)];
token[3].splice(2);
token[3] = token[3].concat(r.ne1);
p[3].splice(2);
p[3] = p[3].concat(r.ne2);
container.splice(i, 0, nr);
return nr;
}
}
}
}
};
CSSOCompressor.prototype.calcLength = function(tokens) {
var r = 0;
for (var i = 0; i < tokens.length; i++) r += tokens[i][0].s.length;
return r;
};
CSSOCompressor.prototype.cleanSelector = function(token) {
if (token.length === 2) return null;
var h = {}, s;
for (var i = 2; i < token.length; i++) {
s = token[i][0].s;
if (s in h) token.splice(i, 1), i--;
else h[s] = 1;
}
return token;
};
CSSOCompressor.prototype.analyze = function(r1, r2) {
var r = { eq: [], ne1: [], ne2: [] };
if (r1[1] !== r2[1]) return r;
var b1 = r1[3], b2 = r2[3],
d1 = b1.slice(2), d2 = b2.slice(2),
h1, h2, i, x;
h1 = this.getHash(d1);
h2 = this.getHash(d2);
for (i = 0; i < d1.length; i++) {
x = d1[i];
if (x[0].s in h2) r.eq.push(x);
else r.ne1.push(x);
}
for (i = 0; i < d2.length; i++) {
x = d2[i];
if (!(x[0].s in h1)) r.ne2.push(x);
}
return r;
};
CSSOCompressor.prototype.equalHash = function(h0, h1) {
var k;
for (k in h0) if (!(k in h1)) return false;
for (k in h1) if (!(k in h0)) return false;
return true;
};
CSSOCompressor.prototype.getHash = function(tokens) {
var r = {};
for (var i = 0; i < tokens.length; i++) r[tokens[i][0].s] = 1;
return r;
};
CSSOCompressor.prototype.hashInHash = function(h0, h1) {
for (var k in h0) if (!(k in h1)) return false;
return true;
};
CSSOCompressor.prototype.delimSelectors = function(token) {
for (var i = token.length - 1; i > 2; i--) {
token.splice(i, 0, [{}, 'delim']);
}
};
CSSOCompressor.prototype.delimBlocks = function(token) {
for (var i = token.length - 1; i > 2; i--) {
token.splice(i, 0, [{}, 'decldelim']);
}
};
CSSOCompressor.prototype.copyArray = function(a) {
var r = [], t;
for (var i = 0; i < a.length; i++) {
t = a[i];
if (Array.isArray(t)) r.push(this.copyArray(t));
else if (typeof t === 'object') r.push(this.copyObject(t));
else r.push(t);
}
return r;
};
CSSOCompressor.prototype.copyObject = function(o) {
var r = {};
for (var k in o) r[k] = o[k];
return r;
};
CSSOCompressor.prototype.pathUp = function(path) {
return path.substr(0, path.lastIndexOf('/'));
};
function CSSOTranslator() {}
CSSOTranslator.prototype.translate = function(tree) {
//    console.trace('--------');
//    console.log(tree);
return this._t(tree);
};
CSSOTranslator.prototype._m_simple = {
'unary': 1, 'nth': 1, 'combinator': 1, 'ident': 1, 'number': 1, 's': 1,
'string': 1, 'attrselector': 1, 'operator': 1, 'raw': 1, 'unknown': 1
};
CSSOTranslator.prototype._m_composite = {
'simpleselector': 1, 'dimension': 1, 'selector': 1, 'property': 1, 'value': 1,
'filterv': 1, 'progid': 1, 'ruleset': 1, 'atruleb': 1, 'atrulerq': 1, 'atrulers': 1,
'stylesheet': 1
};
CSSOTranslator.prototype._m_primitive = {
'cdo': 'cdo', 'cdc': 'cdc', 'decldelim': ';', 'namespace': '|', 'delim': ','
};
CSSOTranslator.prototype._t = function(tree) {
var t = tree[0];
if (t in this._m_primitive) return this._m_primitive[t];
else if (t in this._m_simple) return this._simple(tree);
else if (t in this._m_composite) return this._composite(tree);
return this[t](tree);
};
CSSOTranslator.prototype._composite = function(t, i) {
var s = '';
i = i === undefined ? 1 : i;
for (; i < t.length; i++) s += this._t(t[i]);
return s;
};
CSSOTranslator.prototype._simple = function(t) {
return t[1];
};
CSSOTranslator.prototype.percentage = function(t) {
return this._t(t[1]) + '%';
};
CSSOTranslator.prototype.comment = function(t) {
return '/*' + t[1] + '*/';
};
CSSOTranslator.prototype.clazz = function(t) {
return '.' + this._t(t[1]);
};
CSSOTranslator.prototype.atkeyword = function(t) {
return '@' + this._t(t[1]);
};
CSSOTranslator.prototype.shash = function(t) {
return '#' + t[1];
};
CSSOTranslator.prototype.vhash = function(t) {
return '#' + t[1];
};
CSSOTranslator.prototype.attrib = function(t) {
return '[' + this._composite(t) + ']';
};
CSSOTranslator.prototype.important = function(t) {
return '!' + this._composite(t) + 'important';
};
CSSOTranslator.prototype.nthselector = function(t) {
return ':' + this._simple(t[1]) + '(' + this._composite(t, 2) + ')';
};
CSSOTranslator.prototype.funktion = function(t) {
return this._simple(t[1]) + '(' + this._composite(t[2]) + ')';
};
CSSOTranslator.prototype.declaration = function(t) {
return this._t(t[1]) + ':' + this._t(t[2]);
};
CSSOTranslator.prototype.filter = function(t) {
return this._t(t[1]) + ':' + this._t(t[2]);
};
CSSOTranslator.prototype.block = function(t) {
return '{' + this._composite(t) + '}';
};
CSSOTranslator.prototype.braces = function(t) {
return t[1] + this._composite(t, 3) + t[2];
};
CSSOTranslator.prototype.atrules = function(t) {
return this._composite(t) + ';';
};
CSSOTranslator.prototype.atruler = function(t) {
return this._t(t[1]) + this._t(t[2]) + '{' + this._t(t[3]) + '}';
};
CSSOTranslator.prototype.pseudoe = function(t) {
return '::' + this._t(t[1]);
};
CSSOTranslator.prototype.pseudoc = function(t) {
return ':' + this._t(t[1]);
};
CSSOTranslator.prototype.uri = function(t) {
return 'url(' + this._composite(t) + ')';
};
CSSOTranslator.prototype.functionExpression = function(t) {
return 'expression(' + t[1] + ')';
};
</script>
<title>Online CSS Compressor | Script Tutorials </title>
</head>
<body>
<div id="outer-wrap">
<div id="inner-wrap">
<div class="container td-page-wrap">
<div class="row">
<div class="span12">
<div class="td-grid-wrap">
<div class="container-fluid">
<div class="row-fluid ">
<div class="span8 column_container" role="main" itemprop="mainContentOfPage">
<style>
.csstxt {
width: 98%;
height: 300px;
resize: vertical;
max-height: 1000px;
min-height: 300px;
padding: 1%;
border: 5px solid yellow;
outline: 5px solid blue;
background:url("data:image/gif;base64,R0lGODlhIAMoAOYAAP///8rPy/7+/snOysvQzMjNyfn7+cfNyN/m39bc19zo5Nfd2P3+/eTr5Nbc1s/V0MnOy8vPy+3v7v39/c7Tz+nv6e3v7f7//+Ho4fj49+rt6t7g3drd2ujq6fL18tbb1uPr5M7Uz9zg3eDm4PLz8tfd187U0MfMyO3w7eDn4N/o5P/+/+3t7Ojw7eXn5Ovy793g3fP18fj7/MnPy83Rzezy7+Hq4/Hx8MfMx9/i39rf2cbMx8fOy/7+//f49////o/Bx+Xs5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAgAygAAAf/gEGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAwocSLCgwYMIEyqchMBBCAIETCRAsLCixYsYqzVIMCCAx48DSjTISLKkyZO6HODweODEDJALUMqcSbMmqBEcNNwgYSEHhQIdPaawSbSo0aOGUABYytTHBqAEIHxASrWq1YwGmF5gCsBFgQgBHlwdS7YsQAZLBQhIu1TEgQAE4MzKnUs3HZC7eIHI4Mo3A40APPIKHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk1a8CEDPdbyXQqjgNi6sGPL/uYBgNrVADrsiDm7t+/fzyqoxi3hAAbgyJMrDxYDwArcLHQsn069uiwQLdb+4CpAhQ3r4MOLJ6WghoEJDAy8UDC+vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFmjggQgmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcduhhWaWFKOKIJJZo4okopqjiiiy26OKLpQUCADs=") repeat;
color: Blue;
font-weight: bold;
}
h1 {
background: linear-gradient(Blue,Yellow);
border-style: solid;
border-color: Orange;
}
</style>
<article>
<section id="primary">
<div id="content" role="main">
<h1> CSSO WEB JS CSS COMPRESSOR </h1>
<div class="entry-content widget_contact_form">
<p>
<textarea class="csstxt" id="csssrc">
</textarea></p>
<p><button id="minimize" class="button">Compress CSS</button>
<input id="o_colors" type="checkbox" checked="checked" name="o_colors"> Compress colours
<input id="o_fweight" type="checkbox" checked="checked" name="o_fweight"> Compress font-weight</p>
<textarea class="csstxt" id="cssdst" style="display:none">
</textarea>
<div id="stat" class="stat" style="display:none">Source length:
<span id="slength">0
</span>, Result length:
<span id="dlength">0
</span>, Compression:
<span id="result">0
</span>%.
</div>
</div>
</div> </section> </article>
<script>/*<![CDATA[*/var csssrc=document.getElementById('csssrc'),cssdst=document.getElementById('cssdst'),slength=document.getElementById('slength'),dlength=document.getElementById('dlength'),result=document.getElementById('result');function updateStat(){if(csssrc.value.length&&cssdst.value.length){slength.innerHTML=csssrc.value.length;dlength.innerHTML=cssdst.value.length;result.innerHTML=(100*cssdst.value.length/csssrc.value.length).toFixed(2);}else{slength.innerHTML=0;dlength.innerHTML=0;result.innerHTML=0;}
document.getElementById('stat').style.display='block';}
document.getElementById('minimize').onclick=function(){var compressor=new CSSOCompressor(),translator=new CSSOTranslator();if(false===document.getElementById('o_colors').checked){delete compressor.defCCfg.compressColor;}else{compressor.defCCfg['compressColor']=1;}
if(false===document.getElementById('o_fweight').checked){delete compressor.defCCfg.compressFontWeight;}else{compressor.defCCfg['compressFontWeight']=1;}
cssdst.value=translator.translate(cleanInfo(compressor.compress(srcToCSSP(csssrc.value,'stylesheet',true))));cssdst.style.display='block';updateStat();};/*]]>*/
</script>
</div>
<div id="cboxOverlay" style="display: none;">
</div>
<div id="colorbox" class="" role="dialog" tabindex="-1" style="display: none;">
<div style="position: absolute; width: 9999px; visibility: hidden; display: none;">
</div>
</div>
</body>
</html>

0 comments:

Post a Comment

FB Gadgets | Template Designed by Fatakat PhotosCoolBThemes.com
Code by : paid web directory

https://www.google.co.uk/search?q=site%3Ablogspot.com+fbgadgets