133 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| //.CommonJS
 | |
| var CSSOM = {
 | |
| 	CSSRule: require("./CSSRule").CSSRule,
 | |
| 	CSSStyleSheet: require("./CSSStyleSheet").CSSStyleSheet,
 | |
| 	MediaList: require("./MediaList").MediaList
 | |
| };
 | |
| ///CommonJS
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * @constructor
 | |
|  * @see http://dev.w3.org/csswg/cssom/#cssimportrule
 | |
|  * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSImportRule
 | |
|  */
 | |
| CSSOM.CSSImportRule = function CSSImportRule() {
 | |
| 	CSSOM.CSSRule.call(this);
 | |
| 	this.href = "";
 | |
| 	this.media = new CSSOM.MediaList();
 | |
| 	this.styleSheet = new CSSOM.CSSStyleSheet();
 | |
| };
 | |
| 
 | |
| CSSOM.CSSImportRule.prototype = new CSSOM.CSSRule();
 | |
| CSSOM.CSSImportRule.prototype.constructor = CSSOM.CSSImportRule;
 | |
| CSSOM.CSSImportRule.prototype.type = 3;
 | |
| 
 | |
| Object.defineProperty(CSSOM.CSSImportRule.prototype, "cssText", {
 | |
|   get: function() {
 | |
|     var mediaText = this.media.mediaText;
 | |
|     return "@import url(" + this.href + ")" + (mediaText ? " " + mediaText : "") + ";";
 | |
|   },
 | |
|   set: function(cssText) {
 | |
|     var i = 0;
 | |
| 
 | |
|     /**
 | |
|      * @import url(partial.css) screen, handheld;
 | |
|      *        ||               |
 | |
|      *        after-import     media
 | |
|      *         |
 | |
|      *         url
 | |
|      */
 | |
|     var state = '';
 | |
| 
 | |
|     var buffer = '';
 | |
|     var index;
 | |
|     for (var character; (character = cssText.charAt(i)); i++) {
 | |
| 
 | |
|       switch (character) {
 | |
|         case ' ':
 | |
|         case '\t':
 | |
|         case '\r':
 | |
|         case '\n':
 | |
|         case '\f':
 | |
|           if (state === 'after-import') {
 | |
|             state = 'url';
 | |
|           } else {
 | |
|             buffer += character;
 | |
|           }
 | |
|           break;
 | |
| 
 | |
|         case '@':
 | |
|           if (!state && cssText.indexOf('@import', i) === i) {
 | |
|             state = 'after-import';
 | |
|             i += 'import'.length;
 | |
|             buffer = '';
 | |
|           }
 | |
|           break;
 | |
| 
 | |
|         case 'u':
 | |
|           if (state === 'url' && cssText.indexOf('url(', i) === i) {
 | |
|             index = cssText.indexOf(')', i + 1);
 | |
|             if (index === -1) {
 | |
|               throw i + ': ")" not found';
 | |
|             }
 | |
|             i += 'url('.length;
 | |
|             var url = cssText.slice(i, index);
 | |
|             if (url[0] === url[url.length - 1]) {
 | |
|               if (url[0] === '"' || url[0] === "'") {
 | |
|                 url = url.slice(1, -1);
 | |
|               }
 | |
|             }
 | |
|             this.href = url;
 | |
|             i = index;
 | |
|             state = 'media';
 | |
|           }
 | |
|           break;
 | |
| 
 | |
|         case '"':
 | |
|           if (state === 'url') {
 | |
|             index = cssText.indexOf('"', i + 1);
 | |
|             if (!index) {
 | |
|               throw i + ": '\"' not found";
 | |
|             }
 | |
|             this.href = cssText.slice(i + 1, index);
 | |
|             i = index;
 | |
|             state = 'media';
 | |
|           }
 | |
|           break;
 | |
| 
 | |
|         case "'":
 | |
|           if (state === 'url') {
 | |
|             index = cssText.indexOf("'", i + 1);
 | |
|             if (!index) {
 | |
|               throw i + ': "\'" not found';
 | |
|             }
 | |
|             this.href = cssText.slice(i + 1, index);
 | |
|             i = index;
 | |
|             state = 'media';
 | |
|           }
 | |
|           break;
 | |
| 
 | |
|         case ';':
 | |
|           if (state === 'media') {
 | |
|             if (buffer) {
 | |
|               this.media.mediaText = buffer.trim();
 | |
|             }
 | |
|           }
 | |
|           break;
 | |
| 
 | |
|         default:
 | |
|           if (state === 'media') {
 | |
|             buffer += character;
 | |
|           }
 | |
|           break;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| });
 | |
| 
 | |
| 
 | |
| //.CommonJS
 | |
| exports.CSSImportRule = CSSOM.CSSImportRule;
 | |
| ///CommonJS
 |