1

背景故事(不是很重要,但它构成了问题)

我在 JSP 中有一个 TagLib,它获取它的内容并将其包含的代码包装在一个脚本块中(它做得更多,但为了这个问题,它并不重要)。例如:

<aui:script use="some-module">
    //my code
</aui:script>

将作为

<script type="text/javascript>
    AUI().use('sub-module', function(A) {
        // my code
    }
</script>

问题

我想要介于两者之间的所有代码<aui:script use="things"></aui:script>并突出显示 JavaScript 语法。所以我尝试编辑HTML.tmLanguage文件以包含它,但 Sublime Text 2 很合适。

诚然,我的正则表达式知识很差。

如何编辑HTML.tmLanguage以包含我的<aui:script />taglib?

站点说明,taglib 接受各种属性,例如useposition

4

1 回答 1

4

我在使用正则表达式规则时遇到了很多麻烦,但我设法使用正常规则让它有点工作。我应该补充一点,这是一个新块,以及常规块。

{
    name = 'source.js.embedded.html';
    begin = '(?:^\s+)?(<)((?i:(aui[\:]script)))\b(?![^>]*/>)';
    end = '(?<=</(aui[\:]script))(>)(?:\s*\n)?';
    beginCaptures = {
        1 = { name = 'punctuation.definition.tag.html'; };
        2 = { name = 'entity.name.tag.script.html'; };
    };
    endCaptures = {
        2 = {
            name = 'punctuation.definition.tag.html';
        };
    };
    patterns = (
        {
            include = '#tag-stuff';
        },
        {
            begin = '(?<!</(?:aui[\:]script))(>)';
            end = '(</)((?i:aui[\:]script))';
            captures = {
                1 = {
                    name = 'punctuation.definition.tag.html';
                };
                2 = {
                    name = 'entity.name.tag.script.html';
                };
            };
            patterns = (
                {   name = 'comment.line.double-slash.js';
                    match = '(//).*?((?=</(aui[\:]script))|$\n?)';
                    captures = {
                        1 = {
                            name = 'punctuation.definition.comment.js';
                        };
                    };
                },
                {
                    name = 'comment.block.js';
                    begin = '/\*';
                    end = '\*/|(?=</(aui[\:]script))';
                    captures = {
                        0 = {
                            name = 'punctuation.definition.comment.js';
                        };
                    };
                },
                {
                    include = '#php';
                },
                {
                    include = 'source.js';
                },
            );
        },
    );
}

XML 格式

<dict>
    <key>begin</key>
    <string>(?:^\s+)?(&lt;)((?i:(aui[\:]script)))\b(?![^&gt;]*/&gt;)</string>
    <key>beginCaptures</key>
    <dict>
        <key>1</key>
        <dict>
            <key>name</key>
            <string>punctuation.definition.tag.html</string>
        </dict>
        <key>2</key>
        <dict>
            <key>name</key>
            <string>entity.name.tag.script.html</string>
        </dict>
    </dict>
    <key>end</key>
    <string>(?&lt;=&lt;/(aui[\:]script))(&gt;)(?:\s*\n)?</string>
    <key>endCaptures</key>
    <dict>
        <key>2</key>
        <dict>
            <key>name</key>
            <string>punctuation.definition.tag.html</string>
        </dict>
    </dict>
    <key>name</key>
    <string>source.js.embedded.html</string>
    <key>patterns</key>
    <array>
        <dict>
            <key>include</key>
            <string>#tag-stuff</string>
        </dict>
        <dict>
            <key>begin</key>
            <string>(?&lt;!&lt;/(?:aui[\:]script))(&gt;)</string>
            <key>captures</key>
            <dict>
                <key>1</key>
                <dict>
                    <key>name</key>
                    <string>punctuation.definition.tag.html</string>
                </dict>
                <key>2</key>
                <dict>
                    <key>name</key>
                    <string>entity.name.tag.script.html</string>
                </dict>
            </dict>
            <key>end</key>
            <string>(&lt;/)((?i:aui[\:]script))</string>
            <key>patterns</key>
            <array>
                <dict>
                    <key>captures</key>
                    <dict>
                        <key>1</key>
                        <dict>
                            <key>name</key>
                            <string>punctuation.definition.comment.js</string>
                        </dict>
                    </dict>
                    <key>match</key>
                    <string>(//).*?((?=&lt;/(aui[\:]script))|$\n?)</string>
                    <key>name</key>
                    <string>comment.line.double-slash.js</string>
                </dict>
                <dict>
                    <key>begin</key>
                    <string>/\*</string>
                    <key>captures</key>
                    <dict>
                        <key>0</key>
                        <dict>
                            <key>name</key>
                            <string>punctuation.definition.comment.js</string>
                        </dict>
                    </dict>
                    <key>end</key>
                    <string>\*/|(?=&lt;/(aui[\:]script))</string>
                    <key>name</key>
                    <string>comment.block.js</string>
                </dict>
                <dict>
                    <key>include</key>
                    <string>#php</string>
                </dict>
                <dict>
                    <key>include</key>
                    <string>source.js</string>
                </dict>
            </array>
        </dict>
    </array>
</dict>
于 2011-10-14T20:09:14.317 回答