vinnizworld
9/17/2016 - 9:10 PM

Dump scopes used by a TextMate grammar

Dump scopes used by a TextMate grammar

comment.line.number-sign.python
constant.language.python
constant.numeric.complex.python
constant.numeric.float.python
constant.numeric.integer.decimal.python
constant.numeric.integer.hexadecimal.python
constant.numeric.integer.long.decimal.python
constant.numeric.integer.long.hexadecimal.python
constant.numeric.integer.long.octal.python
constant.numeric.integer.octal.python
entity.name.function.decorator.python
entity.name.type.class.python
invalid.deprecated.operator.python
invalid.illegal.missing-inheritance.python
invalid.illegal.missing-parameters.python
invalid.illegal.missing-section-begin.python
keyword.control.flow.python
keyword.control.import.from.python
keyword.control.import.python
keyword.operator.arithmetic.python
keyword.operator.assignment.augmented.python
keyword.operator.assignment.python
keyword.operator.comparison.python
keyword.operator.logical.python
keyword.other.python
meta.class.old-style.python
meta.class.python
meta.empty-dictionary.python
meta.empty-list.python
meta.empty-tuple.python
meta.function-call.arguments.python
meta.function-call.python
meta.function.decorator.python
meta.function.inline.python
meta.function.python
meta.item-access.arguments.python
meta.item-access.python
meta.structure.dictionary.python
meta.structure.list.python
meta.structure.tuple.python
punctuation.definition.arguments.begin.python
punctuation.definition.arguments.end.python
punctuation.definition.comment.python
punctuation.definition.dictionary.begin.python
punctuation.definition.dictionary.end.python
punctuation.definition.inheritance.begin.python
punctuation.definition.inheritance.end.python
punctuation.definition.list.begin.python
punctuation.definition.list.end.python
punctuation.definition.parameters.begin.python
punctuation.definition.parameters.end.python
punctuation.definition.tuple.begin.python
punctuation.definition.tuple.end.python
punctuation.section.class.begin.python
punctuation.section.function.begin.python
storage.modifier.global.python
storage.type.class.python
storage.type.function.inline.python
storage.type.function.python
#!/usr/bin/env python
import plistlib


class Grammar(object):
    def __init__(self, grammar):
        self._grammar = grammar
        self.names = []
        self.includes = []

        patterns = self._grammar['patterns']
        self._parse_patterns(patterns)
        
    def _parse_patterns(self, patterns):
        for p in patterns:
            if 'name' in p:
                self.names.append( ('name', p['name']) )

            if 'contentName' in p:
                self.names.append( ('contentName', p['contentName']) )
        
            for x in ['captures', 'beginCaptures', 'endCaptures']:
                if x not in p:
                    continue
            
                group = p[x]
                for match in group:
                    g = group[match]
                    self.names.append( ('name', g['name']) )
                    
                if 'patterns' in x:
                    self._parse_patterns(x['patterns'])



def main():
    plist = plistlib.readPlist("./Python.tmLanguage")
    g = Grammar(plist)
    scopes = set(n[1] for n in g.names)
    print "\n".join(sorted(scopes))


if __name__ == '__main__':
    main()