You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bh...@apache.org on 2013/01/29 03:01:49 UTC

[1/4] git commit: cli: Add pygments based lexical output processing

cli: Add pygments based lexical output processing

Signed-off-by: Rohit Yadav <bh...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/ad3692cb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/ad3692cb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/ad3692cb

Branch: refs/heads/master
Commit: ad3692cbba73f702e18afc0a8fe21365e78f34ed
Parents: 59d01bf
Author: Rohit Yadav <bh...@apache.org>
Authored: Mon Jan 28 17:48:49 2013 -0800
Committer: Rohit Yadav <bh...@apache.org>
Committed: Mon Jan 28 17:48:49 2013 -0800

----------------------------------------------------------------------
 tools/cli/cloudmonkey/lexer.py |  121 +++++++++++++++++++++++++++++++++++
 1 files changed, 121 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ad3692cb/tools/cli/cloudmonkey/lexer.py
----------------------------------------------------------------------
diff --git a/tools/cli/cloudmonkey/lexer.py b/tools/cli/cloudmonkey/lexer.py
new file mode 100644
index 0000000..fdd95c9
--- /dev/null
+++ b/tools/cli/cloudmonkey/lexer.py
@@ -0,0 +1,121 @@
+# -*- coding: utf-8 -*-
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+try:
+    from pygments import highlight
+    from pygments.console import ansiformat
+    from pygments.formatter import Formatter
+    from pygments.formatters import Terminal256Formatter
+    from pygments.lexer import bygroups, include, RegexLexer
+    from pygments.token import *
+
+    import sys
+except ImportError, e:
+    print e
+
+
+MONKEY_COLORS = {
+    Token:          '',
+    Whitespace:     'reset',
+    Text:           'reset',
+
+    Name:           'green',
+    Operator:       'teal',
+    Operator.Word:  'lightgray',
+    String:         'purple',
+
+    Keyword:        '_red_',
+    Error:          'red',
+    Literal:        'yellow',
+    Number:         'blue',
+}
+
+
+def get_colorscheme():
+    return MONKEY_COLORS
+
+
+class MonkeyLexer(RegexLexer):
+    keywords = ['[a-z]*id', '[a-zA-Z]*:']
+    attributes = ['[Tt]rue', '[Ff]alse']
+    params = ['[a-z]*[Nn]ame', 'type', '[Ss]tate']
+
+    uuid_rgx = r'[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
+    date_rgx = r'[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9:]{8}-[0-9]{4}'
+
+    def makelistre(lis):
+        return r'(' + r'|'.join(lis) + r')'
+
+    tokens = {
+        'root': [
+            (r' ', Whitespace),
+            (date_rgx, Number),
+            (uuid_rgx, Literal),
+            (r'(?:\b\d+\b(?:-\b\d+|%)?)', Number),
+            (r'^[-=]*\n', Operator.Word),
+            (r'Error', Error),
+            (makelistre(keywords), Keyword),
+            (makelistre(attributes), Literal),
+            (makelistre(params) + r'( = )(.*)', bygroups(Name, Operator,
+                                                         String)),
+            (makelistre(params), Name),
+            (r'(^[a-zA-Z]* )(=)', bygroups(Name, Operator)),
+            (r'\S+', Text),
+        ]
+    }
+
+    def analyse_text(text):
+        npos = text.find('\n')
+        if npos < 3:
+            return False
+        return text[0] == '[' and text[npos - 1] == ']'
+
+
+class MonkeyFormatter(Formatter):
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self.colorscheme = get_colorscheme()
+
+    def format(self, tokensource, outfile):
+        self.encoding = outfile.encoding
+        return Formatter.format(self, tokensource, outfile)
+
+    def format_unencoded(self, tokensource, outfile):
+        for ttype, value in tokensource:
+            color = self.colorscheme.get(ttype)
+            while color is None:
+                ttype = ttype[:-1]
+                color = self.colorscheme.get(ttype)
+            if color:
+                spl = value.split('\n')
+                for line in spl[:-1]:
+                    if line:
+                        outfile.write(ansiformat(color, line))
+                    outfile.write('\n')
+                if spl[-1]:
+                    outfile.write(ansiformat(color, spl[-1]))
+            else:
+                outfile.write(value)
+
+
+def monkeyprint(text):
+    fmter = MonkeyFormatter()
+    lexer = MonkeyLexer()
+    lexer.encoding = 'utf-8'
+    fmter.encoding = 'utf-8'
+    highlight(text, lexer, fmter, sys.stdout)