css.js

来自「在线编辑器」· JavaScript 代码 · 共 132 行

JS
132
字号
/* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is jquery-css-parser. * * The Initial Developer of the Original Code is Daniel Wachsstock. * Portions created by the Initial Developer are Copyright (C) 2009 * the Initial Developer. All Rights Reserved. * * Contributor(s): *     Bespin Team (bespin@mozilla.com) * * ORIGINAL MIT-licensed CODE LICENSE HEADER FOLLOWS:// jQuery based CSS parser// documentation: http://youngisrael-stl.org/wordpress/2009/01/16/jquery-css-parser/// Version: 1.0// Copyright (c) 2009 Daniel Wachsstock// MIT license:// Permission is hereby granted, free of charge, to any person// obtaining a copy of this software and associated documentation// files (the "Software"), to deal in the Software without// restriction, including without limitation the rights to use,// copy, modify, merge, publish, distribute, sublicense, and/or sell// copies of the Software, and to permit persons to whom the// Software is furnished to do so, subject to the following// conditions:// The above copyright notice and this permission notice shall be// included in all copies or substantial portions of the Software.// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR// OTHER DEALINGS IN THE SOFTWARE. * ***** END LICENSE BLOCK ***** */dojo.provide("th.css"); dojo.declare("th.css.CSSParser", null, {    parse: function(str, ret) {        // parses the passed stylesheet into an object with properties containing objects with the attribute names and values        if (!ret) ret = {};                          dojo.forEach(this.munge(str, false).split('`b%'), function(css){                          css = css.split('%b`'); // css[0] is the selector; css[1] is the index in munged for the cssText              if (css.length < 2) return; // invalid css            css[0] = this.restore(css[0]);            var obj = ret[css[0]] || {};            ret[css[0]] = dojo.mixin(obj, this.parsedeclarations(css[1]));        }, this);                   return ret;    },    // replace strings and brace-surrounded blocks with %s`number`s% and %b`number`b%. By successively taking out the innermost    // blocks, we ensure that we're matching braces. No way to do this with just regular expressions. Obviously, this assumes no one    // would use %s` in the real world.    // Turns out this is similar to the method that Dean Edwards used for his CSS parser in IE7.js (http://code.google.com/p/ie7-js/)    REbraces: /{[^{}]*}/,        REfull: /\[[^\[\]]*\]|{[^{}]*}|\([^()]*\)|function(\s+\w+)?(\s*%b`\d+`b%){2}/, // match pairs of parentheses, brackets, and braces and function definitions.        REatcomment: /\/\*@((?:[^\*]|\*[^\/])*)\*\//g, // comments of the form /*@ text */ have text parsed    // we have to combine the comments and the strings because comments can contain string delimiters and strings can contain comment delimiters    // var REcomment = /\/\*(?:[^\*]|\*[^\/])*\*\/|<!--|-->/g; // other comments are stripped. (this is a simplification of real SGML comments (see http://htmlhelp.com/reference/wilbur/misc/comment.html) , but it's what real browsers use)    // var REstring = /\\.|"(?:[^\\\"]|\\.|\\\n)*"|'(?:[^\\\']|\\.|\\\n)*'/g; // match escaped characters and strings        REcomment_string:      /(?:\/\*(?:[^\*]|\*[^\/])*\*\/)|(\\.|"(?:[^\\\"]|\\.|\\\n)*"|'(?:[^\\\']|\\.|\\\n)*')/g,        REmunged: /%\w`(\d+)`\w%/,        uid: 0, // unique id number        munged: {}, // strings that were removed by the parser so they don't mess up searching for specific characters    munge: function(str, full) {        str = str            .replace(this.REatcomment, '$1') // strip /*@ comments but leave the text (to let invalid CSS through)            .replace(this.REcomment_string, dojo.hitch(this, function (s, string) { // strip strings and escaped characters, leaving munged markers, and strip comments                if (!string) return '';                var replacement = '%s`'+(++this.uid)+'`s%';                this.munged[this.uid] = string.replace(/^\\/, ''); // strip the backslash now                return replacement;            }));               // need a loop here rather than .replace since we need to replace nested braces        var RE = full ? this.REfull : this.REbraces;        while (match = RE.exec(str)) {            replacement = '%b`'+(++this.uid)+'`b%';            this.munged[this.uid] = match[0];            str = str.replace(RE, replacement);        }                   return str;    },    restore: function(str) {        if (str === undefined) return str;        while (match = this.REmunged.exec(str)) {            str = str.replace(this.REmunged, this.munged[match[1]]);        }        return dojo.trim(str);    },    parsedeclarations: function(index){ // take a string from the munged array and parse it into an object of property: value pairs        var str = this.munged[index].replace(/(?:^\s*[{'"]\s*)|(?:\s*([^\\])[}'"]\s*$)/g, '$1'); // find the string and remove the surrounding braces or quotes        str = this.munge(str); // make sure any internal braces or strings are escaped        var parsed = {};           dojo.forEach(str.split(';'), function (decl) {            decl = decl.split(':');            if (decl.length < 2) return;            parsed[this.restore(decl[0])] = this.restore(decl[1]);        }, this);        return parsed;    }});

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?