Как добавить еще один тег для анализа как встроенный JS в файл tmLanguage? - PullRequest
1 голос
/ 08 октября 2011

Back Story (не очень важно, но это обрамляет вопрос)

У меня есть TagLib в JSP, который берет его содержимое и упаковывает содержащий его код в блок скрипта (он делает гораздо больше, но ради вопроса это не важно). Например:

<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 принимает различные атрибуты, такие как use и position.

1 Ответ

4 голосов
/ 15 октября 2011

У меня так много проблем с правилами регулярных выражений, но мне удалось заставить его работать, используя обычные правила.Я должен добавить, что это новый блок, наряду с обычным.

{
    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>
...