/* * HTML (XHTML 1.0) ソースの拡張子クラス * 参考: http://www.w3.org/TR/2000/REC-xhtml1-20000126/ */ function class_html() { this.name = 'html'; this.parent = 'srcfile'; this.ext = '\\.(php[3-5]?|phtml?|x?html?|hta)$'; 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', 'hr', 'html', 'i', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', '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', 'script', 'select', 'small', 'span', 'strike', 'strong', 'style', 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'tt', 'u', 'ul', 'var' ); this.attributes = new Array( 'abbr', 'accept', 'accept-charset', 'accesskey', 'action', 'align', 'alt', 'archive', 'axis', 'border', 'cellpadding', 'cellspacing', 'charset', 'checked', 'cite', 'class', 'classid', 'codebase', 'codetype', 'cols', 'colspan', 'content', 'coords', 'data', 'datetime', 'declare', 'defer', 'dir', 'disabled', 'enctype', 'for', 'frame', 'headers', 'height', 'href', 'hreflang', 'ismap', 'id', 'http-equiv', 'label', 'long', 'maxlength', 'media', 'method', 'multiple', 'name', 'nohref', 'onblur', 'onchange', 'onclick', 'ondblclick', 'onfocus', 'onkeydown', 'onkeypress', 'onkeyup', 'onload', 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onreset', 'onselect', 'onsubmit', 'onunload', 'rbspan', 'readonly', 'rel', 'rev', 'rows', 'rowspan', 'rules', 'scheme', 'scope', 'selected', 'shape', 'size', 'span', 'src', 'standby', 'summary', 'tabindex', 'title', 'type', 'usemap', 'valign', 'value', 'valuetype', 'version', 'width', 'xmlns', 'xml:lang', 'xml:space' ); } var f = class_html.prototype; f.onInitProp = function (arg, classname, methodname) { App.Prop(this.name, 'wrap-mode') = 'by-unit'; var lex = App.Lexes.Add(this.name); App.Prop(this.name, 'lex') = lex.name; //タグの外 lex.DefaultStyle(1) = 'exstyle:タグの外のデフォルト'; lex.DefaultStyle(2) = 'exstyle:マーク宣言'; lex.DefaultStyle(3) = 'exstyle:XML宣言'; lex.DefaultStyle('11..13') = 'exstyle:コメント'; addURIRule(lex, '1,11..13'); lex.Add('', '1..3//', 'no-style; state:-10'); //タグの中 lex = App.Lexes.Add('html-tag'); lex.LeadingIdentifiers = '[a-zA-Z]'; lex.FollowingIdentifiers = '[-:a-zA-Z0-9]'; lex.DefaultStyle('1..7') = 'exstyle:デフォルト'; lex.DefaultStyle('11..15') = 'exstyle:コメント'; lex.Add('comment-start', '1..5//', 'no-style; state:-10'); lex.Add('state1', '1/<\\/?/', 'exstyle:タグの開始; state:2'); lex.Add('php-start', '2..30/<(%|\\?php)/', 'transit:php:1'); lex.Add('state2-script', '2/\\/i', 'exstyle:要素名; transit:html-script-tag'); lex.Add('state2-style', '2/\\/i', 'exstyle:要素名; transit:html-style-tag'); lex.AddKeywords('state2-keyword', '2/' + this.elements.join(' ') + '/i', 'exstyle:要素名; state:3'); lex.Add('state2-unknown-element', '2/([^ =\\\\/>]|\\/[^>])+/', 'exstyle:要素名-不明な; state:3'); lex.AddKeywords('state3-keyword1', '3,4/' + this.attributes.join(' ') + '/i', 'exstyle:属性名; state:4'); addURIRule(lex, '6,7,11..15'); lex.Add('state3-unknown-attribute', '3,4/([^ =\\/>]|\\/[^>])+/', 'exstyle:属性名-不明な;state:4'); lex.Add('state4-equal', '3,4/=/', 'no-style; state:5'); lex.Add('state5-quote-start', '5/"/', 'exstyle:値; state:6'); lex.Add('state5-noquote-start', '5/[^"]/', 'exstyle:値-クォートなし; state:7'); lex.Add('state6-quote-term', '6/[^"]*"|$/', 'exstyle:値; state:3'); lex.Add('state7-noquote-term', '7/[^ >\t]*|$/', 'exstyle:値-クォートなし; state:3'); lex.Add('state2to5', '2..7/\\/?>/', 'exstyle:タグの終了; transit:*return*'); //script タグの中 lex = App.Lexes.Add('html-script-tag'); lex.LeadingIdentifiers = '[a-zA-Z]'; lex.FollowingIdentifiers = '[-:a-zA-Z0-9]'; lex.DefaultStyle('1..30') = 'exstyle:デフォルト'; lex.DefaultStyle(4) = 'exstyle:値'; lex.DefaultStyle('11..13,20..24') = 'exstyle:コメント'; addURIRule(lex, '4,5,11..13,20..24'); lex.Add('comment-start', '1..3,10..14//', 'no-style;state:-10'); lex.Add('php-start', '1..5,10..12/<(%|\\?php)/', 'transit:php:1'); lex.Add('lang', '1,2,10..12/\\<(language|type)\\>/i', 'exstyle:言語指定属性; state:2'); lex.Add('equal', '2/=/', 'no-style; state:3'); lex.Add('js', '3/"(text\\/)?javascript"/i', 'exstyle:値; state:10'); lex.Add('php', '3/"php"/i', 'exstyle:値; state:11'); lex.Add('vbs', '3/"(text\\/)?vbscript"/i', 'exstyle:値; state:12'); lex.Add('js-noquote', '3/(text\\/)?javascript/i', 'exstyle:値-クォートなし; state:10'); lex.Add('php-noquote', '3/php/i', 'exstyle:値-クォートなし; state:11'); lex.Add('quote-start', '3/"/', 'exstyle:値; state:4'); lex.Add('noquote-start', '3/[^"]/', 'exstyle:値-クォートなし; state:5'); lex.Add('quote-term', '4/($|")/', 'exstyle:値; state:1'); lex.Add('noquote-term', '5/($|\s|[\\/>])/', 'state:1'); lex.Add('to-js', '10/\\/?>/', 'exstyle:タグの終了; transit:jscript'); lex.Add('to-php', '11/\\/?>/', 'exstyle:タグの終了; transit:php:11'); lex.Add('to-vbs', '12/\\/?>/', 'exstyle:タグの終了; transit:vbscript'); lex.Add('close1', '10..12/<\\//', 'exstyle:タグの終了; state:13'); lex.Add('close2', '13/script/i', 'exstyle:要素名; state:14'); lex.Add('term', '1..5,14/\\/?>/', 'transit:*return*'); //style タグの中 lex = App.Lexes.Add('html-style-tag'); lex.LeadingIdentifiers = '[a-zA-Z]'; lex.FollowingIdentifiers = '[-:a-zA-Z0-9]'; lex.DefaultStyle('1..30') = 'exstyle:デフォルト'; lex.DefaultStyle(4) = 'exstyle:値'; lex.DefaultStyle('11..13,20..22') = 'exstyle:コメント'; addURIRule(lex, '4,5,11..13,20..24'); lex.Add('comment-start', '1..3,10..12//', 'no-style;state:-10'); lex.Add('php-start', '1..4,10/<(%|\\?php)/', 'transit:php:1'); lex.Add('type', '1,2,10/\\/i', 'exstyle:属性名; state:2'); lex.Add('equal', '2/=/', 'no-style; state:3'); lex.Add('css', '3/"text\\/css"/i', 'exstyle:値; state:10'); lex.Add('css-noquote', '3/text\\/css/i', 'exstyle:値-クォートなし; state:5'); lex.Add('quote-start', '3/"/', 'exstyle:値; state:4'); lex.Add('noquote-start', '3/[^"]/', 'exstyle:値-クォートなし; state:5'); lex.Add('quote-term', '4/($|")/', 'no-style; state:1'); lex.Add('noquote-term', '5/($|\s|[\\/>])/', 'state:1'); lex.Add('state10', '10/\\/?>/', 'exstyle:タグの終了; transit:css'); lex.Add('close1', '10/<\\//', 'exstyle:タグの終了; state:11'); lex.Add('close2', '11/style/i', 'exstyle:要素名; state:12'); lex.Add('term', '1..3,12/\\/?>/', 'transit:*return*'); }; f.onCompleteRequest = function (arg, classname, methodname) { App.CompletionList.Clear(); if (getLeftParagraph().match(/<\/?[-:a-zA-Z0-9]*$/)) { App.CompletionList.Add( 'tag', this.elements.join('\n')); } else { App.CompletionList.Add( 'attribute', this.attributes.join('\n')); } App.CompletionList.Popup( App.Prop(this.name, 'completion-case-sensitive')); }; f.onQueryKeyContext = function (arg, classname, methodname) { var ls = App.Caret.LexState; switch (ls.Name) { case 'jscript': case 'vbscript': case 'css': case 'php': return ls.Name; default: return classname; } }; f.onKeyPrintable = function (arg, classname, methodname) { invoke(arg, this.parent, methodname); 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-zA-Z0-9]*)$/) && RegExp.$1.length >= delaychars) { needcompletion = true; } else if (arg.match(/[= 1 && ls.State <= 4)) invoke(arg, classname, 'onCompleteRequest'); } } }; f.onKeySpace = function (arg, classname, methodname) { switch (arg & KEYMASK) { case KEYMASK_CTRL: if (App.Caret.LexState.Name == 'html-tag') invoke(arg, classname, 'onCompleteRequest'); break; default: invoke(arg, this.parent, methodname); break; } }; addClass(new class_html());