# -*- coding: utf-8 -*- # pylint: disable=no-self-argument # # Copyright 2006-2017 by the Pygments team, see AUTHORS at # https://bitbucket.org/birkenfeld/pygments-main/raw/7941677dc77d4f2bf0bbd6140ade85a9454b8b80/AUTHORS # Copyright by Norman Richards (original author of JSON lexer). # # Licensed under BSD license: # # Copyright (c) 2006-2017 by the respective authors (see AUTHORS file). # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from __future__ import (absolute_import, division, print_function) __metaclass__ = type from pygments.lexer import LexerContext, ExtendedRegexLexer, DelegatingLexer, RegexLexer, bygroups, include from pygments.lexers import DiffLexer from pygments import token import re class AnsibleOutputPrimaryLexer(RegexLexer): name = 'Ansible-output-primary' # The following definitions are borrowed from Pygment's JSON lexer. # It has been originally authored by Norman Richards. # integer part of a number int_part = r'-?(0|[1-9]\d*)' # fractional part of a number frac_part = r'\.\d+' # exponential part of a number exp_part = r'[eE](\+|-)?\d+' tokens = { # ######################################### # # BEGIN: states from JSON lexer ######### # ######################################### 'whitespace': [ (r'\s+', token.Text), ], # represents a simple terminal value 'simplevalue': [ (r'(true|false|null)\b', token.Keyword.Constant), (('%(int_part)s(%(frac_part)s%(exp_part)s|' '%(exp_part)s|%(frac_part)s)') % vars(), token.Number.Float), (int_part, token.Number.Integer), (r'"(\\\\|\\"|[^"])*"', token.String), ], # the right hand side of an object, after the attribute name 'objectattribute': [ include('value'), (r':', token.Punctuation), # comma terminates the attribute but expects more (r',', token.Punctuation, '#pop'), # a closing bracket terminates the entire object, so pop twice (r'\}', token.Punctuation, '#pop:2'), ], # a json object - { attr, attr, ... } 'objectvalue': [ include('whitespace'), (r'"(\\\\|\\"|[^"])*"', token.Name.Tag, 'objectattribute'), (r'\}', token.Punctuation, '#pop'), ], # json array - [ value, value, ... } 'arrayvalue': [ include('whitespace'), include('value'), (r',', token.Punctuation), (r'\]', token.Punctuation, '#pop'), ], # a json value - either a simple value or a complex value (object or array) 'value': [ include('whitespace'), include('simplevalue'), (r'\{', token.Punctuation, 'objectvalue'), (r'\[', token.Punctuation, 'arrayvalue'), ], # ######################################### # # END: states from JSON lexer ########### # ######################################### 'host-postfix': [ (r'\n', token.Text, '#pop:3'), (r'( )(=>)( )(\{)', bygroups(token.Text, token.Punctuation, token.Text, token.Punctuation), 'objectvalue'), ], 'host-error': [ (r'(?:(:)( )(UNREACHABLE|FAILED)(!))?', bygroups(token.Punctuation, token.Text, token.Keyword, token.Punctuation), 'host-postfix'), (r'', token.Text, 'host-postfix'), ], 'host-name': [ (r'(\[)([^ \]]+)(?:( )(=>)( )([^\]]+))?(\])', bygroups(token.Punctuation, token.Name.Variable, token.Text, token.Punctuation, token.Text, token.Name.Variable, token.Punctuation), 'host-error') ], 'host-result': [ (r'\n', token.Text, '#pop'), (r'( +)(ok|changed|failed|skipped|unreachable)(=)([0-9]+)', bygroups(token.Text, token.Keyword, token.Punctuation, token.Number.Integer)), ], 'root': [ (r'(PLAY|TASK|PLAY RECAP)(?:( )(\[)([^\]]+)(\]))?( )(\*+)(\n)', bygroups(token.Keyword, token.Text, token.Punctuation, token.Literal, token.Punctuation, token.Text, token.Name.Variable, token.Text)), (r'(fatal|ok|changed|skipping)(:)( )', bygroups(token.Keyword, token.Punctuation, token.Text), 'host-name'), (r'(\[)(WARNING)(\]:)([^\n]+)', bygroups(token.Punctuation, token.Keyword, token.Punctuation, token.Text)), (r'([^ ]+)( +)(:)', bygroups(token.Name, token.Text, token.Punctuation), 'host-result'), (r'(\tto retry, use: )(.*)(\n)', bygroups(token.Text, token.Literal.String, token.Text)), (r'.*\n', token.Other), ], } class AnsibleOutputLexer(DelegatingLexer): name = 'Ansible-output' aliases = ['ansible-output'] def __init__(self, **options): super(AnsibleOutputLexer, self).__init__(DiffLexer, AnsibleOutputPrimaryLexer, **options) # #################################################################################################### # # Sphinx plugin #################################################################################### # #################################################################################################### __version__ = "0.1.0" __license__ = "BSD license" __author__ = "Felix Fontein" __author_email__ = "felix@fontein.de" def setup(app): """ Initializer for Sphinx extension API. See http://www.sphinx-doc.org/en/stable/extdev/index.html#dev-extensions. """ for lexer in [ AnsibleOutputLexer(startinline=True) ]: app.add_lexer(lexer.name, lexer) for alias in lexer.aliases: app.add_lexer(alias, lexer) return dict(version=__version__, parallel_read_safe=True)