/* * cascading style sheet(CSS 2.1)の拡張子クラス * 参考: http://www.w3.org/Style/CSS/ * * * 色づけ改造 by NiG * http://blog.livedoor.jp/nig_luce/?blog_id=1819407 * * ファイルを開くと全文走査して色を探します。大きなファイルだと重いかも。 * getDynCompletionCandidatesの様に走査行数の制限を付けた方がいいのかなぁ。 * 何回も実行するものじゃないからちょっとぐらい重くてもいいかなぁ。 * * コードをコピペしてきた時など、うまく色が付かないときは * ファイルを保存するかclasses.css.update();を実行すると色探しをします */ function class_css() { this.name = 'css'; this.parent = 'srcfile'; this.ext = '\\.css$'; this.updateOnSave = true; //保存時に色探しをする this.showColorsOnUpdate = false; //色探しをしたとき、見つけた色を表示する this.elements = new Array( 'a', 'abbr', 'acronym', 'address', 'applet', 'area', 'b', 'base', 'basefont', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt', 'em', 'fieldset', 'font', 'form', 'frame', 'frameset', 'head', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'isindex', 'kbd', 'label', 'legend', 'li', 'link', 'map', 'menu', 'meta', 'noframes', 'noscript', 'object', 'ol', 'optgroup', 'option', 'p', 'param', 'pre', 'q', 'rb', 'rbc', 'rp', 'rt', 'rtc', 'ruby', 's', 'samp', 'select', 'small', 'span', 'strike', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'tt', 'u', 'ul', 'var' ); this.properties = new Array( 'azimuth', 'background', 'background-attachment', 'background-color', 'background-image', 'background-position', 'background-repeat', 'behavior', 'border', 'border-bottom', 'border-bottom-color', 'border-bottom-style', 'border-bottom-width', 'border-collapse', 'border-color', 'border-left', 'border-left-color', 'border-left-style', 'border-left-width', 'border-right', 'border-right-color', 'border-right-style', 'border-right-width', 'border-spacing', 'border-style', 'border-top', 'border-top-color', 'border-top-style', 'border-top-width', 'border-width', 'bottom', 'caption-side', 'clear', 'clip', 'color', 'content', 'counter-increment', 'counter-reset', 'cue', 'cue-after', 'cue-before', 'cursor', 'direction', 'display', 'elevation', 'empty-cells', 'filter', 'float', 'font', 'font-family', 'font-size-adjust', 'font-size', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'height', 'ime-mode', 'layout-grid', 'layout-grid-char', 'layout-grid-line', 'layout-grid-mode', 'layout-grid-type', 'left', 'letter-spacing', 'line-break', 'line-height', 'list-style', 'list-style-image', 'list-style-position', 'list-style-type', 'margin', 'margin-bottom', 'margin-left', 'margin-right', 'margin-top', 'marker-offset', 'marks', 'max-height', 'max-width', 'min-height', 'min-width', 'orphans', 'outline', 'outline-color', 'outline-style', 'outline-width', 'overflow', 'overflow-x', 'overflow-y', 'padding', 'padding-bottom', 'padding-left', 'padding-right', 'padding-top', 'page', 'page-break-after', 'page-break-before', 'page-break-inside', 'pause', 'pause-after', 'pause-before', 'pitch', 'pitch-range', 'play-during', 'position', 'quotes', 'richness', 'right', 'ruby-align', 'ruby-overhang', 'ruby-position', 'scrollbar-3dlight-color', 'scrollbar-arrow-color', 'scrollbar-base-color', 'scrollbar-darkshadow-color', 'scrollbar-face-color', 'scrollbar-highlight-color', 'scrollbar-shadow-color', 'scrollbar-track-color', 'size', 'speak', 'speak-header', 'speak-numeral', 'speak-punctuation', 'speech-rate', 'stress', 'table-layout', 'text-align', 'text-autospace', 'text-decoration', 'text-indent', 'text-justify', 'text-kashida-space', 'text-shadow', 'text-transform', 'text-underline-position', 'top', 'unicode-bidi', 'vertical-align', 'visibility', 'voice-family', 'volume', 'white-space', 'width', 'widows', 'word-break', 'word-spacing', 'writing-mode', 'z-index' ); this.color = new Array('red','lime','blue','white','maroon','green','navy','silver','yellow','aqua', 'fuchsia','gray','olive','teal','purple','black','orange'); } var f = class_css.prototype; f.onInitProp = function (arg, classname, methodname) { var lex = App.Lexes.Add(this.name); App.Prop(this.name, 'lex') = lex.name; lex.DefaultStyle('1..5') = 'exstyle:デフォルト'; lex.DefaultStyle('11..13') = 'exstyle:コメント'; lex.DefaultStyle('21..23,26..28') = 'exstyle:文字列'; lex.LeadingIdentifiers = '[-_a-zA-Z]'; lex.FollowingIdentifiers = '[-_a-zA-Z0-9]'; // uri addURIRule(lex, '11..13,21..23,26..28'); // comment lex.Add( 'comment-start', '1..5/\\/\\*/', 'state:+10'); lex.Add( 'comment-terminator', '11..15/\\*\\//', 'no-style; state:-10'); // string lex.Add( 'string1', '1..3/"/', 'exstyle:文字列;state:+20'); lex.Add( 'string2', "1..3/'/", 'exstyle:文字列;state:+25'); lex.Add( 'string1-terminator', '21..23/"|$/', 'no-style;state:-20'); lex.Add( 'string2-terminator', "26..28/'|$/", 'no-style;state:-25'); // directive, selector lex.Add( 'directive', '1/\\<@(import|page|media|charset)/i', 'exstyle:@ルール'); lex.Add( '', '1/{/', 'no-style;state:2'); lex.AddKeywords('element', '1/' + this.elements.join(' ') + '/i', 'exstyle:セレクタ-要素名'); lex.Add( '', '1/[.#][a-z][-_a-z0-9]*/i', 'exstyle:セレクタ-クラス、ID名'); lex.Add( '', '1/:[a-z][-_a-z0-9]*/i', 'exstyle:セレクタ-擬似クラス名'); // property lex.Add( '', '2..5/}/', 'no-style;state:1'); lex.AddKeywords( 'keyword', '2/' + this.properties.join(' ') + '/i', 'exstyle:プロパティ'); lex.Add( '', '2/:/', 'no-style; state:3'); // value lex.Add( 'important', '3/!\s*important/i', 'exstyle:importantルール'); lex.Add( 'num', '3/([0-9]+|[0-9]*\\.[0-9]+)\\s*(em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|Hz|kHz|%)?/i', 'exstyle:数値'); lex.Add( '', '3/\\<(rgb|url)\\>/i', 'exstyle:関数'); lex.Add( '', '3/#[0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]/i', 'state:4'); //#xxxxxxの色指定っぽい状態4に移行 lex.Add( '', '3/#([0-9A-F][0-9A-F][0-9A-F][^0-9A-F]|[0-9A-F][0-9A-F][0-9A-F]$)/i', 'state:5'); //#xxxの色指定っぽい状態5に移行 lex.Add( '', '3..5/;/', 'no-style; state:2'); // lex.Add( 'tohtml', '/<\\/style/i', 'transit:*return*'); // css1,css2 standard 16 colors this.addColor('#ff0000','red'); this.addColor('#00ff00','lime'); this.addColor('#0000ff','blue'); this.addColor('#ffffff','white'); this.addColor('#800000','maroon'); this.addColor('#008000','green'); this.addColor('#000080','navy'); this.addColor('#c0c0C0','silver'); this.addColor('#ffff00','yellow'); this.addColor('#00ffff','aqua'); this.addColor('#ff00ff','fuchsia'); this.addColor('#808080','gray'); this.addColor('#808000','olive'); this.addColor('#008080','teal'); this.addColor('#800080','purple'); this.addColor('#000000','black'); // css2.1 17 colors this.addColor('#ffa500','orange'); var _css=this,_html=classes.html; if(_html.onLoad){ _html._onLoad = _html.onLoad; _html.onLoad = function(arg, classname, methodname){_html._onLoad(arg, classname, methodname);_css.onLoad(arg, classname,methodname);}; }else{ _html.onLoad = function(arg, classname, methodname){_css.onLoad(arg, classname, methodname);}; } if(this.updateOnSave) if(_html.onSave){ _html._onSave = _html.onSave; _html.onSave = function(arg, classname, methodname){_html._onSave(arg, classname, methodname);_css.onSave(arg, classname,methodname);}; }else{ _html.onSave = function(arg, classname, methodname){_css.onSave(arg, classname, methodname);}; } }; f.onCompleteRequest = function (arg, classname, methodname) { var ls = App.Caret.LexState; App.CompletionList.Clear(); if (ls.State == 1 && !getLeftParagraph().match(/[.#:[]([-_a-z][-_a-z0-9]*)?$/i)) { App.CompletionList.Add( 'tag', this.elements.join('\n')); } else if (ls.State == 2) { App.CompletionList.Add( 'keyword', this.properties.join('\n')); } else if (ls.State == 3 && getLeftParagraph().match(/#$/)){ App.CompletionList.Add( 'color', getDynCompletionCandidates(/\/\*.*\*\//,/#[0-9A-F][0-9A-F][0-9A-F]([0-9A-F][0-9A-F][0-9A-F])?/ig).join('\n').replace(/#/g,'') ); } else if (ls.State == 3) { App.CompletionList.Add( 'color', this.color.join('\n')); App.CompletionList.Add( 'identifier', getDynCompletionCandidates( /'([^']|\\')*'|"([^"]|\\")*"'/g, /[-_a-z][-_a-z0-9]*/ig).join('\n')); } App.CompletionList.Popup( App.Prop(this.name, 'completion-case-sensitive')); }; f.addColor = function(c,s){ c=c.toLowerCase();if(!this.palette)this.palette={};var d=(s?s:c).toLowerCase(); if(this.palette[d])return false; this.palette[d]=true; if(c.length==7){ if(s) App.Lexes.Item('css').Add('color-'+c,'3/'+s+'/i','exstyle:色の指定;background-color:'+c+';color:#'+(parseInt(c.charAt(1),16)+parseInt(c.charAt(3),16)+parseInt(c.charAt(5),16)>24?'000000':'FFFFFF')+'; state:3'); else App.Lexes.Item('css').Add('color-'+c,'4/'+c+'/i','exstyle:色の指定;background-color:'+c+';color:#'+(parseInt(c.charAt(1),16)+parseInt(c.charAt(3),16)+parseInt(c.charAt(5),16)>24?'000000':'FFFFFF')+'; state:3'); } if(c.length==4) App.Lexes.Item('css').Add('color-'+c,'5/'+c+'/i','exstyle:色の指定;background-color:'+c+';color:#'+(parseInt(c.charAt(1),16)+parseInt(c.charAt(2),16)+parseInt(c.charAt(3),16)>24?'000000':'FFFFFF')+'; state:3'); return c; } f.getColorPalette = function(){ var s=[]; for(var i in this.palette){ s.push(i); } return s; } f.showColorPalette = function(){ App.Balloon(this.getColorPalette().join('\n')); } f.onKeyPrintable = function (arg, classname, methodname) { invoke(arg, this.parent, methodname); if (arg.match(/[0-9A-F]/i) && (getLeftParagraph().match(/(#[0-9A-F][0-9A-F][0-9A-F]([0-9A-F][0-9A-F][0-9A-F])?)$/i)|| App.Caret.Paragraph.substring(App.Caret.Col>6?App.Caret.Col-7:0).match(/(#[0-9A-F][0-9A-F][0-9A-F]([0-9A-F][0-9A-F][0-9A-F])?)/i)) ) { this.addColor(RegExp.$1); } if (!App.CompletionList.Active) { var needcompletion = false; var delaychars; if (arg.match(/[-a-zA-Z0-9]/) && (delaychars = App.Prop(classname, 'auto-completion-delay-count') - 0) >= 0 && getLeftParagraph().match(/([-_a-z][-_a-z0-9]*)$/i) && RegExp.$1.length >= delaychars) { needcompletion = true; } if (arg == '#')needcompletion=true; if (needcompletion) { var ls = App.Caret.LexState(App.Caret.Col - 1); if (ls.Name == this.name && (ls.State >= 1 && ls.State <= 3)) invoke(arg, classname, 'onCompleteRequest'); } } }; f.onKeySpace = function (arg, classname, methodname) { switch (arg & KEYMASK) { case KEYMASK_CTRL: invoke(arg, classname, 'onCompleteRequest'); break; default: invoke(arg, this.parent, methodname); break; } }; f.onLoad = function(arg, classname, methodname){ invoke(arg, this.parent, methodname); this.update(); }; f.onSave = function(arg, classname, methodname){ invoke(arg, this.parent, methodname); if(this.updateOnSave) this.update(); }; f.update = function(){ // var colors=getDynCompletionCandidates(/\*/?([^/]|[^*]/)*\*/,/#[0-9A-F][0-9A-F][0-9A-F]([0-9A-F][0-9A-F][0-9A-F])?/ig); var s=[];for(var i=0;i/i).join(); if(s===null)return; var colors=s.replace(/\*\/?([^\/]|[^*]\/)*\*/,' ').match(/#[0-9A-F][0-9A-F][0-9A-F]([0-9A-F][0-9A-F][0-9A-F])?/ig); s=''; for(var i=0;i