def run(self):
        self.assert_has_content()
        if self.arguments:
            language = self.arguments[0]
        else:
            language = ''
        set_classes(self.options)
        classes = ['code', language]
        if 'classes' in self.options:
            classes.extend(self.options['classes'])
            
        # TODO: config setting to skip lexical analysis: 
        ## if document.settings.no_highlight:
        ##      language = ''

        # set up lexical analyzer
        tokens = Lexer(self.content, language)

        if 'number-lines' in self.options:
            # optional argument `startline`, defaults to 1
            try: 
                startline = int(self.options['number-lines'] or 1)
            except __HOLE__:
                raise self.error(':number-lines: with non-integer start value')
            endline = startline + len(self.content)
            # add linenumber filter:
            tokens = NumberLines(tokens, startline, endline)

        node = nodes.literal_block('\n'.join(self.content), classes=classes)
        self.add_name(node)
        
        # analyze content and add nodes for every token
        for cls, value in tokens:
            # print (cls, value)
            if cls in unstyled_tokens:
                # insert as Text to decrease the verbosity of the output.
                node += nodes.Text(value, value)
            else:
                node += nodes.inline(value, value, classes=[cls])

        return [node]


# Register Directive
# ------------------
# ::
dataset/ETHPy150Open espeed/lightbulb/lightbulb/directives/pygments_code_block_directive.py/CodeBlock.run